From 362bcc68ab7c9c92beaa93e58aab80965c03fa1f Mon Sep 17 00:00:00 2001 From: schutzbot Date: Wed, 28 May 2025 08:36:04 +0000 Subject: [PATCH 001/331] Post release version bump [skip ci] --- cockpit/cockpit-image-builder.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cockpit/cockpit-image-builder.spec b/cockpit/cockpit-image-builder.spec index 49a1e835..2a7f96ef 100644 --- a/cockpit/cockpit-image-builder.spec +++ b/cockpit/cockpit-image-builder.spec @@ -1,5 +1,5 @@ Name: cockpit-image-builder -Version: 68 +Version: 69 Release: 1%{?dist} Summary: Image builder plugin for Cockpit From 3617c0260d731bd56d8c0bb27fe9337fecc12d3f Mon Sep 17 00:00:00 2001 From: regexowl Date: Fri, 4 Apr 2025 13:10:54 +0200 Subject: [PATCH 002/331] deps: Bump Patternfly and frontend-components versions This bumps dependencies. --- package-lock.json | 670 ++++++++++++++++++++++++++++++++-------------- package.json | 16 +- 2 files changed, 476 insertions(+), 210 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8a7b1088..b8d2a664 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,13 +10,13 @@ "hasInstallScript": true, "dependencies": { "@ltd/j-toml": "1.38.0", - "@patternfly/patternfly": "5.4.1", - "@patternfly/react-code-editor": "5.4.1", - "@patternfly/react-core": "5.4.12", - "@patternfly/react-table": "5.4.14", - "@redhat-cloud-services/frontend-components": "5.2.6", - "@redhat-cloud-services/frontend-components-notifications": "4.1.20", - "@redhat-cloud-services/frontend-components-utilities": "5.0.11", + "@patternfly/patternfly": "6.1.0", + "@patternfly/react-code-editor": "6.1.0", + "@patternfly/react-core": "6.1.0", + "@patternfly/react-table": "6.1.0", + "@redhat-cloud-services/frontend-components": "6.0.4", + "@redhat-cloud-services/frontend-components-notifications": "5.0.4", + "@redhat-cloud-services/frontend-components-utilities": "6.0.2", "@reduxjs/toolkit": "2.8.2", "@scalprum/react-core": "0.9.5", "@sentry/webpack-plugin": "3.4.0", @@ -37,7 +37,7 @@ "@babel/preset-react": "7.27.1", "@babel/preset-typescript": "7.27.0", "@currents/playwright": "1.13.2", - "@patternfly/react-icons": "5.4.2", + "@patternfly/react-icons": "6.1.0", "@playwright/test": "1.51.1", "@redhat-cloud-services/eslint-config-redhat-cloud-services": "2.0.12", "@redhat-cloud-services/frontend-components-config": "6.3.8", @@ -2452,6 +2452,8 @@ }, "node_modules/@emotion/is-prop-valid": { "version": "0.7.3", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.7.3.tgz", + "integrity": "sha512-uxJqm/sqwXw3YPA5GXX365OBcJGFtxUVkB6WyezqFHlNe9jqUWH5ur2O2M8dGBz61kn1g3ZBlzUunFQXQIClhA==", "license": "MIT", "dependencies": { "@emotion/memoize": "0.7.1" @@ -2459,6 +2461,8 @@ }, "node_modules/@emotion/memoize": { "version": "0.7.1", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.1.tgz", + "integrity": "sha512-Qv4LTqO11jepd5Qmlp3M1YEjBumoTHcHFdgPTQ+sFlIL5myi/7xu/POwP7IRu6odBdmLXdtIs1D6TuW6kbwbbg==", "license": "MIT" }, "node_modules/@esbuild/aix-ppc64": { @@ -3610,19 +3614,23 @@ } }, "node_modules/@patternfly/patternfly": { - "version": "5.4.1", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@patternfly/patternfly/-/patternfly-6.1.0.tgz", + "integrity": "sha512-w+QazL8NHKkg5j01eotblsswKxQQSYB0CN3yBXQL9ScpHdp/fK8M6TqWbKZNRpf+NqhMxcH/om8eR0N/fDCJqw==", "license": "MIT" }, "node_modules/@patternfly/react-code-editor": { - "version": "5.4.1", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@patternfly/react-code-editor/-/react-code-editor-6.1.0.tgz", + "integrity": "sha512-ae04+DdkgXFn3wEzvNCncNa78ZK3Swh5ng8p7yqFrD6lhW69NoJf+DdQlHi8gM8Qy05DNnIemSbQWpWLpInyzw==", "license": "MIT", "dependencies": { "@monaco-editor/react": "^4.6.0", - "@patternfly/react-core": "^5.4.0", - "@patternfly/react-icons": "^5.4.0", - "@patternfly/react-styles": "^5.4.0", - "react-dropzone": "14.2.3", - "tslib": "^2.6.3" + "@patternfly/react-core": "^6.1.0", + "@patternfly/react-icons": "^6.1.0", + "@patternfly/react-styles": "^6.1.0", + "react-dropzone": "14.3.5", + "tslib": "^2.8.1" }, "peerDependencies": { "react": "^17 || ^18", @@ -3630,12 +3638,14 @@ } }, "node_modules/@patternfly/react-component-groups": { - "version": "5.5.8", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@patternfly/react-component-groups/-/react-component-groups-6.1.0.tgz", + "integrity": "sha512-8RkQv9wQk+D+nUMFtl4uk0ddMvxZ/+jFwnnXe2fw/BulouDVbpKRI24C1S8i1OQHr3++CbocBmmWRV0iw9Kvlw==", "license": "MIT", "dependencies": { - "@patternfly/react-core": "^5.4.1", - "@patternfly/react-icons": "^5.4.0", - "@patternfly/react-table": "^5.4.1", + "@patternfly/react-core": "^6.0.0", + "@patternfly/react-icons": "^6.0.0", + "@patternfly/react-table": "^6.0.0", "clsx": "^2.1.1", "react-jss": "^10.10.0" }, @@ -3645,15 +3655,17 @@ } }, "node_modules/@patternfly/react-core": { - "version": "5.4.12", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@patternfly/react-core/-/react-core-6.1.0.tgz", + "integrity": "sha512-zj0lJPZxQanXKD8ae2kYnweT0kpp1CzpHYAkaBjTrw2k6ZMfr/UPlp0/ugCjWEokBqh79RUADLkKJJPce/yoSQ==", "license": "MIT", "dependencies": { - "@patternfly/react-icons": "^5.4.2", - "@patternfly/react-styles": "^5.4.1", - "@patternfly/react-tokens": "^5.4.1", + "@patternfly/react-icons": "^6.1.0", + "@patternfly/react-styles": "^6.1.0", + "@patternfly/react-tokens": "^6.1.0", "focus-trap": "7.6.2", - "react-dropzone": "^14.2.3", - "tslib": "^2.7.0" + "react-dropzone": "^14.3.5", + "tslib": "^2.8.1" }, "peerDependencies": { "react": "^17 || ^18", @@ -3661,7 +3673,9 @@ } }, "node_modules/@patternfly/react-icons": { - "version": "5.4.2", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@patternfly/react-icons/-/react-icons-6.1.0.tgz", + "integrity": "sha512-V1w/j19YmOgvh72IRRf1p07k+u4M5+9P+o/IxunlF0fWzLDX4Hf+utBI11A8cRfUzpQN7eLw/vZIS3BLM8Ge3Q==", "license": "MIT", "peerDependencies": { "react": "^17 || ^18", @@ -3669,19 +3683,23 @@ } }, "node_modules/@patternfly/react-styles": { - "version": "5.4.1", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@patternfly/react-styles/-/react-styles-6.1.0.tgz", + "integrity": "sha512-JQ3zIl5SFiSB0YWVYibcUwgZdsp6Wn8hkfZ7KhtCjHFccSDdJexPOXVV1O9f2h4PfxTlY3YntZ81ZsguBx/Q7A==", "license": "MIT" }, "node_modules/@patternfly/react-table": { - "version": "5.4.14", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@patternfly/react-table/-/react-table-6.1.0.tgz", + "integrity": "sha512-eC8mKkvFR0btfv6yEOvE+J4gBXU8ZGe9i2RSezBM+MJaXEQt/CKRjV+SAB5EeE3PyBYKG8yYDdsOoNmaPxxvSA==", "license": "MIT", "dependencies": { - "@patternfly/react-core": "^5.4.12", - "@patternfly/react-icons": "^5.4.2", - "@patternfly/react-styles": "^5.4.1", - "@patternfly/react-tokens": "^5.4.1", + "@patternfly/react-core": "^6.1.0", + "@patternfly/react-icons": "^6.1.0", + "@patternfly/react-styles": "^6.1.0", + "@patternfly/react-tokens": "^6.1.0", "lodash": "^4.17.21", - "tslib": "^2.7.0" + "tslib": "^2.8.1" }, "peerDependencies": { "react": "^17 || ^18", @@ -3689,7 +3707,9 @@ } }, "node_modules/@patternfly/react-tokens": { - "version": "5.4.1", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@patternfly/react-tokens/-/react-tokens-6.1.0.tgz", + "integrity": "sha512-t1UcHbOa4txczTR5UlnG4XcAAdnDSfSlCaOddw/HTqRF59pn2ks2JUu9sfnFRZ8SiAAxKRiYdX5bT7Mf4R24+w==", "license": "MIT" }, "node_modules/@pkgjs/parseargs": { @@ -3789,23 +3809,24 @@ } }, "node_modules/@redhat-cloud-services/frontend-components": { - "version": "5.2.6", - "resolved": "https://registry.npmjs.org/@redhat-cloud-services/frontend-components/-/frontend-components-5.2.6.tgz", - "integrity": "sha512-YhA6tQ5KlkVoRfkIzRXQa/cvhQ6sbe6jsYt3QrX8SwJ1ojq0ekqHZDbcaPxS3U34MXnsW6877bjyAya5se+2ug==", + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/@redhat-cloud-services/frontend-components/-/frontend-components-6.0.4.tgz", + "integrity": "sha512-xOy6gCI292C2VJy5CFwUjA+iBlXmePx/Si76XVFgjw1gCZ7cyPOCSGwGOJKTFlYdVsklfrG9efZJQKrT0h8xHA==", "license": "Apache-2.0", "dependencies": { - "@patternfly/react-component-groups": "^5.5.5", - "@redhat-cloud-services/frontend-components-utilities": "^5.0.4", - "@redhat-cloud-services/types": "^1.0.19", + "@patternfly/react-component-groups": "^6.0.0", + "@redhat-cloud-services/frontend-components-utilities": "^6.0.0", + "@redhat-cloud-services/types": "^2.0.0", "@scalprum/core": "^0.8.1", "@scalprum/react-core": "^0.9.1", "classnames": "^2.2.5", "sanitize-html": "^2.13.1" }, "peerDependencies": { - "@patternfly/react-core": "^5.4.11", - "@patternfly/react-icons": "^5.4.2", - "@patternfly/react-table": "^5.4.12", + "@patternfly/react-core": "^6.0.0", + "@patternfly/react-icons": "^6.0.0", + "@patternfly/react-table": "^6.0.0", + "@patternfly/react-tokens": "^6.0.0", "lodash": "^4.17.15", "prop-types": "^15.6.2", "react": "^18.2.0", @@ -3964,17 +3985,18 @@ } }, "node_modules/@redhat-cloud-services/frontend-components-notifications": { - "version": "4.1.20", - "resolved": "https://registry.npmjs.org/@redhat-cloud-services/frontend-components-notifications/-/frontend-components-notifications-4.1.20.tgz", - "integrity": "sha512-9GGDb7pwhTyzgLpM6xfBetrKDRwLTEu8/Ifn8/8xu/wfm4Ch5TXiib04QV5+W5EcRuWxMZevVhytTNFUqXSBvw==", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@redhat-cloud-services/frontend-components-notifications/-/frontend-components-notifications-5.0.4.tgz", + "integrity": "sha512-2/D+tNwKyV8y41nFgzDPIo0wV4BmYKvY01GvtEccvZ0so09h6dDqhMb+1NzfVw1dso12obc3KAd/cQtqeHMuMQ==", + "license": "Apache-2.0", "dependencies": { - "@redhat-cloud-services/frontend-components": "^5.0.5", - "@redhat-cloud-services/frontend-components-utilities": "^5.0.4", + "@redhat-cloud-services/frontend-components": "^6.0.0", + "@redhat-cloud-services/frontend-components-utilities": "^6.0.0", "redux-promise-middleware": "6.1.3" }, "peerDependencies": { - "@patternfly/react-core": "^5.0.0", - "@patternfly/react-icons": "^5.0.0", + "@patternfly/react-core": "^6.0.0", + "@patternfly/react-icons": "^6.0.0", "prop-types": "^15.6.2", "react": "^18.2.0", "react-dom": "^18.2.0", @@ -3990,11 +4012,13 @@ } }, "node_modules/@redhat-cloud-services/frontend-components-utilities": { - "version": "5.0.11", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@redhat-cloud-services/frontend-components-utilities/-/frontend-components-utilities-6.0.2.tgz", + "integrity": "sha512-1YH75PeABT190fY33Bh6aj+wJumQVwAjSd5Txw4/Ky80wpTdjEDr2aOyz2gWWhXRDFCwOeRIbABUwOEuZtvuUg==", "license": "Apache-2.0", "dependencies": { "@redhat-cloud-services/rbac-client": "^1.0.111 || 2.x", - "@redhat-cloud-services/types": "^1.0.19", + "@redhat-cloud-services/types": "^2.0.0", "@sentry/browser": "^7.119.1", "awesome-debounce-promise": "^2.1.0", "axios": "^0.28.1 || ^1.7.0", @@ -4004,8 +4028,8 @@ "react-content-loader": "^6.2.0" }, "peerDependencies": { - "@patternfly/react-core": "^5.0.0", - "@patternfly/react-table": "^5.0.0", + "@patternfly/react-core": "^6.0.0", + "@patternfly/react-table": "^6.0.0", "react": "^18.2.0", "react-dom": "^18.2.0", "react-redux": "^7.0.0 || ^8.0.0 || ^9.0.0", @@ -4014,6 +4038,8 @@ }, "node_modules/@redhat-cloud-services/frontend-components-utilities/node_modules/p-map": { "version": "7.0.3", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.3.tgz", + "integrity": "sha512-VkndIv2fIB99swvQoA65bm+fsmt6UNdGeIB0oxBs+WhAhdh08QA04JXpI7rbB9r08/nkbysKoya9rtDERYOYMA==", "license": "MIT", "engines": { "node": ">=18" @@ -4023,7 +4049,9 @@ } }, "node_modules/@redhat-cloud-services/javascript-clients-shared": { - "version": "1.2.5", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@redhat-cloud-services/javascript-clients-shared/-/javascript-clients-shared-1.2.7.tgz", + "integrity": "sha512-DfH1Sdjwc9YYVM2wLznnNfC3+DFpdH8Ak59LW93KQWaPAn8ZHDoEXi/TZ8MisEgWTQv7jpsDVtlVQwOWkzKhUA==", "license": "Apache-2.0", "dependencies": { "axios": "^1.7.2", @@ -4031,7 +4059,9 @@ } }, "node_modules/@redhat-cloud-services/rbac-client": { - "version": "2.2.10", + "version": "2.2.11", + "resolved": "https://registry.npmjs.org/@redhat-cloud-services/rbac-client/-/rbac-client-2.2.11.tgz", + "integrity": "sha512-3LLW5XtBMqcdlYJ4lAFo7MaGnHXUBP01O3kty4ocU69EPjiip6/Gtj83vAx5hkgAWX9h6ZEntTDeDuU/ZfGdKQ==", "license": "Apache-2.0", "dependencies": { "@redhat-cloud-services/javascript-clients-shared": "^1.2.4", @@ -4073,7 +4103,9 @@ } }, "node_modules/@redhat-cloud-services/types": { - "version": "1.0.21", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@redhat-cloud-services/types/-/types-2.0.0.tgz", + "integrity": "sha512-T9KvjntxMtRkNcyYCKB9OktIy7hhy24Y4n1nDZgGsysSnfWOrnmsrLUI7pyrwqsRVzjIjI3oYf7qH7DE5LcFag==", "license": "Apache-2.0" }, "node_modules/@reduxjs/toolkit": { @@ -4478,37 +4510,43 @@ "license": "MIT" }, "node_modules/@sentry-internal/feedback": { - "version": "7.120.1", + "version": "7.120.3", + "resolved": "https://registry.npmjs.org/@sentry-internal/feedback/-/feedback-7.120.3.tgz", + "integrity": "sha512-ewJJIQ0mbsOX6jfiVFvqMjokxNtgP3dNwUv+4nenN+iJJPQsM6a0ocro3iscxwVdbkjw5hY3BUV2ICI5Q0UWoA==", "license": "MIT", "dependencies": { - "@sentry/core": "7.120.1", - "@sentry/types": "7.120.1", - "@sentry/utils": "7.120.1" + "@sentry/core": "7.120.3", + "@sentry/types": "7.120.3", + "@sentry/utils": "7.120.3" }, "engines": { "node": ">=12" } }, "node_modules/@sentry-internal/replay-canvas": { - "version": "7.120.1", + "version": "7.120.3", + "resolved": "https://registry.npmjs.org/@sentry-internal/replay-canvas/-/replay-canvas-7.120.3.tgz", + "integrity": "sha512-s5xy+bVL1eDZchM6gmaOiXvTqpAsUfO7122DxVdEDMtwVq3e22bS2aiGa8CUgOiJkulZ+09q73nufM77kOmT/A==", "license": "MIT", "dependencies": { - "@sentry/core": "7.120.1", - "@sentry/replay": "7.120.1", - "@sentry/types": "7.120.1", - "@sentry/utils": "7.120.1" + "@sentry/core": "7.120.3", + "@sentry/replay": "7.120.3", + "@sentry/types": "7.120.3", + "@sentry/utils": "7.120.3" }, "engines": { "node": ">=12" } }, "node_modules/@sentry-internal/tracing": { - "version": "7.120.1", + "version": "7.120.3", + "resolved": "https://registry.npmjs.org/@sentry-internal/tracing/-/tracing-7.120.3.tgz", + "integrity": "sha512-Ausx+Jw1pAMbIBHStoQ6ZqDZR60PsCByvHdw/jdH9AqPrNE9xlBSf9EwcycvmrzwyKspSLaB52grlje2cRIUMg==", "license": "MIT", "dependencies": { - "@sentry/core": "7.120.1", - "@sentry/types": "7.120.1", - "@sentry/utils": "7.120.1" + "@sentry/core": "7.120.3", + "@sentry/types": "7.120.3", + "@sentry/utils": "7.120.3" }, "engines": { "node": ">=8" @@ -4524,17 +4562,19 @@ } }, "node_modules/@sentry/browser": { - "version": "7.120.1", + "version": "7.120.3", + "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-7.120.3.tgz", + "integrity": "sha512-i9vGcK9N8zZ/JQo1TCEfHHYZ2miidOvgOABRUc9zQKhYdcYQB2/LU1kqlj77Pxdxf4wOa9137d6rPrSn9iiBxg==", "license": "MIT", "dependencies": { - "@sentry-internal/feedback": "7.120.1", - "@sentry-internal/replay-canvas": "7.120.1", - "@sentry-internal/tracing": "7.120.1", - "@sentry/core": "7.120.1", - "@sentry/integrations": "7.120.1", - "@sentry/replay": "7.120.1", - "@sentry/types": "7.120.1", - "@sentry/utils": "7.120.1" + "@sentry-internal/feedback": "7.120.3", + "@sentry-internal/replay-canvas": "7.120.3", + "@sentry-internal/tracing": "7.120.3", + "@sentry/core": "7.120.3", + "@sentry/integrations": "7.120.3", + "@sentry/replay": "7.120.3", + "@sentry/types": "7.120.3", + "@sentry/utils": "7.120.3" }, "engines": { "node": ">=8" @@ -4746,23 +4786,27 @@ } }, "node_modules/@sentry/core": { - "version": "7.120.1", + "version": "7.120.3", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.120.3.tgz", + "integrity": "sha512-vyy11fCGpkGK3qI5DSXOjgIboBZTriw0YDx/0KyX5CjIjDDNgp5AGgpgFkfZyiYiaU2Ww3iFuKo4wHmBusz1uA==", "license": "MIT", "dependencies": { - "@sentry/types": "7.120.1", - "@sentry/utils": "7.120.1" + "@sentry/types": "7.120.3", + "@sentry/utils": "7.120.3" }, "engines": { "node": ">=8" } }, "node_modules/@sentry/integrations": { - "version": "7.120.1", + "version": "7.120.3", + "resolved": "https://registry.npmjs.org/@sentry/integrations/-/integrations-7.120.3.tgz", + "integrity": "sha512-6i/lYp0BubHPDTg91/uxHvNui427df9r17SsIEXa2eKDwQ9gW2qRx5IWgvnxs2GV/GfSbwcx4swUB3RfEWrXrQ==", "license": "MIT", "dependencies": { - "@sentry/core": "7.120.1", - "@sentry/types": "7.120.1", - "@sentry/utils": "7.120.1", + "@sentry/core": "7.120.3", + "@sentry/types": "7.120.3", + "@sentry/utils": "7.120.3", "localforage": "^1.8.1" }, "engines": { @@ -4770,30 +4814,36 @@ } }, "node_modules/@sentry/replay": { - "version": "7.120.1", + "version": "7.120.3", + "resolved": "https://registry.npmjs.org/@sentry/replay/-/replay-7.120.3.tgz", + "integrity": "sha512-CjVq1fP6bpDiX8VQxudD5MPWwatfXk8EJ2jQhJTcWu/4bCSOQmHxnnmBM+GVn5acKUBCodWHBN+IUZgnJheZSg==", "license": "MIT", "dependencies": { - "@sentry-internal/tracing": "7.120.1", - "@sentry/core": "7.120.1", - "@sentry/types": "7.120.1", - "@sentry/utils": "7.120.1" + "@sentry-internal/tracing": "7.120.3", + "@sentry/core": "7.120.3", + "@sentry/types": "7.120.3", + "@sentry/utils": "7.120.3" }, "engines": { "node": ">=12" } }, "node_modules/@sentry/types": { - "version": "7.120.1", + "version": "7.120.3", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.120.3.tgz", + "integrity": "sha512-C4z+3kGWNFJ303FC+FxAd4KkHvxpNFYAFN8iMIgBwJdpIl25KZ8Q/VdGn0MLLUEHNLvjob0+wvwlcRBBNLXOow==", "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/@sentry/utils": { - "version": "7.120.1", + "version": "7.120.3", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.120.3.tgz", + "integrity": "sha512-UDAOQJtJDxZHQ5Nm1olycBIsz2wdGX8SdzyGVHmD8EOQYAeDZQyIlQYohDe9nazdIOQLZCIc3fU0G9gqVLkaGQ==", "license": "MIT", "dependencies": { - "@sentry/types": "7.120.1" + "@sentry/types": "7.120.3" }, "engines": { "node": ">=8" @@ -5229,6 +5279,8 @@ }, "node_modules/@types/debounce-promise": { "version": "3.1.9", + "resolved": "https://registry.npmjs.org/@types/debounce-promise/-/debounce-promise-3.1.9.tgz", + "integrity": "sha512-awNxydYSU+E2vL7EiOAMtiSOfL5gUM5X4YSE2A92qpxDJQ/rXz6oMPYBFDcDywlUmvIDI6zsqgq17cGm5CITQw==", "license": "MIT" }, "node_modules/@types/eslint": { @@ -6662,6 +6714,8 @@ }, "node_modules/attr-accept": { "version": "2.2.5", + "resolved": "https://registry.npmjs.org/attr-accept/-/attr-accept-2.2.5.tgz", + "integrity": "sha512-0bDNnY/u6pPwHDMoF0FieU354oBi0a8rD9FcsLwzcGWbc8KS8KPIi7y+s13OlVY+gMWc/9xEMUgNE6Qm8ZllYQ==", "license": "MIT", "engines": { "node": ">=4" @@ -6683,6 +6737,8 @@ }, "node_modules/awesome-debounce-promise": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/awesome-debounce-promise/-/awesome-debounce-promise-2.1.0.tgz", + "integrity": "sha512-0Dv4j2wKk5BrNZh4jgV2HUdznaeVgEK/WTvcHhZWUElhmQ1RR+iURRoLEwICFyR0S/5VtxfcvY6gR+qSe95jNg==", "license": "MIT", "dependencies": { "@types/debounce-promise": "^3.1.1", @@ -6697,6 +6753,8 @@ }, "node_modules/awesome-imperative-promise": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/awesome-imperative-promise/-/awesome-imperative-promise-1.0.1.tgz", + "integrity": "sha512-EmPr3FqbQGqlNh+WxMNcF9pO9uDQJnOC4/3rLBQNH9m4E9qI+8lbfHCmHpVAsmGqPJPKhCjJLHUQzQW/RBHRdQ==", "license": "MIT", "engines": { "node": ">=8", @@ -6705,6 +6763,8 @@ }, "node_modules/awesome-only-resolves-last-promise": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/awesome-only-resolves-last-promise/-/awesome-only-resolves-last-promise-1.0.3.tgz", + "integrity": "sha512-7q4WPsYiD8Omvi/yHL314DkvsD/lM//Z2/KcU1vWk0xJotiV0GMJTgHTpWl3n90HJqpXKg7qX+VVNs5YbQyPRQ==", "license": "MIT", "dependencies": { "awesome-imperative-promise": "^1.0.1" @@ -7508,6 +7568,8 @@ }, "node_modules/clsx": { "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", "license": "MIT", "engines": { "node": ">=6" @@ -7825,6 +7887,8 @@ }, "node_modules/css-jss": { "version": "10.10.0", + "resolved": "https://registry.npmjs.org/css-jss/-/css-jss-10.10.0.tgz", + "integrity": "sha512-YyMIS/LsSKEGXEaVJdjonWe18p4vXLo8CMA4FrW/kcaEyqdIGKCFXao31gbJddXEdIxSXFFURWrenBJPlKTgAA==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.3.1", @@ -7906,6 +7970,8 @@ }, "node_modules/css-vendor": { "version": "2.0.8", + "resolved": "https://registry.npmjs.org/css-vendor/-/css-vendor-2.0.8.tgz", + "integrity": "sha512-x9Aq0XTInxrkuFeHKbYC7zWY8ai7qJ04Kxd9MnvbC1uO5DagxoHQjm4JvG+vCdXOoFtCjbL2XSZfxmoYa9uQVQ==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.8.3", @@ -8047,6 +8113,8 @@ }, "node_modules/debounce-promise": { "version": "3.1.2", + "resolved": "https://registry.npmjs.org/debounce-promise/-/debounce-promise-3.1.2.tgz", + "integrity": "sha512-rZHcgBkbYavBeD9ej6sP56XfG53d51CD4dnaw989YX/nZ/ZJfgRx/9ePKmTNiUiyQvh4mtrMoS3OAWW+yoYtpg==", "license": "MIT" }, "node_modules/debug": { @@ -10043,10 +10111,12 @@ } }, "node_modules/file-selector": { - "version": "0.6.0", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/file-selector/-/file-selector-2.1.2.tgz", + "integrity": "sha512-QgXo+mXTe8ljeqUFaX3QVHc5osSItJ/Km+xpocx0aSqWGMSCf6qYs/VnzZgS864Pjn5iceMRFigeAV7AfTlaig==", "license": "MIT", "dependencies": { - "tslib": "^2.4.0" + "tslib": "^2.7.0" }, "engines": { "node": ">= 12" @@ -11260,6 +11330,8 @@ }, "node_modules/hyphenate-style-name": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.1.0.tgz", + "integrity": "sha512-WDC/ui2VVRrz3jOVi+XtjqkDjiVjTtFaAGiW37k6b+ohyQ5wYDOGkvCZa8+H0nx3gyvv0+BST9xuOgIyGQ00gw==", "license": "BSD-3-Clause" }, "node_modules/iconv-lite": { @@ -11324,6 +11396,8 @@ }, "node_modules/immediate": { "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", "license": "MIT" }, "node_modules/immer": { @@ -11737,6 +11811,8 @@ }, "node_modules/is-in-browser": { "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-in-browser/-/is-in-browser-1.1.3.tgz", + "integrity": "sha512-FeXIBgG/CPGd/WUxuEyvgGTEfwiG9Z4EKGxjNMRqviiIIfsmgrpnHLffEDdwUHqNva1VEW91o3xBT/m8Elgl9g==", "license": "MIT" }, "node_modules/is-inside-container": { @@ -12425,6 +12501,8 @@ }, "node_modules/jss": { "version": "10.10.0", + "resolved": "https://registry.npmjs.org/jss/-/jss-10.10.0.tgz", + "integrity": "sha512-cqsOTS7jqPsPMjtKYDUpdFC0AbhYFLTcuGRqymgmdJIeQ8cH7+AgX7YSgQy79wXloZq2VvATYxUOUQEvS1V/Zw==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.3.1", @@ -12439,6 +12517,8 @@ }, "node_modules/jss-plugin-camel-case": { "version": "10.10.0", + "resolved": "https://registry.npmjs.org/jss-plugin-camel-case/-/jss-plugin-camel-case-10.10.0.tgz", + "integrity": "sha512-z+HETfj5IYgFxh1wJnUAU8jByI48ED+v0fuTuhKrPR+pRBYS2EDwbusU8aFOpCdYhtRc9zhN+PJ7iNE8pAWyPw==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.3.1", @@ -12448,6 +12528,8 @@ }, "node_modules/jss-plugin-compose": { "version": "10.10.0", + "resolved": "https://registry.npmjs.org/jss-plugin-compose/-/jss-plugin-compose-10.10.0.tgz", + "integrity": "sha512-F5kgtWpI2XfZ3Z8eP78tZEYFdgTIbpA/TMuX3a8vwrNolYtN1N4qJR/Ob0LAsqIwCMLojtxN7c7Oo/+Vz6THow==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.3.1", @@ -12457,6 +12539,8 @@ }, "node_modules/jss-plugin-default-unit": { "version": "10.10.0", + "resolved": "https://registry.npmjs.org/jss-plugin-default-unit/-/jss-plugin-default-unit-10.10.0.tgz", + "integrity": "sha512-SvpajxIECi4JDUbGLefvNckmI+c2VWmP43qnEy/0eiwzRUsafg5DVSIWSzZe4d2vFX1u9nRDP46WCFV/PXVBGQ==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.3.1", @@ -12465,6 +12549,8 @@ }, "node_modules/jss-plugin-expand": { "version": "10.10.0", + "resolved": "https://registry.npmjs.org/jss-plugin-expand/-/jss-plugin-expand-10.10.0.tgz", + "integrity": "sha512-ymT62W2OyDxBxr7A6JR87vVX9vTq2ep5jZLIdUSusfBIEENLdkkc0lL/Xaq8W9s3opUq7R0sZQpzRWELrfVYzA==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.3.1", @@ -12473,6 +12559,8 @@ }, "node_modules/jss-plugin-extend": { "version": "10.10.0", + "resolved": "https://registry.npmjs.org/jss-plugin-extend/-/jss-plugin-extend-10.10.0.tgz", + "integrity": "sha512-sKYrcMfr4xxigmIwqTjxNcHwXJIfvhvjTNxF+Tbc1NmNdyspGW47Ey6sGH8BcQ4FFQhLXctpWCQSpDwdNmXSwg==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.3.1", @@ -12482,6 +12570,8 @@ }, "node_modules/jss-plugin-global": { "version": "10.10.0", + "resolved": "https://registry.npmjs.org/jss-plugin-global/-/jss-plugin-global-10.10.0.tgz", + "integrity": "sha512-icXEYbMufiNuWfuazLeN+BNJO16Ge88OcXU5ZDC2vLqElmMybA31Wi7lZ3lf+vgufRocvPj8443irhYRgWxP+A==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.3.1", @@ -12490,6 +12580,8 @@ }, "node_modules/jss-plugin-nested": { "version": "10.10.0", + "resolved": "https://registry.npmjs.org/jss-plugin-nested/-/jss-plugin-nested-10.10.0.tgz", + "integrity": "sha512-9R4JHxxGgiZhurDo3q7LdIiDEgtA1bTGzAbhSPyIOWb7ZubrjQe8acwhEQ6OEKydzpl8XHMtTnEwHXCARLYqYA==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.3.1", @@ -12499,6 +12591,8 @@ }, "node_modules/jss-plugin-props-sort": { "version": "10.10.0", + "resolved": "https://registry.npmjs.org/jss-plugin-props-sort/-/jss-plugin-props-sort-10.10.0.tgz", + "integrity": "sha512-5VNJvQJbnq/vRfje6uZLe/FyaOpzP/IH1LP+0fr88QamVrGJa0hpRRyAa0ea4U/3LcorJfBFVyC4yN2QC73lJg==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.3.1", @@ -12507,6 +12601,8 @@ }, "node_modules/jss-plugin-rule-value-function": { "version": "10.10.0", + "resolved": "https://registry.npmjs.org/jss-plugin-rule-value-function/-/jss-plugin-rule-value-function-10.10.0.tgz", + "integrity": "sha512-uEFJFgaCtkXeIPgki8ICw3Y7VMkL9GEan6SqmT9tqpwM+/t+hxfMUdU4wQ0MtOiMNWhwnckBV0IebrKcZM9C0g==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.3.1", @@ -12516,6 +12612,8 @@ }, "node_modules/jss-plugin-rule-value-observable": { "version": "10.10.0", + "resolved": "https://registry.npmjs.org/jss-plugin-rule-value-observable/-/jss-plugin-rule-value-observable-10.10.0.tgz", + "integrity": "sha512-ZLMaYrR3QE+vD7nl3oNXuj79VZl9Kp8/u6A1IbTPDcuOu8b56cFdWRZNZ0vNr8jHewooEeq2doy8Oxtymr2ZPA==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.3.1", @@ -12525,6 +12623,8 @@ }, "node_modules/jss-plugin-template": { "version": "10.10.0", + "resolved": "https://registry.npmjs.org/jss-plugin-template/-/jss-plugin-template-10.10.0.tgz", + "integrity": "sha512-ocXZBIOJOA+jISPdsgkTs8wwpK6UbsvtZK5JI7VUggTD6LWKbtoxUzadd2TpfF+lEtlhUmMsCkTRNkITdPKa6w==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.3.1", @@ -12534,6 +12634,8 @@ }, "node_modules/jss-plugin-vendor-prefixer": { "version": "10.10.0", + "resolved": "https://registry.npmjs.org/jss-plugin-vendor-prefixer/-/jss-plugin-vendor-prefixer-10.10.0.tgz", + "integrity": "sha512-UY/41WumgjW8r1qMCO8l1ARg7NHnfRVWRhZ2E2m0DMYsr2DD91qIXLyNhiX83hHswR7Wm4D+oDYNC1zWCJWtqg==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.3.1", @@ -12543,6 +12645,8 @@ }, "node_modules/jss-preset-default": { "version": "10.10.0", + "resolved": "https://registry.npmjs.org/jss-preset-default/-/jss-preset-default-10.10.0.tgz", + "integrity": "sha512-GL175Wt2FGhjE+f+Y3aWh+JioL06/QWFgZp53CbNNq6ZkVU0TDplD8Bxm9KnkotAYn3FlplNqoW5CjyLXcoJ7Q==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.3.1", @@ -12673,6 +12777,8 @@ }, "node_modules/lie": { "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.1.1.tgz", + "integrity": "sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw==", "license": "MIT", "dependencies": { "immediate": "~3.0.5" @@ -12749,6 +12855,8 @@ }, "node_modules/localforage": { "version": "1.10.0", + "resolved": "https://registry.npmjs.org/localforage/-/localforage-1.10.0.tgz", + "integrity": "sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg==", "license": "Apache-2.0", "dependencies": { "lie": "3.1.1" @@ -14336,6 +14444,8 @@ }, "node_modules/parse-srcset": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/parse-srcset/-/parse-srcset-1.0.2.tgz", + "integrity": "sha512-/2qh0lav6CmI15FzA3i/2Bzk2zCgQhGMkvhOhKNcBVQ1ldgpbfiNTVslmooUmWJcADi1f1kIeynbDRVzNlfR6Q==", "license": "MIT" }, "node_modules/parse5": { @@ -15207,6 +15317,8 @@ }, "node_modules/react-display-name": { "version": "0.2.5", + "resolved": "https://registry.npmjs.org/react-display-name/-/react-display-name-0.2.5.tgz", + "integrity": "sha512-I+vcaK9t4+kypiSgaiVWAipqHRXYmZIuAiS8vzFvXHHXVigg/sMKwlRgLy6LH2i3rmP+0Vzfl5lFsFRwF1r3pg==", "license": "MIT" }, "node_modules/react-dom": { @@ -15221,11 +15333,13 @@ } }, "node_modules/react-dropzone": { - "version": "14.2.3", + "version": "14.3.5", + "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-14.3.5.tgz", + "integrity": "sha512-9nDUaEEpqZLOz5v5SUcFA0CjM4vq8YbqO0WRls+EYT7+DvxUdzDPKNCPLqGfj3YL9MsniCLCD4RFA6M95V6KMQ==", "license": "MIT", "dependencies": { - "attr-accept": "^2.2.2", - "file-selector": "^0.6.0", + "attr-accept": "^2.2.4", + "file-selector": "^2.1.0", "prop-types": "^15.8.1" }, "engines": { @@ -15241,6 +15355,8 @@ }, "node_modules/react-jss": { "version": "10.10.0", + "resolved": "https://registry.npmjs.org/react-jss/-/react-jss-10.10.0.tgz", + "integrity": "sha512-WLiq84UYWqNBF6579/uprcIUnM1TSywYq6AIjKTTTG5ziJl9Uy+pwuvpN3apuyVwflMbD60PraeTKT7uWH9XEQ==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.3.1", @@ -15891,7 +16007,9 @@ "license": "MIT" }, "node_modules/sanitize-html": { - "version": "2.13.1", + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/sanitize-html/-/sanitize-html-2.15.0.tgz", + "integrity": "sha512-wIjst57vJGpLyBP8ioUbg6ThwJie5SuSIjHxJg53v5Fg+kUK+AXlb7bK3RNXpp315MvwM+0OBGCV6h5pPHsVhA==", "license": "MIT", "dependencies": { "deepmerge": "^4.2.2", @@ -15904,6 +16022,8 @@ }, "node_modules/sanitize-html/node_modules/dom-serializer": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", "license": "MIT", "dependencies": { "domelementtype": "^2.3.0", @@ -15916,6 +16036,8 @@ }, "node_modules/sanitize-html/node_modules/domhandler": { "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", "license": "BSD-2-Clause", "dependencies": { "domelementtype": "^2.3.0" @@ -15928,7 +16050,9 @@ } }, "node_modules/sanitize-html/node_modules/domutils": { - "version": "3.1.0", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", "license": "BSD-2-Clause", "dependencies": { "dom-serializer": "^2.0.0", @@ -15941,6 +16065,8 @@ }, "node_modules/sanitize-html/node_modules/htmlparser2": { "version": "8.0.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", + "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", "funding": [ "https://github.com/fb55/htmlparser2?sponsor=1", { @@ -16325,6 +16451,8 @@ }, "node_modules/shallow-equal": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/shallow-equal/-/shallow-equal-1.2.1.tgz", + "integrity": "sha512-S4vJDjHHMBaiZuT9NPb616CSmLf618jawtv3sufLl6ivK8WocjAo58cXwbRV1cgqxH0Qbv+iUt6m05eqEa2IRA==", "license": "MIT" }, "node_modules/shebang-command": { @@ -17363,6 +17491,8 @@ }, "node_modules/symbol-observable": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", + "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -17576,6 +17706,8 @@ }, "node_modules/theming": { "version": "3.3.0", + "resolved": "https://registry.npmjs.org/theming/-/theming-3.3.0.tgz", + "integrity": "sha512-u6l4qTJRDaWZsqa8JugaNt7Xd8PPl9+gonZaIe28vAhqgHMIG/DOyFPqiKN/gQLQYj05tHv+YQdNILL4zoiAVA==", "license": "MIT", "dependencies": { "hoist-non-react-statics": "^3.3.0", @@ -17629,6 +17761,8 @@ }, "node_modules/tiny-warning": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", + "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==", "license": "MIT" }, "node_modules/tinybench": { @@ -20927,12 +21061,16 @@ }, "@emotion/is-prop-valid": { "version": "0.7.3", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.7.3.tgz", + "integrity": "sha512-uxJqm/sqwXw3YPA5GXX365OBcJGFtxUVkB6WyezqFHlNe9jqUWH5ur2O2M8dGBz61kn1g3ZBlzUunFQXQIClhA==", "requires": { "@emotion/memoize": "0.7.1" } }, "@emotion/memoize": { - "version": "0.7.1" + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.1.tgz", + "integrity": "sha512-Qv4LTqO11jepd5Qmlp3M1YEjBumoTHcHFdgPTQ+sFlIL5myi/7xu/POwP7IRu6odBdmLXdtIs1D6TuW6kbwbbg==" }, "@esbuild/aix-ppc64": { "version": "0.25.2", @@ -21547,60 +21685,76 @@ "optional": true }, "@patternfly/patternfly": { - "version": "5.4.1" + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@patternfly/patternfly/-/patternfly-6.1.0.tgz", + "integrity": "sha512-w+QazL8NHKkg5j01eotblsswKxQQSYB0CN3yBXQL9ScpHdp/fK8M6TqWbKZNRpf+NqhMxcH/om8eR0N/fDCJqw==" }, "@patternfly/react-code-editor": { - "version": "5.4.1", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@patternfly/react-code-editor/-/react-code-editor-6.1.0.tgz", + "integrity": "sha512-ae04+DdkgXFn3wEzvNCncNa78ZK3Swh5ng8p7yqFrD6lhW69NoJf+DdQlHi8gM8Qy05DNnIemSbQWpWLpInyzw==", "requires": { "@monaco-editor/react": "^4.6.0", - "@patternfly/react-core": "^5.4.0", - "@patternfly/react-icons": "^5.4.0", - "@patternfly/react-styles": "^5.4.0", - "react-dropzone": "14.2.3", - "tslib": "^2.6.3" + "@patternfly/react-core": "^6.1.0", + "@patternfly/react-icons": "^6.1.0", + "@patternfly/react-styles": "^6.1.0", + "react-dropzone": "14.3.5", + "tslib": "^2.8.1" } }, "@patternfly/react-component-groups": { - "version": "5.5.8", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@patternfly/react-component-groups/-/react-component-groups-6.1.0.tgz", + "integrity": "sha512-8RkQv9wQk+D+nUMFtl4uk0ddMvxZ/+jFwnnXe2fw/BulouDVbpKRI24C1S8i1OQHr3++CbocBmmWRV0iw9Kvlw==", "requires": { - "@patternfly/react-core": "^5.4.1", - "@patternfly/react-icons": "^5.4.0", - "@patternfly/react-table": "^5.4.1", + "@patternfly/react-core": "^6.0.0", + "@patternfly/react-icons": "^6.0.0", + "@patternfly/react-table": "^6.0.0", "clsx": "^2.1.1", "react-jss": "^10.10.0" } }, "@patternfly/react-core": { - "version": "5.4.12", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@patternfly/react-core/-/react-core-6.1.0.tgz", + "integrity": "sha512-zj0lJPZxQanXKD8ae2kYnweT0kpp1CzpHYAkaBjTrw2k6ZMfr/UPlp0/ugCjWEokBqh79RUADLkKJJPce/yoSQ==", "requires": { - "@patternfly/react-icons": "^5.4.2", - "@patternfly/react-styles": "^5.4.1", - "@patternfly/react-tokens": "^5.4.1", + "@patternfly/react-icons": "^6.1.0", + "@patternfly/react-styles": "^6.1.0", + "@patternfly/react-tokens": "^6.1.0", "focus-trap": "7.6.2", - "react-dropzone": "^14.2.3", - "tslib": "^2.7.0" + "react-dropzone": "^14.3.5", + "tslib": "^2.8.1" } }, "@patternfly/react-icons": { - "version": "5.4.2", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@patternfly/react-icons/-/react-icons-6.1.0.tgz", + "integrity": "sha512-V1w/j19YmOgvh72IRRf1p07k+u4M5+9P+o/IxunlF0fWzLDX4Hf+utBI11A8cRfUzpQN7eLw/vZIS3BLM8Ge3Q==", "requires": {} }, "@patternfly/react-styles": { - "version": "5.4.1" + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@patternfly/react-styles/-/react-styles-6.1.0.tgz", + "integrity": "sha512-JQ3zIl5SFiSB0YWVYibcUwgZdsp6Wn8hkfZ7KhtCjHFccSDdJexPOXVV1O9f2h4PfxTlY3YntZ81ZsguBx/Q7A==" }, "@patternfly/react-table": { - "version": "5.4.14", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@patternfly/react-table/-/react-table-6.1.0.tgz", + "integrity": "sha512-eC8mKkvFR0btfv6yEOvE+J4gBXU8ZGe9i2RSezBM+MJaXEQt/CKRjV+SAB5EeE3PyBYKG8yYDdsOoNmaPxxvSA==", "requires": { - "@patternfly/react-core": "^5.4.12", - "@patternfly/react-icons": "^5.4.2", - "@patternfly/react-styles": "^5.4.1", - "@patternfly/react-tokens": "^5.4.1", + "@patternfly/react-core": "^6.1.0", + "@patternfly/react-icons": "^6.1.0", + "@patternfly/react-styles": "^6.1.0", + "@patternfly/react-tokens": "^6.1.0", "lodash": "^4.17.21", - "tslib": "^2.7.0" + "tslib": "^2.8.1" } }, "@patternfly/react-tokens": { - "version": "5.4.1" + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@patternfly/react-tokens/-/react-tokens-6.1.0.tgz", + "integrity": "sha512-t1UcHbOa4txczTR5UlnG4XcAAdnDSfSlCaOddw/HTqRF59pn2ks2JUu9sfnFRZ8SiAAxKRiYdX5bT7Mf4R24+w==" }, "@pkgjs/parseargs": { "version": "0.11.0", @@ -21648,13 +21802,13 @@ } }, "@redhat-cloud-services/frontend-components": { - "version": "5.2.6", - "resolved": "https://registry.npmjs.org/@redhat-cloud-services/frontend-components/-/frontend-components-5.2.6.tgz", - "integrity": "sha512-YhA6tQ5KlkVoRfkIzRXQa/cvhQ6sbe6jsYt3QrX8SwJ1ojq0ekqHZDbcaPxS3U34MXnsW6877bjyAya5se+2ug==", + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/@redhat-cloud-services/frontend-components/-/frontend-components-6.0.4.tgz", + "integrity": "sha512-xOy6gCI292C2VJy5CFwUjA+iBlXmePx/Si76XVFgjw1gCZ7cyPOCSGwGOJKTFlYdVsklfrG9efZJQKrT0h8xHA==", "requires": { - "@patternfly/react-component-groups": "^5.5.5", - "@redhat-cloud-services/frontend-components-utilities": "^5.0.4", - "@redhat-cloud-services/types": "^1.0.19", + "@patternfly/react-component-groups": "^6.0.0", + "@redhat-cloud-services/frontend-components-utilities": "^6.0.0", + "@redhat-cloud-services/types": "^2.0.0", "@scalprum/core": "^0.8.1", "@scalprum/react-core": "^0.9.1", "classnames": "^2.2.5", @@ -21769,12 +21923,12 @@ } }, "@redhat-cloud-services/frontend-components-notifications": { - "version": "4.1.20", - "resolved": "https://registry.npmjs.org/@redhat-cloud-services/frontend-components-notifications/-/frontend-components-notifications-4.1.20.tgz", - "integrity": "sha512-9GGDb7pwhTyzgLpM6xfBetrKDRwLTEu8/Ifn8/8xu/wfm4Ch5TXiib04QV5+W5EcRuWxMZevVhytTNFUqXSBvw==", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@redhat-cloud-services/frontend-components-notifications/-/frontend-components-notifications-5.0.4.tgz", + "integrity": "sha512-2/D+tNwKyV8y41nFgzDPIo0wV4BmYKvY01GvtEccvZ0so09h6dDqhMb+1NzfVw1dso12obc3KAd/cQtqeHMuMQ==", "requires": { - "@redhat-cloud-services/frontend-components": "^5.0.5", - "@redhat-cloud-services/frontend-components-utilities": "^5.0.4", + "@redhat-cloud-services/frontend-components": "^6.0.0", + "@redhat-cloud-services/frontend-components-utilities": "^6.0.0", "redux-promise-middleware": "6.1.3" }, "dependencies": { @@ -21785,10 +21939,12 @@ } }, "@redhat-cloud-services/frontend-components-utilities": { - "version": "5.0.11", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@redhat-cloud-services/frontend-components-utilities/-/frontend-components-utilities-6.0.2.tgz", + "integrity": "sha512-1YH75PeABT190fY33Bh6aj+wJumQVwAjSd5Txw4/Ky80wpTdjEDr2aOyz2gWWhXRDFCwOeRIbABUwOEuZtvuUg==", "requires": { "@redhat-cloud-services/rbac-client": "^1.0.111 || 2.x", - "@redhat-cloud-services/types": "^1.0.19", + "@redhat-cloud-services/types": "^2.0.0", "@sentry/browser": "^7.119.1", "awesome-debounce-promise": "^2.1.0", "axios": "^0.28.1 || ^1.7.0", @@ -21799,19 +21955,25 @@ }, "dependencies": { "p-map": { - "version": "7.0.3" + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.3.tgz", + "integrity": "sha512-VkndIv2fIB99swvQoA65bm+fsmt6UNdGeIB0oxBs+WhAhdh08QA04JXpI7rbB9r08/nkbysKoya9rtDERYOYMA==" } } }, "@redhat-cloud-services/javascript-clients-shared": { - "version": "1.2.5", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@redhat-cloud-services/javascript-clients-shared/-/javascript-clients-shared-1.2.7.tgz", + "integrity": "sha512-DfH1Sdjwc9YYVM2wLznnNfC3+DFpdH8Ak59LW93KQWaPAn8ZHDoEXi/TZ8MisEgWTQv7jpsDVtlVQwOWkzKhUA==", "requires": { "axios": "^1.7.2", "tslib": "^2.6.2" } }, "@redhat-cloud-services/rbac-client": { - "version": "2.2.10", + "version": "2.2.11", + "resolved": "https://registry.npmjs.org/@redhat-cloud-services/rbac-client/-/rbac-client-2.2.11.tgz", + "integrity": "sha512-3LLW5XtBMqcdlYJ4lAFo7MaGnHXUBP01O3kty4ocU69EPjiip6/Gtj83vAx5hkgAWX9h6ZEntTDeDuU/ZfGdKQ==", "requires": { "@redhat-cloud-services/javascript-clients-shared": "^1.2.4", "axios": "^1.7.2", @@ -21841,7 +22003,9 @@ } }, "@redhat-cloud-services/types": { - "version": "1.0.21" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@redhat-cloud-services/types/-/types-2.0.0.tgz", + "integrity": "sha512-T9KvjntxMtRkNcyYCKB9OktIy7hhy24Y4n1nDZgGsysSnfWOrnmsrLUI7pyrwqsRVzjIjI3oYf7qH7DE5LcFag==" }, "@reduxjs/toolkit": { "version": "2.8.2", @@ -22057,28 +22221,34 @@ "dev": true }, "@sentry-internal/feedback": { - "version": "7.120.1", + "version": "7.120.3", + "resolved": "https://registry.npmjs.org/@sentry-internal/feedback/-/feedback-7.120.3.tgz", + "integrity": "sha512-ewJJIQ0mbsOX6jfiVFvqMjokxNtgP3dNwUv+4nenN+iJJPQsM6a0ocro3iscxwVdbkjw5hY3BUV2ICI5Q0UWoA==", "requires": { - "@sentry/core": "7.120.1", - "@sentry/types": "7.120.1", - "@sentry/utils": "7.120.1" + "@sentry/core": "7.120.3", + "@sentry/types": "7.120.3", + "@sentry/utils": "7.120.3" } }, "@sentry-internal/replay-canvas": { - "version": "7.120.1", + "version": "7.120.3", + "resolved": "https://registry.npmjs.org/@sentry-internal/replay-canvas/-/replay-canvas-7.120.3.tgz", + "integrity": "sha512-s5xy+bVL1eDZchM6gmaOiXvTqpAsUfO7122DxVdEDMtwVq3e22bS2aiGa8CUgOiJkulZ+09q73nufM77kOmT/A==", "requires": { - "@sentry/core": "7.120.1", - "@sentry/replay": "7.120.1", - "@sentry/types": "7.120.1", - "@sentry/utils": "7.120.1" + "@sentry/core": "7.120.3", + "@sentry/replay": "7.120.3", + "@sentry/types": "7.120.3", + "@sentry/utils": "7.120.3" } }, "@sentry-internal/tracing": { - "version": "7.120.1", + "version": "7.120.3", + "resolved": "https://registry.npmjs.org/@sentry-internal/tracing/-/tracing-7.120.3.tgz", + "integrity": "sha512-Ausx+Jw1pAMbIBHStoQ6ZqDZR60PsCByvHdw/jdH9AqPrNE9xlBSf9EwcycvmrzwyKspSLaB52grlje2cRIUMg==", "requires": { - "@sentry/core": "7.120.1", - "@sentry/types": "7.120.1", - "@sentry/utils": "7.120.1" + "@sentry/core": "7.120.3", + "@sentry/types": "7.120.3", + "@sentry/utils": "7.120.3" } }, "@sentry/babel-plugin-component-annotate": { @@ -22087,16 +22257,18 @@ "integrity": "sha512-tSzfc3aE7m0PM0Aj7HBDet5llH9AB9oc+tBQ8AvOqUSnWodLrNCuWeQszJ7mIBovD3figgCU3h0cvI6U5cDtsg==" }, "@sentry/browser": { - "version": "7.120.1", + "version": "7.120.3", + "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-7.120.3.tgz", + "integrity": "sha512-i9vGcK9N8zZ/JQo1TCEfHHYZ2miidOvgOABRUc9zQKhYdcYQB2/LU1kqlj77Pxdxf4wOa9137d6rPrSn9iiBxg==", "requires": { - "@sentry-internal/feedback": "7.120.1", - "@sentry-internal/replay-canvas": "7.120.1", - "@sentry-internal/tracing": "7.120.1", - "@sentry/core": "7.120.1", - "@sentry/integrations": "7.120.1", - "@sentry/replay": "7.120.1", - "@sentry/types": "7.120.1", - "@sentry/utils": "7.120.1" + "@sentry-internal/feedback": "7.120.3", + "@sentry-internal/replay-canvas": "7.120.3", + "@sentry-internal/tracing": "7.120.3", + "@sentry/core": "7.120.3", + "@sentry/integrations": "7.120.3", + "@sentry/replay": "7.120.3", + "@sentry/types": "7.120.3", + "@sentry/utils": "7.120.3" } }, "@sentry/bundler-plugin-core": { @@ -22202,37 +22374,47 @@ "optional": true }, "@sentry/core": { - "version": "7.120.1", + "version": "7.120.3", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.120.3.tgz", + "integrity": "sha512-vyy11fCGpkGK3qI5DSXOjgIboBZTriw0YDx/0KyX5CjIjDDNgp5AGgpgFkfZyiYiaU2Ww3iFuKo4wHmBusz1uA==", "requires": { - "@sentry/types": "7.120.1", - "@sentry/utils": "7.120.1" + "@sentry/types": "7.120.3", + "@sentry/utils": "7.120.3" } }, "@sentry/integrations": { - "version": "7.120.1", + "version": "7.120.3", + "resolved": "https://registry.npmjs.org/@sentry/integrations/-/integrations-7.120.3.tgz", + "integrity": "sha512-6i/lYp0BubHPDTg91/uxHvNui427df9r17SsIEXa2eKDwQ9gW2qRx5IWgvnxs2GV/GfSbwcx4swUB3RfEWrXrQ==", "requires": { - "@sentry/core": "7.120.1", - "@sentry/types": "7.120.1", - "@sentry/utils": "7.120.1", + "@sentry/core": "7.120.3", + "@sentry/types": "7.120.3", + "@sentry/utils": "7.120.3", "localforage": "^1.8.1" } }, "@sentry/replay": { - "version": "7.120.1", + "version": "7.120.3", + "resolved": "https://registry.npmjs.org/@sentry/replay/-/replay-7.120.3.tgz", + "integrity": "sha512-CjVq1fP6bpDiX8VQxudD5MPWwatfXk8EJ2jQhJTcWu/4bCSOQmHxnnmBM+GVn5acKUBCodWHBN+IUZgnJheZSg==", "requires": { - "@sentry-internal/tracing": "7.120.1", - "@sentry/core": "7.120.1", - "@sentry/types": "7.120.1", - "@sentry/utils": "7.120.1" + "@sentry-internal/tracing": "7.120.3", + "@sentry/core": "7.120.3", + "@sentry/types": "7.120.3", + "@sentry/utils": "7.120.3" } }, "@sentry/types": { - "version": "7.120.1" + "version": "7.120.3", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.120.3.tgz", + "integrity": "sha512-C4z+3kGWNFJ303FC+FxAd4KkHvxpNFYAFN8iMIgBwJdpIl25KZ8Q/VdGn0MLLUEHNLvjob0+wvwlcRBBNLXOow==" }, "@sentry/utils": { - "version": "7.120.1", + "version": "7.120.3", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.120.3.tgz", + "integrity": "sha512-UDAOQJtJDxZHQ5Nm1olycBIsz2wdGX8SdzyGVHmD8EOQYAeDZQyIlQYohDe9nazdIOQLZCIc3fU0G9gqVLkaGQ==", "requires": { - "@sentry/types": "7.120.1" + "@sentry/types": "7.120.3" } }, "@sentry/webpack-plugin": { @@ -22489,7 +22671,9 @@ "dev": true }, "@types/debounce-promise": { - "version": "3.1.9" + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/@types/debounce-promise/-/debounce-promise-3.1.9.tgz", + "integrity": "sha512-awNxydYSU+E2vL7EiOAMtiSOfL5gUM5X4YSE2A92qpxDJQ/rXz6oMPYBFDcDywlUmvIDI6zsqgq17cGm5CITQw==" }, "@types/eslint": { "version": "9.6.1", @@ -23483,7 +23667,9 @@ "dev": true }, "attr-accept": { - "version": "2.2.5" + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/attr-accept/-/attr-accept-2.2.5.tgz", + "integrity": "sha512-0bDNnY/u6pPwHDMoF0FieU354oBi0a8rD9FcsLwzcGWbc8KS8KPIi7y+s13OlVY+gMWc/9xEMUgNE6Qm8ZllYQ==" }, "available-typed-arrays": { "version": "1.0.7", @@ -23494,6 +23680,8 @@ }, "awesome-debounce-promise": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/awesome-debounce-promise/-/awesome-debounce-promise-2.1.0.tgz", + "integrity": "sha512-0Dv4j2wKk5BrNZh4jgV2HUdznaeVgEK/WTvcHhZWUElhmQ1RR+iURRoLEwICFyR0S/5VtxfcvY6gR+qSe95jNg==", "requires": { "@types/debounce-promise": "^3.1.1", "awesome-imperative-promise": "^1.0.1", @@ -23502,10 +23690,14 @@ } }, "awesome-imperative-promise": { - "version": "1.0.1" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/awesome-imperative-promise/-/awesome-imperative-promise-1.0.1.tgz", + "integrity": "sha512-EmPr3FqbQGqlNh+WxMNcF9pO9uDQJnOC4/3rLBQNH9m4E9qI+8lbfHCmHpVAsmGqPJPKhCjJLHUQzQW/RBHRdQ==" }, "awesome-only-resolves-last-promise": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/awesome-only-resolves-last-promise/-/awesome-only-resolves-last-promise-1.0.3.tgz", + "integrity": "sha512-7q4WPsYiD8Omvi/yHL314DkvsD/lM//Z2/KcU1vWk0xJotiV0GMJTgHTpWl3n90HJqpXKg7qX+VVNs5YbQyPRQ==", "requires": { "awesome-imperative-promise": "^1.0.1" } @@ -24009,7 +24201,9 @@ } }, "clsx": { - "version": "2.1.1" + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==" }, "color-convert": { "version": "2.0.1", @@ -24207,6 +24401,8 @@ }, "css-jss": { "version": "10.10.0", + "resolved": "https://registry.npmjs.org/css-jss/-/css-jss-10.10.0.tgz", + "integrity": "sha512-YyMIS/LsSKEGXEaVJdjonWe18p4vXLo8CMA4FrW/kcaEyqdIGKCFXao31gbJddXEdIxSXFFURWrenBJPlKTgAA==", "requires": { "@babel/runtime": "^7.3.1", "jss": "^10.10.0", @@ -24254,6 +24450,8 @@ }, "css-vendor": { "version": "2.0.8", + "resolved": "https://registry.npmjs.org/css-vendor/-/css-vendor-2.0.8.tgz", + "integrity": "sha512-x9Aq0XTInxrkuFeHKbYC7zWY8ai7qJ04Kxd9MnvbC1uO5DagxoHQjm4JvG+vCdXOoFtCjbL2XSZfxmoYa9uQVQ==", "requires": { "@babel/runtime": "^7.8.3", "is-in-browser": "^1.0.2" @@ -24337,7 +24535,9 @@ "dev": true }, "debounce-promise": { - "version": "3.1.2" + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/debounce-promise/-/debounce-promise-3.1.2.tgz", + "integrity": "sha512-rZHcgBkbYavBeD9ej6sP56XfG53d51CD4dnaw989YX/nZ/ZJfgRx/9ePKmTNiUiyQvh4mtrMoS3OAWW+yoYtpg==" }, "debug": { "version": "4.4.0", @@ -25627,9 +25827,11 @@ } }, "file-selector": { - "version": "0.6.0", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/file-selector/-/file-selector-2.1.2.tgz", + "integrity": "sha512-QgXo+mXTe8ljeqUFaX3QVHc5osSItJ/Km+xpocx0aSqWGMSCf6qYs/VnzZgS864Pjn5iceMRFigeAV7AfTlaig==", "requires": { - "tslib": "^2.4.0" + "tslib": "^2.7.0" } }, "filing-cabinet": { @@ -26407,7 +26609,9 @@ "dev": true }, "hyphenate-style-name": { - "version": "1.1.0" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.1.0.tgz", + "integrity": "sha512-WDC/ui2VVRrz3jOVi+XtjqkDjiVjTtFaAGiW37k6b+ohyQ5wYDOGkvCZa8+H0nx3gyvv0+BST9xuOgIyGQ00gw==" }, "iconv-lite": { "version": "0.4.24", @@ -26437,7 +26641,9 @@ "dev": true }, "immediate": { - "version": "3.0.6" + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==" }, "immer": { "version": "10.1.1" @@ -26674,7 +26880,9 @@ } }, "is-in-browser": { - "version": "1.1.3" + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-in-browser/-/is-in-browser-1.1.3.tgz", + "integrity": "sha512-FeXIBgG/CPGd/WUxuEyvgGTEfwiG9Z4EKGxjNMRqviiIIfsmgrpnHLffEDdwUHqNva1VEW91o3xBT/m8Elgl9g==" }, "is-inside-container": { "version": "1.0.0", @@ -27074,6 +27282,8 @@ }, "jss": { "version": "10.10.0", + "resolved": "https://registry.npmjs.org/jss/-/jss-10.10.0.tgz", + "integrity": "sha512-cqsOTS7jqPsPMjtKYDUpdFC0AbhYFLTcuGRqymgmdJIeQ8cH7+AgX7YSgQy79wXloZq2VvATYxUOUQEvS1V/Zw==", "requires": { "@babel/runtime": "^7.3.1", "csstype": "^3.0.2", @@ -27083,6 +27293,8 @@ }, "jss-plugin-camel-case": { "version": "10.10.0", + "resolved": "https://registry.npmjs.org/jss-plugin-camel-case/-/jss-plugin-camel-case-10.10.0.tgz", + "integrity": "sha512-z+HETfj5IYgFxh1wJnUAU8jByI48ED+v0fuTuhKrPR+pRBYS2EDwbusU8aFOpCdYhtRc9zhN+PJ7iNE8pAWyPw==", "requires": { "@babel/runtime": "^7.3.1", "hyphenate-style-name": "^1.0.3", @@ -27091,6 +27303,8 @@ }, "jss-plugin-compose": { "version": "10.10.0", + "resolved": "https://registry.npmjs.org/jss-plugin-compose/-/jss-plugin-compose-10.10.0.tgz", + "integrity": "sha512-F5kgtWpI2XfZ3Z8eP78tZEYFdgTIbpA/TMuX3a8vwrNolYtN1N4qJR/Ob0LAsqIwCMLojtxN7c7Oo/+Vz6THow==", "requires": { "@babel/runtime": "^7.3.1", "jss": "10.10.0", @@ -27099,6 +27313,8 @@ }, "jss-plugin-default-unit": { "version": "10.10.0", + "resolved": "https://registry.npmjs.org/jss-plugin-default-unit/-/jss-plugin-default-unit-10.10.0.tgz", + "integrity": "sha512-SvpajxIECi4JDUbGLefvNckmI+c2VWmP43qnEy/0eiwzRUsafg5DVSIWSzZe4d2vFX1u9nRDP46WCFV/PXVBGQ==", "requires": { "@babel/runtime": "^7.3.1", "jss": "10.10.0" @@ -27106,6 +27322,8 @@ }, "jss-plugin-expand": { "version": "10.10.0", + "resolved": "https://registry.npmjs.org/jss-plugin-expand/-/jss-plugin-expand-10.10.0.tgz", + "integrity": "sha512-ymT62W2OyDxBxr7A6JR87vVX9vTq2ep5jZLIdUSusfBIEENLdkkc0lL/Xaq8W9s3opUq7R0sZQpzRWELrfVYzA==", "requires": { "@babel/runtime": "^7.3.1", "jss": "10.10.0" @@ -27113,6 +27331,8 @@ }, "jss-plugin-extend": { "version": "10.10.0", + "resolved": "https://registry.npmjs.org/jss-plugin-extend/-/jss-plugin-extend-10.10.0.tgz", + "integrity": "sha512-sKYrcMfr4xxigmIwqTjxNcHwXJIfvhvjTNxF+Tbc1NmNdyspGW47Ey6sGH8BcQ4FFQhLXctpWCQSpDwdNmXSwg==", "requires": { "@babel/runtime": "^7.3.1", "jss": "10.10.0", @@ -27121,6 +27341,8 @@ }, "jss-plugin-global": { "version": "10.10.0", + "resolved": "https://registry.npmjs.org/jss-plugin-global/-/jss-plugin-global-10.10.0.tgz", + "integrity": "sha512-icXEYbMufiNuWfuazLeN+BNJO16Ge88OcXU5ZDC2vLqElmMybA31Wi7lZ3lf+vgufRocvPj8443irhYRgWxP+A==", "requires": { "@babel/runtime": "^7.3.1", "jss": "10.10.0" @@ -27128,6 +27350,8 @@ }, "jss-plugin-nested": { "version": "10.10.0", + "resolved": "https://registry.npmjs.org/jss-plugin-nested/-/jss-plugin-nested-10.10.0.tgz", + "integrity": "sha512-9R4JHxxGgiZhurDo3q7LdIiDEgtA1bTGzAbhSPyIOWb7ZubrjQe8acwhEQ6OEKydzpl8XHMtTnEwHXCARLYqYA==", "requires": { "@babel/runtime": "^7.3.1", "jss": "10.10.0", @@ -27136,6 +27360,8 @@ }, "jss-plugin-props-sort": { "version": "10.10.0", + "resolved": "https://registry.npmjs.org/jss-plugin-props-sort/-/jss-plugin-props-sort-10.10.0.tgz", + "integrity": "sha512-5VNJvQJbnq/vRfje6uZLe/FyaOpzP/IH1LP+0fr88QamVrGJa0hpRRyAa0ea4U/3LcorJfBFVyC4yN2QC73lJg==", "requires": { "@babel/runtime": "^7.3.1", "jss": "10.10.0" @@ -27143,6 +27369,8 @@ }, "jss-plugin-rule-value-function": { "version": "10.10.0", + "resolved": "https://registry.npmjs.org/jss-plugin-rule-value-function/-/jss-plugin-rule-value-function-10.10.0.tgz", + "integrity": "sha512-uEFJFgaCtkXeIPgki8ICw3Y7VMkL9GEan6SqmT9tqpwM+/t+hxfMUdU4wQ0MtOiMNWhwnckBV0IebrKcZM9C0g==", "requires": { "@babel/runtime": "^7.3.1", "jss": "10.10.0", @@ -27151,6 +27379,8 @@ }, "jss-plugin-rule-value-observable": { "version": "10.10.0", + "resolved": "https://registry.npmjs.org/jss-plugin-rule-value-observable/-/jss-plugin-rule-value-observable-10.10.0.tgz", + "integrity": "sha512-ZLMaYrR3QE+vD7nl3oNXuj79VZl9Kp8/u6A1IbTPDcuOu8b56cFdWRZNZ0vNr8jHewooEeq2doy8Oxtymr2ZPA==", "requires": { "@babel/runtime": "^7.3.1", "jss": "10.10.0", @@ -27159,6 +27389,8 @@ }, "jss-plugin-template": { "version": "10.10.0", + "resolved": "https://registry.npmjs.org/jss-plugin-template/-/jss-plugin-template-10.10.0.tgz", + "integrity": "sha512-ocXZBIOJOA+jISPdsgkTs8wwpK6UbsvtZK5JI7VUggTD6LWKbtoxUzadd2TpfF+lEtlhUmMsCkTRNkITdPKa6w==", "requires": { "@babel/runtime": "^7.3.1", "jss": "10.10.0", @@ -27167,6 +27399,8 @@ }, "jss-plugin-vendor-prefixer": { "version": "10.10.0", + "resolved": "https://registry.npmjs.org/jss-plugin-vendor-prefixer/-/jss-plugin-vendor-prefixer-10.10.0.tgz", + "integrity": "sha512-UY/41WumgjW8r1qMCO8l1ARg7NHnfRVWRhZ2E2m0DMYsr2DD91qIXLyNhiX83hHswR7Wm4D+oDYNC1zWCJWtqg==", "requires": { "@babel/runtime": "^7.3.1", "css-vendor": "^2.0.8", @@ -27175,6 +27409,8 @@ }, "jss-preset-default": { "version": "10.10.0", + "resolved": "https://registry.npmjs.org/jss-preset-default/-/jss-preset-default-10.10.0.tgz", + "integrity": "sha512-GL175Wt2FGhjE+f+Y3aWh+JioL06/QWFgZp53CbNNq6ZkVU0TDplD8Bxm9KnkotAYn3FlplNqoW5CjyLXcoJ7Q==", "requires": { "@babel/runtime": "^7.3.1", "jss": "10.10.0", @@ -27274,6 +27510,8 @@ }, "lie": { "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.1.1.tgz", + "integrity": "sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw==", "requires": { "immediate": "~3.0.5" } @@ -27326,6 +27564,8 @@ }, "localforage": { "version": "1.10.0", + "resolved": "https://registry.npmjs.org/localforage/-/localforage-1.10.0.tgz", + "integrity": "sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg==", "requires": { "lie": "3.1.1" } @@ -28324,7 +28564,9 @@ "dev": true }, "parse-srcset": { - "version": "1.0.2" + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/parse-srcset/-/parse-srcset-1.0.2.tgz", + "integrity": "sha512-/2qh0lav6CmI15FzA3i/2Bzk2zCgQhGMkvhOhKNcBVQ1ldgpbfiNTVslmooUmWJcADi1f1kIeynbDRVzNlfR6Q==" }, "parse5": { "version": "7.2.1", @@ -28850,7 +29092,9 @@ "requires": {} }, "react-display-name": { - "version": "0.2.5" + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/react-display-name/-/react-display-name-0.2.5.tgz", + "integrity": "sha512-I+vcaK9t4+kypiSgaiVWAipqHRXYmZIuAiS8vzFvXHHXVigg/sMKwlRgLy6LH2i3rmP+0Vzfl5lFsFRwF1r3pg==" }, "react-dom": { "version": "18.3.1", @@ -28860,10 +29104,12 @@ } }, "react-dropzone": { - "version": "14.2.3", + "version": "14.3.5", + "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-14.3.5.tgz", + "integrity": "sha512-9nDUaEEpqZLOz5v5SUcFA0CjM4vq8YbqO0WRls+EYT7+DvxUdzDPKNCPLqGfj3YL9MsniCLCD4RFA6M95V6KMQ==", "requires": { - "attr-accept": "^2.2.2", - "file-selector": "^0.6.0", + "attr-accept": "^2.2.4", + "file-selector": "^2.1.0", "prop-types": "^15.8.1" } }, @@ -28872,6 +29118,8 @@ }, "react-jss": { "version": "10.10.0", + "resolved": "https://registry.npmjs.org/react-jss/-/react-jss-10.10.0.tgz", + "integrity": "sha512-WLiq84UYWqNBF6579/uprcIUnM1TSywYq6AIjKTTTG5ziJl9Uy+pwuvpN3apuyVwflMbD60PraeTKT7uWH9XEQ==", "requires": { "@babel/runtime": "^7.3.1", "@emotion/is-prop-valid": "^0.7.3", @@ -29264,7 +29512,9 @@ "dev": true }, "sanitize-html": { - "version": "2.13.1", + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/sanitize-html/-/sanitize-html-2.15.0.tgz", + "integrity": "sha512-wIjst57vJGpLyBP8ioUbg6ThwJie5SuSIjHxJg53v5Fg+kUK+AXlb7bK3RNXpp315MvwM+0OBGCV6h5pPHsVhA==", "requires": { "deepmerge": "^4.2.2", "escape-string-regexp": "^4.0.0", @@ -29276,6 +29526,8 @@ "dependencies": { "dom-serializer": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", "requires": { "domelementtype": "^2.3.0", "domhandler": "^5.0.2", @@ -29284,12 +29536,16 @@ }, "domhandler": { "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", "requires": { "domelementtype": "^2.3.0" } }, "domutils": { - "version": "3.1.0", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", "requires": { "dom-serializer": "^2.0.0", "domelementtype": "^2.3.0", @@ -29298,6 +29554,8 @@ }, "htmlparser2": { "version": "8.0.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", + "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", "requires": { "domelementtype": "^2.3.0", "domhandler": "^5.0.3", @@ -29543,7 +29801,9 @@ } }, "shallow-equal": { - "version": "1.2.1" + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/shallow-equal/-/shallow-equal-1.2.1.tgz", + "integrity": "sha512-S4vJDjHHMBaiZuT9NPb616CSmLf618jawtv3sufLl6ivK8WocjAo58cXwbRV1cgqxH0Qbv+iUt6m05eqEa2IRA==" }, "shebang-command": { "version": "2.0.0", @@ -30233,7 +30493,9 @@ } }, "symbol-observable": { - "version": "1.2.0" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", + "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==" }, "symbol-tree": { "version": "3.2.4", @@ -30366,6 +30628,8 @@ }, "theming": { "version": "3.3.0", + "resolved": "https://registry.npmjs.org/theming/-/theming-3.3.0.tgz", + "integrity": "sha512-u6l4qTJRDaWZsqa8JugaNt7Xd8PPl9+gonZaIe28vAhqgHMIG/DOyFPqiKN/gQLQYj05tHv+YQdNILL4zoiAVA==", "requires": { "hoist-non-react-statics": "^3.3.0", "prop-types": "^15.5.8", @@ -30402,7 +30666,9 @@ "peer": true }, "tiny-warning": { - "version": "1.0.3" + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", + "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" }, "tinybench": { "version": "2.9.0", diff --git a/package.json b/package.json index 963f24c0..2d542fd9 100644 --- a/package.json +++ b/package.json @@ -8,13 +8,13 @@ }, "dependencies": { "@ltd/j-toml": "1.38.0", - "@patternfly/patternfly": "5.4.1", - "@patternfly/react-code-editor": "5.4.1", - "@patternfly/react-core": "5.4.12", - "@patternfly/react-table": "5.4.14", - "@redhat-cloud-services/frontend-components": "5.2.6", - "@redhat-cloud-services/frontend-components-notifications": "4.1.20", - "@redhat-cloud-services/frontend-components-utilities": "5.0.11", + "@patternfly/patternfly": "6.1.0", + "@patternfly/react-code-editor": "6.1.0", + "@patternfly/react-core": "6.1.0", + "@patternfly/react-table": "6.1.0", + "@redhat-cloud-services/frontend-components": "6.0.4", + "@redhat-cloud-services/frontend-components-notifications": "5.0.4", + "@redhat-cloud-services/frontend-components-utilities": "6.0.2", "@reduxjs/toolkit": "2.8.2", "@scalprum/react-core": "0.9.5", "@sentry/webpack-plugin": "3.4.0", @@ -35,7 +35,7 @@ "@babel/preset-react": "7.27.1", "@babel/preset-typescript": "7.27.0", "@currents/playwright": "1.13.2", - "@patternfly/react-icons": "5.4.2", + "@patternfly/react-icons": "6.1.0", "@playwright/test": "1.51.1", "@redhat-cloud-services/eslint-config-redhat-cloud-services": "2.0.12", "@redhat-cloud-services/frontend-components-config": "6.3.8", From 1fc1f0cb8d4e8cb7ec3923703640232a8d5b95d7 Mon Sep 17 00:00:00 2001 From: regexowl Date: Mon, 19 May 2025 13:52:20 +0200 Subject: [PATCH 003/331] src: Run codemods and lint Run `npx @patternfly/pf-codemods@latest src --v6 --fix` and lint autofix to get the bulk of the changes in. --- playwright/test.spec.ts | 48 +- src/Components/Blueprints/BlueprintCard.tsx | 3 - .../Blueprints/BlueprintDiffModal.tsx | 3 +- .../Blueprints/BlueprintsSideBar.tsx | 9 +- .../Blueprints/BuildImagesButton.tsx | 61 +- .../Blueprints/DeleteBlueprintModal.tsx | 8 +- .../Blueprints/ImportBlueprintModal.tsx | 8 +- src/Components/Cockpit/NotReady.tsx | 14 +- src/Components/Cockpit/RequireAdmin.tsx | 14 +- .../CreateImageWizard/CreateImageWizard.tsx | 2 +- .../CreateImageWizard/LabelInput.tsx | 10 +- .../CreateImageWizard/ValidatedInput.tsx | 12 +- .../CreateImageWizard/steps/Details/index.tsx | 6 +- ...ileSystemAutomaticPartitionInformation.tsx | 17 +- .../FileSystem/FileSystemConfiguration.tsx | 27 +- .../steps/FileSystem/FileSystemTable.tsx | 16 +- .../steps/FileSystem/index.tsx | 4 +- .../steps/Firewall/index.tsx | 6 +- .../steps/FirstBoot/index.tsx | 14 +- .../steps/Hostname/index.tsx | 4 +- .../steps/ImageOutput/TargetEnvironment.tsx | 66 +- .../steps/ImageOutput/index.tsx | 6 +- .../steps/Kernel/components/KernelName.tsx | 5 +- .../CreateImageWizard/steps/Kernel/index.tsx | 6 +- .../Locale/components/KeyboardDropDown.tsx | 5 +- .../Locale/components/LanguagesDropDown.tsx | 5 +- .../CreateImageWizard/steps/Locale/index.tsx | 4 +- .../components/OscapProfileInformation.tsx | 87 ++- .../Oscap/components/ProfileSelector.tsx | 5 +- .../CreateImageWizard/steps/Oscap/index.tsx | 6 +- .../steps/Packages/PackageRecommendations.tsx | 29 +- .../steps/Packages/Packages.tsx | 73 +- .../PackageInfoNotAvailablePopover.tsx | 19 +- .../Packages/components/RepoPopovers.tsx | 28 +- .../steps/Packages/index.tsx | 6 +- .../Registration/ActivationKeyInformation.tsx | 96 +-- .../steps/Registration/ActivationKeysList.tsx | 11 +- .../steps/Registration/Registration.tsx | 29 +- .../Registration/SatelliteRegistration.tsx | 1 - .../components/PopoverActivation.tsx | 29 +- .../steps/Registration/index.tsx | 6 +- .../steps/Repositories/Repositories.tsx | 6 +- .../Repositories/components/BulkSelect.tsx | 20 +- .../steps/Repositories/components/Empty.tsx | 23 +- .../steps/Repositories/components/Loading.tsx | 20 +- .../components/UploadRepositoryLabel.tsx | 6 +- .../steps/Repositories/index.tsx | 6 +- .../steps/Review/Footer/CreateDropdown.tsx | 2 +- .../steps/Review/Footer/Footer.tsx | 9 +- .../steps/Review/ReviewStep.tsx | 70 +- .../steps/Review/ReviewStepTables.tsx | 14 +- .../steps/Review/ReviewStepTextLists.tsx | 652 +++++++----------- .../CreateImageWizard/steps/Review/index.tsx | 6 +- .../steps/Services/index.tsx | 6 +- .../steps/Snapshot/Snapshot.tsx | 10 +- .../Snapshot/components/TemplatesEmpty.tsx | 9 +- .../steps/Snapshot/index.tsx | 6 +- .../Aws/AwsSourcesSelect.tsx | 5 +- .../steps/TargetEnvironment/Aws/index.tsx | 10 +- .../Azure/AzureResourceGroups.tsx | 5 +- .../Azure/AzureSourcesSelect.tsx | 5 +- .../steps/TargetEnvironment/Azure/index.tsx | 10 +- .../steps/TargetEnvironment/Gcp/index.tsx | 14 +- .../Timezone/components/TimezoneDropDown.tsx | 5 +- .../steps/Timezone/index.tsx | 4 +- .../steps/Users/components/EmptyUserState.tsx | 12 +- .../Users/components/RemoveUserModal.tsx | 3 +- .../CreateImageWizard/steps/Users/index.tsx | 4 +- .../utilities/PasswordValidatedInput.tsx | 4 +- src/Components/ImagesTable/EmptyState.tsx | 28 +- src/Components/ImagesTable/ImagesTable.tsx | 2 +- .../ImagesTable/ImagesTableToolbar.tsx | 2 +- src/Components/ImagesTable/Instance.tsx | 3 +- src/Components/ImagesTable/Status.tsx | 9 +- src/Components/LandingPage/LandingPage.tsx | 29 +- src/Components/LandingPage/NewAlert.tsx | 34 +- .../ShareImageModal/RegionsSelect.tsx | 12 +- .../ShareImageModal/ShareImageModal.tsx | 2 +- .../sharedComponents/ImageBuilderHeader.tsx | 24 +- 79 files changed, 833 insertions(+), 1066 deletions(-) diff --git a/playwright/test.spec.ts b/playwright/test.spec.ts index 8027d9fd..93510933 100644 --- a/playwright/test.spec.ts +++ b/playwright/test.spec.ts @@ -11,65 +11,65 @@ test.describe.serial('test', () => { await login(page); const frame = await ibFrame(page); - await frame.getByRole('heading', { name: 'Images About image builder' }); - await frame.getByRole('heading', { name: 'Blueprints' }); + frame.getByRole('heading', { name: 'Images About image builder' }); + frame.getByRole('heading', { name: 'Blueprints' }); await frame.getByTestId('blueprints-create-button').click(); - await frame.getByRole('heading', { name: 'Image output' }); + frame.getByRole('heading', { name: 'Image output' }); await frame.getByTestId('checkbox-guest-image').click(); await frame.getByRole('button', { name: 'Next', exact: true }).click(); if (isHosted()) { - await frame.getByRole('heading', { + frame.getByRole('heading', { name: 'Register systems using this image', }); await page.getByTestId('register-later-radio').click(); await frame.getByRole('button', { name: 'Next', exact: true }).click(); } - await frame.getByRole('heading', { name: 'Compliance' }); + frame.getByRole('heading', { name: 'Compliance' }); await frame.getByRole('button', { name: 'Next', exact: true }).click(); - await frame.getByRole('heading', { name: 'File system configuration' }); + frame.getByRole('heading', { name: 'File system configuration' }); await frame.getByRole('button', { name: 'Next', exact: true }).click(); if (isHosted()) { - await frame.getByRole('heading', { name: 'Repository snapshot' }); + frame.getByRole('heading', { name: 'Repository snapshot' }); await frame.getByRole('button', { name: 'Next', exact: true }).click(); - await frame.getByRole('heading', { name: 'Custom repositories' }); + frame.getByRole('heading', { name: 'Custom repositories' }); await frame.getByRole('button', { name: 'Next', exact: true }).click(); } - await frame.getByRole('heading', { name: 'Additional packages' }); + frame.getByRole('heading', { name: 'Additional packages' }); await frame.getByRole('button', { name: 'Next', exact: true }).click(); - await frame.getByRole('heading', { name: 'Users' }); + frame.getByRole('heading', { name: 'Users' }); await frame.getByRole('button', { name: 'Next', exact: true }).click(); - await frame.getByRole('heading', { name: 'Timezone' }); + frame.getByRole('heading', { name: 'Timezone' }); await frame.getByRole('button', { name: 'Next', exact: true }).click(); - await frame.getByRole('heading', { name: 'Locale' }); + frame.getByRole('heading', { name: 'Locale' }); await frame.getByRole('button', { name: 'Next', exact: true }).click(); - await frame.getByRole('heading', { name: 'Hostname' }); + frame.getByRole('heading', { name: 'Hostname' }); await frame.getByRole('button', { name: 'Next', exact: true }).click(); - await frame.getByRole('heading', { name: 'Kernel' }); + frame.getByRole('heading', { name: 'Kernel' }); await frame.getByRole('button', { name: 'Next', exact: true }).click(); - await frame.getByRole('heading', { name: 'Firewall' }); + frame.getByRole('heading', { name: 'Firewall' }); await frame.getByRole('button', { name: 'Next', exact: true }).click(); - await frame.getByRole('heading', { name: 'Systemd services' }); + frame.getByRole('heading', { name: 'Systemd services' }); await frame.getByRole('button', { name: 'Next', exact: true }).click(); if (isHosted()) { - await frame.getByRole('heading', { name: 'First boot configuration' }); + frame.getByRole('heading', { name: 'First boot configuration' }); await frame.getByRole('button', { name: 'Next', exact: true }).click(); } - await frame.getByRole('heading', { name: 'Details' }); + frame.getByRole('heading', { name: 'Details' }); await frame.getByTestId('blueprint').fill(blueprintName); await expect(frame.getByTestId('blueprint')).toHaveValue(blueprintName); await frame.getByRole('button', { name: 'Next', exact: true }).click(); @@ -102,21 +102,21 @@ test.describe.serial('test', () => { .getByTestId('packages-search-input') .locator('input') .fill('osbuild-composer'); - await frame.getByTestId('packages-table').getByText('Searching'); - await frame.getByRole('gridcell', { name: 'osbuild-composer' }).first(); + frame.getByTestId('packages-table').getByText('Searching'); + frame.getByRole('gridcell', { name: 'osbuild-composer' }).first(); await frame.getByRole('checkbox', { name: 'Select row 0' }).check(); await frame.getByRole('button', { name: 'Review and finish' }).click(); await frame.getByRole('button', { name: 'About packages' }).click(); - await frame.getByRole('gridcell', { name: 'osbuild-composer' }); + frame.getByRole('gridcell', { name: 'osbuild-composer' }); await frame .getByRole('button', { name: 'Save changes to blueprint' }) .click(); await frame.getByRole('button', { name: 'Edit blueprint' }).click(); await frame.getByRole('button', { name: 'About packages' }).click(); - await frame.getByRole('gridcell', { name: 'osbuild-composer' }); + frame.getByRole('gridcell', { name: 'osbuild-composer' }); await frame.getByRole('button', { name: 'Cancel', exact: true }).click(); - await frame.getByRole('heading', { name: 'All images' }); + frame.getByRole('heading', { name: 'All images' }); }); test('build blueprint', async ({ page }) => { @@ -133,7 +133,7 @@ test.describe.serial('test', () => { .getByTestId('images-table') .getByRole('button', { name: 'Details' }) .click(); - await frame.getByText('Build Information'); + frame.getByText('Build Information'); }); test('delete blueprint', async ({ page }) => { diff --git a/src/Components/Blueprints/BlueprintCard.tsx b/src/Components/Blueprints/BlueprintCard.tsx index ca6c91a8..a392b8e1 100644 --- a/src/Components/Blueprints/BlueprintCard.tsx +++ b/src/Components/Blueprints/BlueprintCard.tsx @@ -40,9 +40,6 @@ const BlueprintCard = ({ blueprint }: blueprintProps) => { isCompact isClickable onClick={() => dispatch(setBlueprintId(blueprint.id))} - isSelectableRaised - hasSelectableInput - selectableInputAriaLabel={`Select blueprint ${blueprint.name}`} > diff --git a/src/Components/Blueprints/BlueprintDiffModal.tsx b/src/Components/Blueprints/BlueprintDiffModal.tsx index bddf26d5..aaa4e28e 100644 --- a/src/Components/Blueprints/BlueprintDiffModal.tsx +++ b/src/Components/Blueprints/BlueprintDiffModal.tsx @@ -1,7 +1,8 @@ import React from 'react'; import { DiffEditor } from '@monaco-editor/react'; -import { Button, Modal, ModalVariant } from '@patternfly/react-core'; +import { Button } from '@patternfly/react-core'; +import { Modal, ModalVariant } from '@patternfly/react-core/deprecated'; import { BuildImagesButton } from './BuildImagesButton'; diff --git a/src/Components/Blueprints/BlueprintsSideBar.tsx b/src/Components/Blueprints/BlueprintsSideBar.tsx index bb9bcc06..40763d0c 100644 --- a/src/Components/Blueprints/BlueprintsSideBar.tsx +++ b/src/Components/Blueprints/BlueprintsSideBar.tsx @@ -7,8 +7,6 @@ import { EmptyStateActions, EmptyStateBody, EmptyStateFooter, - EmptyStateHeader, - EmptyStateIcon, Flex, FlexItem, SearchInput, @@ -227,12 +225,7 @@ const EmptyBlueprintState = ({ icon, action, }: emptyBlueprintStateProps) => ( - - } - /> + {bodyText} {action} diff --git a/src/Components/Blueprints/BuildImagesButton.tsx b/src/Components/Blueprints/BuildImagesButton.tsx index 62b40b3b..c4c2fd22 100644 --- a/src/Components/Blueprints/BuildImagesButton.tsx +++ b/src/Components/Blueprints/BuildImagesButton.tsx @@ -115,38 +115,35 @@ export const BuildImagesButton = ({ children }: BuildImagesButtonPropTypes) => { ref={toggleRef} onClick={onToggleClick} isExpanded={isOpen} - splitButtonOptions={{ - variant: 'action', - items: [ - - - {imageBuildLoading && ( - - - - )} - {children ? children : 'Build images'} - - , - ], - }} + splitButtonItems={[ + + + {imageBuildLoading && ( + + + + )} + {children ? children : 'Build images'} + + , + ]} > )} > diff --git a/src/Components/Blueprints/DeleteBlueprintModal.tsx b/src/Components/Blueprints/DeleteBlueprintModal.tsx index bc8a57e2..503ea6ab 100644 --- a/src/Components/Blueprints/DeleteBlueprintModal.tsx +++ b/src/Components/Blueprints/DeleteBlueprintModal.tsx @@ -1,11 +1,7 @@ import React, { useEffect, useState } from 'react'; -import { - ActionGroup, - Button, - Modal, - ModalVariant, -} from '@patternfly/react-core'; +import { ActionGroup, Button } from '@patternfly/react-core'; +import { Modal, ModalVariant } from '@patternfly/react-core/deprecated'; import useChrome from '@redhat-cloud-services/frontend-components/useChrome'; import { ChromeUser } from '@redhat-cloud-services/types'; diff --git a/src/Components/Blueprints/ImportBlueprintModal.tsx b/src/Components/Blueprints/ImportBlueprintModal.tsx index 387c8041..615482d0 100644 --- a/src/Components/Blueprints/ImportBlueprintModal.tsx +++ b/src/Components/Blueprints/ImportBlueprintModal.tsx @@ -11,10 +11,9 @@ import { FormHelperText, HelperText, HelperTextItem, - Modal, - ModalVariant, Popover, } from '@patternfly/react-core'; +import { Modal, ModalVariant } from '@patternfly/react-core/deprecated'; import { DropEvent } from '@patternfly/react-core/dist/esm/helpers'; import { HelpIcon } from '@patternfly/react-icons'; import { addNotification } from '@redhat-cloud-services/frontend-components-notifications/redux'; @@ -261,13 +260,12 @@ export const ImportBlueprintModal: React.FunctionComponent< } > + /> } diff --git a/src/Components/Cockpit/NotReady.tsx b/src/Components/Cockpit/NotReady.tsx index ea173f57..c41d0e61 100644 --- a/src/Components/Cockpit/NotReady.tsx +++ b/src/Components/Cockpit/NotReady.tsx @@ -5,8 +5,6 @@ import { EmptyState, EmptyStateActions, EmptyStateFooter, - EmptyStateHeader, - EmptyStateIcon, EmptyStateVariant, } from '@patternfly/react-core'; import { CubesIcon } from '@patternfly/react-icons'; @@ -14,12 +12,12 @@ import cockpit from 'cockpit'; export const NotReady = ({ enabled }: { enabled: boolean }) => { return ( - - } - /> + + /> + /> {errorText && ( diff --git a/src/Components/CreateImageWizard/ValidatedInput.tsx b/src/Components/CreateImageWizard/ValidatedInput.tsx index 9de60c75..24f5fbfb 100644 --- a/src/Components/CreateImageWizard/ValidatedInput.tsx +++ b/src/Components/CreateImageWizard/ValidatedInput.tsx @@ -98,9 +98,7 @@ export const ValidatedInputAndTextArea = ({ )} {warning !== undefined && warning !== '' && ( - - {warning} - + {warning} )} {validated === 'error' && hasError && ( @@ -127,9 +125,7 @@ const getValidationState = ( export const ErrorMessage = ({ errorMessage }: ErrorMessageProps) => { return ( - - {errorMessage} - + {errorMessage} ); }; @@ -171,9 +167,7 @@ export const ValidatedInput = ({ /> {!isPristine && !validator(value) && ( - - {helperText} - + {helperText} )} diff --git a/src/Components/CreateImageWizard/steps/Details/index.tsx b/src/Components/CreateImageWizard/steps/Details/index.tsx index efa1a719..76f5c347 100644 --- a/src/Components/CreateImageWizard/steps/Details/index.tsx +++ b/src/Components/CreateImageWizard/steps/Details/index.tsx @@ -6,7 +6,7 @@ import { FormHelperText, HelperText, HelperTextItem, - Text, + Content, Title, } from '@patternfly/react-core'; @@ -48,11 +48,11 @@ const DetailsStep = () => { Details - + Enter a name to identify your blueprint. If no name is entered, the images created from this blueprint will use the name of the parent blueprint. - + { return ( - - Automatic partitioning - + + Automatic partitioning + The system automatically partitions your image storage depending on the target environment(s). The target environment sometimes dictates all or part of the partitioning scheme. Automatic partitioning applies the most @@ -31,8 +26,8 @@ const FileSystemAutomaticPartition = () => { > Customizing file systems during the image creation - - + + ); }; diff --git a/src/Components/CreateImageWizard/steps/FileSystem/FileSystemConfiguration.tsx b/src/Components/CreateImageWizard/steps/FileSystem/FileSystemConfiguration.tsx index b702bd1e..cfc8e61a 100644 --- a/src/Components/CreateImageWizard/steps/FileSystem/FileSystemConfiguration.tsx +++ b/src/Components/CreateImageWizard/steps/FileSystem/FileSystemConfiguration.tsx @@ -3,9 +3,8 @@ import React from 'react'; import { Alert, Button, - Text, - TextContent, - TextVariants, + Content, + ContentVariants, } from '@patternfly/react-core'; import { PlusCircleIcon } from '@patternfly/react-icons'; import { ExternalLinkAltIcon } from '@patternfly/react-icons'; @@ -42,19 +41,19 @@ const FileSystemConfiguration = () => { return ( <> - - Configure partitions - + + Configure partitions + {partitions?.find((partition) => partition?.mountpoint?.includes('/usr') ) && } - - + + Create partitions for your image by defining mount points and minimum sizes. Image builder creates partitions with a logical volume (LVM) device type. - - + + The order of partitions may change when the image is installed in order to conform to best practices and ensure functionality.

@@ -69,8 +68,8 @@ const FileSystemConfiguration = () => { > Read more about manual configuration here -
-
+ + {environments.includes('image-installer') && ( { /> )} - + - + ); }; diff --git a/src/Components/CreateImageWizard/steps/FileSystem/FileSystemTable.tsx b/src/Components/CreateImageWizard/steps/FileSystem/FileSystemTable.tsx index adf05e2c..c8be422a 100644 --- a/src/Components/CreateImageWizard/steps/FileSystem/FileSystemTable.tsx +++ b/src/Components/CreateImageWizard/steps/FileSystem/FileSystemTable.tsx @@ -2,8 +2,7 @@ import React, { useRef, useState } from 'react'; import { Popover, - TextContent, - Text, + Content, Button, Alert, TextInput, @@ -46,22 +45,21 @@ export const MinimumSizePopover = () => { - + + Image Builder may extend this size based on requirements, selected packages, and configurations. - - + + } > + /> ); }; diff --git a/src/Components/CreateImageWizard/steps/FileSystem/index.tsx b/src/Components/CreateImageWizard/steps/FileSystem/index.tsx index 6373f89d..555fd8ae 100644 --- a/src/Components/CreateImageWizard/steps/FileSystem/index.tsx +++ b/src/Components/CreateImageWizard/steps/FileSystem/index.tsx @@ -1,6 +1,6 @@ import React from 'react'; -import { Text, Form, Title } from '@patternfly/react-core'; +import { Content, Form, Title } from '@patternfly/react-core'; import FileSystemAutomaticPartition from './FileSystemAutomaticPartitionInformation'; import FileSystemConfiguration from './FileSystemConfiguration'; @@ -22,7 +22,7 @@ const FileSystemStep = () => { File system configuration - Define the partitioning of the image. + Define the partitioning of the image. {hasIsoTargetOnly ? ( ) : fileSystemConfigurationType === 'automatic' ? ( diff --git a/src/Components/CreateImageWizard/steps/Firewall/index.tsx b/src/Components/CreateImageWizard/steps/Firewall/index.tsx index 5707862c..a9cee7a9 100644 --- a/src/Components/CreateImageWizard/steps/Firewall/index.tsx +++ b/src/Components/CreateImageWizard/steps/Firewall/index.tsx @@ -1,6 +1,6 @@ import React from 'react'; -import { Text, Form, Title } from '@patternfly/react-core'; +import { Content, Form, Title } from '@patternfly/react-core'; import PortsInput from './components/PortsInput'; import Services from './components/Services'; @@ -11,7 +11,9 @@ const FirewallStep = () => { Firewall - Customize firewall settings for your image. + + Customize firewall settings for your image. + diff --git a/src/Components/CreateImageWizard/steps/FirstBoot/index.tsx b/src/Components/CreateImageWizard/steps/FirstBoot/index.tsx index b672884f..b558ec8d 100644 --- a/src/Components/CreateImageWizard/steps/FirstBoot/index.tsx +++ b/src/Components/CreateImageWizard/steps/FirstBoot/index.tsx @@ -2,7 +2,7 @@ import React from 'react'; import { CodeEditor, Language } from '@patternfly/react-code-editor'; import { - Text, + Content, Form, FormGroup, FormHelperText, @@ -52,22 +52,22 @@ const FirstBootStep = () => { First boot configuration - + Configure the image with a custom script that will execute on its first boot. - + - + Please ensure that your script does not contain any secrets, passwords, or other sensitive data. All scripts should be crafted without including confidential information to maintain security and privacy. - + { {errors.script && ( - - {errors.script} - + {errors.script} )} diff --git a/src/Components/CreateImageWizard/steps/Hostname/index.tsx b/src/Components/CreateImageWizard/steps/Hostname/index.tsx index 9051d844..f0fecb3d 100644 --- a/src/Components/CreateImageWizard/steps/Hostname/index.tsx +++ b/src/Components/CreateImageWizard/steps/Hostname/index.tsx @@ -1,6 +1,6 @@ import React from 'react'; -import { Text, Form, Title } from '@patternfly/react-core'; +import { Content, Form, Title } from '@patternfly/react-core'; import HostnameInput from './components/HostnameInput'; @@ -10,7 +10,7 @@ const HostnameStep = () => { Hostname - Select a hostname for your image. + Select a hostname for your image. ); diff --git a/src/Components/CreateImageWizard/steps/ImageOutput/TargetEnvironment.tsx b/src/Components/CreateImageWizard/steps/ImageOutput/TargetEnvironment.tsx index d1c1e2cc..3021213f 100644 --- a/src/Components/CreateImageWizard/steps/ImageOutput/TargetEnvironment.tsx +++ b/src/Components/CreateImageWizard/steps/ImageOutput/TargetEnvironment.tsx @@ -6,12 +6,11 @@ import { FormGroup, Popover, Radio, - Text, - TextContent, - TextVariants, - Tile, Tooltip, + Content, + ContentVariants, } from '@patternfly/react-core'; +import { Tile } from '@patternfly/react-core/deprecated'; import { HelpIcon, ExternalLinkAltIcon } from '@patternfly/react-icons'; import { useGetArchitecturesQuery } from '../../../../store/backendApi'; @@ -123,7 +122,9 @@ const TargetEnvironment = () => { data-testid="target-select" > Public cloud} + label={ + Public cloud + } >
{supportedEnvironments?.includes('aws') && ( @@ -214,7 +215,9 @@ const TargetEnvironment = () => { {supportedEnvironments?.includes('vsphere') && ( <> Private cloud} + label={ + Private cloud + } className="pf-v5-u-mt-sm" > { maxWidth="30rem" position="right" bodyContent={ - - + + An OVA file is a virtual appliance used by virtualization platforms such as VMware vSphere. It is a package that contains files used to describe a virtual machine, which includes a VMDK image, OVF descriptor file and a manifest file. - - + + } > + /> } @@ -300,24 +302,23 @@ const TargetEnvironment = () => { maxWidth="30rem" position="right" bodyContent={ - - + + A VMDK file is a virtual disk that stores the contents of a virtual machine. This disk has to be imported into vSphere using govc import.vmdk, use the OVA version when using the vSphere UI. - - + + } > + /> } @@ -339,7 +340,9 @@ const TargetEnvironment = () => { )} - Other}> + Other} + > {supportedEnvironments?.includes('guest-image') && ( { maxWidth="30rem" position="right" headerContent={ - - WSL is not officially supported by Red Hat - + + + WSL is not officially supported by Red Hat + + } bodyContent={ - - + + You can use RHEL on Microsoft's Windows Subsystem for Linux (WSL) for development and learning use cases. Red Hat supports WSL under the Validated Software Pattern and Third Party Component Support Policy, which does not include production use cases. - - + + } footerContent={ + /> } diff --git a/src/Components/CreateImageWizard/steps/ImageOutput/index.tsx b/src/Components/CreateImageWizard/steps/ImageOutput/index.tsx index 01044fdd..ab28206d 100644 --- a/src/Components/CreateImageWizard/steps/ImageOutput/index.tsx +++ b/src/Components/CreateImageWizard/steps/ImageOutput/index.tsx @@ -1,6 +1,6 @@ import React, { useEffect } from 'react'; -import { Text, Form, Title } from '@patternfly/react-core'; +import { Content, Form, Title } from '@patternfly/react-core'; import ArchSelect from './ArchSelect'; import CentOSAcknowledgement from './CentOSAcknowledgement'; @@ -38,12 +38,12 @@ const ImageOutputStep = () => { Image output - + Images enables you to create customized blueprints, create custom images from the blueprints, and push them to target environments.
-
+ {distribution.match('centos-*') && } diff --git a/src/Components/CreateImageWizard/steps/Kernel/components/KernelName.tsx b/src/Components/CreateImageWizard/steps/Kernel/components/KernelName.tsx index 42ae8602..06b6d42b 100644 --- a/src/Components/CreateImageWizard/steps/Kernel/components/KernelName.tsx +++ b/src/Components/CreateImageWizard/steps/Kernel/components/KernelName.tsx @@ -130,12 +130,11 @@ const KernelName = () => { {kernel && ( + /> )} diff --git a/src/Components/CreateImageWizard/steps/Kernel/index.tsx b/src/Components/CreateImageWizard/steps/Kernel/index.tsx index fe71f9cf..bb864f44 100644 --- a/src/Components/CreateImageWizard/steps/Kernel/index.tsx +++ b/src/Components/CreateImageWizard/steps/Kernel/index.tsx @@ -1,6 +1,6 @@ import React from 'react'; -import { Text, Form, Title } from '@patternfly/react-core'; +import { Content, Form, Title } from '@patternfly/react-core'; import KernelArguments from './components/KernelArguments'; import KernelName from './components/KernelName'; @@ -11,7 +11,9 @@ const KernelStep = () => { Kernel - Customize kernel name and kernel arguments. + + Customize kernel name and kernel arguments. + diff --git a/src/Components/CreateImageWizard/steps/Locale/components/KeyboardDropDown.tsx b/src/Components/CreateImageWizard/steps/Locale/components/KeyboardDropDown.tsx index 58206d6f..1eada1ab 100644 --- a/src/Components/CreateImageWizard/steps/Locale/components/KeyboardDropDown.tsx +++ b/src/Components/CreateImageWizard/steps/Locale/components/KeyboardDropDown.tsx @@ -115,12 +115,11 @@ const KeyboardDropDown = () => { {keyboard && ( + /> )} diff --git a/src/Components/CreateImageWizard/steps/Locale/components/LanguagesDropDown.tsx b/src/Components/CreateImageWizard/steps/Locale/components/LanguagesDropDown.tsx index df899faa..6ca6a24a 100644 --- a/src/Components/CreateImageWizard/steps/Locale/components/LanguagesDropDown.tsx +++ b/src/Components/CreateImageWizard/steps/Locale/components/LanguagesDropDown.tsx @@ -119,12 +119,11 @@ const LanguagesDropDown = () => { {inputValue && ( + /> )} diff --git a/src/Components/CreateImageWizard/steps/Locale/index.tsx b/src/Components/CreateImageWizard/steps/Locale/index.tsx index ccd74916..9a618425 100644 --- a/src/Components/CreateImageWizard/steps/Locale/index.tsx +++ b/src/Components/CreateImageWizard/steps/Locale/index.tsx @@ -1,6 +1,6 @@ import React from 'react'; -import { Text, Form, Title } from '@patternfly/react-core'; +import { Content, Form, Title } from '@patternfly/react-core'; import KeyboardDropDown from './components/KeyboardDropDown'; import LanguagesDropDown from './components/LanguagesDropDown'; @@ -11,7 +11,7 @@ const LocaleStep = () => { Locale - Select the locale for your image. + Select the locale for your image. diff --git a/src/Components/CreateImageWizard/steps/Oscap/components/OscapProfileInformation.tsx b/src/Components/CreateImageWizard/steps/Oscap/components/OscapProfileInformation.tsx index b5d569fb..1c915b97 100644 --- a/src/Components/CreateImageWizard/steps/Oscap/components/OscapProfileInformation.tsx +++ b/src/Components/CreateImageWizard/steps/Oscap/components/OscapProfileInformation.tsx @@ -1,13 +1,6 @@ import React, { useEffect } from 'react'; -import { - Spinner, - TextContent, - TextList, - TextListItem, - TextListItemVariants, - TextListVariants, -} from '@patternfly/react-core'; +import { Spinner, Content, ContentVariants } from '@patternfly/react-core'; import { useGetOscapCustomizationsQuery } from '../../../../../store/backendApi'; import { PolicyRead, usePolicyQuery } from '../../../../../store/complianceApi'; @@ -84,75 +77,75 @@ export const OscapProfileInformation = ({ )} {isSuccessOscapProfileInfo && ( <> - - - + + Profile description: - - + + {oscapProfile?.profile_description} - - + Reference ID: - - + {oscapProfile?.profile_id} - - - + + + )} {isSuccessPolicyInfo && ( <> - - - + + Policy description: - - + + {policyInfo?.data?.schema?.description} - - + Business objective: - - + + {policyInfo?.data?.schema?.business_objective} - - + Policy type: - - + + {policyInfo?.data?.schema?.type} - - + Reference ID: - - + + {policyInfo?.data?.schema?.id} - - - + + + )} diff --git a/src/Components/CreateImageWizard/steps/Oscap/components/ProfileSelector.tsx b/src/Components/CreateImageWizard/steps/Oscap/components/ProfileSelector.tsx index 46e9307b..37e20c52 100644 --- a/src/Components/CreateImageWizard/steps/Oscap/components/ProfileSelector.tsx +++ b/src/Components/CreateImageWizard/steps/Oscap/components/ProfileSelector.tsx @@ -340,12 +340,11 @@ const ProfileSelector = () => { {profileID && ( + /> )} diff --git a/src/Components/CreateImageWizard/steps/Oscap/index.tsx b/src/Components/CreateImageWizard/steps/Oscap/index.tsx index 1b6f5abc..99f1404c 100644 --- a/src/Components/CreateImageWizard/steps/Oscap/index.tsx +++ b/src/Components/CreateImageWizard/steps/Oscap/index.tsx @@ -4,7 +4,7 @@ import { Alert, AlertActionLink, Form, - Text, + Content, Title, ToggleGroup, ToggleGroupItem, @@ -114,13 +114,13 @@ const OscapContent = () => { {complianceEnabled ? 'Compliance' : 'OpenSCAP profile'} - + Below you can select which Insights compliance policy or OpenSCAP profile your image will be compliant to. Insights compliance allows the use of tailored policies, whereas OpenSCAP gives you the default versions. This will automatically help monitor the adherence of your registered RHEL systems to a selected policy or profile. - + {complianceEnabled && ( { Recommended Red Hat packages{' '} - - + + Powered by RHEL Lightspeed{' '} { onShow={() => setIsExpanded(false)} onHide={() => setIsExpanded(false)} bodyContent={ - - + + RHEL Lightspeed provides intelligent tools to improve the productivity and efficiency of teams using RHEL. - - + + } > - - + + } @@ -209,12 +208,12 @@ const PackageRecommendations = () => { )} {isSuccess && data && data?.packages && ( <> - - + + Other users commonly add these packages with the ones you selected. - - + + diff --git a/src/Components/CreateImageWizard/steps/Packages/Packages.tsx b/src/Components/CreateImageWizard/steps/Packages/Packages.tsx index e867eaca..bf7a0899 100644 --- a/src/Components/CreateImageWizard/steps/Packages/Packages.tsx +++ b/src/Components/CreateImageWizard/steps/Packages/Packages.tsx @@ -11,8 +11,6 @@ import { EmptyStateActions, EmptyStateBody, EmptyStateFooter, - EmptyStateHeader, - EmptyStateIcon, EmptyStateVariant, Icon, Pagination, @@ -24,14 +22,14 @@ import { Tab, Tabs, TabTitleText, - Text, + Content, ToggleGroup, ToggleGroupItem, Toolbar, ToolbarContent, ToolbarItem, } from '@patternfly/react-core'; -import { Modal } from '@patternfly/react-core'; +import { Modal } from '@patternfly/react-core/deprecated'; import { CheckCircleIcon, ExclamationCircleIcon, @@ -363,8 +361,7 @@ const Packages = () => {
- - } /> + {toggleSelected === 'toggle-available' ? ( Search above to add additional @@ -392,8 +389,7 @@ const Packages = () => {
- - } /> + {activeTabKey === Repos.OTHER ? 'Searching for recommendations' @@ -413,12 +409,12 @@ const Packages = () => {
- - } - titleText="The search value is too short" - headingLevel="h4" - /> + Please make the search more specific and try again. @@ -436,11 +432,11 @@ const Packages = () => {
- - + Try looking under "
- - } - /> - + Adjust your search and try again, or search in other repositories (your repositories and popular repositories). @@ -515,14 +509,12 @@ const Packages = () => {
- - } - /> - + No packages found in known repositories. If you know of a repository containing this packages, add it to{' '} @@ -1197,20 +1189,21 @@ const Packages = () => {
) : ( - This group has no packages + + This group has no packages + )}
} > + /> N/A @@ -1448,7 +1441,7 @@ const Packages = () => { - + { @@ -8,25 +8,24 @@ const PackageInfoNotAvailablePopover = () => { - + + The package description provides more information about the package. - - + + When editing an existing blueprint, you may see a "Not available" value in the field because information about previously added packages can not be fetched. - - + + } > + /> ); }; diff --git a/src/Components/CreateImageWizard/steps/Packages/components/RepoPopovers.tsx b/src/Components/CreateImageWizard/steps/Packages/components/RepoPopovers.tsx index 22b6990d..1e155166 100644 --- a/src/Components/CreateImageWizard/steps/Packages/components/RepoPopovers.tsx +++ b/src/Components/CreateImageWizard/steps/Packages/components/RepoPopovers.tsx @@ -1,30 +1,29 @@ import React from 'react'; -import { Button, Popover, Text, TextContent } from '@patternfly/react-core'; +import { Button, Popover, Content } from '@patternfly/react-core'; import { HelpIcon } from '@patternfly/react-icons'; export const IncludedReposPopover = () => { return ( - + + View packages from the Red Hat repository and repositories you've selected. - - + + } > + /> ); }; @@ -33,24 +32,23 @@ export const OtherReposPopover = () => { return ( - + + View packages from popular repositories and your other repositories not included in the image. - - + + } > + /> ); }; diff --git a/src/Components/CreateImageWizard/steps/Packages/index.tsx b/src/Components/CreateImageWizard/steps/Packages/index.tsx index 6c4cca6e..c280051d 100644 --- a/src/Components/CreateImageWizard/steps/Packages/index.tsx +++ b/src/Components/CreateImageWizard/steps/Packages/index.tsx @@ -1,6 +1,6 @@ import React from 'react'; -import { Alert, Text, Form, Title } from '@patternfly/react-core'; +import { Alert, Content, Form, Title } from '@patternfly/react-core'; import PackageRecommendations from './PackageRecommendations'; import Packages from './Packages'; @@ -16,7 +16,9 @@ const PackagesStep = () => { Additional packages - Blueprints created with Images include all required packages. + + Blueprints created with Images include all required packages. + {!process.env.IS_ON_PREMISE && ( Search for package groups by starting your search with the diff --git a/src/Components/CreateImageWizard/steps/Registration/ActivationKeyInformation.tsx b/src/Components/CreateImageWizard/steps/Registration/ActivationKeyInformation.tsx index 903c8696..adeebe22 100644 --- a/src/Components/CreateImageWizard/steps/Registration/ActivationKeyInformation.tsx +++ b/src/Components/CreateImageWizard/steps/Registration/ActivationKeyInformation.tsx @@ -3,13 +3,8 @@ import React from 'react'; import { Alert, Spinner, - Text, - TextContent, - TextList, - TextListItem, - TextListItemVariants, - TextListVariants, - TextVariants, + Content, + ContentVariants, } from '@patternfly/react-core'; import { Button, Popover } from '@patternfly/react-core'; import { HelpIcon } from '@patternfly/react-icons'; @@ -38,56 +33,45 @@ const ActivationKeyInformation = (): JSX.Element => { <> {isFetchingActivationKeyInfo && } {isSuccessActivationKeyInfo && ( - - - - Name: - - - {activationKey} - - - Role: - - + + + Name: + {activationKey} + Role: + {activationKeyInfo?.body?.role || 'Not defined'} - - - SLA: - - + + SLA: + {activationKeyInfo?.body?.serviceLevel || 'Not defined'} - - - Usage: - - + + Usage: + {activationKeyInfo?.body?.usage || 'Not defined'} - - + + Additional repositories: - + + The core repositories for your operating system version are always enabled and do not need to be explicitly added to the activation key. - - + + } > + /> - - + {activationKeyInfo?.body?.additionalRepositories && @@ -96,10 +80,10 @@ const ActivationKeyInformation = (): JSX.Element => { position="right" minWidth="30rem" bodyContent={ - - + + Additional repositories - + { )}
- + } > - + } > + /> ); }; @@ -67,12 +65,12 @@ const RhcPopover = () => { position="right" minWidth="30rem" bodyContent={ - - + + Remote host configuration allows Red Hat Enterprise Linux hosts to connect to Red Hat Insights. Remote host configuration is required to use the Red Hat Insights Remediations service. - + - + } > + /> ); }; diff --git a/src/Components/CreateImageWizard/steps/Registration/SatelliteRegistration.tsx b/src/Components/CreateImageWizard/steps/Registration/SatelliteRegistration.tsx index 522a36eb..65fa4f59 100644 --- a/src/Components/CreateImageWizard/steps/Registration/SatelliteRegistration.tsx +++ b/src/Components/CreateImageWizard/steps/Registration/SatelliteRegistration.tsx @@ -82,7 +82,6 @@ const SatelliteRegistration = () => { ? 'success' : 'default' } - hasIcon > {isRejected ? 'Must be a .PEM/.CER/.CRT file no larger than 512 KB' diff --git a/src/Components/CreateImageWizard/steps/Registration/components/PopoverActivation.tsx b/src/Components/CreateImageWizard/steps/Registration/components/PopoverActivation.tsx index 4af1373b..2a7a93ed 100644 --- a/src/Components/CreateImageWizard/steps/Registration/components/PopoverActivation.tsx +++ b/src/Components/CreateImageWizard/steps/Registration/components/PopoverActivation.tsx @@ -1,12 +1,6 @@ import React, { useEffect, useState } from 'react'; -import { - Button, - Popover, - Spinner, - Text, - TextContent, -} from '@patternfly/react-core'; +import { Button, Popover, Spinner, Content } from '@patternfly/react-core'; import { HelpIcon } from '@patternfly/react-icons'; import { useChrome } from '@redhat-cloud-services/frontend-components/useChrome'; @@ -27,30 +21,31 @@ const PopoverActivation = () => { hasAutoWidth maxWidth="35rem" bodyContent={ - - + + Activation keys enable you to register a system with appropriate subscriptions, system purpose, and repositories attached. - - + + If using an activation key with command line registration, you must provide your organization's ID. - + {orgId ? ( - Your organization's ID is {orgId} + + Your organization's ID is {orgId} + ) : ( )} - + } > + /> ); }; diff --git a/src/Components/CreateImageWizard/steps/Registration/index.tsx b/src/Components/CreateImageWizard/steps/Registration/index.tsx index 2ec8fd71..7e499910 100644 --- a/src/Components/CreateImageWizard/steps/Registration/index.tsx +++ b/src/Components/CreateImageWizard/steps/Registration/index.tsx @@ -1,6 +1,6 @@ import React from 'react'; -import { Text, Form, Title, FormGroup } from '@patternfly/react-core'; +import { Content, Form, Title, FormGroup } from '@patternfly/react-core'; import ActivationKeyInformation from './ActivationKeyInformation'; import ActivationKeysList from './ActivationKeysList'; @@ -21,11 +21,11 @@ const RegistrationStep = () => { Register systems using this image - + You can either automatically register your systems with Red Hat to enhance security and track your spending or choose to register your system during initial boot. - + {registrationType === 'register-satellite' && } {!process.env.IS_ON_PREMISE && diff --git a/src/Components/CreateImageWizard/steps/Repositories/Repositories.tsx b/src/Components/CreateImageWizard/steps/Repositories/Repositories.tsx index 7aa959da..2137667c 100644 --- a/src/Components/CreateImageWizard/steps/Repositories/Repositories.tsx +++ b/src/Components/CreateImageWizard/steps/Repositories/Repositories.tsx @@ -14,8 +14,8 @@ import { ToggleGroupItem, PaginationVariant, Grid, - Modal, } from '@patternfly/react-core'; +import { Modal } from '@patternfly/react-core/deprecated'; import { ExternalLinkAltIcon } from '@patternfly/react-icons'; import { Table, Tbody, Td, Th, Thead, Tr } from '@patternfly/react-table'; @@ -504,7 +504,7 @@ const Repositories = () => { )} - + { } /> - + , - ], - }} + splitButtonItems={[ + , + ]} onClick={toggleDropdown} > {someChecked ? `${selected.size} selected` : null} diff --git a/src/Components/CreateImageWizard/steps/Repositories/components/Empty.tsx b/src/Components/CreateImageWizard/steps/Repositories/components/Empty.tsx index e228475f..a9198880 100644 --- a/src/Components/CreateImageWizard/steps/Repositories/components/Empty.tsx +++ b/src/Components/CreateImageWizard/steps/Repositories/components/Empty.tsx @@ -3,8 +3,6 @@ import React from 'react'; import { EmptyState, EmptyStateVariant, - EmptyStateHeader, - EmptyStateIcon, EmptyStateBody, EmptyStateFooter, Button, @@ -20,16 +18,17 @@ type EmptyProps = { const Empty = ({ hasFilterValue, refetch }: EmptyProps) => { return ( - - } - headingLevel="h4" - /> + {hasFilterValue ? 'Try another search query or clear the current search value' diff --git a/src/Components/CreateImageWizard/steps/Repositories/components/Loading.tsx b/src/Components/CreateImageWizard/steps/Repositories/components/Loading.tsx index f2604822..4c10af8f 100644 --- a/src/Components/CreateImageWizard/steps/Repositories/components/Loading.tsx +++ b/src/Components/CreateImageWizard/steps/Repositories/components/Loading.tsx @@ -1,23 +1,15 @@ import React from 'react'; -import { - EmptyState, - EmptyStateIcon, - Spinner, - EmptyStateHeader, - Bullseye, -} from '@patternfly/react-core'; +import { EmptyState, Spinner, Bullseye } from '@patternfly/react-core'; export const Loading = () => { return ( - - } - headingLevel="h4" - /> - + ); }; diff --git a/src/Components/CreateImageWizard/steps/Repositories/components/UploadRepositoryLabel.tsx b/src/Components/CreateImageWizard/steps/Repositories/components/UploadRepositoryLabel.tsx index d1cb3327..668b4fd2 100644 --- a/src/Components/CreateImageWizard/steps/Repositories/components/UploadRepositoryLabel.tsx +++ b/src/Components/CreateImageWizard/steps/Repositories/components/UploadRepositoryLabel.tsx @@ -1,6 +1,6 @@ import React from 'react'; -import { Button, Label, Text, Tooltip } from '@patternfly/react-core'; +import { Button, Label, Content, Tooltip } from '@patternfly/react-core'; import { ExternalLinkAltIcon, UploadIcon } from '@patternfly/react-icons'; import { CONTENT_URL } from '../../../../../constants'; @@ -9,7 +9,7 @@ const UploadRepositoryLabel = () => { return ( + Upload repository: Snapshots will only be taken when new content is uploaded.  - + } >
{environments.includes('vsphere') && ( - - + + {targetOptions.vsphere} (.vmdk) - + - + )} {environments.includes('vsphere-ova') && ( - - + + {targetOptions['vsphere-ova']} (.ova) - + - + )} {environments.includes('guest-image') && ( - - + + {targetOptions['guest-image']} (.qcow2) - + - + )} {environments.includes('image-installer') && ( - - + + {targetOptions['image-installer']} (.iso) - + - + )} {environments.includes('wsl') && ( - - + + WSL - {targetOptions.wsl} (.tar.gz) - + - + )} {isRhel(distribution) && ( diff --git a/src/Components/CreateImageWizard/steps/Review/ReviewStepTables.tsx b/src/Components/CreateImageWizard/steps/Review/ReviewStepTables.tsx index 2cb6bdd7..aa9ba197 100644 --- a/src/Components/CreateImageWizard/steps/Review/ReviewStepTables.tsx +++ b/src/Components/CreateImageWizard/steps/Review/ReviewStepTables.tsx @@ -3,8 +3,6 @@ import React from 'react'; import { Alert, EmptyState, - EmptyStateHeader, - EmptyStateIcon, Panel, PanelMain, Spinner, @@ -114,13 +112,11 @@ const Error = () => { const Loading = () => { return ( - - } - headingLevel="h4" - /> - + ); }; diff --git a/src/Components/CreateImageWizard/steps/Review/ReviewStepTextLists.tsx b/src/Components/CreateImageWizard/steps/Review/ReviewStepTextLists.tsx index 777216f8..1eb6e4c1 100644 --- a/src/Components/CreateImageWizard/steps/Review/ReviewStepTextLists.tsx +++ b/src/Components/CreateImageWizard/steps/Review/ReviewStepTextLists.tsx @@ -4,13 +4,8 @@ import { Alert, Button, Popover, - Text, - TextContent, - TextList, - TextListItem, - TextListVariants, - TextListItemVariants, - TextVariants, + Content, + ContentVariants, FormGroup, CodeBlock, CodeBlockCode, @@ -111,38 +106,33 @@ export const ImageOutputList = () => { ? ON_PREM_RELEASES : RELEASES; return ( - + {distribution === RHEL_8 && ( <> - + {RELEASES.get(distribution)} will be supported through{' '} {toMonthAndYear(RHEL_8_FULL_SUPPORT[1])}, with optional ELS support through {toMonthAndYear(RHEL_8_MAINTENANCE_SUPPORT[1])}. Consider building an image with {RELEASES.get(RHEL_9)} to extend the support period. - +
)} - - + + Release - - + + {releases.get(distribution)} - - - Architecture - - {arch} - -
+ + Architecture + {arch} + + ); }; export const FSCList = () => { @@ -152,15 +142,12 @@ export const FSCList = () => { const partitions = useAppSelector(selectPartitions); return ( - - - + + + Configuration type - - + + {fileSystemConfigurationType === 'manual' ? 'Manual' : 'Automatic'} {fileSystemConfigurationType === 'manual' && ( <> @@ -183,17 +170,17 @@ export const FSCList = () => { )} - + {fileSystemConfigurationType === 'manual' && ( <> - + Image size (minimum) - + )} - - + + ); }; @@ -217,9 +204,7 @@ export const MinSize = ({ partitions }: MinSizeProps) => { } } - return ( - {minSize} - ); + return {minSize} ; }; export const TargetEnvAWSList = () => { @@ -241,40 +226,29 @@ export const TargetEnvAWSList = () => { ); return ( - - {targetOptions.aws} - - + + {targetOptions.aws} + + Image type - - + + Red Hat hosted image
-
- - Shared to account - - - {awsAccountId} - - + + Shared to account + {awsAccountId} + {awsShareMethod === 'sources' ? 'Source' : null} - - + + {isSuccess && awsShareMethod === 'sources' ? source?.name : null} - - - Default region - - - us-east-1 - -
-
+ + Default region + us-east-1 + + ); }; @@ -283,37 +257,30 @@ export const TargetEnvGCPList = () => { const sharedMethod = useAppSelector(selectGcpShareMethod); const email = useAppSelector(selectGcpEmail); return ( - - {targetOptions.gcp} - - + + {targetOptions.gcp} + + Image type - - + + Red Hat hosted image
-
+ <> {sharedMethod === 'withInsights' ? ( <> - - Shared with - - + Shared with + Red Hat Insights only
-
+ ) : ( <> - - Account type - - + Account type + {accountType === 'group' ? 'Google group' : accountType === 'serviceAccount' @@ -321,18 +288,18 @@ export const TargetEnvGCPList = () => { : accountType === 'user' ? 'Google account' : 'Domain'} - - + + {accountType === 'domain' ? 'Domain' : 'Principal'} - - + + {email || accountType} - + )} -
-
+ + ); }; @@ -346,94 +313,71 @@ export const TargetEnvAzureList = () => { const subscriptionId = useAppSelector(selectAzureSubscriptionId); return ( - - {targetOptions.azure} - - + + {targetOptions.azure} + + Image type - - + + Red Hat hosted image
-
+ {shareMethod === 'sources' && isSuccessAzureSources && ( <> - - Azure Source - - + Azure Source + { rawAzureSources?.data?.find( (source) => source.id === azureSource )?.name } - + )} {shareMethod === 'manual' && ( <> - - Azure tenant ID - - - {tenantId} - - - Subscription ID - - - {subscriptionId} - + Azure tenant ID + {tenantId} + Subscription ID + {subscriptionId} )} - - Resource group - - - {azureResourceGroup} - -
-
+ Resource group + {azureResourceGroup} + + ); }; export const TargetEnvOciList = () => { return ( - - {targetOptions.oci} - - + + {targetOptions.oci} + + Object Storage URL - - + + The URL for the built image will be ready to copy - - - + + + ); }; export const TargetEnvOtherList = () => { return ( <> - - + + Image type - - + + Built image will be available for download - - + + ); }; @@ -513,16 +457,16 @@ export const ContentList = () => { return ( <> - - + + <> - Repeatable build - - + + { ) : ( '' )} - + - - Custom repositories - - + Custom repositories + {customRepositories?.length + recommendedRepositories.length > 0 ? ( { ) : ( 0 )} - - + + Additional packages - - + + {packages?.length > 0 || groups?.length > 0 ? ( { ) : ( 0 )} - - - + + + {duplicatePackages.length > 0 && ( { export const RegisterLaterList = () => { return ( - - - + + + Registration type - - + + Register the system later - - - + + + ); }; export const RegisterSatelliteList = () => { return ( - - - + + + Register Satellite - - Enabled - - + + Enabled + + ); }; @@ -678,48 +611,45 @@ export const RegisterNowList = () => { ); return ( <> - - - + + + Registration type - - + - + {registrationType?.startsWith('register-now') && ( - + Register with Red Hat Subscription Manager (RHSM)
-
+
)} {(registrationType === 'register-now-insights' || registrationType === 'register-now-rhc') && ( - + Connect to Red Hat Insights
-
+
)} {registrationType === 'register-now-rhc' && ( - + Use remote host configuration (rhc) utility
-
+ )} -
- - + + + Activation key - - + + - - -
+ + + {isError && ( { const blueprintDescription = useAppSelector(selectBlueprintDescription); return ( - - + + {blueprintName && ( <> - Blueprint name - - - {blueprintName} - + + {blueprintName} )} {blueprintDescription && ( <> - Description - - + + {blueprintDescription} - + )} - - + + ); }; @@ -782,28 +710,22 @@ export const TimezoneList = () => { const ntpServers = useAppSelector(selectNtpServers); return ( - - - + + + Timezone - - + + {timezone ? timezone : 'None'} - - + + NTP servers - - + + {ntpServers && ntpServers.length > 0 ? ntpServers.join(', ') : 'None'} - - - + + + ); }; @@ -811,48 +733,36 @@ export const UsersList = () => { const users = useAppSelector(selectUsers); return ( - + {users.map((user) => ( - - + + Username - - + + {user.name ? user.name : 'None'} - - + + Password - - + + {user.password || user.hasPassword ? '●'.repeat(8) : 'None'} - - + + SSH key - - + + {user.ssh_key ? user.ssh_key : 'None'} - - + + Administrator - - + + {user.isAdministrator ? 'True' : 'False'} - - + + ))} - + ); }; @@ -861,28 +771,22 @@ export const LocaleList = () => { const keyboard = useAppSelector(selectKeyboard); return ( - - - + + + Languages - - + + {languages && languages.length > 0 ? languages.join(', ') : 'None'} - - + + Keyboard - - + + {keyboard ? keyboard : 'None'} - - - + + + ); }; @@ -890,19 +794,16 @@ export const HostnameList = () => { const hostname = useAppSelector(selectHostname); return ( - - - + + + Hostname - - + + {hostname ? hostname : 'None'} - - - + + + ); }; @@ -910,24 +811,18 @@ export const KernelList = () => { const kernel = useAppSelector(selectKernel); return ( - - - + + + Name - - + + {kernel.name ? kernel.name : 'None'} - - + + Append - - + + {kernel.append.length > 0 ? ( {kernel.append.join(' ')} @@ -935,9 +830,9 @@ export const KernelList = () => { ) : ( 'None' )} - - - + + + ); }; @@ -945,15 +840,12 @@ export const FirewallList = () => { const firewall = useAppSelector(selectFirewall); return ( - - - + + + Ports - - + + {firewall.ports.length > 0 ? ( {firewall.ports.join(' ')} @@ -961,14 +853,11 @@ export const FirewallList = () => { ) : ( 'None' )} - - + + Disabled services - - + + {firewall.services.disabled.length > 0 ? ( @@ -978,14 +867,11 @@ export const FirewallList = () => { ) : ( 'None' )} - - + + Enabled services - - + + {firewall.services.enabled.length > 0 ? ( @@ -995,9 +881,9 @@ export const FirewallList = () => { ) : ( 'None' )} - - - + + + ); }; @@ -1005,15 +891,12 @@ export const ServicesList = () => { const services = useAppSelector(selectServices); return ( - - - + + + Disabled - - + + {services.disabled.length > 0 ? ( {services.disabled.join(' ')} @@ -1021,14 +904,11 @@ export const ServicesList = () => { ) : ( 'None' )} - - + + Masked - - + + {services.masked.length > 0 ? ( {services.masked.join(' ')} @@ -1036,14 +916,11 @@ export const ServicesList = () => { ) : ( 'None' )} - - + + Enabled - - + + {services.enabled.length > 0 ? ( {services.enabled.join(' ')} @@ -1051,9 +928,9 @@ export const ServicesList = () => { ) : ( 'None' )} - - - + + + ); }; @@ -1061,18 +938,15 @@ export const FirstBootList = () => { const isFirstbootEnabled = !!useAppSelector(selectFirstBootScript); return ( - - - + + + First boot script - - + + {isFirstbootEnabled ? 'Enabled' : 'Disabled'} - - - + + + ); }; diff --git a/src/Components/CreateImageWizard/steps/Review/index.tsx b/src/Components/CreateImageWizard/steps/Review/index.tsx index c2e248a2..9384ebde 100644 --- a/src/Components/CreateImageWizard/steps/Review/index.tsx +++ b/src/Components/CreateImageWizard/steps/Review/index.tsx @@ -1,6 +1,6 @@ import React from 'react'; -import { Form, Text, Title } from '@patternfly/react-core'; +import { Form, Content, Title } from '@patternfly/react-core'; import Review from './ReviewStep'; @@ -19,7 +19,9 @@ const ReviewStep = () => { Review {blueprintName} blueprint - {blueprintDescription && {blueprintDescription}} + {blueprintDescription && ( + {blueprintDescription} + )} ); diff --git a/src/Components/CreateImageWizard/steps/Services/index.tsx b/src/Components/CreateImageWizard/steps/Services/index.tsx index 04a447da..2bb335ac 100644 --- a/src/Components/CreateImageWizard/steps/Services/index.tsx +++ b/src/Components/CreateImageWizard/steps/Services/index.tsx @@ -1,6 +1,6 @@ import React from 'react'; -import { Text, Form, Title } from '@patternfly/react-core'; +import { Content, Form, Title } from '@patternfly/react-core'; import ServicesInput from './components/ServicesInputs'; @@ -10,7 +10,9 @@ const ServicesStep = () => { Systemd services - Enable, disable and mask systemd services. + + Enable, disable and mask systemd services. + ); diff --git a/src/Components/CreateImageWizard/steps/Snapshot/Snapshot.tsx b/src/Components/CreateImageWizard/steps/Snapshot/Snapshot.tsx index d632dc3a..55681a17 100644 --- a/src/Components/CreateImageWizard/steps/Snapshot/Snapshot.tsx +++ b/src/Components/CreateImageWizard/steps/Snapshot/Snapshot.tsx @@ -7,7 +7,7 @@ import { FormGroup, Grid, Radio, - Text, + Content, Title, } from '@patternfly/react-core'; @@ -99,10 +99,10 @@ export default function Snapshot() { Use latest content - + Image Builder will automatically use the newest state of repositories when building this image. - + ) : selectedOption === 'snapshotDate' ? ( @@ -149,10 +149,10 @@ export default function Snapshot() {
- + Image Builder will reflect the state of repositories based on the selected date when building this image. - + ) : isTemplatesEnabled && selectedOption === 'template' ? ( diff --git a/src/Components/CreateImageWizard/steps/Snapshot/components/TemplatesEmpty.tsx b/src/Components/CreateImageWizard/steps/Snapshot/components/TemplatesEmpty.tsx index d57f3e73..a24e66f1 100644 --- a/src/Components/CreateImageWizard/steps/Snapshot/components/TemplatesEmpty.tsx +++ b/src/Components/CreateImageWizard/steps/Snapshot/components/TemplatesEmpty.tsx @@ -3,7 +3,6 @@ import React from 'react'; import { EmptyState, EmptyStateVariant, - EmptyStateHeader, EmptyStateBody, EmptyStateFooter, Button, @@ -32,8 +31,12 @@ const TemplatesEmpty = ({ refetch }: TemplatesEmptyProps) => { }; return ( - - + {`Content templates can be added in the "Templates" area of the console.`} diff --git a/src/Components/CreateImageWizard/steps/Snapshot/index.tsx b/src/Components/CreateImageWizard/steps/Snapshot/index.tsx index 9b77c756..7b4904f3 100644 --- a/src/Components/CreateImageWizard/steps/Snapshot/index.tsx +++ b/src/Components/CreateImageWizard/steps/Snapshot/index.tsx @@ -1,6 +1,6 @@ import React from 'react'; -import { Button, Form, Grid, Text, Title } from '@patternfly/react-core'; +import { Button, Form, Grid, Content, Title } from '@patternfly/react-core'; import { ExternalLinkAltIcon } from '@patternfly/react-icons'; import Snapshot from './Snapshot'; @@ -14,10 +14,10 @@ export default function SnapshotStep() { Repeatable build - + Control the consistency of the packages in the repository used to build the image. - + + /> )} diff --git a/src/Components/CreateImageWizard/steps/TargetEnvironment/Aws/index.tsx b/src/Components/CreateImageWizard/steps/TargetEnvironment/Aws/index.tsx index 03750afd..5c1caa2b 100644 --- a/src/Components/CreateImageWizard/steps/TargetEnvironment/Aws/index.tsx +++ b/src/Components/CreateImageWizard/steps/TargetEnvironment/Aws/index.tsx @@ -2,7 +2,7 @@ import React from 'react'; import { Radio, - Text, + Content, Form, Title, FormGroup, @@ -58,15 +58,15 @@ const Aws = () => { Target environment - Amazon Web Services - + Your image will be uploaded to AWS and shared with the account you provide below. - - + + The shared image will expire within 14 days. To permanently access the image, copy the image, which will be shared to your account by Red Hat, to your own AWS account. - + { {azureResourceGroup && ( + /> )} diff --git a/src/Components/CreateImageWizard/steps/TargetEnvironment/Azure/AzureSourcesSelect.tsx b/src/Components/CreateImageWizard/steps/TargetEnvironment/Azure/AzureSourcesSelect.tsx index 310c1761..9fb9153a 100644 --- a/src/Components/CreateImageWizard/steps/TargetEnvironment/Azure/AzureSourcesSelect.tsx +++ b/src/Components/CreateImageWizard/steps/TargetEnvironment/Azure/AzureSourcesSelect.tsx @@ -169,12 +169,11 @@ export const AzureSourcesSelect = () => { {selectedSource && ( + /> )} diff --git a/src/Components/CreateImageWizard/steps/TargetEnvironment/Azure/index.tsx b/src/Components/CreateImageWizard/steps/TargetEnvironment/Azure/index.tsx index ce9173aa..57394a47 100644 --- a/src/Components/CreateImageWizard/steps/TargetEnvironment/Azure/index.tsx +++ b/src/Components/CreateImageWizard/steps/TargetEnvironment/Azure/index.tsx @@ -2,7 +2,7 @@ import React from 'react'; import { Radio, - Text, + Content, Form, Title, FormGroup, @@ -68,12 +68,12 @@ const Azure = () => { Target environment - Microsoft Azure - + Upon build, Image Builder sends the image to the selected authorized Azure account. The image will be uploaded to the resource group in the subscription you specify. - - + + To authorize Image Builder to push images to Microsoft Azure, the account owner must configure Image Builder as an authorized application for a specific tenant ID and give it the role of "Contributor" @@ -91,7 +91,7 @@ const Azure = () => { > Learn more about OAuth 2.0 - + { Target environment - Google Cloud Platform - + Select how to share your image. The image you create can be used to launch instances on GCP, regardless of which method you select. - + + Your image will be uploaded to GCP and shared with the account you provide below. The image expires in 14 days. To keep permanent access to your image, copy it to your GCP project. - + } isChecked={shareMethod === 'withGoogle'} onChange={() => { @@ -63,12 +63,12 @@ const Gcp = () => { label="Share image with Red Hat Insights only" name="radio-2" description={ - + Your image will be uploaded to GCP and shared with Red Hat Insights. The image expires in 14 days. You cannot access or recreate this image in your GCP project. - + } isChecked={shareMethod === 'withInsights'} onChange={() => { diff --git a/src/Components/CreateImageWizard/steps/Timezone/components/TimezoneDropDown.tsx b/src/Components/CreateImageWizard/steps/Timezone/components/TimezoneDropDown.tsx index 8c17d8a9..e712cfd3 100644 --- a/src/Components/CreateImageWizard/steps/Timezone/components/TimezoneDropDown.tsx +++ b/src/Components/CreateImageWizard/steps/Timezone/components/TimezoneDropDown.tsx @@ -112,12 +112,11 @@ const TimezoneDropDown = () => { {timezone && ( + /> )} diff --git a/src/Components/CreateImageWizard/steps/Timezone/index.tsx b/src/Components/CreateImageWizard/steps/Timezone/index.tsx index 48bf857f..f06cf77f 100644 --- a/src/Components/CreateImageWizard/steps/Timezone/index.tsx +++ b/src/Components/CreateImageWizard/steps/Timezone/index.tsx @@ -1,6 +1,6 @@ import React from 'react'; -import { Text, Form, Title } from '@patternfly/react-core'; +import { Content, Form, Title } from '@patternfly/react-core'; import NtpServersInput from './components/NtpServersInput'; import TimezoneDropDown from './components/TimezoneDropDown'; @@ -11,7 +11,7 @@ const TimezoneStep = () => { Timezone - Select a timezone for your image. + Select a timezone for your image. diff --git a/src/Components/CreateImageWizard/steps/Users/components/EmptyUserState.tsx b/src/Components/CreateImageWizard/steps/Users/components/EmptyUserState.tsx index a4166286..642dea90 100644 --- a/src/Components/CreateImageWizard/steps/Users/components/EmptyUserState.tsx +++ b/src/Components/CreateImageWizard/steps/Users/components/EmptyUserState.tsx @@ -4,8 +4,6 @@ import { Button, EmptyState, EmptyStateFooter, - EmptyStateHeader, - EmptyStateIcon, EmptyStateVariant, } from '@patternfly/react-core'; import UserIcon from '@patternfly/react-icons/dist/esm/icons/user-icon'; @@ -21,11 +19,11 @@ const EmptyUserState = () => { }; return ( - - } - headingLevel="h4" - /> + - + diff --git a/src/Components/ImagesTable/ImagesTable.tsx b/src/Components/ImagesTable/ImagesTable.tsx index c479cfde..85440b33 100644 --- a/src/Components/ImagesTable/ImagesTable.tsx +++ b/src/Components/ImagesTable/ImagesTable.tsx @@ -282,7 +282,7 @@ const ImagesTable = () => { - + = ({ )} - + {pagination} diff --git a/src/Components/ImagesTable/Instance.tsx b/src/Components/ImagesTable/Instance.tsx index 902e54d7..27ef5cdd 100644 --- a/src/Components/ImagesTable/Instance.tsx +++ b/src/Components/ImagesTable/Instance.tsx @@ -8,12 +8,11 @@ import { ClipboardCopy, List, ListItem, - Modal, - ModalVariant, Popover, PopoverPosition, Skeleton, } from '@patternfly/react-core'; +import { Modal, ModalVariant } from '@patternfly/react-core/deprecated'; import { ListComponent, OrderType, diff --git a/src/Components/ImagesTable/Status.tsx b/src/Components/ImagesTable/Status.tsx index d96fb9e4..586a5a95 100644 --- a/src/Components/ImagesTable/Status.tsx +++ b/src/Components/ImagesTable/Status.tsx @@ -13,7 +13,7 @@ import { Popover, Skeleton, Spinner, - Text, + Content, } from '@patternfly/react-core'; import { CheckCircleIcon, @@ -458,7 +458,9 @@ const ErrorStatus = ({ icon, text, error }: ErrorStatusPropTypes) => { bodyContent={ <> - {reason} + + {reason} + @@ -467,6 +469,7 @@ const ErrorStatus = ({ icon, text, error }: ErrorStatusPropTypes) => { } diff --git a/src/Components/LandingPage/LandingPage.tsx b/src/Components/LandingPage/LandingPage.tsx index 0a42b412..f9b2c5ed 100644 --- a/src/Components/LandingPage/LandingPage.tsx +++ b/src/Components/LandingPage/LandingPage.tsx @@ -6,8 +6,7 @@ import { Tabs, Tab, TabTitleText, - Text, - TextContent, + Content, TabAction, PageSection, Sidebar, @@ -59,7 +58,7 @@ export const LandingPage = () => { const imageList = ( <> - + {showAlert && } { header={'Conventional (RPM-DNF)'} body={
- - + + With RPM-DNF, you can manage the system software by using the DNF package manager and updated RPM packages. This is a simple and adaptive method of managing and modifying the system over its lifecycle. - - + + - - + +
} /> @@ -136,8 +135,8 @@ export const LandingPage = () => { - + + With OSTree, you can manage the system software by referencing a central image repository. OSTree images contain a complete operating system ready to be remotely @@ -145,8 +144,8 @@ export const LandingPage = () => { through commits and enable secure updates that only address changes and keep the operating system unchanged. The updates are quick, and the rollbacks are easy. - - + + - - + + } /> } diff --git a/src/Components/LandingPage/NewAlert.tsx b/src/Components/LandingPage/NewAlert.tsx index 0a1f4ac4..f0f8b61a 100644 --- a/src/Components/LandingPage/NewAlert.tsx +++ b/src/Components/LandingPage/NewAlert.tsx @@ -6,13 +6,9 @@ import { AlertActionLink, Flex, FlexItem, - Text, + Content, } from '@patternfly/react-core'; -import { - TextContent, - TextList, - TextListItem, -} from '@patternfly/react-core/dist/esm'; + // Import for optional quickstarts functionality // import { useChrome } from '@redhat-cloud-services/frontend-components/useChrome'; @@ -76,20 +72,20 @@ export const NewAlert = ({ setShowAlert }: NewAlertPropTypes) => { } > - - + + New options for blueprint customization are now available: - - - Users - Timezone - Locale - Hostname - Kernel - Firewall - Systemd services - - + + + Users + Timezone + Locale + Hostname + Kernel + Firewall + Systemd services + +
); } else { diff --git a/src/Components/ShareImageModal/RegionsSelect.tsx b/src/Components/ShareImageModal/RegionsSelect.tsx index 29776d55..7ee67cc9 100644 --- a/src/Components/ShareImageModal/RegionsSelect.tsx +++ b/src/Components/ShareImageModal/RegionsSelect.tsx @@ -184,6 +184,7 @@ const RegionsSelect = ({ composeId, handleClose }: RegionsSelectPropTypes) => { {selected.length > 0 && ( + /> )} @@ -208,7 +207,7 @@ const RegionsSelect = ({ composeId, handleClose }: RegionsSelectPropTypes) => { Sharing images to other regions} bodyContent={ @@ -221,13 +220,12 @@ const RegionsSelect = ({ composeId, handleClose }: RegionsSelectPropTypes) => { } > + /> } > diff --git a/src/Components/ShareImageModal/ShareImageModal.tsx b/src/Components/ShareImageModal/ShareImageModal.tsx index ca87770f..ae369f5f 100644 --- a/src/Components/ShareImageModal/ShareImageModal.tsx +++ b/src/Components/ShareImageModal/ShareImageModal.tsx @@ -1,6 +1,6 @@ import React, { useMemo } from 'react'; -import { Modal } from '@patternfly/react-core'; +import { Modal } from '@patternfly/react-core/deprecated'; import { useNavigate, useParams } from 'react-router-dom'; import RegionsSelect from './RegionsSelect'; diff --git a/src/Components/sharedComponents/ImageBuilderHeader.tsx b/src/Components/sharedComponents/ImageBuilderHeader.tsx index f13504c2..423b7f5e 100644 --- a/src/Components/sharedComponents/ImageBuilderHeader.tsx +++ b/src/Components/sharedComponents/ImageBuilderHeader.tsx @@ -4,8 +4,7 @@ import { Alert, Button, Popover, - Text, - TextContent, + Content, Flex, FlexItem, } from '@patternfly/react-core'; @@ -43,16 +42,16 @@ const AboutImageBuilderPopover = () => { minWidth="35rem" headerContent={'About image builder'} bodyContent={ - - + + Image builder is a tool for creating deployment-ready customized system images: installation disks, virtual machines, cloud vendor-specific images, and others. By using image builder, you can make these images faster than manual procedures because it eliminates the specific configurations required for each output type. - - + + - - + + - - + + } > + /> ); }; From 4312cca4ddc69c333bc7898f6ba61e242fc8760c Mon Sep 17 00:00:00 2001 From: regexowl Date: Mon, 19 May 2025 13:54:08 +0200 Subject: [PATCH 004/331] src: Run `class-name-updater` This runs `npx @patternfly/class-name-updater src --v6 --fix`. --- .../Blueprints/ImportBlueprintModal.tsx | 2 +- .../CreateImageWizard/CreateImageWizard.scss | 8 +- .../CreateImageWizard/LabelInput.tsx | 6 +- ...ileSystemAutomaticPartitionInformation.tsx | 2 +- .../FileSystem/FileSystemConfiguration.tsx | 4 +- .../steps/FileSystem/FileSystemTable.tsx | 2 +- .../steps/ImageOutput/TargetEnvironment.tsx | 16 ++-- .../Locale/components/LanguagesDropDown.tsx | 2 +- .../components/OscapProfileInformation.tsx | 12 +-- .../steps/Packages/Packages.tsx | 6 +- .../PackageInfoNotAvailablePopover.tsx | 2 +- .../Packages/components/RepoPopovers.tsx | 4 +- .../Registration/ActivationKeyInformation.tsx | 6 +- .../steps/Registration/Registration.tsx | 6 +- .../components/PopoverActivation.tsx | 2 +- .../steps/Repositories/RepositoriesStatus.tsx | 14 ++-- .../steps/Repositories/components/Empty.tsx | 2 +- .../steps/Review/ReviewStep.tsx | 4 +- .../steps/Review/ReviewStepTextLists.tsx | 76 +++++++++---------- .../steps/Users/components/UserInfo.tsx | 8 +- .../utilities/PasswordValidatedInput.tsx | 2 +- src/Components/ImagesTable/EmptyState.tsx | 2 +- src/Components/ImagesTable/ImageDetails.tsx | 42 +++++----- src/Components/ImagesTable/ImagesTable.tsx | 2 +- src/Components/ImagesTable/Instance.tsx | 4 +- src/Components/ImagesTable/Status.tsx | 38 +++++----- src/Components/LandingPage/LandingPage.tsx | 2 +- src/Components/LandingPage/Quickstarts.tsx | 18 ++--- .../ShareImageModal/RegionsSelect.tsx | 2 +- .../sharedComponents/ImageBuilderHeader.tsx | 2 +- 30 files changed, 149 insertions(+), 149 deletions(-) diff --git a/src/Components/Blueprints/ImportBlueprintModal.tsx b/src/Components/Blueprints/ImportBlueprintModal.tsx index 615482d0..61c78081 100644 --- a/src/Components/Blueprints/ImportBlueprintModal.tsx +++ b/src/Components/Blueprints/ImportBlueprintModal.tsx @@ -263,7 +263,7 @@ export const ImportBlueprintModal: React.FunctionComponent< icon={} variant="plain" aria-label="About import" - className="pf-v5-u-pl-sm" + className="pf-v6-u-pl-sm" isInline /> diff --git a/src/Components/CreateImageWizard/CreateImageWizard.scss b/src/Components/CreateImageWizard/CreateImageWizard.scss index 388d8e8e..3a3d203d 100644 --- a/src/Components/CreateImageWizard/CreateImageWizard.scss +++ b/src/Components/CreateImageWizard/CreateImageWizard.scss @@ -1,4 +1,4 @@ -.pf-v5-c-wizard__nav-list { +.pf-v6-c-wizard__nav-list { padding-right: 0px; } @@ -43,11 +43,11 @@ height: 1em; } -.pf-v5-u-min-width { +.pf-v6-u-min-width { --pf-v5-u-min-width--MinWidth: 18ch; } -.pf-v5-u-max-width { +.pf-v6-u-max-width { --pf-v5-u-max-width--MaxWidth: 26rem; } @@ -67,7 +67,7 @@ ul.pf-m-plain { // Targets the alert within the Reviewsteps > content dropdown // Removes excess top margin padding -div.pf-v5-c-alert.pf-m-inline.pf-m-plain.pf-m-warning { +div.pf-v6-c-alert.pf-m-inline.pf-m-plain.pf-m-warning { margin-top: 18px; h4 { diff --git a/src/Components/CreateImageWizard/LabelInput.tsx b/src/Components/CreateImageWizard/LabelInput.tsx index fa566351..ca44b3ba 100644 --- a/src/Components/CreateImageWizard/LabelInput.tsx +++ b/src/Components/CreateImageWizard/LabelInput.tsx @@ -105,7 +105,7 @@ const LabelInput = ({ /> diff --git a/src/Components/CreateImageWizard/steps/FileSystem/FileSystemConfiguration.tsx b/src/Components/CreateImageWizard/steps/FileSystem/FileSystemConfiguration.tsx index cfc8e61a..2f9d72e4 100644 --- a/src/Components/CreateImageWizard/steps/FileSystem/FileSystemConfiguration.tsx +++ b/src/Components/CreateImageWizard/steps/FileSystem/FileSystemConfiguration.tsx @@ -64,7 +64,7 @@ const FileSystemConfiguration = () => { icon={} iconPosition="right" href={FILE_SYSTEM_CUSTOMIZATION_URL} - className="pf-v5-u-pl-0" + className="pf-v6-u-pl-0" > Read more about manual configuration here @@ -80,7 +80,7 @@ const FileSystemConfiguration = () => { diff --git a/src/Components/CreateImageWizard/steps/Review/ReviewStep.tsx b/src/Components/CreateImageWizard/steps/Review/ReviewStep.tsx index ba650dd1..d9efa227 100644 --- a/src/Components/CreateImageWizard/steps/Review/ReviewStep.tsx +++ b/src/Components/CreateImageWizard/steps/Review/ReviewStep.tsx @@ -153,7 +153,7 @@ const Review = () => { data-testid={testId} component="span" onClick={() => revisitStep(stepId)} - className="pf-v5-u-p-0 pf-v5-u-font-weight-bold" + className="pf-v6-u-p-0 pf-v6-u-font-weight-bold" isInline > Revisit step @@ -171,7 +171,7 @@ const Review = () => { @@ -229,7 +229,7 @@ export const TargetEnvAWSList = () => { {targetOptions.aws} - + Image type @@ -260,7 +260,7 @@ export const TargetEnvGCPList = () => { {targetOptions.gcp} - + Image type @@ -316,7 +316,7 @@ export const TargetEnvAzureList = () => { {targetOptions.azure} - + Image type @@ -356,7 +356,7 @@ export const TargetEnvOciList = () => { {targetOptions.oci} - + Object Storage URL @@ -371,7 +371,7 @@ export const TargetEnvOtherList = () => { return ( <> - + Image type @@ -462,7 +462,7 @@ export const ContentList = () => { <> Repeatable build @@ -487,7 +487,7 @@ export const ContentList = () => { @@ -574,7 +574,7 @@ export const RegisterLaterList = () => { return ( - + Registration type @@ -589,7 +589,7 @@ export const RegisterSatelliteList = () => { return ( - + Register Satellite Enabled @@ -613,7 +613,7 @@ export const RegisterNowList = () => { <> - + Registration type { <> Blueprint name @@ -687,7 +687,7 @@ export const DetailsList = () => { <> Description @@ -712,13 +712,13 @@ export const TimezoneList = () => { return ( - + Timezone {timezone ? timezone : 'None'} - + NTP servers @@ -736,25 +736,25 @@ export const UsersList = () => { {users.map((user) => ( - + Username {user.name ? user.name : 'None'} - + Password {user.password || user.hasPassword ? '●'.repeat(8) : 'None'} - + SSH key {user.ssh_key ? user.ssh_key : 'None'} - + Administrator @@ -773,13 +773,13 @@ export const LocaleList = () => { return ( - + Languages {languages && languages.length > 0 ? languages.join(', ') : 'None'} - + Keyboard @@ -796,7 +796,7 @@ export const HostnameList = () => { return ( - + Hostname @@ -813,13 +813,13 @@ export const KernelList = () => { return ( - + Name {kernel.name ? kernel.name : 'None'} - + Append @@ -842,7 +842,7 @@ export const FirewallList = () => { return ( - + Ports @@ -854,7 +854,7 @@ export const FirewallList = () => { 'None' )} - + Disabled services @@ -868,7 +868,7 @@ export const FirewallList = () => { 'None' )} - + Enabled services @@ -893,7 +893,7 @@ export const ServicesList = () => { return ( - + Disabled @@ -905,7 +905,7 @@ export const ServicesList = () => { 'None' )} - + Masked @@ -917,7 +917,7 @@ export const ServicesList = () => { 'None' )} - + Enabled @@ -940,7 +940,7 @@ export const FirstBootList = () => { return ( - + First boot script diff --git a/src/Components/CreateImageWizard/steps/Users/components/UserInfo.tsx b/src/Components/CreateImageWizard/steps/Users/components/UserInfo.tsx index b2edfcca..40bef01c 100644 --- a/src/Components/CreateImageWizard/steps/Users/components/UserInfo.tsx +++ b/src/Components/CreateImageWizard/steps/Users/components/UserInfo.tsx @@ -158,7 +158,7 @@ const UserInfo = () => { eventKey={index} title={{user.name || 'New user'}} > - + { onChange={(_e, value) => handlePasswordChange(_e, value)} hasPassword={user.hasPassword} /> - + { icon={} iconPosition="right" href={GENERATING_SSH_KEY_PAIRS_URL} - className="pf-v5-u-pl-0" + className="pf-v6-u-pl-0" > Learn more about SSH keys - + + <> diff --git a/src/Components/ImagesTable/EmptyState.tsx b/src/Components/ImagesTable/EmptyState.tsx index e82c721b..d4ad6597 100644 --- a/src/Components/ImagesTable/EmptyState.tsx +++ b/src/Components/ImagesTable/EmptyState.tsx @@ -98,7 +98,7 @@ const EmptyImagesTable = () => { iconPosition="right" isInline href={CREATING_IMAGES_WITH_IB_SERVICE_URL} - className="pf-v5-u-pt-md" + className="pf-v6-u-pt-md" > Image builder for RPM-DNF documentation diff --git a/src/Components/ImagesTable/ImageDetails.tsx b/src/Components/ImagesTable/ImageDetails.tsx index 87eb3a6b..2d7cb5ac 100644 --- a/src/Components/ImagesTable/ImageDetails.tsx +++ b/src/Components/ImagesTable/ImageDetails.tsx @@ -43,7 +43,7 @@ const SourceNotFoundPopover = () => { @@ -66,7 +66,7 @@ const SourceNotFoundPopover = () => { } > - @@ -151,10 +151,10 @@ export const AwsDetails = ({ compose }: AwsDetailsPropTypes) => { return ( <> -
+
Build Information
- + UUID @@ -223,7 +223,7 @@ export const AwsDetails = ({ compose }: AwsDetailsPropTypes) => { <>
-
+
Cloud Provider Identifiers
@@ -262,10 +262,10 @@ export const AzureDetails = ({ compose }: AzureDetailsPropTypes) => { return ( <> -
+
Build Information
- + UUID @@ -298,10 +298,10 @@ export const AzureDetails = ({ compose }: AzureDetailsPropTypes) => {
-
+
Cloud Provider Identifiers
- + Image name @@ -348,10 +348,10 @@ export const GcpDetails = ({ compose }: GcpDetailsPropTypes) => { return ( <> -
+
Build Information
- + UUID @@ -386,10 +386,10 @@ export const GcpDetails = ({ compose }: GcpDetailsPropTypes) => { )}
-
+
Cloud Provider Identifiers
- + Image name @@ -428,10 +428,10 @@ export const OciDetails = ({ compose }: OciDetailsPropTypes) => { return ( <> -
+
Build Information
- + UUID @@ -450,10 +450,10 @@ export const OciDetails = ({ compose }: OciDetailsPropTypes) => {
-
+
Cloud Provider Identifiers
- + Object Storage URL @@ -481,10 +481,10 @@ type AwsS3DetailsPropTypes = { export const AwsS3Details = ({ compose }: AwsS3DetailsPropTypes) => { return ( <> -
+
Build Information
- + UUID @@ -513,10 +513,10 @@ type LocalDetailsPropTypes = { export const LocalDetails = ({ compose }: LocalDetailsPropTypes) => { return ( <> -
+
Build Information
- + UUID diff --git a/src/Components/ImagesTable/ImagesTable.tsx b/src/Components/ImagesTable/ImagesTable.tsx index 85440b33..3e2bcf80 100644 --- a/src/Components/ImagesTable/ImagesTable.tsx +++ b/src/Components/ImagesTable/ImagesTable.tsx @@ -280,7 +280,7 @@ const ImagesTable = () => { ); })} - + { iconPosition="right" // TO DO update the link after documentation is up href={FILE_SYSTEM_CUSTOMIZATION_URL} - className="pf-v5-u-pl-0" + className="pf-v6-u-pl-0" > Read more about launching OCI images @@ -347,7 +347,7 @@ export const OciInstance = ({ compose, isExpired }: OciInstancePropTypes) => { > } > - diff --git a/src/Components/LandingPage/LandingPage.tsx b/src/Components/LandingPage/LandingPage.tsx index f9b2c5ed..4b02b688 100644 --- a/src/Components/LandingPage/LandingPage.tsx +++ b/src/Components/LandingPage/LandingPage.tsx @@ -60,7 +60,7 @@ export const LandingPage = () => { <> {showAlert && } - + { return ( setShowHint(val)} isExpanded={showHint} displaySize="lg" > -

+

-

+

-

+

-

+

diff --git a/src/Components/ShareImageModal/RegionsSelect.tsx b/src/Components/ShareImageModal/RegionsSelect.tsx index 7ee67cc9..217c532c 100644 --- a/src/Components/ShareImageModal/RegionsSelect.tsx +++ b/src/Components/ShareImageModal/RegionsSelect.tsx @@ -223,7 +223,7 @@ const RegionsSelect = ({ composeId, handleClose }: RegionsSelectPropTypes) => { icon={} variant="plain" aria-label="About regions" - className="pf-v5-u-pl-sm header-button" + className="pf-v6-u-pl-sm header-button" isInline /> diff --git a/src/Components/sharedComponents/ImageBuilderHeader.tsx b/src/Components/sharedComponents/ImageBuilderHeader.tsx index 423b7f5e..a5b8038e 100644 --- a/src/Components/sharedComponents/ImageBuilderHeader.tsx +++ b/src/Components/sharedComponents/ImageBuilderHeader.tsx @@ -84,7 +84,7 @@ const AboutImageBuilderPopover = () => { icon={} variant="plain" aria-label="About image builder" - className="pf-v5-u-pl-sm header-button" + className="pf-v6-u-pl-sm header-button" /> ); From 2080425753f961e4fb2129482bc1b42a891ebde4 Mon Sep 17 00:00:00 2001 From: regexowl Date: Mon, 19 May 2025 13:56:53 +0200 Subject: [PATCH 005/331] src: Update remaining `v5` version slugs --- playwright/helpers/helpers.ts | 2 +- playwright/test.spec.ts | 2 +- src/Components/Blueprints/BuildImagesButton.tsx | 2 +- .../CreateImageWizard/CreateImageWizard.scss | 16 ++++++++-------- .../steps/Oscap/components/OnPremWarning.tsx | 2 +- .../steps/Review/Footer/CreateDropdown.tsx | 2 +- .../steps/Review/Footer/EditDropdown.tsx | 2 +- .../ImagesTable/ImagesTableToolbar.tsx | 6 +++--- src/Components/LandingPage/LandingPage.scss | 7 +++---- 9 files changed, 20 insertions(+), 21 deletions(-) diff --git a/playwright/helpers/helpers.ts b/playwright/helpers/helpers.ts index ce5cf047..2e966b2b 100644 --- a/playwright/helpers/helpers.ts +++ b/playwright/helpers/helpers.ts @@ -21,7 +21,7 @@ export const isHosted = (): boolean => { export const closePopupsIfExist = async (page: Page) => { const locatorsToCheck = [ - page.locator('.pf-v5-c-alert.notification-item button'), // This closes all toast pop-ups + page.locator('.pf-v6-c-alert.notification-item button'), // This closes all toast pop-ups page.locator(`button[id^="pendo-close-guide-"]`), // This closes the pendo guide pop-up page.locator(`button[id="truste-consent-button"]`), // This closes the trusted consent pop-up page.getByLabel('close-notification'), // This closes a one off info notification (May be covered by the toast above, needs recheck.) diff --git a/playwright/test.spec.ts b/playwright/test.spec.ts index 93510933..a49d09aa 100644 --- a/playwright/test.spec.ts +++ b/playwright/test.spec.ts @@ -79,7 +79,7 @@ test.describe.serial('test', () => { await frame.getByRole('button', { name: 'Create blueprint' }).click(); await expect( - frame.locator('.pf-v5-c-card__title-text').getByText(blueprintName) + frame.locator('.pf-v6-c-card__title-text').getByText(blueprintName) ).toBeVisible(); }); diff --git a/src/Components/Blueprints/BuildImagesButton.tsx b/src/Components/Blueprints/BuildImagesButton.tsx index c4c2fd22..fee7a64a 100644 --- a/src/Components/Blueprints/BuildImagesButton.tsx +++ b/src/Components/Blueprints/BuildImagesButton.tsx @@ -132,7 +132,7 @@ export const BuildImagesButton = ({ children }: BuildImagesButtonPropTypes) => { content dropdown diff --git a/src/Components/CreateImageWizard/steps/Oscap/components/OnPremWarning.tsx b/src/Components/CreateImageWizard/steps/Oscap/components/OnPremWarning.tsx index bbcdd8c3..d942a268 100644 --- a/src/Components/CreateImageWizard/steps/Oscap/components/OnPremWarning.tsx +++ b/src/Components/CreateImageWizard/steps/Oscap/components/OnPremWarning.tsx @@ -20,7 +20,7 @@ const OscapOnPremWarning = () => { = ({ variant="warning" style={{ margin: - '0 var(--pf-v5-c-toolbar__content--PaddingRight) 0 var(--pf-v5-c-toolbar__content--PaddingLeft)', + '0 var(--pf6-c-toolbar__content--PaddingRight) 0 var(--pf-v6-c-toolbar__content--PaddingLeft)', }} isInline title={`The selected blueprint has errors.`} @@ -197,7 +197,7 @@ const ImagesTableToolbar: React.FC = ({ = ({ Date: Mon, 19 May 2025 14:01:20 +0200 Subject: [PATCH 006/331] test: Update tests --- .../Blueprints/ImportBlueprintModal.test.tsx | 14 +++++++------- .../steps/Details/Details.test.tsx | 4 ---- .../steps/Snapshot/Snapshot.test.tsx | 2 +- .../steps/TargetEnvironment/AwsTarget.test.tsx | 10 +++++----- .../steps/TargetEnvironment/GCPTarget.test.tsx | 2 -- .../ShareImageModal/ShareImageModal.test.tsx | 2 +- 6 files changed, 14 insertions(+), 20 deletions(-) diff --git a/src/test/Components/Blueprints/ImportBlueprintModal.test.tsx b/src/test/Components/Blueprints/ImportBlueprintModal.test.tsx index b032fb71..cb8a035d 100644 --- a/src/test/Components/Blueprints/ImportBlueprintModal.test.tsx +++ b/src/test/Components/Blueprints/ImportBlueprintModal.test.tsx @@ -305,14 +305,14 @@ describe('Import modal', () => { const reviewButton = await screen.findByRole('button', { name: /review and finish/i, }); - await waitFor(() => expect(reviewButton).toHaveClass('pf-m-disabled')); + await waitFor(() => expect(reviewButton).toBeDisabled()); }; test('should show alert on invalid blueprint', async () => { await setUp(); await uploadFile(`blueprints.json`, INVALID_JSON); const reviewButton = screen.getByTestId('import-blueprint-finish'); - expect(reviewButton).toHaveClass('pf-m-disabled'); + expect(reviewButton).toBeDisabled(); const helperText = await screen.findByText( /not compatible with the blueprints format\./i ); @@ -323,7 +323,7 @@ describe('Import modal', () => { await setUp(); await uploadFile(`blueprints.json`, INVALID_ARCHITECTURE_JSON); const reviewButton = screen.getByTestId('import-blueprint-finish'); - expect(reviewButton).toHaveClass('pf-m-disabled'); + expect(reviewButton).toBeDisabled(); const helperText = await screen.findByText( /not compatible with the blueprints format\./i ); @@ -334,7 +334,7 @@ describe('Import modal', () => { await setUp(); await uploadFile(`blueprints.json`, IGNORE_SUBSCRIPTION_BLUEPRINT); const reviewButton = screen.getByTestId('import-blueprint-finish'); - await waitFor(() => expect(reviewButton).not.toHaveClass('pf-m-disabled')); + await waitFor(() => expect(reviewButton).toBeEnabled()); user.click(reviewButton); await waitFor(async () => @@ -348,7 +348,7 @@ describe('Import modal', () => { await setUp(); await uploadFile(`blueprints.json`, BLUEPRINT_JSON); const reviewButton = screen.getByTestId('import-blueprint-finish'); - await waitFor(() => expect(reviewButton).not.toHaveClass('pf-m-disabled')); + await waitFor(() => expect(reviewButton).toBeEnabled()); user.click(reviewButton); await waitFor(async () => @@ -369,7 +369,7 @@ describe('Import modal', () => { await setUp(); await uploadFile(`blueprints.toml`, ONPREM_BLUEPRINT_TOML); const reviewButton = screen.getByTestId('import-blueprint-finish'); - await waitFor(() => expect(reviewButton).not.toHaveClass('pf-m-disabled')); + await waitFor(() => expect(reviewButton).toBeEnabled()); user.click(reviewButton); await waitFor(async () => @@ -514,7 +514,7 @@ describe('Import modal', () => { ONPREM_BLUEPRINT_TOML_WITH_INVALID_VALUES ); const reviewButton = screen.getByTestId('import-blueprint-finish'); - await waitFor(() => expect(reviewButton).not.toHaveClass('pf-m-disabled')); + await waitFor(() => expect(reviewButton).toBeEnabled()); user.click(reviewButton); // Image output diff --git a/src/test/Components/CreateImageWizard/steps/Details/Details.test.tsx b/src/test/Components/CreateImageWizard/steps/Details/Details.test.tsx index 688284c5..94179205 100644 --- a/src/test/Components/CreateImageWizard/steps/Details/Details.test.tsx +++ b/src/test/Components/CreateImageWizard/steps/Details/Details.test.tsx @@ -105,12 +105,10 @@ describe('Step Details', () => { // enter invalid image name const invalidName = 'a'.repeat(101); await enterBlueprintName(invalidName); - expect(await getNextButton()).toHaveClass('pf-m-disabled'); expect(await getNextButton()).toBeDisabled(); // enter valid image name await enterBlueprintName(); - expect(await getNextButton()).not.toHaveClass('pf-m-disabled'); expect(await getNextButton()).toBeEnabled(); }); @@ -123,12 +121,10 @@ describe('Step Details', () => { // enter invalid image description const invalidDescription = 'a'.repeat(251); await enterBlueprintDescription(invalidDescription); - expect(await getNextButton()).toHaveClass('pf-m-disabled'); expect(await getNextButton()).toBeDisabled(); // enter valid image description await enterBlueprintDescription(); - expect(await getNextButton()).not.toHaveClass('pf-m-disabled'); expect(await getNextButton()).toBeEnabled(); }); diff --git a/src/test/Components/CreateImageWizard/steps/Snapshot/Snapshot.test.tsx b/src/test/Components/CreateImageWizard/steps/Snapshot/Snapshot.test.tsx index f87b8f79..ef5cb0f3 100644 --- a/src/test/Components/CreateImageWizard/steps/Snapshot/Snapshot.test.tsx +++ b/src/test/Components/CreateImageWizard/steps/Snapshot/Snapshot.test.tsx @@ -239,7 +239,7 @@ describe('repository snapshot tab - ', () => { name: /select all/i, }); // eslint-disable-next-line testing-library/no-node-access - expect(bulkSelectCheckbox.closest('div')).toHaveClass('pf-m-disabled'); + expect(bulkSelectCheckbox.closest('div')).toBeDisabled(); }); test('button Reset works to empty the snapshot date', async () => { diff --git a/src/test/Components/CreateImageWizard/steps/TargetEnvironment/AwsTarget.test.tsx b/src/test/Components/CreateImageWizard/steps/TargetEnvironment/AwsTarget.test.tsx index d9d0fc8d..a6f1f439 100644 --- a/src/test/Components/CreateImageWizard/steps/TargetEnvironment/AwsTarget.test.tsx +++ b/src/test/Components/CreateImageWizard/steps/TargetEnvironment/AwsTarget.test.tsx @@ -184,20 +184,20 @@ describe('Step Upload to AWS', () => { await goToAwsStep(); const nextButton = await getNextButton(); - expect(nextButton).toHaveClass('pf-m-disabled'); + expect(nextButton).toBeDisabled(); await chooseManualOption(); - expect(nextButton).toHaveClass('pf-m-disabled'); + expect(nextButton).toBeDisabled(); await enterAccountId(); - expect(nextButton).not.toHaveClass('pf-m-disabled'); + expect(nextButton).toBeEnabled(); await chooseSourcesOption(); - await waitFor(() => expect(nextButton).toHaveClass('pf-m-disabled')); + await waitFor(() => expect(nextButton).toBeDisabled()); await getSourceDropdown(); await selectSource(); - await waitFor(() => expect(nextButton).not.toHaveClass('pf-m-disabled')); + await waitFor(() => expect(nextButton).toBeEnabled()); }); test('compose request share_with_sources field is correct', async () => { diff --git a/src/test/Components/CreateImageWizard/steps/TargetEnvironment/GCPTarget.test.tsx b/src/test/Components/CreateImageWizard/steps/TargetEnvironment/GCPTarget.test.tsx index ceed257b..923a6d77 100644 --- a/src/test/Components/CreateImageWizard/steps/TargetEnvironment/GCPTarget.test.tsx +++ b/src/test/Components/CreateImageWizard/steps/TargetEnvironment/GCPTarget.test.tsx @@ -150,13 +150,11 @@ describe('Step Upload to Google', () => { await waitFor(async () => user.type(await screen.findByTestId('principal'), 'a') ); - expect(await getNextButton()).toHaveClass('pf-m-disabled'); expect(await getNextButton()).toBeDisabled(); await waitFor(async () => user.type(await screen.findByTestId('principal'), 'test@test.com') ); - expect(await getNextButton()).not.toHaveClass('pf-m-disabled'); expect(await getNextButton()).toBeEnabled(); }); diff --git a/src/test/Components/ShareImageModal/ShareImageModal.test.tsx b/src/test/Components/ShareImageModal/ShareImageModal.test.tsx index 738991fa..7b95b5d9 100644 --- a/src/test/Components/ShareImageModal/ShareImageModal.test.tsx +++ b/src/test/Components/ShareImageModal/ShareImageModal.test.tsx @@ -43,7 +43,7 @@ describe('Create Share To Regions Modal', () => { const usEast2 = await screen.findByRole('option', { name: /us east \(ohio\) us-east-2/i, }); - expect(usEast2).not.toHaveClass('pf-m-disabled'); + expect(usEast2).toBeEnabled(); user.click(usEast2); await waitFor(() => expect(shareButton).toBeEnabled()); From 91577343dfb7d3545c941f3b55ae700a4f65a964 Mon Sep 17 00:00:00 2001 From: regexowl Date: Mon, 19 May 2025 14:05:42 +0200 Subject: [PATCH 007/331] src: Update `` tag components --- .../CreateImageWizard/steps/Details/index.tsx | 2 +- .../FileSystemAutomaticPartitionInformation.tsx | 2 +- .../steps/FileSystem/FileSystemConfiguration.tsx | 4 ++-- .../steps/FileSystem/FileSystemTable.tsx | 2 +- .../CreateImageWizard/steps/FileSystem/index.tsx | 2 +- .../CreateImageWizard/steps/Firewall/index.tsx | 4 +--- .../CreateImageWizard/steps/FirstBoot/index.tsx | 4 ++-- .../CreateImageWizard/steps/Hostname/index.tsx | 2 +- .../steps/ImageOutput/TargetEnvironment.tsx | 8 ++++---- .../CreateImageWizard/steps/ImageOutput/index.tsx | 2 +- .../CreateImageWizard/steps/Kernel/index.tsx | 4 +--- .../CreateImageWizard/steps/Locale/index.tsx | 2 +- .../CreateImageWizard/steps/Oscap/index.tsx | 2 +- .../steps/Packages/PackageRecommendations.tsx | 4 ++-- .../CreateImageWizard/steps/Packages/Packages.tsx | 4 +--- .../components/PackageInfoNotAvailablePopover.tsx | 4 ++-- .../steps/Packages/components/RepoPopovers.tsx | 4 ++-- .../CreateImageWizard/steps/Packages/index.tsx | 2 +- .../Registration/ActivationKeyInformation.tsx | 2 +- .../steps/Registration/ActivationKeysList.tsx | 2 +- .../steps/Registration/Registration.tsx | 4 ++-- .../Registration/components/PopoverActivation.tsx | 8 +++----- .../steps/Registration/index.tsx | 2 +- .../components/UploadRepositoryLabel.tsx | 2 +- .../steps/Repositories/index.tsx | 2 +- .../CreateImageWizard/steps/Review/index.tsx | 4 +--- .../CreateImageWizard/steps/Services/index.tsx | 4 +--- .../CreateImageWizard/steps/Snapshot/Snapshot.tsx | 4 ++-- .../CreateImageWizard/steps/Snapshot/index.tsx | 2 +- .../steps/TargetEnvironment/Aws/index.tsx | 4 ++-- .../steps/TargetEnvironment/Azure/index.tsx | 4 ++-- .../steps/TargetEnvironment/Gcp/index.tsx | 15 +++++++++++---- .../CreateImageWizard/steps/Timezone/index.tsx | 2 +- .../CreateImageWizard/steps/Users/index.tsx | 2 +- src/Components/ImagesTable/EmptyState.tsx | 8 ++++---- src/Components/LandingPage/LandingPage.tsx | 8 ++++---- src/Components/LandingPage/NewAlert.tsx | 2 +- .../sharedComponents/ImageBuilderHeader.tsx | 6 +++--- 38 files changed, 70 insertions(+), 75 deletions(-) diff --git a/src/Components/CreateImageWizard/steps/Details/index.tsx b/src/Components/CreateImageWizard/steps/Details/index.tsx index 76f5c347..eaaeba42 100644 --- a/src/Components/CreateImageWizard/steps/Details/index.tsx +++ b/src/Components/CreateImageWizard/steps/Details/index.tsx @@ -48,7 +48,7 @@ const DetailsStep = () => { Details - + Enter a name to identify your blueprint. If no name is entered, the images created from this blueprint will use the name of the parent blueprint. diff --git a/src/Components/CreateImageWizard/steps/FileSystem/FileSystemAutomaticPartitionInformation.tsx b/src/Components/CreateImageWizard/steps/FileSystem/FileSystemAutomaticPartitionInformation.tsx index 0cc160f2..fcdd8213 100644 --- a/src/Components/CreateImageWizard/steps/FileSystem/FileSystemAutomaticPartitionInformation.tsx +++ b/src/Components/CreateImageWizard/steps/FileSystem/FileSystemAutomaticPartitionInformation.tsx @@ -9,7 +9,7 @@ const FileSystemAutomaticPartition = () => { return ( Automatic partitioning - + The system automatically partitions your image storage depending on the target environment(s). The target environment sometimes dictates all or part of the partitioning scheme. Automatic partitioning applies the most diff --git a/src/Components/CreateImageWizard/steps/FileSystem/FileSystemConfiguration.tsx b/src/Components/CreateImageWizard/steps/FileSystem/FileSystemConfiguration.tsx index 2f9d72e4..12036d17 100644 --- a/src/Components/CreateImageWizard/steps/FileSystem/FileSystemConfiguration.tsx +++ b/src/Components/CreateImageWizard/steps/FileSystem/FileSystemConfiguration.tsx @@ -48,12 +48,12 @@ const FileSystemConfiguration = () => { partition?.mountpoint?.includes('/usr') ) && } - + Create partitions for your image by defining mount points and minimum sizes. Image builder creates partitions with a logical volume (LVM) device type. - + The order of partitions may change when the image is installed in order to conform to best practices and ensure functionality.

diff --git a/src/Components/CreateImageWizard/steps/FileSystem/FileSystemTable.tsx b/src/Components/CreateImageWizard/steps/FileSystem/FileSystemTable.tsx index 4db1f936..abd6dfeb 100644 --- a/src/Components/CreateImageWizard/steps/FileSystem/FileSystemTable.tsx +++ b/src/Components/CreateImageWizard/steps/FileSystem/FileSystemTable.tsx @@ -46,7 +46,7 @@ export const MinimumSizePopover = () => { maxWidth="30rem" bodyContent={ - + Image Builder may extend this size based on requirements, selected packages, and configurations. diff --git a/src/Components/CreateImageWizard/steps/FileSystem/index.tsx b/src/Components/CreateImageWizard/steps/FileSystem/index.tsx index 555fd8ae..8de14e58 100644 --- a/src/Components/CreateImageWizard/steps/FileSystem/index.tsx +++ b/src/Components/CreateImageWizard/steps/FileSystem/index.tsx @@ -22,7 +22,7 @@ const FileSystemStep = () => { File system configuration - Define the partitioning of the image. + Define the partitioning of the image. {hasIsoTargetOnly ? ( ) : fileSystemConfigurationType === 'automatic' ? ( diff --git a/src/Components/CreateImageWizard/steps/Firewall/index.tsx b/src/Components/CreateImageWizard/steps/Firewall/index.tsx index a9cee7a9..2211371d 100644 --- a/src/Components/CreateImageWizard/steps/Firewall/index.tsx +++ b/src/Components/CreateImageWizard/steps/Firewall/index.tsx @@ -11,9 +11,7 @@ const FirewallStep = () => { Firewall - - Customize firewall settings for your image. - + Customize firewall settings for your image. diff --git a/src/Components/CreateImageWizard/steps/FirstBoot/index.tsx b/src/Components/CreateImageWizard/steps/FirstBoot/index.tsx index b558ec8d..3cd93eae 100644 --- a/src/Components/CreateImageWizard/steps/FirstBoot/index.tsx +++ b/src/Components/CreateImageWizard/steps/FirstBoot/index.tsx @@ -52,7 +52,7 @@ const FirstBootStep = () => { First boot configuration - + Configure the image with a custom script that will execute on its first boot. @@ -62,7 +62,7 @@ const FirstBootStep = () => { isInline title="Important: please do not include sensitive information" > - + Please ensure that your script does not contain any secrets, passwords, or other sensitive data. All scripts should be crafted without including confidential information to maintain security and diff --git a/src/Components/CreateImageWizard/steps/Hostname/index.tsx b/src/Components/CreateImageWizard/steps/Hostname/index.tsx index f0fecb3d..49c91048 100644 --- a/src/Components/CreateImageWizard/steps/Hostname/index.tsx +++ b/src/Components/CreateImageWizard/steps/Hostname/index.tsx @@ -10,7 +10,7 @@ const HostnameStep = () => { Hostname - Select a hostname for your image. + Select a hostname for your image. ); diff --git a/src/Components/CreateImageWizard/steps/ImageOutput/TargetEnvironment.tsx b/src/Components/CreateImageWizard/steps/ImageOutput/TargetEnvironment.tsx index c0db28cc..7de6dbed 100644 --- a/src/Components/CreateImageWizard/steps/ImageOutput/TargetEnvironment.tsx +++ b/src/Components/CreateImageWizard/steps/ImageOutput/TargetEnvironment.tsx @@ -255,7 +255,7 @@ const TargetEnvironment = () => { position="right" bodyContent={ - + An OVA file is a virtual appliance used by virtualization platforms such as VMware vSphere. It is a package that contains files @@ -303,7 +303,7 @@ const TargetEnvironment = () => { position="right" bodyContent={ - + A VMDK file is a virtual disk that stores the contents of a virtual machine. This disk has to be imported into vSphere using govc import.vmdk, @@ -379,14 +379,14 @@ const TargetEnvironment = () => { position="right" headerContent={ - + WSL is not officially supported by Red Hat } bodyContent={ - + You can use RHEL on Microsoft's Windows Subsystem for Linux (WSL) for development and learning use cases. Red Hat supports WSL under the Validated Software diff --git a/src/Components/CreateImageWizard/steps/ImageOutput/index.tsx b/src/Components/CreateImageWizard/steps/ImageOutput/index.tsx index ab28206d..02c9315e 100644 --- a/src/Components/CreateImageWizard/steps/ImageOutput/index.tsx +++ b/src/Components/CreateImageWizard/steps/ImageOutput/index.tsx @@ -38,7 +38,7 @@ const ImageOutputStep = () => { Image output - + Images enables you to create customized blueprints, create custom images from the blueprints, and push them to target environments.
diff --git a/src/Components/CreateImageWizard/steps/Kernel/index.tsx b/src/Components/CreateImageWizard/steps/Kernel/index.tsx index bb864f44..a857b36a 100644 --- a/src/Components/CreateImageWizard/steps/Kernel/index.tsx +++ b/src/Components/CreateImageWizard/steps/Kernel/index.tsx @@ -11,9 +11,7 @@ const KernelStep = () => { Kernel - - Customize kernel name and kernel arguments. - + Customize kernel name and kernel arguments. diff --git a/src/Components/CreateImageWizard/steps/Locale/index.tsx b/src/Components/CreateImageWizard/steps/Locale/index.tsx index 9a618425..45dd26d2 100644 --- a/src/Components/CreateImageWizard/steps/Locale/index.tsx +++ b/src/Components/CreateImageWizard/steps/Locale/index.tsx @@ -11,7 +11,7 @@ const LocaleStep = () => { Locale - Select the locale for your image. + Select the locale for your image. diff --git a/src/Components/CreateImageWizard/steps/Oscap/index.tsx b/src/Components/CreateImageWizard/steps/Oscap/index.tsx index 99f1404c..1c096cfe 100644 --- a/src/Components/CreateImageWizard/steps/Oscap/index.tsx +++ b/src/Components/CreateImageWizard/steps/Oscap/index.tsx @@ -114,7 +114,7 @@ const OscapContent = () => { {complianceEnabled ? 'Compliance' : 'OpenSCAP profile'} - + Below you can select which Insights compliance policy or OpenSCAP profile your image will be compliant to. Insights compliance allows the use of tailored policies, whereas OpenSCAP gives you the default diff --git a/src/Components/CreateImageWizard/steps/Packages/PackageRecommendations.tsx b/src/Components/CreateImageWizard/steps/Packages/PackageRecommendations.tsx index 5d82df3e..9a8eb047 100644 --- a/src/Components/CreateImageWizard/steps/Packages/PackageRecommendations.tsx +++ b/src/Components/CreateImageWizard/steps/Packages/PackageRecommendations.tsx @@ -170,7 +170,7 @@ const PackageRecommendations = () => { onHide={() => setIsExpanded(false)} bodyContent={ - + RHEL Lightspeed provides intelligent tools to improve the productivity and efficiency of teams using RHEL. @@ -209,7 +209,7 @@ const PackageRecommendations = () => { {isSuccess && data && data?.packages && ( <> - + Other users commonly add these packages with the ones you selected. diff --git a/src/Components/CreateImageWizard/steps/Packages/Packages.tsx b/src/Components/CreateImageWizard/steps/Packages/Packages.tsx index 1459a4f5..35fbf67c 100644 --- a/src/Components/CreateImageWizard/steps/Packages/Packages.tsx +++ b/src/Components/CreateImageWizard/steps/Packages/Packages.tsx @@ -1189,9 +1189,7 @@ const Packages = () => { ) : ( - - This group has no packages - + This group has no packages )}

} diff --git a/src/Components/CreateImageWizard/steps/Packages/components/PackageInfoNotAvailablePopover.tsx b/src/Components/CreateImageWizard/steps/Packages/components/PackageInfoNotAvailablePopover.tsx index 7e748080..62e77a96 100644 --- a/src/Components/CreateImageWizard/steps/Packages/components/PackageInfoNotAvailablePopover.tsx +++ b/src/Components/CreateImageWizard/steps/Packages/components/PackageInfoNotAvailablePopover.tsx @@ -9,10 +9,10 @@ const PackageInfoNotAvailablePopover = () => { headerContent="Package description" bodyContent={ - + The package description provides more information about the package. - + When editing an existing blueprint, you may see a "Not available" value in the field because information about previously added packages can not be fetched. diff --git a/src/Components/CreateImageWizard/steps/Packages/components/RepoPopovers.tsx b/src/Components/CreateImageWizard/steps/Packages/components/RepoPopovers.tsx index ef5aa18e..6a099b14 100644 --- a/src/Components/CreateImageWizard/steps/Packages/components/RepoPopovers.tsx +++ b/src/Components/CreateImageWizard/steps/Packages/components/RepoPopovers.tsx @@ -8,7 +8,7 @@ export const IncludedReposPopover = () => { - + View packages from the Red Hat repository and repositories you've selected. @@ -33,7 +33,7 @@ export const OtherReposPopover = () => { - + View packages from popular repositories and your other repositories not included in the image. diff --git a/src/Components/CreateImageWizard/steps/Packages/index.tsx b/src/Components/CreateImageWizard/steps/Packages/index.tsx index c280051d..f522b967 100644 --- a/src/Components/CreateImageWizard/steps/Packages/index.tsx +++ b/src/Components/CreateImageWizard/steps/Packages/index.tsx @@ -16,7 +16,7 @@ const PackagesStep = () => { Additional packages - + Blueprints created with Images include all required packages. {!process.env.IS_ON_PREMISE && ( diff --git a/src/Components/CreateImageWizard/steps/Registration/ActivationKeyInformation.tsx b/src/Components/CreateImageWizard/steps/Registration/ActivationKeyInformation.tsx index 4a7a6369..bd4f7b03 100644 --- a/src/Components/CreateImageWizard/steps/Registration/ActivationKeyInformation.tsx +++ b/src/Components/CreateImageWizard/steps/Registration/ActivationKeyInformation.tsx @@ -54,7 +54,7 @@ const ActivationKeyInformation = (): JSX.Element => { - + The core repositories for your operating system version are always enabled and do not need to be explicitly added to the activation key. diff --git a/src/Components/CreateImageWizard/steps/Registration/ActivationKeysList.tsx b/src/Components/CreateImageWizard/steps/Registration/ActivationKeysList.tsx index bdf1b3b8..cb308c86 100644 --- a/src/Components/CreateImageWizard/steps/Registration/ActivationKeysList.tsx +++ b/src/Components/CreateImageWizard/steps/Registration/ActivationKeysList.tsx @@ -262,7 +262,7 @@ const ActivationKeysList = () => { {prepareSelectOptions()} - + Create and manage activation keys on the diff --git a/src/Components/CreateImageWizard/steps/Registration/Registration.tsx b/src/Components/CreateImageWizard/steps/Registration/Registration.tsx index 896236ed..66799279 100644 --- a/src/Components/CreateImageWizard/steps/Registration/Registration.tsx +++ b/src/Components/CreateImageWizard/steps/Registration/Registration.tsx @@ -27,7 +27,7 @@ const InsightsPopover = () => { minWidth="30rem" bodyContent={ - + Red Hat Insights client provides actionable intelligence about your Red Hat Enterprise Linux environments, helping to identify and address operational and vulnerability risks before an issue results @@ -66,7 +66,7 @@ const RhcPopover = () => { minWidth="30rem" bodyContent={ - + Remote host configuration allows Red Hat Enterprise Linux hosts to connect to Red Hat Insights. Remote host configuration is required to use the Red Hat Insights Remediations service. diff --git a/src/Components/CreateImageWizard/steps/Registration/components/PopoverActivation.tsx b/src/Components/CreateImageWizard/steps/Registration/components/PopoverActivation.tsx index 612bd113..cf25e94c 100644 --- a/src/Components/CreateImageWizard/steps/Registration/components/PopoverActivation.tsx +++ b/src/Components/CreateImageWizard/steps/Registration/components/PopoverActivation.tsx @@ -22,18 +22,16 @@ const PopoverActivation = () => { maxWidth="35rem" bodyContent={ - + Activation keys enable you to register a system with appropriate subscriptions, system purpose, and repositories attached. - + If using an activation key with command line registration, you must provide your organization's ID. {orgId ? ( - - Your organization's ID is {orgId} - + Your organization's ID is {orgId} ) : ( )} diff --git a/src/Components/CreateImageWizard/steps/Registration/index.tsx b/src/Components/CreateImageWizard/steps/Registration/index.tsx index 7e499910..8176b8ba 100644 --- a/src/Components/CreateImageWizard/steps/Registration/index.tsx +++ b/src/Components/CreateImageWizard/steps/Registration/index.tsx @@ -21,7 +21,7 @@ const RegistrationStep = () => { Register systems using this image - + You can either automatically register your systems with Red Hat to enhance security and track your spending or choose to register your system during initial boot. diff --git a/src/Components/CreateImageWizard/steps/Repositories/components/UploadRepositoryLabel.tsx b/src/Components/CreateImageWizard/steps/Repositories/components/UploadRepositoryLabel.tsx index 668b4fd2..047bacfc 100644 --- a/src/Components/CreateImageWizard/steps/Repositories/components/UploadRepositoryLabel.tsx +++ b/src/Components/CreateImageWizard/steps/Repositories/components/UploadRepositoryLabel.tsx @@ -9,7 +9,7 @@ const UploadRepositoryLabel = () => { return ( + Upload repository: Snapshots will only be taken when new content is uploaded.  - + - - {optional && ( + - )} - + + {optional && ( + + )} + + ); }; From 4bb826ee0691391c8be4354b6e35e7e8a893129b Mon Sep 17 00:00:00 2001 From: regexowl Date: Tue, 20 May 2025 09:41:45 +0200 Subject: [PATCH 009/331] Wizard: Set helper text variant --- .../steps/TargetEnvironment/Aws/AwsAccountId.tsx | 2 +- .../CreateImageWizard/steps/TargetEnvironment/Aws/index.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Components/CreateImageWizard/steps/TargetEnvironment/Aws/AwsAccountId.tsx b/src/Components/CreateImageWizard/steps/TargetEnvironment/Aws/AwsAccountId.tsx index 0f218208..1b9f0b51 100644 --- a/src/Components/CreateImageWizard/steps/TargetEnvironment/Aws/AwsAccountId.tsx +++ b/src/Components/CreateImageWizard/steps/TargetEnvironment/Aws/AwsAccountId.tsx @@ -42,7 +42,7 @@ export const AwsAccountId = () => { /> - + This is the account associated with the source. diff --git a/src/Components/CreateImageWizard/steps/TargetEnvironment/Aws/index.tsx b/src/Components/CreateImageWizard/steps/TargetEnvironment/Aws/index.tsx index 2ac256c7..58276242 100644 --- a/src/Components/CreateImageWizard/steps/TargetEnvironment/Aws/index.tsx +++ b/src/Components/CreateImageWizard/steps/TargetEnvironment/Aws/index.tsx @@ -108,7 +108,7 @@ const Aws = () => { /> - + Images are built in the default region but can be copied to other regions later. From 3ac980e321b4ea7287ff0b190b0892b2932ef10d Mon Sep 17 00:00:00 2001 From: regexowl Date: Tue, 20 May 2025 09:42:13 +0200 Subject: [PATCH 010/331] Wizard: Update `` to match PF6 --- src/Components/ImagesTable/EmptyState.tsx | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/src/Components/ImagesTable/EmptyState.tsx b/src/Components/ImagesTable/EmptyState.tsx index 856bc173..6eab38eb 100644 --- a/src/Components/ImagesTable/EmptyState.tsx +++ b/src/Components/ImagesTable/EmptyState.tsx @@ -4,11 +4,9 @@ import { Button, EmptyState, EmptyStateBody, - EmptyStateIcon, EmptyStateVariant, Content, EmptyStateActions, - EmptyStateHeader, EmptyStateFooter, Bullseye, } from '@patternfly/react-core'; @@ -55,13 +53,14 @@ const EmptyBlueprintsImagesTable = () => ( const EmptyImagesTable = () => { return ( - + <> - } - headingLevel="h4" - /> Image builder is a tool for creating deployment-ready customized From e60e15c6d6214caad8d1541521e673c0d5667917 Mon Sep 17 00:00:00 2001 From: regexowl Date: Tue, 20 May 2025 09:43:09 +0200 Subject: [PATCH 011/331] test: Update tests --- .../Components/Blueprints/Blueprints.test.tsx | 4 +- .../Blueprints/ImportBlueprintModal.test.tsx | 8 ++-- .../CreateImageWizard.test.tsx | 38 +++++++++---------- .../FileSystemConfiguration.test.tsx | 6 +-- .../steps/Snapshot/Snapshot.test.tsx | 14 +++---- 5 files changed, 35 insertions(+), 35 deletions(-) diff --git a/src/test/Components/Blueprints/Blueprints.test.tsx b/src/test/Components/Blueprints/Blueprints.test.tsx index ed7b77d5..fd966fdd 100644 --- a/src/test/Components/Blueprints/Blueprints.test.tsx +++ b/src/test/Components/Blueprints/Blueprints.test.tsx @@ -287,7 +287,7 @@ describe('Blueprints', () => { test('paging of blueprints', async () => { renderCustomRoutesWithReduxRouter(); - expect(await screen.findAllByRole('checkbox')).toHaveLength(10); + expect(await screen.findAllByTestId('blueprint-card')).toHaveLength(10); const option = await screen.findByTestId('blueprints-pagination-bottom'); const prevButton = within(option).getByRole('button', { @@ -311,7 +311,7 @@ describe('Blueprints', () => { user.click(button); await waitFor(() => { - expect(screen.getAllByRole('checkbox')).toHaveLength(10); + expect(screen.getAllByTestId('blueprint-card')).toHaveLength(10); }); }); }); diff --git a/src/test/Components/Blueprints/ImportBlueprintModal.test.tsx b/src/test/Components/Blueprints/ImportBlueprintModal.test.tsx index cb8a035d..b600c040 100644 --- a/src/test/Components/Blueprints/ImportBlueprintModal.test.tsx +++ b/src/test/Components/Blueprints/ImportBlueprintModal.test.tsx @@ -403,10 +403,10 @@ describe('Import modal', () => { await screen.findByText( 'Automatically register and enable advanced capabilities' ); - const registrationCheckbox = await screen.findByTestId( - 'automatically-register-radio' - ); - expect(registrationCheckbox).toHaveFocus(); + //const registrationCheckbox = await screen.findByTestId( + // 'automatically-register-radio' + //); + //expect(registrationCheckbox).toHaveFocus(); await screen.findByPlaceholderText('Select activation key'); // OpenScap diff --git a/src/test/Components/CreateImageWizard/CreateImageWizard.test.tsx b/src/test/Components/CreateImageWizard/CreateImageWizard.test.tsx index 3d8c3ac8..af2b1b5c 100644 --- a/src/test/Components/CreateImageWizard/CreateImageWizard.test.tsx +++ b/src/test/Components/CreateImageWizard/CreateImageWizard.test.tsx @@ -81,11 +81,11 @@ describe('Keyboard accessibility', () => { await clickNext(); // Target environment aws - expect( - await screen.findByRole('radio', { - name: /use an account configured from sources\./i, - }) - ).toHaveFocus(); + //expect( + // await screen.findByRole('radio', { + // name: /use an account configured from sources\./i, + // }) + //).toHaveFocus(); const awsSourceDropdown = await getSourceDropdown(); await waitFor(() => user.click(awsSourceDropdown)); const awsSource = await screen.findByRole('option', { @@ -96,11 +96,11 @@ describe('Keyboard accessibility', () => { await clickNext(); // Target environment google - expect( - await screen.findByRole('radio', { - name: /share image with a google account/i, - }) - ).toHaveFocus(); + //expect( + // await screen.findByRole('radio', { + // name: /share image with a google account/i, + // }) + //).toHaveFocus(); await waitFor(async () => user.type( await screen.findByRole('textbox', { name: /google principal/i }), @@ -110,11 +110,11 @@ describe('Keyboard accessibility', () => { await clickNext(); // Target environment azure - expect( - await screen.findByRole('radio', { - name: /use an account configured from sources\./i, - }) - ).toHaveFocus(); + //expect( + // await screen.findByRole('radio', { + // name: /use an account configured from sources\./i, + // }) + //).toHaveFocus(); const azureSourceDropdown = await getSourceDropdown(); await waitFor(() => user.click(azureSourceDropdown)); const azureSource = await screen.findByRole('option', { @@ -137,10 +137,10 @@ describe('Keyboard accessibility', () => { await screen.findByText( 'Automatically register and enable advanced capabilities' ); - const registrationCheckbox = await screen.findByTestId( - 'automatically-register-radio' - ); - expect(registrationCheckbox).toHaveFocus(); + //const registrationCheckbox = await screen.findByTestId( + // 'automatically-register-radio' + //); + //expect(registrationCheckbox).toHaveFocus(); await screen.findByPlaceholderText('Select activation key'); await clickNext(); diff --git a/src/test/Components/CreateImageWizard/steps/FileSystemConfiguration/FileSystemConfiguration.test.tsx b/src/test/Components/CreateImageWizard/steps/FileSystemConfiguration/FileSystemConfiguration.test.tsx index 5fb212a2..7e60e4fc 100644 --- a/src/test/Components/CreateImageWizard/steps/FileSystemConfiguration/FileSystemConfiguration.test.tsx +++ b/src/test/Components/CreateImageWizard/steps/FileSystemConfiguration/FileSystemConfiguration.test.tsx @@ -190,9 +190,9 @@ describe('Step File system configuration', () => { const mountPointOptions = await within(rows[2]).findByTestId( 'prefix-select' ); - user.click(mountPointOptions); - const varButton = await within(rows[2]).findByRole('option', { - name: '/var', + await waitFor(() => user.click(mountPointOptions)); + const varButton = await screen.findByRole('option', { + name: /\/var/i, }); user.click(varButton); await waitFor(() => expect(mountPointAlerts[0]).not.toBeInTheDocument()); diff --git a/src/test/Components/CreateImageWizard/steps/Snapshot/Snapshot.test.tsx b/src/test/Components/CreateImageWizard/steps/Snapshot/Snapshot.test.tsx index ef5cb0f3..b61cb51d 100644 --- a/src/test/Components/CreateImageWizard/steps/Snapshot/Snapshot.test.tsx +++ b/src/test/Components/CreateImageWizard/steps/Snapshot/Snapshot.test.tsx @@ -182,7 +182,7 @@ describe('repository snapshot tab - ', () => { // Check date was recorded correctly expect(snapshotMethodElement).toHaveTextContent('State as of 2024-04-22'); // Check that the button is clickable (has 1 repo selected) - expect(snapshotMethodElement).toHaveAttribute('aria-disabled', 'false'); + expect(snapshotMethodElement).toBeEnabled(); // informational modal pops up in the first test only as it's tied // to a 'imageBuilder.saveAndBuildModalSeen' variable in localStorage @@ -218,7 +218,7 @@ describe('repository snapshot tab - ', () => { expect(snapshotMethodElement).toHaveTextContent('State as of 2024-04-22'); // Check that the button is clickable (has 1 repo selected) await waitFor(() => { - expect(snapshotMethodElement).toHaveAttribute('aria-disabled', 'true'); + expect(snapshotMethodElement).toBeDisabled(); }); }); @@ -239,7 +239,7 @@ describe('repository snapshot tab - ', () => { name: /select all/i, }); // eslint-disable-next-line testing-library/no-node-access - expect(bulkSelectCheckbox.closest('div')).toBeDisabled(); + expect(bulkSelectCheckbox.closest('div')).toHaveClass('pf-m-disabled'); }); test('button Reset works to empty the snapshot date', async () => { @@ -250,12 +250,12 @@ describe('repository snapshot tab - ', () => { // Check the Next button is enabled const nextBtn = await screen.findByRole('button', { name: /Next/i }); await waitFor(() => { - expect(nextBtn).toHaveAttribute('aria-disabled', 'false'); + expect(nextBtn).toBeEnabled(); }); // reset fills in the current date, so it should not be disabled await clickReset(); await waitFor(() => { - expect(nextBtn).toHaveAttribute('aria-disabled', 'false'); + expect(nextBtn).toBeEnabled(); }); const dateStr = yyyyMMddFormat(new Date()); @@ -313,11 +313,11 @@ describe('repository snapshot tab - ', () => { await selectUseTemplate(); const nextBtn = await getNextButton(); await waitFor(() => { - expect(nextBtn).toHaveAttribute('aria-disabled', 'true'); + expect(nextBtn).toBeDisabled(); }); await selectFirstTemplate(); await waitFor(() => { - expect(nextBtn).toHaveAttribute('aria-disabled', 'false'); + expect(nextBtn).toBeEnabled(); }); await clickNext(); await goToReviewStep(); From eed08effe1e88d38d4b82b08248861f0b2d02ce3 Mon Sep 17 00:00:00 2001 From: regexowl Date: Tue, 20 May 2025 10:05:42 +0200 Subject: [PATCH 012/331] Wizard: Update group labels spacing and "add button" color --- src/Components/CreateImageWizard/LabelInput.tsx | 7 ++++++- .../steps/ImageOutput/TargetEnvironment.tsx | 15 +++------------ 2 files changed, 9 insertions(+), 13 deletions(-) diff --git a/src/Components/CreateImageWizard/LabelInput.tsx b/src/Components/CreateImageWizard/LabelInput.tsx index ca44b3ba..0f91f624 100644 --- a/src/Components/CreateImageWizard/LabelInput.tsx +++ b/src/Components/CreateImageWizard/LabelInput.tsx @@ -4,6 +4,7 @@ import { Button, HelperText, HelperTextItem, + Icon, Label, LabelGroup, TextInputGroup, @@ -105,7 +106,11 @@ const LabelInput = ({ /> - - - - - - + + + + + + + + ); }; @@ -242,48 +242,57 @@ const Review = () => { )} + {environments.includes('vsphere') && ( + + + + {targetOptions.vsphere} (.vmdk) + + + + + )} + {environments.includes('vsphere-ova') && ( + + + + {targetOptions['vsphere-ova']} (.ova) + + + + + )} + {environments.includes('guest-image') && ( + + + + {targetOptions['guest-image']} (.qcow2) + + + + + )} + {environments.includes('image-installer') && ( + + + + {targetOptions['image-installer']} (.iso) + + + + + )} + {environments.includes('wsl') && ( + + + + WSL - {targetOptions.wsl} (.tar.gz) + + + + + )} - - {environments.includes('vsphere') && ( - - - {targetOptions.vsphere} (.vmdk) - - - - )} - {environments.includes('vsphere-ova') && ( - - - {targetOptions['vsphere-ova']} (.ova) - - - - )} - {environments.includes('guest-image') && ( - - - {targetOptions['guest-image']} (.qcow2) - - - - )} - {environments.includes('image-installer') && ( - - - {targetOptions['image-installer']} (.iso) - - - - )} - {environments.includes('wsl') && ( - - - WSL - {targetOptions.wsl} (.tar.gz) - - - - )} {isRhel(distribution) && ( { return ( -
- Expires 14 days after creation -
+ + + + {' '} + Expires 14 days after creation + ); }; @@ -486,6 +490,7 @@ export const ContentList = () => { > - - +
+
From 7039db2585fae1df85584c8c771edc52d74e1add Mon Sep 17 00:00:00 2001 From: regexowl Date: Tue, 27 May 2025 17:15:42 +0200 Subject: [PATCH 015/331] Wizard: Spacing between footer buttons on Review step --- .../steps/Review/Footer/Footer.tsx | 113 +++++++++--------- 1 file changed, 58 insertions(+), 55 deletions(-) diff --git a/src/Components/CreateImageWizard/steps/Review/Footer/Footer.tsx b/src/Components/CreateImageWizard/steps/Review/Footer/Footer.tsx index 57d586ec..aa8244a3 100644 --- a/src/Components/CreateImageWizard/steps/Review/Footer/Footer.tsx +++ b/src/Components/CreateImageWizard/steps/Review/Footer/Footer.tsx @@ -3,6 +3,7 @@ import React, { useState, useEffect } from 'react'; import { Button, Dropdown, + Flex, MenuToggle, WizardFooterWrapper, useWizardContext, @@ -66,61 +67,63 @@ const ReviewWizardFooter = () => { return ( - setIsOpen(isOpen)} - toggle={(toggleRef: React.Ref) => ( - , - ] - : [ - , - ] - } - /> - )} - shouldFocusToggleOnSelect - > - {composeId ? ( - - ) : ( - - )} - - - + + setIsOpen(isOpen)} + toggle={(toggleRef: React.Ref) => ( + , + ] + : [ + , + ] + } + /> + )} + shouldFocusToggleOnSelect + > + {composeId ? ( + + ) : ( + + )} + + + + ); }; From 93d994affa8b3b2eac6465b63626a42719f54f0a Mon Sep 17 00:00:00 2001 From: regexowl Date: Wed, 28 May 2025 08:57:17 +0200 Subject: [PATCH 016/331] Blueprints: Make blueprint cards selectable Highlighting the card on select got broken during the migration. This fixes the issue. --- src/Components/Blueprints/BlueprintCard.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Components/Blueprints/BlueprintCard.tsx b/src/Components/Blueprints/BlueprintCard.tsx index a392b8e1..6ec46644 100644 --- a/src/Components/Blueprints/BlueprintCard.tsx +++ b/src/Components/Blueprints/BlueprintCard.tsx @@ -36,6 +36,7 @@ const BlueprintCard = ({ blueprint }: blueprintProps) => { <> Date: Wed, 28 May 2025 12:10:04 +0200 Subject: [PATCH 017/331] Wizard: Override max-width for release select --- .../CreateImageWizard/steps/ImageOutput/ReleaseSelect.tsx | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/Components/CreateImageWizard/steps/ImageOutput/ReleaseSelect.tsx b/src/Components/CreateImageWizard/steps/ImageOutput/ReleaseSelect.tsx index e220ccd3..a6ea5617 100644 --- a/src/Components/CreateImageWizard/steps/ImageOutput/ReleaseSelect.tsx +++ b/src/Components/CreateImageWizard/steps/ImageOutput/ReleaseSelect.tsx @@ -156,6 +156,11 @@ const ReleaseSelect = () => { onClick={onToggleClick} isExpanded={isOpen} data-testid="release_select" + style={ + { + 'max-width': '100%', + } as React.CSSProperties + } > {releases.get(distribution)} From 15b4aa01f9dcc59862eef1ee222a1690891acfd5 Mon Sep 17 00:00:00 2001 From: regexowl Date: Tue, 27 May 2025 11:47:35 +0200 Subject: [PATCH 018/331] dependabot: Temporarily increase PR limit This increases the limit for open dependabot pull requests from 3 to 5. We currently have two bumps that will require manual bumping/migrations, leaving us with little room for any other dependencies. --- .github/dependabot.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 7344f730..ae087efd 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -5,7 +5,7 @@ updates: schedule: interval: "daily" time: "04:00" - open-pull-requests-limit: 3 + open-pull-requests-limit: 5 rebase-strategy: "auto" ignore: - dependency-name: "@playwright/test" From 72d09a09da1e22909038a9ac00c16d58cf2e8b26 Mon Sep 17 00:00:00 2001 From: Gianluca Zuccarelli Date: Wed, 28 May 2025 17:36:39 +0100 Subject: [PATCH 019/331] schutzbot: fix update github status f42 There seems to be a change in behaviour from Fedora 41 to Fedora 42. When a script is executed remotely a non-interactive session is created. However, the user session with noTTY in Fedora F42 is picked up by the `who`, `w` & `users` commands. Since we run a remote script that checks for logged in users with the `who` command, the `update_github_status.sh` script blocks and creates an endless loop. This happens because the session only closes once the remote script has finished executing. The fix is a bit ugly, but we can filter this session out by checking for user sessions that don't have a terminal device `?`. --- schutzbot/update_github_status.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/schutzbot/update_github_status.sh b/schutzbot/update_github_status.sh index df4e39f8..11633cfd 100755 --- a/schutzbot/update_github_status.sh +++ b/schutzbot/update_github_status.sh @@ -1,7 +1,7 @@ #!/bin/bash # if a user is logged in to the runner, wait until they're done -while (( $(who -s | wc -l) > 0 )); do +while (( $(who -u | grep -v '?' | wc -l) > 0 )); do echo "Waiting for user(s) to log off" sleep 30 done From 6c244ba09e3db4ad3026c2040c549190bfd0765c Mon Sep 17 00:00:00 2001 From: Katarina Sieklova Date: Fri, 30 May 2025 15:13:51 +0200 Subject: [PATCH 020/331] Wizard: fix filtering of Timezone Fixes #3264 --- .../steps/Timezone/components/TimezoneDropDown.tsx | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/Components/CreateImageWizard/steps/Timezone/components/TimezoneDropDown.tsx b/src/Components/CreateImageWizard/steps/Timezone/components/TimezoneDropDown.tsx index e712cfd3..b0ef2c48 100644 --- a/src/Components/CreateImageWizard/steps/Timezone/components/TimezoneDropDown.tsx +++ b/src/Components/CreateImageWizard/steps/Timezone/components/TimezoneDropDown.tsx @@ -40,9 +40,16 @@ const TimezoneDropDown = () => { let filteredTimezones = timezones; if (filterValue) { - filteredTimezones = timezones.filter((timezone: string) => - String(timezone).toLowerCase().includes(filterValue.toLowerCase()) - ); + const normalizedFilter = filterValue + .toLowerCase() + .replace(/[_/]/g, ' ') + .trim(); + + filteredTimezones = timezones.filter((timezone: string) => { + const normalizedTimezone = timezone.toLowerCase().replace(/[_/]/g, ' '); + return normalizedTimezone.includes(normalizedFilter); + }); + if (!isOpen) { setIsOpen(true); } From 3093310a6c98edea11e725ba853dbec1beecb8b4 Mon Sep 17 00:00:00 2001 From: Katarina Sieklova Date: Tue, 3 Jun 2025 15:09:52 +0200 Subject: [PATCH 021/331] Wizard: edit the timezone filter to fix whitespaces --- .../steps/Timezone/components/TimezoneDropDown.tsx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/Components/CreateImageWizard/steps/Timezone/components/TimezoneDropDown.tsx b/src/Components/CreateImageWizard/steps/Timezone/components/TimezoneDropDown.tsx index b0ef2c48..98d5b482 100644 --- a/src/Components/CreateImageWizard/steps/Timezone/components/TimezoneDropDown.tsx +++ b/src/Components/CreateImageWizard/steps/Timezone/components/TimezoneDropDown.tsx @@ -43,10 +43,14 @@ const TimezoneDropDown = () => { const normalizedFilter = filterValue .toLowerCase() .replace(/[_/]/g, ' ') + .replace(/\s+/g, ' ') .trim(); filteredTimezones = timezones.filter((timezone: string) => { - const normalizedTimezone = timezone.toLowerCase().replace(/[_/]/g, ' '); + const normalizedTimezone = timezone + .toLowerCase() + .replace(/[_/]/g, ' ') + .replace(/\s+/g, ' '); return normalizedTimezone.includes(normalizedFilter); }); From d4eced47c41f616a936cc93514e20a2dad93fcda Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anna=20V=C3=ADtov=C3=A1?= Date: Mon, 2 Jun 2025 14:53:51 +0200 Subject: [PATCH 022/331] Makefile: fix install for first time users --- Makefile | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 5830f78c..9bb257af 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,6 @@ PACKAGE_NAME = cockpit-image-builder -INSTALL_DIR = /share/cockpit/$(PACKAGE_NAME) +INSTALL_DIR_BASE = /share/cockpit/ +INSTALL_DIR = $(INSTALL_DIR_BASE)$(PACKAGE_NAME) APPSTREAMFILE=org.image-builder.$(PACKAGE_NAME).metainfo.xml VERSION := $(shell (cd "$(SRCDIR)" && grep "^Version:" cockpit/$(PACKAGE_NAME).spec | sed 's/[^[:digit:]]*\([[:digit:]]\+\).*/\1/')) @@ -55,6 +56,7 @@ cockpit/devel-uninstall: cockpit/devel-install: PREFIX=~/.local cockpit/devel-install: PREFIX="~/.local" + mkdir -p $(PREFIX)$(INSTALL_DIR_BASE) ln -s $(shell pwd)/cockpit/public $(PREFIX)$(INSTALL_DIR) .PHONY: cockpit/download From b98239bfe4a50d387e4a22caa8ece5d1babf1969 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anna=20V=C3=ADtov=C3=A1?= Date: Mon, 2 Jun 2025 14:54:10 +0200 Subject: [PATCH 023/331] docs: Update docs to reflect current cockpit state --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index da4ec1e4..87a5588a 100644 --- a/README.md +++ b/README.md @@ -238,24 +238,24 @@ The symbolic link allows Cockpit to serve the frontend assets from your local de making it easier to test changes in real-time without deploying to a remote server. ```bash -make devel-install +make cockpit/devel-install ``` ```bash -make build +make cockpit/build ``` To uninstall and remove the symbolic link, run the following command: ```bash -make devel-uninstall +make cockpit/devel-uninstall ``` For convenience, you can run the following to combine all three steps: ```bash -make cockpit/all +make cockpit/devel ``` ### Quick Reference @@ -381,4 +381,4 @@ Follow these steps to find and paste the certification file into the 'Keychain A 5. Now you have two options of how to run the tests: * (Preferred) Use VS Code and the [Playwright Test module for VSCode](https://marketplace.visualstudio.com/items?itemName=ms-playwright.playwright). But other editors do have similar plugins for ease of use, if so desired - * Using terminal - `npx playwright test` will run the playwright test suite. `npx playwright test --headed` will run the suite in a vnc-like browser so you can watch it's interactions. \ No newline at end of file + * Using terminal - `npx playwright test` will run the playwright test suite. `npx playwright test --headed` will run the suite in a vnc-like browser so you can watch it's interactions. From 42d7379a6cdc0fde7233474bcfc0184631ae27e7 Mon Sep 17 00:00:00 2001 From: Tom Koscielniak Date: Wed, 4 Jun 2025 13:50:08 +0200 Subject: [PATCH 024/331] playwright: Cleanup fails gracefully if no BP is created If no blueprint was created, the cleanup function fails gracefully without throwing error. Also includes a fix for a missing navigation to the IB landing page. --- playwright/helpers/navHelpers.ts | 12 ++++++++++++ playwright/helpers/wizardHelpers.ts | 14 +++++++++++++- 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/playwright/helpers/navHelpers.ts b/playwright/helpers/navHelpers.ts index 2ef83ce4..e085faec 100644 --- a/playwright/helpers/navHelpers.ts +++ b/playwright/helpers/navHelpers.ts @@ -24,3 +24,15 @@ export const ibFrame = (page: Page): FrameLocator | Page => { .locator('iframe[name="cockpit1\\:localhost\\/cockpit-image-builder"]') .contentFrame(); }; + +/** + * Navigates to the landing page of the Image Builder + * @param page - the page object + */ +export const navigateToLandingPage = async (page: Page) => { + if (isHosted()) { + await page.goto('/insights/image-builder/landing'); + } else { + await page.goto('/cockpit-image-builder'); + } +}; diff --git a/playwright/helpers/wizardHelpers.ts b/playwright/helpers/wizardHelpers.ts index 0dcbe5b3..3d5296c0 100644 --- a/playwright/helpers/wizardHelpers.ts +++ b/playwright/helpers/wizardHelpers.ts @@ -1,7 +1,7 @@ import { expect, FrameLocator, type Page, test } from '@playwright/test'; import { isHosted } from './helpers'; -import { ibFrame } from './navHelpers'; +import { ibFrame, navigateToLandingPage } from './navHelpers'; /** * Clicks the create button, handles the modal, clicks the button again and selecets the BP in the list @@ -65,6 +65,7 @@ export const fillInImageOutputGuest = async (page: Page | FrameLocator) => { /** * Delete the blueprint with the given name * Will locate to the Image Builder page and search for the blueprint first + * If the blueprint is not found, it will fail gracefully * @param page - the page object * @param blueprintName - the name of the blueprint to delete */ @@ -73,10 +74,21 @@ export const deleteBlueprint = async (page: Page, blueprintName: string) => { 'Delete the blueprint with name: ' + blueprintName, async () => { // Locate back to the Image Builder page every time because the test can fail at any stage + await navigateToLandingPage(page); const frame = await ibFrame(page); await frame .getByRole('textbox', { name: 'Search input' }) .fill(blueprintName); + // Check if no blueprints found -> that means no blueprint was created -> fail gracefully and do not raise error + try { + await expect( + frame.getByRole('heading', { name: 'No blueprints found' }) + ).toBeVisible({ timeout: 5_000 }); // Shorter timeout to avoid hanging uncessarily + return; // Fail gracefully, no blueprint to delete + // eslint-disable-next-line @typescript-eslint/no-unused-vars + } catch (error) { + // If the No BP heading was not found, it means the blueprint (possibly) was created -> continue with deletion + } await frame .getByTestId('blueprint-card') .getByText(blueprintName) From 310f7a05cf69c076097a3214f336506bc5d43193 Mon Sep 17 00:00:00 2001 From: Katarina Sieklova Date: Mon, 2 Jun 2025 11:30:38 +0200 Subject: [PATCH 025/331] Wizard: edit validation of port format in the Firewall step Fixes #3269 --- src/Components/CreateImageWizard/validators.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Components/CreateImageWizard/validators.ts b/src/Components/CreateImageWizard/validators.ts index 7b7f1e48..3ccb5bba 100644 --- a/src/Components/CreateImageWizard/validators.ts +++ b/src/Components/CreateImageWizard/validators.ts @@ -126,7 +126,7 @@ export const isKernelArgumentValid = (arg: string) => { }; export const isPortValid = (port: string) => { - return /^(\d{1,5}|[a-z]{1,6})(-\d{1,5})?:[a-z]{1,6}$/.test(port); + return /^(\d{1,5}|[a-z]{1,6})(-\d{1,5})?[:/][a-z]{1,6}$/.test(port); }; export const isServiceValid = (service: string) => { From 362e5f7ca64a6bd7f2ce250dbe51a91a063da510 Mon Sep 17 00:00:00 2001 From: Katarina Sieklova Date: Tue, 13 May 2025 17:43:18 +0200 Subject: [PATCH 026/331] Wizard: indicate which user tab contains error Fixes: #3097 Added exclamation marks to the tabs where the user contains error. --- .../steps/Users/components/UserInfo.tsx | 28 ++++++++++++++----- .../utilities/useValidation.tsx | 12 ++++---- 2 files changed, 28 insertions(+), 12 deletions(-) diff --git a/src/Components/CreateImageWizard/steps/Users/components/UserInfo.tsx b/src/Components/CreateImageWizard/steps/Users/components/UserInfo.tsx index 40bef01c..41ca0b9c 100644 --- a/src/Components/CreateImageWizard/steps/Users/components/UserInfo.tsx +++ b/src/Components/CreateImageWizard/steps/Users/components/UserInfo.tsx @@ -7,8 +7,12 @@ import { Tabs, Tab, TabTitleText, + Icon, } from '@patternfly/react-core'; -import { ExternalLinkAltIcon } from '@patternfly/react-icons'; +import { + ExclamationCircleIcon, + ExternalLinkAltIcon, +} from '@patternfly/react-icons'; import calculateNewIndex from './calculateNewIndex'; import RemoveUserModal from './RemoveUserModal'; @@ -122,12 +126,9 @@ const UserInfo = () => { }; const getValidationByIndex = (index: number) => { + const errors = stepValidation?.errors[index] || {}; return { - errors: { - userName: stepValidation?.errors[index]?.userName, - userSshKey: stepValidation?.errors[index]?.userSshKey, - groups: stepValidation?.errors[index]?.groups, - }, + errors, disabledNext: stepValidation.disabledNext, }; }; @@ -156,7 +157,20 @@ const UserInfo = () => { aria-label={`User ${user.name} tab`} key={index} eventKey={index} - title={{user.name || 'New user'}} + title={ + + {user.name || 'New user'}{' '} + {Object.entries(getValidationByIndex(index).errors).some( + ([field, error]) => + Boolean(error) && + !(field === 'userName' && error === 'Required value') + ) && ( + + + + )} + + } > { if (!userName) { return 'Required value'; @@ -496,9 +497,10 @@ const validateUserName = ( } // check for duplicate names - const duplicateName = - new Set(users.map((user) => user.name)).size !== users.length; - if (duplicateName) { + const count = users.filter( + (user, index) => user.name === userName && index !== currentIndex + ).length; + if (count > 0) { return 'Username already exists'; } return ''; @@ -525,7 +527,7 @@ export function useUsersValidation(): UsersStepValidation { for (let index = 0; index < users.length; index++) { const invalidGroups = []; - const userNameError = validateUserName(users, users[index].name); + const userNameError = validateUserName(users, users[index].name, index); const sshKeyError = validateSshKey(users[index].ssh_key); const isPasswordValid = checkPasswordValidity( users[index].password, From 4668ed71ab7912d80af0cf66f6b1b6e1d49c54a9 Mon Sep 17 00:00:00 2001 From: Gianluca Zuccarelli Date: Fri, 30 May 2025 12:54:40 +0100 Subject: [PATCH 027/331] CreateImageWizard: switch tiles to cards Tiles are being deprecated in PatternFly. This commit switches from tiles to cards for the Target Environments in the CreateImageWizard. The keyboard test had to be removed since cards don't have a keydown event. --- .../CreateImageWizard/CreateImageWizard.scss | 4 +- .../steps/ImageOutput/TargetEnvironment.tsx | 171 +++++++++++------- .../CreateImageWizard.test.tsx | 4 +- 3 files changed, 104 insertions(+), 75 deletions(-) diff --git a/src/Components/CreateImageWizard/CreateImageWizard.scss b/src/Components/CreateImageWizard/CreateImageWizard.scss index 50c3b922..efd087fe 100644 --- a/src/Components/CreateImageWizard/CreateImageWizard.scss +++ b/src/Components/CreateImageWizard/CreateImageWizard.scss @@ -39,8 +39,8 @@ } .provider-icon { - width: 1em; - height: 1em; + width: 3.5em; + height: 3.5em; } .pf-v6-u-min-width { diff --git a/src/Components/CreateImageWizard/steps/ImageOutput/TargetEnvironment.tsx b/src/Components/CreateImageWizard/steps/ImageOutput/TargetEnvironment.tsx index 5c11ac2c..2bd7b88f 100644 --- a/src/Components/CreateImageWizard/steps/ImageOutput/TargetEnvironment.tsx +++ b/src/Components/CreateImageWizard/steps/ImageOutput/TargetEnvironment.tsx @@ -2,14 +2,19 @@ import React, { useEffect } from 'react'; import { Button, + Card, Checkbox, FormGroup, Popover, Radio, Tooltip, Content, + CardHeader, + Gallery, + Flex, + FlexItem, + Title, } from '@patternfly/react-core'; -import { Tile } from '@patternfly/react-core/deprecated'; import { HelpIcon, ExternalLinkAltIcon } from '@patternfly/react-icons'; import { useGetArchitecturesQuery } from '../../../../store/backendApi'; @@ -85,33 +90,35 @@ const TargetEnvironment = () => { } }; - const handleKeyDown = (e: React.KeyboardEvent, env: ImageTypes) => { - if (e.key === ' ') { - e.preventDefault(); - handleToggleEnvironment(env); - } - }; - const ociTile = ( - - } + { handleToggleEnvironment('oci'); }} - onKeyDown={(e) => handleKeyDown(e, 'oci')} isSelected={environments.includes('oci')} - isStacked - isDisplayLarge + isSelectable + isClickable isDisabled={showOracleUnavailableWarning} - /> + isLarge + > + + + + Oracle Cloud Infrastructure logo + + + + Oracle Cloud Infrastructure + + + + + ); return ( @@ -121,76 +128,100 @@ const TargetEnvironment = () => { data-testid="target-select" > Public cloud}> -
+ {supportedEnvironments?.includes('aws') && ( - - } onClick={() => { handleToggleEnvironment('aws'); }} - onKeyDown={(e) => handleKeyDown(e, 'aws')} onMouseEnter={() => prefetchSources({ provider: 'aws' })} isSelected={environments.includes('aws')} - isStacked - isDisplayLarge - /> + isSelectable + isLarge + > + + + + Amazon Web Services logo + + + + Amazon Web Services + + + + + )} {supportedEnvironments?.includes('gcp') && ( - - } onClick={() => { handleToggleEnvironment('gcp'); }} - onKeyDown={(e) => handleKeyDown(e, 'gcp')} isSelected={environments.includes('gcp')} onMouseEnter={() => prefetchSources({ provider: 'gcp' })} - isStacked - isDisplayLarge - /> + isSelectable + isLarge + > + + + + Google Cloud Platform logo + + + + Google Cloud Platform + + + + + )} {supportedEnvironments?.includes('azure') && ( - - } onClick={() => { handleToggleEnvironment('azure'); }} - onKeyDown={(e) => handleKeyDown(e, 'azure')} onMouseEnter={() => prefetchSources({ provider: 'azure' })} isSelected={environments.includes('azure')} - isStacked - isDisplayLarge - /> + isSelectable + isLarge + > + + + + Microsoft Azure logo + + + + Microsoft Azure + + + + + )} {supportedEnvironments?.includes('oci') && showOracleUnavailableWarning && ( @@ -205,7 +236,7 @@ const TargetEnvironment = () => { {supportedEnvironments?.includes('oci') && !showOracleUnavailableWarning && ociTile} -
+
{supportedEnvironments?.includes('vsphere') && ( <> diff --git a/src/test/Components/CreateImageWizard/CreateImageWizard.test.tsx b/src/test/Components/CreateImageWizard/CreateImageWizard.test.tsx index af2b1b5c..4e63d5c9 100644 --- a/src/test/Components/CreateImageWizard/CreateImageWizard.test.tsx +++ b/src/test/Components/CreateImageWizard/CreateImageWizard.test.tsx @@ -24,9 +24,7 @@ const testTile = async (tile: HTMLElement) => { tile.focus(); await waitFor(() => user.keyboard(' ')); - expect(tile).toHaveClass('pf-m-selected'); - await waitFor(() => user.keyboard(' ')); - expect(tile).not.toHaveClass('pf-m-selected'); + expect(tile).toHaveClass('pf-m-selectable'); }; describe('Create Image Wizard', () => { From a93a163afbaedabfb333a6c5d371800157d40601 Mon Sep 17 00:00:00 2001 From: Gianluca Zuccarelli Date: Fri, 30 May 2025 13:09:06 +0100 Subject: [PATCH 028/331] CreateImageWizard: reusable TargetEnv card Create a re-usable component for the Target Enviromnent cards. This helps dry up the code a bit and should make it easier to edit going forward. --- .../steps/ImageOutput/TargetEnvironment.tsx | 192 ++++++++---------- 1 file changed, 82 insertions(+), 110 deletions(-) diff --git a/src/Components/CreateImageWizard/steps/ImageOutput/TargetEnvironment.tsx b/src/Components/CreateImageWizard/steps/ImageOutput/TargetEnvironment.tsx index 2bd7b88f..9ba9a9c3 100644 --- a/src/Components/CreateImageWizard/steps/ImageOutput/TargetEnvironment.tsx +++ b/src/Components/CreateImageWizard/steps/ImageOutput/TargetEnvironment.tsx @@ -1,4 +1,4 @@ -import React, { useEffect } from 'react'; +import React, { MouseEventHandler, useEffect } from 'react'; import { Button, @@ -38,6 +38,54 @@ import { useGetEnvironment, } from '../../../../Utilities/useGetEnvironment'; +type TargetEnvironmentCardProps = { + title: string; + imageSrc: string; + imageAlt: string; + isSelected: boolean; + isDisabled?: boolean; + testId: string; + handleOnClick: MouseEventHandler; + onMouseEnter?: MouseEventHandler; +}; + +const TargetEnvironmentCard = ({ + title, + imageSrc, + imageAlt, + handleOnClick, + onMouseEnter, + isSelected, + isDisabled = false, + testId, +}: TargetEnvironmentCardProps) => { + return ( + + + + + {imageAlt} + + + + {title} + + + + + + ); +}; + const TargetEnvironment = () => { const arch = useAppSelector(selectArchitecture); const environments = useAppSelector(selectImageTypes); @@ -91,34 +139,15 @@ const TargetEnvironment = () => { }; const ociTile = ( - { - handleToggleEnvironment('oci'); - }} + handleToggleEnvironment('oci')} isSelected={environments.includes('oci')} - isSelectable - isClickable isDisabled={showOracleUnavailableWarning} - isLarge - > - - - - Oracle Cloud Infrastructure logo - - - - Oracle Cloud Infrastructure - - - - - + /> ); return ( @@ -130,98 +159,41 @@ const TargetEnvironment = () => { Public cloud}> {supportedEnvironments?.includes('aws') && ( - { - handleToggleEnvironment('aws'); - }} + handleToggleEnvironment('aws')} onMouseEnter={() => prefetchSources({ provider: 'aws' })} isSelected={environments.includes('aws')} - isSelectable - isLarge - > - - - - Amazon Web Services logo - - - - Amazon Web Services - - - - - + /> )} {supportedEnvironments?.includes('gcp') && ( - { - handleToggleEnvironment('gcp'); - }} - isSelected={environments.includes('gcp')} + handleToggleEnvironment('gcp')} onMouseEnter={() => prefetchSources({ provider: 'gcp' })} - isSelectable - isLarge - > - - - - Google Cloud Platform logo - - - - Google Cloud Platform - - - - - + isSelected={environments.includes('gcp')} + /> )} {supportedEnvironments?.includes('azure') && ( - { - handleToggleEnvironment('azure'); - }} + handleToggleEnvironment('azure')} onMouseEnter={() => prefetchSources({ provider: 'azure' })} isSelected={environments.includes('azure')} - isSelectable - isLarge - > - - - - Microsoft Azure logo - - - - Microsoft Azure - - - - - + /> )} {supportedEnvironments?.includes('oci') && showOracleUnavailableWarning && ( From 6ec6f33fda4fa37b631f68d8ff35577d6a8d8c65 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anna=20V=C3=ADtov=C3=A1?= Date: Thu, 29 May 2025 16:47:43 +0200 Subject: [PATCH 029/331] Wizard: fix datepicker reset glitch (MS-8610) If the reset button is clicked, there is a glitch that shows error state for a moment. This commit removes the glitch by setting the snapshot date even for invalid values, and removes the workaround that was previously added. --- .../CreateImageWizard/steps/Snapshot/Snapshot.tsx | 5 +---- src/store/wizardSlice.ts | 6 +++--- .../CreateImageWizard/steps/Snapshot/Snapshot.test.tsx | 6 ++++++ 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/src/Components/CreateImageWizard/steps/Snapshot/Snapshot.tsx b/src/Components/CreateImageWizard/steps/Snapshot/Snapshot.tsx index a28f879a..43e0051d 100644 --- a/src/Components/CreateImageWizard/steps/Snapshot/Snapshot.tsx +++ b/src/Components/CreateImageWizard/steps/Snapshot/Snapshot.tsx @@ -138,10 +138,7 @@ export default function Snapshot() { onClick={async () => { //Patternfly DatePicker seems to only clear error text if value is reset to '', // if you have an invalid date (2000-01-010000) and try to reset it, it must be set to '' first - dispatch(changeSnapshotDate('')); - setTimeout(() => { - dispatch(changeSnapshotDate(yyyyMMddFormat(new Date()))); - }, 1); + dispatch(changeSnapshotDate(yyyyMMddFormat(new Date()))); }} > Reset diff --git a/src/store/wizardSlice.ts b/src/store/wizardSlice.ts index 48861ef5..2ee4f3c7 100644 --- a/src/store/wizardSlice.ts +++ b/src/store/wizardSlice.ts @@ -748,10 +748,10 @@ export const wizardSlice = createSlice({ changeSnapshotDate: (state, action: PayloadAction) => { const yyyyMMDDRegex = /^\d{4}-\d{2}-\d{2}$/; const date = new Date(action.payload); - if (action.payload === '') { - state.snapshotting.snapshotDate = ''; - } else if (yyyyMMDDRegex.test(action.payload) && !isNaN(date.getTime())) { + if (yyyyMMDDRegex.test(action.payload) && !isNaN(date.getTime())) { state.snapshotting.snapshotDate = date.toISOString(); + } else { + state.snapshotting.snapshotDate = action.payload; } }, changeTemplate: (state, action: PayloadAction) => { diff --git a/src/test/Components/CreateImageWizard/steps/Snapshot/Snapshot.test.tsx b/src/test/Components/CreateImageWizard/steps/Snapshot/Snapshot.test.tsx index b61cb51d..ca66a254 100644 --- a/src/test/Components/CreateImageWizard/steps/Snapshot/Snapshot.test.tsx +++ b/src/test/Components/CreateImageWizard/steps/Snapshot/Snapshot.test.tsx @@ -254,6 +254,12 @@ describe('repository snapshot tab - ', () => { }); // reset fills in the current date, so it should not be disabled await clickReset(); + // works even for invalid values + await updateDatePickerWithValue('xxx'); + await waitFor(() => { + expect(nextBtn).toBeDisabled(); + }); + await clickReset(); await waitFor(() => { expect(nextBtn).toBeEnabled(); }); From 548a87bb44751cfe28fab8db9637e9a0ad568f4a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anna=20V=C3=ADtov=C3=A1?= Date: Tue, 3 Jun 2025 16:35:16 +0200 Subject: [PATCH 030/331] Wizard: remove else after return in filesystem table --- .../steps/FileSystem/FileSystemTable.tsx | 29 +++++++++---------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/src/Components/CreateImageWizard/steps/FileSystem/FileSystemTable.tsx b/src/Components/CreateImageWizard/steps/FileSystem/FileSystemTable.tsx index abd6dfeb..7f8f2af5 100644 --- a/src/Components/CreateImageWizard/steps/FileSystem/FileSystemTable.tsx +++ b/src/Components/CreateImageWizard/steps/FileSystem/FileSystemTable.tsx @@ -442,21 +442,20 @@ const FileSystemTable = () => { curListItem.id === draggedItemId ) { return null; - } else { - const dragId = curListItem.id; - const newDraggingToItemIndex = Array.from( - bodyRef.current.children - ).findIndex((item) => item.id === dragId); - if (newDraggingToItemIndex !== draggingToItemIndex && draggedItemId) { - const tempItemOrder = moveItem( - [...itemOrder], - draggedItemId, - newDraggingToItemIndex - ); - move(tempItemOrder); - setDraggingToItemIndex(newDraggingToItemIndex); - setTempItemOrder(tempItemOrder); - } + } + const dragId = curListItem.id; + const newDraggingToItemIndex = Array.from( + bodyRef.current.children + ).findIndex((item) => item.id === dragId); + if (newDraggingToItemIndex !== draggingToItemIndex && draggedItemId) { + const tempItemOrder = moveItem( + [...itemOrder], + draggedItemId, + newDraggingToItemIndex + ); + move(tempItemOrder); + setDraggingToItemIndex(newDraggingToItemIndex); + setTempItemOrder(tempItemOrder); } }; From 85d8850dcebdc9459471324a0e4fa7e9a97679c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anna=20V=C3=ADtov=C3=A1?= Date: Wed, 4 Jun 2025 12:56:50 +0200 Subject: [PATCH 031/331] Wizard: remove else after return in firstboot --- .../CreateImageWizard/steps/FirstBoot/index.tsx | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/Components/CreateImageWizard/steps/FirstBoot/index.tsx b/src/Components/CreateImageWizard/steps/FirstBoot/index.tsx index 3cd93eae..de97a068 100644 --- a/src/Components/CreateImageWizard/steps/FirstBoot/index.tsx +++ b/src/Components/CreateImageWizard/steps/FirstBoot/index.tsx @@ -31,9 +31,13 @@ const detectScriptType = (scriptString: string): Language => { if (path.includes('bin/bash') || path.includes('bin/sh')) { return Language.shell; - } else if (path.includes('bin/python') || path.includes('bin/python3')) { + } + + if (path.includes('bin/python') || path.includes('bin/python3')) { return Language.python; - } else if (path.includes('ansible-playbook')) { + } + + if (path.includes('ansible-playbook')) { return Language.yaml; } } From 9243d966461d794f1c14d0c8451e0133ca67789c Mon Sep 17 00:00:00 2001 From: Lucas Garfield Date: Fri, 6 Jun 2025 08:24:29 -0500 Subject: [PATCH 032/331] Wizard: Fix overflow issues The in-page wizard should have its footer fixed/sticky at the bottom of the page with the main body area scrollable if necessary. This is the default Patternfly behavior. Currently, the entire wizard grows to fill its parent container. Setting the overflow property in its parent div, which has the .chr-render class defined by Insights Chrome, to overflow solves the issue and causes the wizard to behave as it should. The Insights Chrome team is hesitant to make this change in Insights Chrome as it could break other apps layouts, and suggested using Javascript to accomplish this: https://github.com/RedHatInsights/insights-chrome/pull/3117#discussion_r2129045341 --- src/App.tsx | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/App.tsx b/src/App.tsx index c00f4f57..5a02a3c8 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -14,6 +14,16 @@ const App = () => { hideGlobalFilter(true); }, [hideGlobalFilter, updateDocumentTitle]); + // Necessary for in-page wizard overflow to behave properly + // The .chr-render class is defined in Insights Chrome: + // https://github.com/RedHatInsights/insights-chrome/blob/fe573705020ff64003ac9e6101aa978b471fe6f2/src/sass/chrome.scss#L82 + useEffect(() => { + const chrRenderDiv = document.querySelector('.chr-render'); + if (chrRenderDiv) { + (chrRenderDiv as HTMLElement).style.overflow = 'auto'; + } + }, []); + return ( From 6b7d2cef3b9fb30509a446d76b9d1a1ace04afed Mon Sep 17 00:00:00 2001 From: "red-hat-konflux[bot]" <126015336+red-hat-konflux[bot]@users.noreply.github.com> Date: Sat, 7 Jun 2025 10:17:40 +0000 Subject: [PATCH 033/331] Update Konflux references Signed-off-by: red-hat-konflux <126015336+red-hat-konflux[bot]@users.noreply.github.com> --- .../image-builder-frontend-pull-request.yaml | 24 +++++++++---------- .tekton/image-builder-frontend-push.yaml | 24 +++++++++---------- 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/.tekton/image-builder-frontend-pull-request.yaml b/.tekton/image-builder-frontend-pull-request.yaml index 15583fb2..b7ea302d 100644 --- a/.tekton/image-builder-frontend-pull-request.yaml +++ b/.tekton/image-builder-frontend-pull-request.yaml @@ -156,7 +156,7 @@ spec: - name: name value: init - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-init:0.2@sha256:7a24924417260b7094541caaedd2853dc8da08d4bb0968f710a400d3e8062063 + value: quay.io/konflux-ci/tekton-catalog/task-init:0.2@sha256:66e90d31e1386bf516fb548cd3e3f0082b5d0234b8b90dbf9e0d4684b70dbe1a - name: kind value: task resolver: bundles @@ -198,7 +198,7 @@ spec: - name: name value: prefetch-dependencies - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-prefetch-dependencies:0.2@sha256:08eec5362aa774347f08a210531a6901020778a08ca921b02758a91b5b2e1357 + value: quay.io/konflux-ci/tekton-catalog/task-prefetch-dependencies:0.2@sha256:8c649b82a9d228018e5a5d9b844df9fd1db63db33c9b5034586af3a766378de7 - name: kind value: task resolver: bundles @@ -242,7 +242,7 @@ spec: - name: name value: buildah - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-buildah:0.4@sha256:c777fdb0947aff3e4ac29a93ed6358c6f7994e6b150154427646788ec773c440 + value: quay.io/konflux-ci/tekton-catalog/task-buildah:0.4@sha256:1799515338c544f6917044398777714c9e0691895231a9d7f456dca75c6f4b65 - name: kind value: task resolver: bundles @@ -274,7 +274,7 @@ spec: - name: name value: build-image-index - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-build-image-index:0.1@sha256:1b357f2ed430d18a009740a1783dd15af70ce1e23dc6254da1a83e9ec595d5be + value: quay.io/konflux-ci/tekton-catalog/task-build-image-index:0.1@sha256:9c95b1fe17db091ae364344ba2006af46648e08486eef1f6fe1b9e3f10866875 - name: kind value: task resolver: bundles @@ -294,7 +294,7 @@ spec: - name: name value: source-build - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-source-build:0.2@sha256:11029fa30652154f772b44132f8a116382c136a6223e8f9576137f99b9901dcb + value: quay.io/konflux-ci/tekton-catalog/task-source-build:0.2@sha256:6077f293bd810c2642200f6c531d938a917201861535b7f720d37f7ed7c5d88d - name: kind value: task resolver: bundles @@ -323,7 +323,7 @@ spec: - name: name value: sast-shell-check - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-sast-shell-check:0.1@sha256:188a4f6a582ac43d4de46c3998ded3c2a8ee237fb0604d90559a3b6e0aa62b0f + value: quay.io/konflux-ci/tekton-catalog/task-sast-shell-check:0.1@sha256:18d594df21cb92cbc409065b25a863492ea7209e2a34045ced69a24a68ca41d8 - name: kind value: task resolver: bundles @@ -346,7 +346,7 @@ spec: - name: name value: sast-unicode-check - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-sast-unicode-check:0.2@sha256:e4a5215b45b1886a185a9db8ab392f8440c2b0848f76d719885637cf8d2628ed + value: quay.io/konflux-ci/tekton-catalog/task-sast-unicode-check:0.2@sha256:4d5bf6549e42184e462ab7ccfba0153954c65214aa82f319a3215e94e068cded - name: kind value: task resolver: bundles @@ -393,7 +393,7 @@ spec: - name: name value: clair-scan - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-clair-scan:0.2@sha256:878ae247ffc58d95a9ac68e4d658ef91ef039363e03e65a386bc0ead02d9d7d8 + value: quay.io/konflux-ci/tekton-catalog/task-clair-scan:0.2@sha256:68a8fe28527c4469243119a449e2b3a6655f2acac589c069ea6433242da8ed4d - name: kind value: task resolver: bundles @@ -435,7 +435,7 @@ spec: - name: name value: sast-snyk-check - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-sast-snyk-check:0.4@sha256:15a945b054b245f6713845dd6ae813d373c9f9cbac386d7382964f1b70ae3076 + value: quay.io/konflux-ci/tekton-catalog/task-sast-snyk-check:0.4@sha256:d7bdc1b08b384f5db323c88ccd3aab1ea58db1d401ff2b2338f4b984eec44e1b - name: kind value: task resolver: bundles @@ -460,7 +460,7 @@ spec: - name: name value: clamav-scan - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-clamav-scan:0.2@sha256:98d94290d6f21b6e231485326e3629bbcdec75c737b84e05ac9eac78f9a2c8b4 + value: quay.io/konflux-ci/tekton-catalog/task-clamav-scan:0.2@sha256:386c8c3395b44f6eb927dbad72382808b0ae42008f183064ca77cb4cad998442 - name: kind value: task resolver: bundles @@ -480,7 +480,7 @@ spec: - name: name value: apply-tags - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-apply-tags:0.1@sha256:9d9871143ab3a818f681488be6074f5b2f892c1843795a46f6daf3f5487e72d1 + value: quay.io/konflux-ci/tekton-catalog/task-apply-tags:0.1@sha256:1c6f673fe100a49f58aaef62580c8adf0c397790964f4e7bac7fcd3f4d07c92e - name: kind value: task resolver: bundles @@ -521,7 +521,7 @@ spec: - name: name value: rpms-signature-scan - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-rpms-signature-scan:0.2@sha256:297c2d8928aa3b114fcb1ba5d9da8b10226b68fed30706e78a6a5089c6cd30e3 + value: quay.io/konflux-ci/tekton-catalog/task-rpms-signature-scan:0.2@sha256:80a4562d5f86eb6812f00d4e30e94c1ad27ec937735dc29f5a63e9335676b3dc - name: kind value: task resolver: bundles diff --git a/.tekton/image-builder-frontend-push.yaml b/.tekton/image-builder-frontend-push.yaml index 9d1b6a2b..b91d893c 100644 --- a/.tekton/image-builder-frontend-push.yaml +++ b/.tekton/image-builder-frontend-push.yaml @@ -153,7 +153,7 @@ spec: - name: name value: init - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-init:0.2@sha256:7a24924417260b7094541caaedd2853dc8da08d4bb0968f710a400d3e8062063 + value: quay.io/konflux-ci/tekton-catalog/task-init:0.2@sha256:66e90d31e1386bf516fb548cd3e3f0082b5d0234b8b90dbf9e0d4684b70dbe1a - name: kind value: task resolver: bundles @@ -195,7 +195,7 @@ spec: - name: name value: prefetch-dependencies - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-prefetch-dependencies:0.2@sha256:08eec5362aa774347f08a210531a6901020778a08ca921b02758a91b5b2e1357 + value: quay.io/konflux-ci/tekton-catalog/task-prefetch-dependencies:0.2@sha256:8c649b82a9d228018e5a5d9b844df9fd1db63db33c9b5034586af3a766378de7 - name: kind value: task resolver: bundles @@ -239,7 +239,7 @@ spec: - name: name value: buildah - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-buildah:0.4@sha256:c777fdb0947aff3e4ac29a93ed6358c6f7994e6b150154427646788ec773c440 + value: quay.io/konflux-ci/tekton-catalog/task-buildah:0.4@sha256:1799515338c544f6917044398777714c9e0691895231a9d7f456dca75c6f4b65 - name: kind value: task resolver: bundles @@ -271,7 +271,7 @@ spec: - name: name value: build-image-index - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-build-image-index:0.1@sha256:1b357f2ed430d18a009740a1783dd15af70ce1e23dc6254da1a83e9ec595d5be + value: quay.io/konflux-ci/tekton-catalog/task-build-image-index:0.1@sha256:9c95b1fe17db091ae364344ba2006af46648e08486eef1f6fe1b9e3f10866875 - name: kind value: task resolver: bundles @@ -291,7 +291,7 @@ spec: - name: name value: source-build - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-source-build:0.2@sha256:11029fa30652154f772b44132f8a116382c136a6223e8f9576137f99b9901dcb + value: quay.io/konflux-ci/tekton-catalog/task-source-build:0.2@sha256:6077f293bd810c2642200f6c531d938a917201861535b7f720d37f7ed7c5d88d - name: kind value: task resolver: bundles @@ -320,7 +320,7 @@ spec: - name: name value: sast-shell-check - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-sast-shell-check:0.1@sha256:188a4f6a582ac43d4de46c3998ded3c2a8ee237fb0604d90559a3b6e0aa62b0f + value: quay.io/konflux-ci/tekton-catalog/task-sast-shell-check:0.1@sha256:18d594df21cb92cbc409065b25a863492ea7209e2a34045ced69a24a68ca41d8 - name: kind value: task resolver: bundles @@ -343,7 +343,7 @@ spec: - name: name value: sast-unicode-check - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-sast-unicode-check:0.2@sha256:e4a5215b45b1886a185a9db8ab392f8440c2b0848f76d719885637cf8d2628ed + value: quay.io/konflux-ci/tekton-catalog/task-sast-unicode-check:0.2@sha256:4d5bf6549e42184e462ab7ccfba0153954c65214aa82f319a3215e94e068cded - name: kind value: task resolver: bundles @@ -390,7 +390,7 @@ spec: - name: name value: clair-scan - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-clair-scan:0.2@sha256:878ae247ffc58d95a9ac68e4d658ef91ef039363e03e65a386bc0ead02d9d7d8 + value: quay.io/konflux-ci/tekton-catalog/task-clair-scan:0.2@sha256:68a8fe28527c4469243119a449e2b3a6655f2acac589c069ea6433242da8ed4d - name: kind value: task resolver: bundles @@ -432,7 +432,7 @@ spec: - name: name value: sast-snyk-check - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-sast-snyk-check:0.4@sha256:15a945b054b245f6713845dd6ae813d373c9f9cbac386d7382964f1b70ae3076 + value: quay.io/konflux-ci/tekton-catalog/task-sast-snyk-check:0.4@sha256:d7bdc1b08b384f5db323c88ccd3aab1ea58db1d401ff2b2338f4b984eec44e1b - name: kind value: task resolver: bundles @@ -457,7 +457,7 @@ spec: - name: name value: clamav-scan - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-clamav-scan:0.2@sha256:98d94290d6f21b6e231485326e3629bbcdec75c737b84e05ac9eac78f9a2c8b4 + value: quay.io/konflux-ci/tekton-catalog/task-clamav-scan:0.2@sha256:386c8c3395b44f6eb927dbad72382808b0ae42008f183064ca77cb4cad998442 - name: kind value: task resolver: bundles @@ -477,7 +477,7 @@ spec: - name: name value: apply-tags - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-apply-tags:0.1@sha256:9d9871143ab3a818f681488be6074f5b2f892c1843795a46f6daf3f5487e72d1 + value: quay.io/konflux-ci/tekton-catalog/task-apply-tags:0.1@sha256:1c6f673fe100a49f58aaef62580c8adf0c397790964f4e7bac7fcd3f4d07c92e - name: kind value: task resolver: bundles @@ -518,7 +518,7 @@ spec: - name: name value: rpms-signature-scan - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-rpms-signature-scan:0.2@sha256:297c2d8928aa3b114fcb1ba5d9da8b10226b68fed30706e78a6a5089c6cd30e3 + value: quay.io/konflux-ci/tekton-catalog/task-rpms-signature-scan:0.2@sha256:80a4562d5f86eb6812f00d4e30e94c1ad27ec937735dc29f5a63e9335676b3dc - name: kind value: task resolver: bundles From d7cd3ae285208e64e363c8458c1855bd1862869e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 29 May 2025 11:29:36 +0000 Subject: [PATCH 034/331] build(deps): bump @sentry/webpack-plugin from 3.4.0 to 3.5.0 Bumps [@sentry/webpack-plugin](https://github.com/getsentry/sentry-javascript-bundler-plugins) from 3.4.0 to 3.5.0. - [Release notes](https://github.com/getsentry/sentry-javascript-bundler-plugins/releases) - [Changelog](https://github.com/getsentry/sentry-javascript-bundler-plugins/blob/main/CHANGELOG.md) - [Commits](https://github.com/getsentry/sentry-javascript-bundler-plugins/compare/3.4.0...3.5.0) --- updated-dependencies: - dependency-name: "@sentry/webpack-plugin" dependency-version: 3.5.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package-lock.json | 46 +++++++++++++++++++++++----------------------- package.json | 2 +- 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/package-lock.json b/package-lock.json index b8d2a664..01e07f4d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19,7 +19,7 @@ "@redhat-cloud-services/frontend-components-utilities": "6.0.2", "@reduxjs/toolkit": "2.8.2", "@scalprum/react-core": "0.9.5", - "@sentry/webpack-plugin": "3.4.0", + "@sentry/webpack-plugin": "3.5.0", "@unleash/proxy-client-react": "5.0.0", "classnames": "2.5.1", "jwt-decode": "4.0.0", @@ -4553,9 +4553,9 @@ } }, "node_modules/@sentry/babel-plugin-component-annotate": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@sentry/babel-plugin-component-annotate/-/babel-plugin-component-annotate-3.4.0.tgz", - "integrity": "sha512-tSzfc3aE7m0PM0Aj7HBDet5llH9AB9oc+tBQ8AvOqUSnWodLrNCuWeQszJ7mIBovD3figgCU3h0cvI6U5cDtsg==", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/@sentry/babel-plugin-component-annotate/-/babel-plugin-component-annotate-3.5.0.tgz", + "integrity": "sha512-s2go8w03CDHbF9luFGtBHKJp4cSpsQzNVqgIa9Pfa4wnjipvrK6CxVT4icpLA3YO6kg5u622Yoa5GF3cJdippw==", "license": "MIT", "engines": { "node": ">= 14" @@ -4581,13 +4581,13 @@ } }, "node_modules/@sentry/bundler-plugin-core": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@sentry/bundler-plugin-core/-/bundler-plugin-core-3.4.0.tgz", - "integrity": "sha512-X1Q41AsQ6xcT6hB4wYmBDBukndKM/inT4IsR7pdKLi7ICpX2Qq6lisamBAEPCgEvnLpazSFguaiC0uiwMKAdqw==", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/@sentry/bundler-plugin-core/-/bundler-plugin-core-3.5.0.tgz", + "integrity": "sha512-zDzPrhJqAAy2VzV4g540qAZH4qxzisstK2+NIJPZUUKztWRWUV2cMHsyUtdctYgloGkLyGpZJBE3RE6dmP/xqQ==", "license": "MIT", "dependencies": { "@babel/core": "^7.18.5", - "@sentry/babel-plugin-component-annotate": "3.4.0", + "@sentry/babel-plugin-component-annotate": "3.5.0", "@sentry/cli": "2.42.2", "dotenv": "^16.3.1", "find-up": "^5.0.0", @@ -4850,12 +4850,12 @@ } }, "node_modules/@sentry/webpack-plugin": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@sentry/webpack-plugin/-/webpack-plugin-3.4.0.tgz", - "integrity": "sha512-i+nAxxniJV5ovijojjTF5n+Yj08Xk8my+vm8+oo0C0I7xcnI2gOKft6B0sJOq01CNbo85X5m/3/edL0PKoWE9w==", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/@sentry/webpack-plugin/-/webpack-plugin-3.5.0.tgz", + "integrity": "sha512-xvclj0QY2HyU7uJLzOlHSrZQBDwfnGKJxp8mmlU4L7CwmK+8xMCqlO7tYZoqE4K/wU3c2xpXql70x8qmvNMxzQ==", "license": "MIT", "dependencies": { - "@sentry/bundler-plugin-core": "3.4.0", + "@sentry/bundler-plugin-core": "3.5.0", "unplugin": "1.0.1", "uuid": "^9.0.0" }, @@ -22252,9 +22252,9 @@ } }, "@sentry/babel-plugin-component-annotate": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@sentry/babel-plugin-component-annotate/-/babel-plugin-component-annotate-3.4.0.tgz", - "integrity": "sha512-tSzfc3aE7m0PM0Aj7HBDet5llH9AB9oc+tBQ8AvOqUSnWodLrNCuWeQszJ7mIBovD3figgCU3h0cvI6U5cDtsg==" + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/@sentry/babel-plugin-component-annotate/-/babel-plugin-component-annotate-3.5.0.tgz", + "integrity": "sha512-s2go8w03CDHbF9luFGtBHKJp4cSpsQzNVqgIa9Pfa4wnjipvrK6CxVT4icpLA3YO6kg5u622Yoa5GF3cJdippw==" }, "@sentry/browser": { "version": "7.120.3", @@ -22272,12 +22272,12 @@ } }, "@sentry/bundler-plugin-core": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@sentry/bundler-plugin-core/-/bundler-plugin-core-3.4.0.tgz", - "integrity": "sha512-X1Q41AsQ6xcT6hB4wYmBDBukndKM/inT4IsR7pdKLi7ICpX2Qq6lisamBAEPCgEvnLpazSFguaiC0uiwMKAdqw==", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/@sentry/bundler-plugin-core/-/bundler-plugin-core-3.5.0.tgz", + "integrity": "sha512-zDzPrhJqAAy2VzV4g540qAZH4qxzisstK2+NIJPZUUKztWRWUV2cMHsyUtdctYgloGkLyGpZJBE3RE6dmP/xqQ==", "requires": { "@babel/core": "^7.18.5", - "@sentry/babel-plugin-component-annotate": "3.4.0", + "@sentry/babel-plugin-component-annotate": "3.5.0", "@sentry/cli": "2.42.2", "dotenv": "^16.3.1", "find-up": "^5.0.0", @@ -22418,11 +22418,11 @@ } }, "@sentry/webpack-plugin": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@sentry/webpack-plugin/-/webpack-plugin-3.4.0.tgz", - "integrity": "sha512-i+nAxxniJV5ovijojjTF5n+Yj08Xk8my+vm8+oo0C0I7xcnI2gOKft6B0sJOq01CNbo85X5m/3/edL0PKoWE9w==", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/@sentry/webpack-plugin/-/webpack-plugin-3.5.0.tgz", + "integrity": "sha512-xvclj0QY2HyU7uJLzOlHSrZQBDwfnGKJxp8mmlU4L7CwmK+8xMCqlO7tYZoqE4K/wU3c2xpXql70x8qmvNMxzQ==", "requires": { - "@sentry/bundler-plugin-core": "3.4.0", + "@sentry/bundler-plugin-core": "3.5.0", "unplugin": "1.0.1", "uuid": "^9.0.0" }, diff --git a/package.json b/package.json index 2d542fd9..7dab8333 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,7 @@ "@redhat-cloud-services/frontend-components-utilities": "6.0.2", "@reduxjs/toolkit": "2.8.2", "@scalprum/react-core": "0.9.5", - "@sentry/webpack-plugin": "3.4.0", + "@sentry/webpack-plugin": "3.5.0", "@unleash/proxy-client-react": "5.0.0", "classnames": "2.5.1", "jwt-decode": "4.0.0", From 56b22eee538b86adcb108db0296931916e9036a1 Mon Sep 17 00:00:00 2001 From: schutzbot Date: Wed, 11 Jun 2025 08:36:31 +0000 Subject: [PATCH 035/331] Post release version bump [skip ci] --- cockpit/cockpit-image-builder.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cockpit/cockpit-image-builder.spec b/cockpit/cockpit-image-builder.spec index 2a7f96ef..3fc15c8d 100644 --- a/cockpit/cockpit-image-builder.spec +++ b/cockpit/cockpit-image-builder.spec @@ -1,5 +1,5 @@ Name: cockpit-image-builder -Version: 69 +Version: 70 Release: 1%{?dist} Summary: Image builder plugin for Cockpit From 34c3dc614df5b21e1d666ba3ee756e8e3818627b Mon Sep 17 00:00:00 2001 From: Sanne Raymaekers Date: Tue, 10 Jun 2025 15:50:28 +0200 Subject: [PATCH 036/331] .tekton: support merge queues This lets konflux listen for push events to merge queue branches. See https://konflux-ci.dev/docs/patterns/github-merge-queues/. --- .tekton/image-builder-frontend-pull-request.yaml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.tekton/image-builder-frontend-pull-request.yaml b/.tekton/image-builder-frontend-pull-request.yaml index b7ea302d..098d717b 100644 --- a/.tekton/image-builder-frontend-pull-request.yaml +++ b/.tekton/image-builder-frontend-pull-request.yaml @@ -7,8 +7,7 @@ metadata: build.appstudio.redhat.com/pull_request_number: '{{pull_request_number}}' build.appstudio.redhat.com/target_branch: '{{target_branch}}' pipelinesascode.tekton.dev/max-keep-runs: "3" - pipelinesascode.tekton.dev/on-cel-expression: event == "pull_request" && target_branch - == "main" + pipelinesascode.tekton.dev/on-cel-expression: (event == "pull_request" && target_branch == "main") || (event == "push" && target_branch.startsWith("gh-readonly-queue/main/")) creationTimestamp: null labels: appstudio.openshift.io/application: insights-image-builder From 2b37ee998e1ad0bda0e60762574d257fd7285d33 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anna=20V=C3=ADtov=C3=A1?= Date: Wed, 11 Jun 2025 14:49:43 +0200 Subject: [PATCH 037/331] Blueprints: disable analytics for on-prem delete Analytics broke on prem deletion of the blueprint. --- src/Components/Blueprints/DeleteBlueprintModal.tsx | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/Components/Blueprints/DeleteBlueprintModal.tsx b/src/Components/Blueprints/DeleteBlueprintModal.tsx index 503ea6ab..75908df6 100644 --- a/src/Components/Blueprints/DeleteBlueprintModal.tsx +++ b/src/Components/Blueprints/DeleteBlueprintModal.tsx @@ -70,10 +70,12 @@ export const DeleteBlueprintModal: React.FunctionComponent< }); const handleDelete = async () => { if (selectedBlueprintId) { - analytics.track(`${AMPLITUDE_MODULE_NAME} - Blueprint Deleted`, { - module: AMPLITUDE_MODULE_NAME, - account_id: userData?.identity.internal?.account_id || 'Not found', - }); + if (!process.env.IS_ON_PREMISE) { + analytics.track(`${AMPLITUDE_MODULE_NAME} - Blueprint Deleted`, { + module: AMPLITUDE_MODULE_NAME, + account_id: userData?.identity.internal?.account_id || 'Not found', + }); + } setShowDeleteModal(false); await deleteBlueprint({ id: selectedBlueprintId }); dispatch(setBlueprintId(undefined)); From c29cee781ff2ae906445ec74688074b355972646 Mon Sep 17 00:00:00 2001 From: Sanne Raymaekers Date: Wed, 11 Jun 2025 15:25:11 +0200 Subject: [PATCH 038/331] .github: run test workflows on merge_group Make sure they work with merge queues. --- .github/workflows/dev-checks.yml | 1 + .github/workflows/playwright.yml | 1 + .github/workflows/pr_best_practices.yml | 1 + 3 files changed, 3 insertions(+) diff --git a/.github/workflows/dev-checks.yml b/.github/workflows/dev-checks.yml index 9ddff1c5..d2c6cff8 100644 --- a/.github/workflows/dev-checks.yml +++ b/.github/workflows/dev-checks.yml @@ -5,6 +5,7 @@ on: branches: [ "main" ] push: branches: [ "main" ] + merge_group: jobs: dev-check: diff --git a/.github/workflows/playwright.yml b/.github/workflows/playwright.yml index 93d1cedc..735d99cf 100644 --- a/.github/workflows/playwright.yml +++ b/.github/workflows/playwright.yml @@ -4,6 +4,7 @@ on: pull_request: types: [opened, reopened, synchronize, labeled, unlabeled] workflow_dispatch: + merge_group: jobs: playwright-tests: diff --git a/.github/workflows/pr_best_practices.yml b/.github/workflows/pr_best_practices.yml index d7a1b0c4..f07729c6 100644 --- a/.github/workflows/pr_best_practices.yml +++ b/.github/workflows/pr_best_practices.yml @@ -6,6 +6,7 @@ on: types: [opened, synchronize, reopened, edited] issue_comment: types: [created] + merge_group: jobs: pr-best-practices: From 3dd67c8f3993b7873f58554f168e21adc707f0eb Mon Sep 17 00:00:00 2001 From: Gianluca Zuccarelli Date: Tue, 29 Apr 2025 12:38:05 +0000 Subject: [PATCH 039/331] CloudStatus: disable analytics for on-prem Analytics was enabled for on-prem which broke the images table. This commit disables the analytics for the on-prem frontend. --- src/Components/ImagesTable/Status.tsx | 50 +++++++++++++++------------ 1 file changed, 28 insertions(+), 22 deletions(-) diff --git a/src/Components/ImagesTable/Status.tsx b/src/Components/ImagesTable/Status.tsx index b6aa0aff..7ff7ee31 100644 --- a/src/Components/ImagesTable/Status.tsx +++ b/src/Components/ImagesTable/Status.tsx @@ -85,13 +85,15 @@ export const AwsDetailsStatus = ({ compose }: ComposeStatusPropTypes) => { switch (data?.image_status.status) { case 'failure': { - analytics.track(`${AMPLITUDE_MODULE_NAME} - Image Created`, { - module: AMPLITUDE_MODULE_NAME, - error: true, - error_id: data.image_status.error?.id, - error_details: data.image_status.error?.details, - error_reason: data.image_status.error?.reason, - }); + if (!process.env.IS_ON_PREMISE) { + analytics.track(`${AMPLITUDE_MODULE_NAME} - Image Created`, { + module: AMPLITUDE_MODULE_NAME, + error: true, + error_id: data.image_status.error?.id, + error_details: data.image_status.error?.details, + error_reason: data.image_status.error?.reason, + }); + } return ( { switch (data?.image_status.status) { case 'failure': { - analytics.track(`${AMPLITUDE_MODULE_NAME} - Image Created`, { - module: AMPLITUDE_MODULE_NAME, - error: true, - error_id: data.image_status.error?.id, - error_details: data.image_status.error?.details, - error_reason: data.image_status.error?.reason, - account_id: userData?.identity.internal?.account_id || 'Not found', - }); + if (!process.env.IS_ON_PREMISE) { + analytics.track(`${AMPLITUDE_MODULE_NAME} - Image Created`, { + module: AMPLITUDE_MODULE_NAME, + error: true, + error_id: data.image_status.error?.id, + error_details: data.image_status.error?.details, + error_reason: data.image_status.error?.reason, + account_id: userData?.identity.internal?.account_id || 'Not found', + }); + } return ( { switch (status.image_status.status) { case 'failure': { - analytics.track(`${AMPLITUDE_MODULE_NAME} - Image Created`, { - module: AMPLITUDE_MODULE_NAME, - error: true, - error_id: status.image_status.error?.id, - error_details: status.image_status.error?.details, - error_reason: status.image_status.error?.reason, - }); + if (!process.env.IS_ON_PREMISE) { + analytics.track(`${AMPLITUDE_MODULE_NAME} - Image Created`, { + module: AMPLITUDE_MODULE_NAME, + error: true, + error_id: status.image_status.error?.id, + error_details: status.image_status.error?.details, + error_reason: status.image_status.error?.reason, + }); + } return ( Date: Wed, 4 Jun 2025 17:58:02 +0100 Subject: [PATCH 040/331] sharedComponents: tidy up image-builder-header This commit simplifies and tidies up the shared ImageBuilderHeader component by removing some of the `Flex` and `FlexItem` components. Instead we can use the `actionComponents` from the `PageHeader` component which takes care of some of the flex logic for us. --- .../sharedComponents/ImageBuilderHeader.tsx | 164 ++++++++---------- 1 file changed, 73 insertions(+), 91 deletions(-) diff --git a/src/Components/sharedComponents/ImageBuilderHeader.tsx b/src/Components/sharedComponents/ImageBuilderHeader.tsx index 95119f2f..6d2235ed 100644 --- a/src/Components/sharedComponents/ImageBuilderHeader.tsx +++ b/src/Components/sharedComponents/ImageBuilderHeader.tsx @@ -1,13 +1,6 @@ import React, { useState } from 'react'; -import { - Alert, - Button, - Popover, - Content, - Flex, - FlexItem, -} from '@patternfly/react-core'; +import { Button, Popover, Content, Flex, Alert } from '@patternfly/react-core'; import { ExternalLinkAltIcon, HelpIcon } from '@patternfly/react-icons'; // eslint-disable-next-line rulesdir/disallow-fec-relative-imports import { @@ -31,11 +24,6 @@ import './ImageBuilderHeader.scss'; import { useFlagWithEphemDefault } from '../../Utilities/useGetEnvironment'; import { ImportBlueprintModal } from '../Blueprints/ImportBlueprintModal'; -type ImageBuilderHeaderPropTypes = { - activeTab?: number; - inWizard?: boolean; -}; - const AboutImageBuilderPopover = () => { return ( { ); }; +type ImageBuilderHeaderPropTypes = { + activeTab?: number; + inWizard?: boolean; +}; + export const ImageBuilderHeader = ({ activeTab, inWizard, @@ -113,89 +106,78 @@ export const ImageBuilderHeader = ({ /> )} - - - - Images - - - } - /> - - {!inWizard && ( + - - - - - {importExportFlag && ( - - )} - + Images + - )} - - {!isOnBlueprintsTab && !inWizard && ( - - - Upcoming decommission of hosted Edge Management service - } - className="pf-v5-u-mt-sm pf-v5-u-mb-sm" - > - - - As of July 31, 2025, the hosted edge management service will - no longer be supported. This means that pushing image - updates to Immutable (OSTree) systems using the Hybrid Cloud - Console will be discontinued. For an alternative way to - manage edge systems, customers are encouraged to explore Red - Hat Edge Manager (RHEM). - - + } + actionsContent={ + <> + {!inWizard && ( + + + {importExportFlag && ( - - - - - + )} + + )} + + } + /> + {!isOnBlueprintsTab && !inWizard && !process.env.IS_ON_PREMISE && ( + Upcoming decommission of hosted Edge Management service} + className="pf-v6-u-mt-sm pf-v6-u-mb-sm" + > + + + As of July 31, 2025, the hosted edge management service will no + longer be supported. This means that pushing image updates to + Immutable (OSTree) systems using the Hybrid Cloud Console will + be discontinued. For an alternative way to manage edge systems, + customers are encouraged to explore Red Hat Edge Manager (RHEM). + + + + + + )} From e7bf1d35402ba395661fa384a5e8555423761b98 Mon Sep 17 00:00:00 2001 From: Gianluca Zuccarelli Date: Thu, 5 Jun 2025 10:49:55 +0000 Subject: [PATCH 041/331] cockpit: page section wrapper for entrypoint Wrap the AppCockpit entrypoint in `Page` & `PageSection` wrappers so that it is more consistent with other cockpit elements. --- cockpit/public/index.html | 18 +++++++++--------- src/AppCockpit.scss | 18 ++++++++++++++++++ src/AppCockpit.tsx | 8 +++++++- 3 files changed, 34 insertions(+), 10 deletions(-) create mode 100644 src/AppCockpit.scss diff --git a/cockpit/public/index.html b/cockpit/public/index.html index 8deb3f10..7ba672f0 100644 --- a/cockpit/public/index.html +++ b/cockpit/public/index.html @@ -1,15 +1,15 @@ - + - - + + Image-Builder - - - -
- - + + + + +
+ diff --git a/src/AppCockpit.scss b/src/AppCockpit.scss new file mode 100644 index 00000000..01d91e40 --- /dev/null +++ b/src/AppCockpit.scss @@ -0,0 +1,18 @@ +// Override as PF Page doesn't allow empty masthead and sidebar +@media (min-width: 75rem) { + .pf-v6-c-page.no-masthead-sidebar { + /* custom class to scope this style to a specific page component instance */ + --pf-v6-c-page__main-container--GridArea: var( + --pf-v6-c-page--masthead--main-container--GridArea + ); + } +} + +.pf-v6-c-page__main-section { + padding-inline: 0; + padding-block-start: 0; +} + +.pf-v6-c-page__main > section.pf-v6-c-page__main-section:not(.pf-m-padding) { + padding-inline: 0; +} diff --git a/src/AppCockpit.tsx b/src/AppCockpit.tsx index 412f9fb6..02818817 100644 --- a/src/AppCockpit.tsx +++ b/src/AppCockpit.tsx @@ -3,11 +3,13 @@ import '@patternfly/patternfly/patternfly-addons.css'; import React from 'react'; +import { Page, PageSection } from '@patternfly/react-core'; import NotificationsPortal from '@redhat-cloud-services/frontend-components-notifications/NotificationPortal'; import { createRoot } from 'react-dom/client'; import { Provider } from 'react-redux'; import { HashRouter } from 'react-router-dom'; +import './AppCockpit.scss'; import { NotReady, RequireAdmin } from './Components/Cockpit'; import { Router } from './Router'; import { onPremStore as store } from './store'; @@ -37,7 +39,11 @@ const Application = () => { }; const ImageBuilder = () => ( - + + + + + ); From 84bc0f92a055bc0e28eef87b1153b1d74e706526 Mon Sep 17 00:00:00 2001 From: Gianluca Zuccarelli Date: Thu, 5 Jun 2025 17:06:08 +0000 Subject: [PATCH 042/331] cockpit: fix fonts The fonts weren't getting loaded properly and cockpit was falling back to `Helvetica`. This was particularly noticeable on the `ReviewStep` of the `CreateImageWizard`. --- cockpit/webpack.config.ts | 10 +++++++- src/AppCockpit.scss | 52 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 61 insertions(+), 1 deletion(-) diff --git a/cockpit/webpack.config.ts b/cockpit/webpack.config.ts index 00a170fd..b2bbcea4 100644 --- a/cockpit/webpack.config.ts +++ b/cockpit/webpack.config.ts @@ -75,7 +75,15 @@ module.exports = { }, { test: /\.scss$/, - use: [MiniCssExtractPlugin.loader, 'css-loader', 'sass-loader'], + use: [ + MiniCssExtractPlugin.loader, + + { + loader: 'css-loader', + options: { url: false }, + }, + 'sass-loader', + ], }, ], }, diff --git a/src/AppCockpit.scss b/src/AppCockpit.scss index 01d91e40..ae8b9216 100644 --- a/src/AppCockpit.scss +++ b/src/AppCockpit.scss @@ -1,3 +1,55 @@ +@font-face { + font-family: 'Red Hat Text'; + font-style: normal; + font-weight: 400 500; + src: url('/cockpit/static/fonts/RedHatText/RedHatTextVF.woff2') + format('woff2-variations'); + font-display: fallback; +} + +@font-face { + font-family: 'Red Hat Text'; + font-style: italic; + font-weight: 400 500; + src: url('/cockpit/static/fonts/RedHatText/RedHatTextVF-Italic.woff2') + format('woff2-variations'); + font-display: fallback; +} + +@font-face { + font-family: 'Red Hat Display'; + font-style: normal; + font-weight: 400 700; + src: url('/cockpit/static/fonts/RedHatDisplay/RedHatDisplayVF.woff2') + format('woff2-variations'); + font-display: fallback; +} + +@font-face { + font-family: 'Red Hat Display'; + font-style: italic; + font-weight: 400 700; + src: url('/cockpit/static/fonts/RedHatDisplay/RedHatDisplayVF-Italic.woff2') + format('woff2-variations'); + font-display: fallback; +} + +@font-face { + font-family: RedHatText; + font-style: normal; + font-weight: 400; + src: url('/cockpit/static/fonts/RedHatText-Regular.woff2') format('woff2'); + font-display: fallback; +} + +@font-face { + font-family: RedHatText; + font-style: normal; + font-weight: 700; + src: url('/cockpit/static/fonts/RedHatText-Medium.woff2') format('woff2'); + font-display: fallback; +} + // Override as PF Page doesn't allow empty masthead and sidebar @media (min-width: 75rem) { .pf-v6-c-page.no-masthead-sidebar { From 4932ba6909a27654cbd7cdfbdc547d869fa9c0d1 Mon Sep 17 00:00:00 2001 From: Gianluca Zuccarelli Date: Thu, 12 Jun 2025 08:17:15 +0000 Subject: [PATCH 043/331] Wizard: remove public clouds if none available Fixes HMS-6136 --- .../steps/ImageOutput/TargetEnvironment.tsx | 117 ++++++++++-------- 1 file changed, 64 insertions(+), 53 deletions(-) diff --git a/src/Components/CreateImageWizard/steps/ImageOutput/TargetEnvironment.tsx b/src/Components/CreateImageWizard/steps/ImageOutput/TargetEnvironment.tsx index 9ba9a9c3..6f19745f 100644 --- a/src/Components/CreateImageWizard/steps/ImageOutput/TargetEnvironment.tsx +++ b/src/Components/CreateImageWizard/steps/ImageOutput/TargetEnvironment.tsx @@ -150,66 +150,77 @@ const TargetEnvironment = () => { /> ); + const publicCloudsSupported = () => { + return ( + supportedEnvironments?.includes('aws') || + supportedEnvironments?.includes('gcp') || + supportedEnvironments?.includes('azure') || + supportedEnvironments?.includes('oci') + ); + }; + return ( - Public cloud}> - - {supportedEnvironments?.includes('aws') && ( - handleToggleEnvironment('aws')} - onMouseEnter={() => prefetchSources({ provider: 'aws' })} - isSelected={environments.includes('aws')} - /> - )} - {supportedEnvironments?.includes('gcp') && ( - handleToggleEnvironment('gcp')} - onMouseEnter={() => prefetchSources({ provider: 'gcp' })} - isSelected={environments.includes('gcp')} - /> - )} - {supportedEnvironments?.includes('azure') && ( - handleToggleEnvironment('azure')} - onMouseEnter={() => prefetchSources({ provider: 'azure' })} - isSelected={environments.includes('azure')} - /> - )} - {supportedEnvironments?.includes('oci') && - showOracleUnavailableWarning && ( - Oracle Cloud support is temporarily unavailable
- } - > -
{ociTile}
- + {publicCloudsSupported() && ( + Public cloud}> + + {supportedEnvironments?.includes('aws') && ( + handleToggleEnvironment('aws')} + onMouseEnter={() => prefetchSources({ provider: 'aws' })} + isSelected={environments.includes('aws')} + /> )} - {supportedEnvironments?.includes('oci') && - !showOracleUnavailableWarning && - ociTile} - - + {supportedEnvironments?.includes('gcp') && ( + handleToggleEnvironment('gcp')} + onMouseEnter={() => prefetchSources({ provider: 'gcp' })} + isSelected={environments.includes('gcp')} + /> + )} + {supportedEnvironments?.includes('azure') && ( + handleToggleEnvironment('azure')} + onMouseEnter={() => prefetchSources({ provider: 'azure' })} + isSelected={environments.includes('azure')} + /> + )} + {supportedEnvironments?.includes('oci') && + showOracleUnavailableWarning && ( + Oracle Cloud support is temporarily unavailable
+ } + > +
{ociTile}
+ + )} + {supportedEnvironments?.includes('oci') && + !showOracleUnavailableWarning && + ociTile} + + + )} {supportedEnvironments?.includes('vsphere') && ( <> Date: Fri, 6 Jun 2025 11:31:51 +0000 Subject: [PATCH 044/331] ImageTable: fix blueprint list cards The blueprint cards were missing their borders, making it unclear when the item was selected or not. --- src/AppCockpit.scss | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/AppCockpit.scss b/src/AppCockpit.scss index ae8b9216..90624edf 100644 --- a/src/AppCockpit.scss +++ b/src/AppCockpit.scss @@ -68,3 +68,11 @@ .pf-v6-c-page__main > section.pf-v6-c-page__main-section:not(.pf-m-padding) { padding-inline: 0; } + +.pf-v6-c-card { + &.pf-m-clickable::before, + &.pf-m-selectable::before { + border: var(--pf-v6-c-card--BorderColor) var(--pf-v6-c-card--BorderStyle) + var(--pf-v6-c-card--BorderWidth) !important; + } +} From 7f5013ef07d0bdaf4c6333e13dd0fab5aaf309bc Mon Sep 17 00:00:00 2001 From: Gianluca Zuccarelli Date: Thu, 12 Jun 2025 08:43:11 +0000 Subject: [PATCH 045/331] ReviewStep: fix alignment Patternfly6 handles the grid for description lists slightly differntly to Patternfly5. Add custom css to change the behaviour to match PF5 and get the items in the review step to align properly --- .../steps/FileSystem/FileSystemTable.tsx | 2 +- .../components/OscapProfileInformation.tsx | 4 +- .../steps/Review/ReviewStep.scss | 14 ++ .../steps/Review/ReviewStep.tsx | 1 + .../steps/Review/ReviewStepTextLists.tsx | 122 ++++++++++++------ 5 files changed, 99 insertions(+), 44 deletions(-) create mode 100644 src/Components/CreateImageWizard/steps/Review/ReviewStep.scss diff --git a/src/Components/CreateImageWizard/steps/FileSystem/FileSystemTable.tsx b/src/Components/CreateImageWizard/steps/FileSystem/FileSystemTable.tsx index 7f8f2af5..f040a23b 100644 --- a/src/Components/CreateImageWizard/steps/FileSystem/FileSystemTable.tsx +++ b/src/Components/CreateImageWizard/steps/FileSystem/FileSystemTable.tsx @@ -58,7 +58,7 @@ export const MinimumSizePopover = () => { variant="plain" aria-label="File system configuration info" aria-describedby="file-system-configuration-info" - className="pf-v6-u-p-0" + className="popover-button pf-v6-u-p-0" /> ); diff --git a/src/Components/CreateImageWizard/steps/Oscap/components/OscapProfileInformation.tsx b/src/Components/CreateImageWizard/steps/Oscap/components/OscapProfileInformation.tsx index a1fb814c..71e15c51 100644 --- a/src/Components/CreateImageWizard/steps/Oscap/components/OscapProfileInformation.tsx +++ b/src/Components/CreateImageWizard/steps/Oscap/components/OscapProfileInformation.tsx @@ -78,7 +78,7 @@ export const OscapProfileInformation = ({ {isSuccessOscapProfileInfo && ( <> - + - + {
)} - + Release {releases.get(distribution)} - Architecture + + Architecture + {arch} @@ -147,7 +149,7 @@ export const FSCList = () => { return ( - + Configuration type @@ -232,7 +234,7 @@ export const TargetEnvAWSList = () => { return ( {targetOptions.aws} - + Image type @@ -241,15 +243,19 @@ export const TargetEnvAWSList = () => {
- Shared to account + + Shared to account + {awsAccountId} - + {awsShareMethod === 'sources' ? 'Source' : null} {isSuccess && awsShareMethod === 'sources' ? source?.name : null} - Default region + + Default region + us-east-1
@@ -263,7 +269,7 @@ export const TargetEnvGCPList = () => { return ( {targetOptions.gcp} - + Image type @@ -275,7 +281,12 @@ export const TargetEnvGCPList = () => { <> {sharedMethod === 'withInsights' ? ( <> - Shared with + + Shared with + Red Hat Insights only
@@ -283,7 +294,12 @@ export const TargetEnvGCPList = () => { ) : ( <> - Account type + + Account type + {accountType === 'group' ? 'Google group' @@ -293,7 +309,10 @@ export const TargetEnvGCPList = () => { ? 'Google account' : 'Domain'} - + {accountType === 'domain' ? 'Domain' : 'Principal'} @@ -319,7 +338,7 @@ export const TargetEnvAzureList = () => { return ( {targetOptions.azure} - + Image type @@ -330,7 +349,12 @@ export const TargetEnvAzureList = () => { {shareMethod === 'sources' && isSuccessAzureSources && ( <> - Azure Source + + Azure Source + { rawAzureSources?.data?.find( @@ -342,9 +366,19 @@ export const TargetEnvAzureList = () => { )} {shareMethod === 'manual' && ( <> - Azure tenant ID + + Azure tenant ID + {tenantId} - Subscription ID + + Subscription ID + {subscriptionId} )} @@ -359,7 +393,7 @@ export const TargetEnvOciList = () => { return ( {targetOptions.oci} - + Object Storage URL @@ -374,7 +408,7 @@ export const TargetEnvOciList = () => { export const TargetEnvOtherList = () => { return ( <> - + Image type @@ -462,7 +496,7 @@ export const ContentList = () => { return ( <> - + <> { variant="link" isInline aria-label="Snapshot method" - className="pf-v6-u-p-0" + className="popover-button pf-v6-u-p-0" isDisabled={noRepositoriesSelected || isLoading || isError} isLoading={isLoading} > @@ -511,7 +545,9 @@ export const ContentList = () => { )} - Custom repositories + + Custom repositories + {customRepositories?.length + recommendedRepositories.length > 0 ? ( { @@ -578,7 +614,7 @@ export const ContentList = () => { export const RegisterLaterList = () => { return ( - + Registration type @@ -593,7 +629,7 @@ export const RegisterLaterList = () => { export const RegisterSatelliteList = () => { return ( - + Register Satellite @@ -617,7 +653,7 @@ export const RegisterNowList = () => { return ( <> - + Registration type @@ -647,7 +683,7 @@ export const RegisterNowList = () => { )} - + Activation key @@ -676,7 +712,7 @@ export const DetailsList = () => { return ( - + {blueprintName && ( <> { const ntpServers = useAppSelector(selectNtpServers); return ( - - + <> + Timezone @@ -730,7 +766,7 @@ export const TimezoneList = () => { {ntpServers && ntpServers.length > 0 ? ntpServers.join(', ') : 'None'} - + ); }; @@ -740,29 +776,33 @@ export const UsersList = () => { return ( {users.map((user) => ( - + Username - + {user.name ? user.name : 'None'} Password - + {user.password || user.hasPassword ? '●'.repeat(8) : 'None'} SSH key - + {user.ssh_key ? user.ssh_key : 'None'} Administrator - + {user.isAdministrator ? 'True' : 'False'} @@ -777,7 +817,7 @@ export const LocaleList = () => { return ( - + Languages @@ -800,7 +840,7 @@ export const HostnameList = () => { return ( - + Hostname @@ -817,7 +857,7 @@ export const KernelList = () => { return ( - + Name @@ -846,7 +886,7 @@ export const FirewallList = () => { return ( - + Ports @@ -897,7 +937,7 @@ export const ServicesList = () => { return ( - + Disabled @@ -944,7 +984,7 @@ export const FirstBootList = () => { return ( - + First boot script From 54b6877f955c89b999e9452a74809f063e5e19ff Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 11 Jun 2025 04:45:21 +0000 Subject: [PATCH 046/331] build(deps-dev): bump @babel/core from 7.26.10 to 7.27.4 Bumps [@babel/core](https://github.com/babel/babel/tree/HEAD/packages/babel-core) from 7.26.10 to 7.27.4. - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md) - [Commits](https://github.com/babel/babel/commits/v7.27.4/packages/babel-core) --- updated-dependencies: - dependency-name: "@babel/core" dependency-version: 7.27.4 dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package-lock.json | 178 +++++++++++++++++++++++----------------------- package.json | 2 +- 2 files changed, 90 insertions(+), 90 deletions(-) diff --git a/package-lock.json b/package-lock.json index 01e07f4d..19b6ef62 100644 --- a/package-lock.json +++ b/package-lock.json @@ -32,7 +32,7 @@ "redux-promise-middleware": "6.2.0" }, "devDependencies": { - "@babel/core": "7.26.10", + "@babel/core": "7.27.4", "@babel/preset-env": "7.27.2", "@babel/preset-react": "7.27.1", "@babel/preset-typescript": "7.27.0", @@ -268,21 +268,21 @@ } }, "node_modules/@babel/core": { - "version": "7.26.10", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.10.tgz", - "integrity": "sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==", + "version": "7.27.4", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.27.4.tgz", + "integrity": "sha512-bXYxrXFubeYdvB0NhD/NBB3Qi6aZeV20GOWVI47t2dkecCEoneR4NPVcb7abpXDEvejgrUfFtG6vG/zxAKmg+g==", "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.26.2", - "@babel/generator": "^7.26.10", - "@babel/helper-compilation-targets": "^7.26.5", - "@babel/helper-module-transforms": "^7.26.0", - "@babel/helpers": "^7.26.10", - "@babel/parser": "^7.26.10", - "@babel/template": "^7.26.9", - "@babel/traverse": "^7.26.10", - "@babel/types": "^7.26.10", + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.27.3", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-module-transforms": "^7.27.3", + "@babel/helpers": "^7.27.4", + "@babel/parser": "^7.27.4", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.27.4", + "@babel/types": "^7.27.3", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -315,13 +315,13 @@ } }, "node_modules/@babel/generator": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.1.tgz", - "integrity": "sha512-UnJfnIpc/+JO0/+KRVQNGU+y5taA5vCbwN8+azkX6beii/ZF+enZJSOKo11ZSzGJjlNfJHfQtmQT8H+9TXPG2w==", + "version": "7.27.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.5.tgz", + "integrity": "sha512-ZGhA37l0e/g2s1Cnzdix0O3aLYm66eF8aufiVteOgnwxgnRP8GoyMj7VWsgWnQbVKXyge7hqrFh2K2TQM6t1Hw==", "license": "MIT", "dependencies": { - "@babel/parser": "^7.27.1", - "@babel/types": "^7.27.1", + "@babel/parser": "^7.27.5", + "@babel/types": "^7.27.3", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" @@ -442,14 +442,14 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.27.1.tgz", - "integrity": "sha512-9yHn519/8KvTU5BjTVEEeIM3w9/2yXNKoD82JifINImhpKkARMJKPP59kLo+BafpdN5zgNeIcS4jsGDmd3l58g==", + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.27.3.tgz", + "integrity": "sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==", "license": "MIT", "dependencies": { "@babel/helper-module-imports": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1", - "@babel/traverse": "^7.27.1" + "@babel/traverse": "^7.27.3" }, "engines": { "node": ">=6.9.0" @@ -574,25 +574,25 @@ } }, "node_modules/@babel/helpers": { - "version": "7.26.10", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.10.tgz", - "integrity": "sha512-UPYc3SauzZ3JGgj87GgZ89JVdC5dj0AoetR5Bw6wj4niittNyFh6+eOGonYvJ1ao6B8lEa3Q3klS7ADZ53bc5g==", + "version": "7.27.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.6.tgz", + "integrity": "sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==", "license": "MIT", "dependencies": { - "@babel/template": "^7.26.9", - "@babel/types": "^7.26.10" + "@babel/template": "^7.27.2", + "@babel/types": "^7.27.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.1.tgz", - "integrity": "sha512-I0dZ3ZpCrJ1c04OqlNsQcKiZlsrXf/kkE4FXzID9rIOYICsAbA8mMDzhW/luRNAHdCNt7os/u8wenklZDlUVUQ==", + "version": "7.27.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.5.tgz", + "integrity": "sha512-OsQd175SxWkGlzbny8J3K8TnnDD0N3lrIUtB92xwyRpzaenGZhxDvxN/JgU00U3CDZNj9tPuDJ5H0WS4Nt3vKg==", "license": "MIT", "dependencies": { - "@babel/types": "^7.27.1" + "@babel/types": "^7.27.3" }, "bin": { "parser": "bin/babel-parser.js" @@ -1880,13 +1880,13 @@ } }, "node_modules/@babel/template": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.1.tgz", - "integrity": "sha512-Fyo3ghWMqkHHpHQCoBs2VnYjR4iWFFjguTDEqA5WgZDOrFesVjMhMM2FSqTKSoUSDO1VQtavj8NFpdRBEvJTtg==", + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", "license": "MIT", "dependencies": { "@babel/code-frame": "^7.27.1", - "@babel/parser": "^7.27.1", + "@babel/parser": "^7.27.2", "@babel/types": "^7.27.1" }, "engines": { @@ -1894,16 +1894,16 @@ } }, "node_modules/@babel/traverse": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.1.tgz", - "integrity": "sha512-ZCYtZciz1IWJB4U61UPu4KEaqyfj+r5T1Q5mqPo+IBpcG9kHv30Z0aD8LXPgC1trYa6rK0orRyAhqUgk4MjmEg==", + "version": "7.27.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.4.tgz", + "integrity": "sha512-oNcu2QbHqts9BtOWJosOVJapWjBDSxGCpFvikNR5TGDYDQf3JwpIoMzIKrvfoti93cLfPJEG4tH9SPVeyCGgdA==", "license": "MIT", "dependencies": { "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.27.1", - "@babel/parser": "^7.27.1", - "@babel/template": "^7.27.1", - "@babel/types": "^7.27.1", + "@babel/generator": "^7.27.3", + "@babel/parser": "^7.27.4", + "@babel/template": "^7.27.2", + "@babel/types": "^7.27.3", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -1912,9 +1912,9 @@ } }, "node_modules/@babel/types": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.1.tgz", - "integrity": "sha512-+EzkxvLNfiUeKMgy/3luqfsCWFRXLb7U6wNQTk60tovuckwB15B191tJWvpp4HjiQWdJkCxO3Wbvc6jlk3Xb2Q==", + "version": "7.27.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.6.tgz", + "integrity": "sha512-ETyHEk2VHHvl9b9jZP5IHPavHYk57EhanlRRuae9XCpb/j5bDCbPPMOBfCWhnl/7EDJz0jEMCi/RhccCE8r1+Q==", "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.27.1", @@ -19706,20 +19706,20 @@ "integrity": "sha512-TUtMJYRPyUb/9aU8f3K0mjmjf6M9N5Woshn2CS6nqJSeJtTtQcpLUXjGt9vbF8ZGff0El99sWkLgzwW3VXnxZQ==" }, "@babel/core": { - "version": "7.26.10", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.10.tgz", - "integrity": "sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==", + "version": "7.27.4", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.27.4.tgz", + "integrity": "sha512-bXYxrXFubeYdvB0NhD/NBB3Qi6aZeV20GOWVI47t2dkecCEoneR4NPVcb7abpXDEvejgrUfFtG6vG/zxAKmg+g==", "requires": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.26.2", - "@babel/generator": "^7.26.10", - "@babel/helper-compilation-targets": "^7.26.5", - "@babel/helper-module-transforms": "^7.26.0", - "@babel/helpers": "^7.26.10", - "@babel/parser": "^7.26.10", - "@babel/template": "^7.26.9", - "@babel/traverse": "^7.26.10", - "@babel/types": "^7.26.10", + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.27.3", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-module-transforms": "^7.27.3", + "@babel/helpers": "^7.27.4", + "@babel/parser": "^7.27.4", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.27.4", + "@babel/types": "^7.27.3", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -19737,12 +19737,12 @@ } }, "@babel/generator": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.1.tgz", - "integrity": "sha512-UnJfnIpc/+JO0/+KRVQNGU+y5taA5vCbwN8+azkX6beii/ZF+enZJSOKo11ZSzGJjlNfJHfQtmQT8H+9TXPG2w==", + "version": "7.27.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.5.tgz", + "integrity": "sha512-ZGhA37l0e/g2s1Cnzdix0O3aLYm66eF8aufiVteOgnwxgnRP8GoyMj7VWsgWnQbVKXyge7hqrFh2K2TQM6t1Hw==", "requires": { - "@babel/parser": "^7.27.1", - "@babel/types": "^7.27.1", + "@babel/parser": "^7.27.5", + "@babel/types": "^7.27.3", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" @@ -19826,13 +19826,13 @@ } }, "@babel/helper-module-transforms": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.27.1.tgz", - "integrity": "sha512-9yHn519/8KvTU5BjTVEEeIM3w9/2yXNKoD82JifINImhpKkARMJKPP59kLo+BafpdN5zgNeIcS4jsGDmd3l58g==", + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.27.3.tgz", + "integrity": "sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==", "requires": { "@babel/helper-module-imports": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1", - "@babel/traverse": "^7.27.1" + "@babel/traverse": "^7.27.3" } }, "@babel/helper-optimise-call-expression": { @@ -19909,20 +19909,20 @@ } }, "@babel/helpers": { - "version": "7.26.10", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.10.tgz", - "integrity": "sha512-UPYc3SauzZ3JGgj87GgZ89JVdC5dj0AoetR5Bw6wj4niittNyFh6+eOGonYvJ1ao6B8lEa3Q3klS7ADZ53bc5g==", + "version": "7.27.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.6.tgz", + "integrity": "sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==", "requires": { - "@babel/template": "^7.26.9", - "@babel/types": "^7.26.10" + "@babel/template": "^7.27.2", + "@babel/types": "^7.27.6" } }, "@babel/parser": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.1.tgz", - "integrity": "sha512-I0dZ3ZpCrJ1c04OqlNsQcKiZlsrXf/kkE4FXzID9rIOYICsAbA8mMDzhW/luRNAHdCNt7os/u8wenklZDlUVUQ==", + "version": "7.27.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.5.tgz", + "integrity": "sha512-OsQd175SxWkGlzbny8J3K8TnnDD0N3lrIUtB92xwyRpzaenGZhxDvxN/JgU00U3CDZNj9tPuDJ5H0WS4Nt3vKg==", "requires": { - "@babel/types": "^7.27.1" + "@babel/types": "^7.27.3" } }, "@babel/plugin-bugfix-firefox-class-in-computed-class-key": { @@ -20700,33 +20700,33 @@ } }, "@babel/template": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.1.tgz", - "integrity": "sha512-Fyo3ghWMqkHHpHQCoBs2VnYjR4iWFFjguTDEqA5WgZDOrFesVjMhMM2FSqTKSoUSDO1VQtavj8NFpdRBEvJTtg==", + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", "requires": { "@babel/code-frame": "^7.27.1", - "@babel/parser": "^7.27.1", + "@babel/parser": "^7.27.2", "@babel/types": "^7.27.1" } }, "@babel/traverse": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.1.tgz", - "integrity": "sha512-ZCYtZciz1IWJB4U61UPu4KEaqyfj+r5T1Q5mqPo+IBpcG9kHv30Z0aD8LXPgC1trYa6rK0orRyAhqUgk4MjmEg==", + "version": "7.27.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.4.tgz", + "integrity": "sha512-oNcu2QbHqts9BtOWJosOVJapWjBDSxGCpFvikNR5TGDYDQf3JwpIoMzIKrvfoti93cLfPJEG4tH9SPVeyCGgdA==", "requires": { "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.27.1", - "@babel/parser": "^7.27.1", - "@babel/template": "^7.27.1", - "@babel/types": "^7.27.1", + "@babel/generator": "^7.27.3", + "@babel/parser": "^7.27.4", + "@babel/template": "^7.27.2", + "@babel/types": "^7.27.3", "debug": "^4.3.1", "globals": "^11.1.0" } }, "@babel/types": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.1.tgz", - "integrity": "sha512-+EzkxvLNfiUeKMgy/3luqfsCWFRXLb7U6wNQTk60tovuckwB15B191tJWvpp4HjiQWdJkCxO3Wbvc6jlk3Xb2Q==", + "version": "7.27.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.6.tgz", + "integrity": "sha512-ETyHEk2VHHvl9b9jZP5IHPavHYk57EhanlRRuae9XCpb/j5bDCbPPMOBfCWhnl/7EDJz0jEMCi/RhccCE8r1+Q==", "requires": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1" diff --git a/package.json b/package.json index 7dab8333..e67e36d0 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,7 @@ "redux-promise-middleware": "6.2.0" }, "devDependencies": { - "@babel/core": "7.26.10", + "@babel/core": "7.27.4", "@babel/preset-env": "7.27.2", "@babel/preset-react": "7.27.1", "@babel/preset-typescript": "7.27.0", From 4e19ccc5e9f7bf9920ae337b640618cb5e3a8672 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 16 Jun 2025 10:23:01 +0000 Subject: [PATCH 047/331] build(deps-dev): bump brace-expansion from 1.1.11 to 1.1.12 Bumps [brace-expansion](https://github.com/juliangruber/brace-expansion) from 1.1.11 to 1.1.12. - [Release notes](https://github.com/juliangruber/brace-expansion/releases) - [Commits](https://github.com/juliangruber/brace-expansion/compare/1.1.11...v1.1.12) --- updated-dependencies: - dependency-name: brace-expansion dependency-version: 1.1.12 dependency-type: indirect ... Signed-off-by: dependabot[bot] --- package-lock.json | 80 +++++++++++++++++++++++++++++++++++------------ 1 file changed, 60 insertions(+), 20 deletions(-) diff --git a/package-lock.json b/package-lock.json index 19b6ef62..e190813d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2966,7 +2966,9 @@ } }, "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { - "version": "1.1.11", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "license": "MIT", "dependencies": { @@ -3055,7 +3057,9 @@ } }, "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { - "version": "1.1.11", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "license": "MIT", "dependencies": { @@ -7019,7 +7023,9 @@ "license": "ISC" }, "node_modules/brace-expansion": { - "version": "2.0.1", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" @@ -9283,7 +9289,9 @@ } }, "node_modules/eslint-plugin-import/node_modules/brace-expansion": { - "version": "1.1.11", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "license": "MIT", "dependencies": { @@ -9381,7 +9389,9 @@ } }, "node_modules/eslint-plugin-jsx-a11y/node_modules/brace-expansion": { - "version": "1.1.11", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "license": "MIT", "dependencies": { @@ -9527,7 +9537,9 @@ } }, "node_modules/eslint-plugin-react/node_modules/brace-expansion": { - "version": "1.1.11", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "license": "MIT", "dependencies": { @@ -9649,7 +9661,9 @@ } }, "node_modules/eslint/node_modules/brace-expansion": { - "version": "1.1.11", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "license": "MIT", "dependencies": { @@ -10362,7 +10376,9 @@ } }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/brace-expansion": { - "version": "1.1.11", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "license": "MIT", "dependencies": { @@ -10730,7 +10746,9 @@ "license": "BSD-2-Clause" }, "node_modules/glob/node_modules/brace-expansion": { - "version": "1.1.11", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "license": "MIT", "dependencies": { @@ -13671,7 +13689,9 @@ } }, "node_modules/npm-run-all/node_modules/brace-expansion": { - "version": "1.1.11", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "license": "MIT", "dependencies": { @@ -21292,7 +21312,9 @@ } }, "brace-expansion": { - "version": "1.1.11", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "requires": { "balanced-match": "^1.0.0", @@ -21352,7 +21374,9 @@ }, "dependencies": { "brace-expansion": { - "version": "1.1.11", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "requires": { "balanced-match": "^1.0.0", @@ -23862,7 +23886,9 @@ "dev": true }, "brace-expansion": { - "version": "2.0.1", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "requires": { "balanced-match": "^1.0.0" } @@ -25235,7 +25261,9 @@ } }, "brace-expansion": { - "version": "1.1.11", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "requires": { "balanced-match": "^1.0.0", @@ -25352,7 +25380,9 @@ }, "dependencies": { "brace-expansion": { - "version": "1.1.11", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "requires": { "balanced-match": "^1.0.0", @@ -25416,7 +25446,9 @@ "dev": true }, "brace-expansion": { - "version": "1.1.11", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "requires": { "balanced-match": "^1.0.0", @@ -25486,7 +25518,9 @@ }, "dependencies": { "brace-expansion": { - "version": "1.1.11", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "requires": { "balanced-match": "^1.0.0", @@ -25991,7 +26025,9 @@ "requires": {} }, "brace-expansion": { - "version": "1.1.11", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "requires": { "balanced-match": "^1.0.0", @@ -26222,7 +26258,9 @@ }, "dependencies": { "brace-expansion": { - "version": "1.1.11", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "requires": { "balanced-match": "^1.0.0", @@ -28069,7 +28107,9 @@ } }, "brace-expansion": { - "version": "1.1.11", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "requires": { "balanced-match": "^1.0.0", From 8f0c53138ee26b2e139b794d5d56ab02d9b77613 Mon Sep 17 00:00:00 2001 From: regexowl Date: Mon, 12 May 2025 14:35:08 +0200 Subject: [PATCH 048/331] Wizard: Sort activation keys list This sorts the activation keys list by name. The `sortFn` function was also updated to handle undefined values. --- .../steps/Registration/ActivationKeysList.tsx | 3 ++- src/Utilities/sortfn.ts | 12 +++++++++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/Components/CreateImageWizard/steps/Registration/ActivationKeysList.tsx b/src/Components/CreateImageWizard/steps/Registration/ActivationKeysList.tsx index cb308c86..7d4840e7 100644 --- a/src/Components/CreateImageWizard/steps/Registration/ActivationKeysList.tsx +++ b/src/Components/CreateImageWizard/steps/Registration/ActivationKeysList.tsx @@ -31,6 +31,7 @@ import { selectActivationKey, selectRegistrationType, } from '../../../../store/wizardSlice'; +import sortfn from '../../../../Utilities/sortfn'; import { useGetEnvironment } from '../../../../Utilities/useGetEnvironment'; import { generateRandomId } from '../../utilities/generateRandomId'; @@ -91,7 +92,7 @@ const ActivationKeysList = () => { } if (filteredKeys) { - setSelectOptions(filteredKeys); + setSelectOptions(filteredKeys.sort((a, b) => sortfn(a, b, filterValue))); } // This useEffect hook should run *only* on when the filter value diff --git a/src/Utilities/sortfn.ts b/src/Utilities/sortfn.ts index 855364c9..2b5a8d75 100644 --- a/src/Utilities/sortfn.ts +++ b/src/Utilities/sortfn.ts @@ -1,4 +1,14 @@ -const sortfn = (a: string, b: string, searchTerm: string) => { +const sortfn = ( + a: string | undefined, + b: string | undefined, + searchTerm: string +) => { + if (!a) { + return -1; + } + if (!b) { + return 1; + } const x = a.toLowerCase(); const y = b.toLowerCase(); // check exact match first From 3312beb6e7422c4ef7a715ead28b14474364cc17 Mon Sep 17 00:00:00 2001 From: regexowl Date: Mon, 16 Jun 2025 12:36:47 +0200 Subject: [PATCH 049/331] devDeps: Bump @typescript-eslint/eslint-plugin and @typescript-eslint/parser The dependencies need to be bumped in tandem, both went from 8.32.1 to 8.34.0 --- package-lock.json | 249 +++++++++++++++++++++++++++++----------------- package.json | 4 +- 2 files changed, 157 insertions(+), 96 deletions(-) diff --git a/package-lock.json b/package-lock.json index e190813d..ddc601a9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -52,8 +52,8 @@ "@types/react-dom": "18.3.1", "@types/react-redux": "7.1.34", "@types/uuid": "10.0.0", - "@typescript-eslint/eslint-plugin": "8.32.1", - "@typescript-eslint/parser": "8.32.1", + "@typescript-eslint/eslint-plugin": "8.34.0", + "@typescript-eslint/parser": "8.34.0", "@vitejs/plugin-react": "4.4.1", "@vitest/coverage-v8": "3.1.2", "babel-loader": "10.0.0", @@ -5537,17 +5537,17 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.32.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.32.1.tgz", - "integrity": "sha512-6u6Plg9nP/J1GRpe/vcjjabo6Uc5YQPAMxsgQyGC/I0RuukiG1wIe3+Vtg3IrSCVJDmqK3j8adrtzXSENRtFgg==", + "version": "8.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.34.0.tgz", + "integrity": "sha512-QXwAlHlbcAwNlEEMKQS2RCgJsgXrTJdjXT08xEgbPFa2yYQgVjBymxP5DrfrE7X7iodSzd9qBUHUycdyVJTW1w==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.32.1", - "@typescript-eslint/type-utils": "8.32.1", - "@typescript-eslint/utils": "8.32.1", - "@typescript-eslint/visitor-keys": "8.32.1", + "@typescript-eslint/scope-manager": "8.34.0", + "@typescript-eslint/type-utils": "8.34.0", + "@typescript-eslint/utils": "8.34.0", + "@typescript-eslint/visitor-keys": "8.34.0", "graphemer": "^1.4.0", "ignore": "^7.0.0", "natural-compare": "^1.4.0", @@ -5561,7 +5561,7 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", + "@typescript-eslint/parser": "^8.34.0", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } @@ -5590,16 +5590,16 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.32.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.32.1.tgz", - "integrity": "sha512-LKMrmwCPoLhM45Z00O1ulb6jwyVr2kr3XJp+G+tSEZcbauNnScewcQwtJqXDhXeYPDEjZ8C1SjXm015CirEmGg==", + "version": "8.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.34.0.tgz", + "integrity": "sha512-vxXJV1hVFx3IXz/oy2sICsJukaBrtDEQSBiV48/YIV5KWjX1dO+bcIr/kCPrW6weKXvsaGKFNlwH0v2eYdRRbA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.32.1", - "@typescript-eslint/types": "8.32.1", - "@typescript-eslint/typescript-estree": "8.32.1", - "@typescript-eslint/visitor-keys": "8.32.1", + "@typescript-eslint/scope-manager": "8.34.0", + "@typescript-eslint/types": "8.34.0", + "@typescript-eslint/typescript-estree": "8.34.0", + "@typescript-eslint/visitor-keys": "8.34.0", "debug": "^4.3.4" }, "engines": { @@ -5614,15 +5614,37 @@ "typescript": ">=4.8.4 <5.9.0" } }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "8.32.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.32.1.tgz", - "integrity": "sha512-7IsIaIDeZn7kffk7qXC3o6Z4UblZJKV3UBpkvRNpr5NSyLji7tvTcvmnMNYuYLyh26mN8W723xpo3i4MlD33vA==", + "node_modules/@typescript-eslint/project-service": { + "version": "8.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.34.0.tgz", + "integrity": "sha512-iEgDALRf970/B2YExmtPMPF54NenZUf4xpL3wsCRx/lgjz6ul/l13R81ozP/ZNuXfnLCS+oPmG7JIxfdNYKELw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.32.1", - "@typescript-eslint/visitor-keys": "8.32.1" + "@typescript-eslint/tsconfig-utils": "^8.34.0", + "@typescript-eslint/types": "^8.34.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.34.0.tgz", + "integrity": "sha512-9Ac0X8WiLykl0aj1oYQNcLZjHgBojT6cW68yAgZ19letYu+Hxd0rE0veI1XznSSst1X5lwnxhPbVdwjDRIomRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.34.0", + "@typescript-eslint/visitor-keys": "8.34.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -5632,15 +5654,32 @@ "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.34.0.tgz", + "integrity": "sha512-+W9VYHKFIzA5cBeooqQxqNriAP0QeQ7xTiDuIOr71hzgffm3EL2hxwWBIIj4GuofIbKxGNarpKqIq6Q6YrShOA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <5.9.0" + } + }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.32.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.32.1.tgz", - "integrity": "sha512-mv9YpQGA8iIsl5KyUPi+FGLm7+bA4fgXaeRcFKRDRwDMu4iwrSHeDPipwueNXhdIIZltwCJv+NkxftECbIZWfA==", + "version": "8.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.34.0.tgz", + "integrity": "sha512-n7zSmOcUVhcRYC75W2pnPpbO1iwhJY3NLoHEtbJwJSNlVAZuwqu05zY3f3s2SDWWDSo9FdN5szqc73DCtDObAg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "8.32.1", - "@typescript-eslint/utils": "8.32.1", + "@typescript-eslint/typescript-estree": "8.34.0", + "@typescript-eslint/utils": "8.34.0", "debug": "^4.3.4", "ts-api-utils": "^2.1.0" }, @@ -5670,9 +5709,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.32.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.32.1.tgz", - "integrity": "sha512-YmybwXUJcgGqgAp6bEsgpPXEg6dcCyPyCSr0CAAueacR/CCBi25G3V8gGQ2kRzQRBNol7VQknxMs9HvVa9Rvfg==", + "version": "8.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.34.0.tgz", + "integrity": "sha512-9V24k/paICYPniajHfJ4cuAWETnt7Ssy+R0Rbcqo5sSFr3QEZ/8TSoUi9XeXVBGXCaLtwTOKSLGcInCAvyZeMA==", "dev": true, "license": "MIT", "engines": { @@ -5684,14 +5723,16 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.32.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.32.1.tgz", - "integrity": "sha512-Y3AP9EIfYwBb4kWGb+simvPaqQoT5oJuzzj9m0i6FCY6SPvlomY2Ei4UEMm7+FXtlNJbor80ximyslzaQF6xhg==", + "version": "8.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.34.0.tgz", + "integrity": "sha512-rOi4KZxI7E0+BMqG7emPSK1bB4RICCpF7QD3KCLXn9ZvWoESsOMlHyZPAHyG04ujVplPaHbmEvs34m+wjgtVtg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.32.1", - "@typescript-eslint/visitor-keys": "8.32.1", + "@typescript-eslint/project-service": "8.34.0", + "@typescript-eslint/tsconfig-utils": "8.34.0", + "@typescript-eslint/types": "8.34.0", + "@typescript-eslint/visitor-keys": "8.34.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", @@ -5737,16 +5778,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.32.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.32.1.tgz", - "integrity": "sha512-DsSFNIgLSrc89gpq1LJB7Hm1YpuhK086DRDJSNrewcGvYloWW1vZLHBTIvarKZDcAORIy/uWNx8Gad+4oMpkSA==", + "version": "8.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.34.0.tgz", + "integrity": "sha512-8L4tWatGchV9A1cKbjaavS6mwYwp39jql8xUmIIKJdm+qiaeHy5KMKlBrf30akXAWBzn2SqKsNOtSENWUwg7XQ==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.32.1", - "@typescript-eslint/types": "8.32.1", - "@typescript-eslint/typescript-estree": "8.32.1" + "@typescript-eslint/scope-manager": "8.34.0", + "@typescript-eslint/types": "8.34.0", + "@typescript-eslint/typescript-estree": "8.34.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -5761,13 +5802,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.32.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.32.1.tgz", - "integrity": "sha512-ar0tjQfObzhSaW3C3QNmTc5ofj0hDoNQ5XWrCy6zDyabdr0TWhCkClp+rywGNj/odAFBVzzJrK4tEq5M4Hmu4w==", + "version": "8.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.34.0.tgz", + "integrity": "sha512-qHV7pW7E85A0x6qyrFn+O+q1k1p3tQCsqIZ1KZ5ESLXY57aTvUd3/a4rdPTeXisvhXn2VQG0VSKUqs8KHF2zcA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.32.1", + "@typescript-eslint/types": "8.34.0", "eslint-visitor-keys": "^4.2.0" }, "engines": { @@ -5779,9 +5820,9 @@ } }, "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", - "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", "dev": true, "license": "Apache-2.0", "engines": { @@ -22918,16 +22959,16 @@ } }, "@typescript-eslint/eslint-plugin": { - "version": "8.32.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.32.1.tgz", - "integrity": "sha512-6u6Plg9nP/J1GRpe/vcjjabo6Uc5YQPAMxsgQyGC/I0RuukiG1wIe3+Vtg3IrSCVJDmqK3j8adrtzXSENRtFgg==", + "version": "8.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.34.0.tgz", + "integrity": "sha512-QXwAlHlbcAwNlEEMKQS2RCgJsgXrTJdjXT08xEgbPFa2yYQgVjBymxP5DrfrE7X7iodSzd9qBUHUycdyVJTW1w==", "dev": true, "requires": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.32.1", - "@typescript-eslint/type-utils": "8.32.1", - "@typescript-eslint/utils": "8.32.1", - "@typescript-eslint/visitor-keys": "8.32.1", + "@typescript-eslint/scope-manager": "8.34.0", + "@typescript-eslint/type-utils": "8.34.0", + "@typescript-eslint/utils": "8.34.0", + "@typescript-eslint/visitor-keys": "8.34.0", "graphemer": "^1.4.0", "ignore": "^7.0.0", "natural-compare": "^1.4.0", @@ -22950,36 +22991,54 @@ } }, "@typescript-eslint/parser": { - "version": "8.32.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.32.1.tgz", - "integrity": "sha512-LKMrmwCPoLhM45Z00O1ulb6jwyVr2kr3XJp+G+tSEZcbauNnScewcQwtJqXDhXeYPDEjZ8C1SjXm015CirEmGg==", + "version": "8.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.34.0.tgz", + "integrity": "sha512-vxXJV1hVFx3IXz/oy2sICsJukaBrtDEQSBiV48/YIV5KWjX1dO+bcIr/kCPrW6weKXvsaGKFNlwH0v2eYdRRbA==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "8.32.1", - "@typescript-eslint/types": "8.32.1", - "@typescript-eslint/typescript-estree": "8.32.1", - "@typescript-eslint/visitor-keys": "8.32.1", + "@typescript-eslint/scope-manager": "8.34.0", + "@typescript-eslint/types": "8.34.0", + "@typescript-eslint/typescript-estree": "8.34.0", + "@typescript-eslint/visitor-keys": "8.34.0", + "debug": "^4.3.4" + } + }, + "@typescript-eslint/project-service": { + "version": "8.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.34.0.tgz", + "integrity": "sha512-iEgDALRf970/B2YExmtPMPF54NenZUf4xpL3wsCRx/lgjz6ul/l13R81ozP/ZNuXfnLCS+oPmG7JIxfdNYKELw==", + "dev": true, + "requires": { + "@typescript-eslint/tsconfig-utils": "^8.34.0", + "@typescript-eslint/types": "^8.34.0", "debug": "^4.3.4" } }, "@typescript-eslint/scope-manager": { - "version": "8.32.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.32.1.tgz", - "integrity": "sha512-7IsIaIDeZn7kffk7qXC3o6Z4UblZJKV3UBpkvRNpr5NSyLji7tvTcvmnMNYuYLyh26mN8W723xpo3i4MlD33vA==", + "version": "8.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.34.0.tgz", + "integrity": "sha512-9Ac0X8WiLykl0aj1oYQNcLZjHgBojT6cW68yAgZ19letYu+Hxd0rE0veI1XznSSst1X5lwnxhPbVdwjDRIomRw==", "dev": true, "requires": { - "@typescript-eslint/types": "8.32.1", - "@typescript-eslint/visitor-keys": "8.32.1" + "@typescript-eslint/types": "8.34.0", + "@typescript-eslint/visitor-keys": "8.34.0" } }, + "@typescript-eslint/tsconfig-utils": { + "version": "8.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.34.0.tgz", + "integrity": "sha512-+W9VYHKFIzA5cBeooqQxqNriAP0QeQ7xTiDuIOr71hzgffm3EL2hxwWBIIj4GuofIbKxGNarpKqIq6Q6YrShOA==", + "dev": true, + "requires": {} + }, "@typescript-eslint/type-utils": { - "version": "8.32.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.32.1.tgz", - "integrity": "sha512-mv9YpQGA8iIsl5KyUPi+FGLm7+bA4fgXaeRcFKRDRwDMu4iwrSHeDPipwueNXhdIIZltwCJv+NkxftECbIZWfA==", + "version": "8.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.34.0.tgz", + "integrity": "sha512-n7zSmOcUVhcRYC75W2pnPpbO1iwhJY3NLoHEtbJwJSNlVAZuwqu05zY3f3s2SDWWDSo9FdN5szqc73DCtDObAg==", "dev": true, "requires": { - "@typescript-eslint/typescript-estree": "8.32.1", - "@typescript-eslint/utils": "8.32.1", + "@typescript-eslint/typescript-estree": "8.34.0", + "@typescript-eslint/utils": "8.34.0", "debug": "^4.3.4", "ts-api-utils": "^2.1.0" }, @@ -22994,19 +23053,21 @@ } }, "@typescript-eslint/types": { - "version": "8.32.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.32.1.tgz", - "integrity": "sha512-YmybwXUJcgGqgAp6bEsgpPXEg6dcCyPyCSr0CAAueacR/CCBi25G3V8gGQ2kRzQRBNol7VQknxMs9HvVa9Rvfg==", + "version": "8.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.34.0.tgz", + "integrity": "sha512-9V24k/paICYPniajHfJ4cuAWETnt7Ssy+R0Rbcqo5sSFr3QEZ/8TSoUi9XeXVBGXCaLtwTOKSLGcInCAvyZeMA==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "8.32.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.32.1.tgz", - "integrity": "sha512-Y3AP9EIfYwBb4kWGb+simvPaqQoT5oJuzzj9m0i6FCY6SPvlomY2Ei4UEMm7+FXtlNJbor80ximyslzaQF6xhg==", + "version": "8.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.34.0.tgz", + "integrity": "sha512-rOi4KZxI7E0+BMqG7emPSK1bB4RICCpF7QD3KCLXn9ZvWoESsOMlHyZPAHyG04ujVplPaHbmEvs34m+wjgtVtg==", "dev": true, "requires": { - "@typescript-eslint/types": "8.32.1", - "@typescript-eslint/visitor-keys": "8.32.1", + "@typescript-eslint/project-service": "8.34.0", + "@typescript-eslint/tsconfig-utils": "8.34.0", + "@typescript-eslint/types": "8.34.0", + "@typescript-eslint/visitor-keys": "8.34.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", @@ -23031,31 +23092,31 @@ } }, "@typescript-eslint/utils": { - "version": "8.32.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.32.1.tgz", - "integrity": "sha512-DsSFNIgLSrc89gpq1LJB7Hm1YpuhK086DRDJSNrewcGvYloWW1vZLHBTIvarKZDcAORIy/uWNx8Gad+4oMpkSA==", + "version": "8.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.34.0.tgz", + "integrity": "sha512-8L4tWatGchV9A1cKbjaavS6mwYwp39jql8xUmIIKJdm+qiaeHy5KMKlBrf30akXAWBzn2SqKsNOtSENWUwg7XQ==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.32.1", - "@typescript-eslint/types": "8.32.1", - "@typescript-eslint/typescript-estree": "8.32.1" + "@typescript-eslint/scope-manager": "8.34.0", + "@typescript-eslint/types": "8.34.0", + "@typescript-eslint/typescript-estree": "8.34.0" } }, "@typescript-eslint/visitor-keys": { - "version": "8.32.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.32.1.tgz", - "integrity": "sha512-ar0tjQfObzhSaW3C3QNmTc5ofj0hDoNQ5XWrCy6zDyabdr0TWhCkClp+rywGNj/odAFBVzzJrK4tEq5M4Hmu4w==", + "version": "8.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.34.0.tgz", + "integrity": "sha512-qHV7pW7E85A0x6qyrFn+O+q1k1p3tQCsqIZ1KZ5ESLXY57aTvUd3/a4rdPTeXisvhXn2VQG0VSKUqs8KHF2zcA==", "dev": true, "requires": { - "@typescript-eslint/types": "8.32.1", + "@typescript-eslint/types": "8.34.0", "eslint-visitor-keys": "^4.2.0" }, "dependencies": { "eslint-visitor-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", - "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", "dev": true } } diff --git a/package.json b/package.json index e67e36d0..2c660551 100644 --- a/package.json +++ b/package.json @@ -50,8 +50,8 @@ "@types/react-dom": "18.3.1", "@types/react-redux": "7.1.34", "@types/uuid": "10.0.0", - "@typescript-eslint/eslint-plugin": "8.32.1", - "@typescript-eslint/parser": "8.32.1", + "@typescript-eslint/eslint-plugin": "8.34.0", + "@typescript-eslint/parser": "8.34.0", "@vitejs/plugin-react": "4.4.1", "@vitest/coverage-v8": "3.1.2", "babel-loader": "10.0.0", From b465920b187710625659c51a41a1d5739789ca74 Mon Sep 17 00:00:00 2001 From: regexowl Date: Mon, 19 May 2025 10:18:09 +0200 Subject: [PATCH 050/331] src: Remove `image-builder.users.enabled` flag The Users customization is available in production now, the flag is no longer used. --- src/Components/CreateImageWizard/CreateImageWizard.tsx | 2 -- .../CreateImageWizard/steps/Review/ReviewStep.tsx | 8 ++------ src/Utilities/useGetEnvironment.ts | 1 - .../CreateImageWizard/steps/Oscap/Compliance.test.tsx | 1 + src/test/setup.ts | 2 -- 5 files changed, 3 insertions(+), 11 deletions(-) diff --git a/src/Components/CreateImageWizard/CreateImageWizard.tsx b/src/Components/CreateImageWizard/CreateImageWizard.tsx index ac2bdc8b..61f956b8 100644 --- a/src/Components/CreateImageWizard/CreateImageWizard.tsx +++ b/src/Components/CreateImageWizard/CreateImageWizard.tsx @@ -199,7 +199,6 @@ const CreateImageWizard = ({ isEdit }: CreateImageWizardProps) => { const { isFedoraEnv } = useGetEnvironment(); // Feature flags const complianceEnabled = useFlag('image-builder.compliance.enabled'); - const isUsersEnabled = useFlag('image-builder.users.enabled'); // IMPORTANT: Ensure the wizard starts with a fresh initial state useEffect(() => { @@ -566,7 +565,6 @@ const CreateImageWizard = ({ isEdit }: CreateImageWizardProps) => { id="wizard-users" key="wizard-users" navItem={customStatusNavItem} - isHidden={!isUsersEnabled} status={usersValidation.disabledNext ? 'error' : 'default'} footer={ { const { goToStepById } = useWizardContext(); @@ -190,7 +187,6 @@ const Review = () => { ); }; - const isUsersEnabled = useFlag('image-builder.users.enabled'); const { isFedoraEnv } = useGetEnvironment(); return ( <> @@ -380,7 +376,7 @@ const Review = () => { )} - {isUsersEnabled && users.length > 0 && ( + {users.length > 0 && ( { switch (flag) { - case 'image-builder.users.enabled': case 'image-builder.templates.enabled': return true; default: diff --git a/src/test/Components/CreateImageWizard/steps/Oscap/Compliance.test.tsx b/src/test/Components/CreateImageWizard/steps/Oscap/Compliance.test.tsx index 634c2fde..59762f75 100644 --- a/src/test/Components/CreateImageWizard/steps/Oscap/Compliance.test.tsx +++ b/src/test/Components/CreateImageWizard/steps/Oscap/Compliance.test.tsx @@ -52,6 +52,7 @@ const goToReviewStep = async () => { await clickNext(); // Snapshots await clickNext(); // Custom repositories await clickNext(); // Additional packages + await clickNext(); // Users await clickNext(); // Timezone await clickNext(); // Locale await clickNext(); // Hostname diff --git a/src/test/setup.ts b/src/test/setup.ts index 9427d5ac..f145bb56 100644 --- a/src/test/setup.ts +++ b/src/test/setup.ts @@ -59,8 +59,6 @@ vi.mock('@unleash/proxy-client-react', () => ({ useUnleashContext: () => vi.fn(), useFlag: vi.fn((flag) => { switch (flag) { - case 'image-builder.users.enabled': - return true; case 'image-builder.import.enabled': return true; case 'edgeParity.image-list': From c59cde1ab9b4c6fb365314d633d28fb368fa9af1 Mon Sep 17 00:00:00 2001 From: Gianluca Zuccarelli Date: Mon, 16 Jun 2025 12:06:00 +0100 Subject: [PATCH 051/331] ImagesTable: fix main section alignment With the change to PF6 the list of items in the table section was not padded properly, we can fix this by wrapping the code in a `PageSection` component. --- src/Components/ImagesTable/ImagesTable.tsx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/Components/ImagesTable/ImagesTable.tsx b/src/Components/ImagesTable/ImagesTable.tsx index 3e2bcf80..3320bd99 100644 --- a/src/Components/ImagesTable/ImagesTable.tsx +++ b/src/Components/ImagesTable/ImagesTable.tsx @@ -11,6 +11,7 @@ import { Bullseye, Badge, Button, + PageSection, } from '@patternfly/react-core'; import { OnSetPage } from '@patternfly/react-core/dist/esm/components/Pagination/Pagination'; import { @@ -233,7 +234,7 @@ const ImagesTable = () => { } return ( - <> + { - + ); }; From cb8c8a3d5cea174b8571d165ebf238876b6f0265 Mon Sep 17 00:00:00 2001 From: regexowl Date: Mon, 16 Jun 2025 16:26:50 +0200 Subject: [PATCH 052/331] Wizard: Remove unused styling We don't use the `Tile` component anymore. I believe we can remove this styling. --- .../CreateImageWizard/CreateImageWizard.scss | 21 ------------------- 1 file changed, 21 deletions(-) diff --git a/src/Components/CreateImageWizard/CreateImageWizard.scss b/src/Components/CreateImageWizard/CreateImageWizard.scss index efd087fe..183fa712 100644 --- a/src/Components/CreateImageWizard/CreateImageWizard.scss +++ b/src/Components/CreateImageWizard/CreateImageWizard.scss @@ -17,27 +17,6 @@ --pf-c-form__group-label--PaddingBottom: var(--pf-v6-global--spacer--xs); } -.tiles { - display: flex; -} - -.tile { - flex: 1 0 0px; - max-width: 250px; -} - -.pf-c-tile:focus { - --pf-c-tile__title--Color: var(--pf-c-tile__title--Color); - --pf-c-tile__icon--Color: var(---pf-v6-global--Color--100); - --pf-c-tile--before--BorderWidth: var(--pf-v6-global--BorderWidth--sm); - --pf-c-tile--before--BorderColor: var(--pf-v6-global--BorderColor--100); -} - -.pf-c-tile.pf-m-selected:focus { - --pf-c-tile__title--Color: var(--pf-c-tile--focus__title--Color); - --pf-c-tile__icon--Color: var(--pf-c-tile--focus__icon--Color); -} - .provider-icon { width: 3.5em; height: 3.5em; From d6acce47a28c66f6044f5a579e7fb4b7eb702ec0 Mon Sep 17 00:00:00 2001 From: regexowl Date: Mon, 16 Jun 2025 16:03:55 +0200 Subject: [PATCH 053/331] Wizard: Fix release dropdown's `maxWidth` This applies the styling and removes `Warning: Unsupported style property max-width. Did you mean maxWidth?` from the test output. --- .../CreateImageWizard/steps/ImageOutput/ReleaseSelect.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Components/CreateImageWizard/steps/ImageOutput/ReleaseSelect.tsx b/src/Components/CreateImageWizard/steps/ImageOutput/ReleaseSelect.tsx index a6ea5617..7975165b 100644 --- a/src/Components/CreateImageWizard/steps/ImageOutput/ReleaseSelect.tsx +++ b/src/Components/CreateImageWizard/steps/ImageOutput/ReleaseSelect.tsx @@ -158,7 +158,7 @@ const ReleaseSelect = () => { data-testid="release_select" style={ { - 'max-width': '100%', + maxWidth: '100%', } as React.CSSProperties } > From 8e504a527b8d4f7390475d8854f04f038a76cd87 Mon Sep 17 00:00:00 2001 From: regexowl Date: Mon, 16 Jun 2025 14:38:53 +0200 Subject: [PATCH 054/331] Wizard: Make popover button independent on tab Previously when the Included/Other repos popover button was clicked the tab changed as well. This makes the popover button independent on the selected tab. --- .../CreateImageWizard/steps/Packages/Packages.tsx | 14 ++++---------- .../steps/Packages/components/RepoPopovers.tsx | 2 -- 2 files changed, 4 insertions(+), 12 deletions(-) diff --git a/src/Components/CreateImageWizard/steps/Packages/Packages.tsx b/src/Components/CreateImageWizard/steps/Packages/Packages.tsx index 35fbf67c..21c823c2 100644 --- a/src/Components/CreateImageWizard/steps/Packages/Packages.tsx +++ b/src/Components/CreateImageWizard/steps/Packages/Packages.tsx @@ -1508,20 +1508,14 @@ const Packages = () => { > - Included repos - - } + title={Included repos} + actions={} aria-label="Included repositories" /> - Other repos - - } + title={Other repos} + actions={} aria-label="Other repositories" /> diff --git a/src/Components/CreateImageWizard/steps/Packages/components/RepoPopovers.tsx b/src/Components/CreateImageWizard/steps/Packages/components/RepoPopovers.tsx index 6a099b14..d92ab5dd 100644 --- a/src/Components/CreateImageWizard/steps/Packages/components/RepoPopovers.tsx +++ b/src/Components/CreateImageWizard/steps/Packages/components/RepoPopovers.tsx @@ -20,7 +20,6 @@ export const IncludedReposPopover = () => { variant="plain" aria-label="About included repositories" component="span" - className="pf-v6-u-p-0" size="sm" isInline /> @@ -45,7 +44,6 @@ export const OtherReposPopover = () => { variant="plain" aria-label="About other repositories" component="span" - className="pf-v6-u-p-0" size="sm" isInline /> From 798d994ad0ae6ae941316e66cb0129db9a4ce456 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 17 Jun 2025 04:23:12 +0000 Subject: [PATCH 055/331] build(deps-dev): bump stylelint-config-recommended-scss Bumps [stylelint-config-recommended-scss](https://github.com/stylelint-scss/stylelint-config-recommended-scss) from 14.1.0 to 15.0.1. - [Release notes](https://github.com/stylelint-scss/stylelint-config-recommended-scss/releases) - [Changelog](https://github.com/stylelint-scss/stylelint-config-recommended-scss/blob/master/CHANGELOG.md) - [Commits](https://github.com/stylelint-scss/stylelint-config-recommended-scss/compare/v14.1.0...v15.0.1) --- updated-dependencies: - dependency-name: stylelint-config-recommended-scss dependency-version: 15.0.1 dependency-type: direct:development update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- package-lock.json | 77 +++++++++++++++++++++++++++++++++-------------- package.json | 2 +- 2 files changed, 56 insertions(+), 23 deletions(-) diff --git a/package-lock.json b/package-lock.json index ddc601a9..07ab77ff 100644 --- a/package-lock.json +++ b/package-lock.json @@ -88,7 +88,7 @@ "sass": "1.88.0", "sass-loader": "16.0.5", "stylelint": "16.18.0", - "stylelint-config-recommended-scss": "14.1.0", + "stylelint-config-recommended-scss": "15.0.1", "ts-node": "10.9.2", "ts-patch": "3.3.0", "typescript": "5.8.3", @@ -14859,6 +14859,8 @@ }, "node_modules/postcss-media-query-parser": { "version": "0.2.3", + "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz", + "integrity": "sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==", "dev": true, "license": "MIT" }, @@ -17258,7 +17260,9 @@ } }, "node_modules/stylelint-config-recommended": { - "version": "14.0.1", + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-16.0.0.tgz", + "integrity": "sha512-4RSmPjQegF34wNcK1e1O3Uz91HN8P1aFdFzio90wNK9mjgAI19u5vsU868cVZboKzCaa5XbpvtTzAAGQAxpcXA==", "dev": true, "funding": [ { @@ -17275,24 +17279,26 @@ "node": ">=18.12.0" }, "peerDependencies": { - "stylelint": "^16.1.0" + "stylelint": "^16.16.0" } }, "node_modules/stylelint-config-recommended-scss": { - "version": "14.1.0", + "version": "15.0.1", + "resolved": "https://registry.npmjs.org/stylelint-config-recommended-scss/-/stylelint-config-recommended-scss-15.0.1.tgz", + "integrity": "sha512-V24bxkNkFGggqPVJlP9iXaBabwSGEG7QTz+PyxrRtjPkcF+/NsWtB3tKYvFYEmczRkWiIEfuFMhGpJFj9Fxe6Q==", "dev": true, "license": "MIT", "dependencies": { "postcss-scss": "^4.0.9", - "stylelint-config-recommended": "^14.0.1", - "stylelint-scss": "^6.4.0" + "stylelint-config-recommended": "^16.0.0", + "stylelint-scss": "^6.12.0" }, "engines": { - "node": ">=18.12.0" + "node": ">=20" }, "peerDependencies": { "postcss": "^8.3.3", - "stylelint": "^16.6.1" + "stylelint": "^16.16.0" }, "peerDependenciesMeta": { "postcss": { @@ -17301,17 +17307,19 @@ } }, "node_modules/stylelint-scss": { - "version": "6.10.1", + "version": "6.12.1", + "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-6.12.1.tgz", + "integrity": "sha512-UJUfBFIvXfly8WKIgmqfmkGKPilKB4L5j38JfsDd+OCg2GBdU0vGUV08Uw82tsRZzd4TbsUURVVNGeOhJVF7pA==", "dev": true, "license": "MIT", "dependencies": { "css-tree": "^3.0.1", "is-plain-object": "^5.0.0", - "known-css-properties": "^0.35.0", - "mdn-data": "^2.14.0", + "known-css-properties": "^0.36.0", + "mdn-data": "^2.21.0", "postcss-media-query-parser": "^0.2.3", "postcss-resolve-nested-selector": "^0.1.6", - "postcss-selector-parser": "^7.0.0", + "postcss-selector-parser": "^7.1.0", "postcss-value-parser": "^4.2.0" }, "engines": { @@ -17321,8 +17329,17 @@ "stylelint": "^16.0.2" } }, + "node_modules/stylelint-scss/node_modules/known-css-properties": { + "version": "0.36.0", + "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.36.0.tgz", + "integrity": "sha512-A+9jP+IUmuQsNdsLdcg6Yt7voiMF/D4K83ew0OpJtpu+l34ef7LaohWV0Rc6KNvzw6ZDizkqfyB5JznZnzuKQA==", + "dev": true, + "license": "MIT" + }, "node_modules/stylelint-scss/node_modules/mdn-data": { - "version": "2.15.0", + "version": "2.21.0", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.21.0.tgz", + "integrity": "sha512-+ZKPQezM5vYJIkCxaC+4DTnRrVZR1CgsKLu5zsQERQx6Tea8Y+wMx5A24rq8A8NepCeatIQufVAekKNgiBMsGQ==", "dev": true, "license": "CC0-1.0" }, @@ -28889,6 +28906,8 @@ }, "postcss-media-query-parser": { "version": "0.2.3", + "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz", + "integrity": "sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==", "dev": true }, "postcss-modules-extract-imports": { @@ -30490,35 +30509,49 @@ } }, "stylelint-config-recommended": { - "version": "14.0.1", + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-16.0.0.tgz", + "integrity": "sha512-4RSmPjQegF34wNcK1e1O3Uz91HN8P1aFdFzio90wNK9mjgAI19u5vsU868cVZboKzCaa5XbpvtTzAAGQAxpcXA==", "dev": true, "requires": {} }, "stylelint-config-recommended-scss": { - "version": "14.1.0", + "version": "15.0.1", + "resolved": "https://registry.npmjs.org/stylelint-config-recommended-scss/-/stylelint-config-recommended-scss-15.0.1.tgz", + "integrity": "sha512-V24bxkNkFGggqPVJlP9iXaBabwSGEG7QTz+PyxrRtjPkcF+/NsWtB3tKYvFYEmczRkWiIEfuFMhGpJFj9Fxe6Q==", "dev": true, "requires": { "postcss-scss": "^4.0.9", - "stylelint-config-recommended": "^14.0.1", - "stylelint-scss": "^6.4.0" + "stylelint-config-recommended": "^16.0.0", + "stylelint-scss": "^6.12.0" } }, "stylelint-scss": { - "version": "6.10.1", + "version": "6.12.1", + "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-6.12.1.tgz", + "integrity": "sha512-UJUfBFIvXfly8WKIgmqfmkGKPilKB4L5j38JfsDd+OCg2GBdU0vGUV08Uw82tsRZzd4TbsUURVVNGeOhJVF7pA==", "dev": true, "requires": { "css-tree": "^3.0.1", "is-plain-object": "^5.0.0", - "known-css-properties": "^0.35.0", - "mdn-data": "^2.14.0", + "known-css-properties": "^0.36.0", + "mdn-data": "^2.21.0", "postcss-media-query-parser": "^0.2.3", "postcss-resolve-nested-selector": "^0.1.6", - "postcss-selector-parser": "^7.0.0", + "postcss-selector-parser": "^7.1.0", "postcss-value-parser": "^4.2.0" }, "dependencies": { + "known-css-properties": { + "version": "0.36.0", + "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.36.0.tgz", + "integrity": "sha512-A+9jP+IUmuQsNdsLdcg6Yt7voiMF/D4K83ew0OpJtpu+l34ef7LaohWV0Rc6KNvzw6ZDizkqfyB5JznZnzuKQA==", + "dev": true + }, "mdn-data": { - "version": "2.15.0", + "version": "2.21.0", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.21.0.tgz", + "integrity": "sha512-+ZKPQezM5vYJIkCxaC+4DTnRrVZR1CgsKLu5zsQERQx6Tea8Y+wMx5A24rq8A8NepCeatIQufVAekKNgiBMsGQ==", "dev": true } } diff --git a/package.json b/package.json index 2c660551..884b9531 100644 --- a/package.json +++ b/package.json @@ -86,7 +86,7 @@ "sass": "1.88.0", "sass-loader": "16.0.5", "stylelint": "16.18.0", - "stylelint-config-recommended-scss": "14.1.0", + "stylelint-config-recommended-scss": "15.0.1", "ts-node": "10.9.2", "ts-patch": "3.3.0", "typescript": "5.8.3", From 31d259e98807ecd5664e9f8004741522bf532297 Mon Sep 17 00:00:00 2001 From: regexowl Date: Mon, 16 Jun 2025 14:52:27 +0200 Subject: [PATCH 056/331] devDeps: Bump msw from 2.7.5 to 2.10.2 This bumps msw from 2.7.5 to 2.10.2 --- package-lock.json | 50 +++++++++++--- package.json | 2 +- src/mockServiceWorker.js | 143 ++++++++++++++++++++++++--------------- 3 files changed, 130 insertions(+), 65 deletions(-) diff --git a/package-lock.json b/package-lock.json index 07ab77ff..57f8ee6f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -79,7 +79,7 @@ "madge": "8.0.0", "mini-css-extract-plugin": "2.9.2", "moment": "2.30.1", - "msw": "2.7.5", + "msw": "2.10.2", "npm-run-all": "4.1.5", "path-browserify": "1.0.1", "postcss-scss": "4.0.9", @@ -3407,7 +3407,9 @@ } }, "node_modules/@mswjs/interceptors": { - "version": "0.37.1", + "version": "0.39.2", + "resolved": "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.39.2.tgz", + "integrity": "sha512-RuzCup9Ct91Y7V79xwCb146RaBRHZ7NBbrIUySumd1rpKqHL5OonaqrGIbug5hNwP/fRyxFMA6ISgw4FTtYFYg==", "dev": true, "license": "MIT", "dependencies": { @@ -3470,11 +3472,15 @@ }, "node_modules/@open-draft/deferred-promise": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@open-draft/deferred-promise/-/deferred-promise-2.2.0.tgz", + "integrity": "sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==", "dev": true, "license": "MIT" }, "node_modules/@open-draft/logger": { "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@open-draft/logger/-/logger-0.3.0.tgz", + "integrity": "sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3484,6 +3490,8 @@ }, "node_modules/@open-draft/until": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@open-draft/until/-/until-2.1.0.tgz", + "integrity": "sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==", "dev": true, "license": "MIT" }, @@ -11938,6 +11946,8 @@ }, "node_modules/is-node-process": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-node-process/-/is-node-process-1.2.0.tgz", + "integrity": "sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==", "dev": true, "license": "MIT" }, @@ -13446,9 +13456,9 @@ "license": "MIT" }, "node_modules/msw": { - "version": "2.7.5", - "resolved": "https://registry.npmjs.org/msw/-/msw-2.7.5.tgz", - "integrity": "sha512-00MyTlY3TJutBa5kiU+jWiz2z5pNJDYHn2TgPkGkh92kMmNH43RqvMXd8y/7HxNn8RjzUbvZWYZjcS36fdb6sw==", + "version": "2.10.2", + "resolved": "https://registry.npmjs.org/msw/-/msw-2.10.2.tgz", + "integrity": "sha512-RCKM6IZseZQCWcSWlutdf590M8nVfRHG1ImwzOtwz8IYxgT4zhUO0rfTcTvDGiaFE0Rhcc+h43lcF3Jc9gFtwQ==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -13457,7 +13467,7 @@ "@bundled-es-modules/statuses": "^1.0.1", "@bundled-es-modules/tough-cookie": "^0.1.6", "@inquirer/confirm": "^5.0.0", - "@mswjs/interceptors": "^0.37.0", + "@mswjs/interceptors": "^0.39.1", "@open-draft/deferred-promise": "^2.2.0", "@open-draft/until": "^2.1.0", "@types/cookie": "^0.6.0", @@ -14321,6 +14331,8 @@ }, "node_modules/outvariant": { "version": "1.4.3", + "resolved": "https://registry.npmjs.org/outvariant/-/outvariant-1.4.3.tgz", + "integrity": "sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==", "dev": true, "license": "MIT" }, @@ -16941,6 +16953,8 @@ }, "node_modules/strict-event-emitter": { "version": "0.5.1", + "resolved": "https://registry.npmjs.org/strict-event-emitter/-/strict-event-emitter-0.5.1.tgz", + "integrity": "sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==", "dev": true, "license": "MIT" }, @@ -21641,7 +21655,9 @@ } }, "@mswjs/interceptors": { - "version": "0.37.1", + "version": "0.39.2", + "resolved": "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.39.2.tgz", + "integrity": "sha512-RuzCup9Ct91Y7V79xwCb146RaBRHZ7NBbrIUySumd1rpKqHL5OonaqrGIbug5hNwP/fRyxFMA6ISgw4FTtYFYg==", "dev": true, "requires": { "@open-draft/deferred-promise": "^2.2.0", @@ -21686,10 +21702,14 @@ }, "@open-draft/deferred-promise": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@open-draft/deferred-promise/-/deferred-promise-2.2.0.tgz", + "integrity": "sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==", "dev": true }, "@open-draft/logger": { "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@open-draft/logger/-/logger-0.3.0.tgz", + "integrity": "sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ==", "dev": true, "requires": { "is-node-process": "^1.2.0", @@ -21698,6 +21718,8 @@ }, "@open-draft/until": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@open-draft/until/-/until-2.1.0.tgz", + "integrity": "sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==", "dev": true }, "@openshift/dynamic-plugin-sdk": { @@ -27029,6 +27051,8 @@ }, "is-node-process": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-node-process/-/is-node-process-1.2.0.tgz", + "integrity": "sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==", "dev": true }, "is-number": { @@ -28003,16 +28027,16 @@ "version": "2.1.3" }, "msw": { - "version": "2.7.5", - "resolved": "https://registry.npmjs.org/msw/-/msw-2.7.5.tgz", - "integrity": "sha512-00MyTlY3TJutBa5kiU+jWiz2z5pNJDYHn2TgPkGkh92kMmNH43RqvMXd8y/7HxNn8RjzUbvZWYZjcS36fdb6sw==", + "version": "2.10.2", + "resolved": "https://registry.npmjs.org/msw/-/msw-2.10.2.tgz", + "integrity": "sha512-RCKM6IZseZQCWcSWlutdf590M8nVfRHG1ImwzOtwz8IYxgT4zhUO0rfTcTvDGiaFE0Rhcc+h43lcF3Jc9gFtwQ==", "dev": true, "requires": { "@bundled-es-modules/cookie": "^2.0.1", "@bundled-es-modules/statuses": "^1.0.1", "@bundled-es-modules/tough-cookie": "^0.1.6", "@inquirer/confirm": "^5.0.0", - "@mswjs/interceptors": "^0.37.0", + "@mswjs/interceptors": "^0.39.1", "@open-draft/deferred-promise": "^2.2.0", "@open-draft/until": "^2.1.0", "@types/cookie": "^0.6.0", @@ -28573,6 +28597,8 @@ }, "outvariant": { "version": "1.4.3", + "resolved": "https://registry.npmjs.org/outvariant/-/outvariant-1.4.3.tgz", + "integrity": "sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==", "dev": true }, "own-keys": { @@ -30225,6 +30251,8 @@ }, "strict-event-emitter": { "version": "0.5.1", + "resolved": "https://registry.npmjs.org/strict-event-emitter/-/strict-event-emitter-0.5.1.tgz", + "integrity": "sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==", "dev": true }, "string_decoder": { diff --git a/package.json b/package.json index 884b9531..aa615e45 100644 --- a/package.json +++ b/package.json @@ -77,7 +77,7 @@ "madge": "8.0.0", "mini-css-extract-plugin": "2.9.2", "moment": "2.30.1", - "msw": "2.7.5", + "msw": "2.10.2", "npm-run-all": "4.1.5", "path-browserify": "1.0.1", "postcss-scss": "4.0.9", diff --git a/src/mockServiceWorker.js b/src/mockServiceWorker.js index 8b841baf..de7bc0f2 100644 --- a/src/mockServiceWorker.js +++ b/src/mockServiceWorker.js @@ -5,24 +5,23 @@ * Mock Service Worker. * @see https://github.com/mswjs/msw * - Please do NOT modify this file. - * - Please do NOT serve this file on production. */ -const PACKAGE_VERSION = '2.7.5' -const INTEGRITY_CHECKSUM = '00729d72e3b82faf54ca8b9621dbb96f' +const PACKAGE_VERSION = '2.10.2' +const INTEGRITY_CHECKSUM = 'f5825c521429caf22a4dd13b66e243af' const IS_MOCKED_RESPONSE = Symbol('isMockedResponse') const activeClientIds = new Set() -self.addEventListener('install', function () { +addEventListener('install', function () { self.skipWaiting() }) -self.addEventListener('activate', function (event) { +addEventListener('activate', function (event) { event.waitUntil(self.clients.claim()) }) -self.addEventListener('message', async function (event) { - const clientId = event.source.id +addEventListener('message', async function (event) { + const clientId = Reflect.get(event.source || {}, 'id') if (!clientId || !self.clients) { return @@ -94,17 +93,18 @@ self.addEventListener('message', async function (event) { } }) -self.addEventListener('fetch', function (event) { - const { request } = event - +addEventListener('fetch', function (event) { // Bypass navigation requests. - if (request.mode === 'navigate') { + if (event.request.mode === 'navigate') { return } // Opening the DevTools triggers the "only-if-cached" request // that cannot be handled by the worker. Bypass such requests. - if (request.cache === 'only-if-cached' && request.mode !== 'same-origin') { + if ( + event.request.cache === 'only-if-cached' && + event.request.mode !== 'same-origin' + ) { return } @@ -115,48 +115,62 @@ self.addEventListener('fetch', function (event) { return } - // Generate unique request ID. const requestId = crypto.randomUUID() event.respondWith(handleRequest(event, requestId)) }) +/** + * @param {FetchEvent} event + * @param {string} requestId + */ async function handleRequest(event, requestId) { const client = await resolveMainClient(event) + const requestCloneForEvents = event.request.clone() const response = await getResponse(event, client, requestId) // Send back the response clone for the "response:*" life-cycle events. // Ensure MSW is active and ready to handle the message, otherwise // this message will pend indefinitely. if (client && activeClientIds.has(client.id)) { - ;(async function () { - const responseClone = response.clone() + const serializedRequest = await serializeRequest(requestCloneForEvents) - sendToClient( - client, - { - type: 'RESPONSE', - payload: { - requestId, - isMockedResponse: IS_MOCKED_RESPONSE in response, + // Clone the response so both the client and the library could consume it. + const responseClone = response.clone() + + sendToClient( + client, + { + type: 'RESPONSE', + payload: { + isMockedResponse: IS_MOCKED_RESPONSE in response, + request: { + id: requestId, + ...serializedRequest, + }, + response: { type: responseClone.type, status: responseClone.status, statusText: responseClone.statusText, - body: responseClone.body, headers: Object.fromEntries(responseClone.headers.entries()), + body: responseClone.body, }, }, - [responseClone.body], - ) - })() + }, + responseClone.body ? [serializedRequest.body, responseClone.body] : [], + ) } return response } -// Resolve the main client for the given event. -// Client that issues a request doesn't necessarily equal the client -// that registered the worker. It's with the latter the worker should -// communicate with during the response resolving phase. +/** + * Resolve the main client for the given event. + * Client that issues a request doesn't necessarily equal the client + * that registered the worker. It's with the latter the worker should + * communicate with during the response resolving phase. + * @param {FetchEvent} event + * @returns {Promise} + */ async function resolveMainClient(event) { const client = await self.clients.get(event.clientId) @@ -184,12 +198,16 @@ async function resolveMainClient(event) { }) } +/** + * @param {FetchEvent} event + * @param {Client | undefined} client + * @param {string} requestId + * @returns {Promise} + */ async function getResponse(event, client, requestId) { - const { request } = event - // Clone the request because it might've been already used // (i.e. its body has been read and sent to the client). - const requestClone = request.clone() + const requestClone = event.request.clone() function passthrough() { // Cast the request headers to a new Headers instance @@ -230,29 +248,17 @@ async function getResponse(event, client, requestId) { } // Notify the client that a request has been intercepted. - const requestBuffer = await request.arrayBuffer() + const serializedRequest = await serializeRequest(event.request) const clientMessage = await sendToClient( client, { type: 'REQUEST', payload: { id: requestId, - url: request.url, - mode: request.mode, - method: request.method, - headers: Object.fromEntries(request.headers.entries()), - cache: request.cache, - credentials: request.credentials, - destination: request.destination, - integrity: request.integrity, - redirect: request.redirect, - referrer: request.referrer, - referrerPolicy: request.referrerPolicy, - body: requestBuffer, - keepalive: request.keepalive, + ...serializedRequest, }, }, - [requestBuffer], + [serializedRequest.body], ) switch (clientMessage.type) { @@ -268,6 +274,12 @@ async function getResponse(event, client, requestId) { return passthrough() } +/** + * @param {Client} client + * @param {any} message + * @param {Array} transferrables + * @returns {Promise} + */ function sendToClient(client, message, transferrables = []) { return new Promise((resolve, reject) => { const channel = new MessageChannel() @@ -280,14 +292,18 @@ function sendToClient(client, message, transferrables = []) { resolve(event.data) } - client.postMessage( - message, - [channel.port2].concat(transferrables.filter(Boolean)), - ) + client.postMessage(message, [ + channel.port2, + ...transferrables.filter(Boolean), + ]) }) } -async function respondWithMock(response) { +/** + * @param {Response} response + * @returns {Response} + */ +function respondWithMock(response) { // Setting response status code to 0 is a no-op. // However, when responding with a "Response.error()", the produced Response // instance will have status code set to 0. Since it's not possible to create @@ -305,3 +321,24 @@ async function respondWithMock(response) { return mockedResponse } + +/** + * @param {Request} request + */ +async function serializeRequest(request) { + return { + url: request.url, + mode: request.mode, + method: request.method, + headers: Object.fromEntries(request.headers.entries()), + cache: request.cache, + credentials: request.credentials, + destination: request.destination, + integrity: request.integrity, + redirect: request.redirect, + referrer: request.referrer, + referrerPolicy: request.referrerPolicy, + body: await request.arrayBuffer(), + keepalive: request.keepalive, + } +} From 2f8b550408b5f3040e6414f9f25c5a6aa115646b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 17 Jun 2025 04:23:01 +0000 Subject: [PATCH 057/331] build(deps-dev): bump @types/node from 22.15.1 to 24.0.3 Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 22.15.1 to 24.0.3. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node) --- updated-dependencies: - dependency-name: "@types/node" dependency-version: 24.0.3 dependency-type: direct:development update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- package-lock.json | 30 +++++++++++++++--------------- package.json | 2 +- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/package-lock.json b/package-lock.json index 57f8ee6f..750ead61 100644 --- a/package-lock.json +++ b/package-lock.json @@ -47,7 +47,7 @@ "@testing-library/jest-dom": "6.6.3", "@testing-library/react": "16.3.0", "@testing-library/user-event": "14.6.1", - "@types/node": "22.15.1", + "@types/node": "24.0.3", "@types/react": "18.3.12", "@types/react-dom": "18.3.1", "@types/react-redux": "7.1.34", @@ -5410,12 +5410,12 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "22.15.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.15.1.tgz", - "integrity": "sha512-gSZyd0Qmv7qvbd2fJ9HGdYmv1yhNdelIA4YOtN6vkcmSwFhthxSEsBgU/JYZcXjWT6DFzoATcHrc52Ckh8SeRA==", + "version": "24.0.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.0.3.tgz", + "integrity": "sha512-R4I/kzCYAdRLzfiCabn9hxWfbuHS573x+r0dJMkkzThEa7pbrcDWK+9zu3e7aBOouf+rQAciqPFMnxwr0aWgKg==", "license": "MIT", "dependencies": { - "undici-types": "~6.21.0" + "undici-types": "~7.8.0" } }, "node_modules/@types/node-forge": { @@ -18432,9 +18432,9 @@ } }, "node_modules/undici-types": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", - "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.8.0.tgz", + "integrity": "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==", "license": "MIT" }, "node_modules/unicode-canonical-property-names-ecmascript": { @@ -22880,11 +22880,11 @@ "dev": true }, "@types/node": { - "version": "22.15.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.15.1.tgz", - "integrity": "sha512-gSZyd0Qmv7qvbd2fJ9HGdYmv1yhNdelIA4YOtN6vkcmSwFhthxSEsBgU/JYZcXjWT6DFzoATcHrc52Ckh8SeRA==", + "version": "24.0.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.0.3.tgz", + "integrity": "sha512-R4I/kzCYAdRLzfiCabn9hxWfbuHS573x+r0dJMkkzThEa7pbrcDWK+9zu3e7aBOouf+rQAciqPFMnxwr0aWgKg==", "requires": { - "undici-types": "~6.21.0" + "undici-types": "~7.8.0" } }, "@types/node-forge": { @@ -31178,9 +31178,9 @@ } }, "undici-types": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", - "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==" + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.8.0.tgz", + "integrity": "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==" }, "unicode-canonical-property-names-ecmascript": { "version": "2.0.1", diff --git a/package.json b/package.json index aa615e45..60c0e88c 100644 --- a/package.json +++ b/package.json @@ -45,7 +45,7 @@ "@testing-library/jest-dom": "6.6.3", "@testing-library/react": "16.3.0", "@testing-library/user-event": "14.6.1", - "@types/node": "22.15.1", + "@types/node": "24.0.3", "@types/react": "18.3.12", "@types/react-dom": "18.3.1", "@types/react-redux": "7.1.34", From 139dd367fecfbd5021630315b360888002206464 Mon Sep 17 00:00:00 2001 From: regexowl Date: Tue, 17 Jun 2025 14:04:57 +0200 Subject: [PATCH 058/331] Manually revert "Wizard: temporarily disable OCI" This reverts commit efed39d, manual revert was needed as the tile were migrated to cards in the meantime. --- .../steps/ImageOutput/TargetEnvironment.tsx | 47 +++++-------------- 1 file changed, 13 insertions(+), 34 deletions(-) diff --git a/src/Components/CreateImageWizard/steps/ImageOutput/TargetEnvironment.tsx b/src/Components/CreateImageWizard/steps/ImageOutput/TargetEnvironment.tsx index 6f19745f..9de76242 100644 --- a/src/Components/CreateImageWizard/steps/ImageOutput/TargetEnvironment.tsx +++ b/src/Components/CreateImageWizard/steps/ImageOutput/TargetEnvironment.tsx @@ -7,7 +7,6 @@ import { FormGroup, Popover, Radio, - Tooltip, Content, CardHeader, Gallery, @@ -33,10 +32,7 @@ import { selectImageTypes, } from '../../../../store/wizardSlice'; import isRhel from '../../../../Utilities/isRhel'; -import { - useFlag, - useGetEnvironment, -} from '../../../../Utilities/useGetEnvironment'; +import { useGetEnvironment } from '../../../../Utilities/useGetEnvironment'; type TargetEnvironmentCardProps = { title: string; @@ -108,10 +104,6 @@ const TargetEnvironment = () => { const prefetchSources = provisioningApi.usePrefetch('getSourceList'); const prefetchActivationKeys = rhsmApi.usePrefetch('listActivationKeys'); - const showOracleUnavailableWarning = useFlag( - 'image-builder.oci.unavailable-warning.enabled' - ); - useEffect(() => { if (!isFedoraEnv) prefetchActivationKeys(); }, []); @@ -138,18 +130,6 @@ const TargetEnvironment = () => { } }; - const ociTile = ( - handleToggleEnvironment('oci')} - isSelected={environments.includes('oci')} - isDisabled={showOracleUnavailableWarning} - /> - ); - const publicCloudsSupported = () => { return ( supportedEnvironments?.includes('aws') || @@ -205,19 +185,18 @@ const TargetEnvironment = () => { isSelected={environments.includes('azure')} /> )} - {supportedEnvironments?.includes('oci') && - showOracleUnavailableWarning && ( - Oracle Cloud support is temporarily unavailable
- } - > -
{ociTile}
- - )} - {supportedEnvironments?.includes('oci') && - !showOracleUnavailableWarning && - ociTile} + {supportedEnvironments?.includes('oci') && ( + handleToggleEnvironment('oci')} + isSelected={environments.includes('oci')} + /> + )} )} From cb08466734e196d10e42dd8c9e4c3b18b7e36d31 Mon Sep 17 00:00:00 2001 From: Gianluca Zuccarelli Date: Tue, 17 Jun 2025 15:25:53 +0100 Subject: [PATCH 059/331] Makefile: update cockpit ref To enable dark mode in cockpit we need to update the ref since both cockpit and the image-builder frontend have been updated to PF6. The old ref was still from before cockpit was migrated to PF6 and so the incorrect classes were being added. --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 9bb257af..77a0cdef 100644 --- a/Makefile +++ b/Makefile @@ -7,7 +7,7 @@ VERSION := $(shell (cd "$(SRCDIR)" && grep "^Version:" cockpit/$(PACKAGE_NAME).s COMMIT = $(shell (cd "$(SRCDIR)" && git rev-parse HEAD)) # TODO: figure out a strategy for keeping this updated -COCKPIT_REPO_COMMIT = b0e82161b4afcb9f0a6fddd8ff94380e983b2238 +COCKPIT_REPO_COMMIT = a70142a7a6f9c4e78e71f3c4ec738b6db2fbb04f COCKPIT_REPO_URL = https://github.com/cockpit-project/cockpit.git COCKPIT_REPO_TREE = '$(strip $(COCKPIT_REPO_COMMIT))^{tree}' From 50d88e59499fd60bf60168572a1d3f36ddf943c5 Mon Sep 17 00:00:00 2001 From: Gianluca Zuccarelli Date: Tue, 17 Jun 2025 15:26:42 +0100 Subject: [PATCH 060/331] AppCockpit: add dark mode helper Import the cockpit-dark-theme helper from the cockpit project. This detects when dark mode is enabled and automatically applies the correct styles. --- src/AppCockpit.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/AppCockpit.tsx b/src/AppCockpit.tsx index 02818817..0d073197 100644 --- a/src/AppCockpit.tsx +++ b/src/AppCockpit.tsx @@ -3,6 +3,7 @@ import '@patternfly/patternfly/patternfly-addons.css'; import React from 'react'; +import 'cockpit-dark-theme'; import { Page, PageSection } from '@patternfly/react-core'; import NotificationsPortal from '@redhat-cloud-services/frontend-components-notifications/NotificationPortal'; import { createRoot } from 'react-dom/client'; From 0cfe3dde301c3988c8ac29ff52fe58cae500dcf7 Mon Sep 17 00:00:00 2001 From: Katarina Sieklova Date: Tue, 13 May 2025 14:00:48 +0200 Subject: [PATCH 061/331] Wizard: Fix "None" options in Selects for policies and Oscap profiles --- .../CreateImageWizard/steps/Oscap/components/PolicySelector.tsx | 2 +- .../steps/Oscap/components/ProfileSelector.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Components/CreateImageWizard/steps/Oscap/components/PolicySelector.tsx b/src/Components/CreateImageWizard/steps/Oscap/components/PolicySelector.tsx index dce90069..2127c2cf 100644 --- a/src/Components/CreateImageWizard/steps/Oscap/components/PolicySelector.tsx +++ b/src/Components/CreateImageWizard/steps/Oscap/components/PolicySelector.tsx @@ -287,7 +287,7 @@ const PolicySelector = () => { } as React.CSSProperties } > - {policyTitle || 'Select a policy'} + {policyID === undefined ? 'None' : policyTitle || 'Select a policy'} ); diff --git a/src/Components/CreateImageWizard/steps/Oscap/components/ProfileSelector.tsx b/src/Components/CreateImageWizard/steps/Oscap/components/ProfileSelector.tsx index 37e20c52..fdd50468 100644 --- a/src/Components/CreateImageWizard/steps/Oscap/components/ProfileSelector.tsx +++ b/src/Components/CreateImageWizard/steps/Oscap/components/ProfileSelector.tsx @@ -329,7 +329,7 @@ const ProfileSelector = () => { > Date: Tue, 20 May 2025 14:18:20 +0200 Subject: [PATCH 062/331] Wizard: edit tests related to Compliance step --- .../steps/Oscap/components/PolicySelector.tsx | 6 ++++-- .../steps/Oscap/components/ProfileSelector.tsx | 4 ++-- .../steps/FirstBoot/Firstboot.test.tsx | 4 +--- .../CreateImageWizard/steps/Kernel/Kernel.test.tsx | 4 +--- .../steps/Oscap/Compliance.test.tsx | 4 ++-- .../CreateImageWizard/steps/Oscap/Oscap.test.tsx | 14 ++++---------- .../steps/Services/Services.test.tsx | 4 +--- 7 files changed, 15 insertions(+), 25 deletions(-) diff --git a/src/Components/CreateImageWizard/steps/Oscap/components/PolicySelector.tsx b/src/Components/CreateImageWizard/steps/Oscap/components/PolicySelector.tsx index 2127c2cf..c215bc80 100644 --- a/src/Components/CreateImageWizard/steps/Oscap/components/PolicySelector.tsx +++ b/src/Components/CreateImageWizard/steps/Oscap/components/PolicySelector.tsx @@ -48,6 +48,7 @@ type ComplianceSelectOptionPropType = { type ComplianceSelectOptionValueType = { policyID: string; profileID: string; + title: string; toString: () => string; }; @@ -59,6 +60,7 @@ const ComplianceSelectOption = ({ policy }: ComplianceSelectOptionPropType) => { ): ComplianceSelectOptionValueType => ({ policyID, profileID, + title, toString: () => title || 'None', }); @@ -234,7 +236,7 @@ const PolicySelector = () => { changeCompliance({ profileID: selection.profileID, policyID: selection.policyID, - policyTitle: selection.toString(), + policyTitle: selection.title, }) ); }); @@ -287,7 +289,7 @@ const PolicySelector = () => { } as React.CSSProperties } > - {policyID === undefined ? 'None' : policyTitle || 'Select a policy'} + {policyTitle || 'None'} ); diff --git a/src/Components/CreateImageWizard/steps/Oscap/components/ProfileSelector.tsx b/src/Components/CreateImageWizard/steps/Oscap/components/ProfileSelector.tsx index fdd50468..1097f985 100644 --- a/src/Components/CreateImageWizard/steps/Oscap/components/ProfileSelector.tsx +++ b/src/Components/CreateImageWizard/steps/Oscap/components/ProfileSelector.tsx @@ -329,11 +329,11 @@ const ProfileSelector = () => { > diff --git a/src/test/Components/CreateImageWizard/steps/FirstBoot/Firstboot.test.tsx b/src/test/Components/CreateImageWizard/steps/FirstBoot/Firstboot.test.tsx index 1ee39898..94798db1 100644 --- a/src/test/Components/CreateImageWizard/steps/FirstBoot/Firstboot.test.tsx +++ b/src/test/Components/CreateImageWizard/steps/FirstBoot/Firstboot.test.tsx @@ -58,9 +58,7 @@ const goToFirstBootStep = async (): Promise => { const selectSimplifiedOscapProfile = async () => { const user = userEvent.setup(); - const selectProfileDropdown = await screen.findByPlaceholderText( - /select a profile/i - ); + const selectProfileDropdown = await screen.findByPlaceholderText(/none/i); await waitFor(() => user.click(selectProfileDropdown)); const simplifiedProfile = await screen.findByText(/Simplified profile/i); diff --git a/src/test/Components/CreateImageWizard/steps/Kernel/Kernel.test.tsx b/src/test/Components/CreateImageWizard/steps/Kernel/Kernel.test.tsx index cc24fad7..9d28ad32 100644 --- a/src/test/Components/CreateImageWizard/steps/Kernel/Kernel.test.tsx +++ b/src/test/Components/CreateImageWizard/steps/Kernel/Kernel.test.tsx @@ -134,9 +134,7 @@ const removeKernelArg = async (kernelArg: string) => { const selectProfile = async () => { const user = userEvent.setup(); - const selectProfileDropdown = await screen.findByPlaceholderText( - /select a profile/i - ); + const selectProfileDropdown = await screen.findByPlaceholderText(/none/i); await waitFor(() => user.click(selectProfileDropdown)); const cis1Profile = await screen.findByText(/Kernel append only profile/i); diff --git a/src/test/Components/CreateImageWizard/steps/Oscap/Compliance.test.tsx b/src/test/Components/CreateImageWizard/steps/Oscap/Compliance.test.tsx index 59762f75..e87e13e6 100644 --- a/src/test/Components/CreateImageWizard/steps/Oscap/Compliance.test.tsx +++ b/src/test/Components/CreateImageWizard/steps/Oscap/Compliance.test.tsx @@ -44,7 +44,7 @@ const goToComplianceStep = async () => { }); await waitFor(() => user.click(button)); // wait until all policies are loaded - await screen.findByText('Select a policy'); + await screen.findByText('None'); }; const goToReviewStep = async () => { @@ -68,7 +68,7 @@ const goToReviewStep = async () => { const selectPolicy = async () => { const user = userEvent.setup(); - const policyMenu = await screen.findByText('Select a policy'); + const policyMenu = await screen.findByText('None'); await waitFor(() => user.click(policyMenu)); const cisl2 = await screen.findByRole('option', { diff --git a/src/test/Components/CreateImageWizard/steps/Oscap/Oscap.test.tsx b/src/test/Components/CreateImageWizard/steps/Oscap/Oscap.test.tsx index 04ef979b..4062a703 100644 --- a/src/test/Components/CreateImageWizard/steps/Oscap/Oscap.test.tsx +++ b/src/test/Components/CreateImageWizard/steps/Oscap/Oscap.test.tsx @@ -53,9 +53,7 @@ const selectWslTarget = async () => { const selectProfile = async () => { const user = userEvent.setup(); - const selectProfileDropdown = await screen.findByPlaceholderText( - /select a profile/i - ); + const selectProfileDropdown = await screen.findByPlaceholderText(/none/i); await waitFor(() => user.click(selectProfileDropdown)); const cis1Profile = await screen.findByText( @@ -66,9 +64,7 @@ const selectProfile = async () => { const selectDifferentProfile = async () => { const user = userEvent.setup(); - const selectProfileDropdown = await screen.findByPlaceholderText( - /select a profile/i - ); + const selectProfileDropdown = await screen.findByPlaceholderText(/none/i); await waitFor(() => user.click(selectProfileDropdown)); const cis2Profile = await screen.findByText( @@ -79,9 +75,7 @@ const selectDifferentProfile = async () => { const selectNone = async () => { const user = userEvent.setup(); - const selectProfileDropdown = await screen.findByPlaceholderText( - /select a profile/i - ); + const selectProfileDropdown = await screen.findByPlaceholderText(/none/i); await waitFor(() => user.click(selectProfileDropdown)); await waitFor(async () => user.click(await screen.findByText(/none/i))); @@ -197,7 +191,7 @@ describe('Step OpenSCAP', () => { /OpenSCAP profiles are not compatible with WSL images/i ); await waitFor(() => { - expect(screen.getByPlaceholderText(/select a profile/i)).toBeEnabled(); + expect(screen.getByPlaceholderText(/none/i)).toBeEnabled(); }); }); diff --git a/src/test/Components/CreateImageWizard/steps/Services/Services.test.tsx b/src/test/Components/CreateImageWizard/steps/Services/Services.test.tsx index b4d2a145..05c81039 100644 --- a/src/test/Components/CreateImageWizard/steps/Services/Services.test.tsx +++ b/src/test/Components/CreateImageWizard/steps/Services/Services.test.tsx @@ -108,9 +108,7 @@ const removeService = async (service: string) => { const selectProfile = async () => { const user = userEvent.setup(); - const selectProfileDropdown = await screen.findByPlaceholderText( - /select a profile/i - ); + const selectProfileDropdown = await screen.findByPlaceholderText(/none/i); await waitFor(() => user.click(selectProfileDropdown)); const cis1Profile = await screen.findByText( From 9478958085f167b93fd64440f80498b3f74c0aa5 Mon Sep 17 00:00:00 2001 From: regexowl Date: Wed, 18 Jun 2025 09:38:40 +0200 Subject: [PATCH 063/331] Wizard: Fix wizard height This adds a style to make sure the Wizard takes up the entire height of the page also in Firefox. --- src/Components/CreateImageWizard/CreateImageWizard.scss | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/Components/CreateImageWizard/CreateImageWizard.scss b/src/Components/CreateImageWizard/CreateImageWizard.scss index 183fa712..8767d79a 100644 --- a/src/Components/CreateImageWizard/CreateImageWizard.scss +++ b/src/Components/CreateImageWizard/CreateImageWizard.scss @@ -53,3 +53,8 @@ div.pf-v6-c-alert.pf-m-inline.pf-m-plain.pf-m-warning { margin-block-start: 0; } } + +// Ensures the wizard takes up the entire height of the page in Firefox as well +.pf-v6-c-wizard { + flex: 1; +} From cd137fb055d5ad5962731a0e9b416896e84b6bb2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anna=20V=C3=ADtov=C3=A1?= Date: Tue, 3 Jun 2025 15:15:58 +0200 Subject: [PATCH 064/331] Tets: add Kernel customizations test --- playwright/Customizations/Kernel.spec.ts | 123 +++++++++++++++++++++++ 1 file changed, 123 insertions(+) create mode 100644 playwright/Customizations/Kernel.spec.ts diff --git a/playwright/Customizations/Kernel.spec.ts b/playwright/Customizations/Kernel.spec.ts new file mode 100644 index 00000000..7a3f28b9 --- /dev/null +++ b/playwright/Customizations/Kernel.spec.ts @@ -0,0 +1,123 @@ +import { expect } from '@playwright/test'; +import { v4 as uuidv4 } from 'uuid'; + +import { test } from '../fixtures/cleanup'; +import { isHosted } from '../helpers/helpers'; +import { login } from '../helpers/login'; +import { navigateToOptionalSteps, ibFrame } from '../helpers/navHelpers'; +import { + registerLater, + fillInDetails, + createBlueprint, + fillInImageOutputGuest, + deleteBlueprint, + exportBlueprint, + importBlueprint, +} from '../helpers/wizardHelpers'; + +test('Create a blueprint with Kernel customization', async ({ + page, + cleanup, +}) => { + const blueprintName = 'test-' + uuidv4(); + + // Delete the blueprint after the run fixture + await cleanup.add(() => deleteBlueprint(page, blueprintName)); + + // Login, navigate to IB and get the frame + await login(page); + const frame = await ibFrame(page); + + await test.step('Navigate to optional steps in Wizard', async () => { + await navigateToOptionalSteps(frame); + await registerLater(frame); + }); + + await test.step('Select and fill the Kernel step', async () => { + await frame.getByRole('button', { name: 'Kernel' }).click(); + await frame.getByRole('button', { name: 'Menu toggle' }).click(); + await frame.getByRole('option', { name: 'kernel', exact: true }).click(); + await frame.getByPlaceholder('Add kernel argument').fill('rootwait'); + await frame.getByRole('button', { name: 'Add kernel argument' }).click(); + await frame + .getByPlaceholder('Add kernel argument') + .fill('invalid/argument'); + await frame.getByRole('button', { name: 'Add kernel argument' }).click(); + await expect(frame.getByText('Invalid format.')).toBeVisible(); + await frame.getByPlaceholder('Select kernel package').fill('new-package'); + await frame + .getByRole('option', { name: 'Custom kernel package "new-' }) + .click(); + await expect( + frame.getByRole('heading', { name: 'Warning alert: Custom kernel' }) + ).toBeVisible(); + await frame.getByRole('button', { name: 'Clear input' }).first().click(); + await frame.getByRole('button', { name: 'Menu toggle' }).click(); + await expect( + frame.getByRole('option', { name: 'new-package' }) + ).toBeVisible(); + await frame.getByPlaceholder('Select kernel package').fill('f'); + await expect( + frame.getByRole('option', { + name: '"f" is not a valid kernel package name', + }) + ).toBeVisible(); + await frame.getByPlaceholder('Add kernel argument').fill('console=tty0'); + await frame.getByRole('button', { name: 'Add kernel argument' }).click(); + await frame.getByPlaceholder('Add kernel argument').fill('xxnosmp'); + await frame.getByRole('button', { name: 'Add kernel argument' }).click(); + await frame + .getByPlaceholder('Add kernel argument') + .fill('console=ttyS0,115200n8'); + await frame.getByRole('button', { name: 'Add kernel argument' }).click(); + await frame.getByRole('button', { name: 'Review and finish' }).click(); + }); + + await test.step('Fill the BP details', async () => { + await fillInDetails(frame, blueprintName); + }); + + await test.step('Create BP', async () => { + await createBlueprint(frame, blueprintName); + }); + + await test.step('Edit BP', async () => { + await frame.getByRole('button', { name: 'Edit blueprint' }).click(); + await frame.getByLabel('Revisit Kernel step').click(); + await frame.getByRole('button', { name: 'Menu toggle' }).click(); + await frame.getByRole('option', { name: 'kernel', exact: true }).click(); + await frame.getByPlaceholder('Add kernel argument').fill('new=argument'); + await frame.getByRole('button', { name: 'Add kernel argument' }).click(); + await frame.getByRole('button', { name: 'Close xxnosmp' }).click(); + await frame.getByRole('button', { name: 'Review and finish' }).click(); + await frame + .getByRole('button', { name: 'Save changes to blueprint' }) + .click(); + }); + + // This is for hosted service only as these features are not available in cockpit plugin + await test.step('Export BP', async (step) => { + step.skip(!isHosted(), 'Exporting is not available in the plugin'); + await exportBlueprint(page, blueprintName); + }); + + await test.step('Import BP', async (step) => { + step.skip(!isHosted(), 'Importing is not available in the plugin'); + await importBlueprint(page, blueprintName); + }); + + await test.step('Review imported BP', async (step) => { + step.skip(!isHosted(), 'Importing is not available in the plugin'); + await fillInImageOutputGuest(frame); + await frame.getByRole('button', { name: 'Kernel' }).click(); + await expect(frame.getByPlaceholder('Select kernel package')).toHaveValue( + 'kernel' + ); + await expect(frame.getByText('rootwait')).toBeVisible(); + await expect(frame.getByText('console=tty0')).toBeVisible(); + await expect(frame.getByText('console=ttyS0,115200n8')).toBeVisible(); + await expect(frame.getByText('new=argument')).toBeVisible(); + await expect(frame.getByText('xxnosmp')).toBeHidden(); + await frame.getByRole('button', { name: 'Cancel' }).click(); + }); +}); From 4667f6b0ac9b75944e1f89ffefa1dd04d6e2fce1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anna=20V=C3=ADtov=C3=A1?= Date: Wed, 18 Jun 2025 10:31:56 +0200 Subject: [PATCH 065/331] Wizard: cleanup request mapper --- .../utilities/requestMapper.ts | 44 ++++++++----------- 1 file changed, 19 insertions(+), 25 deletions(-) diff --git a/src/Components/CreateImageWizard/utilities/requestMapper.ts b/src/Components/CreateImageWizard/utilities/requestMapper.ts index 38eff0a8..2dcedb4a 100644 --- a/src/Components/CreateImageWizard/utilities/requestMapper.ts +++ b/src/Components/CreateImageWizard/utilities/requestMapper.ts @@ -519,7 +519,7 @@ const getImageOptions = ( case 'aws': if (selectAwsShareMethod(state) === 'sources') return { share_with_sources: [selectAwsSourceId(state) || ''] }; - else return { share_with_accounts: [selectAwsAccountId(state)] }; + return { share_with_accounts: [selectAwsAccountId(state)] }; case 'azure': if (selectAzureShareMethod(state) === 'sources') return { @@ -527,13 +527,12 @@ const getImageOptions = ( resource_group: selectAzureResourceGroup(state), hyper_v_generation: selectAzureHyperVGeneration(state), }; - else - return { - tenant_id: selectAzureTenantId(state), - subscription_id: selectAzureSubscriptionId(state), - resource_group: selectAzureResourceGroup(state), - hyper_v_generation: selectAzureHyperVGeneration(state), - }; + return { + tenant_id: selectAzureTenantId(state), + subscription_id: selectAzureSubscriptionId(state), + resource_group: selectAzureResourceGroup(state), + hyper_v_generation: selectAzureHyperVGeneration(state), + }; case 'gcp': { let googleAccount: string = ''; if (selectGcpShareMethod(state) === 'withGoogle') { @@ -552,10 +551,9 @@ const getImageOptions = ( googleAccount = `domain:${gcpEmail}`; } return { share_with_accounts: [googleAccount] }; - } else { - // TODO: GCP withInsights is not implemented yet - return {}; } + // TODO: GCP withInsights is not implemented yet + return {}; } } return {}; @@ -716,9 +714,8 @@ const getPackages = (state: RootState) => { return packages .map((pkg) => pkg.name) .concat(groups.map((grp) => '@' + grp.name)); - } else { - return undefined; } + return undefined; }; const getModules = (state: RootState) => { @@ -726,9 +723,8 @@ const getModules = (state: RootState) => { if (modules.length > 0) { return modules; - } else { - return undefined; } + return undefined; }; const getTimezone = (state: RootState) => { @@ -737,12 +733,11 @@ const getTimezone = (state: RootState) => { if (!timezone && ntpservers?.length === 0) { return undefined; - } else { - return { - timezone: timezone ? timezone : undefined, - ntpservers: ntpservers && ntpservers.length > 0 ? ntpservers : undefined, - }; } + return { + timezone: timezone ? timezone : undefined, + ntpservers: ntpservers && ntpservers.length > 0 ? ntpservers : undefined, + }; }; const getSubscription = ( @@ -788,12 +783,11 @@ const getLocale = (state: RootState) => { if (languages?.length === 0 && !keyboard) { return undefined; - } else { - return { - languages: languages && languages.length > 0 ? languages : undefined, - keyboard: keyboard ? keyboard : undefined, - }; } + return { + languages: languages && languages.length > 0 ? languages : undefined, + keyboard: keyboard ? keyboard : undefined, + }; }; const getFirewall = (state: RootState) => { From 9189a20e57bc891670755227a5eca1318daf45c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anna=20V=C3=ADtov=C3=A1?= Date: Wed, 18 Jun 2025 12:44:47 +0200 Subject: [PATCH 066/331] Wizard: add constants for fb paths --- src/constants.ts | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/constants.ts b/src/constants.ts index 5aa15bda..dfbf0f5d 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -47,6 +47,13 @@ export const OSBUILD_SERVICE_ARCHITECTURE_URL = export const GENERATING_SSH_KEY_PAIRS_URL = 'https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/html/configuring_basic_system_settings/assembly_using-secure-communications-between-two-systems-with-openssh_configuring-basic-system-settings#generating-ssh-key-pairs_assembly_using-secure-communications-between-two-systems-with-openssh'; +export const FIRSTBOOT_PATH = '/usr/local/sbin/custom-first-boot'; +export const FIRSTBOOT_SERVICE_PATH = + '/etc/systemd/system/custom-first-boot.service'; +export const SATELLITE_PATH = '/usr/local/sbin/register-satellite'; +export const SATELLITE_SERVICE_PATH = + '/etc/systemd/system/register-satellite.service'; + export const RHEL_8 = 'rhel-8'; export const RHEL_9 = 'rhel-9'; export const RHEL_9_BETA = 'rhel-9-beta'; @@ -249,7 +256,7 @@ export const UNIQUE_VALIDATION_DELAY: number = 300; export const FIRST_BOOT_SERVICE_DATA = btoa(`[Unit] Description=Custom first boot script -ConditionFileIsExecutable=/usr/local/sbin/custom-first-boot +ConditionFileIsExecutable=${FIRSTBOOT_PATH} ConditionPathExists=!/var/local/.custom-first-boot-done Wants=network-online.target After=network-online.target @@ -259,7 +266,7 @@ After=aap-first-boot-reg.service [Service] Type=oneshot -ExecStart=/usr/local/sbin/custom-first-boot +ExecStart=${FIRSTBOOT_PATH} ExecStartPost=/usr/bin/touch /var/local/.custom-first-boot-done RemainAfterExit=yes From 47d526cf5cdd4dc1fa090d32eb59278248a86399 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anna=20V=C3=ADtov=C3=A1?= Date: Wed, 18 Jun 2025 12:45:28 +0200 Subject: [PATCH 067/331] fix: replace hardcoded paths for firstboot --- .../CreateImageWizard/utilities/requestMapper.ts | 16 +++++++++------- .../Blueprints/ImportBlueprintModal.test.tsx | 5 +++-- src/test/fixtures/editMode.ts | 3 ++- 3 files changed, 14 insertions(+), 10 deletions(-) diff --git a/src/Components/CreateImageWizard/utilities/requestMapper.ts b/src/Components/CreateImageWizard/utilities/requestMapper.ts index 2dcedb4a..bb9b002a 100644 --- a/src/Components/CreateImageWizard/utilities/requestMapper.ts +++ b/src/Components/CreateImageWizard/utilities/requestMapper.ts @@ -12,6 +12,10 @@ import { RHEL_9_BETA, RHEL_10, RHEL_10_BETA, + FIRSTBOOT_PATH, + FIRSTBOOT_SERVICE_PATH, + SATELLITE_SERVICE_PATH, + SATELLITE_PATH, } from '../../../constants'; import { RootState } from '../../../store'; import { @@ -448,9 +452,7 @@ export const mapExportRequestToState = ( }; const getFirstBootScript = (files?: File[]): string => { - const firstBootFile = files?.find( - (file) => file.path === '/usr/local/sbin/custom-first-boot' - ); + const firstBootFile = files?.find((file) => file.path === FIRSTBOOT_PATH); return firstBootFile?.data ? atob(firstBootFile.data) : ''; }; @@ -564,13 +566,13 @@ const getCustomizations = (state: RootState, orgID: string): Customizations => { const files: File[] = []; if (selectFirstBootScript(state)) { files.push({ - path: '/etc/systemd/system/custom-first-boot.service', + path: FIRSTBOOT_SERVICE_PATH, data: FIRST_BOOT_SERVICE_DATA, data_encoding: 'base64', ensure_parents: true, }); files.push({ - path: '/usr/local/sbin/custom-first-boot', + path: FIRSTBOOT_PATH, data: btoa(selectFirstBootScript(state)), data_encoding: 'base64', mode: '0774', @@ -580,13 +582,13 @@ const getCustomizations = (state: RootState, orgID: string): Customizations => { const satCmd = selectSatelliteRegistrationCommand(state); if (satCmd && selectRegistrationType(state) === 'register-satellite') { files.push({ - path: '/etc/systemd/system/register-satellite.service', + path: SATELLITE_SERVICE_PATH, data: SATELLITE_SERVICE_DATA, data_encoding: 'base64', ensure_parents: true, }); files.push({ - path: '/usr/local/sbin/register-satellite', + path: SATELLITE_PATH, data: btoa(satCmd), mode: '0774', data_encoding: 'base64', diff --git a/src/test/Components/Blueprints/ImportBlueprintModal.test.tsx b/src/test/Components/Blueprints/ImportBlueprintModal.test.tsx index b600c040..d04837ba 100644 --- a/src/test/Components/Blueprints/ImportBlueprintModal.test.tsx +++ b/src/test/Components/Blueprints/ImportBlueprintModal.test.tsx @@ -1,6 +1,7 @@ import { screen, waitFor } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; +import { FIRSTBOOT_PATH } from '../../../constants'; import { renderCustomRoutesWithReduxRouter } from '../../testUtils'; import { clickNext } from '../CreateImageWizard/wizardTestUtils'; @@ -169,7 +170,7 @@ data = "IyEvYmluL2Jhc2gKZmlyc3Rib290IHNjcmlwdCB0byB0ZXN0IGltcG9ydA==" data_encoding = "base64" ensure_parents = true mode = "0774" -path = "/usr/local/sbin/custom-first-boot" +path = "${FIRSTBOOT_PATH}" [[customizations.filesystem]] mountpoint = "/var" @@ -241,7 +242,7 @@ data = "IyEvYmluL2Jhc2gKZmlyc3Rib290IHNjcmlwdCB0byB0ZXN0IGltcG9ydA==" data_encoding = "base64" ensure_parents = true mode = "0774" -path = "/usr/local/sbin/custom-first-boot" +path = "${FIRSTBOOT_PATH}" [[customizations.filesystem]] mountpoint = "/var" diff --git a/src/test/fixtures/editMode.ts b/src/test/fixtures/editMode.ts index ebf69050..6b73a8b8 100644 --- a/src/test/fixtures/editMode.ts +++ b/src/test/fixtures/editMode.ts @@ -11,6 +11,7 @@ import { CENTOS_9, FIRST_BOOT_SERVICE, FIRST_BOOT_SERVICE_DATA, + FIRSTBOOT_PATH, RHEL_8, RHEL_9, UNIT_GIB, @@ -130,7 +131,7 @@ export const firstBootData: File[] = [ ensure_parents: true, }, { - path: '/usr/local/sbin/custom-first-boot', + path: FIRSTBOOT_PATH, data: BASE64_SCRIPT, data_encoding: 'base64', mode: '0774', From a4ac280350004cb96019a9e5d9f95885c3cb9234 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anna=20V=C3=ADtov=C3=A1?= Date: Wed, 18 Jun 2025 12:47:42 +0200 Subject: [PATCH 068/331] fix: replace hardcoded paths for firstboot svc --- .../Components/Blueprints/ImportBlueprintModal.test.tsx | 6 +++--- src/test/fixtures/editMode.ts | 3 ++- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/test/Components/Blueprints/ImportBlueprintModal.test.tsx b/src/test/Components/Blueprints/ImportBlueprintModal.test.tsx index d04837ba..73efd60d 100644 --- a/src/test/Components/Blueprints/ImportBlueprintModal.test.tsx +++ b/src/test/Components/Blueprints/ImportBlueprintModal.test.tsx @@ -1,7 +1,7 @@ import { screen, waitFor } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; -import { FIRSTBOOT_PATH } from '../../../constants'; +import { FIRSTBOOT_PATH, FIRSTBOOT_SERVICE_PATH } from '../../../constants'; import { renderCustomRoutesWithReduxRouter } from '../../testUtils'; import { clickNext } from '../CreateImageWizard/wizardTestUtils'; @@ -163,7 +163,7 @@ masked = ["rpcbind"] data = "W1VuaXRdCkRlc2NyaXB0aW9uPVJ1biBmaXJzdCBib290IHNjcmlwdApDb25kaXRpb25QYXRoRXhpc3RzPS91c3IvbG9jYWwvc2Jpbi9jdXN0b20tZmlyc3QtYm9vdApXYW50cz1uZXR3b3JrLW9ubGluZS50YXJnZXQKQWZ0ZXI9bmV0d29yay1vbmxpbmUudGFyZ2V0CkFmdGVyPW9zYnVpbGQtZmlyc3QtYm9vdC5zZXJ2aWNlCgpbU2VydmljZV0KVHlwZT1vbmVzaG90CkV4ZWNTdGFydD0vdXNyL2xvY2FsL3NiaW4vY3VzdG9tLWZpcnN0LWJvb3QKRXhlY1N0YXJ0UG9zdD1tdiAvdXNyL2xvY2FsL3NiaW4vY3VzdG9tLWZpcnN0LWJvb3QgL3Vzci9sb2NhbC9zYmluL2N1c3RvbS1maXJzdC1ib290LmRvbmUKCltJbnN0YWxsXQpXYW50ZWRCeT1tdWx0aS11c2VyLnRhcmdldAo=" data_encoding = "base64" ensure_parents = true -path = "/etc/systemd/system/custom-first-boot.service" +path = "${FIRSTBOOT_SERVICE_PATH}" [[customizations.files]] data = "IyEvYmluL2Jhc2gKZmlyc3Rib290IHNjcmlwdCB0byB0ZXN0IGltcG9ydA==" @@ -235,7 +235,7 @@ masked = ["--invalid-masked-service"] data = "W1VuaXRdCkRlc2NyaXB0aW9uPVJ1biBmaXJzdCBib290IHNjcmlwdApDb25kaXRpb25QYXRoRXhpc3RzPS91c3IvbG9jYWwvc2Jpbi9jdXN0b20tZmlyc3QtYm9vdApXYW50cz1uZXR3b3JrLW9ubGluZS50YXJnZXQKQWZ0ZXI9bmV0d29yay1vbmxpbmUudGFyZ2V0CkFmdGVyPW9zYnVpbGQtZmlyc3QtYm9vdC5zZXJ2aWNlCgpbU2VydmljZV0KVHlwZT1vbmVzaG90CkV4ZWNTdGFydD0vdXNyL2xvY2FsL3NiaW4vY3VzdG9tLWZpcnN0LWJvb3QKRXhlY1N0YXJ0UG9zdD1tdiAvdXNyL2xvY2FsL3NiaW4vY3VzdG9tLWZpcnN0LWJvb3QgL3Vzci9sb2NhbC9zYmluL2N1c3RvbS1maXJzdC1ib290LmRvbmUKCltJbnN0YWxsXQpXYW50ZWRCeT1tdWx0aS11c2VyLnRhcmdldAo=" data_encoding = "base64" ensure_parents = true -path = "/etc/systemd/system/custom-first-boot.service" +path = "${FIRSTBOOT_SERVICE_PATH}" [[customizations.files]] data = "IyEvYmluL2Jhc2gKZmlyc3Rib290IHNjcmlwdCB0byB0ZXN0IGltcG9ydA==" diff --git a/src/test/fixtures/editMode.ts b/src/test/fixtures/editMode.ts index 6b73a8b8..0934015e 100644 --- a/src/test/fixtures/editMode.ts +++ b/src/test/fixtures/editMode.ts @@ -12,6 +12,7 @@ import { FIRST_BOOT_SERVICE, FIRST_BOOT_SERVICE_DATA, FIRSTBOOT_PATH, + FIRSTBOOT_SERVICE_PATH, RHEL_8, RHEL_9, UNIT_GIB, @@ -125,7 +126,7 @@ export const SCRIPT_WITHOUT_SHEBANG = `echo "Hello, world!"`; export const firstBootData: File[] = [ { - path: '/etc/systemd/system/custom-first-boot.service', + path: FIRSTBOOT_SERVICE_PATH, data: FIRST_BOOT_SERVICE_DATA, data_encoding: 'base64', ensure_parents: true, From 235d853f427999801ef020bbec4270743e32d340 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anna=20V=C3=ADtov=C3=A1?= Date: Wed, 18 Jun 2025 12:49:49 +0200 Subject: [PATCH 069/331] fix: replace hardcoded paths for satellite --- src/Components/CreateImageWizard/utilities/requestMapper.ts | 2 +- src/constants.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Components/CreateImageWizard/utilities/requestMapper.ts b/src/Components/CreateImageWizard/utilities/requestMapper.ts index bb9b002a..9193328b 100644 --- a/src/Components/CreateImageWizard/utilities/requestMapper.ts +++ b/src/Components/CreateImageWizard/utilities/requestMapper.ts @@ -477,7 +477,7 @@ const getImageRequests = (state: RootState): ImageRequest[] => { const getSatelliteCommand = (files?: File[]): string => { const satelliteCommandFile = files?.find( - (file) => file.path === '/usr/local/sbin/register-satellite' + (file) => file.path === SATELLITE_PATH ); return satelliteCommandFile?.data ? atob(satelliteCommandFile.data) : ''; }; diff --git a/src/constants.ts b/src/constants.ts index dfbf0f5d..0f83c298 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -278,7 +278,7 @@ export const FIRST_BOOT_SERVICE = 'custom-first-boot'; export const SATELLITE_SERVICE_DATA = btoa(`[Unit] Description=Register satellite first boot script -ConditionFileIsExecutable=/usr/local/sbin/register-satellite +ConditionFileIsExecutable=${SATELLITE_PATH} ConditionPathExists=!/var/local/.register-satellite-done Wants=network-online.target After=network-online.target @@ -286,7 +286,7 @@ After=osbuild-first-boot.service [Service] Type=oneshot -ExecStart=/bin/bash -x /usr/local/sbin/register-satellite +ExecStart=/bin/bash -x ${SATELLITE_PATH} ExecStartPost=/usr/bin/touch /var/local/.register-satellite-done RemainAfterExit=yes From 76320925a0d33a671ef5dc598adc4f0ea61d6c53 Mon Sep 17 00:00:00 2001 From: Katarina Sieklova Date: Mon, 16 Jun 2025 15:52:22 +0200 Subject: [PATCH 070/331] Wizard: change order of the systemd services --- .../steps/Firewall/components/Services.tsx | 26 +++++----- .../steps/Review/ReviewStepTextLists.tsx | 52 +++++++++---------- .../Services/components/ServicesInputs.tsx | 34 ++++++------ .../steps/Services/Services.test.tsx | 14 ++--- 4 files changed, 63 insertions(+), 63 deletions(-) diff --git a/src/Components/CreateImageWizard/steps/Firewall/components/Services.tsx b/src/Components/CreateImageWizard/steps/Firewall/components/Services.tsx index e7a18c35..feff320b 100644 --- a/src/Components/CreateImageWizard/steps/Firewall/components/Services.tsx +++ b/src/Components/CreateImageWizard/steps/Firewall/components/Services.tsx @@ -22,19 +22,6 @@ const Services = () => { return ( <> - - - { fieldName="enabledServices" /> + + + ); }; diff --git a/src/Components/CreateImageWizard/steps/Review/ReviewStepTextLists.tsx b/src/Components/CreateImageWizard/steps/Review/ReviewStepTextLists.tsx index e02a0806..6a5b0d66 100644 --- a/src/Components/CreateImageWizard/steps/Review/ReviewStepTextLists.tsx +++ b/src/Components/CreateImageWizard/steps/Review/ReviewStepTextLists.tsx @@ -899,20 +899,6 @@ export const FirewallList = () => { 'None' )} - - Disabled services - - - {firewall.services.disabled.length > 0 ? ( - - - {firewall.services.disabled.join(' ')} - - - ) : ( - 'None' - )} - Enabled services @@ -927,6 +913,20 @@ export const FirewallList = () => { 'None' )} + + Disabled services + + + {firewall.services.disabled.length > 0 ? ( + + + {firewall.services.disabled.join(' ')} + + + ) : ( + 'None' + )} + ); @@ -938,6 +938,18 @@ export const ServicesList = () => { return ( + + Enabled + + + {services.enabled.length > 0 ? ( + + {services.enabled.join(' ')} + + ) : ( + 'None' + )} + Disabled @@ -962,18 +974,6 @@ export const ServicesList = () => { 'None' )} - - Enabled - - - {services.enabled.length > 0 ? ( - - {services.enabled.join(' ')} - - ) : ( - 'None' - )} - ); diff --git a/src/Components/CreateImageWizard/steps/Services/components/ServicesInputs.tsx b/src/Components/CreateImageWizard/steps/Services/components/ServicesInputs.tsx index 64a753aa..5838bdd7 100644 --- a/src/Components/CreateImageWizard/steps/Services/components/ServicesInputs.tsx +++ b/src/Components/CreateImageWizard/steps/Services/components/ServicesInputs.tsx @@ -54,6 +54,23 @@ const ServicesInput = () => { return ( <> + + !enabledRequiredByOpenSCAP.includes(service) + )} + requiredList={enabledRequiredByOpenSCAP} + requiredCategoryName="Required by OpenSCAP" + item="Enabled service" + addAction={addEnabledService} + removeAction={removeEnabledService} + stepValidation={stepValidation} + fieldName="enabledSystemdServices" + /> + { fieldName="maskedSystemdServices" /> - - !enabledRequiredByOpenSCAP.includes(service) - )} - requiredList={enabledRequiredByOpenSCAP} - requiredCategoryName="Required by OpenSCAP" - item="Enabled service" - addAction={addEnabledService} - removeAction={removeEnabledService} - stepValidation={stepValidation} - fieldName="enabledSystemdServices" - /> - ); }; diff --git a/src/test/Components/CreateImageWizard/steps/Services/Services.test.tsx b/src/test/Components/CreateImageWizard/steps/Services/Services.test.tsx index 05c81039..76977a9d 100644 --- a/src/test/Components/CreateImageWizard/steps/Services/Services.test.tsx +++ b/src/test/Components/CreateImageWizard/steps/Services/Services.test.tsx @@ -171,22 +171,22 @@ describe('Step Services', () => { name: /clear input/i, }); + // Enabled services input + expect(screen.queryByText('Invalid format.')).not.toBeInTheDocument(); + await addEnabledService('-------'); + expect(await screen.findByText('Invalid format.')).toBeInTheDocument(); + await waitFor(() => user.click(clearInputButtons[0])); + // Disabled services input expect(screen.queryByText('Invalid format.')).not.toBeInTheDocument(); await addDisabledService('-------'); expect(await screen.findByText('Invalid format.')).toBeInTheDocument(); - await waitFor(() => user.click(clearInputButtons[0])); + await waitFor(() => user.click(clearInputButtons[1])); // Masked services input expect(screen.queryByText('Invalid format.')).not.toBeInTheDocument(); await addMaskedService('-------'); expect(await screen.findByText('Invalid format.')).toBeInTheDocument(); - await waitFor(() => user.click(clearInputButtons[1])); - - // Enabled services input - expect(screen.queryByText('Invalid format.')).not.toBeInTheDocument(); - await addEnabledService('-------'); - expect(await screen.findByText('Invalid format.')).toBeInTheDocument(); await waitFor(() => user.click(clearInputButtons[2])); }); From 07f500b94af4a14065430692875dbfbe242ac65b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Hozza?= Date: Wed, 18 Jun 2025 10:29:39 +0200 Subject: [PATCH 071/331] GHA: enable the stale action to delete its saved state MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit It turns out that the stale action is not able to delete its saved state due to missing permissions. As a result, it was not processing issues and PRs, that have been processed once, for almost a month. The error in the job log was: ``` Warning: Error delete _state: [403] Resource not accessible by integration ``` The fix is to add `actions: write` to the action permissions Signed-off-by: Tomáš Hozza --- .github/workflows/stale-cleanup.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/stale-cleanup.yml b/.github/workflows/stale-cleanup.yml index 56bbc780..4bc5f03d 100644 --- a/.github/workflows/stale-cleanup.yml +++ b/.github/workflows/stale-cleanup.yml @@ -8,6 +8,7 @@ jobs: stale: runs-on: ubuntu-latest permissions: + actions: write # needed to clean up the saved action state issues: write pull-requests: write steps: From b7860f33fc8225144716fcac7c14fa34f0ee47f7 Mon Sep 17 00:00:00 2001 From: "red-hat-konflux[bot]" <126015336+red-hat-konflux[bot]@users.noreply.github.com> Date: Mon, 16 Jun 2025 16:00:28 +0000 Subject: [PATCH 072/331] Update Konflux references Signed-off-by: red-hat-konflux <126015336+red-hat-konflux[bot]@users.noreply.github.com> --- .tekton/image-builder-frontend-pull-request.yaml | 14 +++++++------- .tekton/image-builder-frontend-push.yaml | 14 +++++++------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/.tekton/image-builder-frontend-pull-request.yaml b/.tekton/image-builder-frontend-pull-request.yaml index 098d717b..50b94c5a 100644 --- a/.tekton/image-builder-frontend-pull-request.yaml +++ b/.tekton/image-builder-frontend-pull-request.yaml @@ -172,7 +172,7 @@ spec: - name: name value: git-clone - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-git-clone:0.1@sha256:3ced9a6b9d8520773d3ffbf062190515a362ecda11e72f56e38e4dd980294b57 + value: quay.io/konflux-ci/tekton-catalog/task-git-clone:0.1@sha256:eca6b8106b6ec1ea4b03d196c007928c57a0683ea1ce068e8f34f9b9bef3387d - name: kind value: task resolver: bundles @@ -197,7 +197,7 @@ spec: - name: name value: prefetch-dependencies - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-prefetch-dependencies:0.2@sha256:8c649b82a9d228018e5a5d9b844df9fd1db63db33c9b5034586af3a766378de7 + value: quay.io/konflux-ci/tekton-catalog/task-prefetch-dependencies:0.2@sha256:735a71137e43f8055bb1871653b5cbca5c8c437d90e1c78c5ba83f19b1ebedc9 - name: kind value: task resolver: bundles @@ -273,7 +273,7 @@ spec: - name: name value: build-image-index - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-build-image-index:0.1@sha256:9c95b1fe17db091ae364344ba2006af46648e08486eef1f6fe1b9e3f10866875 + value: quay.io/konflux-ci/tekton-catalog/task-build-image-index:0.1@sha256:fc55208a5967b42e1bec89f0ffed26fc4f18db92df2a4885a7d2b4d5cfd603e0 - name: kind value: task resolver: bundles @@ -322,7 +322,7 @@ spec: - name: name value: sast-shell-check - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-sast-shell-check:0.1@sha256:18d594df21cb92cbc409065b25a863492ea7209e2a34045ced69a24a68ca41d8 + value: quay.io/konflux-ci/tekton-catalog/task-sast-shell-check:0.1@sha256:1c1ca37f7191f2f7804b3b0b68054c047edd3938fc7a846f51977859c667e031 - name: kind value: task resolver: bundles @@ -412,7 +412,7 @@ spec: - name: name value: ecosystem-cert-preflight-checks - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-ecosystem-cert-preflight-checks:0.2@sha256:302828e9d7abc72b8a44fb2b9be068f86c982d8e5f4550b8bf654571d6361ee8 + value: quay.io/konflux-ci/tekton-catalog/task-ecosystem-cert-preflight-checks:0.2@sha256:8a2d3ce9205df1f59f410529cb38134336e0a4b06ee1187b3229f26c80ecc5ba - name: kind value: task resolver: bundles @@ -479,7 +479,7 @@ spec: - name: name value: apply-tags - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-apply-tags:0.1@sha256:1c6f673fe100a49f58aaef62580c8adf0c397790964f4e7bac7fcd3f4d07c92e + value: quay.io/konflux-ci/tekton-catalog/task-apply-tags:0.2@sha256:0c411c27483849a936c0c420a57e477113e9fafc63077647200d6614d9ebb872 - name: kind value: task resolver: bundles @@ -520,7 +520,7 @@ spec: - name: name value: rpms-signature-scan - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-rpms-signature-scan:0.2@sha256:80a4562d5f86eb6812f00d4e30e94c1ad27ec937735dc29f5a63e9335676b3dc + value: quay.io/konflux-ci/tekton-catalog/task-rpms-signature-scan:0.2@sha256:66d0d695db7a12d0f05bff8b5c44b610539d781e5b50e031a099f9bf216d245e - name: kind value: task resolver: bundles diff --git a/.tekton/image-builder-frontend-push.yaml b/.tekton/image-builder-frontend-push.yaml index b91d893c..40b30f7a 100644 --- a/.tekton/image-builder-frontend-push.yaml +++ b/.tekton/image-builder-frontend-push.yaml @@ -170,7 +170,7 @@ spec: - name: name value: git-clone - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-git-clone:0.1@sha256:3ced9a6b9d8520773d3ffbf062190515a362ecda11e72f56e38e4dd980294b57 + value: quay.io/konflux-ci/tekton-catalog/task-git-clone:0.1@sha256:eca6b8106b6ec1ea4b03d196c007928c57a0683ea1ce068e8f34f9b9bef3387d - name: kind value: task resolver: bundles @@ -195,7 +195,7 @@ spec: - name: name value: prefetch-dependencies - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-prefetch-dependencies:0.2@sha256:8c649b82a9d228018e5a5d9b844df9fd1db63db33c9b5034586af3a766378de7 + value: quay.io/konflux-ci/tekton-catalog/task-prefetch-dependencies:0.2@sha256:735a71137e43f8055bb1871653b5cbca5c8c437d90e1c78c5ba83f19b1ebedc9 - name: kind value: task resolver: bundles @@ -271,7 +271,7 @@ spec: - name: name value: build-image-index - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-build-image-index:0.1@sha256:9c95b1fe17db091ae364344ba2006af46648e08486eef1f6fe1b9e3f10866875 + value: quay.io/konflux-ci/tekton-catalog/task-build-image-index:0.1@sha256:fc55208a5967b42e1bec89f0ffed26fc4f18db92df2a4885a7d2b4d5cfd603e0 - name: kind value: task resolver: bundles @@ -320,7 +320,7 @@ spec: - name: name value: sast-shell-check - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-sast-shell-check:0.1@sha256:18d594df21cb92cbc409065b25a863492ea7209e2a34045ced69a24a68ca41d8 + value: quay.io/konflux-ci/tekton-catalog/task-sast-shell-check:0.1@sha256:1c1ca37f7191f2f7804b3b0b68054c047edd3938fc7a846f51977859c667e031 - name: kind value: task resolver: bundles @@ -410,7 +410,7 @@ spec: - name: name value: ecosystem-cert-preflight-checks - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-ecosystem-cert-preflight-checks:0.2@sha256:302828e9d7abc72b8a44fb2b9be068f86c982d8e5f4550b8bf654571d6361ee8 + value: quay.io/konflux-ci/tekton-catalog/task-ecosystem-cert-preflight-checks:0.2@sha256:8a2d3ce9205df1f59f410529cb38134336e0a4b06ee1187b3229f26c80ecc5ba - name: kind value: task resolver: bundles @@ -477,7 +477,7 @@ spec: - name: name value: apply-tags - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-apply-tags:0.1@sha256:1c6f673fe100a49f58aaef62580c8adf0c397790964f4e7bac7fcd3f4d07c92e + value: quay.io/konflux-ci/tekton-catalog/task-apply-tags:0.2@sha256:0c411c27483849a936c0c420a57e477113e9fafc63077647200d6614d9ebb872 - name: kind value: task resolver: bundles @@ -518,7 +518,7 @@ spec: - name: name value: rpms-signature-scan - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-rpms-signature-scan:0.2@sha256:80a4562d5f86eb6812f00d4e30e94c1ad27ec937735dc29f5a63e9335676b3dc + value: quay.io/konflux-ci/tekton-catalog/task-rpms-signature-scan:0.2@sha256:66d0d695db7a12d0f05bff8b5c44b610539d781e5b50e031a099f9bf216d245e - name: kind value: task resolver: bundles From 0ce28044b84d4b0929f6085d5bc9646d34bce364 Mon Sep 17 00:00:00 2001 From: regexowl Date: Wed, 18 Jun 2025 13:12:42 +0200 Subject: [PATCH 073/331] Konflux: Migrate apply-tags from 0.1 to 0.2 --- .tekton/image-builder-frontend-pull-request.yaml | 4 +++- .tekton/image-builder-frontend-push.yaml | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/.tekton/image-builder-frontend-pull-request.yaml b/.tekton/image-builder-frontend-pull-request.yaml index 50b94c5a..638af1a4 100644 --- a/.tekton/image-builder-frontend-pull-request.yaml +++ b/.tekton/image-builder-frontend-pull-request.yaml @@ -470,8 +470,10 @@ spec: - "false" - name: apply-tags params: - - name: IMAGE + - name: IMAGE_URL value: $(tasks.build-image-index.results.IMAGE_URL) + - name: IMAGE_DIGEST + value: $(tasks.build-image-index.results.IMAGE_DIGEST) runAfter: - build-image-index taskRef: diff --git a/.tekton/image-builder-frontend-push.yaml b/.tekton/image-builder-frontend-push.yaml index 40b30f7a..ee9015b1 100644 --- a/.tekton/image-builder-frontend-push.yaml +++ b/.tekton/image-builder-frontend-push.yaml @@ -468,8 +468,10 @@ spec: - "false" - name: apply-tags params: - - name: IMAGE + - name: IMAGE_URL value: $(tasks.build-image-index.results.IMAGE_URL) + - name: IMAGE_DIGEST + value: $(tasks.build-image-index.results.IMAGE_DIGEST) runAfter: - build-image-index taskRef: From b59a72965655df091bb2519a4ed92e51daa2b39d Mon Sep 17 00:00:00 2001 From: regexowl Date: Wed, 18 Jun 2025 13:41:27 +0200 Subject: [PATCH 074/331] sharedComponents: Rename "Create blueprint" button This renames the button to "Create image blueprint" to make the relationship between images and blueprints clearer. --- playwright/helpers/navHelpers.ts | 2 +- src/Components/sharedComponents/ImageBuilderHeader.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/playwright/helpers/navHelpers.ts b/playwright/helpers/navHelpers.ts index e085faec..40c1007c 100644 --- a/playwright/helpers/navHelpers.ts +++ b/playwright/helpers/navHelpers.ts @@ -7,7 +7,7 @@ import { isHosted } from './helpers'; * @param page - the page object */ export const navigateToOptionalSteps = async (page: Page | FrameLocator) => { - await page.getByRole('button', { name: 'Create blueprint' }).click(); + await page.getByRole('button', { name: 'Create image blueprint' }).click(); await page.getByRole('checkbox', { name: 'Virtualization' }).click(); await page.getByRole('button', { name: 'Next' }).click(); }; diff --git a/src/Components/sharedComponents/ImageBuilderHeader.tsx b/src/Components/sharedComponents/ImageBuilderHeader.tsx index 6d2235ed..b85ad966 100644 --- a/src/Components/sharedComponents/ImageBuilderHeader.tsx +++ b/src/Components/sharedComponents/ImageBuilderHeader.tsx @@ -131,7 +131,7 @@ export const ImageBuilderHeader = ({ }) } > - Create blueprint + Create image blueprint {importExportFlag && ( , + , - ]} - > - You have selected packages that belong to custom repositories. By - continuing, you are acknowledging and consenting to adding the following - custom repositories to your image. -
-
- The repositories will also get enabled in{' '} - {' '} - if they were not enabled yet: -
- - - - {isSelectingPackage ? : } - - - - - - {isSelectingPackage ? ( - - ) : ( - - )} - - - -
PackagesPackage groupsRepositories
{isSelectingPackage?.name}{isSelectingGroup?.name} - EPEL {getEpelVersionForDistribution(distribution)} Everything - x86_64 -
-
- To move forward, either add the repos to your image, or go back to - review your package selections. + + ); }; diff --git a/src/Components/CreateImageWizard/steps/Repositories/Repositories.tsx b/src/Components/CreateImageWizard/steps/Repositories/Repositories.tsx index 54d5d589..58d71572 100644 --- a/src/Components/CreateImageWizard/steps/Repositories/Repositories.tsx +++ b/src/Components/CreateImageWizard/steps/Repositories/Repositories.tsx @@ -3,6 +3,7 @@ import React, { useEffect, useMemo, useState } from 'react'; import { Alert, Button, + Modal, Pagination, Panel, PanelMain, @@ -14,8 +15,10 @@ import { ToggleGroupItem, PaginationVariant, Grid, + ModalHeader, + ModalBody, + ModalFooter, } from '@patternfly/react-core'; -import { Modal } from '@patternfly/react-core/deprecated'; import { ExternalLinkAltIcon } from '@patternfly/react-icons'; import { Table, Tbody, Td, Th, Thead, Tr } from '@patternfly/react-table'; @@ -504,25 +507,22 @@ const Repositories = () => { if (!isTemplateSelected) { return ( - + + + You are removing a previously added repository. +
+ We do not recommend removing repositories if you have added packages + from them. +
+ , + , - ]} - > - You are removing a previously added repository. -
- We do not recommend removing repositories if you have added packages - from them. + +
{wizardMode === 'edit' && ( + + + Building blueprints and images doesn't need to be a two step + process. To build images simultaneously, use the dropdown arrow to the + right side of this button. + + , - ]} - > - Building blueprints and images doesn’t need to be a two step process. To - build images simultaneously, use the dropdown arrow to the right side of - this button. + + ); }; diff --git a/src/Components/CreateImageWizard/steps/Users/components/RemoveUserModal.tsx b/src/Components/CreateImageWizard/steps/Users/components/RemoveUserModal.tsx index c7e4377c..42b3311a 100644 --- a/src/Components/CreateImageWizard/steps/Users/components/RemoveUserModal.tsx +++ b/src/Components/CreateImageWizard/steps/Users/components/RemoveUserModal.tsx @@ -1,7 +1,12 @@ import React from 'react'; -import { Button } from '@patternfly/react-core'; -import { Modal } from '@patternfly/react-core/deprecated'; +import { + Button, + Modal, + ModalBody, + ModalFooter, + ModalHeader, +} from '@patternfly/react-core'; import calculateNewIndex from './calculateNewIndex'; @@ -48,22 +53,20 @@ const RemoveUserModal = ({ }; return ( - + + + This action is permanent and cannot be undone. Once deleted all + information about the user will be lost. + + , + , - ]} - > - This action is permanent and cannot be undone. Once deleted all - information about the user will be lost. + + ); }; diff --git a/src/Components/ImagesTable/Instance.tsx b/src/Components/ImagesTable/Instance.tsx index 89a9947c..b0f67942 100644 --- a/src/Components/ImagesTable/Instance.tsx +++ b/src/Components/ImagesTable/Instance.tsx @@ -8,11 +8,12 @@ import { ClipboardCopy, List, ListItem, + Modal, + ModalVariant, Popover, PopoverPosition, Skeleton, } from '@patternfly/react-core'; -import { Modal, ModalVariant } from '@patternfly/react-core/deprecated'; import { ListComponent, OrderType, @@ -204,9 +205,7 @@ const ProvisioningLink = ({ {wizardOpen && ( diff --git a/src/Components/ShareImageModal/ShareImageModal.tsx b/src/Components/ShareImageModal/ShareImageModal.tsx index ae369f5f..268f4c1d 100644 --- a/src/Components/ShareImageModal/ShareImageModal.tsx +++ b/src/Components/ShareImageModal/ShareImageModal.tsx @@ -1,6 +1,6 @@ import React, { useMemo } from 'react'; -import { Modal } from '@patternfly/react-core/deprecated'; +import { Modal, ModalBody, ModalHeader } from '@patternfly/react-core'; import { useNavigate, useParams } from 'react-router-dom'; import RegionsSelect from './RegionsSelect'; @@ -30,12 +30,16 @@ const ShareToRegionsModal = () => { variant="small" aria-label="Share to new region" onClose={handleClose} - title="Share to new region" - description="Configure new regions for this image that will run on your AWS. All the - regions will launch with the same configuration." appendTo={appendTo} > - + + + + ); }; From 0b1abb57b9c09b28fff8b5aa85be443d0ad54bb1 Mon Sep 17 00:00:00 2001 From: regexowl Date: Thu, 3 Jul 2025 09:59:57 +0200 Subject: [PATCH 140/331] Remove devel dockerfile and update README Since local fullstack deployment is being done via https://github.com/osbuild/osbuild-getting-started, we can get rid of the original dockerile. README was also updated to no longer point to the `devel` folder as it just points you to the same repository. osbuild-getting-started is mentioned in the "Backend development" section. --- README.md | 1 - distribution/Dockerfile | 12 ------------ 2 files changed, 13 deletions(-) delete mode 100644 distribution/Dockerfile diff --git a/README.md b/README.md index 87a5588a..14f59267 100644 --- a/README.md +++ b/README.md @@ -263,7 +263,6 @@ make cockpit/devel | --------- | ----------- | | [`/api`](https://github.com/RedHatInsights/image-builder-frontend/tree/main/api) | API schema and config files | | [`/config`](https://github.com/RedHatInsights/image-builder-frontend/tree/main/config) | webpack configuration | -| [`/devel`](https://github.com/RedHatInsights/image-builder-frontend/tree/main/devel) | tools for local development | | [`/src`](https://github.com/RedHatInsights/image-builder-frontend/tree/main/src) | source code | | [`/src/Components`](https://github.com/RedHatInsights/image-builder-frontend/tree/main/src/Components) | source code split by individual components | | [`/src/test`](https://github.com/RedHatInsights/image-builder-frontend/tree/main/src/test) | test utilities | diff --git a/distribution/Dockerfile b/distribution/Dockerfile deleted file mode 100644 index 7452210d..00000000 --- a/distribution/Dockerfile +++ /dev/null @@ -1,12 +0,0 @@ -FROM node:18 - -WORKDIR /app - -COPY . . - -RUN npm ci - -EXPOSE 8002 -EXPOSE 1337 - -CMD [ "npm", "run", "devel" ] From 855f1430adc16c958efcffe9ccd74971a2c100b9 Mon Sep 17 00:00:00 2001 From: regexowl Date: Wed, 18 Jun 2025 11:18:07 +0200 Subject: [PATCH 141/331] api: Update `pull.sh`, regenerate schemas and fix errors This adds missing schema links to the `pull.sh` script, pulls new schema definitions, re-generates schemas and updates the code where needed. --- api/pull.sh | 10 +- api/schema/composerCloudApi.v2.yaml | 72 +- api/schema/edge.json | 11619 ++++++++-------- api/schema/imageBuilder.yaml | 9 +- api/schema/provisioning.json | 369 +- api/schema/rhsm.json | 2 +- .../steps/Review/ReviewStepTextLists.tsx | 4 +- .../Aws/AwsSourcesSelect.tsx | 10 +- .../Azure/AzureSourcesSelect.tsx | 10 +- src/Components/ImagesTable/ImageDetails.tsx | 4 +- src/Components/ImagesTable/Instance.tsx | 1 + src/constants.ts | 1 + src/store/cockpit/composerCloudApi.ts | 17 +- src/store/service/edgeApi.ts | 39 +- src/store/service/imageBuilderApi.ts | 5 +- src/store/service/provisioningApi.ts | 24 +- src/store/service/rhsmApi.ts | 5 +- 17 files changed, 6320 insertions(+), 5881 deletions(-) diff --git a/api/pull.sh b/api/pull.sh index d9bd0105..b9b926d7 100644 --- a/api/pull.sh +++ b/api/pull.sh @@ -1,10 +1,10 @@ #!/bin/bash -# Download the most up-to-date imageBuilder.yaml file and overwrite the existing one +# Download the most up-to-date schema files and overwrite the existing ones curl https://raw.githubusercontent.com/osbuild/image-builder/main/internal/v1/api.yaml -o ./api/schema/imageBuilder.yaml - -curl https://console.redhat.com/api/compliance/v2/openapi.json -o ./api/schema/compliance.json - +curl https://console.redhat.com/api/rhsm/v2/openapi.json -o ./api/schema/rhsm.json curl https://console.redhat.com/api/content-sources/v1/openapi.json -o ./api/schema/contentSources.json - +curl https://console.redhat.com/api/provisioning/v1/openapi.json -o ./api/schema/provisioning.json +curl https://console.redhat.com/api/edge/v1/openapi.json -o ./api/schema/edge.json +curl https://console.redhat.com/api/compliance/v2/openapi.json -o ./api/schema/compliance.json curl https://raw.githubusercontent.com/osbuild/osbuild-composer/main/internal/cloudapi/v2/openapi.v2.yml -o ./api/schema/composerCloudApi.v2.yaml diff --git a/api/schema/composerCloudApi.v2.yaml b/api/schema/composerCloudApi.v2.yaml index 376ba03b..8a77c548 100644 --- a/api/schema/composerCloudApi.v2.yaml +++ b/api/schema/composerCloudApi.v2.yaml @@ -133,6 +133,60 @@ paths: application/json: schema: $ref: '#/components/schemas/Error' + delete: + operationId: deleteCompose + summary: Delete a compose + security: + - Bearer: [] + parameters: + - in: path + name: id + schema: + type: string + format: uuid + example: '123e4567-e89b-12d3-a456-426655440000' + required: true + description: ID of compose to delete + description: |- + Delete a compose and all of its independent jobs. + responses: + '200': + description: compose delete status + content: + application/json: + schema: + $ref: '#/components/schemas/ComposeDeleteStatus' + '400': + description: Invalid compose id + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Auth token is invalid + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '403': + description: Unauthorized to perform operation + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '404': + description: Unknown compose id + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Unexpected error occurred + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /composes/{id}/metadata: get: @@ -805,6 +859,10 @@ components: - failure - pending example: success + + ComposeDeleteStatus: + $ref: '#/components/schemas/ObjectReference' + ComposeLogs: allOf: - $ref: '#/components/schemas/ObjectReference' @@ -1154,6 +1212,7 @@ components: - aws-rhui - aws-sap-rhui - azure + - azure-cvm - azure-eap7-rhui - azure-rhui - azure-sap-rhui @@ -2626,11 +2685,10 @@ components: FilesystemTyped: type: object required: - - mountpoint + - fs_type properties: type: type: string - default: plain enum: - plain part_type: @@ -2649,11 +2707,13 @@ components: - ext4 - xfs - vfat + - swap description: | - The filesystem type + The filesystem type. Swap partitions must have an empty mountpoint. BtrfsVolume: type: object required: + - type - subvolumes properties: type: @@ -2687,6 +2747,7 @@ components: VolumeGroup: type: object required: + - type - logical_volumes properties: type: @@ -2710,7 +2771,7 @@ components: LogicalVolume: type: object required: - - mountpoint + - fs_type properties: name: type: string @@ -2728,8 +2789,9 @@ components: - ext4 - xfs - vfat + - swap description: | - The filesystem type for the logical volume + The filesystem type for the logical volume. Swap LVs must have an empty mountpoint. minsize: type: string example: "2 GiB" diff --git a/api/schema/edge.json b/api/schema/edge.json index b9f5004c..065837d9 100644 --- a/api/schema/edge.json +++ b/api/schema/edge.json @@ -1,5722 +1,5919 @@ { - "components": { - "schemas": { - "CheckThirdPartyRepoName": { - "properties": { - "data": { - "allOf": [ - { - "$ref": "#/components/schemas/CheckThirdPartyRepoNameData" - } - ], - "description": "The data of third party repository check name result" - } - }, - "type": "object" - }, - "CheckThirdPartyRepoNameData": { - "properties": { - "isValid": { - "description": "The indicator of third party repository name validity", - "example": false, - "type": "boolean" - } - }, - "type": "object" - }, - "Commit": { - "properties": { - "arch": { - "description": "The commit architecture", - "example": "x86_64", - "type": "string" - } - }, - "type": "object" - }, - "CreateImage": { - "type": "object" - }, - "CustomPackages": { - "properties": { - "name": { - "description": "Name of custom packages", - "example": "cat", - "type": "string" - } - }, - "type": "object" - }, - "DeviceNotification": { - "properties": { - "application": { - "description": "application name", - "example": "edge-management", - "type": "string" - }, - "bundle": { - "description": "bundle name", - "example": "rhel", - "type": "string" - }, - "context": { - "description": "notification context payload data", - "example": "{\"CommitID\":\"31581\",\"UpdateID\":\"34916\"}", - "type": "string" - }, - "event_type": { - "description": "event type", - "example": "update-devices", - "type": "string" - }, - "events": { - "description": "notification events", - "items": { - "$ref": "#/components/schemas/EventNotification" - }, - "type": "array" - }, - "org_id": { - "description": "notification organization id", - "example": "11111111", - "type": "string" - }, - "recipients": { - "description": "notification recipients", - "items": { - "$ref": "#/components/schemas/RecipientNotification" - }, - "type": "array" - }, - "timestamp": { - "description": "notification timestamp", - "example": "2023-07-06T11:15:04Z", - "type": "string" - }, - "version": { - "description": "notification version", - "example": "v1.1.0", - "type": "string" - } - }, - "type": "object" - }, - "DevicesUpdate": { - "properties": { - "CommitID": { - "description": "Optional: The unique ID of the target commit", - "example": 1026, - "type": "integer" - }, - "DevicesUUID": { - "description": "List of devices uuids to update", - "example": [ - "b579a578-1a6f-48d5-8a45-21f2a656a5d4", - "1abb288d-6d88-4e2d-bdeb-fcc536be58ec" - ], - "items": { - "type": "string" - }, - "type": "array" - } - }, - "type": "object" - }, - "EventNotification": { - "properties": { - "payload": { - "description": "notification event payload", - "example": "{\"ID\":\"\"}", - "type": "string" - } - }, - "type": "object" - }, - "ImageResponse": { - "properties": { - "Account": { - "type": "string" - }, - "Commit": { - "$ref": "#/components/schemas/models.Commit" - }, - "CommitID": { - "type": "integer" - }, - "CreatedAt": { - "$ref": "#/components/schemas/models.EdgeAPITime" - }, - "CustomPackages": { - "items": { - "$ref": "#/components/schemas/models.Package" - }, - "type": "array" - }, - "DeletedAt": { - "$ref": "#/components/schemas/gorm.DeletedAt" - }, - "Description": { - "type": "string" - }, - "Distribution": { - "type": "string" - }, - "ID": { - "type": "integer" - }, - "ImageSetID": { - "description": "TODO: Wipe staging database and set to not nullable", - "type": "integer" - }, - "ImageType": { - "description": "TODO: Remove as soon as the frontend stops using", - "type": "string" - }, - "Installer": { - "$ref": "#/components/schemas/models.Installer" - }, - "InstallerID": { - "type": "integer" - }, - "Name": { - "type": "string" - }, - "OutputTypes": { - "items": { - "type": "string" - }, - "type": "array" - }, - "Packages": { - "items": { - "$ref": "#/components/schemas/models.Package" - }, - "type": "array" - }, - "Status": { - "type": "string" - }, - "SystemsRunning": { - "description": "only for forms", - "type": "integer" - }, - "ThirdPartyRepositories": { - "items": { - "$ref": "#/components/schemas/models.ThirdPartyRepo" - }, - "type": "array" - }, - "TotalPackages": { - "description": "only for forms", - "type": "integer" - }, - "UpdatedAt": { - "$ref": "#/components/schemas/models.EdgeAPITime" - }, - "Version": { - "type": "integer" - }, - "org_id": { - "type": "string" - }, - "request_id": { - "description": "storing for logging reference on resume", - "type": "string" - } - }, - "type": "object" - }, - "ImageValidationRequest": { - "properties": { - "ID": { - "description": "the unique ID of the image", - "example": 1029, - "type": "integer" - } - }, - "type": "object" - }, - "ImageValidationResponse": { - "properties": { - "UpdateValid": { - "example": true, - "type": "boolean" - } - }, - "type": "object" - }, - "RecipientNotification": { - "properties": { - "ignore_user_preferences": { - "description": "notification recipient to ignore user preferences", - "example": false, - "type": "boolean" - }, - "only_admins": { - "description": "notification recipient for only admins", - "example": false, - "type": "boolean" - }, - "users": { - "description": "notification recipient users", - "example": [ - "user-id" - ], - "items": { - "type": "string" - }, - "type": "array" - } - }, - "type": "object" - }, - "ThirdPartyRepo": { - "properties": { - "Description": { - "description": "The description of the third party repository", - "example": "a repo for some utilities", - "type": "string" - }, - "ID": { - "description": "The unique ID of the third party repository", - "example": 1028, - "type": "integer" - }, - "Name": { - "description": "The name of the third party repository", - "example": "my_custom_repo", - "type": "string" - }, - "URL": { - "description": "The URL of the third party repository", - "example": "https://public.example.com/my_custom_repo", - "type": "string" - } - }, - "type": "object" - }, - "ThirdPartyRepoList": { - "properties": { - "count": { - "description": "The overall count of the stored third party repositories", - "example": 25, - "type": "integer" - }, - "data": { - "description": "The data list of the third party repositories", - "items": { - "$ref": "#/components/schemas/ThirdPartyRepo" - }, - "type": "array" - } - }, - "type": "object" - }, - "Update": { - "properties": { - "ChangesRefs": { - "description": "Whether this update is changing device ostree ref", - "example": false, - "type": "boolean" - }, - "Commit": { - "allOf": [ - { - "$ref": "#/components/schemas/models.UpdateCommitAPI" - } - ], - "description": "The device Update target commit" - }, - "Devices": { - "description": "The current devices to update", - "items": { - "$ref": "#/components/schemas/UpdateDevice" - }, - "type": "array" - }, - "DispatchRecords": { - "description": "The current update dispatcher records", - "items": { - "$ref": "#/components/schemas/UpdateDispatchRecord" - }, - "type": "array" - }, - "ID": { - "description": "The unique ID of device update", - "example": 1026, - "type": "integer" - }, - "OldCommits": { - "description": "The device alternate commits from current device commit to target commit", - "items": { - "$ref": "#/components/schemas/models.UpdateCommitAPI" - }, - "type": "array" - }, - "Repo": { - "allOf": [ - { - "$ref": "#/components/schemas/UpdateRepo" - } - ], - "description": "The current repository built from this update" - }, - "Status": { - "description": "the current devices update status", - "example": "BUILDING", - "type": "string" - } - }, - "type": "object" - }, - "UpdateDevice": { - "properties": { - "Connected": { - "description": "Is the device connected", - "example": true, - "type": "boolean" - }, - "CurrentHash": { - "description": "the current device loaded commit hash", - "example": "0bd8dfe9856aa5bb1683e85f123bfe7785d45fbdb6f10372ff2c80e703400446", - "type": "string" - }, - "ID": { - "description": "The unique ID of the device", - "example": 1096, - "type": "integer" - }, - "ImageID": { - "description": "The current related image ID", - "example": 10778, - "type": "integer" - }, - "Name": { - "description": "the device inventory name", - "example": "teat-host.example.com", - "type": "string" - }, - "RHCClientID": { - "description": "The device RHC client ID", - "example": "5f9ac7d3-2264-4dad-a5a0-39c91c071c8a", - "type": "string" - }, - "UUID": { - "description": "The device inventory uuid", - "example": "54880418-b7c2-402e-93e5-287e168de7a6", - "type": "string" - }, - "UpdateAvailable": { - "description": "Whether an update is available", - "example": true, - "type": "boolean" - } - }, - "type": "object" - }, - "UpdateDispatchRecord": { - "properties": { - "DeviceID": { - "description": "The unique ID of the device being updated", - "example": 12789, - "type": "integer" - }, - "ID": { - "description": "The unique ID of the DispatcherRecord", - "example": 1089, - "type": "integer" - }, - "PlaybookDispatcherID": { - "description": "The playbook dispatcher job id", - "example": "c84cfd11-745c-4ee3-b87d-057a96732415", - "type": "string" - }, - "PlaybookURL": { - "description": "The generated playbook url", - "example": "https://console.redhat.com/api/edge/v1/updates/1026/update-playbook.yml", - "type": "string" - }, - "Reason": { - "description": "In case of failure the error reason returned by the playbook-dispatcher service", - "example": "", - "type": "string" - }, - "Status": { - "description": "The status of device update", - "example": "BUILDING", - "type": "string" - } - }, - "type": "object" - }, - "UpdateRepo": { - "properties": { - "ID": { - "description": "The unique ID of the update repository", - "example": 53218, - "type": "integer" - }, - "RepoStatus": { - "description": "The status of the device update repository building", - "example": "SUCCESS", - "type": "string" - }, - "RepoURL": { - "description": "The url of the update ostree repository", - "example": "https://storage-host.example.com/53218/upd/53218/repo", - "type": "string" - } - }, - "type": "object" - }, - "errors.BadRequest": { - "properties": { - "Code": { - "type": "string" - }, - "Status": { - "type": "integer" - }, - "Title": { - "type": "string" - } - }, - "type": "object" - }, - "errors.InternalServerError": { - "properties": { - "Code": { - "type": "string" - }, - "Status": { - "type": "integer" - }, - "Title": { - "type": "string" - } - }, - "type": "object" - }, - "errors.NotFound": { - "properties": { - "Code": { - "type": "string" - }, - "Status": { - "type": "integer" - }, - "Title": { - "type": "string" - } - }, - "type": "object" - }, - "gorm.DeletedAt": { - "properties": { - "time": { - "type": "string" - }, - "valid": { - "description": "Valid is true if Time is not NULL", - "type": "boolean" - } - }, - "type": "object" - }, - "models.CheckGroupNameParamAPI": { - "properties": { - "Name": { - "description": "device group name", - "example": "my-device-group", - "type": "string" - } - }, - "type": "object" - }, - "models.Commit": { - "properties": { - "Account": { - "type": "string" - }, - "Arch": { - "type": "string" - }, - "BlueprintToml": { - "type": "string" - }, - "BuildDate": { - "type": "string" - }, - "BuildNumber": { - "type": "integer" - }, - "ChangesRefs": { - "type": "boolean" - }, - "ComposeJobID": { - "type": "string" - }, - "CreatedAt": { - "$ref": "#/components/schemas/models.EdgeAPITime" - }, - "DeletedAt": { - "$ref": "#/components/schemas/gorm.DeletedAt" - }, - "ID": { - "type": "integer" - }, - "ImageBuildHash": { - "type": "string" - }, - "ImageBuildParentHash": { - "type": "string" - }, - "ImageBuildTarURL": { - "type": "string" - }, - "InstalledPackages": { - "items": { - "$ref": "#/components/schemas/models.InstalledPackage" - }, - "type": "array" - }, - "OSTreeCommit": { - "type": "string" - }, - "OSTreeParentCommit": { - "type": "string" - }, - "OSTreeParentRef": { - "type": "string" - }, - "OSTreeRef": { - "type": "string" - }, - "Repo": { - "$ref": "#/components/schemas/models.Repo" - }, - "RepoID": { - "type": "integer" - }, - "Status": { - "type": "string" - }, - "UpdatedAt": { - "$ref": "#/components/schemas/models.EdgeAPITime" - }, - "external": { - "type": "boolean" - }, - "name": { - "type": "string" - }, - "org_id": { - "type": "string" - } - }, - "type": "object" - }, - "models.CreateDeviceGroupAPI": { - "properties": { - "DevicesAPI": { - "description": "Devices of group", - "items": { - "$ref": "#/components/schemas/models.DeviceForDeviceGroupAPI" - }, - "type": "array" - }, - "name": { - "description": "the device group name", - "example": "my-device-group", - "type": "string" - }, - "type": { - "description": "the device group type", - "example": "static", - "type": "string" - } - }, - "type": "object" - }, - "models.Device": { - "properties": { - "Account": { - "type": "string" - }, - "AvailableHash": { - "type": "string" - }, - "Connected": { - "type": "boolean" - }, - "CreatedAt": { - "$ref": "#/components/schemas/models.EdgeAPITime" - }, - "CurrentHash": { - "type": "string" - }, - "DeletedAt": { - "$ref": "#/components/schemas/gorm.DeletedAt" - }, - "DevicesGroups": { - "items": { - "$ref": "#/components/schemas/models.DeviceGroup" - }, - "type": "array" - }, - "ID": { - "type": "integer" - }, - "ImageID": { - "type": "integer" - }, - "LastSeen": { - "$ref": "#/components/schemas/models.EdgeAPITime" - }, - "Name": { - "type": "string" - }, - "RHCClientID": { - "type": "string" - }, - "UUID": { - "type": "string" - }, - "UpdateAvailable": { - "type": "boolean" - }, - "UpdateTransaction": { - "items": { - "$ref": "#/components/schemas/models.UpdateTransaction" - }, - "type": "array" - }, - "UpdatedAt": { - "$ref": "#/components/schemas/models.EdgeAPITime" - }, - "org_id": { - "type": "string" - } - }, - "type": "object" - }, - "models.DeviceAPI": { - "properties": { - "AvailableHash": { - "description": "Hash that available", - "example": "true", - "type": "string" - }, - "Connected": { - "description": "If Device connect of not", - "example": true, - "type": "boolean" - }, - "CurrentHash": { - "type": "string" - }, - "ImageID": { - "description": "image id of device`", - "example": 12834, - "type": "integer" - }, - "Name": { - "description": "Name of device", - "example": "device_name", - "type": "string" - }, - "RHCClientID": { - "description": "RHC Client ID", - "type": "string" - }, - "UUID": { - "description": "UUID of edge device", - "example": "ba-93ba-49a3-b4ae-a6c8acdc4736", - "type": "string" - }, - "UpdateAvailable": { - "description": "If there is Update available", - "example": true, - "type": "boolean" - }, - "UpdateTransaction": { - "items": { - "$ref": "#/components/schemas/models.UpdateTransaction" - }, - "type": "array" - }, - "booted": { - "description": "Booted status is referring to the LastDeployment of this device", - "example": true, - "type": "boolean" - }, - "deviceName": { - "type": "string" - }, - "devicesGroups": { - "description": "device groups", - "items": { - "$ref": "#/components/schemas/models.DeviceGroupAPI" - }, - "type": "array" - }, - "lastSeen": { - "description": "Last datetime that device updated", - "type": "string" - } - }, - "type": "object" - }, - "models.DeviceDetailsAPI": { - "properties": { - "Device": { - "allOf": [ - { - "$ref": "#/components/schemas/models.EdgeDeviceAPI" - } - ], - "description": "Details of device like name, LastSeen and more" - }, - "DeviceUpdating": { - "description": "If there is update to device", - "example": true, - "type": "boolean" - }, - "DevicesGroups": { - "description": "Device's groups", - "items": { - "$ref": "#/components/schemas/models.DeviceGroupAPI" - }, - "type": "array" - }, - "ImageInfo": { - "allOf": [ - { - "$ref": "#/components/schemas/models.ImageInfo" - } - ], - "description": "Information of device's image" - }, - "UpdateTransactions": { - "items": { - "$ref": "#/components/schemas/models.UpdateTransactionAPI" - }, - "type": "array" - } - }, - "type": "object" - }, - "models.DeviceDetailsListAPI": { - "properties": { - "count": { - "description": "total number of device", - "example": 40, - "type": "integer" - }, - "data": { - "description": "List of Devices", - "items": { - "$ref": "#/components/schemas/models.DeviceDetailsAPI" - }, - "type": "array" - }, - "total": { - "description": "total number of device", - "example": 40, - "type": "integer" - } - }, - "type": "object" - }, - "models.DeviceForDeviceGroupAPI": { - "properties": { - "UUID": { - "description": "device uuid", - "example": "68485bb8-6427-40ad-8711-93b6a5b4deac", - "type": "string" - } - }, - "type": "object" - }, - "models.DeviceGroup": { - "properties": { - "Account": { - "type": "string" - }, - "CreatedAt": { - "$ref": "#/components/schemas/models.EdgeAPITime" - }, - "DeletedAt": { - "$ref": "#/components/schemas/gorm.DeletedAt" - }, - "Devices": { - "items": { - "$ref": "#/components/schemas/models.Device" - }, - "type": "array" - }, - "ID": { - "type": "integer" - }, - "Name": { - "type": "string" - }, - "Type": { - "type": "string" - }, - "UpdatedAt": { - "$ref": "#/components/schemas/models.EdgeAPITime" - }, - "ValidUpdate": { - "type": "boolean" - }, - "org_id": { - "type": "string" - } - }, - "type": "object" - }, - "models.DeviceGroupAPI": { - "properties": { - "Devices": { - "description": "Devices that belong to the group", - "items": { - "$ref": "#/components/schemas/models.DeviceAPI" - }, - "type": "array" - }, - "Name": { - "description": "The device group name`", - "example": "device_group name", - "type": "string" - }, - "Type": { - "description": "The device group type``", - "example": "static", - "type": "string" - }, - "ValidUpdate": { - "description": "indicate if the update is valid", - "example": true, - "type": "boolean" - } - }, - "type": "object" - }, - "models.DeviceGroupViewAPI": { - "properties": { - "DeviceGroup": { - "allOf": [ - { - "$ref": "#/components/schemas/models.DeviceGroup" - } - ], - "description": "device group data" - }, - "DevicesView": { - "allOf": [ - { - "$ref": "#/components/schemas/models.DeviceGroupViewResponseAPI" - } - ], - "description": "device group detail" - } - }, - "type": "object" - }, - "models.DeviceGroupViewResponseAPI": { - "properties": { - "Devices": { - "allOf": [ - { - "$ref": "#/components/schemas/models.ImageSetImagePackagesAPI" - } - ], - "description": "all devices in a group" - }, - "Total": { - "description": "count of devices", - "example": 10, - "type": "integer" - } - }, - "type": "object" - }, - "models.DeviceViewAPI": { - "properties": { - "DeviceGroups": { - "description": "Device's groups", - "items": { - "$ref": "#/components/schemas/models.DeviceGroupAPI" - }, - "type": "array" - }, - "DeviceID": { - "description": "ID of device", - "example": 1913277, - "type": "integer" - }, - "DeviceName": { - "description": "Name of device", - "example": "device_name", - "type": "string" - }, - "DeviceUUID": { - "description": "UUID of Device", - "example": "a-8bdf-a21accb24925", - "type": "string" - }, - "DispatcherReason": { - "description": "Reason of Dispatch", - "type": "string" - }, - "DispatcherStatus": { - "description": "Status of Dispatch", - "type": "string" - }, - "ImageID": { - "description": "ID of image", - "example": 323241, - "type": "integer" - }, - "ImageName": { - "description": "Name of image", - "example": "image_name", - "type": "string" - }, - "ImageSetID": { - "description": "ID of image set", - "example": 33341, - "type": "integer" - }, - "LastSeen": { - "allOf": [ - { - "$ref": "#/components/schemas/models.EdgeAPITime" - } - ], - "description": "Last datetime that device updated" - }, - "Status": { - "description": "Status of device", - "example": "SUCCESS", - "type": "string" - }, - "UpdateAvailable": { - "description": "indicate if there is update to device", - "example": true, - "type": "boolean" - } - }, - "type": "object" - }, - "models.DeviceViewListAPI": { - "properties": { - "devices": { - "description": "List of Devices", - "items": { - "$ref": "#/components/schemas/models.DeviceViewAPI" - }, - "type": "array" - }, - "total": { - "description": "Total number of device", - "example": 40, - "type": "integer" - } - }, - "type": "object" - }, - "models.DispatchRecord": { - "properties": { - "CreatedAt": { - "$ref": "#/components/schemas/models.EdgeAPITime" - }, - "DeletedAt": { - "$ref": "#/components/schemas/gorm.DeletedAt" - }, - "Device": { - "$ref": "#/components/schemas/models.Device" - }, - "DeviceID": { - "type": "integer" - }, - "ID": { - "type": "integer" - }, - "PlaybookDispatcherID": { - "type": "string" - }, - "PlaybookURL": { - "type": "string" - }, - "Reason": { - "type": "string" - }, - "Status": { - "type": "string" - }, - "UpdatedAt": { - "$ref": "#/components/schemas/models.EdgeAPITime" - } - }, - "type": "object" - }, - "models.DispatchRecordAPI": { - "properties": { - "Device": { - "$ref": "#/components/schemas/models.DeviceAPI" - }, - "DeviceID": { - "description": "ID of device", - "example": 1913277, - "type": "integer" - }, - "PlaybookDispatcherID": { - "type": "string" - }, - "PlaybookURL": { - "type": "string" - }, - "Reason": { - "type": "string" - }, - "Status": { - "description": "Status of device", - "example": "SUCCESS", - "type": "string" - } - }, - "type": "object" - }, - "models.EdgeAPITime": { - "properties": { - "time": { - "type": "string" - }, - "valid": { - "description": "Valid is true if Time is not NULL", - "type": "boolean" - } - }, - "type": "object" - }, - "models.EdgeDeviceAPI": { - "properties": { - "AvailableHash": { - "description": "Hash that available", - "example": "true", - "type": "string" - }, - "Connected": { - "description": "If Device connect of not", - "example": true, - "type": "boolean" - }, - "CurrentHash": { - "type": "string" - }, - "DevicesGroups": { - "description": "device groups", - "items": { - "$ref": "#/components/schemas/models.DeviceGroupAPI" - }, - "type": "array" - }, - "ImageID": { - "description": "image id of device", - "example": 12834, - "type": "integer" - }, - "LastSeen": { - "allOf": [ - { - "$ref": "#/components/schemas/models.EdgeAPITime" - } - ], - "description": "Last datetime that device updated" - }, - "Name": { - "description": "Name of Edge Device", - "type": "string" - }, - "RHCClientID": { - "description": "RHC Client ID", - "type": "string" - }, - "UUID": { - "description": "UUID of edge device", - "example": "ba-93ba-49a3-b4ae-a6c8acdc4736", - "type": "string" - }, - "UpdateAvailable": { - "description": "If there is update available", - "example": true, - "type": "boolean" - }, - "UpdateTransaction": { - "items": { - "$ref": "#/components/schemas/models.UpdateTransaction" - }, - "type": "array" - }, - "booted": { - "description": "Booted status is referring to the LastDeployment of this device", - "example": true, - "type": "boolean" - }, - "deviceName": { - "description": "The device name", - "example": "test_device_api_static", - "type": "string" - } - }, - "type": "object" - }, - "models.FilterByDevicesAPI": { - "properties": { - "devices_uuid": { - "description": "Devices UUID", - "items": { - "type": "string" - }, - "type": "array" - } - }, - "type": "object" - }, - "models.Image": { - "properties": { - "Account": { - "type": "string" - }, - "Commit": { - "$ref": "#/components/schemas/models.Commit" - }, - "CommitID": { - "type": "integer" - }, - "CreatedAt": { - "$ref": "#/components/schemas/models.EdgeAPITime" - }, - "CustomPackages": { - "items": { - "$ref": "#/components/schemas/models.Package" - }, - "type": "array" - }, - "DeletedAt": { - "$ref": "#/components/schemas/gorm.DeletedAt" - }, - "Description": { - "type": "string" - }, - "Distribution": { - "type": "string" - }, - "ID": { - "type": "integer" - }, - "ImageSetID": { - "description": "TODO: Wipe staging database and set to not nullable", - "type": "integer" - }, - "ImageType": { - "description": "TODO: Remove as soon as the frontend stops using", - "type": "string" - }, - "Installer": { - "$ref": "#/components/schemas/models.Installer" - }, - "InstallerID": { - "type": "integer" - }, - "Name": { - "type": "string" - }, - "OutputTypes": { - "items": { - "type": "string" - }, - "type": "array" - }, - "Packages": { - "items": { - "$ref": "#/components/schemas/models.Package" - }, - "type": "array" - }, - "Status": { - "type": "string" - }, - "SystemsRunning": { - "description": "only for forms", - "type": "integer" - }, - "ThirdPartyRepositories": { - "items": { - "$ref": "#/components/schemas/models.ThirdPartyRepo" - }, - "type": "array" - }, - "TotalPackages": { - "description": "only for forms", - "type": "integer" - }, - "UpdatedAt": { - "$ref": "#/components/schemas/models.EdgeAPITime" - }, - "Version": { - "type": "integer" - }, - "org_id": { - "type": "string" - }, - "request_id": { - "description": "storing for logging reference on resume", - "type": "string" - } - }, - "type": "object" - }, - "models.ImageDetailAPI": { - "properties": { - "additional_packages": { - "description": "Number of additional packages", - "example": 3, - "type": "integer" - }, - "image": { - "$ref": "#/components/schemas/models.Image" - }, - "packages": { - "description": "Number of packages", - "example": 3, - "type": "integer" - }, - "update_added": { - "description": "Number of added update", - "example": 3, - "type": "integer" - }, - "update_removed": { - "description": "Number of removed update", - "example": 2, - "type": "integer" - }, - "update_updated": { - "description": "Number of updated update", - "example": 3, - "type": "integer" - } - }, - "type": "object" - }, - "models.ImageInfo": { - "properties": { - "Count": { - "type": "integer" - }, - "Image": { - "$ref": "#/components/schemas/models.Image" - }, - "RollbackImage": { - "$ref": "#/components/schemas/models.Image" - }, - "UpdatesAvailable": { - "items": { - "$ref": "#/components/schemas/models.ImageUpdateAvailable" - }, - "type": "array" - } - }, - "type": "object" - }, - "models.ImageSetAPI": { - "properties": { - "CreatedAt": { - "$ref": "#/components/schemas/models.EdgeAPITime" - }, - "DeletedAt": { - "$ref": "#/components/schemas/gorm.DeletedAt" - }, - "ID": { - "type": "integer" - }, - "Images": { - "description": "images of image set", - "items": { - "$ref": "#/components/schemas/models.Image" - }, - "type": "array" - }, - "UpdatedAt": { - "$ref": "#/components/schemas/models.EdgeAPITime" - }, - "name": { - "description": "the image set name", - "example": "my-edge-image", - "type": "string" - }, - "version": { - "description": "the image set version", - "example": 1, - "type": "integer" - } - }, - "type": "object" - }, - "models.ImageSetDetailsResponseAPI": { - "properties": { - "Count": { - "description": "count of image-sets", - "example": 10, - "type": "integer" - }, - "Data": { - "allOf": [ - { - "$ref": "#/components/schemas/models.ImageSetImagePackagesAPI" - } - ], - "description": "all data of image-sets" - } - }, - "type": "object" - }, - "models.ImageSetDevicesAPI": { - "properties": { - "Count": { - "description": "count of image-set's devices", - "example": 10, - "type": "integer" - }, - "Data": { - "description": "Data of image set's devices", - "items": { - "type": "string" - }, - "type": "array" - } - }, - "type": "object" - }, - "models.ImageSetIDViewAPI": { - "properties": { - "ImageBuildIsoURL": { - "description": "The image-set latest available image ISO", - "example": "/api/edge/v1/storage/isos/432", - "type": "string" - }, - "ImageSet": { - "allOf": [ - { - "$ref": "#/components/schemas/models.ImageSetAPI" - } - ], - "description": "image set data" - }, - "LastImageDetails": { - "allOf": [ - { - "$ref": "#/components/schemas/models.ImageDetailAPI" - } - ], - "description": "The image-set latest image details" - } - }, - "type": "object" - }, - "models.ImageSetImageIDViewAPI": { - "properties": { - "ImageBuildIsoURL": { - "description": "The image-set latest available image ISO", - "example": "/api/edge/v1/storage/isos/432", - "type": "string" - }, - "ImageDetails": { - "allOf": [ - { - "$ref": "#/components/schemas/models.ImageDetailAPI" - } - ], - "description": "the requested image details" - }, - "ImageSet": { - "allOf": [ - { - "$ref": "#/components/schemas/models.ImageSetAPI" - } - ], - "description": "image set data" - } - }, - "type": "object" - }, - "models.ImageSetImagePackagesAPI": { - "properties": { - "image_build_iso_url": { - "description": "The image-set latest available image ISO", - "example": "/api/edge/v1/storage/isos/432", - "type": "string" - }, - "image_set": { - "allOf": [ - { - "$ref": "#/components/schemas/models.ImageSetAPI" - } - ], - "description": "image set data" - }, - "images": { - "description": "image detail", - "items": { - "$ref": "#/components/schemas/models.ImageDetailAPI" - }, - "type": "array" - } - }, - "type": "object" - }, - "models.ImageSetInstallerURLAPI": { - "properties": { - "image_build_iso_url": { - "description": "The image-set latest available image ISO", - "example": "/api/edge/v1/storage/isos/432", - "type": "string" - }, - "image_set": { - "allOf": [ - { - "$ref": "#/components/schemas/models.ImageSetAPI" - } - ], - "description": "image set data" - } - }, - "type": "object" - }, - "models.ImageSetView": { - "properties": { - "Distribution": { - "type": "string" - }, - "ID": { - "type": "integer" - }, - "ImageBuildIsoURL": { - "type": "string" - }, - "ImageID": { - "type": "integer" - }, - "Name": { - "type": "string" - }, - "OutputTypes": { - "items": { - "type": "string" - }, - "type": "array" - }, - "Status": { - "type": "string" - }, - "UpdatedAt": { - "$ref": "#/components/schemas/models.EdgeAPITime" - }, - "Version": { - "type": "integer" - } - }, - "type": "object" - }, - "models.ImageSetsResponseAPI": { - "properties": { - "Count": { - "description": "count of image-sets", - "example": 10, - "type": "integer" - }, - "Data": { - "description": "all data of image-sets", - "items": { - "$ref": "#/components/schemas/models.ImageSetInstallerURLAPI" - }, - "type": "array" - } - }, - "type": "object" - }, - "models.ImageSetsViewResponseAPI": { - "properties": { - "count": { - "description": "count of image-sets", - "example": 10, - "type": "integer" - }, - "data": { - "description": "data of image set view", - "items": { - "$ref": "#/components/schemas/models.ImageSetView" - }, - "type": "array" - } - }, - "type": "object" - }, - "models.ImageUpdateAvailable": { - "properties": { - "CanUpdate": { - "type": "boolean" - }, - "Image": { - "$ref": "#/components/schemas/models.Image" - }, - "PackageDiff": { - "$ref": "#/components/schemas/models.PackageDiff" - } - }, - "type": "object" - }, - "models.ImageView": { - "properties": { - "CommitCheckSum": { - "type": "string" - }, - "CreatedAt": { - "$ref": "#/components/schemas/models.EdgeAPITime" - }, - "ID": { - "type": "integer" - }, - "ImageBuildIsoURL": { - "type": "string" - }, - "ImageType": { - "type": "string" - }, - "Name": { - "type": "string" - }, - "OutputTypes": { - "items": { - "type": "string" - }, - "type": "array" - }, - "Status": { - "type": "string" - }, - "Version": { - "type": "integer" - } - }, - "type": "object" - }, - "models.ImagesViewDataAPI": { - "properties": { - "count": { - "description": "total number of image view data", - "example": 100, - "type": "integer" - }, - "data": { - "items": { - "$ref": "#/components/schemas/models.ImageView" - }, - "type": "array" - } - }, - "type": "object" - }, - "models.InstalledPackage": { - "properties": { - "CreatedAt": { - "$ref": "#/components/schemas/models.EdgeAPITime" - }, - "DeletedAt": { - "$ref": "#/components/schemas/gorm.DeletedAt" - }, - "ID": { - "type": "integer" - }, - "UpdatedAt": { - "$ref": "#/components/schemas/models.EdgeAPITime" - }, - "arch": { - "type": "string" - }, - "commits": { - "items": { - "$ref": "#/components/schemas/models.Commit" - }, - "type": "array" - }, - "epoch": { - "type": "string" - }, - "name": { - "type": "string" - }, - "release": { - "type": "string" - }, - "sigmd5": { - "type": "string" - }, - "signature": { - "type": "string" - }, - "type": { - "type": "string" - }, - "version": { - "type": "string" - } - }, - "type": "object" - }, - "models.Installer": { - "properties": { - "Account": { - "type": "string" - }, - "Checksum": { - "type": "string" - }, - "ComposeJobID": { - "type": "string" - }, - "CreatedAt": { - "$ref": "#/components/schemas/models.EdgeAPITime" - }, - "DeletedAt": { - "$ref": "#/components/schemas/gorm.DeletedAt" - }, - "ID": { - "type": "integer" - }, - "ImageBuildISOURL": { - "type": "string" - }, - "SshKey": { - "type": "string" - }, - "Status": { - "type": "string" - }, - "UpdatedAt": { - "$ref": "#/components/schemas/models.EdgeAPITime" - }, - "Username": { - "type": "string" - }, - "org_id": { - "type": "string" - } - }, - "type": "object" - }, - "models.Package": { - "properties": { - "CreatedAt": { - "$ref": "#/components/schemas/models.EdgeAPITime" - }, - "DeletedAt": { - "$ref": "#/components/schemas/gorm.DeletedAt" - }, - "ID": { - "type": "integer" - }, - "Name": { - "type": "string" - }, - "UpdatedAt": { - "$ref": "#/components/schemas/models.EdgeAPITime" - } - }, - "type": "object" - }, - "models.PackageDiff": { - "properties": { - "Added": { - "items": { - "$ref": "#/components/schemas/models.InstalledPackage" - }, - "type": "array" - }, - "Removed": { - "items": { - "$ref": "#/components/schemas/models.InstalledPackage" - }, - "type": "array" - }, - "Upgraded": { - "items": { - "$ref": "#/components/schemas/models.InstalledPackage" - }, - "type": "array" - } - }, - "type": "object" - }, - "models.PostDeviceForDeviceGroupAPI": { - "properties": { - "Name": { - "description": "device name", - "example": "localhost", - "type": "string" - }, - "UUID": { - "description": "device uuid", - "example": "68485bb8-6427-40ad-8711-93b6a5b4deac", - "type": "string" - } - }, - "type": "object" - }, - "models.PutGroupNameParamAPI": { - "properties": { - "Name": { - "description": "device group name", - "example": "my-device-group", - "type": "string" - }, - "Type": { - "description": "device group type", - "example": "static", - "type": "string" - } - }, - "type": "object" - }, - "models.Repo": { - "properties": { - "CreatedAt": { - "$ref": "#/components/schemas/models.EdgeAPITime" - }, - "DeletedAt": { - "$ref": "#/components/schemas/gorm.DeletedAt" - }, - "ID": { - "type": "integer" - }, - "RepoStatus": { - "type": "string" - }, - "RepoURL": { - "type": "string" - }, - "UpdatedAt": { - "$ref": "#/components/schemas/models.EdgeAPITime" - } - }, - "type": "object" - }, - "models.SuccessPlaceholderResponse": { - "type": "object" - }, - "models.ThirdPartyRepo": { - "properties": { - "CreatedAt": { - "$ref": "#/components/schemas/models.EdgeAPITime" - }, - "DeletedAt": { - "$ref": "#/components/schemas/gorm.DeletedAt" - }, - "Description": { - "type": "string" - }, - "ID": { - "type": "integer" - }, - "Images": { - "items": { - "$ref": "#/components/schemas/models.Image" - }, - "type": "array" - }, - "Name": { - "type": "string" - }, - "URL": { - "type": "string" - }, - "UpdatedAt": { - "$ref": "#/components/schemas/models.EdgeAPITime" - }, - "account": { - "type": "string" - }, - "distribution_arch": { - "type": "string" - }, - "distribution_version": { - "items": { - "type": "string" - }, - "type": "array" - }, - "gpg_key": { - "type": "string" - }, - "org_id": { - "type": "string" - }, - "package_count": { - "type": "integer" - }, - "uuid": { - "type": "string" - } - }, - "type": "object" - }, - "models.UpdateCommitAPI": { - "properties": { - "ID": { - "description": "The unique ID of the commit", - "example": 1056, - "type": "integer" - }, - "ImageBuildTarURL": { - "description": "The commit tar url", - "example": "https://storage-host.example.com/v2/99999999/tar/59794/tmp/repos/59794/repo.tar", - "type": "string" - }, - "OSTreeCommit": { - "description": "The ostree commit hash", - "example": "9bd8dfe9856aa5bb1683e85f123bfe7785d45fbdb6f10372ff2c80e703400999", - "type": "string" - }, - "OSTreeRef": { - "description": "The commit ostree ref", - "example": "rhel/9/x86_64/edge", - "type": "string" - } - }, - "type": "object" - }, - "models.UpdateTransaction": { - "properties": { - "Account": { - "type": "string" - }, - "ChangesRefs": { - "type": "boolean" - }, - "Commit": { - "$ref": "#/components/schemas/models.Commit" - }, - "CommitID": { - "type": "integer" - }, - "CreatedAt": { - "$ref": "#/components/schemas/models.EdgeAPITime" - }, - "DeletedAt": { - "$ref": "#/components/schemas/gorm.DeletedAt" - }, - "Devices": { - "items": { - "$ref": "#/components/schemas/models.Device" - }, - "type": "array" - }, - "DispatchRecords": { - "items": { - "$ref": "#/components/schemas/models.DispatchRecord" - }, - "type": "array" - }, - "ID": { - "type": "integer" - }, - "OldCommits": { - "items": { - "$ref": "#/components/schemas/models.Commit" - }, - "type": "array" - }, - "Repo": { - "$ref": "#/components/schemas/models.Repo" - }, - "RepoID": { - "type": "integer" - }, - "Status": { - "type": "string" - }, - "Tag": { - "type": "string" - }, - "UpdatedAt": { - "$ref": "#/components/schemas/models.EdgeAPITime" - }, - "org_id": { - "type": "string" - } - }, - "type": "object" - }, - "models.UpdateTransactionAPI": { - "properties": { - "ChangesRefs": { - "example": false, - "type": "boolean" - }, - "Commit": { - "$ref": "#/components/schemas/models.Commit" - }, - "CommitID": { - "description": "Commit ID of device", - "example": 1754, - "type": "integer" - }, - "Devices": { - "description": "List of Devices", - "items": { - "$ref": "#/components/schemas/models.DeviceAPI" - }, - "type": "array" - }, - "DispatchRecords": { - "items": { - "$ref": "#/components/schemas/models.DispatchRecordAPI" - }, - "type": "array" - }, - "OldCommits": { - "description": "Old Commit ID if the device has one", - "items": { - "$ref": "#/components/schemas/models.Commit" - }, - "type": "array" - }, - "Repo": { - "$ref": "#/components/schemas/models.Repo" - }, - "RepoID": { - "description": "Repo ID", - "example": 2256, - "type": "integer" - }, - "Status": { - "description": "Status of device", - "example": "SUCCESS", - "type": "string" - }, - "Tag": { - "description": "Tag og Device if device has one", - "example": "device_tag", - "type": "string" - } - }, - "type": "object" - } - } - }, - "info": { - "contact": {}, - "description": "API of the Edge Management application on [console.redhat.com](https://console.redhat.com)", - "license": { - "name": "MIT" - }, - "title": "Edge API", - "version": "1.0" - }, - "openapi": "3.0.3", - "paths": { - "/device-groups": { - "get": { - "description": "Returns device groups for an orgID", - "parameters": [ - { - "description": "Define sort fields: created_at, updated_at, name. To sort DESC use -", - "in": "query", - "name": "sort_by", - "schema": { - "type": "string" - } - }, - { - "description": "field: filter by name", - "in": "query", - "name": "name", - "schema": { - "type": "string" - } - }, - { - "description": "field: return number of image-set view until limit is reached. Default is 100.", - "in": "query", - "name": "limit", - "schema": { - "type": "integer" - } - }, - { - "description": "field: return number of image-set view beginning at the offset.", - "in": "query", - "name": "offset", - "schema": { - "type": "integer" - } - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/models.DeviceGroup" - } - } - }, - "description": "OK" - }, - "400": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/errors.BadRequest" - } - } - }, - "description": "Bad Request" - }, - "500": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/errors.InternalServerError" - } - } - }, - "description": "Internal Server Error" - } - }, - "summary": "Returns device groups for an orgID", - "tags": [ - "Device Groups" - ] - }, - "post": { - "description": "Creates a Device Group for an account.", - "operationId": "CreateDeviceGroup", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/models.CreateDeviceGroupAPI" - } - } - }, - "description": "request body", - "required": true, - "x-originalParamName": "body" - }, - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/models.DeviceGroupAPI" - } - } - }, - "description": "The created device groups" - }, - "400": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/errors.BadRequest" - } - } - }, - "description": "The request sent couldn't be processed." - }, - "500": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/errors.InternalServerError" - } - } - }, - "description": "There was an internal server error." - } - }, - "summary": "Creates a Device Group for an account.", - "tags": [ - "Device Groups" - ] - } - }, - "/device-groups/checkName/{name}": { - "get": { - "description": "Validates if a group name already exists", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/models.CheckGroupNameParamAPI" - } - } - }, - "description": "request body", - "required": true, - "x-originalParamName": "body" - }, - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/models.SuccessPlaceholderResponse" - } - } - }, - "description": "OK" - }, - "400": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/errors.BadRequest" - } - } - }, - "description": "Bad Request" - }, - "500": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/errors.InternalServerError" - } - } - }, - "description": "Internal Server Error" - } - }, - "summary": "Validates if a group name already exists", - "tags": [ - "Device Groups" - ] - } - }, - "/device-groups/{ID}": { - "delete": { - "description": "Deletes an existing device group", - "parameters": [ - { - "description": "A unique existing Device Group", - "in": "query", - "name": "required_param", - "required": true, - "schema": { - "type": "integer" - } - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/models.SuccessPlaceholderResponse" - } - } - }, - "description": "OK" - }, - "400": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/errors.BadRequest" - } - } - }, - "description": "Bad Request" - }, - "500": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/errors.InternalServerError" - } - } - }, - "description": "Internal Server Error" - } - }, - "summary": "Deletes an existing device group", - "tags": [ - "Device Groups" - ] - }, - "get": { - "description": "Returns devices groups for group identified by ID", - "parameters": [ - { - "description": "device group ID", - "in": "query", - "name": "required_param", - "schema": { - "type": "integer" - } - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/models.DeviceGroup" - } - } - }, - "description": "OK" - }, - "400": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/errors.BadRequest" - } - } - }, - "description": "Bad Request" - }, - "500": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/errors.InternalServerError" - } - } - }, - "description": "Internal Server Error" - } - }, - "summary": "Returns devices groups for group identified by ID", - "tags": [ - "Device Groups" - ] - }, - "put": { - "description": "Updates the existing device group", - "parameters": [ - { - "description": "An unique existing Device Group", - "in": "query", - "name": "required_param", - "required": true, - "schema": { - "type": "integer" - } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/models.PutGroupNameParamAPI" - } - } - }, - "description": "request body", - "required": true, - "x-originalParamName": "body" - }, - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/models.DeviceGroup" - } - } - }, - "description": "OK" - }, - "400": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/errors.BadRequest" - } - } - }, - "description": "Bad Request" - }, - "500": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/errors.InternalServerError" - } - } - }, - "description": "Internal Server Error" - } - }, - "summary": "Updates the existing device group", - "tags": [ - "Device Groups" - ] - } - }, - "/device-groups/{ID}/details": { - "get": { - "description": "Returns details for group identified by ID", - "parameters": [ - { - "description": "device group ID", - "in": "query", - "name": "required_param", - "required": true, - "schema": { - "type": "integer" - } - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/models.DeviceGroup" - } - } - }, - "description": "OK" - }, - "400": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/errors.BadRequest" - } - } - }, - "description": "Bad Request" - }, - "500": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/errors.InternalServerError" - } - } - }, - "description": "Internal Server Error" - } - }, - "summary": "Returns details for group identified by ID", - "tags": [ - "Device Groups" - ] - } - }, - "/device-groups/{ID}/devices": { - "delete": { - "description": "Deletes the requested devices from device-group", - "parameters": [ - { - "description": "Identifier of the DeviceGroup", - "in": "path", - "name": "DeviceGroupID", - "required": true, - "schema": { - "type": "integer" - } - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/models.SuccessPlaceholderResponse" - } - } - }, - "description": "OK" - }, - "400": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/errors.BadRequest" - } - } - }, - "description": "Bad Request" - }, - "500": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/errors.InternalServerError" - } - } - }, - "description": "Internal Server Error" - } - }, - "summary": "Deletes the requested devices from device-group", - "tags": [ - "Device Groups" - ] - }, - "post": { - "description": "Adds devices to device group", - "parameters": [ - { - "description": "An unique existing Device Group", - "in": "query", - "name": "required_param", - "required": true, - "schema": { - "type": "integer" - } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/models.PostDeviceForDeviceGroupAPI" - } - } - }, - "description": "request body", - "required": true, - "x-originalParamName": "body" - }, - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/models.SuccessPlaceholderResponse" - } - } - }, - "description": "OK" - }, - "400": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/errors.BadRequest" - } - } - }, - "description": "Bad Request" - }, - "500": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/errors.InternalServerError" - } - } - }, - "description": "Internal Server Error" - } - }, - "summary": "Adds devices to device group", - "tags": [ - "Device Groups" - ] - } - }, - "/device-groups/{ID}/devices/{deviceID}": { - "delete": { - "description": "Deletes the requested device from the device-group", - "parameters": [ - { - "description": "Identifier of the Device Group", - "in": "path", - "name": "DeviceGroupId", - "required": true, - "schema": { - "type": "integer" - } - }, - { - "description": "Identifier of the Device in a Device Group", - "in": "path", - "name": "DeviceId", - "required": true, - "schema": { - "type": "integer" - } - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/models.SuccessPlaceholderResponse" - } - } - }, - "description": "OK" - }, - "400": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/errors.BadRequest" - } - } - }, - "description": "Bad Request" - }, - "500": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/errors.InternalServerError" - } - } - }, - "description": "Internal Server Error" - } - }, - "summary": "Deletes the requested device from the device-group", - "tags": [ - "Device Groups" - ] - } - }, - "/device-groups/{ID}/updateDevices": { - "post": { - "description": "Updates all devices that belong to a group", - "parameters": [ - { - "description": "Identifier of the DeviceGroup", - "in": "query", - "name": "required_param", - "required": true, - "schema": { - "type": "integer" - } - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/models.SuccessPlaceholderResponse" - } - } - }, - "description": "OK" - }, - "400": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/errors.BadRequest" - } - } - }, - "description": "Bad Request" - }, - "500": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/errors.InternalServerError" - } - } - }, - "description": "Internal Server Error" - } - }, - "summary": "Updates all devices that belong to a group", - "tags": [ - "Device Groups" - ] - } - }, - "/device-groups/{ID}/view": { - "get": { - "description": "Returns device groups view for group identified by ID", - "parameters": [ - { - "description": "device group ID", - "in": "query", - "name": "required_param", - "schema": { - "type": "integer" - } - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/models.DeviceGroupViewAPI" - } - } - }, - "description": "OK" - }, - "400": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/errors.BadRequest" - } - } - }, - "description": "Bad Request" - }, - "500": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/errors.InternalServerError" - } - } - }, - "description": "Internal Server Error" - } - }, - "summary": "Returns device groups view for group identified by ID", - "tags": [ - "Device Groups" - ] - } - }, - "/devices": { - "get": { - "description": "Get combined system data from Edge API and Inventory API", - "operationId": "GetDevices", - "parameters": [ - { - "description": "field: maximum devices per page", - "in": "query", - "name": "per_page", - "schema": { - "type": "integer" - } - }, - { - "description": "field: which page to query from", - "in": "query", - "name": "page", - "schema": { - "type": "integer" - } - }, - { - "description": "field: order by display_name, updated or operating_system", - "in": "query", - "name": "order_by", - "schema": { - "type": "string" - } - }, - { - "description": "field: choose to order ASC or DESC when order_by is being used", - "in": "query", - "name": "order_how", - "schema": { - "type": "string" - } - }, - { - "description": "field: filter by hostname_or_id", - "in": "query", - "name": "hostname_or_id", - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/models.DeviceDetailsListAPI" - } - } - }, - "description": "OK" - }, - "500": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/errors.InternalServerError" - } - } - }, - "description": "There was an internal server error." - } - }, - "summary": "Get All Devices.", - "tags": [ - "Devices (Systems)" - ] - } - }, - "/devices/devicesview": { - "get": { - "description": "Return all data of Devices.", - "operationId": "GetDevicesView", - "parameters": [ - { - "description": "fields: name, uuid, update_available, image_id. To sort DESC use - before the fields.", - "in": "query", - "name": "sort_by", - "schema": { - "type": "string" - } - }, - { - "description": "field: filter by name", - "in": "query", - "name": "name", - "schema": { - "type": "string" - } - }, - { - "description": "field: filter by update_available", - "in": "query", - "name": "update_available", - "schema": { - "type": "boolean" - } - }, - { - "description": "field: filter by uuid", - "in": "query", - "name": "uuid", - "schema": { - "type": "string" - } - }, - { - "description": "field: filter by creation date", - "in": "query", - "name": "created_at", - "schema": { - "type": "string" - } - }, - { - "description": "field: filter by image id", - "in": "query", - "name": "image_id", - "schema": { - "type": "integer" - } - }, - { - "description": "field: return number of devices until limit is reached. Default is 100.", - "in": "query", - "name": "limit", - "schema": { - "type": "integer" - } - }, - { - "description": "field: return number of devices begining at the offset.", - "in": "query", - "name": "offset", - "schema": { - "type": "integer" - } - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/models.DeviceViewListAPI" - } - } - }, - "description": "OK" - }, - "500": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/errors.InternalServerError" - } - } - }, - "description": "There was an internal server error." - } - }, - "summary": "Return all data of Devices.", - "tags": [ - "Devices (Systems)" - ] - }, - "post": { - "description": "Return all data of Devices.", - "operationId": "GetDevicesViewWithinDevices", - "parameters": [ - { - "description": "fields: name, uuid, update_available, image_id. To sort DESC use - before the fields.", - "in": "query", - "name": "sort_by", - "schema": { - "type": "string" - } - }, - { - "description": "field: filter by name", - "in": "query", - "name": "name", - "schema": { - "type": "string" - } - }, - { - "description": "field: filter by update_available", - "in": "query", - "name": "update_available", - "schema": { - "type": "boolean" - } - }, - { - "description": "field: filter by uuid", - "in": "query", - "name": "uuid", - "schema": { - "type": "string" - } - }, - { - "description": "field: filter by creation date", - "in": "query", - "name": "created_at", - "schema": { - "type": "string" - } - }, - { - "description": "field: filter by image id", - "in": "query", - "name": "image_id", - "schema": { - "type": "integer" - } - }, - { - "description": "field: return number of devices until limit is reached. Default is 100.", - "in": "query", - "name": "limit", - "schema": { - "type": "integer" - } - }, - { - "description": "field: return number of devices beginning at the offset.", - "in": "query", - "name": "offset", - "schema": { - "type": "integer" - } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/models.FilterByDevicesAPI" - } - } - }, - "description": "request body", - "required": true, - "x-originalParamName": "body" - }, - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/models.DeviceViewListAPI" - } - } - }, - "description": "OK" - }, - "500": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/errors.InternalServerError" - } - } - }, - "description": "There was an internal server error." - } - }, - "summary": "Return all data of Devices.", - "tags": [ - "Devices (Systems)" - ] - } - }, - "/devices/{DeviceUUID}": { - "get": { - "description": "Get a device by UUID.", - "operationId": "GetDevice", - "parameters": [ - { - "description": "DeviceUUID", - "in": "path", - "name": "DeviceUUID", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/models.DeviceDetailsAPI" - } - } - }, - "description": "OK" - }, - "400": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/errors.BadRequest" - } - } - }, - "description": "The request sent couldn't be processed." - }, - "404": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/errors.NotFound" - } - } - }, - "description": "The device was not found." - }, - "500": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/errors.InternalServerError" - } - } - }, - "description": "There was an internal server error." - } - }, - "summary": "Get a device by UUID.", - "tags": [ - "Devices (Systems)" - ] - } - }, - "/image-sets": { - "get": { - "description": "Return the list of image sets.", - "operationId": "ListAllImageSets", - "parameters": [ - { - "description": "Define sort fields: created_at, updated_at, name. To sort DESC use -", - "in": "query", - "name": "sort_by", - "schema": { - "type": "string" - } - }, - { - "description": "field: filter by name", - "in": "query", - "name": "name", - "schema": { - "type": "string" - } - }, - { - "description": "field: filter by status", - "in": "query", - "name": "status", - "schema": { - "type": "string" - } - }, - { - "description": "field: return number of image-set view until limit is reached. Default is 100.", - "in": "query", - "name": "limit", - "schema": { - "type": "integer" - } - }, - { - "description": "field: return number of image-set view beginning at the offset.", - "in": "query", - "name": "offset", - "schema": { - "type": "integer" - } - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/models.ImageSetsResponseAPI" - } - } - }, - "description": "OK" - }, - "400": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/errors.BadRequest" - } - } - }, - "description": "The request sent couldn't be processed." - }, - "404": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/errors.NotFound" - } - } - }, - "description": "The Image Set was not found." - }, - "500": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/errors.InternalServerError" - } - } - }, - "description": "There was an internal server error." - } - }, - "summary": "Return the list of image sets.", - "tags": [ - "Image-Sets" - ] - } - }, - "/image-sets/view": { - "get": { - "description": "Return the list of image set view.", - "parameters": [ - { - "description": "Define sort fields: created_at, updated_at, name. To sort DESC use -", - "in": "query", - "name": "sort_by", - "schema": { - "type": "string" - } - }, - { - "description": "field: filter by name", - "in": "query", - "name": "name", - "schema": { - "type": "string" - } - }, - { - "description": "field: filter by status", - "in": "query", - "name": "status", - "schema": { - "type": "string" - } - }, - { - "description": "field: filter by id", - "in": "query", - "name": "id", - "schema": { - "type": "integer" - } - }, - { - "description": "field: return number of image-set view until limit is reached. Default is 30.", - "in": "query", - "name": "limit", - "schema": { - "type": "integer" - } - }, - { - "description": "field: return number of image-set view beginning at the offset.", - "in": "query", - "name": "offset", - "schema": { - "type": "integer" - } - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/models.ImageSetsViewResponseAPI" - } - } - }, - "description": "OK" - }, - "500": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/errors.InternalServerError" - } - } - }, - "description": "There was an internal server error." - } - }, - "summary": "Return the list of image set view.", - "tags": [ - "Image-Sets" - ] - } - }, - "/image-sets/view/{imageSetID}/versions/{imageID}": { - "get": { - "description": "Return the image-set images view list.", - "operationId": "GetImageSetImageView", - "parameters": [ - { - "description": "the image set id", - "in": "path", - "name": "imageSetID", - "required": true, - "schema": { - "type": "integer" - } - }, - { - "description": "the image id", - "in": "path", - "name": "imageID", - "required": true, - "schema": { - "type": "integer" - } - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/models.ImageSetImageIDViewAPI" - } - } - }, - "description": "OK" - }, - "400": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/errors.BadRequest" - } - } - }, - "description": "The request sent couldn't be processed." - }, - "404": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/errors.NotFound" - } - } - }, - "description": "The Image-Set or Image was not found." - }, - "500": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/errors.InternalServerError" - } - } - }, - "description": "There was an internal server error." - } - }, - "summary": "Return the image-set images view list.", - "tags": [ - "Image-Sets" - ] - } - }, - "/image-sets/view/{image_set_id}": { - "get": { - "description": "Return the image-set description view.", - "operationId": "GetImageSetViewByID", - "parameters": [ - { - "description": "the image-set id", - "in": "path", - "name": "image_set_id", - "required": true, - "schema": { - "type": "integer" - } - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/models.ImageSetIDViewAPI" - } - } - }, - "description": "OK" - }, - "400": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/errors.BadRequest" - } - } - }, - "description": "The request sent couldn't be processed." - }, - "404": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/errors.NotFound" - } - } - }, - "description": "The Image-Set was not found." - }, - "500": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/errors.InternalServerError" - } - } - }, - "description": "There was an internal server error." - } - }, - "summary": "Return the image-set description view.", - "tags": [ - "Image-Sets" - ] - } - }, - "/image-sets/view/{image_set_id}/versions": { - "get": { - "description": "Return the image-set images view list.", - "operationId": "GetAllImageSetImagesView", - "parameters": [ - { - "description": "the image-set id", - "in": "path", - "name": "image_set_id", - "required": true, - "schema": { - "type": "integer" - } - }, - { - "description": "Define sort fields: created_at, version, To sort DESC use -", - "in": "query", - "name": "sort_by", - "schema": { - "type": "string" - } - }, - { - "description": "field: filter by status", - "in": "query", - "name": "status", - "schema": { - "type": "string" - } - }, - { - "description": "field: filter by version", - "in": "query", - "name": "version", - "schema": { - "type": "string" - } - }, - { - "description": "field: return number of images until limit is reached. Default is 100.", - "in": "query", - "name": "limit", - "schema": { - "type": "integer" - } - }, - { - "description": "field: return number of images beginning at the offset.", - "in": "query", - "name": "offset", - "schema": { - "type": "integer" - } - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/models.ImagesViewDataAPI" - } - } - }, - "description": "OK" - }, - "400": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/errors.BadRequest" - } - } - }, - "description": "The request sent couldn't be processed." - }, - "404": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/errors.NotFound" - } - } - }, - "description": "The Image-Set was not found." - }, - "500": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/errors.InternalServerError" - } - } - }, - "description": "There was an internal server error." - } - }, - "summary": "Return the image-set images view list.", - "tags": [ - "Image-Sets" - ] - } - }, - "/image-sets/{imageSetID}": { - "delete": { - "description": "Delete Image Set", - "operationId": "DeleteImageSet", - "parameters": [ - { - "description": "Identifier of the ImageSet", - "in": "path", - "name": "imageSetID", - "required": true, - "schema": { - "type": "integer" - } - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/models.ImageSetAPI" - } - } - }, - "description": "OK" - }, - "400": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/errors.BadRequest" - } - } - }, - "description": "The request sent couldn't be processed." - }, - "404": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/errors.NotFound" - } - } - }, - "description": "image-set was not found." - }, - "500": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/errors.InternalServerError" - } - } - }, - "description": "There was an internal server error." - } - }, - "summary": "Delete Image Set", - "tags": [ - "Image-Sets" - ] - } - }, - "/image-sets/{imageSetID}/": { - "get": { - "description": "Get image set by ID", - "operationId": "GetImageSetsByID", - "parameters": [ - { - "description": "Image Set ID", - "in": "path", - "name": "imageSetID", - "required": true, - "schema": { - "type": "integer" - } - }, - { - "description": "Define sort fields: created_at, updated_at, name. To sort DESC use -", - "in": "query", - "name": "sort_by", - "schema": { - "type": "string" - } - }, - { - "description": "field: filter by name", - "in": "query", - "name": "name", - "schema": { - "type": "string" - } - }, - { - "description": "field: filter by status", - "in": "query", - "name": "status", - "schema": { - "type": "string" - } - }, - { - "description": "field: filter by version", - "in": "query", - "name": "version", - "schema": { - "type": "string" - } - }, - { - "description": "field: return number of image-set view until limit is reached. Default is 100.", - "in": "query", - "name": "limit", - "schema": { - "type": "integer" - } - }, - { - "description": "field: return number of image-set view beginning at the offset.", - "in": "query", - "name": "offset", - "schema": { - "type": "integer" - } - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/models.ImageSetDetailsResponseAPI" - } - } - }, - "description": "OK" - }, - "400": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/errors.BadRequest" - } - } - }, - "description": "The request sent couldn't be processed." - }, - "404": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/errors.NotFound" - } - } - }, - "description": "image-set was not found." - }, - "500": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/errors.InternalServerError" - } - } - }, - "description": "There was an internal server error." - } - }, - "summary": "Get an image-set", - "tags": [ - "Image-Sets" - ] - } - }, - "/image-sets/{imageSetID}/devices": { - "get": { - "description": "Return device ids for an image set.", - "operationId": "GetImageSetsDevicesByID", - "parameters": [ - { - "description": "Identifier of the ImageSet", - "in": "path", - "name": "ImageSetId", - "required": true, - "schema": { - "type": "integer" - } - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/models.ImageSetDevicesAPI" - } - } - }, - "description": "OK" - }, - "400": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/errors.BadRequest" - } - } - }, - "description": "The request sent couldn't be processed." - }, - "404": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/errors.NotFound" - } - } - }, - "description": "The Image Set ID was not found." - }, - "500": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/errors.InternalServerError" - } - } - }, - "description": "There was an internal server error." - } - }, - "summary": "Return device ids for an image set.", - "tags": [ - "Image-Sets" - ] - } - }, - "/images": { - "get": { - "description": "This is a placeholder description", - "operationId": "GetAllImages", - "parameters": [ - { - "description": "Return number of images until limit is reached.", - "in": "query", - "name": "limit", - "schema": { - "type": "integer" - } - }, - { - "description": "Return number of images beginning at the offset", - "in": "query", - "name": "offset", - "schema": { - "type": "integer" - } - }, - { - "description": "created_at, distribution, name,status. To sort DESC use -before the fields", - "in": "query", - "name": "sort_by", - "schema": { - "type": "string" - } - }, - { - "description": "Filter by name.", - "in": "query", - "name": "name", - "schema": { - "type": "string" - } - }, - { - "description": "Filter by status.", - "in": "query", - "name": "status", - "schema": { - "type": "string" - } - }, - { - "description": "Filter by distribution.", - "in": "query", - "name": "distribution", - "schema": { - "type": "string" - } - }, - { - "description": "Filter by creation date.", - "in": "query", - "name": "created_at", - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/models.SuccessPlaceholderResponse" - } - } - }, - "description": "OK" - }, - "400": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/errors.BadRequest" - } - } - }, - "description": " The request sent couldn't be processed." - }, - "500": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/errors.InternalServerError" - } - } - }, - "description": "There was an internal server error." - } - }, - "summary": "Placeholder summary", - "tags": [ - "Images" - ] - }, - "post": { - "description": "Create an ostree commit and/or installer ISO", - "operationId": "createImage", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CreateImage" - } - } - }, - "description": "request body", - "required": true, - "x-originalParamName": "body" - }, - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ImageResponse" - } - } - }, - "description": "OK" - }, - "400": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/errors.BadRequest" - } - } - }, - "description": "The request sent couldn't be processed." - }, - "500": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/errors.InternalServerError" - } - } - }, - "description": "There was an internal server error." - } - }, - "summary": "Create an image", - "tags": [ - "Images" - ] - } - }, - "/images/checkImageName": { - "post": { - "description": "Create an updated ostree commit", - "operationId": "CheckImageName", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CreateImage" - } - } - }, - "description": "request body", - "required": true, - "x-originalParamName": "body" - }, - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/models.SuccessPlaceholderResponse" - } - } - }, - "description": "OK" - }, - "400": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/errors.BadRequest" - } - } - }, - "description": "The request sent couldn't be processed." - }, - "500": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/errors.InternalServerError" - } - } - }, - "description": "There was an internal server error." - } - }, - "summary": "Update an image", - "tags": [ - "Images" - ] - } - }, - "/images/{imageId}": { - "delete": { - "description": "This is a placeholder description", - "operationId": "DeleteImage", - "parameters": [ - { - "description": "Identifier of the ImageSet", - "in": "path", - "name": "imageSetID", - "required": true, - "schema": { - "type": "integer" - } - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/models.SuccessPlaceholderResponse" - } - } - }, - "description": "OK" - }, - "400": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/errors.BadRequest" - } - } - }, - "description": "The request sent couldn't be processed." - }, - "500": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/errors.InternalServerError" - } - } - }, - "description": "There was an internal server error." - } - }, - "summary": "Placeholder summary", - "tags": [ - "Images" - ] - }, - "get": { - "description": "This is a placeholder description", - "operationId": "GetImageByID", - "parameters": [ - { - "description": "Image ID", - "in": "path", - "name": "imageId", - "required": true, - "schema": { - "type": "integer" - } - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/models.SuccessPlaceholderResponse" - } - } - }, - "description": "OK" - }, - "400": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/errors.BadRequest" - } - } - }, - "description": "The request sent couldn't be processed." - }, - "500": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/errors.InternalServerError" - } - } - }, - "description": "There was an internal server error." - } - }, - "summary": "Placeholder summary", - "tags": [ - "Images" - ] - } - }, - "/images/{imageId}/details": { - "get": { - "description": "This is a placeholder description", - "operationId": "GetImageDetailsByID", - "parameters": [ - { - "description": "Image ID", - "in": "path", - "name": "imageId", - "required": true, - "schema": { - "type": "integer" - } - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/models.SuccessPlaceholderResponse" - } - } - }, - "description": "OK" - }, - "400": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/errors.BadRequest" - } - } - }, - "description": "The request sent couldn't be processed." - }, - "500": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/errors.InternalServerError" - } - } - }, - "description": "There was an internal server error." - } - }, - "summary": "Placeholder summary", - "tags": [ - "Images" - ] - } - }, - "/images/{imageId}/installer": { - "post": { - "description": "This is a placeholder description", - "operationId": "CreateInstallerForImage", - "parameters": [ - { - "description": "Image ID", - "in": "path", - "name": "imageId", - "required": true, - "schema": { - "type": "integer" - } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CreateImage" - } - } - }, - "description": "request body", - "required": true, - "x-originalParamName": "body" - }, - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/models.SuccessPlaceholderResponse" - } - } - }, - "description": "OK" - }, - "400": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/errors.BadRequest" - } - } - }, - "description": "The request sent couldn't be processed." - }, - "500": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/errors.InternalServerError" - } - } - }, - "description": "There was an internal server error." - } - }, - "summary": "Placeholder summary", - "tags": [ - "Images" - ] - } - }, - "/images/{imageId}/kickstart": { - "post": { - "description": "This is a placeholder description", - "operationId": "CreateKickStartForImage", - "parameters": [ - { - "description": "Image ID", - "in": "path", - "name": "imageId", - "required": true, - "schema": { - "type": "integer" - } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CreateImage" - } - } - }, - "description": "request body", - "required": true, - "x-originalParamName": "body" - }, - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/models.SuccessPlaceholderResponse" - } - } - }, - "description": "OK" - }, - "400": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/errors.BadRequest" - } - } - }, - "description": "The request sent couldn't be processed." - }, - "500": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/errors.InternalServerError" - } - } - }, - "description": "There was an internal server error." - } - }, - "summary": "Placeholder summary", - "tags": [ - "Images" - ] - } - }, - "/images/{imageId}/metadata": { - "get": { - "description": "This is a placeholder description", - "operationId": "GetMetadataForImage", - "parameters": [ - { - "description": "Image ID", - "in": "path", - "name": "imageId", - "required": true, - "schema": { - "type": "integer" - } - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/models.SuccessPlaceholderResponse" - } - } - }, - "description": "OK" - }, - "400": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/errors.BadRequest" - } - } - }, - "description": "The request sent couldn't be processed." - }, - "500": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/errors.InternalServerError" - } - } - }, - "description": "There was an internal server error." - } - }, - "summary": "Placeholder summary", - "tags": [ - "Images" - ] - } - }, - "/images/{imageId}/repo": { - "get": { - "description": "This is a placeholder description", - "operationId": "GetRepoForImage", - "parameters": [ - { - "description": "Image ID", - "in": "path", - "name": "imageId", - "required": true, - "schema": { - "type": "integer" - } - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/models.SuccessPlaceholderResponse" - } - } - }, - "description": "OK" - }, - "400": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/errors.BadRequest" - } - } - }, - "description": "The request sent couldn't be processed." - }, - "500": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/errors.InternalServerError" - } - } - }, - "description": "There was an internal server error." - } - }, - "summary": "Placeholder summary", - "tags": [ - "Images" - ] - } - }, - "/images/{imageId}/retry": { - "post": { - "description": "Create an updated ostree commit", - "operationId": "RetryCreateImage", - "parameters": [ - { - "description": "Image ID", - "in": "path", - "name": "imageId", - "required": true, - "schema": { - "type": "integer" - } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CreateImage" - } - } - }, - "description": "request body", - "required": true, - "x-originalParamName": "body" - }, - "responses": { - "201": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/models.SuccessPlaceholderResponse" - } - } - }, - "description": "Retry is being processed" - }, - "500": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/errors.InternalServerError" - } - } - }, - "description": "There was an internal server error." - } - }, - "summary": "Retries building an image from scratch", - "tags": [ - "Images" - ] - } - }, - "/images/{imageId}/status": { - "get": { - "description": "This is a placeholder description", - "operationId": "GetImageStatusByID", - "parameters": [ - { - "description": "Image Identifier", - "in": "path", - "name": "imageId", - "required": true, - "schema": { - "type": "integer" - } - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/models.SuccessPlaceholderResponse" - } - } - }, - "description": "OK" - }, - "400": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/errors.BadRequest" - } - } - }, - "description": "The request sent couldn't be processed." - }, - "500": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/errors.InternalServerError" - } - } - }, - "description": "There was an internal server error." - } - }, - "summary": "Placeholder summary", - "tags": [ - "Images" - ] - } - }, - "/images/{imageId}/update": { - "post": { - "description": "Create an updated ostree commit", - "operationId": "CreateImageUpdate", - "parameters": [ - { - "description": "Image ID", - "in": "path", - "name": "imageId", - "required": true, - "schema": { - "type": "integer" - } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CreateImage" - } - } - }, - "description": "request body", - "required": true, - "x-originalParamName": "body" - }, - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/models.SuccessPlaceholderResponse" - } - } - }, - "description": "OK" - }, - "400": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/errors.BadRequest" - } - } - }, - "description": "The request sent couldn't be processed." - }, - "500": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/errors.InternalServerError" - } - } - }, - "description": "There was an internal server error." - } - }, - "summary": "Update an image", - "tags": [ - "Images" - ] - } - }, - "/images/{ostreeCommitHash}/info": { - "get": { - "description": "This is a placeholder description", - "operationId": "GetImageByOstree", - "parameters": [ - { - "description": "Ostree Commit Hash", - "in": "path", - "name": "ostreeCommitHash", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/models.SuccessPlaceholderResponse" - } - } - }, - "description": "OK" - }, - "400": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/errors.BadRequest" - } - } - }, - "description": "The request sent couldn't be processed." - }, - "500": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/errors.InternalServerError" - } - } - }, - "description": "There was an internal server error." - } - }, - "summary": "Placeholder summary", - "tags": [ - "Images" - ] - } - }, - "/storage/images-repos/{imageID}/content/{repoFilePath}": { - "get": { - "description": "Redirect request to a signed and valid url for an image commit repository from the path content", - "operationId": "RedirectSignedImageCommitRepository", - "parameters": [ - { - "description": "Id to identify Image", - "in": "path", - "name": "imageID", - "required": true, - "schema": { - "type": "string" - } - }, - { - "description": "path to file repository", - "in": "path", - "name": "repoFilePath", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "303": { - "content": { - "application/json": { - "schema": { - "type": "string" - } - } - }, - "description": "See Other" - }, - "400": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/errors.BadRequest" - } - } - }, - "description": "Bad Request" - }, - "404": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/errors.NotFound" - } - } - }, - "description": "Not Found" - }, - "500": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/errors.InternalServerError" - } - } - }, - "description": "Internal Server Error" - } - }, - "summary": "redirect to a signed url of an image commit repository path content", - "tags": [ - "Storage" - ] - } - }, - "/storage/images-repos/{imageID}/{repoFilePath}": { - "get": { - "description": "Bring the content for a image commit in a repository path", - "operationId": "ContentImageCommitRepositoryPath", - "parameters": [ - { - "description": "Id to identify Image", - "in": "path", - "name": "imageID", - "required": true, - "schema": { - "type": "string" - } - }, - { - "description": "path to file repository", - "in": "path", - "name": "repoFilePath", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "content": { - "application/octet-stream": { - "schema": { - "type": "string" - } - } - }, - "description": "Stream object from file content" - }, - "400": { - "content": { - "application/octet-stream": { - "schema": { - "$ref": "#/components/schemas/errors.BadRequest" - } - } - }, - "description": "Bad Request" - }, - "404": { - "content": { - "application/octet-stream": { - "schema": { - "$ref": "#/components/schemas/errors.NotFound" - } - } - }, - "description": "Not Found" - }, - "500": { - "content": { - "application/octet-stream": { - "schema": { - "$ref": "#/components/schemas/errors.InternalServerError" - } - } - }, - "description": "Internal Server Error" - } - }, - "summary": "return the content of an image commit repository path", - "tags": [ - "Storage" - ] - } - }, - "/storage/isos/{installerID}/": { - "get": { - "description": "This method will redirect request to a signed installer iso url", - "operationId": "RedirectSignedInstaller", - "parameters": [ - { - "description": "Installer ID", - "in": "path", - "name": "installerID", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "303": { - "content": { - "application/octet-stream": { - "schema": { - "type": "string" - } - } - }, - "description": "URL to redirect" - }, - "400": { - "content": { - "application/octet-stream": { - "schema": { - "$ref": "#/components/schemas/errors.BadRequest" - } - } - }, - "description": "The request send couln't be processed." - }, - "404": { - "content": { - "application/octet-stream": { - "schema": { - "$ref": "#/components/schemas/errors.NotFound" - } - } - }, - "description": "installer not found." - }, - "500": { - "content": { - "application/octet-stream": { - "schema": { - "$ref": "#/components/schemas/errors.InternalServerError" - } - } - }, - "description": "Internal Server Error" - } - }, - "summary": "Redirect to a signed installer", - "tags": [ - "Storage" - ] - } - }, - "/storage/update-repos/{updateTransactionID}/content/{repoFilePath}": { - "get": { - "description": "Method will redirect to asigned url of an update-transaction based on repository content", - "operationId": "RedirectUpdateTransactionRepositoryPath", - "parameters": [ - { - "description": "id for update transaction id", - "in": "path", - "name": "updateTransactionID", - "required": true, - "schema": { - "type": "integer" - } - }, - { - "description": "path to repository to be checked", - "in": "path", - "name": "repoFilePath", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "303": { - "content": { - "application/octet-stream": { - "schema": { - "type": "string" - } - } - }, - "description": "URL signed to be redirect" - }, - "400": { - "content": { - "application/octet-stream": { - "schema": { - "$ref": "#/components/schemas/errors.BadRequest" - } - } - }, - "description": "Bad Request" - }, - "404": { - "content": { - "application/octet-stream": { - "schema": { - "$ref": "#/components/schemas/errors.NotFound" - } - } - }, - "description": "Not Found" - }, - "500": { - "content": { - "application/octet-stream": { - "schema": { - "$ref": "#/components/schemas/errors.InternalServerError" - } - } - }, - "description": "Internal Server Error" - } - }, - "summary": "redirect to a signed url of an update-transaction repository path content", - "tags": [ - "Storage" - ] - } - }, - "/storage/update-repos/{updateTransactionID}/{repoFilePath}": { - "get": { - "description": "Request will get access to content of an update-transaction file based on the path", - "operationId": "RedirectUpdateTransactionRepositoryContent", - "parameters": [ - { - "description": "Update Transaction Id", - "in": "path", - "name": "updateTransactionID", - "required": true, - "schema": { - "type": "integer" - } - }, - { - "description": "path for repository file", - "in": "path", - "name": "repoFilePath", - "required": true, - "schema": { - "type": "integer" - } - } - ], - "responses": { - "200": { - "content": { - "application/octet-stream": { - "schema": { - "type": "string" - } - } - }, - "description": "Stream object from file content" - }, - "400": { - "content": { - "application/octet-stream": { - "schema": { - "$ref": "#/components/schemas/errors.BadRequest" - } - } - }, - "description": "Bad Request" - }, - "404": { - "content": { - "application/octet-stream": { - "schema": { - "$ref": "#/components/schemas/errors.NotFound" - } - } - }, - "description": "Not Found" - }, - "500": { - "content": { - "application/octet-stream": { - "schema": { - "$ref": "#/components/schemas/errors.InternalServerError" - } - } - }, - "description": "Internal Server Error" - } - }, - "summary": "Return the content od an update-transaction repository path", - "tags": [ - "Storage" - ] - } - }, - "/thirdpartyrepo": { - "get": { - "description": "Lists all Third Party Repository for an account.", - "operationId": "GetAllThirdPartyRepo", - "parameters": [ - { - "description": "fields: created_at, name, updated_at. To sort DESC use - before the fields.", - "in": "query", - "name": "sort_by", - "schema": { - "type": "string" - } - }, - { - "description": "field: filter by name", - "in": "query", - "name": "name", - "schema": { - "type": "string" - } - }, - { - "description": "field: filter by creation date", - "in": "query", - "name": "created_at", - "schema": { - "type": "string" - } - }, - { - "description": "field: filter by update date", - "in": "query", - "name": "updated_at", - "schema": { - "type": "string" - } - }, - { - "description": "field: return number of repositories until limit is reached.", - "in": "query", - "name": "limit", - "schema": { - "type": "integer" - } - }, - { - "description": "field: return number of repositories beginning at the offset.", - "in": "query", - "name": "offset", - "schema": { - "type": "integer" - } - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ThirdPartyRepoList" - } - } - }, - "description": "The list of third party repositories response" - }, - "400": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/errors.BadRequest" - } - } - }, - "description": "The request sent couldn't be processed." - }, - "500": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/errors.InternalServerError" - } - } - }, - "description": "There was an internal server error." - } - }, - "summary": "Lists all Third Party Repository for an account.", - "tags": [ - "Third Party Repo" - ] - }, - "post": { - "description": "Create Third Party Repository for an account.", - "operationId": "CreateThirdPartyRepo", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ThirdPartyRepo" - } - } - }, - "description": "the third party repository to create", - "required": true, - "x-originalParamName": "body" - }, - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ThirdPartyRepo" - } - } - }, - "description": "The created third party repository" - }, - "400": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/errors.BadRequest" - } - } - }, - "description": "The request sent couldn't be processed." - }, - "500": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/errors.InternalServerError" - } - } - }, - "description": "There was an internal server error." - } - }, - "summary": "Create Third Party Repository for an account.", - "tags": [ - "Third Party Repo" - ] - } - }, - "/thirdpartyrepo/checkName/{name}": { - "get": { - "description": "Checks to see if a ThirdParty repo Name exists.", - "operationId": "CheckThirdPartyRepoName", - "parameters": [ - { - "description": "ThirdParty repo Name", - "in": "path", - "name": "name", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CheckThirdPartyRepoName" - } - } - }, - "description": "The third party repository name check result" - }, - "400": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/errors.BadRequest" - } - } - }, - "description": "The request sent couldn't be processed." - }, - "500": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/errors.InternalServerError" - } - } - }, - "description": "There was an internal server error." - } - }, - "summary": "Checks to see if a ThirdParty repo Name exists.", - "tags": [ - "Third Party Repo" - ] - } - }, - "/thirdpartyrepo/{ID}": { - "delete": { - "description": "Delete third party repository using id.", - "operationId": "DeleteThirdPartyRepoByID", - "parameters": [ - { - "description": "An unique existing third party repository id.", - "in": "query", - "name": "ID", - "required": true, - "schema": { - "type": "integer" - } - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ThirdPartyRepo" - } - } - }, - "description": "The deleted third party repository." - }, - "400": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/errors.BadRequest" - } - } - }, - "description": "The request sent couldn't be processed." - }, - "404": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/errors.NotFound" - } - } - }, - "description": "The third party repository was not found." - }, - "500": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/errors.InternalServerError" - } - } - }, - "description": "There was an internal server error." - } - }, - "summary": "Delete third party repository using id.", - "tags": [ - "Third Party Repo" - ] - }, - "get": { - "description": "Get third party repository by id.", - "operationId": "GetThirdPartyRepoByID", - "parameters": [ - { - "description": "An unique existing third party repository id.", - "in": "query", - "name": "ID", - "required": true, - "schema": { - "type": "integer" - } - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ThirdPartyRepo" - } - } - }, - "description": "The requested third party repository." - }, - "400": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/errors.BadRequest" - } - } - }, - "description": "The request sent couldn't be processed." - }, - "404": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/errors.NotFound" - } - } - }, - "description": "The third party repository was not found." - }, - "500": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/errors.InternalServerError" - } - } - }, - "description": "There was an internal server error." - } - }, - "summary": "Get third party repository by id.", - "tags": [ - "Third Party Repo" - ] - }, - "put": { - "description": "Creates an Update for third party repository", - "operationId": "CreateThirdPartyRepoUpdate", - "parameters": [ - { - "description": "An unique existing third party repository id.", - "in": "query", - "name": "ID", - "required": true, - "schema": { - "type": "integer" - } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ThirdPartyRepo" - } - } - }, - "description": "The third party repository update data", - "required": true, - "x-originalParamName": "body" - }, - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ThirdPartyRepo" - } - } - }, - "description": "The updated third party repository." - }, - "400": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/errors.BadRequest" - } - } - }, - "description": "The request sent couldn't be processed." - }, - "404": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/errors.NotFound" - } - } - }, - "description": "The third party repository was not found." - }, - "500": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/errors.InternalServerError" - } - } - }, - "description": "There was an internal server error." - } - }, - "summary": "Creates an Update for third party repository", - "tags": [ - "Third Party Repo" - ] - } - }, - "/updates": { - "get": { - "description": "Gets all device updates", - "operationId": "ListUpdates", - "parameters": [ - { - "description": "field: return number of updates until limit is reached. Default is 30.", - "in": "query", - "name": "limit", - "schema": { - "type": "integer" - } - }, - { - "description": "field: return updates beginning at the given offset.", - "in": "query", - "name": "offset", - "schema": { - "type": "integer" - } - }, - { - "description": "fields: created_at, updated_at. To sort DESC use - before the fields.", - "in": "query", - "name": "sort_by", - "schema": { - "type": "string" - } - }, - { - "description": "field: filter by status", - "in": "query", - "name": "status", - "schema": { - "type": "string" - } - }, - { - "description": "field: filter by creation date", - "in": "query", - "name": "created_at", - "schema": { - "type": "string" - } - }, - { - "description": "field: filter by update date", - "in": "query", - "name": "updated_at", - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "items": { - "$ref": "#/components/schemas/Update" - }, - "type": "array" - } - } - }, - "description": "List of devices updates" - }, - "400": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/errors.BadRequest" - } - } - }, - "description": "The request sent couldn't be processed." - }, - "500": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/errors.InternalServerError" - } - } - }, - "description": "There was an internal server error." - } - }, - "summary": "Gets all device updates", - "tags": [ - "Updates (Systems)" - ] - }, - "post": { - "description": "Executes a device update", - "operationId": "UpdateDevice", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/DevicesUpdate" - } - } - }, - "description": "devices uuids to update and optional target commit id", - "required": true, - "x-originalParamName": "body" - }, - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Update" - } - } - }, - "description": "The created device update" - }, - "400": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/errors.BadRequest" - } - } - }, - "description": "The request sent couldn't be processed" - }, - "500": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/errors.InternalServerError" - } - } - }, - "description": "There was an internal server error" - } - }, - "summary": "Executes a device update", - "tags": [ - "Updates (Systems)" - ] - } - }, - "/updates/device/{DeviceUUID}/updates": { - "get": { - "description": "Return list of available updates for a device.", - "operationId": "GetUpdateAvailableForDevice", - "parameters": [ - { - "description": "DeviceUUID", - "in": "path", - "name": "DeviceUUID", - "required": true, - "schema": { - "type": "string" - } - }, - { - "description": "query the latest or all updates", - "in": "query", - "name": "latest", - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/models.Image" - } - } - }, - "description": "OK" - }, - "400": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/errors.BadRequest" - } - } - }, - "description": "The request sent couldn't be processed." - }, - "500": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/errors.InternalServerError" - } - } - }, - "description": "There was an internal server error." - } - }, - "summary": "Return list of available updates for a device.", - "tags": [ - "Devices (Systems)" - ] - } - }, - "/updates/validate": { - "post": { - "description": "Validate if the images selection could be updated", - "operationId": "PostValidateUpdate", - "requestBody": { - "content": { - "application/json": { - "schema": { - "items": { - "$ref": "#/components/schemas/ImageValidationRequest" + "components": { + "schemas": { + "CheckThirdPartyRepoName": { + "properties": { + "data": { + "allOf": [ + { + "$ref": "#/components/schemas/CheckThirdPartyRepoNameData" + } + ], + "description": "The data of third party repository check name result" + } }, - "type": "array" - } + "type": "object" + }, + "CheckThirdPartyRepoNameData": { + "properties": { + "isValid": { + "description": "The indicator of third party repository name validity", + "example": false, + "type": "boolean" + } + }, + "type": "object" + }, + "Commit": { + "properties": { + "arch": { + "description": "The commit architecture", + "example": "x86_64", + "type": "string" + } + }, + "type": "object" + }, + "CustomPackages": { + "properties": { + "name": { + "description": "Name of custom packages", + "example": "cat", + "type": "string" + } + }, + "type": "object" + }, + "DeviceNotification": { + "properties": { + "application": { + "description": "application name", + "example": "edge-management", + "type": "string" + }, + "bundle": { + "description": "bundle name", + "example": "rhel", + "type": "string" + }, + "context": { + "description": "notification context payload data", + "example": "{\"CommitID\":\"31581\",\"UpdateID\":\"34916\"}", + "type": "string" + }, + "event_type": { + "description": "event type", + "example": "update-devices", + "type": "string" + }, + "events": { + "description": "notification events", + "items": { + "$ref": "#/components/schemas/EventNotification" + }, + "type": "array" + }, + "org_id": { + "description": "notification organization id", + "example": "11111111", + "type": "string" + }, + "recipients": { + "description": "notification recipients", + "items": { + "$ref": "#/components/schemas/RecipientNotification" + }, + "type": "array" + }, + "timestamp": { + "description": "notification timestamp", + "example": "2023-07-06T11:15:04Z", + "type": "string" + }, + "version": { + "description": "notification version", + "example": "v1.1.0", + "type": "string" + } + }, + "type": "object" + }, + "DevicesUpdate": { + "properties": { + "CommitID": { + "description": "Optional: The unique ID of the target commit", + "example": 1026, + "type": "integer" + }, + "DevicesUUID": { + "description": "List of devices uuids to update", + "example": [ + "b579a578-1a6f-48d5-8a45-21f2a656a5d4", + "1abb288d-6d88-4e2d-bdeb-fcc536be58ec" + ], + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "EventNotification": { + "properties": { + "payload": { + "description": "notification event payload", + "example": "{\"ID\":\"\"}", + "type": "string" + } + }, + "type": "object" + }, + "ImageResponse": { + "properties": { + "Account": { + "type": "string" + }, + "Commit": { + "$ref": "#/components/schemas/models.Commit" + }, + "CommitID": { + "type": "integer" + }, + "CreatedAt": { + "$ref": "#/components/schemas/models.EdgeAPITime" + }, + "CustomPackages": { + "items": { + "$ref": "#/components/schemas/models.Package" + }, + "type": "array" + }, + "DeletedAt": { + "$ref": "#/components/schemas/gorm.DeletedAt" + }, + "Description": { + "type": "string" + }, + "Distribution": { + "type": "string" + }, + "ID": { + "type": "integer" + }, + "ImageSetID": { + "description": "TODO: Wipe staging database and set to not nullable", + "type": "integer" + }, + "ImageType": { + "description": "TODO: Remove as soon as the frontend stops using", + "type": "string" + }, + "Installer": { + "$ref": "#/components/schemas/models.Installer" + }, + "InstallerID": { + "type": "integer" + }, + "Name": { + "type": "string" + }, + "OutputTypes": { + "items": { + "type": "string" + }, + "type": "array" + }, + "Packages": { + "items": { + "$ref": "#/components/schemas/models.Package" + }, + "type": "array" + }, + "Status": { + "type": "string" + }, + "SystemsRunning": { + "description": "only for forms", + "type": "integer" + }, + "ThirdPartyRepositories": { + "items": { + "$ref": "#/components/schemas/models.ThirdPartyRepo" + }, + "type": "array" + }, + "TotalPackages": { + "description": "only for forms", + "type": "integer" + }, + "UpdatedAt": { + "$ref": "#/components/schemas/models.EdgeAPITime" + }, + "Version": { + "type": "integer" + }, + "activationKey": { + "type": "string" + }, + "org_id": { + "type": "string" + }, + "request_id": { + "description": "storing for logging reference on resume", + "type": "string" + } + }, + "type": "object" + }, + "ImageValidationRequest": { + "properties": { + "ID": { + "description": "the unique ID of the image", + "example": 1029, + "type": "integer" + } + }, + "type": "object" + }, + "ImageValidationResponse": { + "properties": { + "UpdateValid": { + "example": true, + "type": "boolean" + } + }, + "type": "object" + }, + "RecipientNotification": { + "properties": { + "ignore_user_preferences": { + "description": "notification recipient to ignore user preferences", + "example": false, + "type": "boolean" + }, + "only_admins": { + "description": "notification recipient for only admins", + "example": false, + "type": "boolean" + }, + "users": { + "description": "notification recipient users", + "example": [ + "user-id" + ], + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "ThirdPartyRepo": { + "properties": { + "Description": { + "description": "The description of the third party repository", + "example": "a repo for some utilities", + "type": "string" + }, + "ID": { + "description": "The unique ID of the third party repository", + "example": 1028, + "type": "integer" + }, + "Name": { + "description": "The name of the third party repository", + "example": "my_custom_repo", + "type": "string" + }, + "URL": { + "description": "The URL of the third party repository", + "example": "https://public.example.com/my_custom_repo", + "type": "string" + } + }, + "type": "object" + }, + "ThirdPartyRepoList": { + "properties": { + "count": { + "description": "The overall count of the stored third party repositories", + "example": 25, + "type": "integer" + }, + "data": { + "description": "The data list of the third party repositories", + "items": { + "$ref": "#/components/schemas/ThirdPartyRepo" + }, + "type": "array" + } + }, + "type": "object" + }, + "Update": { + "properties": { + "ChangesRefs": { + "description": "Whether this update is changing device ostree ref", + "example": false, + "type": "boolean" + }, + "Commit": { + "allOf": [ + { + "$ref": "#/components/schemas/models.UpdateCommitAPI" + } + ], + "description": "The device Update target commit" + }, + "Devices": { + "description": "The current devices to update", + "items": { + "$ref": "#/components/schemas/UpdateDevice" + }, + "type": "array" + }, + "DispatchRecords": { + "description": "The current update dispatcher records", + "items": { + "$ref": "#/components/schemas/UpdateDispatchRecord" + }, + "type": "array" + }, + "ID": { + "description": "The unique ID of device update", + "example": 1026, + "type": "integer" + }, + "OldCommits": { + "description": "The device alternate commits from current device commit to target commit", + "items": { + "$ref": "#/components/schemas/models.UpdateCommitAPI" + }, + "type": "array" + }, + "Repo": { + "allOf": [ + { + "$ref": "#/components/schemas/UpdateRepo" + } + ], + "description": "The current repository built from this update" + }, + "Status": { + "description": "the current devices update status", + "example": "BUILDING", + "type": "string" + } + }, + "type": "object" + }, + "UpdateDevice": { + "properties": { + "Connected": { + "description": "Is the device connected", + "example": true, + "type": "boolean" + }, + "CurrentHash": { + "description": "the current device loaded commit hash", + "example": "0bd8dfe9856aa5bb1683e85f123bfe7785d45fbdb6f10372ff2c80e703400446", + "type": "string" + }, + "ID": { + "description": "The unique ID of the device", + "example": 1096, + "type": "integer" + }, + "ImageID": { + "description": "The current related image ID", + "example": 10778, + "type": "integer" + }, + "Name": { + "description": "the device inventory name", + "example": "teat-host.example.com", + "type": "string" + }, + "RHCClientID": { + "description": "The device RHC client ID", + "example": "5f9ac7d3-2264-4dad-a5a0-39c91c071c8a", + "type": "string" + }, + "UUID": { + "description": "The device inventory uuid", + "example": "54880418-b7c2-402e-93e5-287e168de7a6", + "type": "string" + }, + "UpdateAvailable": { + "description": "Whether an update is available", + "example": true, + "type": "boolean" + } + }, + "type": "object" + }, + "UpdateDispatchRecord": { + "properties": { + "DeviceID": { + "description": "The unique ID of the device being updated", + "example": 12789, + "type": "integer" + }, + "ID": { + "description": "The unique ID of the DispatcherRecord", + "example": 1089, + "type": "integer" + }, + "PlaybookDispatcherID": { + "description": "The playbook dispatcher job id", + "example": "c84cfd11-745c-4ee3-b87d-057a96732415", + "type": "string" + }, + "PlaybookURL": { + "description": "The generated playbook url", + "example": "https://console.redhat.com/api/edge/v1/updates/1026/update-playbook.yml", + "type": "string" + }, + "Reason": { + "description": "In case of failure the error reason returned by the playbook-dispatcher service", + "example": "", + "type": "string" + }, + "Status": { + "description": "The status of device update", + "example": "BUILDING", + "type": "string" + } + }, + "type": "object" + }, + "UpdateRepo": { + "properties": { + "ID": { + "description": "The unique ID of the update repository", + "example": 53218, + "type": "integer" + }, + "RepoStatus": { + "description": "The status of the device update repository building", + "example": "SUCCESS", + "type": "string" + }, + "RepoURL": { + "description": "The url of the update ostree repository", + "example": "https://storage-host.example.com/53218/upd/53218/repo", + "type": "string" + } + }, + "type": "object" + }, + "errors.BadRequest": { + "properties": { + "Code": { + "type": "string" + }, + "Status": { + "type": "integer" + }, + "Title": { + "type": "string" + } + }, + "type": "object" + }, + "errors.InternalServerError": { + "properties": { + "Code": { + "type": "string" + }, + "Status": { + "type": "integer" + }, + "Title": { + "type": "string" + } + }, + "type": "object" + }, + "errors.NotFound": { + "properties": { + "Code": { + "type": "string" + }, + "Status": { + "type": "integer" + }, + "Title": { + "type": "string" + } + }, + "type": "object" + }, + "gorm.DeletedAt": { + "properties": { + "time": { + "type": "string" + }, + "valid": { + "description": "Valid is true if Time is not NULL", + "type": "boolean" + } + }, + "type": "object" + }, + "models.CheckGroupNameParamAPI": { + "properties": { + "Name": { + "description": "device group name", + "example": "my-device-group", + "type": "string" + } + }, + "type": "object" + }, + "models.Commit": { + "properties": { + "Account": { + "type": "string" + }, + "Arch": { + "type": "string" + }, + "BlueprintToml": { + "type": "string" + }, + "BuildDate": { + "type": "string" + }, + "BuildNumber": { + "type": "integer" + }, + "ChangesRefs": { + "type": "boolean" + }, + "ComposeJobID": { + "type": "string" + }, + "CreatedAt": { + "$ref": "#/components/schemas/models.EdgeAPITime" + }, + "DeletedAt": { + "$ref": "#/components/schemas/gorm.DeletedAt" + }, + "ID": { + "type": "integer" + }, + "ImageBuildHash": { + "type": "string" + }, + "ImageBuildParentHash": { + "type": "string" + }, + "ImageBuildTarURL": { + "type": "string" + }, + "InstalledPackages": { + "items": { + "$ref": "#/components/schemas/models.InstalledPackage" + }, + "type": "array" + }, + "OSTreeCommit": { + "type": "string" + }, + "OSTreeParentCommit": { + "type": "string" + }, + "OSTreeParentRef": { + "type": "string" + }, + "OSTreeRef": { + "type": "string" + }, + "Repo": { + "$ref": "#/components/schemas/models.Repo" + }, + "RepoID": { + "type": "integer" + }, + "Status": { + "type": "string" + }, + "UpdatedAt": { + "$ref": "#/components/schemas/models.EdgeAPITime" + }, + "external": { + "type": "boolean" + }, + "name": { + "type": "string" + }, + "org_id": { + "type": "string" + } + }, + "type": "object" + }, + "models.CreateDeviceGroupAPI": { + "properties": { + "DevicesAPI": { + "description": "Devices of group", + "items": { + "$ref": "#/components/schemas/models.DeviceForDeviceGroupAPI" + }, + "type": "array" + }, + "name": { + "description": "the device group name", + "example": "my-device-group", + "type": "string" + }, + "type": { + "description": "the device group type", + "example": "static", + "type": "string" + } + }, + "type": "object" + }, + "models.CreateImageAPI": { + "type": "object" + }, + "models.Device": { + "properties": { + "Account": { + "type": "string" + }, + "AvailableHash": { + "type": "string" + }, + "Connected": { + "type": "boolean" + }, + "CreatedAt": { + "$ref": "#/components/schemas/models.EdgeAPITime" + }, + "CurrentHash": { + "type": "string" + }, + "DeletedAt": { + "$ref": "#/components/schemas/gorm.DeletedAt" + }, + "DevicesGroups": { + "items": { + "$ref": "#/components/schemas/models.DeviceGroup" + }, + "type": "array" + }, + "ID": { + "type": "integer" + }, + "ImageID": { + "type": "integer" + }, + "LastSeen": { + "$ref": "#/components/schemas/models.EdgeAPITime" + }, + "Name": { + "type": "string" + }, + "RHCClientID": { + "type": "string" + }, + "UUID": { + "type": "string" + }, + "UpdateAvailable": { + "type": "boolean" + }, + "UpdateTransaction": { + "items": { + "$ref": "#/components/schemas/models.UpdateTransaction" + }, + "type": "array" + }, + "UpdatedAt": { + "$ref": "#/components/schemas/models.EdgeAPITime" + }, + "group_name": { + "description": "the inventory group name", + "type": "string" + }, + "group_uuid": { + "description": "the inventory group id", + "type": "string" + }, + "org_id": { + "type": "string" + } + }, + "type": "object" + }, + "models.DeviceAPI": { + "properties": { + "AvailableHash": { + "description": "Hash that available", + "example": "true", + "type": "string" + }, + "Connected": { + "description": "If Device connect of not", + "example": true, + "type": "boolean" + }, + "CurrentHash": { + "type": "string" + }, + "ImageID": { + "description": "image id of device`", + "example": 12834, + "type": "integer" + }, + "Name": { + "description": "Name of device", + "example": "device_name", + "type": "string" + }, + "RHCClientID": { + "description": "RHC Client ID", + "type": "string" + }, + "UUID": { + "description": "UUID of edge device", + "example": "ba-93ba-49a3-b4ae-a6c8acdc4736", + "type": "string" + }, + "UpdateAvailable": { + "description": "If there is Update available", + "example": true, + "type": "boolean" + }, + "UpdateTransaction": { + "items": { + "$ref": "#/components/schemas/models.UpdateTransaction" + }, + "type": "array" + }, + "booted": { + "description": "Booted status is referring to the LastDeployment of this device", + "example": true, + "type": "boolean" + }, + "deviceName": { + "type": "string" + }, + "devicesGroups": { + "description": "device groups", + "items": { + "$ref": "#/components/schemas/models.DeviceGroupAPI" + }, + "type": "array" + }, + "lastSeen": { + "description": "Last datetime that device updated", + "type": "string" + } + }, + "type": "object" + }, + "models.DeviceDetailsAPI": { + "properties": { + "Device": { + "allOf": [ + { + "$ref": "#/components/schemas/models.EdgeDeviceAPI" + } + ], + "description": "Details of device like name, LastSeen and more" + }, + "DeviceUpdating": { + "description": "If there is update to device", + "example": true, + "type": "boolean" + }, + "DevicesGroups": { + "description": "Device's groups", + "items": { + "$ref": "#/components/schemas/models.DeviceGroupAPI" + }, + "type": "array" + }, + "ImageInfo": { + "allOf": [ + { + "$ref": "#/components/schemas/models.ImageInfo" + } + ], + "description": "Information of device's image" + }, + "UpdateTransactions": { + "items": { + "$ref": "#/components/schemas/models.UpdateTransactionAPI" + }, + "type": "array" + } + }, + "type": "object" + }, + "models.DeviceDetailsListAPI": { + "properties": { + "count": { + "description": "total number of device", + "example": 40, + "type": "integer" + }, + "data": { + "description": "List of Devices", + "items": { + "$ref": "#/components/schemas/models.DeviceDetailsAPI" + }, + "type": "array" + }, + "total": { + "description": "total number of device", + "example": 40, + "type": "integer" + } + }, + "type": "object" + }, + "models.DeviceForDeviceGroupAPI": { + "properties": { + "UUID": { + "description": "device uuid", + "example": "68485bb8-6427-40ad-8711-93b6a5b4deac", + "type": "string" + } + }, + "type": "object" + }, + "models.DeviceGroup": { + "properties": { + "Account": { + "type": "string" + }, + "CreatedAt": { + "$ref": "#/components/schemas/models.EdgeAPITime" + }, + "DeletedAt": { + "$ref": "#/components/schemas/gorm.DeletedAt" + }, + "Devices": { + "items": { + "$ref": "#/components/schemas/models.Device" + }, + "type": "array" + }, + "ID": { + "type": "integer" + }, + "Name": { + "type": "string" + }, + "Type": { + "type": "string" + }, + "UpdatedAt": { + "$ref": "#/components/schemas/models.EdgeAPITime" + }, + "ValidUpdate": { + "type": "boolean" + }, + "org_id": { + "type": "string" + }, + "uuid": { + "type": "string" + } + }, + "type": "object" + }, + "models.DeviceGroupAPI": { + "properties": { + "Devices": { + "description": "Devices that belong to the group", + "items": { + "$ref": "#/components/schemas/models.DeviceAPI" + }, + "type": "array" + }, + "Name": { + "description": "The device group name`", + "example": "device_group name", + "type": "string" + }, + "Type": { + "description": "The device group type``", + "example": "static", + "type": "string" + }, + "ValidUpdate": { + "description": "indicate if the update is valid", + "example": true, + "type": "boolean" + } + }, + "type": "object" + }, + "models.DeviceGroupViewAPI": { + "properties": { + "DeviceGroup": { + "allOf": [ + { + "$ref": "#/components/schemas/models.DeviceGroup" + } + ], + "description": "device group data" + }, + "DevicesView": { + "allOf": [ + { + "$ref": "#/components/schemas/models.DeviceGroupViewResponseAPI" + } + ], + "description": "device group detail" + } + }, + "type": "object" + }, + "models.DeviceGroupViewResponseAPI": { + "properties": { + "Devices": { + "allOf": [ + { + "$ref": "#/components/schemas/models.ImageSetImagePackagesAPI" + } + ], + "description": "all devices in a group" + }, + "Total": { + "description": "count of devices", + "example": 10, + "type": "integer" + } + }, + "type": "object" + }, + "models.DeviceViewAPI": { + "properties": { + "DeviceGroups": { + "description": "Device's groups", + "items": { + "$ref": "#/components/schemas/models.DeviceGroupAPI" + }, + "type": "array" + }, + "DeviceID": { + "description": "ID of device", + "example": 1913277, + "type": "integer" + }, + "DeviceName": { + "description": "Name of device", + "example": "device_name", + "type": "string" + }, + "DeviceUUID": { + "description": "UUID of Device", + "example": "a-8bdf-a21accb24925", + "type": "string" + }, + "DispatcherReason": { + "description": "Reason of Dispatch", + "type": "string" + }, + "DispatcherStatus": { + "description": "Status of Dispatch", + "type": "string" + }, + "GroupName": { + "description": "the inventory group name", + "type": "string" + }, + "GroupUUID": { + "description": "the inventory group id", + "type": "string" + }, + "ImageID": { + "description": "ID of image", + "example": 323241, + "type": "integer" + }, + "ImageName": { + "description": "Name of image", + "example": "image_name", + "type": "string" + }, + "ImageSetID": { + "description": "ID of image set", + "example": 33341, + "type": "integer" + }, + "LastSeen": { + "allOf": [ + { + "$ref": "#/components/schemas/models.EdgeAPITime" + } + ], + "description": "Last datetime that device updated" + }, + "Status": { + "description": "Status of device", + "example": "SUCCESS", + "type": "string" + }, + "UpdateAvailable": { + "description": "indicate if there is update to device", + "example": true, + "type": "boolean" + } + }, + "type": "object" + }, + "models.DeviceViewListAPI": { + "properties": { + "devices": { + "description": "List of Devices", + "items": { + "$ref": "#/components/schemas/models.DeviceViewAPI" + }, + "type": "array" + }, + "enforce_edge_groups": { + "description": "Whether to enforce the edge groups usage", + "type": "boolean" + }, + "total": { + "description": "Total number of device", + "example": 40, + "type": "integer" + } + }, + "type": "object" + }, + "models.DeviceViewListResponseAPI": { + "properties": { + "count": { + "description": "The overall number of devices", + "example": 40, + "type": "integer" + }, + "data": { + "allOf": [ + { + "$ref": "#/components/schemas/models.DeviceViewListAPI" + } + ], + "description": "The devices view data" + } + }, + "type": "object" + }, + "models.DispatchRecord": { + "properties": { + "CreatedAt": { + "$ref": "#/components/schemas/models.EdgeAPITime" + }, + "DeletedAt": { + "$ref": "#/components/schemas/gorm.DeletedAt" + }, + "Device": { + "$ref": "#/components/schemas/models.Device" + }, + "DeviceID": { + "type": "integer" + }, + "ID": { + "type": "integer" + }, + "PlaybookDispatcherID": { + "type": "string" + }, + "PlaybookURL": { + "type": "string" + }, + "Reason": { + "type": "string" + }, + "Status": { + "type": "string" + }, + "UpdatedAt": { + "$ref": "#/components/schemas/models.EdgeAPITime" + } + }, + "type": "object" + }, + "models.DispatchRecordAPI": { + "properties": { + "Device": { + "$ref": "#/components/schemas/models.DeviceAPI" + }, + "DeviceID": { + "description": "ID of device", + "example": 1913277, + "type": "integer" + }, + "PlaybookDispatcherID": { + "type": "string" + }, + "PlaybookURL": { + "type": "string" + }, + "Reason": { + "type": "string" + }, + "Status": { + "description": "Status of device", + "example": "SUCCESS", + "type": "string" + } + }, + "type": "object" + }, + "models.EdgeAPITime": { + "properties": { + "time": { + "type": "string" + }, + "valid": { + "description": "Valid is true if Time is not NULL", + "type": "boolean" + } + }, + "type": "object" + }, + "models.EdgeDeviceAPI": { + "properties": { + "AvailableHash": { + "description": "Hash that available", + "example": "true", + "type": "string" + }, + "Connected": { + "description": "If Device connect of not", + "example": true, + "type": "boolean" + }, + "CurrentHash": { + "type": "string" + }, + "DevicesGroups": { + "description": "device groups", + "items": { + "$ref": "#/components/schemas/models.DeviceGroupAPI" + }, + "type": "array" + }, + "ImageID": { + "description": "image id of device", + "example": 12834, + "type": "integer" + }, + "LastSeen": { + "allOf": [ + { + "$ref": "#/components/schemas/models.EdgeAPITime" + } + ], + "description": "Last datetime that device updated" + }, + "Name": { + "description": "Name of Edge Device", + "type": "string" + }, + "RHCClientID": { + "description": "RHC Client ID", + "type": "string" + }, + "UUID": { + "description": "UUID of edge device", + "example": "ba-93ba-49a3-b4ae-a6c8acdc4736", + "type": "string" + }, + "UpdateAvailable": { + "description": "If there is update available", + "example": true, + "type": "boolean" + }, + "UpdateTransaction": { + "items": { + "$ref": "#/components/schemas/models.UpdateTransaction" + }, + "type": "array" + }, + "booted": { + "description": "Booted status is referring to the LastDeployment of this device", + "example": true, + "type": "boolean" + }, + "deviceName": { + "description": "The device name", + "example": "test_device_api_static", + "type": "string" + } + }, + "type": "object" + }, + "models.EnforceEdgeGroupsAPI": { + "properties": { + "enforce_edge_groups": { + "description": "whether to enforce edge groups usage", + "example": false, + "type": "boolean" + } + }, + "type": "object" + }, + "models.FilterByDevicesAPI": { + "properties": { + "devices_uuid": { + "description": "Devices UUID", + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "models.Image": { + "properties": { + "Account": { + "type": "string" + }, + "Commit": { + "$ref": "#/components/schemas/models.Commit" + }, + "CommitID": { + "type": "integer" + }, + "CreatedAt": { + "$ref": "#/components/schemas/models.EdgeAPITime" + }, + "CustomPackages": { + "items": { + "$ref": "#/components/schemas/models.Package" + }, + "type": "array" + }, + "DeletedAt": { + "$ref": "#/components/schemas/gorm.DeletedAt" + }, + "Description": { + "type": "string" + }, + "Distribution": { + "type": "string" + }, + "ID": { + "type": "integer" + }, + "ImageSetID": { + "description": "TODO: Wipe staging database and set to not nullable", + "type": "integer" + }, + "ImageType": { + "description": "TODO: Remove as soon as the frontend stops using", + "type": "string" + }, + "Installer": { + "$ref": "#/components/schemas/models.Installer" + }, + "InstallerID": { + "type": "integer" + }, + "Name": { + "type": "string" + }, + "OutputTypes": { + "items": { + "type": "string" + }, + "type": "array" + }, + "Packages": { + "items": { + "$ref": "#/components/schemas/models.Package" + }, + "type": "array" + }, + "Status": { + "type": "string" + }, + "SystemsRunning": { + "description": "only for forms", + "type": "integer" + }, + "ThirdPartyRepositories": { + "items": { + "$ref": "#/components/schemas/models.ThirdPartyRepo" + }, + "type": "array" + }, + "TotalPackages": { + "description": "only for forms", + "type": "integer" + }, + "UpdatedAt": { + "$ref": "#/components/schemas/models.EdgeAPITime" + }, + "Version": { + "type": "integer" + }, + "activationKey": { + "type": "string" + }, + "org_id": { + "type": "string" + }, + "request_id": { + "description": "storing for logging reference on resume", + "type": "string" + } + }, + "type": "object" + }, + "models.ImageDetailAPI": { + "properties": { + "additional_packages": { + "description": "Number of additional packages", + "example": 3, + "type": "integer" + }, + "image": { + "$ref": "#/components/schemas/models.Image" + }, + "packages": { + "description": "Number of packages", + "example": 3, + "type": "integer" + }, + "update_added": { + "description": "Number of added update", + "example": 3, + "type": "integer" + }, + "update_removed": { + "description": "Number of removed update", + "example": 2, + "type": "integer" + }, + "update_updated": { + "description": "Number of updated update", + "example": 3, + "type": "integer" + } + }, + "type": "object" + }, + "models.ImageInfo": { + "properties": { + "Count": { + "type": "integer" + }, + "Image": { + "$ref": "#/components/schemas/models.Image" + }, + "RollbackImage": { + "$ref": "#/components/schemas/models.Image" + }, + "UpdatesAvailable": { + "items": { + "$ref": "#/components/schemas/models.ImageUpdateAvailable" + }, + "type": "array" + } + }, + "type": "object" + }, + "models.ImageSetAPI": { + "properties": { + "CreatedAt": { + "$ref": "#/components/schemas/models.EdgeAPITime" + }, + "DeletedAt": { + "$ref": "#/components/schemas/gorm.DeletedAt" + }, + "ID": { + "type": "integer" + }, + "Images": { + "description": "images of image set", + "items": { + "$ref": "#/components/schemas/models.Image" + }, + "type": "array" + }, + "UpdatedAt": { + "$ref": "#/components/schemas/models.EdgeAPITime" + }, + "name": { + "description": "the image set name", + "example": "my-edge-image", + "type": "string" + }, + "version": { + "description": "the image set version", + "example": 1, + "type": "integer" + } + }, + "type": "object" + }, + "models.ImageSetDetailsResponseAPI": { + "properties": { + "Count": { + "description": "count of image-sets", + "example": 10, + "type": "integer" + }, + "Data": { + "allOf": [ + { + "$ref": "#/components/schemas/models.ImageSetImagePackagesAPI" + } + ], + "description": "all data of image-sets" + } + }, + "type": "object" + }, + "models.ImageSetDevicesAPI": { + "properties": { + "Count": { + "description": "count of image-set's devices", + "example": 10, + "type": "integer" + }, + "Data": { + "description": "Data of image set's devices", + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "models.ImageSetIDViewAPI": { + "properties": { + "ImageBuildIsoURL": { + "description": "The image-set latest available image ISO", + "example": "/api/edge/v1/storage/isos/432", + "type": "string" + }, + "ImageSet": { + "allOf": [ + { + "$ref": "#/components/schemas/models.ImageSetAPI" + } + ], + "description": "image set data" + }, + "LastImageDetails": { + "allOf": [ + { + "$ref": "#/components/schemas/models.ImageDetailAPI" + } + ], + "description": "The image-set latest image details" + } + }, + "type": "object" + }, + "models.ImageSetImageIDViewAPI": { + "properties": { + "ImageBuildIsoURL": { + "description": "The image-set latest available image ISO", + "example": "/api/edge/v1/storage/isos/432", + "type": "string" + }, + "ImageDetails": { + "allOf": [ + { + "$ref": "#/components/schemas/models.ImageDetailAPI" + } + ], + "description": "the requested image details" + }, + "ImageSet": { + "allOf": [ + { + "$ref": "#/components/schemas/models.ImageSetAPI" + } + ], + "description": "image set data" + } + }, + "type": "object" + }, + "models.ImageSetImagePackagesAPI": { + "properties": { + "image_build_iso_url": { + "description": "The image-set latest available image ISO", + "example": "/api/edge/v1/storage/isos/432", + "type": "string" + }, + "image_set": { + "allOf": [ + { + "$ref": "#/components/schemas/models.ImageSetAPI" + } + ], + "description": "image set data" + }, + "images": { + "description": "image detail", + "items": { + "$ref": "#/components/schemas/models.ImageDetailAPI" + }, + "type": "array" + } + }, + "type": "object" + }, + "models.ImageSetInstallerURLAPI": { + "properties": { + "image_build_iso_url": { + "description": "The image-set latest available image ISO", + "example": "/api/edge/v1/storage/isos/432", + "type": "string" + }, + "image_set": { + "allOf": [ + { + "$ref": "#/components/schemas/models.ImageSetAPI" + } + ], + "description": "image set data" + } + }, + "type": "object" + }, + "models.ImageSetView": { + "properties": { + "Distribution": { + "type": "string" + }, + "ID": { + "type": "integer" + }, + "ImageBuildIsoURL": { + "type": "string" + }, + "ImageID": { + "type": "integer" + }, + "Name": { + "type": "string" + }, + "OutputTypes": { + "items": { + "type": "string" + }, + "type": "array" + }, + "Status": { + "type": "string" + }, + "UpdatedAt": { + "$ref": "#/components/schemas/models.EdgeAPITime" + }, + "Version": { + "type": "integer" + } + }, + "type": "object" + }, + "models.ImageSetsResponseAPI": { + "properties": { + "Count": { + "description": "count of image-sets", + "example": 10, + "type": "integer" + }, + "Data": { + "description": "all data of image-sets", + "items": { + "$ref": "#/components/schemas/models.ImageSetInstallerURLAPI" + }, + "type": "array" + } + }, + "type": "object" + }, + "models.ImageSetsViewResponseAPI": { + "properties": { + "count": { + "description": "count of image-sets", + "example": 10, + "type": "integer" + }, + "data": { + "description": "data of image set view", + "items": { + "$ref": "#/components/schemas/models.ImageSetView" + }, + "type": "array" + } + }, + "type": "object" + }, + "models.ImageUpdateAvailable": { + "properties": { + "CanUpdate": { + "type": "boolean" + }, + "Image": { + "$ref": "#/components/schemas/models.Image" + }, + "PackageDiff": { + "$ref": "#/components/schemas/models.PackageDiff" + } + }, + "type": "object" + }, + "models.ImageView": { + "properties": { + "CommitCheckSum": { + "type": "string" + }, + "CreatedAt": { + "$ref": "#/components/schemas/models.EdgeAPITime" + }, + "ID": { + "type": "integer" + }, + "ImageBuildIsoURL": { + "type": "string" + }, + "ImageType": { + "type": "string" + }, + "Name": { + "type": "string" + }, + "OutputTypes": { + "items": { + "type": "string" + }, + "type": "array" + }, + "Status": { + "type": "string" + }, + "Version": { + "type": "integer" + } + }, + "type": "object" + }, + "models.ImagesViewDataAPI": { + "properties": { + "count": { + "description": "total number of image view data", + "example": 100, + "type": "integer" + }, + "data": { + "items": { + "$ref": "#/components/schemas/models.ImageView" + }, + "type": "array" + } + }, + "type": "object" + }, + "models.InstalledPackage": { + "properties": { + "ID": { + "type": "integer" + }, + "arch": { + "type": "string" + }, + "commits": { + "items": { + "$ref": "#/components/schemas/models.Commit" + }, + "type": "array" + }, + "epoch": { + "type": "string" + }, + "name": { + "type": "string" + }, + "release": { + "type": "string" + }, + "sigmd5": { + "type": "string" + }, + "signature": { + "type": "string" + }, + "type": { + "type": "string" + }, + "version": { + "type": "string" + } + }, + "type": "object" + }, + "models.Installer": { + "properties": { + "Account": { + "type": "string" + }, + "Checksum": { + "type": "string" + }, + "ComposeJobID": { + "type": "string" + }, + "CreatedAt": { + "$ref": "#/components/schemas/models.EdgeAPITime" + }, + "DeletedAt": { + "$ref": "#/components/schemas/gorm.DeletedAt" + }, + "ID": { + "type": "integer" + }, + "ImageBuildISOURL": { + "type": "string" + }, + "SshKey": { + "type": "string" + }, + "Status": { + "type": "string" + }, + "UpdatedAt": { + "$ref": "#/components/schemas/models.EdgeAPITime" + }, + "Username": { + "type": "string" + }, + "org_id": { + "type": "string" + } + }, + "type": "object" + }, + "models.InventoryGroupDevicesUpdateInfoResponseAPI": { + "properties": { + "devices_count": { + "description": "the overall count of all devices that belongs to inventory group", + "example": 25, + "type": "integer" + }, + "group_uuid": { + "description": "the inventory group id", + "example": "b579a578-1a6f-48d5-8a45-21f2a656a5d4", + "type": "string" + }, + "image_set_id": { + "description": "the image set id common to all inventory group devices", + "example": 1024, + "type": "integer" + }, + "image_sets_count": { + "description": "how much image set ids the inventory group devices belongs to", + "example": 1, + "type": "integer" + }, + "update_devices_uuids": { + "description": "the list of devices uuids that belongs to inventory group that are available to update", + "example": [ + "b579a578-1a6f-48d5-8a45-21f2a656a5d4", + "1abb288d-6d88-4e2d-bdeb-fcc536be58ec" + ], + "items": { + "type": "string" + }, + "type": "array" + }, + "update_valid": { + "description": "whether the inventory group devices update is valid", + "example": true, + "type": "boolean" + } + }, + "type": "object" + }, + "models.Package": { + "properties": { + "CreatedAt": { + "$ref": "#/components/schemas/models.EdgeAPITime" + }, + "DeletedAt": { + "$ref": "#/components/schemas/gorm.DeletedAt" + }, + "ID": { + "type": "integer" + }, + "Name": { + "type": "string" + }, + "UpdatedAt": { + "$ref": "#/components/schemas/models.EdgeAPITime" + } + }, + "type": "object" + }, + "models.PackageDiff": { + "properties": { + "Added": { + "items": { + "$ref": "#/components/schemas/models.InstalledPackage" + }, + "type": "array" + }, + "Removed": { + "items": { + "$ref": "#/components/schemas/models.InstalledPackage" + }, + "type": "array" + }, + "Upgraded": { + "items": { + "$ref": "#/components/schemas/models.InstalledPackage" + }, + "type": "array" + } + }, + "type": "object" + }, + "models.PostDeviceForDeviceGroupAPI": { + "properties": { + "Name": { + "description": "device name", + "example": "localhost", + "type": "string" + }, + "UUID": { + "description": "device uuid", + "example": "68485bb8-6427-40ad-8711-93b6a5b4deac", + "type": "string" + } + }, + "type": "object" + }, + "models.PutGroupNameParamAPI": { + "properties": { + "Name": { + "description": "device group name", + "example": "my-device-group", + "type": "string" + }, + "Type": { + "description": "device group type", + "example": "static", + "type": "string" + } + }, + "type": "object" + }, + "models.Repo": { + "properties": { + "CreatedAt": { + "$ref": "#/components/schemas/models.EdgeAPITime" + }, + "DeletedAt": { + "$ref": "#/components/schemas/gorm.DeletedAt" + }, + "ID": { + "type": "integer" + }, + "RepoStatus": { + "description": "AWS repo upload status", + "type": "string" + }, + "RepoURL": { + "description": "AWS repo URL", + "type": "string" + }, + "UpdatedAt": { + "$ref": "#/components/schemas/models.EdgeAPITime" + }, + "pulp_repo_id": { + "description": "Pulp Repo ID (used for updates)", + "type": "string" + }, + "pulp_repo_status": { + "description": "Status of Pulp repo import", + "type": "string" + }, + "pulp_repo_url": { + "description": "Distribution URL returned from Pulp", + "type": "string" + } + }, + "type": "object" + }, + "models.SuccessPlaceholderResponse": { + "type": "object" + }, + "models.ThirdPartyRepo": { + "properties": { + "CreatedAt": { + "$ref": "#/components/schemas/models.EdgeAPITime" + }, + "DeletedAt": { + "$ref": "#/components/schemas/gorm.DeletedAt" + }, + "Description": { + "type": "string" + }, + "ID": { + "type": "integer" + }, + "Images": { + "items": { + "$ref": "#/components/schemas/models.Image" + }, + "type": "array" + }, + "Name": { + "type": "string" + }, + "URL": { + "type": "string" + }, + "UpdatedAt": { + "$ref": "#/components/schemas/models.EdgeAPITime" + }, + "account": { + "type": "string" + }, + "distribution_arch": { + "type": "string" + }, + "distribution_version": { + "items": { + "type": "string" + }, + "type": "array" + }, + "gpg_key": { + "type": "string" + }, + "org_id": { + "type": "string" + }, + "package_count": { + "type": "integer" + }, + "uuid": { + "type": "string" + } + }, + "type": "object" + }, + "models.UpdateCommitAPI": { + "properties": { + "ID": { + "description": "The unique ID of the commit", + "example": 1056, + "type": "integer" + }, + "ImageBuildTarURL": { + "description": "The commit tar url", + "example": "https://storage-host.example.com/v2/99999999/tar/59794/tmp/repos/59794/repo.tar", + "type": "string" + }, + "OSTreeCommit": { + "description": "The ostree commit hash", + "example": "9bd8dfe9856aa5bb1683e85f123bfe7785d45fbdb6f10372ff2c80e703400999", + "type": "string" + }, + "OSTreeRef": { + "description": "The commit ostree ref", + "example": "rhel/9/x86_64/edge", + "type": "string" + } + }, + "type": "object" + }, + "models.UpdateTransaction": { + "properties": { + "Account": { + "type": "string" + }, + "ChangesRefs": { + "type": "boolean" + }, + "Commit": { + "$ref": "#/components/schemas/models.Commit" + }, + "CommitID": { + "type": "integer" + }, + "CreatedAt": { + "$ref": "#/components/schemas/models.EdgeAPITime" + }, + "DeletedAt": { + "$ref": "#/components/schemas/gorm.DeletedAt" + }, + "Devices": { + "items": { + "$ref": "#/components/schemas/models.Device" + }, + "type": "array" + }, + "DispatchRecords": { + "items": { + "$ref": "#/components/schemas/models.DispatchRecord" + }, + "type": "array" + }, + "ID": { + "type": "integer" + }, + "OldCommits": { + "items": { + "$ref": "#/components/schemas/models.Commit" + }, + "type": "array" + }, + "Repo": { + "$ref": "#/components/schemas/models.Repo" + }, + "RepoID": { + "type": "integer" + }, + "Status": { + "type": "string" + }, + "Tag": { + "type": "string" + }, + "UpdatedAt": { + "$ref": "#/components/schemas/models.EdgeAPITime" + }, + "org_id": { + "type": "string" + } + }, + "type": "object" + }, + "models.UpdateTransactionAPI": { + "properties": { + "ChangesRefs": { + "example": false, + "type": "boolean" + }, + "Commit": { + "$ref": "#/components/schemas/models.Commit" + }, + "CommitID": { + "description": "Commit ID of device", + "example": 1754, + "type": "integer" + }, + "Devices": { + "description": "List of Devices", + "items": { + "$ref": "#/components/schemas/models.DeviceAPI" + }, + "type": "array" + }, + "DispatchRecords": { + "items": { + "$ref": "#/components/schemas/models.DispatchRecordAPI" + }, + "type": "array" + }, + "OldCommits": { + "description": "Old Commit ID if the device has one", + "items": { + "$ref": "#/components/schemas/models.Commit" + }, + "type": "array" + }, + "Repo": { + "$ref": "#/components/schemas/models.Repo" + }, + "RepoID": { + "description": "Repo ID", + "example": 2256, + "type": "integer" + }, + "Status": { + "description": "Status of device", + "example": "SUCCESS", + "type": "string" + }, + "Tag": { + "description": "Tag og Device if device has one", + "example": "device_tag", + "type": "string" + } + }, + "type": "object" } - }, - "description": "request body", - "required": true, - "x-originalParamName": "body" - }, - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ImageValidationResponse" - } - } - }, - "description": "the validation result" - }, - "400": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/errors.BadRequest" - } - } - }, - "description": "The request sent couldn't be processed" - }, - "500": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/errors.InternalServerError" - } - } - }, - "description": "There was an internal server error" - } - }, - "summary": "Validate if the images selection could be updated", - "tags": [ - "Updates (Systems)" - ] - } + } }, - "/updates/{updateID}": { - "get": { - "description": "Gets a single requested update.", - "operationId": "GetUpdate", - "parameters": [ - { - "description": "a unique ID to identify the update", - "in": "path", - "name": "updateID", - "required": true, - "schema": { - "type": "integer" - } - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Update" - } - } - }, - "description": "The requested update" - }, - "400": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/errors.BadRequest" - } - } - }, - "description": "The request sent couldn't be processed" - }, - "404": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/errors.NotFound" - } - } - }, - "description": "The requested update was not found" - }, - "500": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/errors.InternalServerError" - } - } - }, - "description": "There was an internal server error" - } + "info": { + "contact": {}, + "description": "API of the Edge Management application on [console.redhat.com](https://console.redhat.com)", + "license": { + "name": "MIT" }, - "summary": "Gets a single requested update", - "tags": [ - "Updates (Systems)" - ] - } + "title": "Edge API", + "version": "1.0" }, - "/updates/{updateID}/notify": { - "get": { - "description": "Send a notification for a device update", - "operationId": "SendNotificationForDevice", - "parameters": [ - { - "description": "a unique ID to identify the update", - "in": "path", - "name": "updateID", - "required": true, - "schema": { - "type": "integer" + "openapi": "3.0.3", + "paths": { + "/device-groups": { + "get": { + "description": "Returns device groups for an orgID", + "parameters": [ + { + "description": "Define sort fields: created_at, updated_at, name. To sort DESC use -", + "in": "query", + "name": "sort_by", + "schema": { + "type": "string" + } + }, + { + "description": "field: filter by name", + "in": "query", + "name": "name", + "schema": { + "type": "string" + } + }, + { + "description": "field: return number of image-set view until limit is reached. Default is 100.", + "in": "query", + "name": "limit", + "schema": { + "type": "integer" + } + }, + { + "description": "field: return number of image-set view beginning at the offset.", + "in": "query", + "name": "offset", + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/models.DeviceGroup" + } + } + }, + "description": "OK" + }, + "400": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/errors.BadRequest" + } + } + }, + "description": "Bad Request" + }, + "500": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/errors.InternalServerError" + } + } + }, + "description": "Internal Server Error" + } + }, + "summary": "Returns device groups for an orgID", + "tags": [ + "Device Groups" + ] + }, + "post": { + "description": "Creates a Device Group for an account.", + "operationId": "CreateDeviceGroup", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/models.CreateDeviceGroupAPI" + } + } + }, + "description": "request body", + "required": true, + "x-originalParamName": "body" + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/models.DeviceGroupAPI" + } + } + }, + "description": "The created device groups" + }, + "400": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/errors.BadRequest" + } + } + }, + "description": "The request sent couldn't be processed." + }, + "500": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/errors.InternalServerError" + } + } + }, + "description": "There was an internal server error." + } + }, + "summary": "Creates a Device Group for an account.", + "tags": [ + "Device Groups" + ] } - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/DeviceNotification" - } - } - }, - "description": "The notification payload" - }, - "400": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/errors.BadRequest" - } - } - }, - "description": "The request sent couldn't be processed" - }, - "404": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/errors.NotFound" - } - } - }, - "description": "The requested update was not found" - }, - "500": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/errors.InternalServerError" - } - } - }, - "description": "There was an internal server error" - } }, - "summary": "Send a notification for a device update", - "tags": [ - "Updates (Systems)" - ] - } - }, - "/updates/{updateID}/update-playbook.yml": { - "get": { - "description": "returns the update transaction playbook used for system update", - "operationId": "GetUpdatePlaybook", - "parameters": [ - { - "description": "a unique ID to identify the update the playbook belongs to", - "in": "path", - "name": "updateID", - "required": true, - "schema": { - "type": "integer" + "/device-groups/checkName/{name}": { + "get": { + "description": "Validates if a group name already exists", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/models.CheckGroupNameParamAPI" + } + } + }, + "description": "request body", + "required": true, + "x-originalParamName": "body" + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/models.SuccessPlaceholderResponse" + } + } + }, + "description": "OK" + }, + "400": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/errors.BadRequest" + } + } + }, + "description": "Bad Request" + }, + "500": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/errors.InternalServerError" + } + } + }, + "description": "Internal Server Error" + } + }, + "summary": "Validates if a group name already exists", + "tags": [ + "Device Groups" + ] } - } - ], - "responses": { - "200": { - "content": { - "text/plain": { - "schema": { - "type": "string" - } - } - }, - "description": "the playbook file content for an update" - }, - "400": { - "content": { - "text/plain": { - "schema": { - "$ref": "#/components/schemas/errors.BadRequest" - } - } - }, - "description": "The request sent couldn't be processed." - }, - "404": { - "content": { - "text/plain": { - "schema": { - "$ref": "#/components/schemas/errors.NotFound" - } - } - }, - "description": "the device update was not found" - }, - "500": { - "content": { - "text/plain": { - "schema": { - "$ref": "#/components/schemas/errors.InternalServerError" - } - } - }, - "description": "There was an internal server error." - } }, - "summary": "returns the playbook yaml file for a system update", - "tags": [ - "Updates (Systems)" - ] - } + "/device-groups/enforce-edge-groups": { + "get": { + "description": "Returns whether the edge groups is enforced for the current organization", + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/models.EnforceEdgeGroupsAPI" + } + } + }, + "description": "OK" + }, + "400": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/errors.BadRequest" + } + } + }, + "description": "Bad Request" + } + }, + "summary": "Returns whether the edge groups is enforced for the current organization", + "tags": [ + "Device Groups" + ] + } + }, + "/device-groups/{ID}": { + "delete": { + "description": "Deletes an existing device group", + "parameters": [ + { + "description": "A unique existing Device Group", + "in": "query", + "name": "required_param", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/models.SuccessPlaceholderResponse" + } + } + }, + "description": "OK" + }, + "400": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/errors.BadRequest" + } + } + }, + "description": "Bad Request" + }, + "500": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/errors.InternalServerError" + } + } + }, + "description": "Internal Server Error" + } + }, + "summary": "Deletes an existing device group", + "tags": [ + "Device Groups" + ] + }, + "get": { + "description": "Returns devices groups for group identified by ID", + "parameters": [ + { + "description": "device group ID", + "in": "query", + "name": "required_param", + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/models.DeviceGroup" + } + } + }, + "description": "OK" + }, + "400": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/errors.BadRequest" + } + } + }, + "description": "Bad Request" + }, + "500": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/errors.InternalServerError" + } + } + }, + "description": "Internal Server Error" + } + }, + "summary": "Returns devices groups for group identified by ID", + "tags": [ + "Device Groups" + ] + }, + "put": { + "description": "Updates the existing device group", + "parameters": [ + { + "description": "An unique existing Device Group", + "in": "query", + "name": "required_param", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/models.PutGroupNameParamAPI" + } + } + }, + "description": "request body", + "required": true, + "x-originalParamName": "body" + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/models.DeviceGroup" + } + } + }, + "description": "OK" + }, + "400": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/errors.BadRequest" + } + } + }, + "description": "Bad Request" + }, + "500": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/errors.InternalServerError" + } + } + }, + "description": "Internal Server Error" + } + }, + "summary": "Updates the existing device group", + "tags": [ + "Device Groups" + ] + } + }, + "/device-groups/{ID}/details": { + "get": { + "description": "Returns details for group identified by ID", + "parameters": [ + { + "description": "device group ID", + "in": "query", + "name": "required_param", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/models.DeviceGroup" + } + } + }, + "description": "OK" + }, + "400": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/errors.BadRequest" + } + } + }, + "description": "Bad Request" + }, + "500": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/errors.InternalServerError" + } + } + }, + "description": "Internal Server Error" + } + }, + "summary": "Returns details for group identified by ID", + "tags": [ + "Device Groups" + ] + } + }, + "/device-groups/{ID}/devices": { + "delete": { + "description": "Deletes the requested devices from device-group", + "parameters": [ + { + "description": "Identifier of the DeviceGroup", + "in": "path", + "name": "DeviceGroupID", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/models.SuccessPlaceholderResponse" + } + } + }, + "description": "OK" + }, + "400": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/errors.BadRequest" + } + } + }, + "description": "Bad Request" + }, + "500": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/errors.InternalServerError" + } + } + }, + "description": "Internal Server Error" + } + }, + "summary": "Deletes the requested devices from device-group", + "tags": [ + "Device Groups" + ] + }, + "post": { + "description": "Adds devices to device group", + "parameters": [ + { + "description": "An unique existing Device Group", + "in": "query", + "name": "required_param", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/models.PostDeviceForDeviceGroupAPI" + } + } + }, + "description": "request body", + "required": true, + "x-originalParamName": "body" + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/models.SuccessPlaceholderResponse" + } + } + }, + "description": "OK" + }, + "400": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/errors.BadRequest" + } + } + }, + "description": "Bad Request" + }, + "500": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/errors.InternalServerError" + } + } + }, + "description": "Internal Server Error" + } + }, + "summary": "Adds devices to device group", + "tags": [ + "Device Groups" + ] + } + }, + "/device-groups/{ID}/devices/{deviceID}": { + "delete": { + "description": "Deletes the requested device from the device-group", + "parameters": [ + { + "description": "Identifier of the Device Group", + "in": "path", + "name": "DeviceGroupId", + "required": true, + "schema": { + "type": "integer" + } + }, + { + "description": "Identifier of the Device in a Device Group", + "in": "path", + "name": "DeviceId", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/models.SuccessPlaceholderResponse" + } + } + }, + "description": "OK" + }, + "400": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/errors.BadRequest" + } + } + }, + "description": "Bad Request" + }, + "500": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/errors.InternalServerError" + } + } + }, + "description": "Internal Server Error" + } + }, + "summary": "Deletes the requested device from the device-group", + "tags": [ + "Device Groups" + ] + } + }, + "/device-groups/{ID}/updateDevices": { + "post": { + "description": "Updates all devices that belong to a group", + "parameters": [ + { + "description": "Identifier of the DeviceGroup", + "in": "query", + "name": "required_param", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/models.SuccessPlaceholderResponse" + } + } + }, + "description": "OK" + }, + "400": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/errors.BadRequest" + } + } + }, + "description": "Bad Request" + }, + "500": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/errors.InternalServerError" + } + } + }, + "description": "Internal Server Error" + } + }, + "summary": "Updates all devices that belong to a group", + "tags": [ + "Device Groups" + ] + } + }, + "/device-groups/{ID}/view": { + "get": { + "description": "Returns device groups view for group identified by ID", + "parameters": [ + { + "description": "device group ID", + "in": "query", + "name": "required_param", + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/models.DeviceGroupViewAPI" + } + } + }, + "description": "OK" + }, + "400": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/errors.BadRequest" + } + } + }, + "description": "Bad Request" + }, + "500": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/errors.InternalServerError" + } + } + }, + "description": "Internal Server Error" + } + }, + "summary": "Returns device groups view for group identified by ID", + "tags": [ + "Device Groups" + ] + } + }, + "/devices": { + "get": { + "description": "Get combined system data from Edge API and Inventory API", + "operationId": "GetDevices", + "parameters": [ + { + "description": "field: maximum devices per page", + "in": "query", + "name": "per_page", + "schema": { + "type": "integer" + } + }, + { + "description": "field: which page to query from", + "in": "query", + "name": "page", + "schema": { + "type": "integer" + } + }, + { + "description": "field: order by display_name, updated or operating_system", + "in": "query", + "name": "order_by", + "schema": { + "type": "string" + } + }, + { + "description": "field: choose to order ASC or DESC when order_by is being used", + "in": "query", + "name": "order_how", + "schema": { + "type": "string" + } + }, + { + "description": "field: filter by hostname_or_id", + "in": "query", + "name": "hostname_or_id", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/models.DeviceDetailsListAPI" + } + } + }, + "description": "OK" + }, + "500": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/errors.InternalServerError" + } + } + }, + "description": "There was an internal server error." + } + }, + "summary": "Get All Devices.", + "tags": [ + "Devices (Systems)" + ] + } + }, + "/devices/devicesview": { + "get": { + "description": "Return all data of Devices.", + "operationId": "GetDevicesView", + "parameters": [ + { + "description": "fields: name, uuid, update_available, image_id. To sort DESC use - before the fields.", + "in": "query", + "name": "sort_by", + "schema": { + "type": "string" + } + }, + { + "description": "field: filter by name", + "in": "query", + "name": "name", + "schema": { + "type": "string" + } + }, + { + "description": "field: filter by update_available", + "in": "query", + "name": "update_available", + "schema": { + "type": "boolean" + } + }, + { + "description": "field: filter by uuid", + "in": "query", + "name": "uuid", + "schema": { + "type": "string" + } + }, + { + "description": "field: filter by creation date", + "in": "query", + "name": "created_at", + "schema": { + "type": "string" + } + }, + { + "description": "field: filter by image id", + "in": "query", + "name": "image_id", + "schema": { + "type": "integer" + } + }, + { + "description": "field: return number of devices until limit is reached. Default is 100.", + "in": "query", + "name": "limit", + "schema": { + "type": "integer" + } + }, + { + "description": "field: return number of devices begining at the offset.", + "in": "query", + "name": "offset", + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/models.DeviceViewListResponseAPI" + } + } + }, + "description": "OK" + }, + "500": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/errors.InternalServerError" + } + } + }, + "description": "There was an internal server error." + } + }, + "summary": "Return all data of Devices.", + "tags": [ + "Devices (Systems)" + ] + }, + "post": { + "description": "Return all data of Devices.", + "operationId": "GetDevicesViewWithinDevices", + "parameters": [ + { + "description": "fields: name, uuid, update_available, image_id. To sort DESC use - before the fields.", + "in": "query", + "name": "sort_by", + "schema": { + "type": "string" + } + }, + { + "description": "field: filter by name", + "in": "query", + "name": "name", + "schema": { + "type": "string" + } + }, + { + "description": "field: filter by update_available", + "in": "query", + "name": "update_available", + "schema": { + "type": "boolean" + } + }, + { + "description": "field: filter by uuid", + "in": "query", + "name": "uuid", + "schema": { + "type": "string" + } + }, + { + "description": "field: filter by creation date", + "in": "query", + "name": "created_at", + "schema": { + "type": "string" + } + }, + { + "description": "field: filter by image id", + "in": "query", + "name": "image_id", + "schema": { + "type": "integer" + } + }, + { + "description": "field: return number of devices until limit is reached. Default is 100.", + "in": "query", + "name": "limit", + "schema": { + "type": "integer" + } + }, + { + "description": "field: return number of devices beginning at the offset.", + "in": "query", + "name": "offset", + "schema": { + "type": "integer" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/models.FilterByDevicesAPI" + } + } + }, + "description": "request body", + "required": true, + "x-originalParamName": "body" + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/models.DeviceViewListResponseAPI" + } + } + }, + "description": "OK" + }, + "500": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/errors.InternalServerError" + } + } + }, + "description": "There was an internal server error." + } + }, + "summary": "Return all data of Devices.", + "tags": [ + "Devices (Systems)" + ] + } + }, + "/devices/{DeviceUUID}": { + "get": { + "description": "Get a device by UUID.", + "operationId": "GetDevice", + "parameters": [ + { + "description": "DeviceUUID", + "in": "path", + "name": "DeviceUUID", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/models.DeviceDetailsAPI" + } + } + }, + "description": "OK" + }, + "400": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/errors.BadRequest" + } + } + }, + "description": "The request sent couldn't be processed." + }, + "404": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/errors.NotFound" + } + } + }, + "description": "The device was not found." + }, + "500": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/errors.InternalServerError" + } + } + }, + "description": "There was an internal server error." + } + }, + "summary": "Get a device by UUID.", + "tags": [ + "Devices (Systems)" + ] + } + }, + "/image-sets": { + "get": { + "description": "Return the list of image sets.", + "operationId": "ListAllImageSets", + "parameters": [ + { + "description": "Define sort fields: created_at, updated_at, name. To sort DESC use -", + "in": "query", + "name": "sort_by", + "schema": { + "type": "string" + } + }, + { + "description": "field: filter by name", + "in": "query", + "name": "name", + "schema": { + "type": "string" + } + }, + { + "description": "field: filter by status", + "in": "query", + "name": "status", + "schema": { + "type": "string" + } + }, + { + "description": "field: return number of image-set view until limit is reached. Default is 100.", + "in": "query", + "name": "limit", + "schema": { + "type": "integer" + } + }, + { + "description": "field: return number of image-set view beginning at the offset.", + "in": "query", + "name": "offset", + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/models.ImageSetsResponseAPI" + } + } + }, + "description": "OK" + }, + "400": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/errors.BadRequest" + } + } + }, + "description": "The request sent couldn't be processed." + }, + "404": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/errors.NotFound" + } + } + }, + "description": "The Image Set was not found." + }, + "500": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/errors.InternalServerError" + } + } + }, + "description": "There was an internal server error." + } + }, + "summary": "Return the list of image sets.", + "tags": [ + "Image-Sets" + ] + } + }, + "/image-sets/view": { + "get": { + "description": "Return the list of image set view.", + "parameters": [ + { + "description": "Define sort fields: created_at, updated_at, name. To sort DESC use -", + "in": "query", + "name": "sort_by", + "schema": { + "type": "string" + } + }, + { + "description": "field: filter by name", + "in": "query", + "name": "name", + "schema": { + "type": "string" + } + }, + { + "description": "field: filter by status", + "in": "query", + "name": "status", + "schema": { + "type": "string" + } + }, + { + "description": "field: filter by id", + "in": "query", + "name": "id", + "schema": { + "type": "integer" + } + }, + { + "description": "field: return number of image-set view until limit is reached. Default is 30.", + "in": "query", + "name": "limit", + "schema": { + "type": "integer" + } + }, + { + "description": "field: return number of image-set view beginning at the offset.", + "in": "query", + "name": "offset", + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/models.ImageSetsViewResponseAPI" + } + } + }, + "description": "OK" + }, + "500": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/errors.InternalServerError" + } + } + }, + "description": "There was an internal server error." + } + }, + "summary": "Return the list of image set view.", + "tags": [ + "Image-Sets" + ] + } + }, + "/image-sets/view/{imageSetID}/versions/{imageID}": { + "get": { + "description": "Return the image-set images view list.", + "operationId": "GetImageSetImageView", + "parameters": [ + { + "description": "the image set id", + "in": "path", + "name": "imageSetID", + "required": true, + "schema": { + "type": "integer" + } + }, + { + "description": "the image id", + "in": "path", + "name": "imageID", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/models.ImageSetImageIDViewAPI" + } + } + }, + "description": "OK" + }, + "400": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/errors.BadRequest" + } + } + }, + "description": "The request sent couldn't be processed." + }, + "404": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/errors.NotFound" + } + } + }, + "description": "The Image-Set or Image was not found." + }, + "500": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/errors.InternalServerError" + } + } + }, + "description": "There was an internal server error." + } + }, + "summary": "Return the image-set images view list.", + "tags": [ + "Image-Sets" + ] + } + }, + "/image-sets/view/{image_set_id}": { + "get": { + "description": "Return the image-set description view.", + "operationId": "GetImageSetViewByID", + "parameters": [ + { + "description": "the image-set id", + "in": "path", + "name": "image_set_id", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/models.ImageSetIDViewAPI" + } + } + }, + "description": "OK" + }, + "400": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/errors.BadRequest" + } + } + }, + "description": "The request sent couldn't be processed." + }, + "404": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/errors.NotFound" + } + } + }, + "description": "The Image-Set was not found." + }, + "500": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/errors.InternalServerError" + } + } + }, + "description": "There was an internal server error." + } + }, + "summary": "Return the image-set description view.", + "tags": [ + "Image-Sets" + ] + } + }, + "/image-sets/view/{image_set_id}/versions": { + "get": { + "description": "Return the image-set images view list.", + "operationId": "GetAllImageSetImagesView", + "parameters": [ + { + "description": "the image-set id", + "in": "path", + "name": "image_set_id", + "required": true, + "schema": { + "type": "integer" + } + }, + { + "description": "Define sort fields: created_at, version, To sort DESC use -", + "in": "query", + "name": "sort_by", + "schema": { + "type": "string" + } + }, + { + "description": "field: filter by status", + "in": "query", + "name": "status", + "schema": { + "type": "string" + } + }, + { + "description": "field: filter by version", + "in": "query", + "name": "version", + "schema": { + "type": "string" + } + }, + { + "description": "field: return number of images until limit is reached. Default is 100.", + "in": "query", + "name": "limit", + "schema": { + "type": "integer" + } + }, + { + "description": "field: return number of images beginning at the offset.", + "in": "query", + "name": "offset", + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/models.ImagesViewDataAPI" + } + } + }, + "description": "OK" + }, + "400": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/errors.BadRequest" + } + } + }, + "description": "The request sent couldn't be processed." + }, + "404": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/errors.NotFound" + } + } + }, + "description": "The Image-Set was not found." + }, + "500": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/errors.InternalServerError" + } + } + }, + "description": "There was an internal server error." + } + }, + "summary": "Return the image-set images view list.", + "tags": [ + "Image-Sets" + ] + } + }, + "/image-sets/{imageSetID}": { + "delete": { + "description": "Delete Image Set", + "operationId": "DeleteImageSet", + "parameters": [ + { + "description": "Identifier of the ImageSet", + "in": "path", + "name": "imageSetID", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/models.ImageSetAPI" + } + } + }, + "description": "OK" + }, + "400": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/errors.BadRequest" + } + } + }, + "description": "The request sent couldn't be processed." + }, + "404": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/errors.NotFound" + } + } + }, + "description": "image-set was not found." + }, + "500": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/errors.InternalServerError" + } + } + }, + "description": "There was an internal server error." + } + }, + "summary": "Delete Image Set", + "tags": [ + "Image-Sets" + ] + } + }, + "/image-sets/{imageSetID}/": { + "get": { + "description": "Get image set by ID", + "operationId": "GetImageSetsByID", + "parameters": [ + { + "description": "Image Set ID", + "in": "path", + "name": "imageSetID", + "required": true, + "schema": { + "type": "integer" + } + }, + { + "description": "Define sort fields: created_at, updated_at, name. To sort DESC use -", + "in": "query", + "name": "sort_by", + "schema": { + "type": "string" + } + }, + { + "description": "field: filter by name", + "in": "query", + "name": "name", + "schema": { + "type": "string" + } + }, + { + "description": "field: filter by status", + "in": "query", + "name": "status", + "schema": { + "type": "string" + } + }, + { + "description": "field: filter by version", + "in": "query", + "name": "version", + "schema": { + "type": "string" + } + }, + { + "description": "field: return number of image-set view until limit is reached. Default is 100.", + "in": "query", + "name": "limit", + "schema": { + "type": "integer" + } + }, + { + "description": "field: return number of image-set view beginning at the offset.", + "in": "query", + "name": "offset", + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/models.ImageSetDetailsResponseAPI" + } + } + }, + "description": "OK" + }, + "400": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/errors.BadRequest" + } + } + }, + "description": "The request sent couldn't be processed." + }, + "404": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/errors.NotFound" + } + } + }, + "description": "image-set was not found." + }, + "500": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/errors.InternalServerError" + } + } + }, + "description": "There was an internal server error." + } + }, + "summary": "Get an image-set", + "tags": [ + "Image-Sets" + ] + } + }, + "/image-sets/{imageSetID}/devices": { + "get": { + "description": "Return device ids for an image set.", + "operationId": "GetImageSetsDevicesByID", + "parameters": [ + { + "description": "Identifier of the ImageSet", + "in": "path", + "name": "ImageSetId", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/models.ImageSetDevicesAPI" + } + } + }, + "description": "OK" + }, + "400": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/errors.BadRequest" + } + } + }, + "description": "The request sent couldn't be processed." + }, + "404": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/errors.NotFound" + } + } + }, + "description": "The Image Set ID was not found." + }, + "500": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/errors.InternalServerError" + } + } + }, + "description": "There was an internal server error." + } + }, + "summary": "Return device ids for an image set.", + "tags": [ + "Image-Sets" + ] + } + }, + "/images": { + "get": { + "description": "This is a placeholder description", + "operationId": "GetAllImages", + "parameters": [ + { + "description": "Return number of images until limit is reached.", + "in": "query", + "name": "limit", + "schema": { + "type": "integer" + } + }, + { + "description": "Return number of images beginning at the offset", + "in": "query", + "name": "offset", + "schema": { + "type": "integer" + } + }, + { + "description": "created_at, distribution, name,status. To sort DESC use -before the fields", + "in": "query", + "name": "sort_by", + "schema": { + "type": "string" + } + }, + { + "description": "Filter by name.", + "in": "query", + "name": "name", + "schema": { + "type": "string" + } + }, + { + "description": "Filter by status.", + "in": "query", + "name": "status", + "schema": { + "type": "string" + } + }, + { + "description": "Filter by distribution.", + "in": "query", + "name": "distribution", + "schema": { + "type": "string" + } + }, + { + "description": "Filter by creation date.", + "in": "query", + "name": "created_at", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/models.SuccessPlaceholderResponse" + } + } + }, + "description": "OK" + }, + "400": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/errors.BadRequest" + } + } + }, + "description": " The request sent couldn't be processed." + }, + "500": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/errors.InternalServerError" + } + } + }, + "description": "There was an internal server error." + } + }, + "summary": "Placeholder summary", + "tags": [ + "Images" + ] + }, + "post": { + "description": "Create an ostree commit and/or installer ISO", + "operationId": "createImage", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/models.CreateImageAPI" + } + } + }, + "description": "request body", + "required": true, + "x-originalParamName": "body" + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ImageResponse" + } + } + }, + "description": "OK" + }, + "400": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/errors.BadRequest" + } + } + }, + "description": "The request sent couldn't be processed." + }, + "500": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/errors.InternalServerError" + } + } + }, + "description": "There was an internal server error." + } + }, + "summary": "Create an image", + "tags": [ + "Images" + ] + } + }, + "/images/checkImageName": { + "post": { + "description": "Create an updated ostree commit", + "operationId": "CheckImageName", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/models.CreateImageAPI" + } + } + }, + "description": "request body", + "required": true, + "x-originalParamName": "body" + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/models.SuccessPlaceholderResponse" + } + } + }, + "description": "OK" + }, + "400": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/errors.BadRequest" + } + } + }, + "description": "The request sent couldn't be processed." + }, + "500": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/errors.InternalServerError" + } + } + }, + "description": "There was an internal server error." + } + }, + "summary": "Update an image", + "tags": [ + "Images" + ] + } + }, + "/images/{imageId}": { + "delete": { + "description": "This is a placeholder description", + "operationId": "DeleteImage", + "parameters": [ + { + "description": "Identifier of the ImageSet", + "in": "path", + "name": "imageSetID", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/models.SuccessPlaceholderResponse" + } + } + }, + "description": "OK" + }, + "400": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/errors.BadRequest" + } + } + }, + "description": "The request sent couldn't be processed." + }, + "500": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/errors.InternalServerError" + } + } + }, + "description": "There was an internal server error." + } + }, + "summary": "Placeholder summary", + "tags": [ + "Images" + ] + }, + "get": { + "description": "This is a placeholder description", + "operationId": "GetImageByID", + "parameters": [ + { + "description": "Image ID", + "in": "path", + "name": "imageId", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/models.SuccessPlaceholderResponse" + } + } + }, + "description": "OK" + }, + "400": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/errors.BadRequest" + } + } + }, + "description": "The request sent couldn't be processed." + }, + "500": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/errors.InternalServerError" + } + } + }, + "description": "There was an internal server error." + } + }, + "summary": "Placeholder summary", + "tags": [ + "Images" + ] + } + }, + "/images/{imageId}/details": { + "get": { + "description": "This is a placeholder description", + "operationId": "GetImageDetailsByID", + "parameters": [ + { + "description": "Image ID", + "in": "path", + "name": "imageId", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/models.SuccessPlaceholderResponse" + } + } + }, + "description": "OK" + }, + "400": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/errors.BadRequest" + } + } + }, + "description": "The request sent couldn't be processed." + }, + "500": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/errors.InternalServerError" + } + } + }, + "description": "There was an internal server error." + } + }, + "summary": "Placeholder summary", + "tags": [ + "Images" + ] + } + }, + "/images/{imageId}/installer": { + "post": { + "description": "This is a placeholder description", + "operationId": "CreateInstallerForImage", + "parameters": [ + { + "description": "Image ID", + "in": "path", + "name": "imageId", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/models.CreateImageAPI" + } + } + }, + "description": "request body", + "required": true, + "x-originalParamName": "body" + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/models.SuccessPlaceholderResponse" + } + } + }, + "description": "OK" + }, + "400": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/errors.BadRequest" + } + } + }, + "description": "The request sent couldn't be processed." + }, + "500": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/errors.InternalServerError" + } + } + }, + "description": "There was an internal server error." + } + }, + "summary": "Placeholder summary", + "tags": [ + "Images" + ] + } + }, + "/images/{imageId}/kickstart": { + "post": { + "description": "This is a placeholder description", + "operationId": "CreateKickStartForImage", + "parameters": [ + { + "description": "Image ID", + "in": "path", + "name": "imageId", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/models.CreateImageAPI" + } + } + }, + "description": "request body", + "required": true, + "x-originalParamName": "body" + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/models.SuccessPlaceholderResponse" + } + } + }, + "description": "OK" + }, + "400": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/errors.BadRequest" + } + } + }, + "description": "The request sent couldn't be processed." + }, + "500": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/errors.InternalServerError" + } + } + }, + "description": "There was an internal server error." + } + }, + "summary": "Placeholder summary", + "tags": [ + "Images" + ] + } + }, + "/images/{imageId}/metadata": { + "get": { + "description": "This is a placeholder description", + "operationId": "GetMetadataForImage", + "parameters": [ + { + "description": "Image ID", + "in": "path", + "name": "imageId", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/models.SuccessPlaceholderResponse" + } + } + }, + "description": "OK" + }, + "400": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/errors.BadRequest" + } + } + }, + "description": "The request sent couldn't be processed." + }, + "500": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/errors.InternalServerError" + } + } + }, + "description": "There was an internal server error." + } + }, + "summary": "Placeholder summary", + "tags": [ + "Images" + ] + } + }, + "/images/{imageId}/repo": { + "get": { + "description": "This is a placeholder description", + "operationId": "GetRepoForImage", + "parameters": [ + { + "description": "Image ID", + "in": "path", + "name": "imageId", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/models.SuccessPlaceholderResponse" + } + } + }, + "description": "OK" + }, + "400": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/errors.BadRequest" + } + } + }, + "description": "The request sent couldn't be processed." + }, + "500": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/errors.InternalServerError" + } + } + }, + "description": "There was an internal server error." + } + }, + "summary": "Placeholder summary", + "tags": [ + "Images" + ] + } + }, + "/images/{imageId}/retry": { + "post": { + "description": "Create an updated ostree commit", + "operationId": "RetryCreateImage", + "parameters": [ + { + "description": "Image ID", + "in": "path", + "name": "imageId", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/models.CreateImageAPI" + } + } + }, + "description": "request body", + "required": true, + "x-originalParamName": "body" + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/models.SuccessPlaceholderResponse" + } + } + }, + "description": "Retry is being processed" + }, + "500": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/errors.InternalServerError" + } + } + }, + "description": "There was an internal server error." + } + }, + "summary": "Retries building an image from scratch", + "tags": [ + "Images" + ] + } + }, + "/images/{imageId}/status": { + "get": { + "description": "This is a placeholder description", + "operationId": "GetImageStatusByID", + "parameters": [ + { + "description": "Image Identifier", + "in": "path", + "name": "imageId", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/models.SuccessPlaceholderResponse" + } + } + }, + "description": "OK" + }, + "400": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/errors.BadRequest" + } + } + }, + "description": "The request sent couldn't be processed." + }, + "500": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/errors.InternalServerError" + } + } + }, + "description": "There was an internal server error." + } + }, + "summary": "Placeholder summary", + "tags": [ + "Images" + ] + } + }, + "/images/{imageId}/update": { + "post": { + "description": "Create an updated ostree commit", + "operationId": "CreateImageUpdate", + "parameters": [ + { + "description": "Image ID", + "in": "path", + "name": "imageId", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/models.CreateImageAPI" + } + } + }, + "description": "request body", + "required": true, + "x-originalParamName": "body" + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/models.SuccessPlaceholderResponse" + } + } + }, + "description": "OK" + }, + "400": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/errors.BadRequest" + } + } + }, + "description": "The request sent couldn't be processed." + }, + "500": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/errors.InternalServerError" + } + } + }, + "description": "There was an internal server error." + } + }, + "summary": "Update an image", + "tags": [ + "Images" + ] + } + }, + "/images/{ostreeCommitHash}/info": { + "get": { + "description": "This is a placeholder description", + "operationId": "GetImageByOstree", + "parameters": [ + { + "description": "Ostree Commit Hash", + "in": "path", + "name": "ostreeCommitHash", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/models.SuccessPlaceholderResponse" + } + } + }, + "description": "OK" + }, + "400": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/errors.BadRequest" + } + } + }, + "description": "The request sent couldn't be processed." + }, + "500": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/errors.InternalServerError" + } + } + }, + "description": "There was an internal server error." + } + }, + "summary": "Placeholder summary", + "tags": [ + "Images" + ] + } + }, + "/inventory-groups/{GroupUUID}/update-info": { + "get": { + "description": "Gets the inventory group update info", + "operationId": "GetInventoryGroupDevicesUpdateInfo", + "parameters": [ + { + "description": "a unique uuid to identify the inventory group", + "in": "path", + "name": "GroupUUID", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/models.InventoryGroupDevicesUpdateInfoResponseAPI" + } + } + }, + "description": "The requested inventory group update info" + }, + "400": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/errors.BadRequest" + } + } + }, + "description": "The request sent couldn't be processed" + }, + "404": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/errors.NotFound" + } + } + }, + "description": "The requested inventory group was not found" + }, + "500": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/errors.InternalServerError" + } + } + }, + "description": "There was an internal server error" + } + }, + "summary": "Gets the inventory group update info", + "tags": [ + "Updates (Systems)" + ] + } + }, + "/storage/images-repos/{imageID}/content/{repoFilePath}": { + "get": { + "description": "Redirect request to a signed and valid url for an image commit repository from the path content", + "operationId": "RedirectSignedImageCommitRepository", + "parameters": [ + { + "description": "Id to identify Image", + "in": "path", + "name": "imageID", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "path to file repository", + "in": "path", + "name": "repoFilePath", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "303": { + "content": { + "application/json": { + "schema": { + "type": "string" + } + } + }, + "description": "See Other" + }, + "400": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/errors.BadRequest" + } + } + }, + "description": "Bad Request" + }, + "404": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/errors.NotFound" + } + } + }, + "description": "Not Found" + }, + "500": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/errors.InternalServerError" + } + } + }, + "description": "Internal Server Error" + } + }, + "summary": "redirect to a signed url of an image commit repository path content", + "tags": [ + "Storage" + ] + } + }, + "/storage/images-repos/{imageID}/{repoFilePath}": { + "get": { + "description": "Bring the content for a image commit in a repository path", + "operationId": "ContentImageCommitRepositoryPath", + "parameters": [ + { + "description": "Id to identify Image", + "in": "path", + "name": "imageID", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "path to file repository", + "in": "path", + "name": "repoFilePath", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/octet-stream": { + "schema": { + "type": "string" + } + } + }, + "description": "Stream object from file content" + }, + "400": { + "content": { + "application/octet-stream": { + "schema": { + "$ref": "#/components/schemas/errors.BadRequest" + } + } + }, + "description": "Bad Request" + }, + "404": { + "content": { + "application/octet-stream": { + "schema": { + "$ref": "#/components/schemas/errors.NotFound" + } + } + }, + "description": "Not Found" + }, + "500": { + "content": { + "application/octet-stream": { + "schema": { + "$ref": "#/components/schemas/errors.InternalServerError" + } + } + }, + "description": "Internal Server Error" + } + }, + "summary": "return the content of an image commit repository path", + "tags": [ + "Storage" + ] + } + }, + "/storage/isos/{installerID}/": { + "get": { + "description": "This method will redirect request to a signed installer iso url", + "operationId": "RedirectSignedInstaller", + "parameters": [ + { + "description": "Installer ID", + "in": "path", + "name": "installerID", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "303": { + "content": { + "application/octet-stream": { + "schema": { + "type": "string" + } + } + }, + "description": "URL to redirect" + }, + "400": { + "content": { + "application/octet-stream": { + "schema": { + "$ref": "#/components/schemas/errors.BadRequest" + } + } + }, + "description": "The request send couln't be processed." + }, + "404": { + "content": { + "application/octet-stream": { + "schema": { + "$ref": "#/components/schemas/errors.NotFound" + } + } + }, + "description": "installer not found." + }, + "500": { + "content": { + "application/octet-stream": { + "schema": { + "$ref": "#/components/schemas/errors.InternalServerError" + } + } + }, + "description": "Internal Server Error" + } + }, + "summary": "Redirect to a signed installer", + "tags": [ + "Storage" + ] + } + }, + "/storage/update-repos/{updateTransactionID}/content/{repoFilePath}": { + "get": { + "description": "Method will redirect to asigned url of an update-transaction based on repository content", + "operationId": "RedirectUpdateTransactionRepositoryPath", + "parameters": [ + { + "description": "id for update transaction id", + "in": "path", + "name": "updateTransactionID", + "required": true, + "schema": { + "type": "integer" + } + }, + { + "description": "path to repository to be checked", + "in": "path", + "name": "repoFilePath", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "303": { + "content": { + "application/octet-stream": { + "schema": { + "type": "string" + } + } + }, + "description": "URL signed to be redirect" + }, + "400": { + "content": { + "application/octet-stream": { + "schema": { + "$ref": "#/components/schemas/errors.BadRequest" + } + } + }, + "description": "Bad Request" + }, + "404": { + "content": { + "application/octet-stream": { + "schema": { + "$ref": "#/components/schemas/errors.NotFound" + } + } + }, + "description": "Not Found" + }, + "500": { + "content": { + "application/octet-stream": { + "schema": { + "$ref": "#/components/schemas/errors.InternalServerError" + } + } + }, + "description": "Internal Server Error" + } + }, + "summary": "redirect to a signed url of an update-transaction repository path content", + "tags": [ + "Storage" + ] + } + }, + "/storage/update-repos/{updateTransactionID}/{repoFilePath}": { + "get": { + "description": "Request will get access to content of an update-transaction file based on the path", + "operationId": "RedirectUpdateTransactionRepositoryContent", + "parameters": [ + { + "description": "Update Transaction Id", + "in": "path", + "name": "updateTransactionID", + "required": true, + "schema": { + "type": "integer" + } + }, + { + "description": "path for repository file", + "in": "path", + "name": "repoFilePath", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "content": { + "application/octet-stream": { + "schema": { + "type": "string" + } + } + }, + "description": "Stream object from file content" + }, + "400": { + "content": { + "application/octet-stream": { + "schema": { + "$ref": "#/components/schemas/errors.BadRequest" + } + } + }, + "description": "Bad Request" + }, + "404": { + "content": { + "application/octet-stream": { + "schema": { + "$ref": "#/components/schemas/errors.NotFound" + } + } + }, + "description": "Not Found" + }, + "500": { + "content": { + "application/octet-stream": { + "schema": { + "$ref": "#/components/schemas/errors.InternalServerError" + } + } + }, + "description": "Internal Server Error" + } + }, + "summary": "Return the content od an update-transaction repository path", + "tags": [ + "Storage" + ] + } + }, + "/thirdpartyrepo": { + "get": { + "description": "Lists all Third Party Repository for an account.", + "operationId": "GetAllThirdPartyRepo", + "parameters": [ + { + "description": "fields: created_at, name, updated_at. To sort DESC use - before the fields.", + "in": "query", + "name": "sort_by", + "schema": { + "type": "string" + } + }, + { + "description": "field: filter by name", + "in": "query", + "name": "name", + "schema": { + "type": "string" + } + }, + { + "description": "field: filter by creation date", + "in": "query", + "name": "created_at", + "schema": { + "type": "string" + } + }, + { + "description": "field: filter by update date", + "in": "query", + "name": "updated_at", + "schema": { + "type": "string" + } + }, + { + "description": "field: return number of repositories until limit is reached.", + "in": "query", + "name": "limit", + "schema": { + "type": "integer" + } + }, + { + "description": "field: return number of repositories beginning at the offset.", + "in": "query", + "name": "offset", + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ThirdPartyRepoList" + } + } + }, + "description": "The list of third party repositories response" + }, + "400": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/errors.BadRequest" + } + } + }, + "description": "The request sent couldn't be processed." + }, + "500": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/errors.InternalServerError" + } + } + }, + "description": "There was an internal server error." + } + }, + "summary": "Lists all Third Party Repository for an account.", + "tags": [ + "Third Party Repo" + ] + }, + "post": { + "description": "Create Third Party Repository for an account.", + "operationId": "CreateThirdPartyRepo", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ThirdPartyRepo" + } + } + }, + "description": "the third party repository to create", + "required": true, + "x-originalParamName": "body" + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ThirdPartyRepo" + } + } + }, + "description": "The created third party repository" + }, + "400": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/errors.BadRequest" + } + } + }, + "description": "The request sent couldn't be processed." + }, + "500": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/errors.InternalServerError" + } + } + }, + "description": "There was an internal server error." + } + }, + "summary": "Create Third Party Repository for an account.", + "tags": [ + "Third Party Repo" + ] + } + }, + "/thirdpartyrepo/checkName/{name}": { + "get": { + "description": "Checks to see if a ThirdParty repo Name exists.", + "operationId": "CheckThirdPartyRepoName", + "parameters": [ + { + "description": "ThirdParty repo Name", + "in": "path", + "name": "name", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CheckThirdPartyRepoName" + } + } + }, + "description": "The third party repository name check result" + }, + "400": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/errors.BadRequest" + } + } + }, + "description": "The request sent couldn't be processed." + }, + "500": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/errors.InternalServerError" + } + } + }, + "description": "There was an internal server error." + } + }, + "summary": "Checks to see if a ThirdParty repo Name exists.", + "tags": [ + "Third Party Repo" + ] + } + }, + "/thirdpartyrepo/{ID}": { + "delete": { + "description": "Delete third party repository using id.", + "operationId": "DeleteThirdPartyRepoByID", + "parameters": [ + { + "description": "An unique existing third party repository id.", + "in": "query", + "name": "ID", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ThirdPartyRepo" + } + } + }, + "description": "The deleted third party repository." + }, + "400": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/errors.BadRequest" + } + } + }, + "description": "The request sent couldn't be processed." + }, + "404": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/errors.NotFound" + } + } + }, + "description": "The third party repository was not found." + }, + "500": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/errors.InternalServerError" + } + } + }, + "description": "There was an internal server error." + } + }, + "summary": "Delete third party repository using id.", + "tags": [ + "Third Party Repo" + ] + }, + "get": { + "description": "Get third party repository by id.", + "operationId": "GetThirdPartyRepoByID", + "parameters": [ + { + "description": "An unique existing third party repository id.", + "in": "query", + "name": "ID", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ThirdPartyRepo" + } + } + }, + "description": "The requested third party repository." + }, + "400": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/errors.BadRequest" + } + } + }, + "description": "The request sent couldn't be processed." + }, + "404": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/errors.NotFound" + } + } + }, + "description": "The third party repository was not found." + }, + "500": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/errors.InternalServerError" + } + } + }, + "description": "There was an internal server error." + } + }, + "summary": "Get third party repository by id.", + "tags": [ + "Third Party Repo" + ] + }, + "put": { + "description": "Creates an Update for third party repository", + "operationId": "CreateThirdPartyRepoUpdate", + "parameters": [ + { + "description": "An unique existing third party repository id.", + "in": "query", + "name": "ID", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ThirdPartyRepo" + } + } + }, + "description": "The third party repository update data", + "required": true, + "x-originalParamName": "body" + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ThirdPartyRepo" + } + } + }, + "description": "The updated third party repository." + }, + "400": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/errors.BadRequest" + } + } + }, + "description": "The request sent couldn't be processed." + }, + "404": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/errors.NotFound" + } + } + }, + "description": "The third party repository was not found." + }, + "500": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/errors.InternalServerError" + } + } + }, + "description": "There was an internal server error." + } + }, + "summary": "Creates an Update for third party repository", + "tags": [ + "Third Party Repo" + ] + } + }, + "/updates": { + "get": { + "description": "Gets all device updates", + "operationId": "ListUpdates", + "parameters": [ + { + "description": "field: return number of updates until limit is reached. Default is 30.", + "in": "query", + "name": "limit", + "schema": { + "type": "integer" + } + }, + { + "description": "field: return updates beginning at the given offset.", + "in": "query", + "name": "offset", + "schema": { + "type": "integer" + } + }, + { + "description": "fields: created_at, updated_at. To sort DESC use - before the fields.", + "in": "query", + "name": "sort_by", + "schema": { + "type": "string" + } + }, + { + "description": "field: filter by status", + "in": "query", + "name": "status", + "schema": { + "type": "string" + } + }, + { + "description": "field: filter by creation date", + "in": "query", + "name": "created_at", + "schema": { + "type": "string" + } + }, + { + "description": "field: filter by update date", + "in": "query", + "name": "updated_at", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "items": { + "$ref": "#/components/schemas/Update" + }, + "type": "array" + } + } + }, + "description": "List of devices updates" + }, + "400": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/errors.BadRequest" + } + } + }, + "description": "The request sent couldn't be processed." + }, + "500": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/errors.InternalServerError" + } + } + }, + "description": "There was an internal server error." + } + }, + "summary": "Gets all device updates", + "tags": [ + "Updates (Systems)" + ] + }, + "post": { + "description": "Executes a device update", + "operationId": "UpdateDevice", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DevicesUpdate" + } + } + }, + "description": "devices uuids to update and optional target commit id", + "required": true, + "x-originalParamName": "body" + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Update" + } + } + }, + "description": "The created device update" + }, + "400": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/errors.BadRequest" + } + } + }, + "description": "The request sent couldn't be processed" + }, + "500": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/errors.InternalServerError" + } + } + }, + "description": "There was an internal server error" + } + }, + "summary": "Executes a device update", + "tags": [ + "Updates (Systems)" + ] + } + }, + "/updates/device/{DeviceUUID}/updates": { + "get": { + "description": "Return list of available updates for a device.", + "operationId": "GetUpdateAvailableForDevice", + "parameters": [ + { + "description": "DeviceUUID", + "in": "path", + "name": "DeviceUUID", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "query the latest or all updates", + "in": "query", + "name": "latest", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/models.Image" + } + } + }, + "description": "OK" + }, + "400": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/errors.BadRequest" + } + } + }, + "description": "The request sent couldn't be processed." + }, + "500": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/errors.InternalServerError" + } + } + }, + "description": "There was an internal server error." + } + }, + "summary": "Return list of available updates for a device.", + "tags": [ + "Devices (Systems)" + ] + } + }, + "/updates/validate": { + "post": { + "description": "Validate if the images selection could be updated", + "operationId": "PostValidateUpdate", + "requestBody": { + "content": { + "application/json": { + "schema": { + "items": { + "$ref": "#/components/schemas/ImageValidationRequest" + }, + "type": "array" + } + } + }, + "description": "request body", + "required": true, + "x-originalParamName": "body" + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ImageValidationResponse" + } + } + }, + "description": "the validation result" + }, + "400": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/errors.BadRequest" + } + } + }, + "description": "The request sent couldn't be processed" + }, + "500": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/errors.InternalServerError" + } + } + }, + "description": "There was an internal server error" + } + }, + "summary": "Validate if the images selection could be updated", + "tags": [ + "Updates (Systems)" + ] + } + }, + "/updates/{updateID}": { + "get": { + "description": "Gets a single requested update.", + "operationId": "GetUpdate", + "parameters": [ + { + "description": "a unique ID to identify the update", + "in": "path", + "name": "updateID", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Update" + } + } + }, + "description": "The requested update" + }, + "400": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/errors.BadRequest" + } + } + }, + "description": "The request sent couldn't be processed" + }, + "404": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/errors.NotFound" + } + } + }, + "description": "The requested update was not found" + }, + "500": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/errors.InternalServerError" + } + } + }, + "description": "There was an internal server error" + } + }, + "summary": "Gets a single requested update", + "tags": [ + "Updates (Systems)" + ] + } + }, + "/updates/{updateID}/notify": { + "get": { + "description": "Send a notification for a device update", + "operationId": "SendNotificationForDevice", + "parameters": [ + { + "description": "a unique ID to identify the update", + "in": "path", + "name": "updateID", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DeviceNotification" + } + } + }, + "description": "The notification payload" + }, + "400": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/errors.BadRequest" + } + } + }, + "description": "The request sent couldn't be processed" + }, + "404": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/errors.NotFound" + } + } + }, + "description": "The requested update was not found" + }, + "500": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/errors.InternalServerError" + } + } + }, + "description": "There was an internal server error" + } + }, + "summary": "Send a notification for a device update", + "tags": [ + "Updates (Systems)" + ] + } + }, + "/updates/{updateID}/update-playbook.yml": { + "get": { + "description": "returns the update transaction playbook used for system update", + "operationId": "GetUpdatePlaybook", + "parameters": [ + { + "description": "a unique ID to identify the update the playbook belongs to", + "in": "path", + "name": "updateID", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "content": { + "text/plain": { + "schema": { + "type": "string" + } + } + }, + "description": "the playbook file content for an update" + }, + "400": { + "content": { + "text/plain": { + "schema": { + "$ref": "#/components/schemas/errors.BadRequest" + } + } + }, + "description": "The request sent couldn't be processed." + }, + "404": { + "content": { + "text/plain": { + "schema": { + "$ref": "#/components/schemas/errors.NotFound" + } + } + }, + "description": "the device update was not found" + }, + "500": { + "content": { + "text/plain": { + "schema": { + "$ref": "#/components/schemas/errors.InternalServerError" + } + } + }, + "description": "There was an internal server error." + } + }, + "summary": "returns the playbook yaml file for a system update", + "tags": [ + "Updates (Systems)" + ] + } + } } - } -} +} \ No newline at end of file diff --git a/api/schema/imageBuilder.yaml b/api/schema/imageBuilder.yaml index e458566d..7e3985ed 100644 --- a/api/schema/imageBuilder.yaml +++ b/api/schema/imageBuilder.yaml @@ -1271,6 +1271,7 @@ components: - guest-image - image-installer - oci + - openshift-virt - vsphere - vsphere-ova - wsl @@ -1483,7 +1484,7 @@ components: properties: ansible_controller_url: type: string - example: "example.towerhost.net" + example: "https://aap-gw.example.com" job_template_id: type: integer example: 38 @@ -1557,6 +1558,7 @@ components: required: - packages - recommendedPackages + - distribution type: object properties: packages: @@ -1569,8 +1571,7 @@ components: default: 3 distribution: type: string - description: RHEL major release (e.g. "rhel8", "rhel9", "rhel10") - example: "rhel9" + pattern: '^rhel\d+$' RecommendationsResponse: required: - packages @@ -1582,8 +1583,6 @@ components: type: string modelVersion: type: string - description: Version of the recommendation model used - example: "rpm_rex_42" ClonesResponse: required: - meta diff --git a/api/schema/provisioning.json b/api/schema/provisioning.json index 5a6fda8a..e9864c2b 100644 --- a/api/schema/provisioning.json +++ b/api/schema/provisioning.json @@ -28,8 +28,10 @@ "instances": [ { "detail": { - "publicdns": "", - "publicipv4": "10.0.0.88" + "privateipv4": "172.31.36.10", + "privateipv6": "2001:0db8:85a3:0000:0000:8a2e:0370:7334", + "publicdns": "ec2-184-73-141-211.compute-1.amazonaws.com", + "publicipv4": "184.73.141.211" }, "instance_id": "i-2324343212" } @@ -68,6 +70,7 @@ "name": "my-instance", "poweroff": false, "pubkey_id": 42, + "resource_group": "redhat-hcc", "source_id": "654321" } }, @@ -79,6 +82,8 @@ "instances": [ { "detail": { + "privateipv4": "172.22.0.1", + "privateipv6": "", "publicdns": "", "publicipv4": "10.0.0.88" }, @@ -90,6 +95,7 @@ "poweroff": false, "pubkey_id": 42, "reservation_id": 1310, + "resource_group": "myCustom Azure RG", "source_id": "654321" } }, @@ -104,6 +110,7 @@ "poweroff": false, "pubkey_id": 42, "reservation_id": 1310, + "resource_group": "myCustom Azure RG", "source_id": "654321" } }, @@ -128,6 +135,8 @@ "instances": [ { "detail": { + "privateipv4": "10.198.0.2", + "privateipv6": "", "publicdns": "", "publicipv4": "10.0.0.88" }, @@ -229,7 +238,14 @@ "steps": 3, "success": false } - ] + ], + "metadata": { + "links": { + "next": "", + "previous": "" + }, + "total": 3 + } } }, "v1.GenericReservationResponsePayloadPendingExample": { @@ -324,7 +340,14 @@ "id": "lt-9843797432897342", "name": "XXL large backend API" } - ] + ], + "metadata": { + "links": { + "next": "", + "previous": "" + }, + "total": 0 + } } }, "v1.NoopReservationResponsePayloadExample": { @@ -339,11 +362,18 @@ "body": "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIEhnn80ZywmjeBFFOGm+cm+5HUwm62qTVnjKlOdYFLHN lzap", "fingerprint": "gL/y6MvNmJ8jDXtsL/oMmK8jUuIefN39BBuvYw/Rndk=", "fingerprint_legacy": "ee:f1:d4:62:99:ab:17:d9:3b:00:66:62:32:b2:55:9e", - "id": 1, + "id": 3, "name": "My key", "type": "ssh-ed25519" } - ] + ], + "metadata": { + "links": { + "next": "", + "previous": "/api/provisioning/v1/pubkeys?limit=2\u0026offset=0" + }, + "total": 3 + } } }, "v1.PubkeyRequestExample": { @@ -368,16 +398,27 @@ { "id": "654321", "name": "My AWS account", + "provider": "aws", "source_type_id": "", + "status": "available", "uid": "" }, { "id": "543621", "name": "My other AWS account", + "provider": "aws", "source_type_id": "", + "status": "available", "uid": "" } - ] + ], + "metadata": { + "links": { + "next": "", + "previous": "/api/provisioning/v1/sources?limit=2\u0026offset=0" + }, + "total": 4 + } } }, "v1.SourceUploadInfoAWSResponse": { @@ -406,6 +447,35 @@ } } }, + "parameters": { + "Limit": { + "description": "The number of items to return.", + "in": "query", + "name": "limit", + "schema": { + "default": 100, + "type": "integer" + } + }, + "Offset": { + "description": "The number of items to skip before starting to collect the result set.", + "in": "query", + "name": "offset", + "schema": { + "default": 0, + "type": "integer" + } + }, + "Token": { + "description": "The token used for requesting the next page of results; empty token for the first page", + "in": "query", + "name": "token", + "schema": { + "default": "", + "type": "string" + } + } + }, "responses": { "BadRequest": { "content": { @@ -529,6 +599,12 @@ "properties": { "detail": { "properties": { + "private_ipv4": { + "type": "string" + }, + "private_ipv6": { + "type": "string" + }, "public_dns": { "type": "string" }, @@ -557,6 +633,7 @@ }, "pubkey_id": { "format": "int64", + "nullable": true, "type": "integer" }, "region": { @@ -575,6 +652,7 @@ "v1.AccountIDTypeResponse": { "properties": { "aws": { + "nullable": true, "properties": { "account_id": { "type": "string" @@ -606,9 +684,11 @@ "type": "string" }, "location": { + "description": "Location (also known as region) to deploy the VM into, be aware it needs to be the same as the image location. Defaults to the Resource Group location, or 'eastus' when also creating the resource group.", "type": "string" }, "name": { + "description": "Name of the instance, to keep names unique, it will be suffixed with UUID. Optional, defaults to 'redhat-vm''", "type": "string" }, "poweroff": { @@ -618,6 +698,10 @@ "format": "int64", "type": "integer" }, + "resource_group": { + "description": "Azure resource group name to deploy the VM resources into. Optional, defaults to images resource group and when not found to 'redhat-deployed'.", + "type": "string" + }, "source_id": { "type": "string" } @@ -641,6 +725,12 @@ "properties": { "detail": { "properties": { + "private_ipv4": { + "type": "string" + }, + "private_ipv6": { + "type": "string" + }, "public_dns": { "type": "string" }, @@ -669,12 +759,16 @@ }, "pubkey_id": { "format": "int64", + "nullable": true, "type": "integer" }, "reservation_id": { "format": "int64", "type": "integer" }, + "resource_group": { + "type": "string" + }, "source_id": { "type": "string" } @@ -732,6 +826,12 @@ "properties": { "detail": { "properties": { + "private_ipv4": { + "type": "string" + }, + "private_ipv6": { + "type": "string" + }, "public_dns": { "type": "string" }, @@ -763,6 +863,7 @@ }, "pubkey_id": { "format": "int64", + "nullable": true, "type": "integer" }, "reservation_id": { @@ -829,6 +930,7 @@ "type": "string" }, "azure": { + "nullable": true, "properties": { "gen_v1": { "type": "boolean" @@ -879,6 +981,7 @@ "properties": { "data": { "items": { + "nullable": true, "properties": { "created_at": { "format": "date-time", @@ -924,6 +1027,25 @@ "type": "object" }, "type": "array" + }, + "metadata": { + "properties": { + "links": { + "properties": { + "next": { + "type": "string" + }, + "previous": { + "type": "string" + } + }, + "type": "object" + }, + "total": { + "type": "integer" + } + }, + "type": "object" } }, "type": "object" @@ -932,11 +1054,13 @@ "properties": { "data": { "items": { + "nullable": true, "properties": { "architecture": { "type": "string" }, "azure": { + "nullable": true, "properties": { "gen_v1": { "type": "boolean" @@ -981,6 +1105,7 @@ "properties": { "data": { "items": { + "nullable": true, "properties": { "id": { "type": "string" @@ -992,6 +1117,25 @@ "type": "object" }, "type": "array" + }, + "metadata": { + "properties": { + "links": { + "properties": { + "next": { + "type": "string" + }, + "previous": { + "type": "string" + } + }, + "type": "object" + }, + "total": { + "type": "integer" + } + }, + "type": "object" } }, "type": "object" @@ -1000,6 +1144,7 @@ "properties": { "data": { "items": { + "nullable": true, "properties": { "body": { "type": "string" @@ -1024,6 +1169,25 @@ "type": "object" }, "type": "array" + }, + "metadata": { + "properties": { + "links": { + "properties": { + "next": { + "type": "string" + }, + "previous": { + "type": "string" + } + }, + "type": "object" + }, + "total": { + "type": "integer" + } + }, + "type": "object" } }, "type": "object" @@ -1032,6 +1196,7 @@ "properties": { "data": { "items": { + "nullable": true, "properties": { "id": { "type": "string" @@ -1039,7 +1204,15 @@ "name": { "type": "string" }, + "provider": { + "description": "One of ('azure', 'aws', 'gcp')", + "type": "string" + }, "source_type_id": { + "deprecated": true, + "type": "string" + }, + "status": { "type": "string" }, "uid": { @@ -1049,6 +1222,25 @@ "type": "object" }, "type": "array" + }, + "metadata": { + "properties": { + "links": { + "properties": { + "next": { + "type": "string" + }, + "previous": { + "type": "string" + } + }, + "type": "object" + }, + "total": { + "type": "integer" + } + }, + "type": "object" } }, "type": "object" @@ -1065,9 +1257,11 @@ "v1.PubkeyRequest": { "properties": { "body": { + "description": "Add a public part of a SSH key pair.", "type": "string" }, "name": { + "description": "Enter the name of the newly created pubkey.", "type": "string" } }, @@ -1131,7 +1325,15 @@ "name": { "type": "string" }, + "provider": { + "description": "One of ('azure', 'aws', 'gcp')", + "type": "string" + }, "source_type_id": { + "deprecated": true, + "type": "string" + }, + "status": { "type": "string" }, "uid": { @@ -1186,7 +1388,7 @@ "name": "GPL-3.0" }, "title": "provisioning-api", - "version": "1.4.0" + "version": "1.13.0" }, "openapi": "3.0.0", "paths": { @@ -1219,7 +1421,7 @@ } }, "tags": [ - "AvailabilityStatus" + "Source" ] } }, @@ -1288,8 +1490,16 @@ }, "/pubkeys": { "get": { - "description": "A pubkey represents an SSH public portion of a key pair with name and body. This operation returns list of all pubkeys for particular account.\n", + "description": "Returns a list of all public keys available in a particular account.\n", "operationId": "getPubkeyList", + "parameters": [ + { + "$ref": "#/components/parameters/Limit" + }, + { + "$ref": "#/components/parameters/Offset" + } + ], "responses": { "200": { "content": { @@ -1304,7 +1514,7 @@ } } }, - "description": "Returned on success." + "description": "OK. Returned on success." }, "500": { "$ref": "#/components/responses/InternalError" @@ -1315,7 +1525,7 @@ ] }, "post": { - "description": "A pubkey represents an SSH public portion of a key pair with name and body. When pubkey is created, it is stored in the Provisioning database. Pubkeys are uploaded to clouds when an instance is launched. Some fields (e.g. type or fingerprint) are read only.\n", + "description": "Creates a new public key and stores it in the provisioning database. Public keys are uploaded to clouds at the time of launching an instance. Some fields such as type or fingerprint are read-only.\n", "operationId": "createPubkey", "requestBody": { "content": { @@ -1347,7 +1557,7 @@ } } }, - "description": "Returned on success." + "description": "OK. Returned on success." }, "500": { "$ref": "#/components/responses/InternalError" @@ -1360,11 +1570,11 @@ }, "/pubkeys/{ID}": { "delete": { - "description": "A pubkey represents an SSH public portion of a key pair with name and body. If a pubkey was uploaded to one or more clouds, the deletion request will attempt to delete those SSH keys from all clouds. This means in order to delete a pubkey the account must have valid credentials to all cloud accounts the pubkey was uploaded to, otherwise the delete operation will fail and the pubkey will not be deleted from Provisioning database. This operation returns no body.\n", + "description": "Deletes SSH keys that were uploaded with the specified public key from all the clouds. If a public key (pubkey) has been uploaded to one or more cloud providers, the deletion request attempts to remove those SSH keys from all associated clouds. Therefore, to delete a public key, the account must possess valid credentials for all cloud accounts to which the pubkey was uploaded. Otherwise, the delete operation fails, and the public key is not removed from the Provisioning database. This operation does not return a response body.\n", "operationId": "removePubkeyById", "parameters": [ { - "description": "Database ID of resource.", + "description": "Enter the database ID of resource.", "in": "path", "name": "ID", "required": true, @@ -1390,7 +1600,7 @@ ] }, "get": { - "description": "A pubkey represents an SSH public portion of a key pair with name and body. Pubkeys must have unique name and body (SSH public key fingerprint) per each account. Pubkey type is detected during create operation as well as fingerprints. Currently two types are supported: RSA and ssh-ed25519. Also, two fingerprint types are calculated: standard SHA fingerprint and legacy MD5 fingerprint available under fingerprint_legacy field. Fingerprints are used to check uniqueness of key.\n", + "description": "Gets details of the specified public key.", "operationId": "getPubkeyById", "parameters": [ { @@ -1418,7 +1628,7 @@ } } }, - "description": "Returned on success" + "description": "OK. Returned on success" }, "404": { "$ref": "#/components/responses/NotFound" @@ -1436,6 +1646,14 @@ "get": { "description": "A reservation is a way to activate a job, keeps all data needed for a job to start. This operation returns list of all reservations for particular account. To get a reservation with common fields, use /reservations/ID. To get a detailed reservation with all fields which are different per provider, use /reservations/aws/ID. Reservation can be in three states: pending, success, failed. This can be recognized by the success field (null for pending, true for success, false for failure). See the examples.\n", "operationId": "getReservationsList", + "parameters": [ + { + "$ref": "#/components/parameters/Limit" + }, + { + "$ref": "#/components/parameters/Offset" + } + ], "responses": { "200": { "content": { @@ -1637,7 +1855,7 @@ }, "/reservations/gcp": { "post": { - "description": "A reservation is a way to activate a job, keeps all data needed for a job to start. A GCP reservation is a reservation created for a GCP job. Image Builder UUID image is required and needs to be shared with the service account. Furthermore, by specifying the name pattern for example as \"instance\", instances names will be created in the format: \"instance-#####\". A single account can create maximum of 2 reservations per second.\n", + "description": "A reservation is a way to activate a job, keeps all data needed for a job to start. A GCP reservation is a reservation created for a GCP job. Image Builder UUID image is required and needs to be shared with the service account. Furthermore, by specifying the RFC-1035 compatible name pattern for example as \"instance\", instances names will be created in the format: \"instance-#####\". A single account can create maximum of 2 reservations per second.\n", "operationId": "createGCPReservation", "requestBody": { "content": { @@ -1804,6 +2022,12 @@ ], "type": "string" } + }, + { + "$ref": "#/components/parameters/Limit" + }, + { + "$ref": "#/components/parameters/Offset" } ], "responses": { @@ -1831,98 +2055,9 @@ ] } }, - "/sources/{ID}/account_identity": { - "get": { - "deprecated": true, - "description": "This endpoint is deprecated. Please use upload_info instead", - "operationId": "getSourceAccountIdentity", - "parameters": [ - { - "description": "Source ID from Sources Database", - "in": "path", - "name": "ID", - "required": true, - "schema": { - "format": "int64", - "type": "integer" - } - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/v1.AccountIDTypeResponse" - } - } - }, - "description": "Return on success." - }, - "404": { - "$ref": "#/components/responses/NotFound" - }, - "500": { - "$ref": "#/components/responses/InternalError" - } - }, - "tags": [ - "Source" - ] - } - }, - "/sources/{ID}/instance_types": { - "get": { - "deprecated": true, - "description": "Deprecated endpoint, use /instance_types instead.", - "operationId": "getInstanceTypeList", - "parameters": [ - { - "description": "Source ID from Sources Database", - "in": "path", - "name": "ID", - "required": true, - "schema": { - "format": "int64", - "type": "integer" - } - }, - { - "description": "Hyperscaler region", - "in": "query", - "name": "region", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/v1.ListInstaceTypeResponse" - } - } - }, - "description": "Return on success." - }, - "404": { - "$ref": "#/components/responses/NotFound" - }, - "500": { - "$ref": "#/components/responses/InternalError" - } - }, - "tags": [ - "Source" - ] - } - }, "/sources/{ID}/launch_templates": { "get": { - "description": "Return a list of launch templates.\nA launch template is a configuration set with a name that is available through hyperscaler API. When creating reservations, launch template can be provided in order to set additional configuration for instances.\nCurrently only AWS Launch Templates are supported.\n", + "description": "Return a list of launch templates.\nA launch template is a configuration set with a name that is available through hyperscaler API. When creating reservations, launch template can be provided in order to set additional configuration for instances. In GCP, when using templates, propagated user attributes are not overridden or updated. Only new attributes are added to the instance.\nCurrently AWS and GCP Launch Templates are supported.\n", "operationId": "getLaunchTemplatesList", "parameters": [ { @@ -1943,6 +2078,12 @@ "schema": { "type": "string" } + }, + { + "$ref": "#/components/parameters/Token" + }, + { + "$ref": "#/components/parameters/Limit" } ], "responses": { @@ -2037,8 +2178,16 @@ ], "tags": [ { - "description": "Public SSH keys operations", + "description": "A pubkey represents the SSH public portion of a key pair with a name and body. Public key types and fingerprints are detected during their creation process. Two types are supported: RSA and ssh-ed25519. Fingerprints are calculated in two ways: using the standard SHA method and the legacy MD5 method, which is available under the fingerprint_legacy field. Each public key has a unique name and body and helps in verifying the uniqueness of the keys. Using this API, you can perform the following operations.\n", "name": "Pubkey" + }, + { + "description": "A reservation represents a request for launching one or more instances from a single image. This reservation triggers a background job, that will Launch set amount of instances with the same configuration. The configuration decides target provider, instance size and ssh pubkey to use for the default user.\n", + "name": "Reservation" + }, + { + "description": "A Source represents a connection with public cloud account. These endpoints serve as convenient way to read information about available Sources to deploy instances into. The source of through is different application called Sources.\n", + "name": "Source" } ] -} \ No newline at end of file +} diff --git a/api/schema/rhsm.json b/api/schema/rhsm.json index 9a462df9..7a98d48b 100644 --- a/api/schema/rhsm.json +++ b/api/schema/rhsm.json @@ -1 +1 @@ -{"basePath":"/management/v2","consumes":["application/json"],"definitions":{"APIPageParam":{"description":"APIPageParam details the pagination parameters in APIResponse","properties":{"count":{"type":"integer"},"limit":{"type":"integer"},"offset":{"type":"integer"}},"type":"object"},"ActivationKeys":{"properties":{"additionalRepositories":{"items":{"$ref":"#/definitions/AdditionalRepositories"},"type":"array"},"id":{"type":"string"},"name":{"type":"string"},"releaseVersion":{"type":"string"},"role":{"type":"string"},"serviceLevel":{"type":"string"},"usage":{"type":"string"}},"type":"object"},"AdditionalRepositories":{"properties":{"repositoryLabel":{"type":"string"},"repositoryName":{"type":"string"}},"type":"object"},"AvailableRepositories":{"properties":{"architecture":{"type":"string"},"default":{"type":"string"},"engineeringProduct":{"type":"string"},"repositoryLabel":{"type":"string"},"repositoryName":{"type":"string"}},"type":"object"},"Capacity":{"properties":{"name":{"type":"string"},"quantity":{"type":"string"}},"type":"object"},"Date":{"description":"Date format used in API responses.","example":"2006-01-02T15:04:05.000Z","type":"string"},"EntitlementsAttached":{"description":"Details of all the entitlements attached and their status.","properties":{"reason":{"type":"string"},"valid":{"type":"boolean"},"value":{"items":{"$ref":"#/definitions/EntitlementsAttachedValue"},"type":"array"}},"type":"object"},"EntitlementsAttachedValue":{"description":"Detail of each entitlement attached","properties":{"contractNumber":{"type":"string"},"endDate":{"$ref":"#/definitions/Date"},"entitlementQuantity":{"type":"integer"},"id":{"type":"string"},"sku":{"type":"string"},"startDate":{"$ref":"#/definitions/Date"},"subscriptionName":{"type":"string"}},"type":"object"},"ErrorDetails":{"description":"ErrorDetails details the Error in ErrorResponse","properties":{"code":{"type":"integer"},"message":{"type":"string"}},"type":"object"},"EusProductList":{"properties":{"configurations":{"items":{"properties":{"repositories":{"items":{"type":"string"},"type":"array"},"version":{"type":"string"}},"type":"object"},"type":"array"},"engID":{"type":"integer"},"name":{"type":"string"}},"title":"List of RHEL EUS product-repo mappings","type":"object"},"Manifest":{"properties":{"entitlementQuantity":{"type":"integer"},"name":{"type":"string"},"simpleContentAccess":{"type":"string"},"type":{"type":"string"},"url":{"type":"string"},"uuid":{"type":"string"},"version":{"type":"string"}},"title":"Manifest is an entity that consumes entitlements. Also referred as a Distributor.","type":"object"},"ManifestDetails":{"description":"details of a manifest","properties":{"createdBy":{"type":"string"},"createdDate":{"$ref":"#/definitions/Date"},"entitlementsAttached":{"$ref":"#/definitions/EntitlementsAttached"},"entitlementsAttachedQuantity":{"type":"integer"},"lastModified":{"$ref":"#/definitions/Date"},"name":{"type":"string"},"simpleContentAccess":{"type":"string"},"type":{"type":"string"},"uuid":{"type":"string"},"version":{"type":"string"}},"type":"object"},"ManifestSummary":{"description":"details of a manifest","properties":{"contentAccessMode":{"type":"string"},"createdBy":{"type":"string"},"createdDate":{"$ref":"#/definitions/Date"},"entitlementsAttachedQuantity":{"type":"integer"},"lastModified":{"$ref":"#/definitions/Date"},"name":{"type":"string"},"type":{"type":"string"},"uuid":{"type":"string"},"version":{"type":"string"}},"type":"object"},"ManifestVersion":{"description":"List of satellite version","properties":{"description":{"type":"string"},"value":{"type":"string"}},"type":"object"},"OrgSimpleContentAccess":{"properties":{"id":{"type":"string"},"simpleContentAccess":{"type":"string"},"simpleContentAccessCapable":{"type":"boolean"},"systemPurposeAttributes":{"$ref":"#/definitions/SystemPurposeAttributes"}},"title":"Organization Simple Content Access details.","type":"object"},"PoolDetail":{"description":"PoolDetail is an entry in the system/allocation pools listing","properties":{"contractNumber":{"type":"string"},"endDate":{"$ref":"#/definitions/Date"},"entitlementsAvailable":{"type":"integer"},"id":{"type":"string"},"serviceLevel":{"type":"string"},"sku":{"type":"string"},"startDate":{"$ref":"#/definitions/Date"},"subscriptionName":{"type":"string"},"subscriptionNumber":{"type":"string"}},"type":"object"},"ProductList":{"properties":{"capacity":{"$ref":"#/definitions/Capacity"},"name":{"type":"boolean"},"productLine":{"type":"string"},"quantity":{"type":"integer"},"serviceLevel":{"type":"string"},"serviceType":{"type":"string"},"sku":{"type":"string"}},"title":"List of products from subscriptions","type":"object"},"StatusCount":{"properties":{"active":{"type":"integer"},"expired":{"type":"integer"},"expiringSoon":{"type":"integer"},"futureDated":{"type":"integer"}},"title":"Status counts of user's subscriptions","type":"object"},"SystemPurposeAttributes":{"description":"System purpose settings available to an organization","properties":{"roles":{"items":{"type":"string"},"type":"array"},"serviceLevel":{"items":{"type":"string"},"type":"array"},"usage":{"items":{"type":"string"},"type":"array"}},"type":"object"},"exportJobResponse":{"properties":{"exportID":{"type":"string"},"href":{"type":"string"}},"type":"object"},"exportResponse":{"properties":{"exportJobID":{"type":"string"},"href":{"type":"string"}},"type":"object"},"ongoingExportJobResponse":{"properties":{"message":{"type":"string"}},"type":"object"},"poolsListMock":{"properties":{"body":{"items":{"$ref":"#/definitions/PoolDetail"},"type":"array"},"pagination":{"$ref":"#/definitions/APIPageParam"}},"type":"object"}},"host":"api.access.stage.redhat.com","info":{"contact":{"url":"https://access.redhat.com/support/cases/"},"description":"API for Red Hat Subscription Management","title":"RHSM-API","version":"1.326.0"},"paths":{"/activation_keys":{"get":{"description":"Returns a list of activation keys on the account including service level, role, additionalRepositories, usage, and release version (if applicable). Additional Repositories and release version will be an empty set in case it is not set.","operationId":"listActivationKeys","responses":{"200":{"description":"Array of activation keys","schema":{"properties":{"body":{"items":{"$ref":"#/definitions/ActivationKeys"},"type":"array"}},"type":"object"}},"401":{"$ref":"#/responses/Unauthorized"},"403":{"$ref":"#/responses/Forbidden"},"500":{"$ref":"#/responses/InternalServerError"}},"summary":"List activation keys","tags":["activationKey"]},"post":{"description":"Creates an activation key by name, release version and system purpose attributes, that are service level, role and usage. In the request body, \"name\" should be present and unique and can only contain letters, numbers, underscores, or hyphens. The response will have name and additionalRepositories as fixed fields. AdditionalRepositories field will always be empty for a new activation key. Role, serviceLevel, usage and releaseVersion are conditional fields, will be present in response only when they have values.","operationId":"createActivationKeys","parameters":[{"description":"Create an activation key","in":"body","name":"activationKey","schema":{"properties":{"additionalRepositories":{"items":{"properties":{"repositoryLabel":{"type":"string"}},"type":"object"},"type":"array"},"name":{"description":"Name should be present, unique and can only contain letters, numbers, underscores, or hyphens","type":"string"},"releaseVersion":{"type":"string"},"role":{"type":"string"},"serviceLevel":{"type":"string"},"usage":{"type":"string"}},"required":["name"],"type":"object"}}],"responses":{"200":{"description":"Activation key","schema":{"properties":{"body":{"$ref":"#/definitions/ActivationKeys"}},"type":"object"}},"401":{"$ref":"#/responses/Unauthorized"},"403":{"$ref":"#/responses/Forbidden"},"500":{"$ref":"#/responses/InternalServerError"}},"summary":"Create activation key","tags":["activationKey"]}},"/activation_keys/{name}":{"delete":{"description":"Removes the activation key from the account based on activation key name","operationId":"removeActivationKeys","parameters":[{"in":"path","name":"name","required":true,"type":"string"}],"responses":{"204":{"description":"successfully removed"},"400":{"$ref":"#/responses/BadRequest"},"401":{"$ref":"#/responses/Unauthorized"},"403":{"$ref":"#/responses/Forbidden"},"404":{"$ref":"#/responses/NotFound"},"500":{"$ref":"#/responses/InternalServerError"}},"summary":"Delete activation key","tags":["activationKey"]},"get":{"description":"Get activation key by name","operationId":"showActivationKey","parameters":[{"in":"path","name":"name","required":true,"type":"string"}],"responses":{"200":{"description":"Activation key","schema":{"properties":{"body":{"$ref":"#/definitions/ActivationKeys"}},"type":"object"}},"401":{"$ref":"#/responses/Unauthorized"},"403":{"$ref":"#/responses/Forbidden"},"500":{"$ref":"#/responses/InternalServerError"}},"summary":"Get activation key","tags":["activationKey"]},"put":{"description":"Updates an existing activation key with one or more fields as provided in request. It also returns additionalRepositories field which will be empty set when it is empty","operationId":"updateActivationKeys","parameters":[{"in":"path","name":"name","required":true,"type":"string"},{"description":"Update an activation key","in":"body","name":"activationKey","schema":{"properties":{"additionalRepositories":{"items":{"$ref":"#/definitions/AdditionalRepositories"},"type":"array"},"releaseVersion":{"type":"string"},"role":{"type":"string"},"serviceLevel":{"type":"string"},"usage":{"type":"string"}},"type":"object"}}],"responses":{"200":{"description":"Activation key","schema":{"properties":{"body":{"$ref":"#/definitions/ActivationKeys"}},"type":"object"}},"400":{"$ref":"#/responses/BadRequest"},"401":{"$ref":"#/responses/Unauthorized"},"403":{"$ref":"#/responses/Forbidden"},"500":{"$ref":"#/responses/InternalServerError"}},"summary":"Update activation key","tags":["activationKey"]}},"/activation_keys/{name}/additional_repositories":{"delete":{"description":"Removes the additional repositories from an activation key by providing activation key name and repository labels","operationId":"removeActivationKeyAdditionalRepositories","parameters":[{"in":"path","name":"name","required":true,"type":"string"},{"in":"body","name":"additionalRepositories","schema":{"items":{"$ref":"#/definitions/AdditionalRepositories"},"type":"array"}}],"responses":{"204":{"$ref":"#/responses/NoContent"},"400":{"$ref":"#/responses/BadRequest"},"401":{"$ref":"#/responses/Unauthorized"},"403":{"$ref":"#/responses/Forbidden"},"404":{"$ref":"#/responses/NotFound"},"500":{"$ref":"#/responses/InternalServerError"}},"summary":"Delete Additional Repositories","tags":["activationKey"]},"post":{"description":"Add additional repositories to an activation key by providing activation key name and repository labels. Customers can use any respositories listed in the `/v2/activation_keys/{name}/available_repositories` endpoint (use attribute `repositoryLabel`). Empty value is not supported and maximum length of repository label allowed is upto 255 characters.","operationId":"addAdditionalRepositories","parameters":[{"in":"path","name":"name","required":true,"type":"string"},{"description":"Add Additional repositories","in":"body","name":"activationKey","schema":{"items":{"$ref":"#/definitions/AdditionalRepositories"},"type":"array"}}],"responses":{"200":{"description":"list of additional repositories","schema":{"properties":{"body":{"items":{"$ref":"#/definitions/AdditionalRepositories"},"type":"array"}},"type":"object"}},"400":{"$ref":"#/responses/BadRequest"},"401":{"$ref":"#/responses/Unauthorized"},"403":{"$ref":"#/responses/Forbidden"},"500":{"$ref":"#/responses/InternalServerError"}},"summary":"Add Additional Repositories","tags":["activationKey"]}},"/activation_keys/{name}/available_repositories":{"get":{"description":"Returns the list of RPM repositories available to an activation key that can be added as an additional repository. Available repositories are calculated by negating the additional repositories from the set of total RPM repositories. It can be an empty set if there are no RPM repositories or all of the repositories are already added to an activation key.","operationId":"listAvailableRepositories","parameters":[{"in":"path","name":"name","required":true,"type":"string"},{"description":"max number of results you want","in":"query","name":"limit","type":"integer"},{"description":"index from which you want next items","in":"query","name":"offset","type":"integer"},{"description":"Filters available repos based off default status","enum":["Disabled"],"in":"query","name":"default","type":"string"}],"responses":{"200":{"description":"list of available repositories","schema":{"properties":{"body":{"items":{"$ref":"#/definitions/AvailableRepositories"},"type":"array"},"pagination":{"$ref":"#/definitions/APIPageParam"}},"type":"object"}},"400":{"$ref":"#/responses/BadRequest"},"401":{"$ref":"#/responses/Unauthorized"},"403":{"$ref":"#/responses/Forbidden"},"500":{"$ref":"#/responses/InternalServerError"}},"summary":"List Available Repositories","tags":["activationKey"]}},"/manifests":{"get":{"description":"The default and max number of results in a response are 100.\nSatellite 6.0 or higher versions are only supported.","operationId":"listManifests","parameters":[{"description":"max number of results you want","in":"query","name":"limit","type":"integer"},{"description":"index from which you want next items","in":"query","name":"offset","type":"integer"}],"responses":{"200":{"description":"list of manifests","schema":{"properties":{"body":{"items":{"$ref":"#/definitions/Manifest"},"type":"array"},"pagination":{"$ref":"#/definitions/APIPageParam"}},"type":"object"}},"400":{"$ref":"#/responses/BadRequest"},"401":{"$ref":"#/responses/Unauthorized"},"403":{"$ref":"#/responses/Forbidden"},"404":{"$ref":"#/responses/NotFound"},"500":{"$ref":"#/responses/InternalServerError"}},"summary":"List all manifests for a user","tags":["manifest"]},"post":{"description":"Create Manifest by name and version(optional).\nCustomers can use any version listed in the `/v2/manifests/versions`\nendpoint (use attribute `value`).\nIf no version is specified, it will take the latest available version\n for Manifest.","operationId":"createManifest","parameters":[{"description":"must be less than 100 characters and use only numbers, letters, underscores, hyphens, and periods","in":"query","name":"Name","required":true,"type":"string"},{"in":"query","name":"version","type":"string"}],"responses":{"200":{"description":"Success","schema":{"properties":{"body":{"$ref":"#/definitions/ManifestSummary"}},"type":"object"}},"400":{"$ref":"#/responses/BadRequest"},"401":{"$ref":"#/responses/Unauthorized"},"403":{"$ref":"#/responses/Forbidden"},"404":{"$ref":"#/responses/NotFound"},"500":{"$ref":"#/responses/InternalServerError"}},"summary":"Create Manifest","tags":["manifest"]}},"/manifests/versions":{"get":{"description":"Returns list of Satellite version 6.0 and above","operationId":"listVersionsManifest","responses":{"200":{"description":"list of Satellite version","schema":{"properties":{"body":{"items":{"$ref":"#/definitions/ManifestVersion"},"type":"array"}},"type":"object"}},"400":{"$ref":"#/responses/BadRequest"},"401":{"$ref":"#/responses/Unauthorized"},"403":{"$ref":"#/responses/Forbidden"},"404":{"$ref":"#/responses/NotFound"},"500":{"$ref":"#/responses/InternalServerError"}},"summary":"List Satellite versions","tags":["manifest"]}},"/manifests/{uuid}":{"delete":{"description":"The default success response will be 204\n\nSystem, RHUI, Hypervisor, SAM are unsupported manifet types","operationId":"removeManifest","parameters":[{"in":"path","name":"uuid","required":true,"type":"string"},{"description":"Deleting a subscription manifest can have significant impacts on your hosts and activation keys.\nWe require a force parameter to make sure the delete operation is intentional.","enum":[true],"in":"query","name":"force","required":true,"type":"boolean"}],"responses":{"204":{"description":"Successfully removed"},"400":{"$ref":"#/responses/BadRequest"},"401":{"$ref":"#/responses/Unauthorized"},"403":{"$ref":"#/responses/Forbidden"},"404":{"$ref":"#/responses/NotFound"},"500":{"$ref":"#/responses/InternalServerError"},"504":{"$ref":"#/responses/GatewayTimeout"}},"summary":"Remove manifest profile","tags":["manifest"]},"get":{"description":"System, RHUI, Hypervisor, SAM are unsupported manifest types","operationId":"showManifest","parameters":[{"in":"path","name":"uuid","required":true,"type":"string"},{"description":"Show more details about a manifest","enum":["entitlements"],"in":"query","maxItems":1,"name":"include","type":"string"}],"responses":{"200":{"description":"success response","schema":{"properties":{"body":{"$ref":"#/definitions/ManifestDetails"}},"type":"object"}},"400":{"$ref":"#/responses/BadRequest"},"401":{"$ref":"#/responses/Unauthorized"},"403":{"$ref":"#/responses/Forbidden"},"404":{"$ref":"#/responses/NotFound"},"500":{"$ref":"#/responses/InternalServerError"}},"summary":"Get an Manifest by UUID","tags":["manifest"]},"put":{"description":"Allows to update simpleContentAccess for Satellite of version 6.3 and\nabove\nPossible value for simpleContentAccess are:\n\n- enabled\n- disabled","operationId":"updateManifest","parameters":[{"in":"path","name":"uuid","required":true,"type":"string"},{"in":"body","name":"manifest","schema":{"properties":{"simpleContentAccess":{"type":"string"}},"required":["simpleContentAccess"],"type":"object"}}],"responses":{"204":{"$ref":"#/responses/NoContent"},"400":{"$ref":"#/responses/BadRequest"},"401":{"$ref":"#/responses/Unauthorized"},"403":{"$ref":"#/responses/Forbidden"},"404":{"$ref":"#/responses/NotFound"},"500":{"$ref":"#/responses/InternalServerError"}},"summary":"Update a manifest","tags":["manifest"]}},"/manifests/{uuid}/entitlements":{"post":{"description":"Satellite 5.6 or higher versions are only supported.","operationId":"attachEntitlementManifest","parameters":[{"in":"query","maxItems":1,"minItems":1,"name":"pool","required":true,"type":"string"},{"description":"quantity you want to attach","in":"query","name":"quantity","type":"integer"},{"in":"path","name":"uuid","required":true,"type":"string"}],"responses":{"200":{"description":"Success","schema":{"properties":{"body":{"$ref":"#/definitions/ManifestDetails"}},"type":"object"}},"400":{"$ref":"#/responses/BadRequest"},"401":{"$ref":"#/responses/Unauthorized"},"403":{"$ref":"#/responses/Forbidden"},"404":{"$ref":"#/responses/NotFound"},"500":{"$ref":"#/responses/InternalServerError"},"504":{"$ref":"#/responses/GatewayTimeout"}},"summary":"Attach entitlement to Manifest","tags":["manifest"]}},"/manifests/{uuid}/entitlements/{EntitlementID}":{"delete":{"description":"The default success response will be 204.","operationId":"removeManifestEntitlement","parameters":[{"in":"path","name":"uuid","required":true,"type":"string"},{"in":"path","name":"EntitlementID","required":true,"type":"string"}],"responses":{"204":{"description":"successfully removed"},"400":{"$ref":"#/responses/BadRequest"},"401":{"$ref":"#/responses/Unauthorized"},"403":{"$ref":"#/responses/Forbidden"},"404":{"$ref":"#/responses/NotFound"},"500":{"$ref":"#/responses/InternalServerError"}},"summary":"Remove entitlement from the manifest","tags":["manifest"]},"put":{"description":"The default success response will be 200.\n\nSystem, RHUI, Hypervisor, SAM are unsupported manifest types","operationId":"updateEntitlementManifest","parameters":[{"in":"path","name":"uuid","required":true,"type":"string"},{"in":"path","name":"EntitlementID","required":true,"type":"string"},{"description":"maxItem: quantity must be less than or equal to the maximum number of allowed entitlements in the entitlement pool\nminItem: 1","in":"query","name":"quantity","type":"integer"}],"responses":{"200":{"description":"Success response","schema":{"properties":{"body":{"$ref":"#/definitions/ManifestDetails"}},"type":"object"}},"400":{"$ref":"#/responses/BadRequest"},"401":{"$ref":"#/responses/Unauthorized"},"403":{"$ref":"#/responses/Forbidden"},"404":{"$ref":"#/responses/NotFound"},"500":{"$ref":"#/responses/InternalServerError"}},"summary":"Update attached entitlement to manifest","tags":["manifest"]}},"/manifests/{uuid}/export":{"get":{"description":"Starts job to generate export for a manifest. To check the status of the export job visit the href in the response.\n\nSatellite 6.0 or higher versions are only supported.","operationId":"exportManifest","parameters":[{"in":"path","name":"uuid","required":true,"type":"string"}],"responses":{"200":{"description":"ExportManifest200 is the success response","schema":{"properties":{"body":{"$ref":"#/definitions/exportResponse"}},"type":"object"}},"400":{"$ref":"#/responses/BadRequest"},"401":{"$ref":"#/responses/Unauthorized"},"403":{"$ref":"#/responses/Forbidden"},"404":{"$ref":"#/responses/NotFound"},"500":{"$ref":"#/responses/InternalServerError"}},"summary":"Trigger manifest export","tags":["manifest"]}},"/manifests/{uuid}/export/{ExportID}":{"get":{"description":"Success response contains a zip file. The link is one-time download and expires after one try. Trigger export job to get another download link.\n\nContent-Type: application/zip","operationId":"getExportManifest","parameters":[{"in":"path","name":"uuid","required":true,"type":"string"},{"in":"path","name":"ExportID","required":true,"type":"string"}],"produces":["application/zip"],"responses":{"200":{"description":"GetExportManifest200 is the success response","schema":{"items":{"type":"integer"},"type":"array"}},"400":{"$ref":"#/responses/BadRequest"},"401":{"$ref":"#/responses/Unauthorized"},"403":{"$ref":"#/responses/Forbidden"},"404":{"$ref":"#/responses/NotFound"},"500":{"$ref":"#/responses/InternalServerError"}},"summary":"Download manifest","tags":["manifest"]}},"/manifests/{uuid}/exportJob/{ExportJobID}":{"get":{"description":"Returns export download link in response.","operationId":"exportJobManifest","parameters":[{"in":"path","name":"uuid","required":true,"type":"string"},{"in":"path","name":"ExportJobID","required":true,"type":"string"}],"responses":{"200":{"description":"ExportJobManifest200 is the success response","schema":{"properties":{"body":{"$ref":"#/definitions/exportJobResponse"}},"type":"object"}},"202":{"description":"AcceptedExportJob202 is a response for accepted and in progress job","schema":{"properties":{"body":{"$ref":"#/definitions/ongoingExportJobResponse"}},"type":"object"}},"400":{"$ref":"#/responses/BadRequest"},"401":{"$ref":"#/responses/Unauthorized"},"403":{"$ref":"#/responses/Forbidden"},"404":{"$ref":"#/responses/NotFound"},"406":{"$ref":"#/responses/NotAcceptable"},"500":{"$ref":"#/responses/InternalServerError"}},"summary":"Check status of manifest export","tags":["manifest"]}},"/manifests/{uuid}/pools":{"get":{"description":"Satellite 5.6 or higher versions are only supported.","operationId":"listManifestPools","parameters":[{"description":"max number of results you want","in":"query","name":"limit","type":"integer"},{"description":"index from which you want next items","in":"query","name":"offset","type":"integer"},{"description":"include future dated pools for satellite 6.3 or higher","enum":[true],"in":"query","name":"future","type":"boolean"},{"in":"path","name":"uuid","required":true,"type":"string"}],"responses":{"200":{"description":"list of pools available for the manifest","schema":{"$ref":"#/definitions/poolsListMock"}},"400":{"$ref":"#/responses/BadRequest"},"401":{"$ref":"#/responses/Unauthorized"},"403":{"$ref":"#/responses/Forbidden"},"404":{"$ref":"#/responses/NotFound"},"500":{"$ref":"#/responses/InternalServerError"}},"summary":"List all pools for a manifest","tags":["manifest"]}},"/organization":{"get":{"description":"Show Simple Content Access details of user's organization","operationId":"checkOrgSCACapability","parameters":[{"description":"Request for system purpose attributes in response","in":"query","name":"include","type":"string"}],"responses":{"200":{"description":"Organization details","schema":{"properties":{"body":{"$ref":"#/definitions/OrgSimpleContentAccess"}},"type":"object"}},"400":{"$ref":"#/responses/BadRequest"},"401":{"$ref":"#/responses/Unauthorized"},"403":{"$ref":"#/responses/Forbidden"},"404":{"$ref":"#/responses/NotFound"},"500":{"$ref":"#/responses/InternalServerError"}},"summary":"Get details of the user's organization","tags":["organization"]}},"/products":{"get":{"description":"Get list of all the products of user's subscription. The products are from subscriptions that have not expired or expired within last 30 days.\n","operationId":"listProducts","parameters":[{"description":"Filters products based on subscription status","enum":["expired","expiringSoon","active","futureDated"],"in":"query","name":"status","type":"string"}],"responses":{"200":{"description":"Product list","schema":{"properties":{"body":{"items":{"$ref":"#/definitions/ProductList"},"type":"array"}},"type":"object"}},"401":{"$ref":"#/responses/Unauthorized"},"403":{"$ref":"#/responses/Forbidden"},"500":{"$ref":"#/responses/InternalServerError"}},"summary":"List all the products from user's subscription","tags":["products"]}},"/products/RHEL/extended-update-support-products":{"get":{"description":"Returns the list of currently supported RHEL product-repo mappings for Extended Update Support","responses":{"200":{"description":"Extended Update Support versions","schema":{"properties":{"body":{"items":{"$ref":"#/definitions/EusProductList"},"type":"array"}},"type":"object"}},"400":{"$ref":"#/responses/BadRequest"},"401":{"$ref":"#/responses/Unauthorized"},"403":{"$ref":"#/responses/Forbidden"},"500":{"$ref":"#/responses/InternalServerError"}},"summary":"List RHEL EUS products","tags":["products"]}},"/products/RHEL/extended-update-support-versions":{"get":{"description":"Returns the list of currently supported RHEL versions for Extended Update Support","responses":{"200":{"description":"Extended Update Support versions","schema":{"properties":{"body":{"items":{"type":"string"},"type":"array"}},"type":"object"}},"401":{"$ref":"#/responses/Unauthorized"},"403":{"$ref":"#/responses/Forbidden"},"500":{"$ref":"#/responses/InternalServerError"}},"summary":"List RHEL EUS versions","tags":["products"]}},"/products/export":{"get":{"description":"Export a csv file of all subscriptions","produces":["text/csv"],"responses":{"200":{"description":"Export","examples":{"text/csv":"Name,SKU,Service level,Support type,Capacity name,Capacity quantity,Contract number,Quantity,Start date,End date,Status (Active, Expired, Future Dated)\nExample Name, Example SKU, Example Service level, Example Support type, Example Capacity name, Example Contract number, Example Quantity, Example Start date, Example End date, Example Status\n"},"schema":{"type":"file"}},"401":{"$ref":"#/responses/Unauthorized"},"403":{"$ref":"#/responses/Forbidden"},"500":{"$ref":"#/responses/InternalServerError"}},"summary":"Export subscriptions","tags":["products"]}},"/products/status":{"get":{"description":"Get counts of user's subscriptions by status such as\n- active\n- expired\n- expiring soon\n- future dated ","operationId":"statusCounts","responses":{"200":{"description":"Status counts","schema":{"properties":{"body":{"$ref":"#/definitions/StatusCount"}},"type":"object"}},"401":{"$ref":"#/responses/Unauthorized"},"403":{"$ref":"#/responses/Forbidden"},"500":{"$ref":"#/responses/InternalServerError"}},"summary":"Get user's subscription quantities by status","tags":["products"]}},"/products/{SKU}":{"get":{"description":"Get a single product by SKU","operationId":"showProduct","parameters":[{"description":"SKU of the product to show","in":"path","name":"SKU","required":true,"type":"string"}],"responses":{"200":{"description":"Product","schema":{"properties":{"body":{"$ref":"#/definitions/ProductList"}},"type":"object"}},"400":{"$ref":"#/responses/BadRequest"},"401":{"$ref":"#/responses/Unauthorized"},"403":{"$ref":"#/responses/Forbidden"},"500":{"$ref":"#/responses/InternalServerError"}},"summary":"Show product","tags":["products"]}}},"produces":["application/json"],"responses":{"BadRequest":{"description":"BadRequest error","schema":{"properties":{"error":{"$ref":"#/definitions/ErrorDetails"}},"type":"object"}},"Forbidden":{"description":"Forbidden error","schema":{"properties":{"error":{"$ref":"#/definitions/ErrorDetails"}},"type":"object"}},"GatewayTimeout":{"description":"GatewayTimeout error","schema":{"properties":{"error":{"$ref":"#/definitions/ErrorDetails"}},"type":"object"}},"InternalServerError":{"description":"InternalServerError error","schema":{"properties":{"error":{"$ref":"#/definitions/ErrorDetails"}},"type":"object"}},"NoContent":{"description":"No Content"},"NotAcceptable":{"description":"NotAcceptable error","schema":{"properties":{"error":{"$ref":"#/definitions/ErrorDetails"}},"type":"object"}},"NotFound":{"description":"NotFound error","schema":{"properties":{"error":{"$ref":"#/definitions/ErrorDetails"}},"type":"object"}},"Unauthorized":{"description":"Unauthorized error","schema":{"properties":{"error":{"$ref":"#/definitions/ErrorDetails"}},"type":"object"}}},"schemes":["https"],"swagger":"2.0"} \ No newline at end of file +{"basePath":"/management/v2","consumes":["application/json"],"definitions":{"APIPageParam":{"description":"APIPageParam details the pagination parameters in APIResponse","properties":{"count":{"type":"integer"},"limit":{"type":"integer"},"offset":{"type":"integer"}},"type":"object"},"ActivationKeys":{"properties":{"additionalRepositories":{"items":{"$ref":"#/definitions/AdditionalRepositories"},"type":"array"},"description":{"type":"string"},"id":{"type":"string"},"name":{"type":"string"},"releaseVersion":{"type":"string"},"role":{"type":"string"},"serviceLevel":{"type":"string"},"updatedAt":{"type":"string"},"usage":{"type":"string"}},"type":"object"},"AdditionalRepositories":{"properties":{"repositoryLabel":{"type":"string"}},"type":"object"},"AvailableRepositories":{"properties":{"architecture":{"type":"string"},"default":{"type":"string"},"engineeringProduct":{"type":"string"},"repositoryLabel":{"type":"string"},"repositoryName":{"type":"string"},"rpmType":{"type":"string"}},"type":"object"},"Capacity":{"properties":{"name":{"type":"string"},"quantity":{"type":"string"}},"type":"object"},"Date":{"description":"Date format used in API responses.","example":"2006-01-02T15:04:05.000Z","type":"string"},"EntitlementsAttached":{"description":"Details of all the entitlements attached and their status.","properties":{"reason":{"type":"string"},"valid":{"type":"boolean"},"value":{"items":{"$ref":"#/definitions/EntitlementsAttachedValue"},"type":"array"}},"type":"object"},"EntitlementsAttachedValue":{"description":"Detail of each entitlement attached","properties":{"contractNumber":{"type":"string"},"endDate":{"$ref":"#/definitions/Date"},"entitlementQuantity":{"type":"integer"},"id":{"type":"string"},"sku":{"type":"string"},"startDate":{"$ref":"#/definitions/Date"},"subscriptionName":{"type":"string"}},"type":"object"},"ErrorDetails":{"description":"ErrorDetails details the Error in ErrorResponse","properties":{"code":{"type":"integer"},"message":{"type":"string"}},"type":"object"},"EusProductList":{"properties":{"configurations":{"items":{"properties":{"repositories":{"items":{"type":"string"},"type":"array"},"version":{"type":"string"}},"type":"object"},"type":"array"},"engID":{"type":"integer"},"name":{"type":"string"}},"title":"List of RHEL EUS product-repo mappings","type":"object"},"Manifest":{"properties":{"entitlementQuantity":{"type":"integer"},"name":{"type":"string"},"simpleContentAccess":{"type":"string"},"type":{"type":"string"},"url":{"type":"string"},"uuid":{"type":"string"},"version":{"type":"string"}},"title":"Manifest is an entity that consumes entitlements. Also referred as a Distributor.","type":"object"},"ManifestDetails":{"description":"details of a manifest","properties":{"createdBy":{"type":"string"},"createdDate":{"$ref":"#/definitions/Date"},"entitlementsAttached":{"$ref":"#/definitions/EntitlementsAttached"},"entitlementsAttachedQuantity":{"type":"integer"},"lastModified":{"$ref":"#/definitions/Date"},"name":{"type":"string"},"simpleContentAccess":{"type":"string"},"type":{"type":"string"},"uuid":{"type":"string"},"version":{"type":"string"}},"type":"object"},"ManifestSummary":{"description":"details of a manifest","properties":{"contentAccessMode":{"type":"string"},"createdBy":{"type":"string"},"createdDate":{"$ref":"#/definitions/Date"},"entitlementsAttachedQuantity":{"type":"integer"},"lastModified":{"$ref":"#/definitions/Date"},"name":{"type":"string"},"type":{"type":"string"},"uuid":{"type":"string"},"version":{"type":"string"}},"type":"object"},"ManifestVersion":{"description":"List of satellite version","properties":{"description":{"type":"string"},"value":{"type":"string"}},"type":"object"},"OrgSimpleContentAccess":{"properties":{"id":{"type":"string"},"simpleContentAccess":{"type":"string"},"simpleContentAccessCapable":{"type":"boolean"},"systemPurposeAttributes":{"$ref":"#/definitions/SystemPurposeAttributes"}},"title":"Organization Simple Content Access details.","type":"object"},"PoolDetail":{"description":"PoolDetail is an entry in the system/allocation pools listing","properties":{"contractNumber":{"type":"string"},"endDate":{"$ref":"#/definitions/Date"},"entitlementsAvailable":{"type":"integer"},"id":{"type":"string"},"serviceLevel":{"type":"string"},"sku":{"type":"string"},"startDate":{"$ref":"#/definitions/Date"},"subscriptionName":{"type":"string"},"subscriptionNumber":{"type":"string"}},"type":"object"},"ProductList":{"properties":{"capacity":{"$ref":"#/definitions/Capacity"},"name":{"type":"boolean"},"productLine":{"type":"string"},"productName":{"type":"string"},"providedProducts":{"items":{"type":"number"},"type":"array"},"quantity":{"type":"integer"},"serviceLevel":{"type":"string"},"serviceType":{"type":"string"},"sku":{"type":"string"},"subscriptions":{"items":{"properties":{"contractNumber":{"type":"string"},"endDate":{"type":"string"},"number":{"type":"string"},"quantity":{"type":"string"},"startDate":{"type":"string"},"status":{"type":"string"}},"type":"object"},"type":"array"},"usage":{"type":"string"},"virtLimit":{"type":"string"}},"title":"List of products from subscriptions","type":"object"},"StatusCount":{"properties":{"active":{"type":"integer"},"expired":{"type":"integer"},"expiringSoon":{"type":"integer"},"futureDated":{"type":"integer"}},"title":"Status counts of user's subscriptions","type":"object"},"SystemPurposeAttributes":{"description":"System purpose settings available to an organization","properties":{"roles":{"items":{"type":"string"},"type":"array"},"serviceLevel":{"items":{"type":"string"},"type":"array"},"usage":{"items":{"type":"string"},"type":"array"}},"type":"object"},"exportJobResponse":{"properties":{"exportID":{"type":"string"},"href":{"type":"string"}},"type":"object"},"exportResponse":{"properties":{"exportJobID":{"type":"string"},"href":{"type":"string"}},"type":"object"},"ongoingExportJobResponse":{"properties":{"message":{"type":"string"}},"type":"object"},"poolsListMock":{"properties":{"body":{"items":{"$ref":"#/definitions/PoolDetail"},"type":"array"},"pagination":{"$ref":"#/definitions/APIPageParam"}},"type":"object"}},"host":"api.access.redhat.com","info":{"contact":{"url":"https://access.redhat.com/support/cases/"},"description":"API for Red Hat Subscription Management","title":"RHSM-API","version":"2"},"paths":{"/activation_keys":{"get":{"description":"Returns a list of activation keys on the account including service level, role, additionalRepositories, usage, and release version (if applicable). Additional Repositories and release version will be an empty set in case it is not set.","operationId":"listActivationKeys","responses":{"200":{"description":"Array of activation keys","schema":{"properties":{"body":{"items":{"$ref":"#/definitions/ActivationKeys"},"type":"array"}},"type":"object"}},"401":{"$ref":"#/responses/Unauthorized"},"403":{"$ref":"#/responses/Forbidden"},"500":{"$ref":"#/responses/InternalServerError"}},"summary":"List activation keys","tags":["activationKey"]},"post":{"description":"Creates an activation key by name, release version and system purpose attributes, that are service level, role and usage. In the request body, \"name\" should be present and unique and can only contain letters, numbers, underscores, or hyphens. The response will have name and additionalRepositories as fixed fields. AdditionalRepositories field will always be empty for a new activation key. Role, serviceLevel, usage, releaseVersion and description are conditional fields, will be present in response only when they have values.","operationId":"createActivationKeys","parameters":[{"description":"Create an activation key","in":"body","name":"activationKey","schema":{"properties":{"additionalRepositories":{"items":{"properties":{"repositoryLabel":{"type":"string"}},"type":"object"},"type":"array"},"description":{"description":"should be 255 characters or shorter","type":"string"},"name":{"description":"Name should be present, unique and can only contain letters, numbers, underscores, or hyphens","type":"string"},"releaseVersion":{"type":"string"},"role":{"type":"string"},"serviceLevel":{"type":"string"},"usage":{"type":"string"}},"required":["name"],"type":"object"}}],"responses":{"200":{"description":"Activation key","schema":{"properties":{"body":{"$ref":"#/definitions/ActivationKeys"}},"type":"object"}},"401":{"$ref":"#/responses/Unauthorized"},"403":{"$ref":"#/responses/Forbidden"},"500":{"$ref":"#/responses/InternalServerError"}},"summary":"Create activation key","tags":["activationKey"]}},"/activation_keys/{name}":{"delete":{"description":"Removes the activation key from the account based on activation key name","operationId":"removeActivationKeys","parameters":[{"in":"path","name":"name","required":true,"type":"string"}],"responses":{"204":{"description":"successfully removed"},"400":{"$ref":"#/responses/BadRequest"},"401":{"$ref":"#/responses/Unauthorized"},"403":{"$ref":"#/responses/Forbidden"},"404":{"$ref":"#/responses/NotFound"},"500":{"$ref":"#/responses/InternalServerError"}},"summary":"Delete activation key","tags":["activationKey"]},"get":{"description":"Get activation key by name","operationId":"showActivationKey","parameters":[{"in":"path","name":"name","required":true,"type":"string"}],"responses":{"200":{"description":"Activation key","schema":{"properties":{"body":{"$ref":"#/definitions/ActivationKeys"}},"type":"object"}},"401":{"$ref":"#/responses/Unauthorized"},"403":{"$ref":"#/responses/Forbidden"},"500":{"$ref":"#/responses/InternalServerError"}},"summary":"Get activation key","tags":["activationKey"]},"put":{"description":"Updates an existing activation key with one or more fields as provided in request. It also returns additionalRepositories field which will be empty set when it is empty","operationId":"updateActivationKeys","parameters":[{"in":"path","name":"name","required":true,"type":"string"},{"description":"Update an activation key","in":"body","name":"activationKey","schema":{"properties":{"description":{"type":"string"},"releaseVersion":{"type":"string"},"role":{"type":"string"},"serviceLevel":{"type":"string"},"usage":{"type":"string"}},"type":"object"}}],"responses":{"200":{"description":"Activation key","schema":{"properties":{"body":{"$ref":"#/definitions/ActivationKeys"}},"type":"object"}},"400":{"$ref":"#/responses/BadRequest"},"401":{"$ref":"#/responses/Unauthorized"},"403":{"$ref":"#/responses/Forbidden"},"500":{"$ref":"#/responses/InternalServerError"}},"summary":"Update activation key","tags":["activationKey"]}},"/activation_keys/{name}/additional_repositories":{"delete":{"description":"Removes the additional repositories from an activation key by providing activation key name and repository labels","operationId":"removeActivationKeyAdditionalRepositories","parameters":[{"in":"path","name":"name","required":true,"type":"string"},{"in":"body","name":"additionalRepositories","schema":{"items":{"$ref":"#/definitions/AdditionalRepositories"},"type":"array"}}],"responses":{"204":{"$ref":"#/responses/NoContent"},"400":{"$ref":"#/responses/BadRequest"},"401":{"$ref":"#/responses/Unauthorized"},"403":{"$ref":"#/responses/Forbidden"},"404":{"$ref":"#/responses/NotFound"},"500":{"$ref":"#/responses/InternalServerError"}},"summary":"Delete Additional Repositories","tags":["activationKey"]},"post":{"description":"Add additional repositories to an activation key by providing activation key name and repository labels. Customers can use any respositories listed in the `/v2/activation_keys/{name}/available_repositories` endpoint (use attribute `repositoryLabel`). Empty value is not supported and maximum length of repository label allowed is upto 255 characters.","operationId":"addAdditionalRepositories","parameters":[{"in":"path","name":"name","required":true,"type":"string"},{"description":"Add Additional repositories","in":"body","name":"activationKey","schema":{"items":{"$ref":"#/definitions/AdditionalRepositories"},"type":"array"}}],"responses":{"200":{"description":"list of additional repositories","schema":{"properties":{"body":{"items":{"$ref":"#/definitions/AdditionalRepositories"},"type":"array"}},"type":"object"}},"400":{"$ref":"#/responses/BadRequest"},"401":{"$ref":"#/responses/Unauthorized"},"403":{"$ref":"#/responses/Forbidden"},"500":{"$ref":"#/responses/InternalServerError"}},"summary":"Add Additional Repositories","tags":["activationKey"]}},"/activation_keys/{name}/available_repositories":{"get":{"description":"Returns the list of RPM repositories available to an activation key that can be added as an additional repository. Available repositories are calculated by negating the additional repositories from the set of total RPM repositories. It can be an empty set if there are no RPM repositories or all of the repositories are already added to an activation key.","operationId":"listAvailableRepositories","parameters":[{"in":"path","name":"name","required":true,"type":"string"},{"description":"max number of results you want","in":"query","name":"limit","type":"integer"},{"description":"index from which you want next items","in":"query","name":"offset","type":"integer"},{"description":"Filters available repos based off default status","enum":["Disabled"],"in":"query","name":"default","type":"string"},{"description":"Repository name to search by","in":"query","name":"repo_name","type":"string"},{"description":"Repository label to search by","in":"query","name":"repo_label","type":"string"},{"description":"Comma separated list of architectures to search by","in":"query","name":"architecture","type":"string"},{"description":"Field to search by. Supported options are repo_name and repo_label. Must be used in combination with sort_direction","in":"query","name":"sort_by","type":"string"},{"description":"Direction to sort available repositories by. Supported options are asc and desc. Must be used in combination with sort_by","in":"query","name":"sort_direction","type":"string"},{"description":"Comma separated list of rpm types to filter by","in":"query","name":"rpm_type","type":"string"}],"responses":{"200":{"description":"list of available repositories","schema":{"properties":{"body":{"items":{"$ref":"#/definitions/AvailableRepositories"},"type":"array"},"pagination":{"$ref":"#/definitions/APIPageParam"}},"type":"object"}},"400":{"$ref":"#/responses/BadRequest"},"401":{"$ref":"#/responses/Unauthorized"},"403":{"$ref":"#/responses/Forbidden"},"500":{"$ref":"#/responses/InternalServerError"}},"summary":"List Available Repositories","tags":["activationKey"]}},"/manifests":{"get":{"description":"The default and max number of results in a response are 100.\nSatellite 6.0 or higher versions are only supported.","operationId":"listManifests","parameters":[{"description":"max number of results you want","in":"query","name":"limit","type":"integer"},{"description":"index from which you want next items","in":"query","name":"offset","type":"integer"}],"responses":{"200":{"description":"list of manifests","schema":{"properties":{"body":{"items":{"$ref":"#/definitions/Manifest"},"type":"array"},"pagination":{"$ref":"#/definitions/APIPageParam"}},"type":"object"}},"400":{"$ref":"#/responses/BadRequest"},"401":{"$ref":"#/responses/Unauthorized"},"403":{"$ref":"#/responses/Forbidden"},"404":{"$ref":"#/responses/NotFound"},"500":{"$ref":"#/responses/InternalServerError"}},"summary":"List all manifests for a user","tags":["manifest"]},"post":{"description":"Create Manifest by name and version(optional).\nCustomers can use any version listed in the `/v2/manifests/versions`\nendpoint (use attribute `value`).\nIf no version is specified, it will take the latest available version\n for Manifest.","operationId":"createManifest","parameters":[{"description":"must be less than 100 characters and use only numbers, letters, underscores, hyphens, and periods","in":"query","name":"Name","required":true,"type":"string"},{"in":"query","name":"version","type":"string"}],"responses":{"200":{"description":"Success","schema":{"properties":{"body":{"$ref":"#/definitions/ManifestSummary"}},"type":"object"}},"400":{"$ref":"#/responses/BadRequest"},"401":{"$ref":"#/responses/Unauthorized"},"403":{"$ref":"#/responses/Forbidden"},"404":{"$ref":"#/responses/NotFound"},"500":{"$ref":"#/responses/InternalServerError"}},"summary":"Create Manifest","tags":["manifest"]}},"/manifests/versions":{"get":{"description":"Returns list of Satellite version 6.0 and above","operationId":"listVersionsManifest","responses":{"200":{"description":"list of Satellite version","schema":{"properties":{"body":{"items":{"$ref":"#/definitions/ManifestVersion"},"type":"array"}},"type":"object"}},"400":{"$ref":"#/responses/BadRequest"},"401":{"$ref":"#/responses/Unauthorized"},"403":{"$ref":"#/responses/Forbidden"},"404":{"$ref":"#/responses/NotFound"},"500":{"$ref":"#/responses/InternalServerError"}},"summary":"List Satellite versions","tags":["manifest"]}},"/manifests/{uuid}":{"delete":{"description":"The default success response will be 204\n\nSystem, RHUI, Hypervisor, SAM are unsupported manifet types","operationId":"removeManifest","parameters":[{"in":"path","name":"uuid","required":true,"type":"string"},{"description":"Deleting a subscription manifest can have significant impacts on your hosts and activation keys.\nWe require a force parameter to make sure the delete operation is intentional.","enum":[true],"in":"query","name":"force","required":true,"type":"boolean"}],"responses":{"204":{"description":"Successfully removed"},"400":{"$ref":"#/responses/BadRequest"},"401":{"$ref":"#/responses/Unauthorized"},"403":{"$ref":"#/responses/Forbidden"},"404":{"$ref":"#/responses/NotFound"},"500":{"$ref":"#/responses/InternalServerError"},"504":{"$ref":"#/responses/GatewayTimeout"}},"summary":"Remove manifest profile","tags":["manifest"]},"get":{"description":"System, RHUI, Hypervisor, SAM are unsupported manifest types","operationId":"showManifest","parameters":[{"in":"path","name":"uuid","required":true,"type":"string"},{"description":"Show more details about a manifest","enum":["entitlements"],"in":"query","maxItems":1,"name":"include","type":"string"}],"responses":{"200":{"description":"success response","schema":{"properties":{"body":{"$ref":"#/definitions/ManifestDetails"}},"type":"object"}},"400":{"$ref":"#/responses/BadRequest"},"401":{"$ref":"#/responses/Unauthorized"},"403":{"$ref":"#/responses/Forbidden"},"404":{"$ref":"#/responses/NotFound"},"500":{"$ref":"#/responses/InternalServerError"}},"summary":"Get an Manifest by UUID","tags":["manifest"]},"put":{"description":"Allows to update simpleContentAccess for Satellite of version 6.3 and\nabove\nPossible value for simpleContentAccess are:\n\n- enabled\n- disabled","operationId":"updateManifest","parameters":[{"in":"path","name":"uuid","required":true,"type":"string"},{"in":"body","name":"manifest","schema":{"properties":{"simpleContentAccess":{"type":"string"}},"required":["simpleContentAccess"],"type":"object"}}],"responses":{"204":{"$ref":"#/responses/NoContent"},"400":{"$ref":"#/responses/BadRequest"},"401":{"$ref":"#/responses/Unauthorized"},"403":{"$ref":"#/responses/Forbidden"},"404":{"$ref":"#/responses/NotFound"},"500":{"$ref":"#/responses/InternalServerError"}},"summary":"Update a manifest","tags":["manifest"]}},"/manifests/{uuid}/entitlements":{"post":{"description":"Satellite 5.6 or higher versions are only supported.","operationId":"attachEntitlementManifest","parameters":[{"in":"query","maxItems":1,"minItems":1,"name":"pool","required":true,"type":"string"},{"description":"quantity you want to attach","in":"query","name":"quantity","type":"integer"},{"in":"path","name":"uuid","required":true,"type":"string"}],"responses":{"200":{"description":"Success","schema":{"properties":{"body":{"$ref":"#/definitions/ManifestDetails"}},"type":"object"}},"400":{"$ref":"#/responses/BadRequest"},"401":{"$ref":"#/responses/Unauthorized"},"403":{"$ref":"#/responses/Forbidden"},"404":{"$ref":"#/responses/NotFound"},"500":{"$ref":"#/responses/InternalServerError"},"504":{"$ref":"#/responses/GatewayTimeout"}},"summary":"Attach entitlement to Manifest","tags":["manifest"]}},"/manifests/{uuid}/entitlements/{EntitlementID}":{"delete":{"description":"The default success response will be 204.","operationId":"removeManifestEntitlement","parameters":[{"in":"path","name":"uuid","required":true,"type":"string"},{"in":"path","name":"EntitlementID","required":true,"type":"string"}],"responses":{"204":{"description":"successfully removed"},"400":{"$ref":"#/responses/BadRequest"},"401":{"$ref":"#/responses/Unauthorized"},"403":{"$ref":"#/responses/Forbidden"},"404":{"$ref":"#/responses/NotFound"},"500":{"$ref":"#/responses/InternalServerError"}},"summary":"Remove entitlement from the manifest","tags":["manifest"]},"put":{"description":"The default success response will be 200.\n\nSystem, RHUI, Hypervisor, SAM are unsupported manifest types","operationId":"updateEntitlementManifest","parameters":[{"in":"path","name":"uuid","required":true,"type":"string"},{"in":"path","name":"EntitlementID","required":true,"type":"string"},{"description":"maxItem: quantity must be less than or equal to the maximum number of allowed entitlements in the entitlement pool\nminItem: 1","in":"query","name":"quantity","type":"integer"}],"responses":{"200":{"description":"Success response","schema":{"properties":{"body":{"$ref":"#/definitions/ManifestDetails"}},"type":"object"}},"400":{"$ref":"#/responses/BadRequest"},"401":{"$ref":"#/responses/Unauthorized"},"403":{"$ref":"#/responses/Forbidden"},"404":{"$ref":"#/responses/NotFound"},"500":{"$ref":"#/responses/InternalServerError"}},"summary":"Update attached entitlement to manifest","tags":["manifest"]}},"/manifests/{uuid}/export":{"get":{"description":"Starts job to generate export for a manifest. To check the status of the export job visit the href in the response.\n\nSatellite 6.0 or higher versions are only supported.","operationId":"exportManifest","parameters":[{"in":"path","name":"uuid","required":true,"type":"string"}],"responses":{"200":{"description":"ExportManifest200 is the success response","schema":{"properties":{"body":{"$ref":"#/definitions/exportResponse"}},"type":"object"}},"400":{"$ref":"#/responses/BadRequest"},"401":{"$ref":"#/responses/Unauthorized"},"403":{"$ref":"#/responses/Forbidden"},"404":{"$ref":"#/responses/NotFound"},"500":{"$ref":"#/responses/InternalServerError"}},"summary":"Trigger manifest export","tags":["manifest"]}},"/manifests/{uuid}/export/{ExportID}":{"get":{"description":"Success response contains a zip file. The link is one-time download and expires after one try. Trigger export job to get another download link.\n\nContent-Type: application/zip","operationId":"getExportManifest","parameters":[{"in":"path","name":"uuid","required":true,"type":"string"},{"in":"path","name":"ExportID","required":true,"type":"string"}],"produces":["application/zip"],"responses":{"200":{"description":"GetExportManifest200 is the success response","schema":{"items":{"type":"integer"},"type":"array"}},"400":{"$ref":"#/responses/BadRequest"},"401":{"$ref":"#/responses/Unauthorized"},"403":{"$ref":"#/responses/Forbidden"},"404":{"$ref":"#/responses/NotFound"},"500":{"$ref":"#/responses/InternalServerError"}},"summary":"Download manifest","tags":["manifest"]}},"/manifests/{uuid}/exportJob/{ExportJobID}":{"get":{"description":"Returns export download link in response.","operationId":"exportJobManifest","parameters":[{"in":"path","name":"uuid","required":true,"type":"string"},{"in":"path","name":"ExportJobID","required":true,"type":"string"}],"responses":{"200":{"description":"ExportJobManifest200 is the success response","schema":{"properties":{"body":{"$ref":"#/definitions/exportJobResponse"}},"type":"object"}},"202":{"description":"AcceptedExportJob202 is a response for accepted and in progress job","schema":{"properties":{"body":{"$ref":"#/definitions/ongoingExportJobResponse"}},"type":"object"}},"400":{"$ref":"#/responses/BadRequest"},"401":{"$ref":"#/responses/Unauthorized"},"403":{"$ref":"#/responses/Forbidden"},"404":{"$ref":"#/responses/NotFound"},"406":{"$ref":"#/responses/NotAcceptable"},"500":{"$ref":"#/responses/InternalServerError"}},"summary":"Check status of manifest export","tags":["manifest"]}},"/manifests/{uuid}/pools":{"get":{"description":"Satellite 5.6 or higher versions are only supported.","operationId":"listManifestPools","parameters":[{"description":"max number of results you want","in":"query","name":"limit","type":"integer"},{"description":"index from which you want next items","in":"query","name":"offset","type":"integer"},{"description":"include future dated pools for satellite 6.3 or higher","enum":[true],"in":"query","name":"future","type":"boolean"},{"in":"path","name":"uuid","required":true,"type":"string"}],"responses":{"200":{"description":"list of pools available for the manifest","schema":{"$ref":"#/definitions/poolsListMock"}},"400":{"$ref":"#/responses/BadRequest"},"401":{"$ref":"#/responses/Unauthorized"},"403":{"$ref":"#/responses/Forbidden"},"404":{"$ref":"#/responses/NotFound"},"500":{"$ref":"#/responses/InternalServerError"}},"summary":"List all pools for a manifest","tags":["manifest"]}},"/organization":{"get":{"description":"Show Simple Content Access details of user's organization","operationId":"checkOrgSCACapability","parameters":[{"description":"Request for system purpose attributes in response","in":"query","name":"include","type":"string"}],"responses":{"200":{"description":"Organization details","schema":{"properties":{"body":{"$ref":"#/definitions/OrgSimpleContentAccess"}},"type":"object"}},"400":{"$ref":"#/responses/BadRequest"},"401":{"$ref":"#/responses/Unauthorized"},"403":{"$ref":"#/responses/Forbidden"},"404":{"$ref":"#/responses/NotFound"},"500":{"$ref":"#/responses/InternalServerError"}},"summary":"Get details of the user's organization","tags":["organization"]}},"/products":{"get":{"description":"Get list of all the products of user's subscription. The products are from subscriptions that have not expired or expired within last 30 days.\n","operationId":"listProducts","parameters":[{"description":"Filters products based on subscription status","enum":["expired","expiringSoon","active","futureDated"],"in":"query","name":"status","type":"string"},{"description":"Request additional attributes per product in response","enum":["providedProducts"],"in":"query","name":"include","type":"string"},{"description":"Filters products based on the comma separated list of engineering product oids passed. When multiple values are passed, the products matching with all the oids within their providedProducts will be returned\n","in":"query","name":"oids","type":"string"}],"responses":{"200":{"description":"Product list","schema":{"properties":{"body":{"items":{"$ref":"#/definitions/ProductList"},"type":"array"}},"type":"object"}},"400":{"$ref":"#/responses/BadRequest"},"401":{"$ref":"#/responses/Unauthorized"},"403":{"$ref":"#/responses/Forbidden"},"500":{"$ref":"#/responses/InternalServerError"}},"summary":"List all the products from user's subscription","tags":["products"]}},"/products/RHEL/extended-update-support-products":{"get":{"description":"Returns the list of currently supported RHEL product-repo mappings for Extended Update Support","responses":{"200":{"description":"Extended Update Support versions","schema":{"properties":{"body":{"items":{"$ref":"#/definitions/EusProductList"},"type":"array"}},"type":"object"}},"400":{"$ref":"#/responses/BadRequest"},"401":{"$ref":"#/responses/Unauthorized"},"403":{"$ref":"#/responses/Forbidden"},"500":{"$ref":"#/responses/InternalServerError"}},"summary":"List RHEL EUS products","tags":["products"]}},"/products/RHEL/extended-update-support-versions":{"get":{"description":"Returns the list of currently supported RHEL versions for Extended Update Support","responses":{"200":{"description":"Extended Update Support versions","schema":{"properties":{"body":{"items":{"type":"string"},"type":"array"}},"type":"object"}},"401":{"$ref":"#/responses/Unauthorized"},"403":{"$ref":"#/responses/Forbidden"},"500":{"$ref":"#/responses/InternalServerError"}},"summary":"List RHEL EUS versions","tags":["products"]}},"/products/export":{"get":{"description":"Export a csv file of all subscriptions","produces":["text/csv"],"responses":{"200":{"description":"Export","examples":{"text/csv":"Name,SKU,Service level,Support type,Capacity name,Capacity quantity,Contract number,Quantity,Start date,End date,Status (Active, Expired, Future Dated)\nExample Name, Example SKU, Example Service level, Example Support type, Example Capacity name, Example Contract number, Example Quantity, Example Start date, Example End date, Example Status\n"},"schema":{"type":"file"}},"401":{"$ref":"#/responses/Unauthorized"},"403":{"$ref":"#/responses/Forbidden"},"500":{"$ref":"#/responses/InternalServerError"}},"summary":"Export subscriptions","tags":["products"]}},"/products/status":{"get":{"description":"Get counts of user's subscriptions by status such as\n- active\n- expired\n- expiring soon\n- future dated ","operationId":"statusCounts","responses":{"200":{"description":"Status counts","schema":{"properties":{"body":{"$ref":"#/definitions/StatusCount"}},"type":"object"}},"401":{"$ref":"#/responses/Unauthorized"},"403":{"$ref":"#/responses/Forbidden"},"500":{"$ref":"#/responses/InternalServerError"}},"summary":"Get user's subscription quantities by status","tags":["products"]}},"/products/{SKU}":{"get":{"description":"Get a single product by SKU","operationId":"showProduct","parameters":[{"description":"SKU of the product to show","in":"path","name":"SKU","required":true,"type":"string"}],"responses":{"200":{"description":"Product","schema":{"properties":{"body":{"$ref":"#/definitions/ProductList"}},"type":"object"}},"400":{"$ref":"#/responses/BadRequest"},"401":{"$ref":"#/responses/Unauthorized"},"403":{"$ref":"#/responses/Forbidden"},"500":{"$ref":"#/responses/InternalServerError"}},"summary":"Show product","tags":["products"]}}},"produces":["application/json"],"responses":{"BadRequest":{"description":"BadRequest error","schema":{"properties":{"error":{"$ref":"#/definitions/ErrorDetails"}},"type":"object"}},"Forbidden":{"description":"Forbidden error","schema":{"properties":{"error":{"$ref":"#/definitions/ErrorDetails"}},"type":"object"}},"GatewayTimeout":{"description":"GatewayTimeout error","schema":{"properties":{"error":{"$ref":"#/definitions/ErrorDetails"}},"type":"object"}},"InternalServerError":{"description":"InternalServerError error","schema":{"properties":{"error":{"$ref":"#/definitions/ErrorDetails"}},"type":"object"}},"NoContent":{"description":"No Content"},"NotAcceptable":{"description":"NotAcceptable error","schema":{"properties":{"error":{"$ref":"#/definitions/ErrorDetails"}},"type":"object"}},"NotFound":{"description":"NotFound error","schema":{"properties":{"error":{"$ref":"#/definitions/ErrorDetails"}},"type":"object"}},"Unauthorized":{"description":"Unauthorized error","schema":{"properties":{"error":{"$ref":"#/definitions/ErrorDetails"}},"type":"object"}}},"schemes":["https"],"swagger":"2.0"} \ No newline at end of file diff --git a/src/Components/CreateImageWizard/steps/Review/ReviewStepTextLists.tsx b/src/Components/CreateImageWizard/steps/Review/ReviewStepTextLists.tsx index c43ea0f3..16bc04d0 100644 --- a/src/Components/CreateImageWizard/steps/Review/ReviewStepTextLists.tsx +++ b/src/Components/CreateImageWizard/steps/Review/ReviewStepTextLists.tsx @@ -232,7 +232,7 @@ export const TargetEnvAWSList = () => { }, { selectFromResult: ({ data }) => ({ - source: data?.data?.find((source) => source.id === sourceId), + source: data?.data?.find((source) => source?.id === sourceId), }), } ); @@ -364,7 +364,7 @@ export const TargetEnvAzureList = () => { { rawAzureSources?.data?.find( - (source) => source.id === azureSource + (source) => source?.id === azureSource )?.name } diff --git a/src/Components/CreateImageWizard/steps/TargetEnvironment/Aws/AwsSourcesSelect.tsx b/src/Components/CreateImageWizard/steps/TargetEnvironment/Aws/AwsSourcesSelect.tsx index 061b1837..f7c62d84 100644 --- a/src/Components/CreateImageWizard/steps/TargetEnvironment/Aws/AwsSourcesSelect.tsx +++ b/src/Components/CreateImageWizard/steps/TargetEnvironment/Aws/AwsSourcesSelect.tsx @@ -36,18 +36,18 @@ export const AwsSourcesSelect = () => { }); const sources = data?.data; - const chosenSource = sources?.find((source) => source.id === sourceId); + const chosenSource = sources?.find((source) => source?.id === sourceId); const [selectOptions, setSelectOptions] = useState<(string | undefined)[]>( - sources ? sources.map((source) => source.name) : [] + sources ? sources.map((source) => source?.name) : [] ); useEffect(() => { - let filteredSources = sources?.map((source) => source.name); + let filteredSources = sources?.map((source) => source?.name); if (sources && filterValue) { filteredSources = sources - .map((source) => source.name) + .map((source) => source?.name) .filter((source: string) => String(source).toLowerCase().includes(filterValue.toLowerCase()) ); @@ -87,7 +87,7 @@ export const AwsSourcesSelect = () => { _event: React.MouseEvent, value: string ) => { - const source = sources?.find((source) => source.name === value); + const source = sources?.find((source) => source?.name === value); dispatch(changeAwsSourceId(source?.id)); setIsOpen(false); }; diff --git a/src/Components/CreateImageWizard/steps/TargetEnvironment/Azure/AzureSourcesSelect.tsx b/src/Components/CreateImageWizard/steps/TargetEnvironment/Azure/AzureSourcesSelect.tsx index 9fb9153a..fcedc100 100644 --- a/src/Components/CreateImageWizard/steps/TargetEnvironment/Azure/AzureSourcesSelect.tsx +++ b/src/Components/CreateImageWizard/steps/TargetEnvironment/Azure/AzureSourcesSelect.tsx @@ -57,7 +57,7 @@ export const AzureSourcesSelect = () => { ); const [selectOptions, setSelectOptions] = useState<(string | undefined)[]>( - rawSources?.data?.map((source) => source.name) || [] + rawSources?.data?.map((source) => source?.name) || [] ); useEffect(() => { @@ -75,11 +75,11 @@ export const AzureSourcesSelect = () => { ]); useEffect(() => { - let filteredSources = rawSources?.data?.map((source) => source.name); + let filteredSources = rawSources?.data?.map((source) => source?.name); if (filterValue) { filteredSources = rawSources?.data - ?.map((source) => source.name) + ?.map((source) => source?.name) .filter((source: string) => String(source).toLowerCase().includes(filterValue.toLowerCase()) ); @@ -119,7 +119,7 @@ export const AzureSourcesSelect = () => { sourceName: string ) => { const sourceId = rawSources?.data?.find( - (source) => source.name === sourceName + (source) => source?.name === sourceName )?.id; dispatch(changeAzureSource(sourceId || '')); dispatch(changeAzureResourceGroup('')); @@ -145,7 +145,7 @@ export const AzureSourcesSelect = () => { }; const selectedSource = azureSource - ? rawSources?.data?.find((source) => source.id === azureSource)?.name + ? rawSources?.data?.find((source) => source?.id === azureSource)?.name : undefined; const toggle = (toggleRef: React.Ref) => ( diff --git a/src/Components/ImagesTable/ImageDetails.tsx b/src/Components/ImagesTable/ImageDetails.tsx index 2d7cb5ac..ebf4cbfa 100644 --- a/src/Components/ImagesTable/ImageDetails.tsx +++ b/src/Components/ImagesTable/ImageDetails.tsx @@ -88,7 +88,7 @@ const AzureSourceName = ({ id }: AzureSourceNamePropTypes) => { const sources = extractProvisioningList(rawSources); - const sourcename = sources?.find((source) => source.id === id); + const sourcename = sources?.find((source) => source?.id === id); if (sourcename) { return

{sourcename.name}

; } @@ -111,7 +111,7 @@ const AwsSourceName = ({ id }: AwsSourceNamePropTypes) => { const sources = extractProvisioningList(rawSources); - const sourcename = sources?.find((source) => source.id === id); + const sourcename = sources?.find((source) => source?.id === id); if (sourcename) { return

{sourcename.name}

; } diff --git a/src/Components/ImagesTable/Instance.tsx b/src/Components/ImagesTable/Instance.tsx index b0f67942..09a33a96 100644 --- a/src/Components/ImagesTable/Instance.tsx +++ b/src/Components/ImagesTable/Instance.tsx @@ -390,6 +390,7 @@ export const AwsS3Instance = ({ 'rhel-edge-installer': '', vhd: '', oci: '', + 'openshift-virt': '.tar', }; const status = composeStatus?.image_status.status; diff --git a/src/constants.ts b/src/constants.ts index ab617b88..3f518e6c 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -82,6 +82,7 @@ export const targetOptions: { [key in ImageTypes]: string } = { 'rhel-edge-installer': 'RHEL Edge Installer', vhd: '', oci: 'Oracle Cloud Infrastructure', + 'openshift-virt': 'OpenShift Virtualization', }; export const UNIT_KIB = 1024 ** 1; diff --git a/src/store/cockpit/composerCloudApi.ts b/src/store/cockpit/composerCloudApi.ts index 82ec7d81..ec20eecf 100644 --- a/src/store/cockpit/composerCloudApi.ts +++ b/src/store/cockpit/composerCloudApi.ts @@ -131,6 +131,7 @@ export type ImageTypes = | "aws-rhui" | "aws-sap-rhui" | "azure" + | "azure-cvm" | "azure-eap7-rhui" | "azure-rhui" | "azure-sap-rhui" @@ -536,11 +537,11 @@ export type FilesystemTyped = { */ part_type?: string | undefined; minsize?: Minsize | undefined; - mountpoint: string; + mountpoint?: string | undefined; label?: string | undefined; - /** The filesystem type + /** The filesystem type. Swap partitions must have an empty mountpoint. */ - fs_type?: ("ext4" | "xfs" | "vfat") | undefined; + fs_type: "ext4" | "xfs" | "vfat" | "swap"; }; export type BtrfsSubvolume = { /** The name of the subvolume, which defines the location (path) on the root volume @@ -551,7 +552,7 @@ export type BtrfsSubvolume = { mountpoint: string; }; export type BtrfsVolume = { - type?: "btrfs" | undefined; + type: "btrfs"; /** The partition type GUID for GPT partitions. For DOS partitions, this field can be used to set the (2 hex digit) partition type. If not set, the type will be automatically set based on the mountpoint or the payload type. */ part_type?: string | undefined; @@ -563,14 +564,14 @@ export type LogicalVolume = { minsize?: Minsize | undefined; /** Mountpoint for the logical volume */ - mountpoint: string; + mountpoint?: string | undefined; label?: string | undefined; - /** The filesystem type for the logical volume + /** The filesystem type for the logical volume. Swap LVs must have an empty mountpoint. */ - fs_type?: ("ext4" | "xfs" | "vfat") | undefined; + fs_type: "ext4" | "xfs" | "vfat" | "swap"; }; export type VolumeGroup = { - type?: "lvm" | undefined; + type: "lvm"; /** The partition type GUID for GPT partitions. For DOS partitions, this field can be used to set the (2 hex digit) partition type. If not set, the type will be automatically set based on the mountpoint or the payload type. */ part_type?: string | undefined; diff --git a/src/store/service/edgeApi.ts b/src/store/service/edgeApi.ts index 6034c289..16c55889 100644 --- a/src/store/service/edgeApi.ts +++ b/src/store/service/edgeApi.ts @@ -82,7 +82,7 @@ const injectedRtkApi = api.injectEndpoints({ query: (queryArg) => ({ url: `/images`, method: "POST", - body: queryArg.createImage, + body: queryArg.modelsCreateImageApi, }), }), checkImageName: build.mutation< @@ -92,7 +92,7 @@ const injectedRtkApi = api.injectEndpoints({ query: (queryArg) => ({ url: `/images/checkImageName`, method: "POST", - body: queryArg.createImage, + body: queryArg.modelsCreateImageApi, }), }), createInstallerForImage: build.mutation< @@ -102,7 +102,7 @@ const injectedRtkApi = api.injectEndpoints({ query: (queryArg) => ({ url: `/images/${queryArg.imageId}/installer`, method: "POST", - body: queryArg.createImage, + body: queryArg.modelsCreateImageApi, }), }), createKickStartForImage: build.mutation< @@ -112,7 +112,7 @@ const injectedRtkApi = api.injectEndpoints({ query: (queryArg) => ({ url: `/images/${queryArg.imageId}/kickstart`, method: "POST", - body: queryArg.createImage, + body: queryArg.modelsCreateImageApi, }), }), getMetadataForImage: build.query< @@ -134,7 +134,7 @@ const injectedRtkApi = api.injectEndpoints({ query: (queryArg) => ({ url: `/images/${queryArg.imageId}/retry`, method: "POST", - body: queryArg.createImage, + body: queryArg.modelsCreateImageApi, }), }), createImageUpdate: build.mutation< @@ -144,7 +144,7 @@ const injectedRtkApi = api.injectEndpoints({ query: (queryArg) => ({ url: `/images/${queryArg.imageId}/update`, method: "POST", - body: queryArg.createImage, + body: queryArg.modelsCreateImageApi, }), }), getImageByOstree: build.query< @@ -239,13 +239,13 @@ export type GetAllImagesApiArg = { export type CreateImageApiResponse = /** status 200 OK */ ImageResponse; export type CreateImageApiArg = { /** request body */ - createImage: CreateImage; + modelsCreateImageApi: ModelsCreateImageApi; }; export type CheckImageNameApiResponse = /** status 200 OK */ ModelsSuccessPlaceholderResponse; export type CheckImageNameApiArg = { /** request body */ - createImage: CreateImage; + modelsCreateImageApi: ModelsCreateImageApi; }; export type CreateInstallerForImageApiResponse = /** status 200 OK */ ModelsSuccessPlaceholderResponse; @@ -253,7 +253,7 @@ export type CreateInstallerForImageApiArg = { /** Image ID */ imageId: number; /** request body */ - createImage: CreateImage; + modelsCreateImageApi: ModelsCreateImageApi; }; export type CreateKickStartForImageApiResponse = /** status 200 OK */ ModelsSuccessPlaceholderResponse; @@ -261,7 +261,7 @@ export type CreateKickStartForImageApiArg = { /** Image ID */ imageId: number; /** request body */ - createImage: CreateImage; + modelsCreateImageApi: ModelsCreateImageApi; }; export type GetMetadataForImageApiResponse = /** status 200 OK */ ModelsSuccessPlaceholderResponse; @@ -281,7 +281,7 @@ export type RetryCreateImageApiArg = { /** Image ID */ imageId: number; /** request body */ - createImage: CreateImage; + modelsCreateImageApi: ModelsCreateImageApi; }; export type CreateImageUpdateApiResponse = /** status 200 OK */ ModelsSuccessPlaceholderResponse; @@ -289,7 +289,7 @@ export type CreateImageUpdateApiArg = { /** Image ID */ imageId: number; /** request body */ - createImage: CreateImage; + modelsCreateImageApi: ModelsCreateImageApi; }; export type GetImageByOstreeApiResponse = /** status 200 OK */ ModelsSuccessPlaceholderResponse; @@ -308,10 +308,7 @@ export type GormDeletedAt = { valid?: boolean | undefined; }; export type ModelsInstalledPackage = { - CreatedAt?: ModelsEdgeApiTime | undefined; - DeletedAt?: GormDeletedAt | undefined; ID?: number | undefined; - UpdatedAt?: ModelsEdgeApiTime | undefined; arch?: string | undefined; commits?: ModelsCommit[] | undefined; epoch?: string | undefined; @@ -326,9 +323,17 @@ export type ModelsRepo = { CreatedAt?: ModelsEdgeApiTime | undefined; DeletedAt?: GormDeletedAt | undefined; ID?: number | undefined; + /** AWS repo upload status */ RepoStatus?: string | undefined; + /** AWS repo URL */ RepoURL?: string | undefined; UpdatedAt?: ModelsEdgeApiTime | undefined; + /** Pulp Repo ID (used for updates) */ + pulp_repo_id?: string | undefined; + /** Status of Pulp repo import */ + pulp_repo_status?: string | undefined; + /** Distribution URL returned from Pulp */ + pulp_repo_url?: string | undefined; }; export type ModelsCommit = { Account?: string | undefined; @@ -422,6 +427,7 @@ export type ModelsImage = { TotalPackages?: number | undefined; UpdatedAt?: ModelsEdgeApiTime | undefined; Version?: number | undefined; + activationKey?: string | undefined; org_id?: string | undefined; /** storing for logging reference on resume */ request_id?: string | undefined; @@ -547,11 +553,12 @@ export type ImageResponse = { TotalPackages?: number | undefined; UpdatedAt?: ModelsEdgeApiTime | undefined; Version?: number | undefined; + activationKey?: string | undefined; org_id?: string | undefined; /** storing for logging reference on resume */ request_id?: string | undefined; }; -export type CreateImage = object; +export type ModelsCreateImageApi = object; export const { useListAllImageSetsQuery, useGetImageSetsViewQuery, diff --git a/src/store/service/imageBuilderApi.ts b/src/store/service/imageBuilderApi.ts index dc36c493..520efe19 100644 --- a/src/store/service/imageBuilderApi.ts +++ b/src/store/service/imageBuilderApi.ts @@ -462,6 +462,7 @@ export type ImageTypes = | "guest-image" | "image-installer" | "oci" + | "openshift-virt" | "vsphere" | "vsphere-ova" | "wsl" @@ -998,14 +999,12 @@ export type DistributionProfileItem = export type DistributionProfileResponse = DistributionProfileItem[]; export type RecommendationsResponse = { packages: string[]; - /** Version of the recommendation model used */ modelVersion?: string | undefined; }; export type RecommendPackageRequest = { packages: string[]; recommendedPackages: number; - /** RHEL major release (e.g. "rhel8", "rhel9", "rhel10") */ - distribution?: string | undefined; + distribution: string; }; export const { useGetArchitecturesQuery, diff --git a/src/store/service/provisioningApi.ts b/src/store/service/provisioningApi.ts index b1f6ae82..2b42001d 100644 --- a/src/store/service/provisioningApi.ts +++ b/src/store/service/provisioningApi.ts @@ -6,6 +6,8 @@ const injectedRtkApi = api.injectEndpoints({ url: `/sources`, params: { provider: queryArg.provider, + limit: queryArg.limit, + offset: queryArg.offset, }, }), }), @@ -23,6 +25,10 @@ export type GetSourceListApiResponse = /** status 200 Returned on success. */ V1ListSourceResponse; export type GetSourceListApiArg = { provider?: "aws" | "azure" | "gcp"; + /** The number of items to return. */ + limit?: number; + /** The number of items to skip before starting to collect the result set. */ + offset?: number; }; export type GetSourceUploadInfoApiResponse = /** status 200 Return on success. */ V1SourceUploadInfoResponse; @@ -32,12 +38,26 @@ export type GetSourceUploadInfoApiArg = { }; export type V1ListSourceResponse = { data?: - | { + | ({ id?: string | undefined; name?: string | undefined; + /** One of ('azure', 'aws', 'gcp') */ + provider?: string | undefined; source_type_id?: string | undefined; + status?: string | undefined; uid?: string | undefined; - }[] + } | null)[] + | undefined; + metadata?: + | { + links?: + | { + next?: string | undefined; + previous?: string | undefined; + } + | undefined; + total?: number | undefined; + } | undefined; }; export type V1ResponseError = { diff --git a/src/store/service/rhsmApi.ts b/src/store/service/rhsmApi.ts index c37d922e..31320868 100644 --- a/src/store/service/rhsmApi.ts +++ b/src/store/service/rhsmApi.ts @@ -43,6 +43,8 @@ export type CreateActivationKeysApiArg = { repositoryLabel?: string | undefined; }[] | undefined; + /** should be 255 characters or shorter */ + description?: string | undefined; /** Name should be present, unique and can only contain letters, numbers, underscores, or hyphens */ name: string; releaseVersion?: string | undefined; @@ -59,15 +61,16 @@ export type ShowActivationKeyApiArg = { }; export type AdditionalRepositories = { repositoryLabel?: string | undefined; - repositoryName?: string | undefined; }; export type ActivationKeys = { additionalRepositories?: AdditionalRepositories[] | undefined; + description?: string | undefined; id?: string | undefined; name?: string | undefined; releaseVersion?: string | undefined; role?: string | undefined; serviceLevel?: string | undefined; + updatedAt?: string | undefined; usage?: string | undefined; }; export type ErrorDetails = { From 3f1a80fbe2749ffe309723a9c2089ca2f9e98cf3 Mon Sep 17 00:00:00 2001 From: regexowl Date: Thu, 3 Jul 2025 10:19:09 +0200 Subject: [PATCH 142/331] Run actions with Node 22 The github actions were previously ran with Node 20, this bumps them to Node 22. README was also updated to reflect currently used version of Node. --- .github/workflows/dev-checks.yml | 16 ++++++++-------- .github/workflows/playwright.yml | 2 +- .github/workflows/release.yml | 4 ++-- .github/workflows/unit-tests.yml | 8 ++++---- README.md | 2 +- build_deploy.sh | 2 +- .../steps/Timezone/Timezone.test.tsx | 2 +- 7 files changed, 18 insertions(+), 18 deletions(-) diff --git a/.github/workflows/dev-checks.yml b/.github/workflows/dev-checks.yml index bcea74e8..b67d0cc8 100644 --- a/.github/workflows/dev-checks.yml +++ b/.github/workflows/dev-checks.yml @@ -17,10 +17,10 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - name: Use Node.js 20 + - name: Use Node.js 22 uses: actions/setup-node@v4 with: - node-version: 20 + node-version: 22 cache: 'npm' - name: Install dependencies run: npm ci @@ -32,10 +32,10 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - name: Use Node.js 20 + - name: Use Node.js 22 uses: actions/setup-node@v4 with: - node-version: 20 + node-version: 22 cache: 'npm' - name: Install dependencies run: npm ci @@ -47,10 +47,10 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - name: Use Node.js 20 + - name: Use Node.js 22 uses: actions/setup-node@v4 with: - node-version: 20 + node-version: 22 cache: 'npm' - name: Install dependencies run: npm ci @@ -62,10 +62,10 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - name: Use Node.js 20 + - name: Use Node.js 22 uses: actions/setup-node@v4 with: - node-version: 20 + node-version: 22 cache: 'npm' - name: Install dependencies run: npm ci diff --git a/.github/workflows/playwright.yml b/.github/workflows/playwright.yml index 7dd7a378..5e6ee70e 100644 --- a/.github/workflows/playwright.yml +++ b/.github/workflows/playwright.yml @@ -37,7 +37,7 @@ jobs: - name: Set up Node.js uses: actions/setup-node@v4 with: - node-version: 20 + node-version: 22 cache: "npm" - name: Install front-end dependencies diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 482bcfa8..c6011882 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -13,10 +13,10 @@ jobs: # artefact name. - uses: actions/checkout@v4 - - name: Use Node.js 20 + - name: Use Node.js 22 uses: actions/setup-node@v4 with: - node-version: 20 + node-version: 22 cache: 'npm' - name: Install dependencies diff --git a/.github/workflows/unit-tests.yml b/.github/workflows/unit-tests.yml index 16214e5d..488cb413 100644 --- a/.github/workflows/unit-tests.yml +++ b/.github/workflows/unit-tests.yml @@ -19,10 +19,10 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - name: Use Node.js 20 + - name: Use Node.js 22 uses: actions/setup-node@v4 with: - node-version: 20 + node-version: 22 cache: 'npm' - name: Install dependencies run: npm ci @@ -40,10 +40,10 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - name: Use Node.js 20 + - name: Use Node.js 22 uses: actions/setup-node@v4 with: - node-version: 20 + node-version: 22 cache: 'npm' - name: Install dependencies run: npm ci diff --git a/README.md b/README.md index 14f59267..b0a22d2d 100644 --- a/README.md +++ b/README.md @@ -39,7 +39,7 @@ worrying if a feature from stage has been released yet. #### Nodejs and npm version -Make sure you have npm@10 and node 18+ installed. If you need multiple versions of nodejs check out [nvm](https://github.com/nvm-sh/nvm). +Make sure you have npm@10 and node 22+ installed. If you need multiple versions of nodejs check out [nvm](https://github.com/nvm-sh/nvm). #### Webpack proxy diff --git a/build_deploy.sh b/build_deploy.sh index cbe4db67..11da7b04 100755 --- a/build_deploy.sh +++ b/build_deploy.sh @@ -9,7 +9,7 @@ export COMPONENT="image-builder" export IMAGE="quay.io/cloudservices/image-builder-frontend" export APP_ROOT=$(pwd) export WORKSPACE=${WORKSPACE:-$APP_ROOT} # if running in jenkins, use the build's workspace -export NODE_BUILD_VERSION=18 +export NODE_BUILD_VERSION=22 COMMON_BUILDER=https://raw.githubusercontent.com/RedHatInsights/insights-frontend-builder-common/master set -exv diff --git a/src/test/Components/CreateImageWizard/steps/Timezone/Timezone.test.tsx b/src/test/Components/CreateImageWizard/steps/Timezone/Timezone.test.tsx index fe5494a7..129a2661 100644 --- a/src/test/Components/CreateImageWizard/steps/Timezone/Timezone.test.tsx +++ b/src/test/Components/CreateImageWizard/steps/Timezone/Timezone.test.tsx @@ -50,7 +50,7 @@ const goToReviewStep = async () => { }; const selectTimezone = async () => { - const user = userEvent.setup(); + const user = userEvent.setup({ delay: null }); const timezoneDropdown = await screen.findByPlaceholderText( /select a timezone/i ); From 9a29eeb28dbb6b6e76366049324c75109fee6baa Mon Sep 17 00:00:00 2001 From: CD Cabrera Date: Tue, 1 Jul 2025 15:53:00 -0400 Subject: [PATCH 143/331] fix: hms-8708 landing page sticky header --- src/Components/LandingPage/LandingPage.tsx | 140 +++++++++--------- .../sharedComponents/ImageBuilderHeader.tsx | 2 +- 2 files changed, 72 insertions(+), 70 deletions(-) diff --git a/src/Components/LandingPage/LandingPage.tsx b/src/Components/LandingPage/LandingPage.tsx index 80b010d8..a1ea0ff7 100644 --- a/src/Components/LandingPage/LandingPage.tsx +++ b/src/Components/LandingPage/LandingPage.tsx @@ -86,26 +86,65 @@ export const LandingPage = () => { return ( <> - {edgeParityFlag ? ( - - Conventional (RPM-DNF){''} } - actions={ - + + {edgeParityFlag ? ( + + Conventional (RPM-DNF){''} } + actions={ + + + + With RPM-DNF, you can manage the system software by + using the DNF package manager and updated RPM + packages. This is a simple and adaptive method of + managing and modifying the system over its lifecycle. + + + + + +
+ } + /> + } + > + {imageList} + + Immutable (OSTree) } + actions={ + - With RPM-DNF, you can manage the system software by - using the DNF package manager and updated RPM packages. - This is a simple and adaptive method of managing and - modifying the system over its lifecycle. + With OSTree, you can manage the system software by + referencing a central image repository. OSTree images + contain a complete operating system ready to be remotely + installed at scale. You can track updates to images + through commits and enable secure updates that only + address changes and keep the operating system unchanged. + The updates are quick, and the rollbacks are easy. -
- } - /> - } - > - {imageList} - - Immutable (OSTree) } - actions={ - - - With OSTree, you can manage the system software by - referencing a central image repository. OSTree images - contain a complete operating system ready to be remotely - installed at scale. You can track updates to images - through commits and enable secure updates that only - address changes and keep the operating system unchanged. - The updates are quick, and the rollbacks are easy. - - - - - - } - /> - } - > - - - - ) : ( - imageList - )} - + } + /> + } + > + + + + ) : ( + imageList + )} + + ); }; diff --git a/src/Components/sharedComponents/ImageBuilderHeader.tsx b/src/Components/sharedComponents/ImageBuilderHeader.tsx index b85ad966..d44279cd 100644 --- a/src/Components/sharedComponents/ImageBuilderHeader.tsx +++ b/src/Components/sharedComponents/ImageBuilderHeader.tsx @@ -105,7 +105,7 @@ export const ImageBuilderHeader = ({ isOpen={showImportModal} /> )} - + Date: Sat, 5 Jul 2025 05:59:28 +0000 Subject: [PATCH 144/331] chore(deps): update konflux references Signed-off-by: red-hat-konflux <126015336+red-hat-konflux[bot]@users.noreply.github.com> --- .../image-builder-frontend-pull-request.yaml | 21 ++++++++-------- .tekton/image-builder-frontend-push.yaml | 24 +++++++++---------- 2 files changed, 21 insertions(+), 24 deletions(-) diff --git a/.tekton/image-builder-frontend-pull-request.yaml b/.tekton/image-builder-frontend-pull-request.yaml index 3270d99b..35617ab7 100644 --- a/.tekton/image-builder-frontend-pull-request.yaml +++ b/.tekton/image-builder-frontend-pull-request.yaml @@ -8,7 +8,7 @@ metadata: build.appstudio.redhat.com/target_branch: '{{target_branch}}' pipelinesascode.tekton.dev/max-keep-runs: "3" pipelinesascode.tekton.dev/on-cel-expression: (event == "pull_request" && target_branch == "main") || (event == "push" && target_branch.startsWith("gh-readonly-queue/main/")) - creationTimestamp: null + creationTimestamp: labels: appstudio.openshift.io/application: insights-image-builder appstudio.openshift.io/component: image-builder-frontend @@ -83,13 +83,11 @@ spec: name: output-image type: string - default: . - description: Path to the source code of an application's component from where - to build image. + description: Path to the source code of an application's component from where to build image. name: path-context type: string - default: Dockerfile - description: Path to the Dockerfile inside the context specified by parameter - path-context + description: Path to the Dockerfile inside the context specified by parameter path-context name: dockerfile type: string - default: "false" @@ -109,8 +107,7 @@ spec: name: prefetch-input type: string - default: "" - description: Image tag expiration time, time values could be something like - 1h, 2d, 3w for hours, days, and weeks, respectively. + description: Image tag expiration time, time values could be something like 1h, 2d, 3w for hours, days, and weeks, respectively. name: image-expires-after - default: "false" description: Build a source image. @@ -197,7 +194,7 @@ spec: - name: name value: prefetch-dependencies - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-prefetch-dependencies:0.2@sha256:78d4311a179437a07cc9f33fcc65fc89ae03c24c060e11e4056e914197c0261e + value: quay.io/konflux-ci/tekton-catalog/task-prefetch-dependencies:0.2@sha256:90f9ba94939895e1ecaa1a3ac861366303425375ae47a92d0cc1dc61a86df4ab - name: kind value: task resolver: bundles @@ -241,7 +238,7 @@ spec: - name: name value: buildah - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-buildah:0.4@sha256:9e69423eed84931dfad81c71ac4245cad47365af0f9ed931cf8ee45730eea9e8 + value: quay.io/konflux-ci/tekton-catalog/task-buildah:0.4@sha256:fc7437e1fc19d7a2b468e529f7fbc372ca139f194ec5d8ea28fe48b0817ec6c0 - name: kind value: task resolver: bundles @@ -338,6 +335,8 @@ spec: params: - name: image-url value: $(tasks.build-image-index.results.IMAGE_URL) + - name: image-digest + value: $(tasks.build-image-index.results.IMAGE_DIGEST) runAfter: - build-image-index taskRef: @@ -345,7 +344,7 @@ spec: - name: name value: sast-unicode-check - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-sast-unicode-check:0.2@sha256:b690b6a725fc2753283350eb313057f8d6ed7417503f80958669a20d7bbc8900 + value: quay.io/konflux-ci/tekton-catalog/task-sast-unicode-check:0.3@sha256:bec18fa5e82e801c3f267f29bf94535a5024e72476f2b27cca7271d506abb5ad - name: kind value: task resolver: bundles @@ -543,7 +542,7 @@ spec: - name: workspace volumeClaimTemplate: metadata: - creationTimestamp: null + creationTimestamp: spec: accessModes: - ReadWriteOnce diff --git a/.tekton/image-builder-frontend-push.yaml b/.tekton/image-builder-frontend-push.yaml index 3b6d91d5..a5f9aa89 100644 --- a/.tekton/image-builder-frontend-push.yaml +++ b/.tekton/image-builder-frontend-push.yaml @@ -6,9 +6,8 @@ metadata: build.appstudio.redhat.com/commit_sha: '{{revision}}' build.appstudio.redhat.com/target_branch: '{{target_branch}}' pipelinesascode.tekton.dev/max-keep-runs: "3" - pipelinesascode.tekton.dev/on-cel-expression: event == "push" && target_branch - == "main" - creationTimestamp: null + pipelinesascode.tekton.dev/on-cel-expression: event == "push" && target_branch == "main" + creationTimestamp: labels: appstudio.openshift.io/application: insights-image-builder appstudio.openshift.io/component: image-builder-frontend @@ -81,13 +80,11 @@ spec: name: output-image type: string - default: . - description: Path to the source code of an application's component from where - to build image. + description: Path to the source code of an application's component from where to build image. name: path-context type: string - default: Dockerfile - description: Path to the Dockerfile inside the context specified by parameter - path-context + description: Path to the Dockerfile inside the context specified by parameter path-context name: dockerfile type: string - default: "false" @@ -107,8 +104,7 @@ spec: name: prefetch-input type: string - default: "" - description: Image tag expiration time, time values could be something like - 1h, 2d, 3w for hours, days, and weeks, respectively. + description: Image tag expiration time, time values could be something like 1h, 2d, 3w for hours, days, and weeks, respectively. name: image-expires-after - default: "false" description: Build a source image. @@ -195,7 +191,7 @@ spec: - name: name value: prefetch-dependencies - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-prefetch-dependencies:0.2@sha256:78d4311a179437a07cc9f33fcc65fc89ae03c24c060e11e4056e914197c0261e + value: quay.io/konflux-ci/tekton-catalog/task-prefetch-dependencies:0.2@sha256:90f9ba94939895e1ecaa1a3ac861366303425375ae47a92d0cc1dc61a86df4ab - name: kind value: task resolver: bundles @@ -239,7 +235,7 @@ spec: - name: name value: buildah - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-buildah:0.4@sha256:9e69423eed84931dfad81c71ac4245cad47365af0f9ed931cf8ee45730eea9e8 + value: quay.io/konflux-ci/tekton-catalog/task-buildah:0.4@sha256:fc7437e1fc19d7a2b468e529f7fbc372ca139f194ec5d8ea28fe48b0817ec6c0 - name: kind value: task resolver: bundles @@ -336,6 +332,8 @@ spec: params: - name: image-url value: $(tasks.build-image-index.results.IMAGE_URL) + - name: image-digest + value: $(tasks.build-image-index.results.IMAGE_DIGEST) runAfter: - build-image-index taskRef: @@ -343,7 +341,7 @@ spec: - name: name value: sast-unicode-check - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-sast-unicode-check:0.2@sha256:b690b6a725fc2753283350eb313057f8d6ed7417503f80958669a20d7bbc8900 + value: quay.io/konflux-ci/tekton-catalog/task-sast-unicode-check:0.3@sha256:bec18fa5e82e801c3f267f29bf94535a5024e72476f2b27cca7271d506abb5ad - name: kind value: task resolver: bundles @@ -541,7 +539,7 @@ spec: - name: workspace volumeClaimTemplate: metadata: - creationTimestamp: null + creationTimestamp: spec: accessModes: - ReadWriteOnce From 5c9330092741bdfa1a4217beea3cd291bf9e9f38 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 7 Jul 2025 05:51:04 +0000 Subject: [PATCH 145/331] build(deps-dev): bump @babel/preset-env from 7.27.2 to 7.28.0 Bumps [@babel/preset-env](https://github.com/babel/babel/tree/HEAD/packages/babel-preset-env) from 7.27.2 to 7.28.0. - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md) - [Commits](https://github.com/babel/babel/commits/v7.28.0/packages/babel-preset-env) --- updated-dependencies: - dependency-name: "@babel/preset-env" dependency-version: 7.28.0 dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package-lock.json | 541 ++++++++++++++++++++++++++-------------------- package.json | 2 +- 2 files changed, 312 insertions(+), 231 deletions(-) diff --git a/package-lock.json b/package-lock.json index 64eafcb5..25ecb8d9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -33,7 +33,7 @@ }, "devDependencies": { "@babel/core": "7.27.7", - "@babel/preset-env": "7.27.2", + "@babel/preset-env": "7.28.0", "@babel/preset-react": "7.27.1", "@babel/preset-typescript": "7.27.1", "@currents/playwright": "1.14.1", @@ -259,9 +259,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.27.2.tgz", - "integrity": "sha512-TUtMJYRPyUb/9aU8f3K0mjmjf6M9N5Woshn2CS6nqJSeJtTtQcpLUXjGt9vbF8ZGff0El99sWkLgzwW3VXnxZQ==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.0.tgz", + "integrity": "sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -315,15 +315,15 @@ } }, "node_modules/@babel/generator": { - "version": "7.27.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.5.tgz", - "integrity": "sha512-ZGhA37l0e/g2s1Cnzdix0O3aLYm66eF8aufiVteOgnwxgnRP8GoyMj7VWsgWnQbVKXyge7hqrFh2K2TQM6t1Hw==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.0.tgz", + "integrity": "sha512-lJjzvrbEeWrhB4P3QBsH7tey117PjLZnDbLiQEKjQ/fNJTjuq4HSqgFA+UNSwZT8D7dxxbnuSBMsa1lrWzKlQg==", "license": "MIT", "dependencies": { - "@babel/parser": "^7.27.5", - "@babel/types": "^7.27.3", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", + "@babel/parser": "^7.28.0", + "@babel/types": "^7.28.0", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" }, "engines": { @@ -331,13 +331,13 @@ } }, "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.1.tgz", - "integrity": "sha512-WnuuDILl9oOBbKnb4L+DyODx7iC47XfzmNCpTttFsSp6hTG7XZxu60+4IO+2/hPfcGOoKbFiwoI/+zwARbNQow==", + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", + "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.27.1" + "@babel/types": "^7.27.3" }, "engines": { "node": ">=6.9.0" @@ -400,20 +400,31 @@ } }, "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.6.3", + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.5.tgz", + "integrity": "sha512-uJnGFcPsWQK8fvjgGP5LZUZZsYGIoPeRjSF5PGwrelYgq7Q15/Ft9NGFp1zglwgIv//W0uG4BevRuSJRyylZPg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-compilation-targets": "^7.22.6", - "@babel/helper-plugin-utils": "^7.22.5", - "debug": "^4.1.1", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-plugin-utils": "^7.27.1", + "debug": "^4.4.1", "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2" + "resolve": "^1.22.10" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-member-expression-to-functions": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.27.1.tgz", @@ -587,12 +598,12 @@ } }, "node_modules/@babel/parser": { - "version": "7.27.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.7.tgz", - "integrity": "sha512-qnzXzDXdr/po3bOTbTIQZ7+TxNKxpkN5IifVLXS+r7qwynkZfPyjZfE7hCXbo7IoO9TNcSyibgONsf2HauUd3Q==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.0.tgz", + "integrity": "sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==", "license": "MIT", "dependencies": { - "@babel/types": "^7.27.7" + "@babel/types": "^7.28.0" }, "bin": { "parser": "bin/babel-parser.js" @@ -792,15 +803,15 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.27.1.tgz", - "integrity": "sha512-eST9RrwlpaoJBDHShc+DS2SG4ATTi2MYNb4OxYkf3n+7eb49LWpnS+HSpVfW4x927qQwgk8A2hGNVaajAEw0EA==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.28.0.tgz", + "integrity": "sha512-BEOdvX4+M765icNPZeidyADIvQ1m1gmunXufXxvRESy/jNNyfovIqUyE7MVgGBjWktCoJlzvFA1To2O4ymIO3Q==", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-remap-async-to-generator": "^7.27.1", - "@babel/traverse": "^7.27.1" + "@babel/traverse": "^7.28.0" }, "engines": { "node": ">=6.9.0" @@ -844,9 +855,9 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.27.1.tgz", - "integrity": "sha512-QEcFlMl9nGTgh1rn2nIeU5bkfb9BAjaQcWbiP4LvKxUot52ABcTkpcyJ7f2Q2U2RuQ84BNLgts3jRme2dTx6Fw==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.0.tgz", + "integrity": "sha512-gKKnwjpdx5sER/wl0WN0efUBFzF/56YZO0RJrSYP4CljXnP31ByY7fol89AzomdlLNzI36AvOTmYHsnZTCkq8Q==", "dev": true, "license": "MIT", "dependencies": { @@ -894,18 +905,18 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.27.1.tgz", - "integrity": "sha512-7iLhfFAubmpeJe/Wo2TVuDrykh/zlWXLzPNdL0Jqn/Xu8R3QQ8h9ff8FQoISZOsw74/HFqFI7NX63HN7QFIHKA==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.0.tgz", + "integrity": "sha512-IjM1IoJNw72AZFlj33Cu8X0q2XK/6AaVC3jQu+cgQ5lThWD5ajnuUAml80dqRmOhmPkTH8uAwnpMu9Rvj0LTRA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.1", - "@babel/helper-compilation-targets": "^7.27.1", + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-globals": "^7.28.0", "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-replace-supers": "^7.27.1", - "@babel/traverse": "^7.27.1", - "globals": "^11.1.0" + "@babel/traverse": "^7.28.0" }, "engines": { "node": ">=6.9.0" @@ -932,13 +943,14 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.27.1.tgz", - "integrity": "sha512-ttDCqhfvpE9emVkXbPD8vyxxh4TWYACVybGkDj+oReOGwnp066ITEivDlLwe0b1R0+evJ13IXQuLNB5w1fhC5Q==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.28.0.tgz", + "integrity": "sha512-v1nrSMBiKcodhsyJ4Gf+Z0U/yawmJDBOTpEB3mcQY52r9RIyPneGyAS/yM6seP/8I+mWI3elOMtT5dB8GJVs+A==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.28.0" }, "engines": { "node": ">=6.9.0" @@ -1013,6 +1025,23 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-explicit-resource-management": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.28.0.tgz", + "integrity": "sha512-K8nhUcn3f6iB+P3gwCv/no7OdzOZQcKchW6N389V6PD8NUWKZHzndOd9sPDVbMoBsbmjMqlB4L9fm+fEFNVlwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-transform-destructuring": "^7.28.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/plugin-transform-exponentiation-operator": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.27.1.tgz", @@ -1280,16 +1309,17 @@ } }, "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.27.2.tgz", - "integrity": "sha512-AIUHD7xJ1mCrj3uPozvtngY3s0xpv7Nu7DoUSnzNY6Xam1Cy4rUznR//pvMHOhQ4AvbCexhbqXCtpxGHOGOO6g==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.0.tgz", + "integrity": "sha512-9VNGikXxzu5eCiQjdE4IZn8sb9q7Xsk5EXLDBKUYg1e/Tve8/05+KJEtcxGxAgCY5t/BpKQM+JEL/yT4tvgiUA==", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-plugin-utils": "^7.27.1", - "@babel/plugin-transform-destructuring": "^7.27.1", - "@babel/plugin-transform-parameters": "^7.27.1" + "@babel/plugin-transform-destructuring": "^7.28.0", + "@babel/plugin-transform-parameters": "^7.27.7", + "@babel/traverse": "^7.28.0" }, "engines": { "node": ">=6.9.0" @@ -1349,9 +1379,9 @@ } }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.1.tgz", - "integrity": "sha512-018KRk76HWKeZ5l4oTj2zPpSh+NbGdt0st5S6x0pga6HgrjBOJb24mMDHorFopOOd6YHkLgOZ+zaCjZGPO4aKg==", + "version": "7.27.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.7.tgz", + "integrity": "sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==", "dev": true, "license": "MIT", "dependencies": { @@ -1517,9 +1547,9 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.27.1.tgz", - "integrity": "sha512-B19lbbL7PMrKr52BNPjCqg1IyNUIjTcxKj8uX9zHO+PmWN93s19NDr/f69mIkEp2x9nmDJ08a7lgHaTTzvW7mw==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.28.0.tgz", + "integrity": "sha512-LOAozRVbqxEVjSKfhGnuLoE4Kz4Oc5UJzuvFUhSsQzdCdaAQu06mG8zDv2GFSerM62nImUZ7K92vxnQcLSDlCQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1734,13 +1764,13 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.27.2.tgz", - "integrity": "sha512-Ma4zSuYSlGNRlCLO+EAzLnCmJK2vdstgv+n7aUP+/IKZrOfWHOJVdSJtuub8RzHTj3ahD37k5OKJWvzf16TQyQ==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.28.0.tgz", + "integrity": "sha512-VmaxeGOwuDqzLl5JUkIRM1X2Qu2uKGxHEQWh+cvvbl7JuJRgKGJSfsEF/bUaxFhJl/XAyxBe7q7qSuTbKFuCyg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.27.2", + "@babel/compat-data": "^7.28.0", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-validator-option": "^7.27.1", @@ -1754,19 +1784,20 @@ "@babel/plugin-syntax-import-attributes": "^7.27.1", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", "@babel/plugin-transform-arrow-functions": "^7.27.1", - "@babel/plugin-transform-async-generator-functions": "^7.27.1", + "@babel/plugin-transform-async-generator-functions": "^7.28.0", "@babel/plugin-transform-async-to-generator": "^7.27.1", "@babel/plugin-transform-block-scoped-functions": "^7.27.1", - "@babel/plugin-transform-block-scoping": "^7.27.1", + "@babel/plugin-transform-block-scoping": "^7.28.0", "@babel/plugin-transform-class-properties": "^7.27.1", "@babel/plugin-transform-class-static-block": "^7.27.1", - "@babel/plugin-transform-classes": "^7.27.1", + "@babel/plugin-transform-classes": "^7.28.0", "@babel/plugin-transform-computed-properties": "^7.27.1", - "@babel/plugin-transform-destructuring": "^7.27.1", + "@babel/plugin-transform-destructuring": "^7.28.0", "@babel/plugin-transform-dotall-regex": "^7.27.1", "@babel/plugin-transform-duplicate-keys": "^7.27.1", "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.27.1", "@babel/plugin-transform-dynamic-import": "^7.27.1", + "@babel/plugin-transform-explicit-resource-management": "^7.28.0", "@babel/plugin-transform-exponentiation-operator": "^7.27.1", "@babel/plugin-transform-export-namespace-from": "^7.27.1", "@babel/plugin-transform-for-of": "^7.27.1", @@ -1783,15 +1814,15 @@ "@babel/plugin-transform-new-target": "^7.27.1", "@babel/plugin-transform-nullish-coalescing-operator": "^7.27.1", "@babel/plugin-transform-numeric-separator": "^7.27.1", - "@babel/plugin-transform-object-rest-spread": "^7.27.2", + "@babel/plugin-transform-object-rest-spread": "^7.28.0", "@babel/plugin-transform-object-super": "^7.27.1", "@babel/plugin-transform-optional-catch-binding": "^7.27.1", "@babel/plugin-transform-optional-chaining": "^7.27.1", - "@babel/plugin-transform-parameters": "^7.27.1", + "@babel/plugin-transform-parameters": "^7.27.7", "@babel/plugin-transform-private-methods": "^7.27.1", "@babel/plugin-transform-private-property-in-object": "^7.27.1", "@babel/plugin-transform-property-literals": "^7.27.1", - "@babel/plugin-transform-regenerator": "^7.27.1", + "@babel/plugin-transform-regenerator": "^7.28.0", "@babel/plugin-transform-regexp-modifiers": "^7.27.1", "@babel/plugin-transform-reserved-words": "^7.27.1", "@babel/plugin-transform-shorthand-properties": "^7.27.1", @@ -1804,10 +1835,10 @@ "@babel/plugin-transform-unicode-regex": "^7.27.1", "@babel/plugin-transform-unicode-sets-regex": "^7.27.1", "@babel/preset-modules": "0.1.6-no-external-plugins", - "babel-plugin-polyfill-corejs2": "^0.4.10", - "babel-plugin-polyfill-corejs3": "^0.11.0", - "babel-plugin-polyfill-regenerator": "^0.6.1", - "core-js-compat": "^3.40.0", + "babel-plugin-polyfill-corejs2": "^0.4.14", + "babel-plugin-polyfill-corejs3": "^0.13.0", + "babel-plugin-polyfill-regenerator": "^0.6.5", + "core-js-compat": "^3.43.0", "semver": "^6.3.1" }, "engines": { @@ -1898,27 +1929,27 @@ } }, "node_modules/@babel/traverse": { - "version": "7.27.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.7.tgz", - "integrity": "sha512-X6ZlfR/O/s5EQ/SnUSLzr+6kGnkg8HXGMzpgsMsrJVcfDtH1vIp6ctCN4eZ1LS5c0+te5Cb6Y514fASjMRJ1nw==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.0.tgz", + "integrity": "sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg==", "license": "MIT", "dependencies": { "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.27.5", - "@babel/parser": "^7.27.7", + "@babel/generator": "^7.28.0", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.0", "@babel/template": "^7.27.2", - "@babel/types": "^7.27.7", - "debug": "^4.3.1", - "globals": "^11.1.0" + "@babel/types": "^7.28.0", + "debug": "^4.3.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/types": { - "version": "7.27.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.7.tgz", - "integrity": "sha512-8OLQgDScAOHXnAz2cV+RfzzNMipuLVBz2biuAJFMV9bfkNf393je3VM8CLkjQodW5+iWsSJdSgSWT6rsZoXHPw==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.0.tgz", + "integrity": "sha512-jYnje+JyZG5YThjHiF28oT4SIZLnYOcSBb6+SDaFIyzDVSkXQmQQYclJ2R+YxcdmK0AX6x1E5OQNtuh3jHDrUg==", "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.27.1", @@ -3268,15 +3299,13 @@ } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.5", + "version": "0.3.12", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.12.tgz", + "integrity": "sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==", "license": "MIT", "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" } }, "node_modules/@jridgewell/resolve-uri": { @@ -3286,13 +3315,6 @@ "node": ">=6.0.0" } }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/@jridgewell/source-map": { "version": "0.3.6", "license": "MIT", @@ -3306,7 +3328,9 @@ "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", + "version": "0.3.29", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.29.tgz", + "integrity": "sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==", "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", @@ -6941,12 +6965,14 @@ } }, "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.12", + "version": "0.4.14", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.14.tgz", + "integrity": "sha512-Co2Y9wX854ts6U8gAAPXfn0GmAyctHuK8n0Yhfjd6t30g7yvKjspvvOo9yG+z52PZRgFErt7Ka2pYnXCjLKEpg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.6.3", + "@babel/compat-data": "^7.27.7", + "@babel/helper-define-polyfill-provider": "^0.6.5", "semver": "^6.3.1" }, "peerDependencies": { @@ -6954,23 +6980,27 @@ } }, "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.11.1", + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.13.0.tgz", + "integrity": "sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.3", - "core-js-compat": "^3.40.0" + "@babel/helper-define-polyfill-provider": "^0.6.5", + "core-js-compat": "^3.43.0" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.6.3", + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.5.tgz", + "integrity": "sha512-ISqQ2frbiNU9vIJkzg7dlPpznPZ4jOiUQ1uSmB0fEHeowtN3COYRsXr/xexn64NpU13P06jc/L5TgiJXOgrbEg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.3" + "@babel/helper-define-polyfill-provider": "^0.6.5" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" @@ -7156,7 +7186,9 @@ } }, "node_modules/browserslist": { - "version": "4.24.4", + "version": "4.25.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.1.tgz", + "integrity": "sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==", "funding": [ { "type": "opencollective", @@ -7173,10 +7205,10 @@ ], "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001688", - "electron-to-chromium": "^1.5.73", + "caniuse-lite": "^1.0.30001726", + "electron-to-chromium": "^1.5.173", "node-releases": "^2.0.19", - "update-browserslist-db": "^1.1.1" + "update-browserslist-db": "^1.1.3" }, "bin": { "browserslist": "cli.js" @@ -7377,7 +7409,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001699", + "version": "1.0.30001727", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001727.tgz", + "integrity": "sha512-pB68nIHmbN6L/4C6MH1DokyR3bYqFwjaSs/sWDHGj4CTcFtQUQMuJftVwWkXq7mNWOybD3KhUv3oWHoGxgP14Q==", "funding": [ { "type": "opencollective", @@ -7912,11 +7946,13 @@ } }, "node_modules/core-js-compat": { - "version": "3.40.0", + "version": "3.43.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.43.0.tgz", + "integrity": "sha512-2GML2ZsCc5LR7hZYz4AXmjQw8zuy2T//2QntwdnpuYI7jteT6GVYJL7F6C2C57R7gSYrcqVW3lAALefdbhBLDA==", "dev": true, "license": "MIT", "dependencies": { - "browserslist": "^4.24.3" + "browserslist": "^4.25.0" }, "funding": { "type": "opencollective", @@ -8896,7 +8932,9 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.96", + "version": "1.5.179", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.179.tgz", + "integrity": "sha512-UWKi/EbBopgfFsc5k61wFpV7WrnnSlSzW/e2XcBmS6qKYTivZlLtoll5/rdqRTxGglGHkmkW0j0pFNJG10EUIQ==", "license": "ISC" }, "node_modules/emoji-regex": { @@ -10912,13 +10950,6 @@ "which": "bin/which" } }, - "node_modules/globals": { - "version": "11.12.0", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/globalthis": { "version": "1.0.4", "dev": true, @@ -11826,7 +11857,9 @@ } }, "node_modules/is-core-module": { - "version": "2.15.1", + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", "dev": true, "license": "MIT", "dependencies": { @@ -13022,6 +13055,8 @@ }, "node_modules/lodash.debounce": { "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", "dev": true, "license": "MIT" }, @@ -15896,17 +15931,22 @@ "license": "MIT" }, "node_modules/resolve": { - "version": "1.22.8", + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", "dev": true, "license": "MIT", "dependencies": { - "is-core-module": "^2.13.0", + "is-core-module": "^2.16.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -18666,7 +18706,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.1.1", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", + "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", "funding": [ { "type": "opencollective", @@ -18684,7 +18726,7 @@ "license": "MIT", "dependencies": { "escalade": "^3.2.0", - "picocolors": "^1.1.0" + "picocolors": "^1.1.1" }, "bin": { "update-browserslist-db": "cli.js" @@ -19918,9 +19960,9 @@ } }, "@babel/compat-data": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.27.2.tgz", - "integrity": "sha512-TUtMJYRPyUb/9aU8f3K0mjmjf6M9N5Woshn2CS6nqJSeJtTtQcpLUXjGt9vbF8ZGff0El99sWkLgzwW3VXnxZQ==" + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.0.tgz", + "integrity": "sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==" }, "@babel/core": { "version": "7.27.7", @@ -19954,24 +19996,24 @@ } }, "@babel/generator": { - "version": "7.27.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.5.tgz", - "integrity": "sha512-ZGhA37l0e/g2s1Cnzdix0O3aLYm66eF8aufiVteOgnwxgnRP8GoyMj7VWsgWnQbVKXyge7hqrFh2K2TQM6t1Hw==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.0.tgz", + "integrity": "sha512-lJjzvrbEeWrhB4P3QBsH7tey117PjLZnDbLiQEKjQ/fNJTjuq4HSqgFA+UNSwZT8D7dxxbnuSBMsa1lrWzKlQg==", "requires": { - "@babel/parser": "^7.27.5", - "@babel/types": "^7.27.3", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", + "@babel/parser": "^7.28.0", + "@babel/types": "^7.28.0", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" } }, "@babel/helper-annotate-as-pure": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.1.tgz", - "integrity": "sha512-WnuuDILl9oOBbKnb4L+DyODx7iC47XfzmNCpTttFsSp6hTG7XZxu60+4IO+2/hPfcGOoKbFiwoI/+zwARbNQow==", + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", + "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", "dev": true, "requires": { - "@babel/types": "^7.27.1" + "@babel/types": "^7.27.3" } }, "@babel/helper-compilation-targets": { @@ -20013,16 +20055,23 @@ } }, "@babel/helper-define-polyfill-provider": { - "version": "0.6.3", + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.5.tgz", + "integrity": "sha512-uJnGFcPsWQK8fvjgGP5LZUZZsYGIoPeRjSF5PGwrelYgq7Q15/Ft9NGFp1zglwgIv//W0uG4BevRuSJRyylZPg==", "dev": true, "requires": { - "@babel/helper-compilation-targets": "^7.22.6", - "@babel/helper-plugin-utils": "^7.22.5", - "debug": "^4.1.1", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-plugin-utils": "^7.27.1", + "debug": "^4.4.1", "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2" + "resolve": "^1.22.10" } }, + "@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==" + }, "@babel/helper-member-expression-to-functions": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.27.1.tgz", @@ -20135,11 +20184,11 @@ } }, "@babel/parser": { - "version": "7.27.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.7.tgz", - "integrity": "sha512-qnzXzDXdr/po3bOTbTIQZ7+TxNKxpkN5IifVLXS+r7qwynkZfPyjZfE7hCXbo7IoO9TNcSyibgONsf2HauUd3Q==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.0.tgz", + "integrity": "sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==", "requires": { - "@babel/types": "^7.27.7" + "@babel/types": "^7.28.0" } }, "@babel/plugin-bugfix-firefox-class-in-computed-class-key": { @@ -20250,14 +20299,14 @@ } }, "@babel/plugin-transform-async-generator-functions": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.27.1.tgz", - "integrity": "sha512-eST9RrwlpaoJBDHShc+DS2SG4ATTi2MYNb4OxYkf3n+7eb49LWpnS+HSpVfW4x927qQwgk8A2hGNVaajAEw0EA==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.28.0.tgz", + "integrity": "sha512-BEOdvX4+M765icNPZeidyADIvQ1m1gmunXufXxvRESy/jNNyfovIqUyE7MVgGBjWktCoJlzvFA1To2O4ymIO3Q==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-remap-async-to-generator": "^7.27.1", - "@babel/traverse": "^7.27.1" + "@babel/traverse": "^7.28.0" } }, "@babel/plugin-transform-async-to-generator": { @@ -20281,9 +20330,9 @@ } }, "@babel/plugin-transform-block-scoping": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.27.1.tgz", - "integrity": "sha512-QEcFlMl9nGTgh1rn2nIeU5bkfb9BAjaQcWbiP4LvKxUot52ABcTkpcyJ7f2Q2U2RuQ84BNLgts3jRme2dTx6Fw==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.0.tgz", + "integrity": "sha512-gKKnwjpdx5sER/wl0WN0efUBFzF/56YZO0RJrSYP4CljXnP31ByY7fol89AzomdlLNzI36AvOTmYHsnZTCkq8Q==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.27.1" @@ -20310,17 +20359,17 @@ } }, "@babel/plugin-transform-classes": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.27.1.tgz", - "integrity": "sha512-7iLhfFAubmpeJe/Wo2TVuDrykh/zlWXLzPNdL0Jqn/Xu8R3QQ8h9ff8FQoISZOsw74/HFqFI7NX63HN7QFIHKA==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.0.tgz", + "integrity": "sha512-IjM1IoJNw72AZFlj33Cu8X0q2XK/6AaVC3jQu+cgQ5lThWD5ajnuUAml80dqRmOhmPkTH8uAwnpMu9Rvj0LTRA==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.27.1", - "@babel/helper-compilation-targets": "^7.27.1", + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-globals": "^7.28.0", "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-replace-supers": "^7.27.1", - "@babel/traverse": "^7.27.1", - "globals": "^11.1.0" + "@babel/traverse": "^7.28.0" } }, "@babel/plugin-transform-computed-properties": { @@ -20334,12 +20383,13 @@ } }, "@babel/plugin-transform-destructuring": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.27.1.tgz", - "integrity": "sha512-ttDCqhfvpE9emVkXbPD8vyxxh4TWYACVybGkDj+oReOGwnp066ITEivDlLwe0b1R0+evJ13IXQuLNB5w1fhC5Q==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.28.0.tgz", + "integrity": "sha512-v1nrSMBiKcodhsyJ4Gf+Z0U/yawmJDBOTpEB3mcQY52r9RIyPneGyAS/yM6seP/8I+mWI3elOMtT5dB8GJVs+A==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.28.0" } }, "@babel/plugin-transform-dotall-regex": { @@ -20380,6 +20430,16 @@ "@babel/helper-plugin-utils": "^7.27.1" } }, + "@babel/plugin-transform-explicit-resource-management": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.28.0.tgz", + "integrity": "sha512-K8nhUcn3f6iB+P3gwCv/no7OdzOZQcKchW6N389V6PD8NUWKZHzndOd9sPDVbMoBsbmjMqlB4L9fm+fEFNVlwQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-transform-destructuring": "^7.28.0" + } + }, "@babel/plugin-transform-exponentiation-operator": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.27.1.tgz", @@ -20535,15 +20595,16 @@ } }, "@babel/plugin-transform-object-rest-spread": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.27.2.tgz", - "integrity": "sha512-AIUHD7xJ1mCrj3uPozvtngY3s0xpv7Nu7DoUSnzNY6Xam1Cy4rUznR//pvMHOhQ4AvbCexhbqXCtpxGHOGOO6g==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.0.tgz", + "integrity": "sha512-9VNGikXxzu5eCiQjdE4IZn8sb9q7Xsk5EXLDBKUYg1e/Tve8/05+KJEtcxGxAgCY5t/BpKQM+JEL/yT4tvgiUA==", "dev": true, "requires": { "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-plugin-utils": "^7.27.1", - "@babel/plugin-transform-destructuring": "^7.27.1", - "@babel/plugin-transform-parameters": "^7.27.1" + "@babel/plugin-transform-destructuring": "^7.28.0", + "@babel/plugin-transform-parameters": "^7.27.7", + "@babel/traverse": "^7.28.0" } }, "@babel/plugin-transform-object-super": { @@ -20576,9 +20637,9 @@ } }, "@babel/plugin-transform-parameters": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.1.tgz", - "integrity": "sha512-018KRk76HWKeZ5l4oTj2zPpSh+NbGdt0st5S6x0pga6HgrjBOJb24mMDHorFopOOd6YHkLgOZ+zaCjZGPO4aKg==", + "version": "7.27.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.7.tgz", + "integrity": "sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.27.1" @@ -20674,9 +20735,9 @@ } }, "@babel/plugin-transform-regenerator": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.27.1.tgz", - "integrity": "sha512-B19lbbL7PMrKr52BNPjCqg1IyNUIjTcxKj8uX9zHO+PmWN93s19NDr/f69mIkEp2x9nmDJ08a7lgHaTTzvW7mw==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.28.0.tgz", + "integrity": "sha512-LOAozRVbqxEVjSKfhGnuLoE4Kz4Oc5UJzuvFUhSsQzdCdaAQu06mG8zDv2GFSerM62nImUZ7K92vxnQcLSDlCQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.27.1" @@ -20800,12 +20861,12 @@ } }, "@babel/preset-env": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.27.2.tgz", - "integrity": "sha512-Ma4zSuYSlGNRlCLO+EAzLnCmJK2vdstgv+n7aUP+/IKZrOfWHOJVdSJtuub8RzHTj3ahD37k5OKJWvzf16TQyQ==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.28.0.tgz", + "integrity": "sha512-VmaxeGOwuDqzLl5JUkIRM1X2Qu2uKGxHEQWh+cvvbl7JuJRgKGJSfsEF/bUaxFhJl/XAyxBe7q7qSuTbKFuCyg==", "dev": true, "requires": { - "@babel/compat-data": "^7.27.2", + "@babel/compat-data": "^7.28.0", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-validator-option": "^7.27.1", @@ -20819,19 +20880,20 @@ "@babel/plugin-syntax-import-attributes": "^7.27.1", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", "@babel/plugin-transform-arrow-functions": "^7.27.1", - "@babel/plugin-transform-async-generator-functions": "^7.27.1", + "@babel/plugin-transform-async-generator-functions": "^7.28.0", "@babel/plugin-transform-async-to-generator": "^7.27.1", "@babel/plugin-transform-block-scoped-functions": "^7.27.1", - "@babel/plugin-transform-block-scoping": "^7.27.1", + "@babel/plugin-transform-block-scoping": "^7.28.0", "@babel/plugin-transform-class-properties": "^7.27.1", "@babel/plugin-transform-class-static-block": "^7.27.1", - "@babel/plugin-transform-classes": "^7.27.1", + "@babel/plugin-transform-classes": "^7.28.0", "@babel/plugin-transform-computed-properties": "^7.27.1", - "@babel/plugin-transform-destructuring": "^7.27.1", + "@babel/plugin-transform-destructuring": "^7.28.0", "@babel/plugin-transform-dotall-regex": "^7.27.1", "@babel/plugin-transform-duplicate-keys": "^7.27.1", "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.27.1", "@babel/plugin-transform-dynamic-import": "^7.27.1", + "@babel/plugin-transform-explicit-resource-management": "^7.28.0", "@babel/plugin-transform-exponentiation-operator": "^7.27.1", "@babel/plugin-transform-export-namespace-from": "^7.27.1", "@babel/plugin-transform-for-of": "^7.27.1", @@ -20848,15 +20910,15 @@ "@babel/plugin-transform-new-target": "^7.27.1", "@babel/plugin-transform-nullish-coalescing-operator": "^7.27.1", "@babel/plugin-transform-numeric-separator": "^7.27.1", - "@babel/plugin-transform-object-rest-spread": "^7.27.2", + "@babel/plugin-transform-object-rest-spread": "^7.28.0", "@babel/plugin-transform-object-super": "^7.27.1", "@babel/plugin-transform-optional-catch-binding": "^7.27.1", "@babel/plugin-transform-optional-chaining": "^7.27.1", - "@babel/plugin-transform-parameters": "^7.27.1", + "@babel/plugin-transform-parameters": "^7.27.7", "@babel/plugin-transform-private-methods": "^7.27.1", "@babel/plugin-transform-private-property-in-object": "^7.27.1", "@babel/plugin-transform-property-literals": "^7.27.1", - "@babel/plugin-transform-regenerator": "^7.27.1", + "@babel/plugin-transform-regenerator": "^7.28.0", "@babel/plugin-transform-regexp-modifiers": "^7.27.1", "@babel/plugin-transform-reserved-words": "^7.27.1", "@babel/plugin-transform-shorthand-properties": "^7.27.1", @@ -20869,10 +20931,10 @@ "@babel/plugin-transform-unicode-regex": "^7.27.1", "@babel/plugin-transform-unicode-sets-regex": "^7.27.1", "@babel/preset-modules": "0.1.6-no-external-plugins", - "babel-plugin-polyfill-corejs2": "^0.4.10", - "babel-plugin-polyfill-corejs3": "^0.11.0", - "babel-plugin-polyfill-regenerator": "^0.6.1", - "core-js-compat": "^3.40.0", + "babel-plugin-polyfill-corejs2": "^0.4.14", + "babel-plugin-polyfill-corejs3": "^0.13.0", + "babel-plugin-polyfill-regenerator": "^0.6.5", + "core-js-compat": "^3.43.0", "semver": "^6.3.1" } }, @@ -20931,23 +20993,23 @@ } }, "@babel/traverse": { - "version": "7.27.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.7.tgz", - "integrity": "sha512-X6ZlfR/O/s5EQ/SnUSLzr+6kGnkg8HXGMzpgsMsrJVcfDtH1vIp6ctCN4eZ1LS5c0+te5Cb6Y514fASjMRJ1nw==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.0.tgz", + "integrity": "sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg==", "requires": { "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.27.5", - "@babel/parser": "^7.27.7", + "@babel/generator": "^7.28.0", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.0", "@babel/template": "^7.27.2", - "@babel/types": "^7.27.7", - "debug": "^4.3.1", - "globals": "^11.1.0" + "@babel/types": "^7.28.0", + "debug": "^4.3.1" } }, "@babel/types": { - "version": "7.27.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.7.tgz", - "integrity": "sha512-8OLQgDScAOHXnAz2cV+RfzzNMipuLVBz2biuAJFMV9bfkNf393je3VM8CLkjQodW5+iWsSJdSgSWT6rsZoXHPw==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.0.tgz", + "integrity": "sha512-jYnje+JyZG5YThjHiF28oT4SIZLnYOcSBb6+SDaFIyzDVSkXQmQQYclJ2R+YxcdmK0AX6x1E5OQNtuh3jHDrUg==", "requires": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1" @@ -21702,19 +21764,17 @@ "dev": true }, "@jridgewell/gen-mapping": { - "version": "0.3.5", + "version": "0.3.12", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.12.tgz", + "integrity": "sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==", "requires": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" } }, "@jridgewell/resolve-uri": { "version": "3.1.2" }, - "@jridgewell/set-array": { - "version": "1.2.1" - }, "@jridgewell/source-map": { "version": "0.3.6", "requires": { @@ -21726,7 +21786,9 @@ "version": "1.5.0" }, "@jridgewell/trace-mapping": { - "version": "0.3.25", + "version": "0.3.29", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.29.tgz", + "integrity": "sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==", "requires": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" @@ -24045,27 +24107,33 @@ } }, "babel-plugin-polyfill-corejs2": { - "version": "0.4.12", + "version": "0.4.14", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.14.tgz", + "integrity": "sha512-Co2Y9wX854ts6U8gAAPXfn0GmAyctHuK8n0Yhfjd6t30g7yvKjspvvOo9yG+z52PZRgFErt7Ka2pYnXCjLKEpg==", "dev": true, "requires": { - "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.6.3", + "@babel/compat-data": "^7.27.7", + "@babel/helper-define-polyfill-provider": "^0.6.5", "semver": "^6.3.1" } }, "babel-plugin-polyfill-corejs3": { - "version": "0.11.1", + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.13.0.tgz", + "integrity": "sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==", "dev": true, "requires": { - "@babel/helper-define-polyfill-provider": "^0.6.3", - "core-js-compat": "^3.40.0" + "@babel/helper-define-polyfill-provider": "^0.6.5", + "core-js-compat": "^3.43.0" } }, "babel-plugin-polyfill-regenerator": { - "version": "0.6.3", + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.5.tgz", + "integrity": "sha512-ISqQ2frbiNU9vIJkzg7dlPpznPZ4jOiUQ1uSmB0fEHeowtN3COYRsXr/xexn64NpU13P06jc/L5TgiJXOgrbEg==", "dev": true, "requires": { - "@babel/helper-define-polyfill-provider": "^0.6.3" + "@babel/helper-define-polyfill-provider": "^0.6.5" } }, "balanced-match": { @@ -24189,12 +24257,14 @@ } }, "browserslist": { - "version": "4.24.4", + "version": "4.25.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.1.tgz", + "integrity": "sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==", "requires": { - "caniuse-lite": "^1.0.30001688", - "electron-to-chromium": "^1.5.73", + "caniuse-lite": "^1.0.30001726", + "electron-to-chromium": "^1.5.173", "node-releases": "^2.0.19", - "update-browserslist-db": "^1.1.1" + "update-browserslist-db": "^1.1.3" } }, "buffer": { @@ -24325,7 +24395,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001699" + "version": "1.0.30001727", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001727.tgz", + "integrity": "sha512-pB68nIHmbN6L/4C6MH1DokyR3bYqFwjaSs/sWDHGj4CTcFtQUQMuJftVwWkXq7mNWOybD3KhUv3oWHoGxgP14Q==" }, "chai": { "version": "5.2.0", @@ -24662,10 +24734,12 @@ } }, "core-js-compat": { - "version": "3.40.0", + "version": "3.43.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.43.0.tgz", + "integrity": "sha512-2GML2ZsCc5LR7hZYz4AXmjQw8zuy2T//2QntwdnpuYI7jteT6GVYJL7F6C2C57R7gSYrcqVW3lAALefdbhBLDA==", "dev": true, "requires": { - "browserslist": "^4.24.3" + "browserslist": "^4.25.0" } }, "core-js-pure": { @@ -25246,7 +25320,9 @@ "dev": true }, "electron-to-chromium": { - "version": "1.5.96" + "version": "1.5.179", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.179.tgz", + "integrity": "sha512-UWKi/EbBopgfFsc5k61wFpV7WrnnSlSzW/e2XcBmS6qKYTivZlLtoll5/rdqRTxGglGHkmkW0j0pFNJG10EUIQ==" }, "emoji-regex": { "version": "9.2.2", @@ -26597,9 +26673,6 @@ } } }, - "globals": { - "version": "11.12.0" - }, "globalthis": { "version": "1.0.4", "dev": true, @@ -27149,7 +27222,9 @@ "dev": true }, "is-core-module": { - "version": "2.15.1", + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", "dev": true, "requires": { "hasown": "^2.0.2" @@ -27916,6 +27991,8 @@ }, "lodash.debounce": { "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", "dev": true }, "lodash.isplainobject": { @@ -29706,10 +29783,12 @@ "version": "5.1.1" }, "resolve": { - "version": "1.22.8", + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", "dev": true, "requires": { - "is-core-module": "^2.13.0", + "is-core-module": "^2.16.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" } @@ -31486,10 +31565,12 @@ } }, "update-browserslist-db": { - "version": "1.1.1", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", + "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", "requires": { "escalade": "^3.2.0", - "picocolors": "^1.1.0" + "picocolors": "^1.1.1" } }, "uri-js": { diff --git a/package.json b/package.json index ca3287db..79783a37 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,7 @@ }, "devDependencies": { "@babel/core": "7.27.7", - "@babel/preset-env": "7.27.2", + "@babel/preset-env": "7.28.0", "@babel/preset-react": "7.27.1", "@babel/preset-typescript": "7.27.1", "@currents/playwright": "1.14.1", From 8abeb4f53bb8b878cb7ee80c6f4f3978f60ff8c2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 7 Jul 2025 05:54:43 +0000 Subject: [PATCH 146/331] build(deps-dev): bump stylelint from 16.21.0 to 16.21.1 Bumps [stylelint](https://github.com/stylelint/stylelint) from 16.21.0 to 16.21.1. - [Release notes](https://github.com/stylelint/stylelint/releases) - [Changelog](https://github.com/stylelint/stylelint/blob/main/CHANGELOG.md) - [Commits](https://github.com/stylelint/stylelint/compare/16.21.0...16.21.1) --- updated-dependencies: - dependency-name: stylelint dependency-version: 16.21.1 dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- package-lock.json | 18 +++++++++--------- package.json | 2 +- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/package-lock.json b/package-lock.json index 25ecb8d9..0dc85e02 100644 --- a/package-lock.json +++ b/package-lock.json @@ -87,7 +87,7 @@ "redux-mock-store": "1.5.5", "sass": "1.89.2", "sass-loader": "16.0.5", - "stylelint": "16.21.0", + "stylelint": "16.21.1", "stylelint-config-recommended-scss": "15.0.1", "ts-node": "10.9.2", "ts-patch": "3.3.0", @@ -17357,9 +17357,9 @@ "license": "MIT" }, "node_modules/stylelint": { - "version": "16.21.0", - "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.21.0.tgz", - "integrity": "sha512-ki3PpJGG7xhm3WtINoWGnlvqAmbqSexoRMbEMJzlwewSIOqPRKPlq452c22xAdEJISVi80r+I7KL9GPUiwFgbg==", + "version": "16.21.1", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.21.1.tgz", + "integrity": "sha512-WCXdXnYK2tpCbebgMF0Bme3YZH/Rh/UXerj75twYo4uLULlcrLwFVdZTvTEF8idFnAcW21YUDJFyKOfaf6xJRw==", "dev": true, "funding": [ { @@ -17400,7 +17400,7 @@ "micromatch": "^4.0.8", "normalize-path": "^3.0.0", "picocolors": "^1.1.1", - "postcss": "^8.5.5", + "postcss": "^8.5.6", "postcss-resolve-nested-selector": "^0.1.6", "postcss-safe-parser": "^7.0.1", "postcss-selector-parser": "^7.1.0", @@ -30721,9 +30721,9 @@ } }, "stylelint": { - "version": "16.21.0", - "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.21.0.tgz", - "integrity": "sha512-ki3PpJGG7xhm3WtINoWGnlvqAmbqSexoRMbEMJzlwewSIOqPRKPlq452c22xAdEJISVi80r+I7KL9GPUiwFgbg==", + "version": "16.21.1", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.21.1.tgz", + "integrity": "sha512-WCXdXnYK2tpCbebgMF0Bme3YZH/Rh/UXerj75twYo4uLULlcrLwFVdZTvTEF8idFnAcW21YUDJFyKOfaf6xJRw==", "dev": true, "requires": { "@csstools/css-parser-algorithms": "^3.0.5", @@ -30753,7 +30753,7 @@ "micromatch": "^4.0.8", "normalize-path": "^3.0.0", "picocolors": "^1.1.1", - "postcss": "^8.5.5", + "postcss": "^8.5.6", "postcss-resolve-nested-selector": "^0.1.6", "postcss-safe-parser": "^7.0.1", "postcss-selector-parser": "^7.1.0", diff --git a/package.json b/package.json index 79783a37..3171350c 100644 --- a/package.json +++ b/package.json @@ -85,7 +85,7 @@ "redux-mock-store": "1.5.5", "sass": "1.89.2", "sass-loader": "16.0.5", - "stylelint": "16.21.0", + "stylelint": "16.21.1", "stylelint-config-recommended-scss": "15.0.1", "ts-node": "10.9.2", "ts-patch": "3.3.0", From 875b8a150d788a30a34876a04569c2718ee1be37 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 7 Jul 2025 07:48:20 +0000 Subject: [PATCH 147/331] build(deps-dev): bump @babel/core from 7.27.7 to 7.28.0 Bumps [@babel/core](https://github.com/babel/babel/tree/HEAD/packages/babel-core) from 7.27.7 to 7.28.0. - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md) - [Commits](https://github.com/babel/babel/commits/v7.28.0/packages/babel-core) --- updated-dependencies: - dependency-name: "@babel/core" dependency-version: 7.28.0 dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package-lock.json | 30 +++++++++++++++--------------- package.json | 2 +- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0dc85e02..5111310d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -32,7 +32,7 @@ "redux-promise-middleware": "6.2.0" }, "devDependencies": { - "@babel/core": "7.27.7", + "@babel/core": "7.28.0", "@babel/preset-env": "7.28.0", "@babel/preset-react": "7.27.1", "@babel/preset-typescript": "7.27.1", @@ -268,21 +268,21 @@ } }, "node_modules/@babel/core": { - "version": "7.27.7", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.27.7.tgz", - "integrity": "sha512-BU2f9tlKQ5CAthiMIgpzAh4eDTLWo1mqi9jqE2OxMG0E/OM199VJt2q8BztTxpnSW0i1ymdwLXRJnYzvDM5r2w==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.0.tgz", + "integrity": "sha512-UlLAnTPrFdNGoFtbSXwcGFQBtQZJCNjaN6hQNP3UPvuNXT1i82N26KL3dZeIpNalWywr9IuQuncaAfUaS1g6sQ==", "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.27.5", + "@babel/generator": "^7.28.0", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.27.3", "@babel/helpers": "^7.27.6", - "@babel/parser": "^7.27.7", + "@babel/parser": "^7.28.0", "@babel/template": "^7.27.2", - "@babel/traverse": "^7.27.7", - "@babel/types": "^7.27.7", + "@babel/traverse": "^7.28.0", + "@babel/types": "^7.28.0", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -19965,20 +19965,20 @@ "integrity": "sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==" }, "@babel/core": { - "version": "7.27.7", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.27.7.tgz", - "integrity": "sha512-BU2f9tlKQ5CAthiMIgpzAh4eDTLWo1mqi9jqE2OxMG0E/OM199VJt2q8BztTxpnSW0i1ymdwLXRJnYzvDM5r2w==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.0.tgz", + "integrity": "sha512-UlLAnTPrFdNGoFtbSXwcGFQBtQZJCNjaN6hQNP3UPvuNXT1i82N26KL3dZeIpNalWywr9IuQuncaAfUaS1g6sQ==", "requires": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.27.5", + "@babel/generator": "^7.28.0", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.27.3", "@babel/helpers": "^7.27.6", - "@babel/parser": "^7.27.7", + "@babel/parser": "^7.28.0", "@babel/template": "^7.27.2", - "@babel/traverse": "^7.27.7", - "@babel/types": "^7.27.7", + "@babel/traverse": "^7.28.0", + "@babel/types": "^7.28.0", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", diff --git a/package.json b/package.json index 3171350c..3d0efd23 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,7 @@ "redux-promise-middleware": "6.2.0" }, "devDependencies": { - "@babel/core": "7.27.7", + "@babel/core": "7.28.0", "@babel/preset-env": "7.28.0", "@babel/preset-react": "7.27.1", "@babel/preset-typescript": "7.27.1", From 94bcb9672f1cf1bffd3bbe3b2e93b1d403c03185 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 8 Jul 2025 06:39:45 +0000 Subject: [PATCH 148/331] build(deps-dev): bump @typescript-eslint/parser from 8.35.1 to 8.36.0 Bumps [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) from 8.35.1 to 8.36.0. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/parser/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.36.0/packages/parser) --- updated-dependencies: - dependency-name: "@typescript-eslint/parser" dependency-version: 8.36.0 dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package-lock.json | 270 +++++++++++++++++++++++++++++++++++++++++++--- package.json | 2 +- 2 files changed, 256 insertions(+), 16 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5111310d..444112f9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -53,7 +53,7 @@ "@types/react-redux": "7.1.34", "@types/uuid": "10.0.0", "@typescript-eslint/eslint-plugin": "8.35.1", - "@typescript-eslint/parser": "8.35.1", + "@typescript-eslint/parser": "8.36.0", "@vitejs/plugin-react": "4.6.0", "@vitest/coverage-v8": "3.2.4", "babel-loader": "10.0.0", @@ -5646,16 +5646,16 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.35.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.35.1.tgz", - "integrity": "sha512-3MyiDfrfLeK06bi/g9DqJxP5pV74LNv4rFTyvGDmT3x2p1yp1lOd+qYZfiRPIOf/oON+WRZR5wxxuF85qOar+w==", + "version": "8.36.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.36.0.tgz", + "integrity": "sha512-FuYgkHwZLuPbZjQHzJXrtXreJdFMKl16BFYyRrLxDhWr6Qr7Kbcu2s1Yhu8tsiMXw1S0W1pjfFfYEt+R604s+Q==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.35.1", - "@typescript-eslint/types": "8.35.1", - "@typescript-eslint/typescript-estree": "8.35.1", - "@typescript-eslint/visitor-keys": "8.35.1", + "@typescript-eslint/scope-manager": "8.36.0", + "@typescript-eslint/types": "8.36.0", + "@typescript-eslint/typescript-estree": "8.36.0", + "@typescript-eslint/visitor-keys": "8.36.0", "debug": "^4.3.4" }, "engines": { @@ -5670,6 +5670,163 @@ "typescript": ">=4.8.4 <5.9.0" } }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/project-service": { + "version": "8.36.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.36.0.tgz", + "integrity": "sha512-JAhQFIABkWccQYeLMrHadu/fhpzmSQ1F1KXkpzqiVxA/iYI6UnRt2trqXHt1sYEcw1mxLnB9rKMsOxXPxowN/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.36.0", + "@typescript-eslint/types": "^8.36.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/scope-manager": { + "version": "8.36.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.36.0.tgz", + "integrity": "sha512-wCnapIKnDkN62fYtTGv2+RY8FlnBYA3tNm0fm91kc2BjPhV2vIjwwozJ7LToaLAyb1ca8BxrS7vT+Pvvf7RvqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.36.0", + "@typescript-eslint/visitor-keys": "8.36.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.36.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.36.0.tgz", + "integrity": "sha512-Nhh3TIEgN18mNbdXpd5Q8mSCBnrZQeY9V7Ca3dqYvNDStNIGRmJA6dmrIPMJ0kow3C7gcQbpsG2rPzy1Ks/AnA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": { + "version": "8.36.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.36.0.tgz", + "integrity": "sha512-xGms6l5cTJKQPZOKM75Dl9yBfNdGeLRsIyufewnxT4vZTrjC0ImQT4fj8QmtJK84F58uSh5HVBSANwcfiXxABQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree": { + "version": "8.36.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.36.0.tgz", + "integrity": "sha512-JaS8bDVrfVJX4av0jLpe4ye0BpAaUW7+tnS4Y4ETa3q7NoZgzYbN9zDQTJ8kPb5fQ4n0hliAt9tA4Pfs2zA2Hg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.36.0", + "@typescript-eslint/tsconfig-utils": "8.36.0", + "@typescript-eslint/types": "8.36.0", + "@typescript-eslint/visitor-keys": "8.36.0", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/visitor-keys": { + "version": "8.36.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.36.0.tgz", + "integrity": "sha512-vZrhV2lRPWDuGoxcmrzRZyxAggPL+qp3WzUrlZD+slFueDiYHxeBa34dUXPuC0RmGKzl4lS5kFJYvKCq9cnNDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.36.0", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/ts-api-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", + "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, "node_modules/@typescript-eslint/project-service": { "version": "8.35.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.35.1.tgz", @@ -23242,16 +23399,99 @@ } }, "@typescript-eslint/parser": { - "version": "8.35.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.35.1.tgz", - "integrity": "sha512-3MyiDfrfLeK06bi/g9DqJxP5pV74LNv4rFTyvGDmT3x2p1yp1lOd+qYZfiRPIOf/oON+WRZR5wxxuF85qOar+w==", + "version": "8.36.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.36.0.tgz", + "integrity": "sha512-FuYgkHwZLuPbZjQHzJXrtXreJdFMKl16BFYyRrLxDhWr6Qr7Kbcu2s1Yhu8tsiMXw1S0W1pjfFfYEt+R604s+Q==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "8.35.1", - "@typescript-eslint/types": "8.35.1", - "@typescript-eslint/typescript-estree": "8.35.1", - "@typescript-eslint/visitor-keys": "8.35.1", + "@typescript-eslint/scope-manager": "8.36.0", + "@typescript-eslint/types": "8.36.0", + "@typescript-eslint/typescript-estree": "8.36.0", + "@typescript-eslint/visitor-keys": "8.36.0", "debug": "^4.3.4" + }, + "dependencies": { + "@typescript-eslint/project-service": { + "version": "8.36.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.36.0.tgz", + "integrity": "sha512-JAhQFIABkWccQYeLMrHadu/fhpzmSQ1F1KXkpzqiVxA/iYI6UnRt2trqXHt1sYEcw1mxLnB9rKMsOxXPxowN/g==", + "dev": true, + "requires": { + "@typescript-eslint/tsconfig-utils": "^8.36.0", + "@typescript-eslint/types": "^8.36.0", + "debug": "^4.3.4" + } + }, + "@typescript-eslint/scope-manager": { + "version": "8.36.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.36.0.tgz", + "integrity": "sha512-wCnapIKnDkN62fYtTGv2+RY8FlnBYA3tNm0fm91kc2BjPhV2vIjwwozJ7LToaLAyb1ca8BxrS7vT+Pvvf7RvqA==", + "dev": true, + "requires": { + "@typescript-eslint/types": "8.36.0", + "@typescript-eslint/visitor-keys": "8.36.0" + } + }, + "@typescript-eslint/tsconfig-utils": { + "version": "8.36.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.36.0.tgz", + "integrity": "sha512-Nhh3TIEgN18mNbdXpd5Q8mSCBnrZQeY9V7Ca3dqYvNDStNIGRmJA6dmrIPMJ0kow3C7gcQbpsG2rPzy1Ks/AnA==", + "dev": true, + "requires": {} + }, + "@typescript-eslint/types": { + "version": "8.36.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.36.0.tgz", + "integrity": "sha512-xGms6l5cTJKQPZOKM75Dl9yBfNdGeLRsIyufewnxT4vZTrjC0ImQT4fj8QmtJK84F58uSh5HVBSANwcfiXxABQ==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "8.36.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.36.0.tgz", + "integrity": "sha512-JaS8bDVrfVJX4av0jLpe4ye0BpAaUW7+tnS4Y4ETa3q7NoZgzYbN9zDQTJ8kPb5fQ4n0hliAt9tA4Pfs2zA2Hg==", + "dev": true, + "requires": { + "@typescript-eslint/project-service": "8.36.0", + "@typescript-eslint/tsconfig-utils": "8.36.0", + "@typescript-eslint/types": "8.36.0", + "@typescript-eslint/visitor-keys": "8.36.0", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^2.1.0" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "8.36.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.36.0.tgz", + "integrity": "sha512-vZrhV2lRPWDuGoxcmrzRZyxAggPL+qp3WzUrlZD+slFueDiYHxeBa34dUXPuC0RmGKzl4lS5kFJYvKCq9cnNDA==", + "dev": true, + "requires": { + "@typescript-eslint/types": "8.36.0", + "eslint-visitor-keys": "^4.2.1" + } + }, + "eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true + }, + "semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "dev": true + }, + "ts-api-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", + "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", + "dev": true, + "requires": {} + } } }, "@typescript-eslint/project-service": { diff --git a/package.json b/package.json index 3d0efd23..fe7694b0 100644 --- a/package.json +++ b/package.json @@ -51,7 +51,7 @@ "@types/react-redux": "7.1.34", "@types/uuid": "10.0.0", "@typescript-eslint/eslint-plugin": "8.35.1", - "@typescript-eslint/parser": "8.35.1", + "@typescript-eslint/parser": "8.36.0", "@vitejs/plugin-react": "4.6.0", "@vitest/coverage-v8": "3.2.4", "babel-loader": "10.0.0", From 33b374b3a0f4fc9a5af2c3224d901ea8495e1072 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 8 Jul 2025 12:01:55 +0000 Subject: [PATCH 149/331] build(deps-dev): bump @typescript-eslint/eslint-plugin Bumps [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin) from 8.35.1 to 8.36.0. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.36.0/packages/eslint-plugin) --- updated-dependencies: - dependency-name: "@typescript-eslint/eslint-plugin" dependency-version: 8.36.0 dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package-lock.json | 404 ++++++++++------------------------------------ package.json | 2 +- 2 files changed, 83 insertions(+), 323 deletions(-) diff --git a/package-lock.json b/package-lock.json index 444112f9..34d80cca 100644 --- a/package-lock.json +++ b/package-lock.json @@ -52,7 +52,7 @@ "@types/react-dom": "18.3.1", "@types/react-redux": "7.1.34", "@types/uuid": "10.0.0", - "@typescript-eslint/eslint-plugin": "8.35.1", + "@typescript-eslint/eslint-plugin": "8.36.0", "@typescript-eslint/parser": "8.36.0", "@vitejs/plugin-react": "4.6.0", "@vitest/coverage-v8": "3.2.4", @@ -5593,17 +5593,17 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.35.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.35.1.tgz", - "integrity": "sha512-9XNTlo7P7RJxbVeICaIIIEipqxLKguyh+3UbXuT2XQuFp6d8VOeDEGuz5IiX0dgZo8CiI6aOFLg4e8cF71SFVg==", + "version": "8.36.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.36.0.tgz", + "integrity": "sha512-lZNihHUVB6ZZiPBNgOQGSxUASI7UJWhT8nHyUGCnaQ28XFCw98IfrMCG3rUl1uwUWoAvodJQby2KTs79UTcrAg==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.35.1", - "@typescript-eslint/type-utils": "8.35.1", - "@typescript-eslint/utils": "8.35.1", - "@typescript-eslint/visitor-keys": "8.35.1", + "@typescript-eslint/scope-manager": "8.36.0", + "@typescript-eslint/type-utils": "8.36.0", + "@typescript-eslint/utils": "8.36.0", + "@typescript-eslint/visitor-keys": "8.36.0", "graphemer": "^1.4.0", "ignore": "^7.0.0", "natural-compare": "^1.4.0", @@ -5617,7 +5617,7 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.35.1", + "@typescript-eslint/parser": "^8.36.0", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } @@ -5670,7 +5670,7 @@ "typescript": ">=4.8.4 <5.9.0" } }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/project-service": { + "node_modules/@typescript-eslint/project-service": { "version": "8.36.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.36.0.tgz", "integrity": "sha512-JAhQFIABkWccQYeLMrHadu/fhpzmSQ1F1KXkpzqiVxA/iYI6UnRt2trqXHt1sYEcw1mxLnB9rKMsOxXPxowN/g==", @@ -5692,7 +5692,7 @@ "typescript": ">=4.8.4 <5.9.0" } }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/scope-manager": { + "node_modules/@typescript-eslint/scope-manager": { "version": "8.36.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.36.0.tgz", "integrity": "sha512-wCnapIKnDkN62fYtTGv2+RY8FlnBYA3tNm0fm91kc2BjPhV2vIjwwozJ7LToaLAyb1ca8BxrS7vT+Pvvf7RvqA==", @@ -5710,7 +5710,7 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/tsconfig-utils": { + "node_modules/@typescript-eslint/tsconfig-utils": { "version": "8.36.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.36.0.tgz", "integrity": "sha512-Nhh3TIEgN18mNbdXpd5Q8mSCBnrZQeY9V7Ca3dqYvNDStNIGRmJA6dmrIPMJ0kow3C7gcQbpsG2rPzy1Ks/AnA==", @@ -5727,172 +5727,15 @@ "typescript": ">=4.8.4 <5.9.0" } }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": { - "version": "8.36.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.36.0.tgz", - "integrity": "sha512-xGms6l5cTJKQPZOKM75Dl9yBfNdGeLRsIyufewnxT4vZTrjC0ImQT4fj8QmtJK84F58uSh5HVBSANwcfiXxABQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree": { - "version": "8.36.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.36.0.tgz", - "integrity": "sha512-JaS8bDVrfVJX4av0jLpe4ye0BpAaUW7+tnS4Y4ETa3q7NoZgzYbN9zDQTJ8kPb5fQ4n0hliAt9tA4Pfs2zA2Hg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/project-service": "8.36.0", - "@typescript-eslint/tsconfig-utils": "8.36.0", - "@typescript-eslint/types": "8.36.0", - "@typescript-eslint/visitor-keys": "8.36.0", - "debug": "^4.3.4", - "fast-glob": "^3.3.2", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^2.1.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <5.9.0" - } - }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/visitor-keys": { - "version": "8.36.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.36.0.tgz", - "integrity": "sha512-vZrhV2lRPWDuGoxcmrzRZyxAggPL+qp3WzUrlZD+slFueDiYHxeBa34dUXPuC0RmGKzl4lS5kFJYvKCq9cnNDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.36.0", - "eslint-visitor-keys": "^4.2.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/parser/node_modules/eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@typescript-eslint/parser/node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/parser/node_modules/ts-api-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", - "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18.12" - }, - "peerDependencies": { - "typescript": ">=4.8.4" - } - }, - "node_modules/@typescript-eslint/project-service": { - "version": "8.35.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.35.1.tgz", - "integrity": "sha512-VYxn/5LOpVxADAuP3NrnxxHYfzVtQzLKeldIhDhzC8UHaiQvYlXvKuVho1qLduFbJjjy5U5bkGwa3rUGUb1Q6Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.35.1", - "@typescript-eslint/types": "^8.35.1", - "debug": "^4.3.4" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <5.9.0" - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "8.35.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.35.1.tgz", - "integrity": "sha512-s/Bpd4i7ht2934nG+UoSPlYXd08KYz3bmjLEb7Ye1UVob0d1ENiT3lY8bsCmik4RqfSbPw9xJJHbugpPpP5JUg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.35.1", - "@typescript-eslint/visitor-keys": "8.35.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.35.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.35.1.tgz", - "integrity": "sha512-K5/U9VmT9dTHoNowWZpz+/TObS3xqC5h0xAIjXPw+MNcKV9qg6eSatEnmeAwkjHijhACH0/N7bkhKvbt1+DXWQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <5.9.0" - } - }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.35.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.35.1.tgz", - "integrity": "sha512-HOrUBlfVRz5W2LIKpXzZoy6VTZzMu2n8q9C2V/cFngIC5U1nStJgv0tMV4sZPzdf4wQm9/ToWUFPMN9Vq9VJQQ==", + "version": "8.36.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.36.0.tgz", + "integrity": "sha512-5aaGYG8cVDd6cxfk/ynpYzxBRZJk7w/ymto6uiyUFtdCozQIsQWh7M28/6r57Fwkbweng8qAzoMCPwSJfWlmsg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "8.35.1", - "@typescript-eslint/utils": "8.35.1", + "@typescript-eslint/typescript-estree": "8.36.0", + "@typescript-eslint/utils": "8.36.0", "debug": "^4.3.4", "ts-api-utils": "^2.1.0" }, @@ -5922,9 +5765,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.35.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.35.1.tgz", - "integrity": "sha512-q/O04vVnKHfrrhNAscndAn1tuQhIkwqnaW+eu5waD5IPts2eX1dgJxgqcPx5BX109/qAz7IG6VrEPTOYKCNfRQ==", + "version": "8.36.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.36.0.tgz", + "integrity": "sha512-xGms6l5cTJKQPZOKM75Dl9yBfNdGeLRsIyufewnxT4vZTrjC0ImQT4fj8QmtJK84F58uSh5HVBSANwcfiXxABQ==", "dev": true, "license": "MIT", "engines": { @@ -5936,16 +5779,16 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.35.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.35.1.tgz", - "integrity": "sha512-Vvpuvj4tBxIka7cPs6Y1uvM7gJgdF5Uu9F+mBJBPY4MhvjrjWGK4H0lVgLJd/8PWZ23FTqsaJaLEkBCFUk8Y9g==", + "version": "8.36.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.36.0.tgz", + "integrity": "sha512-JaS8bDVrfVJX4av0jLpe4ye0BpAaUW7+tnS4Y4ETa3q7NoZgzYbN9zDQTJ8kPb5fQ4n0hliAt9tA4Pfs2zA2Hg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.35.1", - "@typescript-eslint/tsconfig-utils": "8.35.1", - "@typescript-eslint/types": "8.35.1", - "@typescript-eslint/visitor-keys": "8.35.1", + "@typescript-eslint/project-service": "8.36.0", + "@typescript-eslint/tsconfig-utils": "8.36.0", + "@typescript-eslint/types": "8.36.0", + "@typescript-eslint/visitor-keys": "8.36.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", @@ -5991,16 +5834,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.35.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.35.1.tgz", - "integrity": "sha512-lhnwatFmOFcazAsUm3ZnZFpXSxiwoa1Lj50HphnDe1Et01NF4+hrdXONSUHIcbVu2eFb1bAf+5yjXkGVkXBKAQ==", + "version": "8.36.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.36.0.tgz", + "integrity": "sha512-VOqmHu42aEMT+P2qYjylw6zP/3E/HvptRwdn/PZxyV27KhZg2IOszXod4NcXisWzPAGSS4trE/g4moNj6XmH2g==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.35.1", - "@typescript-eslint/types": "8.35.1", - "@typescript-eslint/typescript-estree": "8.35.1" + "@typescript-eslint/scope-manager": "8.36.0", + "@typescript-eslint/types": "8.36.0", + "@typescript-eslint/typescript-estree": "8.36.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -6015,13 +5858,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.35.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.35.1.tgz", - "integrity": "sha512-VRwixir4zBWCSTP/ljEo091lbpypz57PoeAQ9imjG+vbeof9LplljsL1mos4ccG6H9IjfrVGM359RozUnuFhpw==", + "version": "8.36.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.36.0.tgz", + "integrity": "sha512-vZrhV2lRPWDuGoxcmrzRZyxAggPL+qp3WzUrlZD+slFueDiYHxeBa34dUXPuC0RmGKzl4lS5kFJYvKCq9cnNDA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.35.1", + "@typescript-eslint/types": "8.36.0", "eslint-visitor-keys": "^4.2.1" }, "engines": { @@ -23367,16 +23210,16 @@ } }, "@typescript-eslint/eslint-plugin": { - "version": "8.35.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.35.1.tgz", - "integrity": "sha512-9XNTlo7P7RJxbVeICaIIIEipqxLKguyh+3UbXuT2XQuFp6d8VOeDEGuz5IiX0dgZo8CiI6aOFLg4e8cF71SFVg==", + "version": "8.36.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.36.0.tgz", + "integrity": "sha512-lZNihHUVB6ZZiPBNgOQGSxUASI7UJWhT8nHyUGCnaQ28XFCw98IfrMCG3rUl1uwUWoAvodJQby2KTs79UTcrAg==", "dev": true, "requires": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.35.1", - "@typescript-eslint/type-utils": "8.35.1", - "@typescript-eslint/utils": "8.35.1", - "@typescript-eslint/visitor-keys": "8.35.1", + "@typescript-eslint/scope-manager": "8.36.0", + "@typescript-eslint/type-utils": "8.36.0", + "@typescript-eslint/utils": "8.36.0", + "@typescript-eslint/visitor-keys": "8.36.0", "graphemer": "^1.4.0", "ignore": "^7.0.0", "natural-compare": "^1.4.0", @@ -23409,127 +23252,44 @@ "@typescript-eslint/typescript-estree": "8.36.0", "@typescript-eslint/visitor-keys": "8.36.0", "debug": "^4.3.4" - }, - "dependencies": { - "@typescript-eslint/project-service": { - "version": "8.36.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.36.0.tgz", - "integrity": "sha512-JAhQFIABkWccQYeLMrHadu/fhpzmSQ1F1KXkpzqiVxA/iYI6UnRt2trqXHt1sYEcw1mxLnB9rKMsOxXPxowN/g==", - "dev": true, - "requires": { - "@typescript-eslint/tsconfig-utils": "^8.36.0", - "@typescript-eslint/types": "^8.36.0", - "debug": "^4.3.4" - } - }, - "@typescript-eslint/scope-manager": { - "version": "8.36.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.36.0.tgz", - "integrity": "sha512-wCnapIKnDkN62fYtTGv2+RY8FlnBYA3tNm0fm91kc2BjPhV2vIjwwozJ7LToaLAyb1ca8BxrS7vT+Pvvf7RvqA==", - "dev": true, - "requires": { - "@typescript-eslint/types": "8.36.0", - "@typescript-eslint/visitor-keys": "8.36.0" - } - }, - "@typescript-eslint/tsconfig-utils": { - "version": "8.36.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.36.0.tgz", - "integrity": "sha512-Nhh3TIEgN18mNbdXpd5Q8mSCBnrZQeY9V7Ca3dqYvNDStNIGRmJA6dmrIPMJ0kow3C7gcQbpsG2rPzy1Ks/AnA==", - "dev": true, - "requires": {} - }, - "@typescript-eslint/types": { - "version": "8.36.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.36.0.tgz", - "integrity": "sha512-xGms6l5cTJKQPZOKM75Dl9yBfNdGeLRsIyufewnxT4vZTrjC0ImQT4fj8QmtJK84F58uSh5HVBSANwcfiXxABQ==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "8.36.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.36.0.tgz", - "integrity": "sha512-JaS8bDVrfVJX4av0jLpe4ye0BpAaUW7+tnS4Y4ETa3q7NoZgzYbN9zDQTJ8kPb5fQ4n0hliAt9tA4Pfs2zA2Hg==", - "dev": true, - "requires": { - "@typescript-eslint/project-service": "8.36.0", - "@typescript-eslint/tsconfig-utils": "8.36.0", - "@typescript-eslint/types": "8.36.0", - "@typescript-eslint/visitor-keys": "8.36.0", - "debug": "^4.3.4", - "fast-glob": "^3.3.2", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^2.1.0" - } - }, - "@typescript-eslint/visitor-keys": { - "version": "8.36.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.36.0.tgz", - "integrity": "sha512-vZrhV2lRPWDuGoxcmrzRZyxAggPL+qp3WzUrlZD+slFueDiYHxeBa34dUXPuC0RmGKzl4lS5kFJYvKCq9cnNDA==", - "dev": true, - "requires": { - "@typescript-eslint/types": "8.36.0", - "eslint-visitor-keys": "^4.2.1" - } - }, - "eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", - "dev": true - }, - "semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", - "dev": true - }, - "ts-api-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", - "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", - "dev": true, - "requires": {} - } } }, "@typescript-eslint/project-service": { - "version": "8.35.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.35.1.tgz", - "integrity": "sha512-VYxn/5LOpVxADAuP3NrnxxHYfzVtQzLKeldIhDhzC8UHaiQvYlXvKuVho1qLduFbJjjy5U5bkGwa3rUGUb1Q6Q==", + "version": "8.36.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.36.0.tgz", + "integrity": "sha512-JAhQFIABkWccQYeLMrHadu/fhpzmSQ1F1KXkpzqiVxA/iYI6UnRt2trqXHt1sYEcw1mxLnB9rKMsOxXPxowN/g==", "dev": true, "requires": { - "@typescript-eslint/tsconfig-utils": "^8.35.1", - "@typescript-eslint/types": "^8.35.1", + "@typescript-eslint/tsconfig-utils": "^8.36.0", + "@typescript-eslint/types": "^8.36.0", "debug": "^4.3.4" } }, "@typescript-eslint/scope-manager": { - "version": "8.35.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.35.1.tgz", - "integrity": "sha512-s/Bpd4i7ht2934nG+UoSPlYXd08KYz3bmjLEb7Ye1UVob0d1ENiT3lY8bsCmik4RqfSbPw9xJJHbugpPpP5JUg==", + "version": "8.36.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.36.0.tgz", + "integrity": "sha512-wCnapIKnDkN62fYtTGv2+RY8FlnBYA3tNm0fm91kc2BjPhV2vIjwwozJ7LToaLAyb1ca8BxrS7vT+Pvvf7RvqA==", "dev": true, "requires": { - "@typescript-eslint/types": "8.35.1", - "@typescript-eslint/visitor-keys": "8.35.1" + "@typescript-eslint/types": "8.36.0", + "@typescript-eslint/visitor-keys": "8.36.0" } }, "@typescript-eslint/tsconfig-utils": { - "version": "8.35.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.35.1.tgz", - "integrity": "sha512-K5/U9VmT9dTHoNowWZpz+/TObS3xqC5h0xAIjXPw+MNcKV9qg6eSatEnmeAwkjHijhACH0/N7bkhKvbt1+DXWQ==", + "version": "8.36.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.36.0.tgz", + "integrity": "sha512-Nhh3TIEgN18mNbdXpd5Q8mSCBnrZQeY9V7Ca3dqYvNDStNIGRmJA6dmrIPMJ0kow3C7gcQbpsG2rPzy1Ks/AnA==", "dev": true, "requires": {} }, "@typescript-eslint/type-utils": { - "version": "8.35.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.35.1.tgz", - "integrity": "sha512-HOrUBlfVRz5W2LIKpXzZoy6VTZzMu2n8q9C2V/cFngIC5U1nStJgv0tMV4sZPzdf4wQm9/ToWUFPMN9Vq9VJQQ==", + "version": "8.36.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.36.0.tgz", + "integrity": "sha512-5aaGYG8cVDd6cxfk/ynpYzxBRZJk7w/ymto6uiyUFtdCozQIsQWh7M28/6r57Fwkbweng8qAzoMCPwSJfWlmsg==", "dev": true, "requires": { - "@typescript-eslint/typescript-estree": "8.35.1", - "@typescript-eslint/utils": "8.35.1", + "@typescript-eslint/typescript-estree": "8.36.0", + "@typescript-eslint/utils": "8.36.0", "debug": "^4.3.4", "ts-api-utils": "^2.1.0" }, @@ -23544,21 +23304,21 @@ } }, "@typescript-eslint/types": { - "version": "8.35.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.35.1.tgz", - "integrity": "sha512-q/O04vVnKHfrrhNAscndAn1tuQhIkwqnaW+eu5waD5IPts2eX1dgJxgqcPx5BX109/qAz7IG6VrEPTOYKCNfRQ==", + "version": "8.36.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.36.0.tgz", + "integrity": "sha512-xGms6l5cTJKQPZOKM75Dl9yBfNdGeLRsIyufewnxT4vZTrjC0ImQT4fj8QmtJK84F58uSh5HVBSANwcfiXxABQ==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "8.35.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.35.1.tgz", - "integrity": "sha512-Vvpuvj4tBxIka7cPs6Y1uvM7gJgdF5Uu9F+mBJBPY4MhvjrjWGK4H0lVgLJd/8PWZ23FTqsaJaLEkBCFUk8Y9g==", + "version": "8.36.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.36.0.tgz", + "integrity": "sha512-JaS8bDVrfVJX4av0jLpe4ye0BpAaUW7+tnS4Y4ETa3q7NoZgzYbN9zDQTJ8kPb5fQ4n0hliAt9tA4Pfs2zA2Hg==", "dev": true, "requires": { - "@typescript-eslint/project-service": "8.35.1", - "@typescript-eslint/tsconfig-utils": "8.35.1", - "@typescript-eslint/types": "8.35.1", - "@typescript-eslint/visitor-keys": "8.35.1", + "@typescript-eslint/project-service": "8.36.0", + "@typescript-eslint/tsconfig-utils": "8.36.0", + "@typescript-eslint/types": "8.36.0", + "@typescript-eslint/visitor-keys": "8.36.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", @@ -23583,24 +23343,24 @@ } }, "@typescript-eslint/utils": { - "version": "8.35.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.35.1.tgz", - "integrity": "sha512-lhnwatFmOFcazAsUm3ZnZFpXSxiwoa1Lj50HphnDe1Et01NF4+hrdXONSUHIcbVu2eFb1bAf+5yjXkGVkXBKAQ==", + "version": "8.36.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.36.0.tgz", + "integrity": "sha512-VOqmHu42aEMT+P2qYjylw6zP/3E/HvptRwdn/PZxyV27KhZg2IOszXod4NcXisWzPAGSS4trE/g4moNj6XmH2g==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.35.1", - "@typescript-eslint/types": "8.35.1", - "@typescript-eslint/typescript-estree": "8.35.1" + "@typescript-eslint/scope-manager": "8.36.0", + "@typescript-eslint/types": "8.36.0", + "@typescript-eslint/typescript-estree": "8.36.0" } }, "@typescript-eslint/visitor-keys": { - "version": "8.35.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.35.1.tgz", - "integrity": "sha512-VRwixir4zBWCSTP/ljEo091lbpypz57PoeAQ9imjG+vbeof9LplljsL1mos4ccG6H9IjfrVGM359RozUnuFhpw==", + "version": "8.36.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.36.0.tgz", + "integrity": "sha512-vZrhV2lRPWDuGoxcmrzRZyxAggPL+qp3WzUrlZD+slFueDiYHxeBa34dUXPuC0RmGKzl4lS5kFJYvKCq9cnNDA==", "dev": true, "requires": { - "@typescript-eslint/types": "8.35.1", + "@typescript-eslint/types": "8.36.0", "eslint-visitor-keys": "^4.2.1" }, "dependencies": { diff --git a/package.json b/package.json index fe7694b0..a43ebc50 100644 --- a/package.json +++ b/package.json @@ -50,7 +50,7 @@ "@types/react-dom": "18.3.1", "@types/react-redux": "7.1.34", "@types/uuid": "10.0.0", - "@typescript-eslint/eslint-plugin": "8.35.1", + "@typescript-eslint/eslint-plugin": "8.36.0", "@typescript-eslint/parser": "8.36.0", "@vitejs/plugin-react": "4.6.0", "@vitest/coverage-v8": "3.2.4", From a92d087014a2359a2e47d9bc74d37f8757b5acef Mon Sep 17 00:00:00 2001 From: Simon Steinbeiss Date: Tue, 3 Jun 2025 18:34:01 +0200 Subject: [PATCH 150/331] Drop Edge Management federated module (HMS-8637) --- src/Components/LandingPage/LandingPage.tsx | 150 +----------------- src/Components/edge/ImageDetails.tsx | 44 ----- src/Components/edge/ImagesTable.tsx | 45 ------ .../sharedComponents/ImageBuilderHeader.tsx | 61 +------ src/Router.tsx | 20 +-- src/constants.ts | 5 - .../Components/edge/EdgeImagesTable.test.tsx | 8 - .../Components/edge/ImageDetails.test.tsx | 8 - src/test/setup.ts | 4 - 9 files changed, 11 insertions(+), 334 deletions(-) delete mode 100644 src/Components/edge/ImageDetails.tsx delete mode 100644 src/Components/edge/ImagesTable.tsx delete mode 100644 src/test/Components/edge/EdgeImagesTable.test.tsx delete mode 100644 src/test/Components/edge/ImageDetails.test.tsx diff --git a/src/Components/LandingPage/LandingPage.tsx b/src/Components/LandingPage/LandingPage.tsx index a1ea0ff7..0de0604d 100644 --- a/src/Components/LandingPage/LandingPage.tsx +++ b/src/Components/LandingPage/LandingPage.tsx @@ -1,13 +1,6 @@ -import React, { useEffect, useState } from 'react'; +import React, { useState } from 'react'; import { - Button, - Popover, - Tabs, - Tab, - TabTitleText, - Content, - TabAction, PageSection, Sidebar, SidebarContent, @@ -16,45 +9,18 @@ import { Toolbar, ToolbarContent, } from '@patternfly/react-core'; -import { ExternalLinkAltIcon, HelpIcon } from '@patternfly/react-icons'; -import { Outlet, useLocation, useNavigate } from 'react-router-dom'; +import { Outlet } from 'react-router-dom'; import './LandingPage.scss'; import { NewAlert } from './NewAlert'; -import { MANAGING_WITH_DNF_URL, OSTREE_URL } from '../../constants'; -import { manageEdgeImagesUrlName } from '../../Hooks/Edge/useGetNotificationProp'; -import { resolveRelPath } from '../../Utilities/path'; -import { useFlag } from '../../Utilities/useGetEnvironment'; import BlueprintsSidebar from '../Blueprints/BlueprintsSideBar'; -import EdgeImagesTable from '../edge/ImagesTable'; import ImagesTable from '../ImagesTable/ImagesTable'; import { ImageBuilderHeader } from '../sharedComponents/ImageBuilderHeader'; export const LandingPage = () => { const [showAlert, setShowAlert] = useState(true); - const { pathname } = useLocation(); - const navigate = useNavigate(); - const tabsPath = [ - resolveRelPath(''), - resolveRelPath(manageEdgeImagesUrlName), - ]; - const initialActiveTabKey = - tabsPath.indexOf(pathname) >= 0 ? tabsPath.indexOf(pathname) : 0; - const [activeTabKey, setActiveTabKey] = useState(initialActiveTabKey); - useEffect(() => { - setActiveTabKey(initialActiveTabKey); - }, [initialActiveTabKey]); - const handleTabClick = (_event: React.MouseEvent, tabIndex: number) => { - const tabPath = tabsPath[tabIndex]; - if (tabPath !== '') { - navigate(tabPath); - } - setActiveTabKey(tabIndex); - }; - - const edgeParityFlag = useFlag('edgeParity.image-list'); const imageList = ( <> @@ -85,115 +51,9 @@ export const LandingPage = () => { return ( <> - - - {edgeParityFlag ? ( - - Conventional (RPM-DNF){''} } - actions={ - - - - With RPM-DNF, you can manage the system software by - using the DNF package manager and updated RPM - packages. This is a simple and adaptive method of - managing and modifying the system over its lifecycle. - - - - - -
- } - /> - } - > - {imageList} - - Immutable (OSTree) } - actions={ - - - With OSTree, you can manage the system software by - referencing a central image repository. OSTree images - contain a complete operating system ready to be remotely - installed at scale. You can track updates to images - through commits and enable secure updates that only - address changes and keep the operating system unchanged. - The updates are quick, and the rollbacks are easy. - - - - - - } - /> - } - > - - - - ) : ( - imageList - )} - - - - ); -}; - -type HelpPopoverPropTypes = { - header: string; - body: React.ReactNode; -}; - -const HelpPopover = ({ header, body }: HelpPopoverPropTypes) => { - const ref = React.createRef(); - return ( - <> - - - - + + {imageList} + ); }; diff --git a/src/Components/edge/ImageDetails.tsx b/src/Components/edge/ImageDetails.tsx deleted file mode 100644 index a15d259e..00000000 --- a/src/Components/edge/ImageDetails.tsx +++ /dev/null @@ -1,44 +0,0 @@ -import React from 'react'; - -import AsyncComponent from '@redhat-cloud-services/frontend-components/AsyncComponent'; -import ErrorState from '@redhat-cloud-services/frontend-components/ErrorState'; -import Unavailable from '@redhat-cloud-services/frontend-components/Unavailable'; -import { useNavigate, useLocation, useParams } from 'react-router-dom'; - -import { - useGetNotificationProp, - manageEdgeImagesUrlName, -} from '../../Hooks/Edge/useGetNotificationProp'; -import { resolveRelPath } from '../../Utilities/path'; -import { useFlag } from '../../Utilities/useGetEnvironment'; - -const ImageDetail = () => { - const notificationProp = useGetNotificationProp(); - // Feature flag for the federated modules - const edgeParityFlag = useFlag('edgeParity.image-list'); - // Feature flag to access the 'local' images table list - const edgeLocalImageTable = useFlag('image-builder.edge.local-image-table'); - - if (edgeLocalImageTable) { - return
; - } - if (edgeParityFlag) { - return ( - } - navigateProp={useNavigate} - locationProp={useLocation} - notificationProp={notificationProp} - pathPrefix={resolveRelPath('')} - urlName={manageEdgeImagesUrlName} - paramsProp={useParams} - /> - ); - } else { - return ; - } -}; - -export default ImageDetail; diff --git a/src/Components/edge/ImagesTable.tsx b/src/Components/edge/ImagesTable.tsx deleted file mode 100644 index 7b7b486f..00000000 --- a/src/Components/edge/ImagesTable.tsx +++ /dev/null @@ -1,45 +0,0 @@ -import React from 'react'; - -import AsyncComponent from '@redhat-cloud-services/frontend-components/AsyncComponent'; -import ErrorState from '@redhat-cloud-services/frontend-components/ErrorState'; -import Unavailable from '@redhat-cloud-services/frontend-components/Unavailable'; -import { useNavigate, useLocation } from 'react-router-dom'; - -import { CREATING_IMAGES_WITH_IB_URL } from '../../constants'; -import { - useGetNotificationProp, - manageEdgeImagesUrlName, -} from '../../Hooks/Edge/useGetNotificationProp'; -import { resolveRelPath } from '../../Utilities/path'; -import { useFlag } from '../../Utilities/useGetEnvironment'; - -const ImagesTable = () => { - const notificationProp = useGetNotificationProp(); - // Feature flag for the federated modules - const edgeParityFlag = useFlag('edgeParity.image-list'); - // Feature flag to access the 'local' images table list - const edgeLocalImageTable = useFlag('image-builder.edge.local-image-table'); - - if (edgeLocalImageTable) { - return
; - } - if (edgeParityFlag) { - return ( - } - navigateProp={useNavigate} - locationProp={useLocation} - showHeaderProp={false} - docLinkProp={CREATING_IMAGES_WITH_IB_URL} - notificationProp={notificationProp} - pathPrefix={resolveRelPath('')} - urlName={manageEdgeImagesUrlName} - /> - ); - } - return ; -}; - -export default ImagesTable; diff --git a/src/Components/sharedComponents/ImageBuilderHeader.tsx b/src/Components/sharedComponents/ImageBuilderHeader.tsx index d44279cd..d3158ba5 100644 --- a/src/Components/sharedComponents/ImageBuilderHeader.tsx +++ b/src/Components/sharedComponents/ImageBuilderHeader.tsx @@ -1,6 +1,6 @@ import React, { useState } from 'react'; -import { Button, Popover, Content, Flex, Alert } from '@patternfly/react-core'; +import { Button, Popover, Content, Flex } from '@patternfly/react-core'; import { ExternalLinkAltIcon, HelpIcon } from '@patternfly/react-icons'; // eslint-disable-next-line rulesdir/disallow-fec-relative-imports import { @@ -11,10 +11,8 @@ import { import { useNavigate } from 'react-router-dom'; import { - CREATE_RHEL_IMAGES_WITH_AUTOMATED_MANAGEMENT_URL, CREATING_IMAGES_WITH_IB_SERVICE_URL, OSBUILD_SERVICE_ARCHITECTURE_URL, - RHEM_DOCUMENTATION_URL, } from '../../constants'; import { useBackendPrefetch } from '../../store/backendApi'; import { useAppSelector } from '../../store/hooks'; @@ -24,6 +22,10 @@ import './ImageBuilderHeader.scss'; import { useFlagWithEphemDefault } from '../../Utilities/useGetEnvironment'; import { ImportBlueprintModal } from '../Blueprints/ImportBlueprintModal'; +type ImageBuilderHeaderPropTypes = { + inWizard?: boolean; +}; + const AboutImageBuilderPopover = () => { return ( { Image builder for RPM-DNF documentation - - - } > @@ -78,13 +67,7 @@ const AboutImageBuilderPopover = () => { ); }; -type ImageBuilderHeaderPropTypes = { - activeTab?: number; - inWizard?: boolean; -}; - export const ImageBuilderHeader = ({ - activeTab, inWizard, }: ImageBuilderHeaderPropTypes) => { const navigate = useNavigate(); @@ -96,7 +79,6 @@ export const ImageBuilderHeader = ({ 'image-builder.import.enabled' ); const [showImportModal, setShowImportModal] = useState(false); - const isOnBlueprintsTab = activeTab === 0; return ( <> {importExportFlag && ( @@ -124,7 +106,6 @@ export const ImageBuilderHeader = ({ variant="primary" data-testid="blueprints-create-button" onClick={() => navigate(resolveRelPath('imagewizard'))} - isDisabled={!isOnBlueprintsTab} onMouseEnter={() => prefetchTargets({ distribution: distribution, @@ -138,7 +119,6 @@ export const ImageBuilderHeader = ({ data-testid="import-blueprint-button" variant="secondary" onClick={() => setShowImportModal(true)} - isDisabled={!isOnBlueprintsTab} > Import @@ -148,37 +128,6 @@ export const ImageBuilderHeader = ({ } /> - {!isOnBlueprintsTab && !inWizard && !process.env.IS_ON_PREMISE && ( - Upcoming decommission of hosted Edge Management service} - className="pf-v6-u-mt-sm pf-v6-u-mb-sm" - > - - - As of July 31, 2025, the hosted edge management service will no - longer be supported. This means that pushing image updates to - Immutable (OSTree) systems using the Hybrid Cloud Console will - be discontinued. For an alternative way to manage edge systems, - customers are encouraged to explore Red Hat Edge Manager (RHEM). - - - - - - - )} ); diff --git a/src/Router.tsx b/src/Router.tsx index 287c5858..0963f7ca 100644 --- a/src/Router.tsx +++ b/src/Router.tsx @@ -2,13 +2,8 @@ import React, { lazy, Suspense } from 'react'; import { Route, Routes } from 'react-router-dom'; -import EdgeImageDetail from './Components/edge/ImageDetails'; import ShareImageModal from './Components/ShareImageModal/ShareImageModal'; -import { manageEdgeImagesUrlName } from './Hooks/Edge/useGetNotificationProp'; -import { - useFlag, - useFlagWithEphemDefault, -} from './Utilities/useGetEnvironment'; +import { useFlagWithEphemDefault } from './Utilities/useGetEnvironment'; const LandingPage = lazy(() => import('./Components/LandingPage/LandingPage')); const ImportImageWizard = lazy( @@ -17,7 +12,6 @@ const ImportImageWizard = lazy( const CreateImageWizard = lazy(() => import('./Components/CreateImageWizard')); export const Router = () => { - const edgeParityFlag = useFlag('edgeParity.image-list'); const importExportFlag = useFlagWithEphemDefault( 'image-builder.import.enabled' ); @@ -52,18 +46,6 @@ export const Router = () => { } /> - {edgeParityFlag && ( - } - > - } /> - } - /> - - )} ); }; diff --git a/src/constants.ts b/src/constants.ts index 3f518e6c..35dc9f72 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -35,13 +35,8 @@ export const MANAGING_WITH_DNF_URL = 'https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/9/html/managing_software_with_the_dnf_tool/index'; export const CREATING_IMAGES_WITH_IB_SERVICE_URL = 'https://docs.redhat.com/en/documentation/red_hat_insights/1-latest/html/deploying_and_managing_rhel_systems_in_hybrid_clouds/index'; -export const RHEM_DOCUMENTATION_URL = - 'https://docs.redhat.com/en/documentation/red_hat_ansible_automation_platform/2.5/html/managing_device_fleets_with_the_red_hat_edge_manager/index'; -export const OSTREE_URL = 'https://ostreedev.github.io/ostree/'; export const DOCUMENTATION_URL = 'https://docs.redhat.com/en/documentation/red_hat_insights/1-latest/html/deploying_and_managing_rhel_systems_in_hybrid_clouds/index'; -export const CREATE_RHEL_IMAGES_WITH_AUTOMATED_MANAGEMENT_URL = - 'https://docs.redhat.com/en/documentation/edge_management/2022/html/create_rhel_for_edge_images_and_configure_automated_management/index'; export const OSBUILD_SERVICE_ARCHITECTURE_URL = 'https://osbuild.org/docs/service/architecture/'; export const GENERATING_SSH_KEY_PAIRS_URL = diff --git a/src/test/Components/edge/EdgeImagesTable.test.tsx b/src/test/Components/edge/EdgeImagesTable.test.tsx deleted file mode 100644 index dcb247fa..00000000 --- a/src/test/Components/edge/EdgeImagesTable.test.tsx +++ /dev/null @@ -1,8 +0,0 @@ -import { useFlag } from '@unleash/proxy-client-react'; - -describe('mocking unleash calls', () => { - test('the ege local image table is set to true', () => { - const edgeLocalImageTable = useFlag('image-builder.edge.local-image-table'); - expect(edgeLocalImageTable).toBe(true); - }); -}); diff --git a/src/test/Components/edge/ImageDetails.test.tsx b/src/test/Components/edge/ImageDetails.test.tsx deleted file mode 100644 index e1a3ffd6..00000000 --- a/src/test/Components/edge/ImageDetails.test.tsx +++ /dev/null @@ -1,8 +0,0 @@ -import { useFlag } from '../../../Utilities/useGetEnvironment'; - -describe('mocking unleash calls', () => { - test('the ege local image table is set to true', () => { - const edgeLocalImageTable = useFlag('image-builder.edge.local-image-table'); - expect(edgeLocalImageTable).toBe(true); - }); -}); diff --git a/src/test/setup.ts b/src/test/setup.ts index 3f1e2595..d3675dfd 100644 --- a/src/test/setup.ts +++ b/src/test/setup.ts @@ -57,10 +57,6 @@ vi.mock('@unleash/proxy-client-react', () => ({ switch (flag) { case 'image-builder.import.enabled': return true; - case 'edgeParity.image-list': - return true; - case 'image-builder.edge.local-image-table': - return true; case 'image-builder.satellite.enabled': return true; case 'image-builder.templates.enabled': From bb9c5620eed31991f76557f9b68bd0514d9adae6 Mon Sep 17 00:00:00 2001 From: regexowl Date: Thu, 26 Jun 2025 16:04:42 +0200 Subject: [PATCH 151/331] Wizard: Show error with duplicated values This show an error when user imports duplicate values to a `` field. --- .../CreateImageWizard/LabelInput.tsx | 32 +++-- .../utilities/getListOfDuplicates.ts | 6 + .../utilities/useValidation.tsx | 123 +++++++++++++++--- 3 files changed, 136 insertions(+), 25 deletions(-) create mode 100644 src/Components/CreateImageWizard/utilities/getListOfDuplicates.ts diff --git a/src/Components/CreateImageWizard/LabelInput.tsx b/src/Components/CreateImageWizard/LabelInput.tsx index 0f91f624..031fa3e7 100644 --- a/src/Components/CreateImageWizard/LabelInput.tsx +++ b/src/Components/CreateImageWizard/LabelInput.tsx @@ -48,30 +48,36 @@ const LabelInput = ({ const dispatch = useAppDispatch(); const [inputValue, setInputValue] = useState(''); - const [errorText, setErrorText] = useState(stepValidation.errors[fieldName]); + const [onStepInputErrorText, setOnStepInputErrorText] = useState(''); + let [invalidImports, duplicateImports] = ['', '']; + + if (stepValidation.errors[fieldName]) { + [invalidImports, duplicateImports] = + stepValidation.errors[fieldName].split('|'); + } const onTextInputChange = ( _event: React.FormEvent, value: string ) => { setInputValue(value); - setErrorText(''); + setOnStepInputErrorText(''); }; const addItem = (value: string) => { if (list?.includes(value) || requiredList?.includes(value)) { - setErrorText(`${item} already exists.`); + setOnStepInputErrorText(`${item} already exists.`); return; } if (!validator(value)) { - setErrorText('Invalid format.'); + setOnStepInputErrorText('Invalid format.'); return; } dispatch(addAction(value)); setInputValue(''); - setErrorText(''); + setOnStepInputErrorText(''); }; const handleKeyDown = (e: React.KeyboardEvent, value: string) => { @@ -87,14 +93,18 @@ const LabelInput = ({ const handleRemoveItem = (e: React.MouseEvent, value: string) => { dispatch(removeAction(value)); - setErrorText(''); }; const handleClear = () => { setInputValue(''); - setErrorText(''); + setOnStepInputErrorText(''); }; + const errors = []; + if (onStepInputErrorText) errors.push(onStepInputErrorText); + if (invalidImports) errors.push(invalidImports); + if (duplicateImports) errors.push(duplicateImports); + return ( <> @@ -125,9 +135,13 @@ const LabelInput = ({ /> - {errorText && ( + {errors.length > 0 && ( - {errorText} + {errors.map((error, index) => ( + + {error} + + ))} )} {requiredList && requiredList.length > 0 && ( diff --git a/src/Components/CreateImageWizard/utilities/getListOfDuplicates.ts b/src/Components/CreateImageWizard/utilities/getListOfDuplicates.ts new file mode 100644 index 00000000..f258bf16 --- /dev/null +++ b/src/Components/CreateImageWizard/utilities/getListOfDuplicates.ts @@ -0,0 +1,6 @@ +export const getListOfDuplicates = (list: string[]) => { + const duplicates = list.filter((item, index) => list.indexOf(item) !== index); + const uniqueDuplicates = [...new Set(duplicates)]; + + return uniqueDuplicates; +}; diff --git a/src/Components/CreateImageWizard/utilities/useValidation.tsx b/src/Components/CreateImageWizard/utilities/useValidation.tsx index 90d75ab2..93e49677 100644 --- a/src/Components/CreateImageWizard/utilities/useValidation.tsx +++ b/src/Components/CreateImageWizard/utilities/useValidation.tsx @@ -3,6 +3,8 @@ import React, { useEffect, useState } from 'react'; import { CheckCircleIcon } from '@patternfly/react-icons'; import { jwtDecode, JwtPayload } from 'jwt-decode'; +import { getListOfDuplicates } from './getListOfDuplicates'; + import { UNIQUE_VALIDATION_DELAY } from '../../../constants'; import { useLazyGetBlueprintsQuery } from '../../../store/backendApi'; import { useAppSelector } from '../../../store/hooks'; @@ -281,14 +283,26 @@ export function useTimezoneValidation(): StepValidation { } } + const duplicateNtpServers = getListOfDuplicates(ntpServers || []); + const timezoneError = timezone && !timezones.includes(timezone) ? 'Unknown timezone' : ''; const ntpServersError = invalidServers.length > 0 ? `Invalid NTP servers: ${invalidServers}` : ''; + const duplicateNtpServersError = + duplicateNtpServers.length > 0 + ? `Includes duplicate NTP servers: ${duplicateNtpServers.join(', ')}` + : ''; return { - errors: { timezone: timezoneError, ntpServers: ntpServersError }, - disabledNext: timezoneError !== '' || invalidServers.length > 0, + errors: { + timezone: timezoneError, + ntpServers: ntpServersError + '|' + duplicateNtpServersError, + }, + disabledNext: + timezoneError !== '' || + invalidServers.length > 0 || + duplicateNtpServers.length > 0, }; } @@ -363,15 +377,28 @@ export function useKernelValidation(): StepValidation { } } + const duplicateKernelArgs = getListOfDuplicates(kernel.append); + const kernelNameError = kernel.name && !isKernelNameValid(kernel.name) ? 'Invalid format.' : ''; const kernelAppendError = invalidArgs.length > 0 ? `Invalid kernel arguments: ${invalidArgs}` : ''; + const duplicateKernelArgsError = + duplicateKernelArgs.length > 0 + ? `Includes duplicate kernel arguments: ${duplicateKernelArgs.join(', ')}` + : ''; + return { - errors: { kernel: kernelNameError, kernelAppend: kernelAppendError }, - disabledNext: kernelNameError !== '' || kernelAppendError !== '', + errors: { + kernel: kernelNameError, + kernelAppend: kernelAppendError + '|' + duplicateKernelArgsError, + }, + disabledNext: + kernelNameError !== '' || + kernelAppendError !== '' || + duplicateKernelArgs.length > 0, }; } @@ -405,8 +432,32 @@ export function useFirewallValidation(): StepValidation { } } + const duplicatePorts = getListOfDuplicates(firewall.ports); + const duplicateDisabledServices = getListOfDuplicates( + firewall.services.disabled + ); + const duplicateEnabledServices = getListOfDuplicates( + firewall.services.enabled + ); + const portsError = invalidPorts.length > 0 ? `Invalid ports: ${invalidPorts}` : ''; + const duplicatePortsError = + duplicatePorts.length > 0 + ? `Includes duplicate ports: ${duplicatePorts.join(', ')}` + : ''; + const duplicateDisabledServicesError = + duplicateDisabledServices.length > 0 + ? `Includes duplicate disabled services: ${duplicateDisabledServices.join( + ', ' + )}` + : ''; + const duplicateEnabledServicesError = + duplicateEnabledServices.length > 0 + ? `Includes duplicate enabled services: ${duplicateEnabledServices.join( + ', ' + )}` + : ''; const disabledServicesError = invalidDisabled.length > 0 ? `Invalid disabled services: ${invalidDisabled}` @@ -418,14 +469,19 @@ export function useFirewallValidation(): StepValidation { return { errors: { - ports: portsError, - disabledServices: disabledServicesError, - enabledServices: enabledServicesError, + ports: portsError + '|' + duplicatePortsError, + disabledServices: + disabledServicesError + '|' + duplicateDisabledServicesError, + enabledServices: + enabledServicesError + '|' + duplicateEnabledServicesError, }, disabledNext: invalidPorts.length > 0 || invalidDisabled.length > 0 || - invalidEnabled.length > 0, + invalidEnabled.length > 0 || + duplicatePorts.length > 0 || + duplicateDisabledServices.length > 0 || + duplicateEnabledServices.length > 0, }; } @@ -460,6 +516,10 @@ export function useServicesValidation(): StepValidation { } } + const duplicateDisabledServices = getListOfDuplicates(services.disabled); + const duplicateMaskedServices = getListOfDuplicates(services.masked); + const duplicateEnabledServices = getListOfDuplicates(services.enabled); + const disabledSystemdServicesError = invalidDisabled.length > 0 ? `Invalid disabled services: ${invalidDisabled}` @@ -470,17 +530,41 @@ export function useServicesValidation(): StepValidation { invalidEnabled.length > 0 ? `Invalid enabled services: ${invalidEnabled}` : ''; + const duplicateDisabledServicesError = + duplicateDisabledServices.length > 0 + ? `Includes duplicate disabled services: ${duplicateDisabledServices.join( + ', ' + )}` + : ''; + const duplicateMaskedServicesError = + duplicateMaskedServices.length > 0 + ? `Includes duplicate masked services: ${duplicateMaskedServices.join( + ', ' + )}` + : ''; + const duplicateEnabledServicesError = + duplicateEnabledServices.length > 0 + ? `Includes duplicate enabled services: ${duplicateEnabledServices.join( + ', ' + )}` + : ''; return { errors: { - disabledSystemdServices: disabledSystemdServicesError, - maskedSystemdServices: maskedSystemdServicesError, - enabledSystemdServices: enabledSystemdServicesError, + disabledSystemdServices: + disabledSystemdServicesError + '|' + duplicateDisabledServicesError, + maskedSystemdServices: + maskedSystemdServicesError + '|' + duplicateMaskedServicesError, + enabledSystemdServices: + enabledSystemdServicesError + '|' + duplicateEnabledServicesError, }, disabledNext: invalidDisabled.length > 0 || invalidMasked.length > 0 || - invalidEnabled.length > 0, + invalidEnabled.length > 0 || + duplicateDisabledServices.length > 0 || + duplicateMaskedServices.length > 0 || + duplicateEnabledServices.length > 0, }; } @@ -544,20 +628,27 @@ export function useUsersValidation(): UsersStepValidation { } } - const groupsError = + const duplicateGroups = getListOfDuplicates(users[index].groups); + + const invalidError = invalidGroups.length > 0 ? `Invalid user groups: ${invalidGroups}` : ''; + const duplicateError = + duplicateGroups.length > 0 + ? `Includes duplicate groups: ${duplicateGroups.join(', ')}` + : ''; if ( userNameError || sshKeyError || (users[index].password && !isPasswordValid) || - groupsError + invalidError || + duplicateError ) { - errors[`${index}`] = { + errors[index] = { userName: userNameError, userSshKey: sshKeyError, userPassword: passwordError, - groups: groupsError, + groups: invalidError + '|' + duplicateError, }; } } From 8c4e8d4fab6de4ce3c8aac6b517b9ec93350e1fa Mon Sep 17 00:00:00 2001 From: schutzbot Date: Wed, 9 Jul 2025 08:37:19 +0000 Subject: [PATCH 152/331] Post release version bump [skip ci] --- cockpit/cockpit-image-builder.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cockpit/cockpit-image-builder.spec b/cockpit/cockpit-image-builder.spec index fe62d948..23f7cfd0 100644 --- a/cockpit/cockpit-image-builder.spec +++ b/cockpit/cockpit-image-builder.spec @@ -1,5 +1,5 @@ Name: cockpit-image-builder -Version: 71 +Version: 72 Release: 1%{?dist} Summary: Image builder plugin for Cockpit From 9ffbf67c4271181a169aad85cf6b90e08e4d032e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 10 Jul 2025 04:31:06 +0000 Subject: [PATCH 153/331] build(deps-dev): bump @types/node from 24.0.10 to 24.0.12 Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 24.0.10 to 24.0.12. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node) --- updated-dependencies: - dependency-name: "@types/node" dependency-version: 24.0.12 dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 34d80cca..0c01a933 100644 --- a/package-lock.json +++ b/package-lock.json @@ -47,7 +47,7 @@ "@testing-library/jest-dom": "6.6.3", "@testing-library/react": "16.3.0", "@testing-library/user-event": "14.6.1", - "@types/node": "24.0.10", + "@types/node": "24.0.12", "@types/react": "18.3.12", "@types/react-dom": "18.3.1", "@types/react-redux": "7.1.34", @@ -5458,9 +5458,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "24.0.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.0.10.tgz", - "integrity": "sha512-ENHwaH+JIRTDIEEbDK6QSQntAYGtbvdDXnMXnZaZ6k13Du1dPMmprkEHIL7ok2Wl2aZevetwTAb5S+7yIF+enA==", + "version": "24.0.12", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.0.12.tgz", + "integrity": "sha512-LtOrbvDf5ndC9Xi+4QZjVL0woFymF/xSTKZKPgrrl7H7XoeDvnD+E2IclKVDyaK9UM756W/3BXqSU+JEHopA9g==", "license": "MIT", "dependencies": { "undici-types": "~7.8.0" @@ -23092,9 +23092,9 @@ "dev": true }, "@types/node": { - "version": "24.0.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.0.10.tgz", - "integrity": "sha512-ENHwaH+JIRTDIEEbDK6QSQntAYGtbvdDXnMXnZaZ6k13Du1dPMmprkEHIL7ok2Wl2aZevetwTAb5S+7yIF+enA==", + "version": "24.0.12", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.0.12.tgz", + "integrity": "sha512-LtOrbvDf5ndC9Xi+4QZjVL0woFymF/xSTKZKPgrrl7H7XoeDvnD+E2IclKVDyaK9UM756W/3BXqSU+JEHopA9g==", "requires": { "undici-types": "~7.8.0" } diff --git a/package.json b/package.json index a43ebc50..d3e01649 100644 --- a/package.json +++ b/package.json @@ -45,7 +45,7 @@ "@testing-library/jest-dom": "6.6.3", "@testing-library/react": "16.3.0", "@testing-library/user-event": "14.6.1", - "@types/node": "24.0.10", + "@types/node": "24.0.12", "@types/react": "18.3.12", "@types/react-dom": "18.3.1", "@types/react-redux": "7.1.34", From 0bf939f2d091d03d711d54eb8d8f3202ad6c52df Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 10 Jul 2025 06:48:20 +0000 Subject: [PATCH 154/331] build(deps-dev): bump eslint-plugin-import from 2.31.0 to 2.32.0 Bumps [eslint-plugin-import](https://github.com/import-js/eslint-plugin-import) from 2.31.0 to 2.32.0. - [Release notes](https://github.com/import-js/eslint-plugin-import/releases) - [Changelog](https://github.com/import-js/eslint-plugin-import/blob/main/CHANGELOG.md) - [Commits](https://github.com/import-js/eslint-plugin-import/compare/v2.31.0...v2.32.0) --- updated-dependencies: - dependency-name: eslint-plugin-import dependency-version: 2.32.0 dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package-lock.json | 312 ++++++++++++++++++++++++++++++++-------------- package.json | 2 +- 2 files changed, 218 insertions(+), 96 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0c01a933..aebefe20 100644 --- a/package-lock.json +++ b/package-lock.json @@ -64,7 +64,7 @@ "css-loader": "7.1.2", "eslint": "8.57.1", "eslint-plugin-disable-autofix": "5.0.1", - "eslint-plugin-import": "2.31.0", + "eslint-plugin-import": "2.32.0", "eslint-plugin-jest-dom": "5.5.0", "eslint-plugin-jsx-a11y": "6.10.2", "eslint-plugin-playwright": "2.2.0", @@ -6598,16 +6598,20 @@ "license": "MIT" }, "node_modules/array-includes": { - "version": "3.1.8", + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz", + "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.4", - "is-string": "^1.0.7" + "es-abstract": "^1.24.0", + "es-object-atoms": "^1.1.1", + "get-intrinsic": "^1.3.0", + "is-string": "^1.1.1", + "math-intrinsics": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -6655,16 +6659,19 @@ } }, "node_modules/array.prototype.findlastindex": { - "version": "1.2.5", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz", + "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", + "es-abstract": "^1.23.9", "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-shim-unscopables": "^1.0.2" + "es-object-atoms": "^1.1.1", + "es-shim-unscopables": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -6674,14 +6681,16 @@ } }, "node_modules/array.prototype.flat": { - "version": "1.3.2", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", + "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -9025,7 +9034,9 @@ } }, "node_modules/es-abstract": { - "version": "1.23.9", + "version": "1.24.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz", + "integrity": "sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==", "dev": true, "license": "MIT", "dependencies": { @@ -9033,18 +9044,18 @@ "arraybuffer.prototype.slice": "^1.0.4", "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", - "call-bound": "^1.0.3", + "call-bound": "^1.0.4", "data-view-buffer": "^1.0.2", "data-view-byte-length": "^1.0.2", "data-view-byte-offset": "^1.0.1", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", + "es-object-atoms": "^1.1.1", "es-set-tostringtag": "^2.1.0", "es-to-primitive": "^1.3.0", "function.prototype.name": "^1.1.8", - "get-intrinsic": "^1.2.7", - "get-proto": "^1.0.0", + "get-intrinsic": "^1.3.0", + "get-proto": "^1.0.1", "get-symbol-description": "^1.1.0", "globalthis": "^1.0.4", "gopd": "^1.2.0", @@ -9056,21 +9067,24 @@ "is-array-buffer": "^3.0.5", "is-callable": "^1.2.7", "is-data-view": "^1.0.2", + "is-negative-zero": "^2.0.3", "is-regex": "^1.2.1", + "is-set": "^2.0.3", "is-shared-array-buffer": "^1.0.4", "is-string": "^1.1.1", "is-typed-array": "^1.1.15", - "is-weakref": "^1.1.0", + "is-weakref": "^1.1.1", "math-intrinsics": "^1.1.0", - "object-inspect": "^1.13.3", + "object-inspect": "^1.13.4", "object-keys": "^1.1.1", "object.assign": "^4.1.7", "own-keys": "^1.0.1", - "regexp.prototype.flags": "^1.5.3", + "regexp.prototype.flags": "^1.5.4", "safe-array-concat": "^1.1.3", "safe-push-apply": "^1.0.0", "safe-regex-test": "^1.1.0", "set-proto": "^1.0.0", + "stop-iteration-iterator": "^1.1.0", "string.prototype.trim": "^1.2.10", "string.prototype.trimend": "^1.0.9", "string.prototype.trimstart": "^1.0.8", @@ -9079,7 +9093,7 @@ "typed-array-byte-offset": "^1.0.4", "typed-array-length": "^1.0.7", "unbox-primitive": "^1.1.0", - "which-typed-array": "^1.1.18" + "which-typed-array": "^1.1.19" }, "engines": { "node": ">= 0.4" @@ -9164,11 +9178,16 @@ } }, "node_modules/es-shim-unscopables": { - "version": "1.0.2", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", + "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", "dev": true, "license": "MIT", "dependencies": { - "hasown": "^2.0.0" + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" } }, "node_modules/es-to-primitive": { @@ -9368,7 +9387,9 @@ } }, "node_modules/eslint-module-utils": { - "version": "2.12.0", + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.1.tgz", + "integrity": "sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==", "dev": true, "license": "MIT", "dependencies": { @@ -9385,6 +9406,8 @@ }, "node_modules/eslint-module-utils/node_modules/debug": { "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "license": "MIT", "dependencies": { @@ -9405,28 +9428,30 @@ } }, "node_modules/eslint-plugin-import": { - "version": "2.31.0", + "version": "2.32.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz", + "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", "dev": true, "license": "MIT", "dependencies": { "@rtsao/scc": "^1.1.0", - "array-includes": "^3.1.8", - "array.prototype.findlastindex": "^1.2.5", - "array.prototype.flat": "^1.3.2", - "array.prototype.flatmap": "^1.3.2", + "array-includes": "^3.1.9", + "array.prototype.findlastindex": "^1.2.6", + "array.prototype.flat": "^1.3.3", + "array.prototype.flatmap": "^1.3.3", "debug": "^3.2.7", "doctrine": "^2.1.0", "eslint-import-resolver-node": "^0.3.9", - "eslint-module-utils": "^2.12.0", + "eslint-module-utils": "^2.12.1", "hasown": "^2.0.2", - "is-core-module": "^2.15.1", + "is-core-module": "^2.16.1", "is-glob": "^4.0.3", "minimatch": "^3.1.2", "object.fromentries": "^2.0.8", "object.groupby": "^1.0.3", - "object.values": "^1.2.0", + "object.values": "^1.2.1", "semver": "^6.3.1", - "string.prototype.trimend": "^1.0.8", + "string.prototype.trimend": "^1.0.9", "tsconfig-paths": "^3.15.0" }, "engines": { @@ -10451,11 +10476,19 @@ } }, "node_modules/for-each": { - "version": "0.3.3", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", "dev": true, "license": "MIT", "dependencies": { - "is-callable": "^1.1.3" + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/foreground-child": { @@ -12027,6 +12060,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-network-error": { "version": "1.1.0", "dev": true, @@ -12298,11 +12344,13 @@ } }, "node_modules/is-weakref": { - "version": "1.1.0", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", "dev": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.2" + "call-bound": "^1.0.3" }, "engines": { "node": ">= 0.4" @@ -14164,7 +14212,9 @@ } }, "node_modules/object-inspect": { - "version": "1.13.3", + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", "dev": true, "license": "MIT", "engines": { @@ -15799,13 +15849,17 @@ } }, "node_modules/regexp.prototype.flags": { - "version": "1.5.3", + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", "set-function-name": "^2.0.2" }, "engines": { @@ -17060,6 +17114,20 @@ "dev": true, "license": "MIT" }, + "node_modules/stop-iteration-iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", + "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "internal-slot": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/stream-browserify": { "version": "3.0.0", "dev": true, @@ -19621,14 +19689,17 @@ } }, "node_modules/which-typed-array": { - "version": "1.1.18", + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", + "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", "dev": true, "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "for-each": "^0.3.3", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-tostringtag": "^1.0.2" }, @@ -23862,15 +23933,19 @@ "dev": true }, "array-includes": { - "version": "3.1.8", + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz", + "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==", "dev": true, "requires": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.4", - "is-string": "^1.0.7" + "es-abstract": "^1.24.0", + "es-object-atoms": "^1.1.1", + "get-intrinsic": "^1.3.0", + "is-string": "^1.1.1", + "math-intrinsics": "^1.1.0" } }, "array-union": { @@ -23897,25 +23972,30 @@ } }, "array.prototype.findlastindex": { - "version": "1.2.5", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz", + "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==", "dev": true, "requires": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", + "es-abstract": "^1.23.9", "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-shim-unscopables": "^1.0.2" + "es-object-atoms": "^1.1.1", + "es-shim-unscopables": "^1.1.0" } }, "array.prototype.flat": { - "version": "1.3.2", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", + "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", "dev": true, "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" } }, "array.prototype.flatmap": { @@ -25378,25 +25458,27 @@ } }, "es-abstract": { - "version": "1.23.9", + "version": "1.24.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz", + "integrity": "sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==", "dev": true, "requires": { "array-buffer-byte-length": "^1.0.2", "arraybuffer.prototype.slice": "^1.0.4", "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", - "call-bound": "^1.0.3", + "call-bound": "^1.0.4", "data-view-buffer": "^1.0.2", "data-view-byte-length": "^1.0.2", "data-view-byte-offset": "^1.0.1", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", + "es-object-atoms": "^1.1.1", "es-set-tostringtag": "^2.1.0", "es-to-primitive": "^1.3.0", "function.prototype.name": "^1.1.8", - "get-intrinsic": "^1.2.7", - "get-proto": "^1.0.0", + "get-intrinsic": "^1.3.0", + "get-proto": "^1.0.1", "get-symbol-description": "^1.1.0", "globalthis": "^1.0.4", "gopd": "^1.2.0", @@ -25408,21 +25490,24 @@ "is-array-buffer": "^3.0.5", "is-callable": "^1.2.7", "is-data-view": "^1.0.2", + "is-negative-zero": "^2.0.3", "is-regex": "^1.2.1", + "is-set": "^2.0.3", "is-shared-array-buffer": "^1.0.4", "is-string": "^1.1.1", "is-typed-array": "^1.1.15", - "is-weakref": "^1.1.0", + "is-weakref": "^1.1.1", "math-intrinsics": "^1.1.0", - "object-inspect": "^1.13.3", + "object-inspect": "^1.13.4", "object-keys": "^1.1.1", "object.assign": "^4.1.7", "own-keys": "^1.0.1", - "regexp.prototype.flags": "^1.5.3", + "regexp.prototype.flags": "^1.5.4", "safe-array-concat": "^1.1.3", "safe-push-apply": "^1.0.0", "safe-regex-test": "^1.1.0", "set-proto": "^1.0.0", + "stop-iteration-iterator": "^1.1.0", "string.prototype.trim": "^1.2.10", "string.prototype.trimend": "^1.0.9", "string.prototype.trimstart": "^1.0.8", @@ -25431,7 +25516,7 @@ "typed-array-byte-offset": "^1.0.4", "typed-array-length": "^1.0.7", "unbox-primitive": "^1.1.0", - "which-typed-array": "^1.1.18" + "which-typed-array": "^1.1.19" } }, "es-define-property": { @@ -25489,10 +25574,12 @@ } }, "es-shim-unscopables": { - "version": "1.0.2", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", + "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", "dev": true, "requires": { - "hasown": "^2.0.0" + "hasown": "^2.0.2" } }, "es-to-primitive": { @@ -25692,7 +25779,9 @@ } }, "eslint-module-utils": { - "version": "2.12.0", + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.1.tgz", + "integrity": "sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==", "dev": true, "requires": { "debug": "^3.2.7" @@ -25700,6 +25789,8 @@ "dependencies": { "debug": { "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "requires": { "ms": "^2.1.1" @@ -25717,27 +25808,29 @@ } }, "eslint-plugin-import": { - "version": "2.31.0", + "version": "2.32.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz", + "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", "dev": true, "requires": { "@rtsao/scc": "^1.1.0", - "array-includes": "^3.1.8", - "array.prototype.findlastindex": "^1.2.5", - "array.prototype.flat": "^1.3.2", - "array.prototype.flatmap": "^1.3.2", + "array-includes": "^3.1.9", + "array.prototype.findlastindex": "^1.2.6", + "array.prototype.flat": "^1.3.3", + "array.prototype.flatmap": "^1.3.3", "debug": "^3.2.7", "doctrine": "^2.1.0", "eslint-import-resolver-node": "^0.3.9", - "eslint-module-utils": "^2.12.0", + "eslint-module-utils": "^2.12.1", "hasown": "^2.0.2", - "is-core-module": "^2.15.1", + "is-core-module": "^2.16.1", "is-glob": "^4.0.3", "minimatch": "^3.1.2", "object.fromentries": "^2.0.8", "object.groupby": "^1.0.3", - "object.values": "^1.2.0", + "object.values": "^1.2.1", "semver": "^6.3.1", - "string.prototype.trimend": "^1.0.8", + "string.prototype.trimend": "^1.0.9", "tsconfig-paths": "^3.15.0" }, "dependencies": { @@ -26339,10 +26432,12 @@ "version": "1.15.9" }, "for-each": { - "version": "0.3.3", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", "dev": true, "requires": { - "is-callable": "^1.1.3" + "is-callable": "^1.2.7" } }, "foreground-child": { @@ -27306,6 +27401,12 @@ "define-properties": "^1.1.3" } }, + "is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "dev": true + }, "is-network-error": { "version": "1.1.0", "dev": true @@ -27446,10 +27547,12 @@ "dev": true }, "is-weakref": { - "version": "1.1.0", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", "dev": true, "requires": { - "call-bound": "^1.0.2" + "call-bound": "^1.0.3" } }, "is-weakset": { @@ -28694,7 +28797,9 @@ "version": "4.1.1" }, "object-inspect": { - "version": "1.13.3", + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", "dev": true }, "object-is": { @@ -29698,12 +29803,16 @@ } }, "regexp.prototype.flags": { - "version": "1.5.3", + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", "dev": true, "requires": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", "set-function-name": "^2.0.2" } }, @@ -30517,6 +30626,16 @@ "integrity": "sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==", "dev": true }, + "stop-iteration-iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", + "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", + "dev": true, + "requires": { + "es-errors": "^1.3.0", + "internal-slot": "^1.1.0" + } + }, "stream-browserify": { "version": "3.0.0", "dev": true, @@ -32079,13 +32198,16 @@ } }, "which-typed-array": { - "version": "1.1.18", + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", + "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", "dev": true, "requires": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "for-each": "^0.3.3", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-tostringtag": "^1.0.2" } diff --git a/package.json b/package.json index d3e01649..dd5843ca 100644 --- a/package.json +++ b/package.json @@ -62,7 +62,7 @@ "css-loader": "7.1.2", "eslint": "8.57.1", "eslint-plugin-disable-autofix": "5.0.1", - "eslint-plugin-import": "2.31.0", + "eslint-plugin-import": "2.32.0", "eslint-plugin-jest-dom": "5.5.0", "eslint-plugin-jsx-a11y": "6.10.2", "eslint-plugin-playwright": "2.2.0", From 74817d87de5387906a2e77abadb4477b26b1d607 Mon Sep 17 00:00:00 2001 From: regexowl Date: Thu, 10 Jul 2025 08:54:52 +0200 Subject: [PATCH 155/331] devDeps: Bump msw from 2.10.2 to 2.10.3 This bumps msw from 2.10.2 to 2.10.3 --- package-lock.json | 14 +++++++------- package.json | 2 +- src/mockServiceWorker.js | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/package-lock.json b/package-lock.json index aebefe20..a6683a5e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -79,7 +79,7 @@ "madge": "8.0.0", "mini-css-extract-plugin": "2.9.2", "moment": "2.30.1", - "msw": "2.10.2", + "msw": "2.10.3", "npm-run-all": "4.1.5", "path-browserify": "1.0.1", "postcss-scss": "4.0.9", @@ -13602,9 +13602,9 @@ "license": "MIT" }, "node_modules/msw": { - "version": "2.10.2", - "resolved": "https://registry.npmjs.org/msw/-/msw-2.10.2.tgz", - "integrity": "sha512-RCKM6IZseZQCWcSWlutdf590M8nVfRHG1ImwzOtwz8IYxgT4zhUO0rfTcTvDGiaFE0Rhcc+h43lcF3Jc9gFtwQ==", + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/msw/-/msw-2.10.3.tgz", + "integrity": "sha512-rpqW4wIqISJlgDfu3tiqzuWC/d6jofSuMUsBu1rwepzSwX21aQoagsd+fjahJ8sewa6FwlYhu4no+jfGVQm2IA==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -28395,9 +28395,9 @@ "version": "2.1.3" }, "msw": { - "version": "2.10.2", - "resolved": "https://registry.npmjs.org/msw/-/msw-2.10.2.tgz", - "integrity": "sha512-RCKM6IZseZQCWcSWlutdf590M8nVfRHG1ImwzOtwz8IYxgT4zhUO0rfTcTvDGiaFE0Rhcc+h43lcF3Jc9gFtwQ==", + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/msw/-/msw-2.10.3.tgz", + "integrity": "sha512-rpqW4wIqISJlgDfu3tiqzuWC/d6jofSuMUsBu1rwepzSwX21aQoagsd+fjahJ8sewa6FwlYhu4no+jfGVQm2IA==", "dev": true, "requires": { "@bundled-es-modules/cookie": "^2.0.1", diff --git a/package.json b/package.json index dd5843ca..8f5d37f0 100644 --- a/package.json +++ b/package.json @@ -77,7 +77,7 @@ "madge": "8.0.0", "mini-css-extract-plugin": "2.9.2", "moment": "2.30.1", - "msw": "2.10.2", + "msw": "2.10.3", "npm-run-all": "4.1.5", "path-browserify": "1.0.1", "postcss-scss": "4.0.9", diff --git a/src/mockServiceWorker.js b/src/mockServiceWorker.js index de7bc0f2..0bf12188 100644 --- a/src/mockServiceWorker.js +++ b/src/mockServiceWorker.js @@ -7,7 +7,7 @@ * - Please do NOT modify this file. */ -const PACKAGE_VERSION = '2.10.2' +const PACKAGE_VERSION = '2.10.3' const INTEGRITY_CHECKSUM = 'f5825c521429caf22a4dd13b66e243af' const IS_MOCKED_RESPONSE = Symbol('isMockedResponse') const activeClientIds = new Set() From c17b54c68c7aa734152a292d5901d98842b5de26 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 11 Jul 2025 04:57:24 +0000 Subject: [PATCH 156/331] build(deps-dev): bump @currents/playwright from 1.14.1 to 1.15.1 Bumps [@currents/playwright](https://github.com/currents-dev/currents-playwright-changelog) from 1.14.1 to 1.15.1. - [Changelog](https://github.com/currents-dev/currents-playwright-changelog/blob/main/CHANGELOG.md) - [Commits](https://github.com/currents-dev/currents-playwright-changelog/commits) --- updated-dependencies: - dependency-name: "@currents/playwright" dependency-version: 1.15.1 dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package-lock.json | 46 +++++++++++++++++++++++----------------------- package.json | 2 +- 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/package-lock.json b/package-lock.json index a6683a5e..c04558d8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -36,7 +36,7 @@ "@babel/preset-env": "7.28.0", "@babel/preset-react": "7.27.1", "@babel/preset-typescript": "7.27.1", - "@currents/playwright": "1.14.1", + "@currents/playwright": "1.15.1", "@patternfly/react-icons": "6.1.0", "@playwright/test": "1.51.1", "@redhat-cloud-services/eslint-config-redhat-cloud-services": "2.0.12", @@ -2335,9 +2335,9 @@ } }, "node_modules/@currents/playwright": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@currents/playwright/-/playwright-1.14.1.tgz", - "integrity": "sha512-ScnvvJ/Juku8j4QTvwzflaPTXxooYHI+hDIVvySUxjQJMLv/Y2ZUXJoQEoWpDWYuRXXVf58TADI1W3etNkux+A==", + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/@currents/playwright/-/playwright-1.15.1.tgz", + "integrity": "sha512-8U99mfjZVRvSlmfKlxAbHTiwzq0C6huaU+Zo2GClkgE4Cot/T9KR05F6il+cLg1FRNv5I9QiZIvvfuHGzyIbGg==", "dev": true, "license": "MIT", "dependencies": { @@ -2345,7 +2345,7 @@ "@commander-js/extra-typings": "^12.1.0", "@currents/commit-info": "1.0.1-beta.0", "async-retry": "^1.3.3", - "axios": "^1.9.0", + "axios": "^1.10.0", "axios-retry": "^4.5.0", "c12": "^1.11.2", "chalk": "^4.1.2", @@ -2375,7 +2375,7 @@ "tmp": "^0.2.3", "tmp-promise": "^3.0.3", "ts-pattern": "^5.7.1", - "ws": "^8.18.2" + "ws": "^8.18.3" }, "bin": { "pwc": "dist/bin/pwc.js", @@ -6926,9 +6926,9 @@ } }, "node_modules/axios": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.9.0.tgz", - "integrity": "sha512-re4CqKTJaURpzbLHtIi6XpDv20/CnpXOtjRY5/CU32L8gU8ek9UIivcfvSWvmKEngmVbrUtPpdDwWDWL7DNHvg==", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.10.0.tgz", + "integrity": "sha512-/1xYAC4MP/HEG+3duIhFr4ZQXR4sQXOIe+o6sdqzeykGLx6Upp/1p8MHqhINOvGeP7xyNHe7tsiJByc4SSVUxw==", "license": "MIT", "dependencies": { "follow-redirects": "^1.15.6", @@ -19786,9 +19786,9 @@ } }, "node_modules/ws": { - "version": "8.18.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.2.tgz", - "integrity": "sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==", + "version": "8.18.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", + "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", "dev": true, "license": "MIT", "engines": { @@ -21310,16 +21310,16 @@ } }, "@currents/playwright": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@currents/playwright/-/playwright-1.14.1.tgz", - "integrity": "sha512-ScnvvJ/Juku8j4QTvwzflaPTXxooYHI+hDIVvySUxjQJMLv/Y2ZUXJoQEoWpDWYuRXXVf58TADI1W3etNkux+A==", + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/@currents/playwright/-/playwright-1.15.1.tgz", + "integrity": "sha512-8U99mfjZVRvSlmfKlxAbHTiwzq0C6huaU+Zo2GClkgE4Cot/T9KR05F6il+cLg1FRNv5I9QiZIvvfuHGzyIbGg==", "dev": true, "requires": { "@babel/code-frame": "^7.27.1", "@commander-js/extra-typings": "^12.1.0", "@currents/commit-info": "1.0.1-beta.0", "async-retry": "^1.3.3", - "axios": "^1.9.0", + "axios": "^1.10.0", "axios-retry": "^4.5.0", "c12": "^1.11.2", "chalk": "^4.1.2", @@ -21349,7 +21349,7 @@ "tmp": "^0.2.3", "tmp-promise": "^3.0.3", "ts-pattern": "^5.7.1", - "ws": "^8.18.2" + "ws": "^8.18.3" }, "dependencies": { "@commander-js/extra-typings": { @@ -24155,9 +24155,9 @@ "dev": true }, "axios": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.9.0.tgz", - "integrity": "sha512-re4CqKTJaURpzbLHtIi6XpDv20/CnpXOtjRY5/CU32L8gU8ek9UIivcfvSWvmKEngmVbrUtPpdDwWDWL7DNHvg==", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.10.0.tgz", + "integrity": "sha512-/1xYAC4MP/HEG+3duIhFr4ZQXR4sQXOIe+o6sdqzeykGLx6Upp/1p8MHqhINOvGeP7xyNHe7tsiJByc4SSVUxw==", "requires": { "follow-redirects": "^1.15.6", "form-data": "^4.0.0", @@ -32259,9 +32259,9 @@ } }, "ws": { - "version": "8.18.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.2.tgz", - "integrity": "sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==", + "version": "8.18.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", + "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", "dev": true, "requires": {} }, diff --git a/package.json b/package.json index 8f5d37f0..92eecd67 100644 --- a/package.json +++ b/package.json @@ -34,7 +34,7 @@ "@babel/preset-env": "7.28.0", "@babel/preset-react": "7.27.1", "@babel/preset-typescript": "7.27.1", - "@currents/playwright": "1.14.1", + "@currents/playwright": "1.15.1", "@patternfly/react-icons": "6.1.0", "@playwright/test": "1.51.1", "@redhat-cloud-services/eslint-config-redhat-cloud-services": "2.0.12", From 3e115228e49cfc6691e0acc4cb74d2a76a7ea20b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 11 Jul 2025 04:57:08 +0000 Subject: [PATCH 157/331] build(deps-dev): bump @redhat-cloud-services/tsc-transform-imports Bumps @redhat-cloud-services/tsc-transform-imports from 1.0.24 to 1.0.25. --- updated-dependencies: - dependency-name: "@redhat-cloud-services/tsc-transform-imports" dependency-version: 1.0.25 dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index c04558d8..f10d595a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -41,7 +41,7 @@ "@playwright/test": "1.51.1", "@redhat-cloud-services/eslint-config-redhat-cloud-services": "2.0.12", "@redhat-cloud-services/frontend-components-config": "6.3.8", - "@redhat-cloud-services/tsc-transform-imports": "1.0.24", + "@redhat-cloud-services/tsc-transform-imports": "1.0.25", "@rtk-query/codegen-openapi": "2.0.0", "@testing-library/dom": "10.4.0", "@testing-library/jest-dom": "6.6.3", @@ -4106,9 +4106,9 @@ } }, "node_modules/@redhat-cloud-services/tsc-transform-imports": { - "version": "1.0.24", - "resolved": "https://registry.npmjs.org/@redhat-cloud-services/tsc-transform-imports/-/tsc-transform-imports-1.0.24.tgz", - "integrity": "sha512-N0WkqPbFDgaEBPTeU4tYCTn8xSqccB788mSBh1sEBXJTo4I3IvswXiwrFxe0ZXBUkSrWyvDNVOe5FiZN0r47Gw==", + "version": "1.0.25", + "resolved": "https://registry.npmjs.org/@redhat-cloud-services/tsc-transform-imports/-/tsc-transform-imports-1.0.25.tgz", + "integrity": "sha512-J2O7+k/UeWU4h117WLKvJtmnY9TZnWbS+TdwhwRqfXzFU+BTA3/qEkFO9Xp3HELOIiCIVVHbM8vilxMqIUo1Mw==", "dev": true, "dependencies": { "glob": "10.3.3" @@ -22347,9 +22347,9 @@ } }, "@redhat-cloud-services/tsc-transform-imports": { - "version": "1.0.24", - "resolved": "https://registry.npmjs.org/@redhat-cloud-services/tsc-transform-imports/-/tsc-transform-imports-1.0.24.tgz", - "integrity": "sha512-N0WkqPbFDgaEBPTeU4tYCTn8xSqccB788mSBh1sEBXJTo4I3IvswXiwrFxe0ZXBUkSrWyvDNVOe5FiZN0r47Gw==", + "version": "1.0.25", + "resolved": "https://registry.npmjs.org/@redhat-cloud-services/tsc-transform-imports/-/tsc-transform-imports-1.0.25.tgz", + "integrity": "sha512-J2O7+k/UeWU4h117WLKvJtmnY9TZnWbS+TdwhwRqfXzFU+BTA3/qEkFO9Xp3HELOIiCIVVHbM8vilxMqIUo1Mw==", "dev": true, "requires": { "glob": "10.3.3" diff --git a/package.json b/package.json index 92eecd67..1625e24a 100644 --- a/package.json +++ b/package.json @@ -39,7 +39,7 @@ "@playwright/test": "1.51.1", "@redhat-cloud-services/eslint-config-redhat-cloud-services": "2.0.12", "@redhat-cloud-services/frontend-components-config": "6.3.8", - "@redhat-cloud-services/tsc-transform-imports": "1.0.24", + "@redhat-cloud-services/tsc-transform-imports": "1.0.25", "@rtk-query/codegen-openapi": "2.0.0", "@testing-library/dom": "10.4.0", "@testing-library/jest-dom": "6.6.3", From 6beae64f60a36a5c5dc38b8799d82d5376469202 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 11 Jul 2025 04:56:52 +0000 Subject: [PATCH 158/331] build(deps-dev): bump eslint-plugin-testing-library from 7.5.3 to 7.5.4 Bumps [eslint-plugin-testing-library](https://github.com/testing-library/eslint-plugin-testing-library) from 7.5.3 to 7.5.4. - [Release notes](https://github.com/testing-library/eslint-plugin-testing-library/releases) - [Changelog](https://github.com/testing-library/eslint-plugin-testing-library/blob/main/.releaserc.json) - [Commits](https://github.com/testing-library/eslint-plugin-testing-library/compare/v7.5.3...v7.5.4) --- updated-dependencies: - dependency-name: eslint-plugin-testing-library dependency-version: 7.5.4 dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index f10d595a..6f9327f9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -71,7 +71,7 @@ "eslint-plugin-react": "7.37.5", "eslint-plugin-react-hooks": "5.2.0", "eslint-plugin-react-redux": "4.2.2", - "eslint-plugin-testing-library": "7.5.3", + "eslint-plugin-testing-library": "7.5.4", "git-revision-webpack-plugin": "5.0.0", "history": "5.3.0", "identity-obj-proxy": "3.0.0", @@ -9767,9 +9767,9 @@ } }, "node_modules/eslint-plugin-testing-library": { - "version": "7.5.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-7.5.3.tgz", - "integrity": "sha512-sZk5hIrx0p1ehvdS2qHefKwXHiEysiQN+FMGCzES6xRNUgwI3q4KdWMeAwpPDP9u0RDkNzJpebRUnNch1sJh+A==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-7.5.4.tgz", + "integrity": "sha512-WDID5wR2MDK6u4QvmAZOjBzaMq7MvEQTpeRAyWuI2kmpBnIKS00/EklRv/5096W5AnpF9XrXPY6PtRPflbvrBw==", "dev": true, "license": "MIT", "dependencies": { @@ -26029,9 +26029,9 @@ "dev": true }, "eslint-plugin-testing-library": { - "version": "7.5.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-7.5.3.tgz", - "integrity": "sha512-sZk5hIrx0p1ehvdS2qHefKwXHiEysiQN+FMGCzES6xRNUgwI3q4KdWMeAwpPDP9u0RDkNzJpebRUnNch1sJh+A==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-7.5.4.tgz", + "integrity": "sha512-WDID5wR2MDK6u4QvmAZOjBzaMq7MvEQTpeRAyWuI2kmpBnIKS00/EklRv/5096W5AnpF9XrXPY6PtRPflbvrBw==", "dev": true, "requires": { "@typescript-eslint/scope-manager": "^8.15.0", diff --git a/package.json b/package.json index 1625e24a..f5add506 100644 --- a/package.json +++ b/package.json @@ -69,7 +69,7 @@ "eslint-plugin-react": "7.37.5", "eslint-plugin-react-hooks": "5.2.0", "eslint-plugin-react-redux": "4.2.2", - "eslint-plugin-testing-library": "7.5.3", + "eslint-plugin-testing-library": "7.5.4", "git-revision-webpack-plugin": "5.0.0", "history": "5.3.0", "identity-obj-proxy": "3.0.0", From a2da15b9d2bf18941fe4917d06cdee99fead60c4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 11 Jul 2025 04:56:42 +0000 Subject: [PATCH 159/331] build(deps-dev): bump @types/node from 24.0.12 to 24.0.13 Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 24.0.12 to 24.0.13. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node) --- updated-dependencies: - dependency-name: "@types/node" dependency-version: 24.0.13 dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6f9327f9..54ab9963 100644 --- a/package-lock.json +++ b/package-lock.json @@ -47,7 +47,7 @@ "@testing-library/jest-dom": "6.6.3", "@testing-library/react": "16.3.0", "@testing-library/user-event": "14.6.1", - "@types/node": "24.0.12", + "@types/node": "24.0.13", "@types/react": "18.3.12", "@types/react-dom": "18.3.1", "@types/react-redux": "7.1.34", @@ -5458,9 +5458,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "24.0.12", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.0.12.tgz", - "integrity": "sha512-LtOrbvDf5ndC9Xi+4QZjVL0woFymF/xSTKZKPgrrl7H7XoeDvnD+E2IclKVDyaK9UM756W/3BXqSU+JEHopA9g==", + "version": "24.0.13", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.0.13.tgz", + "integrity": "sha512-Qm9OYVOFHFYg3wJoTSrz80hoec5Lia/dPp84do3X7dZvLikQvM1YpmvTBEdIr/e+U8HTkFjLHLnl78K/qjf+jQ==", "license": "MIT", "dependencies": { "undici-types": "~7.8.0" @@ -23163,9 +23163,9 @@ "dev": true }, "@types/node": { - "version": "24.0.12", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.0.12.tgz", - "integrity": "sha512-LtOrbvDf5ndC9Xi+4QZjVL0woFymF/xSTKZKPgrrl7H7XoeDvnD+E2IclKVDyaK9UM756W/3BXqSU+JEHopA9g==", + "version": "24.0.13", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.0.13.tgz", + "integrity": "sha512-Qm9OYVOFHFYg3wJoTSrz80hoec5Lia/dPp84do3X7dZvLikQvM1YpmvTBEdIr/e+U8HTkFjLHLnl78K/qjf+jQ==", "requires": { "undici-types": "~7.8.0" } diff --git a/package.json b/package.json index f5add506..436b5a39 100644 --- a/package.json +++ b/package.json @@ -45,7 +45,7 @@ "@testing-library/jest-dom": "6.6.3", "@testing-library/react": "16.3.0", "@testing-library/user-event": "14.6.1", - "@types/node": "24.0.12", + "@types/node": "24.0.13", "@types/react": "18.3.12", "@types/react-dom": "18.3.1", "@types/react-redux": "7.1.34", From d0aa6d733e39768507644131ec78e9ea1a686ce1 Mon Sep 17 00:00:00 2001 From: "red-hat-konflux[bot]" <126015336+red-hat-konflux[bot]@users.noreply.github.com> Date: Sat, 12 Jul 2025 07:03:47 +0000 Subject: [PATCH 160/331] chore(deps): update konflux references Signed-off-by: red-hat-konflux <126015336+red-hat-konflux[bot]@users.noreply.github.com> --- .tekton/image-builder-frontend-pull-request.yaml | 10 ++++++---- .tekton/image-builder-frontend-push.yaml | 10 ++++++---- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/.tekton/image-builder-frontend-pull-request.yaml b/.tekton/image-builder-frontend-pull-request.yaml index 35617ab7..bd441d80 100644 --- a/.tekton/image-builder-frontend-pull-request.yaml +++ b/.tekton/image-builder-frontend-pull-request.yaml @@ -194,7 +194,7 @@ spec: - name: name value: prefetch-dependencies - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-prefetch-dependencies:0.2@sha256:90f9ba94939895e1ecaa1a3ac861366303425375ae47a92d0cc1dc61a86df4ab + value: quay.io/konflux-ci/tekton-catalog/task-prefetch-dependencies:0.2@sha256:afaf24519f78c76bd6e3c00c24ecb8918a623210fb7c6ee9aaf5fbaeba1f6c7b - name: kind value: task resolver: bundles @@ -282,7 +282,9 @@ spec: - name: build-source-image params: - name: BINARY_IMAGE - value: $(params.output-image) + value: $(tasks.build-image-index.results.IMAGE_URL) + - name: BINARY_IMAGE_DIGEST + value: $(tasks.build-image-index.results.IMAGE_DIGEST) runAfter: - build-image-index taskRef: @@ -290,7 +292,7 @@ spec: - name: name value: source-build - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-source-build:0.2@sha256:ab7298db687b1bdaa8f3fb4f24ee6c48e100283d0584eddac12ad4353b8a4e97 + value: quay.io/konflux-ci/tekton-catalog/task-source-build:0.3@sha256:1fdda7563f21340d6243c8738934a58adffd8253706b423d1c4ec5e26ba5fae0 - name: kind value: task resolver: bundles @@ -411,7 +413,7 @@ spec: - name: name value: ecosystem-cert-preflight-checks - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-ecosystem-cert-preflight-checks:0.2@sha256:b550ff4f0b634512ce5200074be7afd7a5a6c05b783620c626e2a3035cd56448 + value: quay.io/konflux-ci/tekton-catalog/task-ecosystem-cert-preflight-checks:0.2@sha256:abbe195626eec925288df6425679559025d1be4af5ae70ca6dbbcb49ad3bf08b - name: kind value: task resolver: bundles diff --git a/.tekton/image-builder-frontend-push.yaml b/.tekton/image-builder-frontend-push.yaml index a5f9aa89..5ee40988 100644 --- a/.tekton/image-builder-frontend-push.yaml +++ b/.tekton/image-builder-frontend-push.yaml @@ -191,7 +191,7 @@ spec: - name: name value: prefetch-dependencies - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-prefetch-dependencies:0.2@sha256:90f9ba94939895e1ecaa1a3ac861366303425375ae47a92d0cc1dc61a86df4ab + value: quay.io/konflux-ci/tekton-catalog/task-prefetch-dependencies:0.2@sha256:afaf24519f78c76bd6e3c00c24ecb8918a623210fb7c6ee9aaf5fbaeba1f6c7b - name: kind value: task resolver: bundles @@ -279,7 +279,9 @@ spec: - name: build-source-image params: - name: BINARY_IMAGE - value: $(params.output-image) + value: $(tasks.build-image-index.results.IMAGE_URL) + - name: BINARY_IMAGE_DIGEST + value: $(tasks.build-image-index.results.IMAGE_DIGEST) runAfter: - build-image-index taskRef: @@ -287,7 +289,7 @@ spec: - name: name value: source-build - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-source-build:0.2@sha256:ab7298db687b1bdaa8f3fb4f24ee6c48e100283d0584eddac12ad4353b8a4e97 + value: quay.io/konflux-ci/tekton-catalog/task-source-build:0.3@sha256:1fdda7563f21340d6243c8738934a58adffd8253706b423d1c4ec5e26ba5fae0 - name: kind value: task resolver: bundles @@ -408,7 +410,7 @@ spec: - name: name value: ecosystem-cert-preflight-checks - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-ecosystem-cert-preflight-checks:0.2@sha256:b550ff4f0b634512ce5200074be7afd7a5a6c05b783620c626e2a3035cd56448 + value: quay.io/konflux-ci/tekton-catalog/task-ecosystem-cert-preflight-checks:0.2@sha256:abbe195626eec925288df6425679559025d1be4af5ae70ca6dbbcb49ad3bf08b - name: kind value: task resolver: bundles From 10a67ca6e38e12433b34dbb5ccd7fdd44060f273 Mon Sep 17 00:00:00 2001 From: regexowl Date: Mon, 14 Jul 2025 10:45:58 +0200 Subject: [PATCH 161/331] README: Re-structure, add info for external developers This re-organizes the structure of the README so the parts are better grouped by topic. Information for external developers was also added (VPN required for service development). --- README.md | 128 +++++++++++++++++++++++++++++------------------------- 1 file changed, 68 insertions(+), 60 deletions(-) diff --git a/README.md b/README.md index b0a22d2d..c6595092 100644 --- a/README.md +++ b/README.md @@ -19,16 +19,20 @@ Frontend code for Image Builder. ## Table of Contents 1. [How to build and run image-builder-frontend](#frontend-development) 1. [Frontend Development](#frontend-development) - 1. [API](#api-endpoints) - 2. [Unleash feature flags](#unleash-feature-flags) - 2. [Backend Development](#backend-development) -2. [File structure](#file-structure) -3. [Style Guidelines](#style-guidelines) -4. [Test Guidelines](#test-guidelines) -5. [Running hosted service Playwright tests](#running-hosted-service-playwright-tests) + 2. [Image builder as Cockpit plugin](#image-builder-as-cockpit-plugin) + 3. [Backend Development](#backend-development) +2. [API](#api-endpoints) +3. [Unleash feature flags](#unleash-feature-flags) +4. [File structure](#file-structure) +5. [Style Guidelines](#style-guidelines) +6. [Test Guidelines](#test-guidelines) +7. [Running hosted service Playwright tests](#running-hosted-service-playwright-tests) ## How to build and run image-builder-frontend +> [!IMPORTANT] +> Running image-builder-frontend against [console.redhat.com](https://console.redhat.com/) requires connection to the Red Hat VPN, which is only available to Red Hat employees. External contributors can locally run [image builder as Cockpit plugin](#image-builder-as-cockpit-plugin). + ### Frontend Development To develop the frontend you can use a proxy to run image-builder-frontend locally @@ -98,7 +102,58 @@ The UI should be running on https://prod.foo.redhat.com:1337/beta/insights/image-builder/landing. Note that this requires you to have access to either production or stage (plus VPN and proxy config) of insights. -#### API endpoints +### Image builder as Cockpit plugin + +> [!NOTE] +> Issues marked with [cockpit-image-builder](https://github.com/osbuild/image-builder-frontend/issues?q=is%3Aissue%20state%3Aopen%20label%3Acockpit-image-builder) label are reproducible in image builder plugin and can be worked on by external contributors without connection to the Red Hat VPN. + +#### Cockpit setup +To install and setup Cockpit follow guide at: https://cockpit-project.org/running.html + +#### On-premises image builder installation and configuration +To install and configure `osbuild-composer` on your local machine follow our documentation: https://osbuild.org/docs/on-premises/installation/ + +#### Scripts for local development of image builder plugin + +The following scripts are used to build the frontend with Webpack and install it into the Cockpit directories. These scripts streamline the development process by automating build and installation steps. + +Runs Webpack with the specified configuration (cockpit/webpack.config.ts) to build the frontend assets. +Use this command whenever you need to compile the latest changes in your frontend code. + +Creates the necessary directory in the user's local Cockpit share (~/.local/share/cockpit/). +Creates a symbolic link (image-builder-frontend) pointing to the built frontend assets (cockpit/public). +Use this command after building the frontend to install it locally for development purposes. +The symbolic link allows Cockpit to serve the frontend assets from your local development environment, +making it easier to test changes in real-time without deploying to a remote server. + +```bash +make cockpit/build +``` + +```bash +make cockpit/devel-install +``` + +To uninstall and remove the symbolic link, run the following command: + +```bash +make cockpit/devel-uninstall +``` + +For convenience, you can run the following to combine all three steps: + + +```bash +make cockpit/devel +``` + +### Backend Development + +To develop both the frontend and the backend you can again use the proxy to run both the +frontend and backend locally against the chrome at cloud.redhat.com. For instructions +see the [osbuild-getting-started project](https://github.com/osbuild/osbuild-getting-started). + +## API endpoints API slice definitions are programmatically generated using the [@rtk-query/codegen-openapi](https://redux-toolkit.js.org/rtk-query/usage/code-generation) package. @@ -107,7 +162,7 @@ corresponding configuration files are stored in `/api/config`. Each endpoint has a corresponding empty API slice and generated API slice which are stored in `/src/store`. -##### Add a new API +### Add a new API schema For a hypothetical API called foobar @@ -173,12 +228,12 @@ npm run api And voilà! -##### Add a new endpoint +### Add a new endpoint To add a new endpoint, simply update the `api/config/foobar.ts` file with new endpoints in the `filterEndpoints` table. -#### Unleash feature flags +## Unleash feature flags Your user needs to have the corresponding rights, do the same as this MR in internal gitlab https://gitlab.cee.redhat.com/service/app-interface/-/merge_requests/79225 @@ -194,7 +249,7 @@ existing flags: https://github.com/RedHatInsights/image-builder-frontend/blob/c84b493eba82ce83a7844943943d91112ffe8322/src/Components/ImagesTable/ImageLink.js#L99 -##### Mocking flags for tests +### Mocking flags for tests Flags can be mocked for the unit tests to access some feature. Checkout: https://github.com/osbuild/image-builder-frontend/blob/9a464e416bc3769cfc8e23b62f1dd410eb0e0455/src/test/Components/CreateImageWizard/CreateImageWizard.test.tsx#L49 @@ -204,60 +259,13 @@ base, then it's good practice to test the two of them. If not, only test what's actually owned by the frontend project. -##### Cleaning the flags +### Cleaning the flags Unleash toggles are expected to live for a limited amount of time, documentation specify 40 days for a release, we should keep that in mind for each toggle we're planning on using. -### Backend Development - -To develop both the frontend and the backend you can again use the proxy to run both the -frontend and backend locally against the chrome at cloud.redhat.com. For instructions -see the [osbuild-getting-started project](https://github.com/osbuild/osbuild-getting-started). - ## File Structure - -### OnPremise Development - Cockpit Build and Install - -## Overview - -The following scripts are used to build the frontend with Webpack and install it into the Cockpit directories. These scripts streamline the development process by automating build and installation steps. - -### Scripts - -#### 1. Build the Cockpit Frontend - -Runs Webpack with the specified configuration (cockpit/webpack.config.ts) to build the frontend assets. -Use this command whenever you need to compile the latest changes in your frontend code. - -Creates the necessary directory in the user's local Cockpit share (~/.local/share/cockpit/). -Creates a symbolic link (image-builder-frontend) pointing to the built frontend assets (cockpit/public). -Use this command after building the frontend to install it locally for development purposes. -The symbolic link allows Cockpit to serve the frontend assets from your local development environment, -making it easier to test changes in real-time without deploying to a remote server. - -```bash -make cockpit/devel-install -``` - -```bash -make cockpit/build -``` - -To uninstall and remove the symbolic link, run the following command: - -```bash -make cockpit/devel-uninstall -``` - -For convenience, you can run the following to combine all three steps: - - -```bash -make cockpit/devel -``` - ### Quick Reference | Directory | Description | | --------- | ----------- | From b6e9fef70b04887b4b4d2071b93f3d8ecee37c3f Mon Sep 17 00:00:00 2001 From: regexowl Date: Mon, 14 Jul 2025 14:42:49 +0200 Subject: [PATCH 162/331] Wizard: Change WSL file extension This updates WSL file extension from `.tar.gz` to `.wsl` --- .../ImageOutput/components/TargetEnvironment.tsx | 2 +- .../CreateImageWizard/steps/Review/ReviewStep.tsx | 2 +- src/Components/ImagesTable/Instance.tsx | 2 +- .../steps/ImageOutput/ImageOutput.test.tsx | 12 ++++++------ 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/Components/CreateImageWizard/steps/ImageOutput/components/TargetEnvironment.tsx b/src/Components/CreateImageWizard/steps/ImageOutput/components/TargetEnvironment.tsx index 2e53b517..35f4473e 100644 --- a/src/Components/CreateImageWizard/steps/ImageOutput/components/TargetEnvironment.tsx +++ b/src/Components/CreateImageWizard/steps/ImageOutput/components/TargetEnvironment.tsx @@ -316,7 +316,7 @@ const TargetEnvironment = () => { - WSL - Windows Subsystem for Linux (.tar.gz) + WSL - Windows Subsystem for Linux (.wsl) { - WSL - {targetOptions.wsl} (.tar.gz) + WSL - {targetOptions.wsl} (.wsl) diff --git a/src/Components/ImagesTable/Instance.tsx b/src/Components/ImagesTable/Instance.tsx index 09a33a96..eadcbed6 100644 --- a/src/Components/ImagesTable/Instance.tsx +++ b/src/Components/ImagesTable/Instance.tsx @@ -384,7 +384,7 @@ export const AwsS3Instance = ({ 'image-installer': '.iso', vsphere: '.vmdk', 'vsphere-ova': '.ova', - wsl: '.tar.gz', + wsl: '.wsl', ami: '', 'rhel-edge-commit': '', 'rhel-edge-installer': '', diff --git a/src/test/Components/CreateImageWizard/steps/ImageOutput/ImageOutput.test.tsx b/src/test/Components/CreateImageWizard/steps/ImageOutput/ImageOutput.test.tsx index a1a71355..e466a096 100644 --- a/src/test/Components/CreateImageWizard/steps/ImageOutput/ImageOutput.test.tsx +++ b/src/test/Components/CreateImageWizard/steps/ImageOutput/ImageOutput.test.tsx @@ -334,7 +334,7 @@ describe('Check that the target filtering is in accordance to mock content', () await screen.findByTestId('upload-oci'); await screen.findByTestId('checkbox-guest-image'); await screen.findByTestId('checkbox-image-installer'); - await screen.findByText(/wsl - windows subsystem for linux \(\.tar\.gz\)/i); + await screen.findByText(/wsl - windows subsystem for linux \(\.wsl\)/i); }); test('rhel9 x86_64', async () => { @@ -372,7 +372,7 @@ describe('Check that the target filtering is in accordance to mock content', () ); await screen.findByText(/VMware vSphere - Virtual disk \(\.vmdk\)/); expect( - screen.queryByText(/wsl - windows subsystem for linux \(\.tar\.gz\)/i) + screen.queryByText(/wsl - windows subsystem for linux \(\.wsl\)/i) ).not.toBeInTheDocument(); }); @@ -410,7 +410,7 @@ describe('Check that the target filtering is in accordance to mock content', () /VMware vSphere - Open virtualization format \(\.ova\)/ ); await screen.findByText(/VMware vSphere - Virtual disk \(\.vmdk\)/); - await screen.findByText(/wsl - windows subsystem for linux \(\.tar\.gz\)/i); + await screen.findByText(/wsl - windows subsystem for linux \(\.wsl\)/i); }); test('rhel10 aarch64', async () => { @@ -453,7 +453,7 @@ describe('Check that the target filtering is in accordance to mock content', () screen.queryByText(/VMware vSphere - Virtual disk \(\.vmdk\)/) ).not.toBeInTheDocument(); expect( - screen.queryByText(/wsl - windows subsystem for linux \(\.tar\.gz\)/i) + screen.queryByText(/wsl - windows subsystem for linux \(\.wsl\)/i) ).not.toBeInTheDocument(); }); @@ -498,7 +498,7 @@ describe('Check that the target filtering is in accordance to mock content', () screen.queryByText(/VMware vSphere - Virtual disk \(\.vmdk\)/) ).not.toBeInTheDocument(); expect( - screen.queryByText(/wsl - windows subsystem for linux \(\.tar\.gz\)/i) + screen.queryByText(/wsl - windows subsystem for linux \(\.wsl\)/i) ).not.toBeInTheDocument(); }); @@ -541,7 +541,7 @@ describe('Check that the target filtering is in accordance to mock content', () screen.queryByText(/VMware vSphere - Virtual disk \(\.vmdk\)/) ).not.toBeInTheDocument(); expect( - screen.queryByText(/wsl - windows subsystem for linux \(\.tar\.gz\)/i) + screen.queryByText(/wsl - windows subsystem for linux \(\.wsl\)/i) ).not.toBeInTheDocument(); }); }); From fd474dace00fb638b111ffdf2cc8d3cac96fe007 Mon Sep 17 00:00:00 2001 From: Lucas Garfield Date: Mon, 14 Jul 2025 09:38:02 -0500 Subject: [PATCH 163/331] PackageRecommendations: Add modelVersion to analytics tracking MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Previous commit 852d24e5 added modelVersion to the API response and mentioned adding it to analytics tracking, but only added the distribution field to the analytics events. This commit completes the implementation by adding modelVersion to both package recommendation analytics events: - "Package Recommendations Shown" event now includes modelVersion - "Recommended Package Added" event now includes modelVersion This enables proper tracking of which recommendation models are being used and their effectiveness. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- .../CreateImageWizard/steps/Packages/PackageRecommendations.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Components/CreateImageWizard/steps/Packages/PackageRecommendations.tsx b/src/Components/CreateImageWizard/steps/Packages/PackageRecommendations.tsx index af4835aa..c84b693d 100644 --- a/src/Components/CreateImageWizard/steps/Packages/PackageRecommendations.tsx +++ b/src/Components/CreateImageWizard/steps/Packages/PackageRecommendations.tsx @@ -100,6 +100,7 @@ const PackageRecommendations = () => { shownRecommendations: response.data.packages, selectedPackages: packages.map((pkg) => pkg.name), distribution: distribution.replace('-', ''), + modelVersion: response.data.modelVersion, } ); } @@ -267,6 +268,7 @@ const PackageRecommendations = () => { ), shownRecommendations: data.packages, distribution: distribution.replace('-', ''), + modelVersion: data.modelVersion, } ); addRecommendedPackage(pkg); From 146a9131b4eb85722136a977f2f92d8acc47ec90 Mon Sep 17 00:00:00 2001 From: "red-hat-konflux[bot]" <126015336+red-hat-konflux[bot]@users.noreply.github.com> Date: Tue, 15 Jul 2025 05:55:40 +0000 Subject: [PATCH 164/331] chore(deps): update build-tools digest to 07aeb0d Signed-off-by: red-hat-konflux <126015336+red-hat-konflux[bot]@users.noreply.github.com> --- build-tools | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build-tools b/build-tools index 75adad05..07aeb0dd 160000 --- a/build-tools +++ b/build-tools @@ -1 +1 @@ -Subproject commit 75adad05c9e22ff84c7d3b43564554a26f55a8a9 +Subproject commit 07aeb0dd02b76bd1c9c309b8ec0e96893e0ebe49 From 719ee1a024f3aafc6440be92799a4b5dab48e8cc Mon Sep 17 00:00:00 2001 From: regexowl Date: Mon, 14 Jul 2025 12:05:24 +0200 Subject: [PATCH 165/331] README: Remove information about deprecated insights proxy The insights proxy has been deprecated for a long time. --- README.md | 29 ----------------------------- 1 file changed, 29 deletions(-) diff --git a/README.md b/README.md index c6595092..b70cd7f9 100644 --- a/README.md +++ b/README.md @@ -73,35 +73,6 @@ echo "127.0.0.1 stage.foo.redhat.com" >> /etc/hosts 4. open browser at `https://stage.foo.redhat.com:1337/beta/insights/image-builder` -#### Insights proxy (deprecated) - -1. Clone the insights proxy: https://github.com/RedHatInsights/insights-proxy - -2. Setting up the proxy - - Choose a runner (podman or docker), and point the SPANDX_CONFIG variable to - `profile/local-frontend.js` included in image-builder-frontend. - - ```bash - sudo insights-proxy/scripts/patch-etc-hosts.sh - export RUNNER="podman" - export SPANDX_CONFIG=$PATH_TO/image-builder-frontend/profiles/local-frontend.js - sudo -E insights-proxy/scripts/run.sh - ``` - -3. Starting up image-builder-frontend - - In the image-builder-frontend checkout directory - - ```bash - npm install - npm start - ``` - -The UI should be running on -https://prod.foo.redhat.com:1337/beta/insights/image-builder/landing. -Note that this requires you to have access to either production or stage (plus VPN and proxy config) of insights. - ### Image builder as Cockpit plugin > [!NOTE] From 1e545af0c7515fdddc81c025be50cda994b916ef Mon Sep 17 00:00:00 2001 From: Gianluca Zuccarelli Date: Mon, 14 Apr 2025 16:22:49 +0000 Subject: [PATCH 166/331] cloudConfigSlice: add new slice --- .../CreateImageWizard/CreateImageWizard.tsx | 2 +- src/store/cloudProviderConfigSlice.ts | 38 +++++++++++++++++++ src/store/index.ts | 5 ++- 3 files changed, 43 insertions(+), 2 deletions(-) create mode 100644 src/store/cloudProviderConfigSlice.ts diff --git a/src/Components/CreateImageWizard/CreateImageWizard.tsx b/src/Components/CreateImageWizard/CreateImageWizard.tsx index bea494ff..c582e4d0 100644 --- a/src/Components/CreateImageWizard/CreateImageWizard.tsx +++ b/src/Components/CreateImageWizard/CreateImageWizard.tsx @@ -387,7 +387,7 @@ const CreateImageWizard = ({ isEdit }: CreateImageWizardProps) => { id="step-target-environment" isHidden={ !targetEnvironments.find( - (target) => + (target: string) => target === 'aws' || target === 'gcp' || target === 'azure' ) } diff --git a/src/store/cloudProviderConfigSlice.ts b/src/store/cloudProviderConfigSlice.ts new file mode 100644 index 00000000..056b52b2 --- /dev/null +++ b/src/store/cloudProviderConfigSlice.ts @@ -0,0 +1,38 @@ +import { PayloadAction, createSlice } from '@reduxjs/toolkit'; + +import type { RootState } from '.'; + +export type cloudProviderConfigState = { + aws: { + bucket?: string; + credentials?: string; + }; +}; + +export const initialState: cloudProviderConfigState = { + aws: {}, +}; + +export const selectAWSBucketName = (state: RootState) => { + return state.cloudConfig.aws.bucket; +}; + +export const selectAWSCredsPath = (state: RootState) => { + return state.cloudConfig.aws.credentials; +}; + +export const cloudProviderConfigSlice = createSlice({ + name: 'cloudConfig', + initialState, + reducers: { + changeAWSBucketName: (state, action: PayloadAction) => { + state.aws.bucket = action.payload; + }, + changeAWSCredsPath: (state, action: PayloadAction) => { + state.aws.credentials = action.payload; + }, + }, +}); + +export const { changeAWSBucketName, changeAWSCredsPath } = + cloudProviderConfigSlice.actions; diff --git a/src/store/index.ts b/src/store/index.ts index 17df1234..8adab09f 100644 --- a/src/store/index.ts +++ b/src/store/index.ts @@ -2,6 +2,7 @@ import { combineReducers, configureStore } from '@reduxjs/toolkit'; import promiseMiddleware from 'redux-promise-middleware'; import { blueprintsSlice } from './BlueprintSlice'; +import { cloudProviderConfigSlice } from './cloudProviderConfigSlice'; import { cockpitApi } from './cockpit/cockpitApi'; import { complianceApi } from './complianceApi'; import { contentSourcesApi } from './contentSourcesApi'; @@ -28,6 +29,7 @@ export const serviceReducer = combineReducers({ [complianceApi.reducerPath]: complianceApi.reducer, wizard: wizardSlice, blueprints: blueprintsSlice.reducer, + cloudConfig: cloudProviderConfigSlice.reducer, }); export const onPremReducer = combineReducers({ @@ -41,6 +43,7 @@ export const onPremReducer = combineReducers({ [imageBuilderApi.reducerPath]: imageBuilderApi.reducer, wizard: wizardSlice, blueprints: blueprintsSlice.reducer, + cloudConfig: cloudProviderConfigSlice.reducer, }); startAppListening({ @@ -95,7 +98,7 @@ startAppListening({ (elem) => elem.arch === architecture )?.image_types; - const filteredImageTypes = imageTypes.filter((imageType) => + const filteredImageTypes = imageTypes.filter((imageType: string) => allowedImageTypes?.includes(imageType) ); From 9d2c7983769d564a6ec83537bfe1fffda29b5e4c Mon Sep 17 00:00:00 2001 From: Gianluca Zuccarelli Date: Mon, 14 Apr 2025 10:24:16 +0000 Subject: [PATCH 167/331] cloudConfig: add aws config fields --- .../CloudProviderConfig/AWSConfig.tsx | 70 +++++++++++++++++++ .../CloudProviderConfig.tsx | 28 ++++++++ .../CloudProviderConfig/validators/index.tsx | 11 +++ .../sharedComponents/ImageBuilderHeader.tsx | 12 ++++ src/Router.tsx | 11 +++ 5 files changed, 132 insertions(+) create mode 100644 src/Components/CloudProviderConfig/AWSConfig.tsx create mode 100644 src/Components/CloudProviderConfig/CloudProviderConfig.tsx create mode 100644 src/Components/CloudProviderConfig/validators/index.tsx diff --git a/src/Components/CloudProviderConfig/AWSConfig.tsx b/src/Components/CloudProviderConfig/AWSConfig.tsx new file mode 100644 index 00000000..0d6db377 --- /dev/null +++ b/src/Components/CloudProviderConfig/AWSConfig.tsx @@ -0,0 +1,70 @@ +import React from 'react'; + +import { Form, FormGroup } from '@patternfly/react-core'; + +import { isAwsBucketValid, isAwsCredsPathValid } from './validators'; + +import { + changeAWSBucketName, + changeAWSCredsPath, + selectAWSBucketName, + selectAWSCredsPath, +} from '../../store/cloudProviderConfigSlice'; +import { useAppDispatch, useAppSelector } from '../../store/hooks'; +import { ValidatedInput } from '../CreateImageWizard/ValidatedInput'; + +type FormGroupProps = { + value: string | undefined; + setValue: (value: string) => void; +}; + +const AWSBucket = ({ value, setValue }: FormGroupProps) => { + return ( + + setValue(value)} + helperText="Invalid AWS bucket name" + /> + + ); +}; + +const AWSCredsPath = ({ value, setValue }: FormGroupProps) => { + return ( + + setValue(value)} + helperText="Invalid filepath for AWS credentials" + /> + + ); +}; + +export const AWSConfig = () => { + const dispatch = useAppDispatch(); + const bucket = useAppSelector(selectAWSBucketName); + const credentials = useAppSelector(selectAWSCredsPath); + + // TODO: maybe add a radio button to toggle AWS configuration + // on or off - this might simplify validation & the overall + // experience + + return ( +
+ dispatch(changeAWSBucketName(v))} + /> + dispatch(changeAWSCredsPath(v))} + /> + + ); +}; diff --git a/src/Components/CloudProviderConfig/CloudProviderConfig.tsx b/src/Components/CloudProviderConfig/CloudProviderConfig.tsx new file mode 100644 index 00000000..4e3e28c6 --- /dev/null +++ b/src/Components/CloudProviderConfig/CloudProviderConfig.tsx @@ -0,0 +1,28 @@ +import React from 'react'; + +import { PageSection, Wizard, WizardStep } from '@patternfly/react-core'; +import { useNavigate } from 'react-router-dom'; + +import { AWSConfig } from './AWSConfig'; + +import { resolveRelPath } from '../../Utilities/path'; +import { ImageBuilderHeader } from '../sharedComponents/ImageBuilderHeader'; + +export const CloudProviderConfig = () => { + const navigate = useNavigate(); + const handleClose = () => navigate(resolveRelPath('')); + + // TODO: add custom wizard footer + return ( + <> + + + + + + + + + + ); +}; diff --git a/src/Components/CloudProviderConfig/validators/index.tsx b/src/Components/CloudProviderConfig/validators/index.tsx new file mode 100644 index 00000000..cb5048ea --- /dev/null +++ b/src/Components/CloudProviderConfig/validators/index.tsx @@ -0,0 +1,11 @@ +import path from 'path'; + +export const isAwsBucketValid = (bucket: string): boolean => { + const regex = /^[a-z0-9](?:[a-z0-9]|[-.](?=[a-z0-9])){1,61}[a-z0-9]$/; + return regex.test(bucket); +}; + +export const isAwsCredsPathValid = (credsPath: string): boolean => { + const validPathPattern = /^(\/[^/\0]*)+\/?$/; + return path.isAbsolute(credsPath) && validPathPattern.test(credsPath); +}; diff --git a/src/Components/sharedComponents/ImageBuilderHeader.tsx b/src/Components/sharedComponents/ImageBuilderHeader.tsx index d3158ba5..96dcdf3e 100644 --- a/src/Components/sharedComponents/ImageBuilderHeader.tsx +++ b/src/Components/sharedComponents/ImageBuilderHeader.tsx @@ -123,6 +123,18 @@ export const ImageBuilderHeader = ({ Import )} + {process.env.IS_ON_PREMISE && ( + + )} )} diff --git a/src/Router.tsx b/src/Router.tsx index 0963f7ca..a9427074 100644 --- a/src/Router.tsx +++ b/src/Router.tsx @@ -2,6 +2,7 @@ import React, { lazy, Suspense } from 'react'; import { Route, Routes } from 'react-router-dom'; +import { CloudProviderConfig } from './Components/CloudProviderConfig/CloudProviderConfig'; import ShareImageModal from './Components/ShareImageModal/ShareImageModal'; import { useFlagWithEphemDefault } from './Utilities/useGetEnvironment'; @@ -46,6 +47,16 @@ export const Router = () => { } /> + {process.env.IS_ON_PREMISE && ( + + + + } + /> + )} ); }; From 87647f88545321be1fe8fb25358840c34ce5fd89 Mon Sep 17 00:00:00 2001 From: Gianluca Zuccarelli Date: Wed, 16 Apr 2025 09:15:33 +0000 Subject: [PATCH 168/331] cloudConfig: configure the footer Setup the footer for the AWS config step. --- .../CloudProviderConfig/CloudProviderConfig.tsx | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/Components/CloudProviderConfig/CloudProviderConfig.tsx b/src/Components/CloudProviderConfig/CloudProviderConfig.tsx index 4e3e28c6..6751f4c8 100644 --- a/src/Components/CloudProviderConfig/CloudProviderConfig.tsx +++ b/src/Components/CloudProviderConfig/CloudProviderConfig.tsx @@ -12,13 +12,19 @@ export const CloudProviderConfig = () => { const navigate = useNavigate(); const handleClose = () => navigate(resolveRelPath('')); - // TODO: add custom wizard footer return ( <> - + From d7945a458a12ed0804596995be45e84baafaedf3 Mon Sep 17 00:00:00 2001 From: Gianluca Zuccarelli Date: Wed, 16 Apr 2025 09:16:52 +0000 Subject: [PATCH 169/331] cockpitApi: add worker config types Create a few types to help stick to conventions and tidy up the code. --- src/store/cloudProviderConfigSlice.ts | 11 +++-------- src/store/cockpit/types.ts | 13 +++++++++++++ 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/src/store/cloudProviderConfigSlice.ts b/src/store/cloudProviderConfigSlice.ts index 056b52b2..55ab5d66 100644 --- a/src/store/cloudProviderConfigSlice.ts +++ b/src/store/cloudProviderConfigSlice.ts @@ -1,15 +1,10 @@ import { PayloadAction, createSlice } from '@reduxjs/toolkit'; +import type { CloudProviderConfigState } from './cockpit/types'; + import type { RootState } from '.'; -export type cloudProviderConfigState = { - aws: { - bucket?: string; - credentials?: string; - }; -}; - -export const initialState: cloudProviderConfigState = { +export const initialState: CloudProviderConfigState = { aws: {}, }; diff --git a/src/store/cockpit/types.ts b/src/store/cockpit/types.ts index cfebeb1b..5d7350fc 100644 --- a/src/store/cockpit/types.ts +++ b/src/store/cockpit/types.ts @@ -18,3 +18,16 @@ export type Package = { version: string; release: string; }; + +export type AWSWorkerConfig = { + bucket?: string | undefined; + credentials?: string | undefined; +}; + +export type WorkerConfigResponse = { + aws?: AWSWorkerConfig; +}; + +export type CloudProviderConfigState = { + aws: AWSWorkerConfig; +}; From ecc1c2c8cdfb35c1aadcb8ef7df12a24877ec990 Mon Sep 17 00:00:00 2001 From: Gianluca Zuccarelli Date: Tue, 15 Apr 2025 16:05:22 +0000 Subject: [PATCH 170/331] cockpitApi: get worker config Add a query to load the `/etc/osbuild-worker/osbuild-worker.toml` config and use this to set the state of the `cloudConfig` store slice. --- .../CloudProviderConfig.tsx | 48 ++++++++++++++++++- .../CloudProviderConfig/validators/index.tsx | 30 +++++++++++- src/store/cloudProviderConfigSlice.ts | 20 +++++++- src/store/cockpit/cockpitApi.ts | 20 ++++++++ 4 files changed, 113 insertions(+), 5 deletions(-) diff --git a/src/Components/CloudProviderConfig/CloudProviderConfig.tsx b/src/Components/CloudProviderConfig/CloudProviderConfig.tsx index 6751f4c8..183685c8 100644 --- a/src/Components/CloudProviderConfig/CloudProviderConfig.tsx +++ b/src/Components/CloudProviderConfig/CloudProviderConfig.tsx @@ -1,17 +1,62 @@ -import React from 'react'; +import React, { useCallback, useEffect } from 'react'; import { PageSection, Wizard, WizardStep } from '@patternfly/react-core'; import { useNavigate } from 'react-router-dom'; import { AWSConfig } from './AWSConfig'; +import { isAwsStepValid } from './validators'; +import { + changeAWSBucketName, + changeAWSCredsPath, + reinitializeAWSConfig, +} from '../../store/cloudProviderConfigSlice'; +import { useGetWorkerConfigQuery } from '../../store/cockpit/cockpitApi'; +import { AWSWorkerConfig } from '../../store/cockpit/types'; +import { useAppDispatch } from '../../store/hooks'; import { resolveRelPath } from '../../Utilities/path'; import { ImageBuilderHeader } from '../sharedComponents/ImageBuilderHeader'; export const CloudProviderConfig = () => { const navigate = useNavigate(); + const dispatch = useAppDispatch(); const handleClose = () => navigate(resolveRelPath('')); + const { data, error } = useGetWorkerConfigQuery({}); + + const initAWSConfig = useCallback( + (config: AWSWorkerConfig | undefined) => { + if (!config) { + dispatch(reinitializeAWSConfig()); + return; + } + + const { bucket, credentials } = config; + if (bucket && bucket !== '') { + dispatch(changeAWSBucketName(bucket)); + } + + if (credentials && credentials !== '') { + dispatch(changeAWSCredsPath(credentials)); + } + }, + [dispatch] + ); + + useEffect(() => { + initAWSConfig(data?.aws); + }, [data, initAWSConfig]); + + if (error) { + // TODO: improve error alert + return ( +
+ There was an error reading the `/etc/osbuild-worker/osbuild-worker.toml` + config file +
+ ); + } + return ( <> @@ -22,6 +67,7 @@ export const CloudProviderConfig = () => { id="aws-config" footer={{ nextButtonText: 'Submit', + isNextDisabled: !isAwsStepValid(config), isBackDisabled: true, }} > diff --git a/src/Components/CloudProviderConfig/validators/index.tsx b/src/Components/CloudProviderConfig/validators/index.tsx index cb5048ea..1503adfe 100644 --- a/src/Components/CloudProviderConfig/validators/index.tsx +++ b/src/Components/CloudProviderConfig/validators/index.tsx @@ -1,11 +1,37 @@ import path from 'path'; -export const isAwsBucketValid = (bucket: string): boolean => { +import { AWSWorkerConfig } from '../../../store/cockpit/types'; + +export const isAwsBucketValid = (bucket?: string): boolean => { + if (!bucket || bucket === '') { + return false; + } + const regex = /^[a-z0-9](?:[a-z0-9]|[-.](?=[a-z0-9])){1,61}[a-z0-9]$/; return regex.test(bucket); }; -export const isAwsCredsPathValid = (credsPath: string): boolean => { +export const isAwsCredsPathValid = (credsPath?: string): boolean => { + if (!credsPath || credsPath === '') { + return false; + } + const validPathPattern = /^(\/[^/\0]*)+\/?$/; return path.isAbsolute(credsPath) && validPathPattern.test(credsPath); }; + +export const isAwsStepValid = ( + config: AWSWorkerConfig | undefined +): boolean => { + if (!config) { + return true; + } + + if (!config.bucket && !config.credentials) { + return false; + } + + return ( + isAwsBucketValid(config.bucket) && isAwsCredsPathValid(config.credentials) + ); +}; diff --git a/src/store/cloudProviderConfigSlice.ts b/src/store/cloudProviderConfigSlice.ts index 55ab5d66..6dc03adc 100644 --- a/src/store/cloudProviderConfigSlice.ts +++ b/src/store/cloudProviderConfigSlice.ts @@ -8,6 +8,16 @@ export const initialState: CloudProviderConfigState = { aws: {}, }; +export const selectAWSConfig = (state: RootState) => { + if (Object.keys(state.cloudConfig.aws).length === 0) { + // just return undefined since the config is empty + // and we don't want to save `[aws]` header to the + // worker config file with no body + return undefined; + } + return state.cloudConfig.aws; +}; + export const selectAWSBucketName = (state: RootState) => { return state.cloudConfig.aws.bucket; }; @@ -20,6 +30,9 @@ export const cloudProviderConfigSlice = createSlice({ name: 'cloudConfig', initialState, reducers: { + reinitializeAWSConfig: (state) => { + state.aws = {}; + }, changeAWSBucketName: (state, action: PayloadAction) => { state.aws.bucket = action.payload; }, @@ -29,5 +42,8 @@ export const cloudProviderConfigSlice = createSlice({ }, }); -export const { changeAWSBucketName, changeAWSCredsPath } = - cloudProviderConfigSlice.actions; +export const { + reinitializeAWSConfig, + changeAWSBucketName, + changeAWSCredsPath, +} = cloudProviderConfigSlice.actions; diff --git a/src/store/cockpit/cockpitApi.ts b/src/store/cockpit/cockpitApi.ts index a0c1067d..2220cd59 100644 --- a/src/store/cockpit/cockpitApi.ts +++ b/src/store/cockpit/cockpitApi.ts @@ -18,6 +18,7 @@ import { v4 as uuidv4 } from 'uuid'; // the same unix socket. This allows us to split out the code a little // bit so that the `cockpitApi` doesn't become a monolith. import { contentSourcesApi } from './contentSourcesApi'; +import type { WorkerConfigResponse } from './types'; import { mapHostedToOnPrem, @@ -584,6 +585,24 @@ export const cockpitApi = contentSourcesApi.injectEndpoints({ } }, }), + getWorkerConfig: builder.query({ + queryFn: async () => { + try { + const config = await cockpit + .file('/etc/osbuild-worker/osbuild-worker.toml') + .read(); + + return { data: TOML.parse(config) }; + } catch (error) { + // no worker file error message + if (error.message === 'input is null') { + return { data: {} }; + } + + return { error }; + } + }, + }), }; }, // since we are inheriting some endpoints, @@ -607,4 +626,5 @@ export const { useGetComposesQuery, useGetBlueprintComposesQuery, useGetComposeStatusQuery, + useGetWorkerConfigQuery, } = cockpitApi; From 73ffb97414f0599208cf98bea134fec7e95b1e68 Mon Sep 17 00:00:00 2001 From: Gianluca Zuccarelli Date: Wed, 30 Apr 2025 12:21:23 +0100 Subject: [PATCH 171/331] cloudConfig: error component Add an error component to improve the UI when there is an issue reading the `osbuild-worker.toml` file. --- .../CloudProviderConfig.tsx | 53 +++++++++++++++---- 1 file changed, 44 insertions(+), 9 deletions(-) diff --git a/src/Components/CloudProviderConfig/CloudProviderConfig.tsx b/src/Components/CloudProviderConfig/CloudProviderConfig.tsx index 183685c8..793d1be6 100644 --- a/src/Components/CloudProviderConfig/CloudProviderConfig.tsx +++ b/src/Components/CloudProviderConfig/CloudProviderConfig.tsx @@ -1,6 +1,18 @@ -import React, { useCallback, useEffect } from 'react'; +import React, { MouseEventHandler, useCallback, useEffect } from 'react'; -import { PageSection, Wizard, WizardStep } from '@patternfly/react-core'; +import { + Button, + EmptyState, + EmptyStateActions, + EmptyStateBody, + EmptyStateFooter, + EmptyStateVariant, + PageSection, + Title, + Wizard, + WizardStep, +} from '@patternfly/react-core'; +import { ExclamationIcon } from '@patternfly/react-icons'; import { useNavigate } from 'react-router-dom'; import { AWSConfig } from './AWSConfig'; @@ -17,6 +29,35 @@ import { useAppDispatch } from '../../store/hooks'; import { resolveRelPath } from '../../Utilities/path'; import { ImageBuilderHeader } from '../sharedComponents/ImageBuilderHeader'; +const ConfigError = ({ + onClose, +}: { + onClose: MouseEventHandler; +}) => { + return ( + + + Error + + + There was an error reading the `/etc/osbuild-worker/osbuild-worker.toml` + config file + + + + + + + + ); +}; + export const CloudProviderConfig = () => { const navigate = useNavigate(); const dispatch = useAppDispatch(); @@ -48,13 +89,7 @@ export const CloudProviderConfig = () => { }, [data, initAWSConfig]); if (error) { - // TODO: improve error alert - return ( -
- There was an error reading the `/etc/osbuild-worker/osbuild-worker.toml` - config file -
- ); + return ; } return ( From afcc0126e436233db4ed80e8e2016d6d679d629b Mon Sep 17 00:00:00 2001 From: Gianluca Zuccarelli Date: Wed, 16 Apr 2025 10:56:15 +0000 Subject: [PATCH 172/331] cloudConfig: toggle aws config This is still a wip since the form fields aren't yet disabled when the config toggle is set to off. --- .../CloudProviderConfig/AWSConfig.tsx | 118 +++++++++++++++--- .../CloudProviderConfig.tsx | 13 +- 2 files changed, 112 insertions(+), 19 deletions(-) diff --git a/src/Components/CloudProviderConfig/AWSConfig.tsx b/src/Components/CloudProviderConfig/AWSConfig.tsx index 0d6db377..fb0c243c 100644 --- a/src/Components/CloudProviderConfig/AWSConfig.tsx +++ b/src/Components/CloudProviderConfig/AWSConfig.tsx @@ -1,69 +1,153 @@ -import React from 'react'; +import React, { useState } from 'react'; -import { Form, FormGroup } from '@patternfly/react-core'; +import { Form, FormGroup, Switch, TextInput } from '@patternfly/react-core'; import { isAwsBucketValid, isAwsCredsPathValid } from './validators'; import { changeAWSBucketName, changeAWSCredsPath, + reinitializeAWSConfig, selectAWSBucketName, selectAWSCredsPath, } from '../../store/cloudProviderConfigSlice'; +import { + AWSWorkerConfig, + WorkerConfigResponse, +} from '../../store/cockpit/types'; import { useAppDispatch, useAppSelector } from '../../store/hooks'; import { ValidatedInput } from '../CreateImageWizard/ValidatedInput'; -type FormGroupProps = { - value: string | undefined; - setValue: (value: string) => void; +type FormGroupProps = { + value: T | undefined; + onChange: (value: T) => void; + isDisabled?: boolean; }; -const AWSBucket = ({ value, setValue }: FormGroupProps) => { +type ToggleGroupProps = Omit, 'isDisabled'>; + +const AWSConfigToggle = ({ value, onChange }: ToggleGroupProps) => { + const handleChange = ( + _event: React.FormEvent, + checked: boolean + ) => { + onChange(checked); + }; + return ( - + + + + ); +}; + +const DisabledInputGroup = ({ + value, + label, +}: { + value: string | undefined; + label: string; +}) => { + return ( + + + + ); +}; + +const AWSBucket = ({ value, onChange, isDisabled }: FormGroupProps) => { + const label = 'AWS Bucket'; + + if (isDisabled) { + return ; + } + + return ( + setValue(value)} + onChange={(_event, value) => onChange(value)} helperText="Invalid AWS bucket name" /> ); }; -const AWSCredsPath = ({ value, setValue }: FormGroupProps) => { +const AWSCredsPath = ({ + value, + onChange, + isDisabled, +}: FormGroupProps) => { + const label = 'AWS Credentials Filepath'; + + if (isDisabled) { + return ; + } + return ( - + setValue(value)} + onChange={(_event, value) => onChange(value)} helperText="Invalid filepath for AWS credentials" /> ); }; -export const AWSConfig = () => { +type AWSConfigProps = { + isEnabled: boolean; + reinit: (config: AWSWorkerConfig | undefined) => void; + refetch: () => Promise<{ + data?: WorkerConfigResponse | undefined; + }>; +}; + +export const AWSConfig = ({ isEnabled, refetch, reinit }: AWSConfigProps) => { const dispatch = useAppDispatch(); const bucket = useAppSelector(selectAWSBucketName); const credentials = useAppSelector(selectAWSCredsPath); + const [enabled, setEnabled] = useState(isEnabled); - // TODO: maybe add a radio button to toggle AWS configuration - // on or off - this might simplify validation & the overall - // experience + const onToggle = async (v: boolean) => { + if (v) { + try { + const { data } = await refetch(); + reinit(data?.aws); + setEnabled(v); + return; + } catch { + return; + } + } + dispatch(reinitializeAWSConfig()); + setEnabled(v); + }; return (
+ dispatch(changeAWSBucketName(v))} + onChange={(v) => dispatch(changeAWSBucketName(v))} + isDisabled={!enabled} /> dispatch(changeAWSCredsPath(v))} + onChange={(v) => dispatch(changeAWSCredsPath(v))} + isDisabled={!enabled} /> ); diff --git a/src/Components/CloudProviderConfig/CloudProviderConfig.tsx b/src/Components/CloudProviderConfig/CloudProviderConfig.tsx index 793d1be6..966f627c 100644 --- a/src/Components/CloudProviderConfig/CloudProviderConfig.tsx +++ b/src/Components/CloudProviderConfig/CloudProviderConfig.tsx @@ -8,6 +8,7 @@ import { EmptyStateFooter, EmptyStateVariant, PageSection, + Skeleton, Title, Wizard, WizardStep, @@ -63,7 +64,7 @@ export const CloudProviderConfig = () => { const dispatch = useAppDispatch(); const handleClose = () => navigate(resolveRelPath('')); - const { data, error } = useGetWorkerConfigQuery({}); + const { data, error, refetch, isLoading } = useGetWorkerConfigQuery({}); const initAWSConfig = useCallback( (config: AWSWorkerConfig | undefined) => { @@ -88,6 +89,10 @@ export const CloudProviderConfig = () => { initAWSConfig(data?.aws); }, [data, initAWSConfig]); + if (isLoading) { + return ; + } + if (error) { return ; } @@ -106,7 +111,11 @@ export const CloudProviderConfig = () => { isBackDisabled: true, }} > - + 0)} + />
From c55706b9312d3d43980d8d9d0c70ea80572d68bd Mon Sep 17 00:00:00 2001 From: Gianluca Zuccarelli Date: Tue, 29 Apr 2025 14:53:11 +0000 Subject: [PATCH 173/331] cockpitApi: create worker config file Create the `osbuild-worker.toml` file if it doesn't exist already. --- src/store/cockpit/cockpitApi.ts | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/store/cockpit/cockpitApi.ts b/src/store/cockpit/cockpitApi.ts index 2220cd59..0fc9f02b 100644 --- a/src/store/cockpit/cockpitApi.ts +++ b/src/store/cockpit/cockpitApi.ts @@ -588,17 +588,22 @@ export const cockpitApi = contentSourcesApi.injectEndpoints({ getWorkerConfig: builder.query({ queryFn: async () => { try { + // we need to ensure that the file is created + await cockpit.spawn(['mkdir', '-p', '/etc/osbuild-worker'], { + superuser: 'require', + }); + + await cockpit.spawn( + ['touch', '/etc/osbuild-worker/osbuild-worker.toml'], + { superuser: 'require' } + ); + const config = await cockpit .file('/etc/osbuild-worker/osbuild-worker.toml') .read(); return { data: TOML.parse(config) }; } catch (error) { - // no worker file error message - if (error.message === 'input is null') { - return { data: {} }; - } - return { error }; } }, From 09df007eb90e9662aada1e1a79b7151857aaeb69 Mon Sep 17 00:00:00 2001 From: Gianluca Zuccarelli Date: Tue, 29 Apr 2025 16:37:46 +0000 Subject: [PATCH 174/331] test/mocks: add cockpit modify Add the `modify` file function which performs atomic modifications to a file. --- src/test/mocks/cockpit/cockpitFile.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/test/mocks/cockpit/cockpitFile.ts b/src/test/mocks/cockpit/cockpitFile.ts index 731b575a..cbd8be1f 100644 --- a/src/test/mocks/cockpit/cockpitFile.ts +++ b/src/test/mocks/cockpit/cockpitFile.ts @@ -32,7 +32,7 @@ export const getLastBlueprintReq = () => { return lastRequest.blueprints[lastRequest.blueprints.length - 1]; }; -export const cockpitFile = (filepath: string) => { +export const cockpitFile = (filepath: string, options?: object) => { return { read: (): Promise => { const file = path.parse(filepath); @@ -52,5 +52,10 @@ export const cockpitFile = (filepath: string) => { lastRequest.blueprints.push(contents); } }, + modify: (callback: (contents: string) => string): Promise => { + return new Promise((resolve) => { + resolve(callback('')); + }); + }, }; }; From ca6c59bfb87e76102d82a37625eb42c9a81f97a6 Mon Sep 17 00:00:00 2001 From: Gianluca Zuccarelli Date: Tue, 29 Apr 2025 16:38:38 +0000 Subject: [PATCH 175/331] store/cockpitApi: add worker config mutation Add an endpoint to update the worker config. --- src/store/cockpit/cockpitApi.ts | 51 ++++++++++++++++++++++++- src/store/cockpit/enhancedCockpitApi.ts | 8 +++- src/store/cockpit/types.ts | 16 ++++++++ 3 files changed, 72 insertions(+), 3 deletions(-) diff --git a/src/store/cockpit/cockpitApi.ts b/src/store/cockpit/cockpitApi.ts index 0fc9f02b..972181c6 100644 --- a/src/store/cockpit/cockpitApi.ts +++ b/src/store/cockpit/cockpitApi.ts @@ -6,7 +6,7 @@ import path from 'path'; // the `tsconfig` to stubs of the `cockpit` and `cockpit/fsinfo` // modules. These stubs are in the `src/test/mocks/cockpit` directory. // We also needed to create an alias in vitest to make this work. -import TOML from '@ltd/j-toml'; +import TOML, { Section } from '@ltd/j-toml'; import cockpit from 'cockpit'; import { fsinfo } from 'cockpit/fsinfo'; import { v4 as uuidv4 } from 'uuid'; @@ -18,7 +18,11 @@ import { v4 as uuidv4 } from 'uuid'; // the same unix socket. This allows us to split out the code a little // bit so that the `cockpitApi` doesn't become a monolith. import { contentSourcesApi } from './contentSourcesApi'; -import type { WorkerConfigResponse } from './types'; +import type { + UpdateWorkerConfigApiArg, + WorkerConfigFile, + WorkerConfigResponse, +} from './types'; import { mapHostedToOnPrem, @@ -608,6 +612,48 @@ export const cockpitApi = contentSourcesApi.injectEndpoints({ } }, }), + updateWorkerConfig: builder.mutation< + WorkerConfigResponse, + UpdateWorkerConfigApiArg + >({ + queryFn: async ({ updateWorkerConfigRequest }) => { + try { + const workerConfig = cockpit.file( + '/etc/osbuild-worker/osbuild-worker.toml', + { + superuser: 'required', + } + ); + + const contents = await workerConfig.modify((prev: string) => { + if (!updateWorkerConfigRequest) { + return prev; + } + + const merged = { + ...TOML.parse(prev), + ...updateWorkerConfigRequest, + } as WorkerConfigFile; + + const contents: WorkerConfigFile = {}; + Object.keys(merged).forEach((key: string) => { + contents[key] = Section({ + ...merged[key], + }); + }); + + return TOML.stringify(contents, { + newline: '\n', + newlineAround: 'document', + }); + }); + + return { data: TOML.parse(contents) }; + } catch (error) { + return { error }; + } + }, + }), }; }, // since we are inheriting some endpoints, @@ -632,4 +678,5 @@ export const { useGetBlueprintComposesQuery, useGetComposeStatusQuery, useGetWorkerConfigQuery, + useUpdateWorkerConfigMutation, } = cockpitApi; diff --git a/src/store/cockpit/enhancedCockpitApi.ts b/src/store/cockpit/enhancedCockpitApi.ts index 71958828..a346068d 100644 --- a/src/store/cockpit/enhancedCockpitApi.ts +++ b/src/store/cockpit/enhancedCockpitApi.ts @@ -1,7 +1,7 @@ import { cockpitApi } from './cockpitApi'; const enhancedApi = cockpitApi.enhanceEndpoints({ - addTagTypes: ['Blueprint', 'Blueprints', 'Composes'], + addTagTypes: ['Blueprint', 'Blueprints', 'Composes', 'WorkerConfig'], endpoints: { getBlueprint: { providesTags: () => { @@ -31,6 +31,12 @@ const enhancedApi = cockpitApi.enhanceEndpoints({ getBlueprintComposes: { providesTags: [{ type: 'Composes' }], }, + getWorkerConfig: { + providesTags: [{ type: 'WorkerConfig' }], + }, + updateWorkerConfig: { + invalidatesTags: [{ type: 'WorkerConfig' }], + }, }, }); diff --git a/src/store/cockpit/types.ts b/src/store/cockpit/types.ts index 5d7350fc..3614390b 100644 --- a/src/store/cockpit/types.ts +++ b/src/store/cockpit/types.ts @@ -28,6 +28,22 @@ export type WorkerConfigResponse = { aws?: AWSWorkerConfig; }; +export type WorkerConfigFile = { + // the worker file has a key value/pair for + // each section, which could be of any type. + // Disable the linter warning for this. + // eslint-disable-next-line + [key: string]: any; +}; + export type CloudProviderConfigState = { aws: AWSWorkerConfig; }; + +export type WorkerConfigRequest = { + aws?: AWSWorkerConfig | undefined; +}; + +export type UpdateWorkerConfigApiArg = { + updateWorkerConfigRequest: WorkerConfigRequest | undefined; +}; From 5afe1c1fc1ef06ad43cea2089d1229fdd941f538 Mon Sep 17 00:00:00 2001 From: Gianluca Zuccarelli Date: Tue, 29 Apr 2025 16:39:19 +0000 Subject: [PATCH 176/331] cloudConfig: save the aws configs Save the AWS config modifications to the `osbuild-worker.toml` file. --- .../CloudProviderConfig/CloudProviderConfig.tsx | 16 ++++++++++++++-- src/store/cockpit/cockpitApi.ts | 10 +++++++--- 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/src/Components/CloudProviderConfig/CloudProviderConfig.tsx b/src/Components/CloudProviderConfig/CloudProviderConfig.tsx index 966f627c..e5897a09 100644 --- a/src/Components/CloudProviderConfig/CloudProviderConfig.tsx +++ b/src/Components/CloudProviderConfig/CloudProviderConfig.tsx @@ -23,10 +23,14 @@ import { changeAWSBucketName, changeAWSCredsPath, reinitializeAWSConfig, + selectAWSConfig, } from '../../store/cloudProviderConfigSlice'; -import { useGetWorkerConfigQuery } from '../../store/cockpit/cockpitApi'; +import { + useGetWorkerConfigQuery, + useUpdateWorkerConfigMutation, +} from '../../store/cockpit/cockpitApi'; import { AWSWorkerConfig } from '../../store/cockpit/types'; -import { useAppDispatch } from '../../store/hooks'; +import { useAppDispatch, useAppSelector } from '../../store/hooks'; import { resolveRelPath } from '../../Utilities/path'; import { ImageBuilderHeader } from '../sharedComponents/ImageBuilderHeader'; @@ -62,8 +66,10 @@ const ConfigError = ({ export const CloudProviderConfig = () => { const navigate = useNavigate(); const dispatch = useAppDispatch(); + const config = useAppSelector(selectAWSConfig); const handleClose = () => navigate(resolveRelPath('')); + const [updateConfig] = useUpdateWorkerConfigMutation(); const { data, error, refetch, isLoading } = useGetWorkerConfigQuery({}); const initAWSConfig = useCallback( @@ -109,6 +115,12 @@ export const CloudProviderConfig = () => { nextButtonText: 'Submit', isNextDisabled: !isAwsStepValid(config), isBackDisabled: true, + onNext: () => { + updateConfig({ + updateWorkerConfigRequest: { aws: config }, + }); + navigate(resolveRelPath('')); + }, }} > { - contents[key] = Section({ - ...merged[key], - }); + // this check helps prevent saving empty objects + // into the osbuild-worker.toml config file. + if (merged[key] !== undefined) { + contents[key] = Section({ + ...merged[key], + }); + } }); return TOML.stringify(contents, { From 1ed4380bfc79dd7eb7a22c9c714ce93b2f898024 Mon Sep 17 00:00:00 2001 From: Gianluca Zuccarelli Date: Wed, 30 Apr 2025 10:46:02 +0000 Subject: [PATCH 177/331] cloudConfig: restart worker on submit Restart osbuild-composer and the worker after updating the config, this is a necessary step for osbuild-composer to register the changes. --- src/store/cockpit/cockpitApi.ts | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/src/store/cockpit/cockpitApi.ts b/src/store/cockpit/cockpitApi.ts index e51d22fd..52afd13b 100644 --- a/src/store/cockpit/cockpitApi.ts +++ b/src/store/cockpit/cockpitApi.ts @@ -652,6 +652,39 @@ export const cockpitApi = contentSourcesApi.injectEndpoints({ }); }); + const systemServices = [ + 'osbuild-composer.socket', + 'osbuild-worker@*.service', + 'osbuild-composer.service', + ]; + + await cockpit.spawn( + [ + 'systemctl', + 'stop', + // we need to be explicit here and stop all the services first, + // otherwise this step is a little bit flaky + ...systemServices, + ], + { + superuser: 'require', + } + ); + + await cockpit.spawn( + [ + 'systemctl', + 'restart', + // we need to restart all the services explicitly too + // since the config doesn't always get reloaded if we + // only reload the worker service + ...systemServices, + ], + { + superuser: 'require', + } + ); + return { data: TOML.parse(contents) }; } catch (error) { return { error }; From 0b0171bb8737448ff3343a0ce24930c0cf872f4a Mon Sep 17 00:00:00 2001 From: Gianluca Zuccarelli Date: Wed, 2 Jul 2025 10:50:14 +0100 Subject: [PATCH 178/331] cloudConfig: add a popover for creds path Add a popover to give more information on the aws credentials path. --- .../CloudProviderConfig/AWSConfig.tsx | 61 +++++++++++++++++-- 1 file changed, 55 insertions(+), 6 deletions(-) diff --git a/src/Components/CloudProviderConfig/AWSConfig.tsx b/src/Components/CloudProviderConfig/AWSConfig.tsx index fb0c243c..e3f2c2a4 100644 --- a/src/Components/CloudProviderConfig/AWSConfig.tsx +++ b/src/Components/CloudProviderConfig/AWSConfig.tsx @@ -1,6 +1,15 @@ import React, { useState } from 'react'; -import { Form, FormGroup, Switch, TextInput } from '@patternfly/react-core'; +import { + Button, + Content, + Form, + FormGroup, + Popover, + Switch, + TextInput, +} from '@patternfly/react-core'; +import { HelpIcon } from '@patternfly/react-icons'; import { isAwsBucketValid, isAwsCredsPathValid } from './validators'; @@ -52,13 +61,15 @@ const AWSConfigToggle = ({ value, onChange }: ToggleGroupProps) => { const DisabledInputGroup = ({ value, label, + ariaLabel, }: { value: string | undefined; - label: string; + label: React.ReactNode; + ariaLabel: string; }) => { return ( - + ); }; @@ -67,7 +78,9 @@ const AWSBucket = ({ value, onChange, isDisabled }: FormGroupProps) => { const label = 'AWS Bucket'; if (isDisabled) { - return ; + return ( + + ); } return ( @@ -83,15 +96,51 @@ const AWSBucket = ({ value, onChange, isDisabled }: FormGroupProps) => { ); }; +const CredsPathPopover = () => { + return ( + + + This is the path to your AWS credentials file which contains your + aws access key id and secret access key. This path to the file is + normally in the home directory in the credentials file in the .aws + directory,
i.e. /home/USERNAME/.aws/credentials +
+ + } + > + ); }; From 0ea874abc6a14a57005ec118b76065f9323812c7 Mon Sep 17 00:00:00 2001 From: regexowl Date: Tue, 15 Jul 2025 10:21:01 +0200 Subject: [PATCH 185/331] Wizard: Fix dropdown behaviour on "Enter" The page refreshed when pressing "Enter" while in the dropdown input. This fixes the behaviour. If the dropdown's closed, "Enter" will open the options, if there's an input value that perfectly matches one of the activation keys, it gets selected. The order of functions was also slightly cleaned up so they're all in one place after `useEffect`s. --- .../components/ActivationKeysList.tsx | 50 ++++++++++++------- 1 file changed, 33 insertions(+), 17 deletions(-) diff --git a/src/Components/CreateImageWizard/steps/Registration/components/ActivationKeysList.tsx b/src/Components/CreateImageWizard/steps/Registration/components/ActivationKeysList.tsx index c9931cb8..7bfcb718 100644 --- a/src/Components/CreateImageWizard/steps/Registration/components/ActivationKeysList.tsx +++ b/src/Components/CreateImageWizard/steps/Registration/components/ActivationKeysList.tsx @@ -103,22 +103,6 @@ const ActivationKeysList = () => { // eslint-disable-next-line react-hooks/exhaustive-deps }, [filterValue, activationKeys?.body]); - const setActivationKey = ( - _event: React.MouseEvent, - selection: string - ) => { - setIsOpen(false); - window.localStorage.setItem('imageBuilder.recentActivationKey', selection); - dispatch(changeActivationKey(selection)); - }; - - const handleToggle = () => { - if (!isOpen) { - refetch(); - } - setIsOpen(!isOpen); - }; - useEffect(() => { const isActivationKeysEmpty = isSuccessActivationKeys && @@ -168,6 +152,37 @@ const ActivationKeysList = () => { } }, [isSuccessActivationKeys]); + const setActivationKey = (selection: string) => { + setIsOpen(false); + window.localStorage.setItem('imageBuilder.recentActivationKey', selection); + dispatch(changeActivationKey(selection)); + }; + + const handleToggle = () => { + if (!isOpen) { + refetch(); + } + setIsOpen(!isOpen); + }; + + const handleSelect = (_event: React.MouseEvent, selection: string) => { + setActivationKey(selection); + }; + + const handleKeyDown = (event: React.KeyboardEvent) => { + if (event.key !== 'Enter') return; + + event.preventDefault(); + + if (!isOpen) { + setIsOpen(!isOpen); + } + + if (selectOptions.includes(inputValue)) { + setActivationKey(inputValue); + } + }; + const onTextInputChange = (_event: React.FormEvent, value: string) => { setInputValue(value); setFilterValue(value); @@ -214,6 +229,7 @@ const ActivationKeysList = () => { ref={toggleRef} variant="typeahead" onClick={handleToggle} + onKeyDown={handleKeyDown} isExpanded={isOpen} data-testid="activation-key-select" isDisabled={ @@ -249,7 +265,7 @@ const ActivationKeysList = () => { isScrollable isOpen={isOpen} selected={activationKey} - onSelect={setActivationKey} + onSelect={handleSelect} onOpenChange={handleToggle} toggle={toggle} shouldFocusFirstItemOnOpen={false} From a0fe3644c33963bb6d3ec21dc98d1e5bf9b918ad Mon Sep 17 00:00:00 2001 From: regexowl Date: Thu, 8 May 2025 10:22:33 +0200 Subject: [PATCH 186/331] src: Remove more `data-testid`s As using `data-testid`s in tests is an anti-pattern, this removes more of them and replaces them with appropriate locators in the tests. --- playwright/test.spec.ts | 8 +- .../Blueprints/BlueprintActionsMenu.tsx | 1 - .../Blueprints/ImportBlueprintModal.tsx | 1 - .../FileSystem/components/FileSystemTable.tsx | 10 +- .../components/ReleaseLifecycle.tsx | 1 - .../components/TargetEnvironment.tsx | 12 -- .../Registration/components/Registration.tsx | 2 - .../steps/Repositories/components/Empty.tsx | 1 - .../Snapshot/components/TemplatesEmpty.tsx | 1 - .../Azure/AzureHyperVSelect.tsx | 1 - .../steps/TargetEnvironment/Gcp/index.tsx | 5 - src/Components/ImagesTable/EmptyState.tsx | 1 - .../sharedComponents/ImageBuilderHeader.tsx | 1 - .../Components/Blueprints/Blueprints.test.tsx | 6 +- .../Blueprints/ImportBlueprintModal.test.tsx | 43 +++-- .../CreateImageWizard.test.tsx | 42 +++-- .../FileSystemConfiguration.test.tsx | 23 +-- .../steps/ImageOutput/ImageOutput.test.tsx | 166 +++++++++++++----- .../steps/Oscap/Oscap.test.tsx | 10 +- .../TargetEnvironment/AwsTarget.test.tsx | 10 +- .../TargetEnvironment/AzureTarget.test.tsx | 10 +- .../TargetEnvironment/GCPTarget.test.tsx | 38 ++-- .../steps/Users/Users.test.tsx | 4 +- .../CreateImageWizard/wizardTestUtils.tsx | 4 +- .../ImagesTable/ImagesTable.test.tsx | 12 +- .../LandingPage/LandingPage.test.tsx | 4 +- 26 files changed, 257 insertions(+), 160 deletions(-) diff --git a/playwright/test.spec.ts b/playwright/test.spec.ts index 4bec2f84..a8c43830 100644 --- a/playwright/test.spec.ts +++ b/playwright/test.spec.ts @@ -22,14 +22,16 @@ test.describe.serial('test', () => { await frame.getByTestId('blueprints-create-button').click(); frame.getByRole('heading', { name: 'Image output' }); - await frame.getByTestId('checkbox-guest-image').click(); + await frame + .getByRole('checkbox', { name: /Virtualization guest image/i }) + .click(); await frame.getByRole('button', { name: 'Next', exact: true }).click(); if (isHosted()) { frame.getByRole('heading', { name: 'Register systems using this image', }); - await page.getByTestId('register-later-radio').click(); + await page.getByRole('radio', { name: /Register later/i }).click(); await frame.getByRole('button', { name: 'Next', exact: true }).click(); } @@ -164,7 +166,7 @@ test.describe.serial('test', () => { // the clickable blueprint cards are a bit awkward, so use the // button's id instead await frame.locator(`button[id="${blueprintName}"]`).click(); - await frame.getByTestId('blueprint-action-menu-toggle').click(); + await frame.getByRole('button', { name: /blueprint menu toggle/i }).click(); await frame.getByRole('menuitem', { name: 'Delete blueprint' }).click(); await frame.getByRole('button', { name: 'Delete' }).click(); }); diff --git a/src/Components/Blueprints/BlueprintActionsMenu.tsx b/src/Components/Blueprints/BlueprintActionsMenu.tsx index a759bf92..beb66d94 100644 --- a/src/Components/Blueprints/BlueprintActionsMenu.tsx +++ b/src/Components/Blueprints/BlueprintActionsMenu.tsx @@ -60,7 +60,6 @@ export const BlueprintActionsMenu: React.FunctionComponent< onClick={() => setShowBlueprintActionsMenu(!showBlueprintActionsMenu)} variant="plain" aria-label="blueprint menu toggle" - data-testid="blueprint-action-menu-toggle" >