From 56b22eee538b86adcb108db0296931916e9036a1 Mon Sep 17 00:00:00 2001 From: schutzbot Date: Wed, 11 Jun 2025 08:36:31 +0000 Subject: [PATCH 001/297] 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 002/297] .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 003/297] 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 004/297] .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 005/297] 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 006/297] 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 007/297] 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 008/297] 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 009/297] 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 010/297] 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 011/297] 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 012/297] 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 013/297] 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 014/297] 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 015/297] 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 016/297] 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 017/297] 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 018/297] 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 019/297] 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 020/297] 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 021/297] 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 022/297] 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 023/297] 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 024/297] 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 025/297] 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 026/297] 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 027/297] 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 028/297] 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 029/297] 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 030/297] 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 031/297] 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 032/297] 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 033/297] 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 034/297] 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 035/297] 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 036/297] 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 037/297] 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 038/297] 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 039/297] 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 040/297] 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 106/297] 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 107/297] 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 108/297] 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 109/297] 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 110/297] 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 111/297] 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 112/297] 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 113/297] 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 114/297] 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 115/297] 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 116/297] 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 117/297] 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 118/297] 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 119/297] 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 120/297] 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 121/297] 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 122/297] 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 123/297] 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 124/297] 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 125/297] 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 126/297] 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 127/297] 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 128/297] 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 129/297] 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 130/297] 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 131/297] 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 132/297] 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 133/297] 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 134/297] 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 135/297] 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 136/297] 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 137/297] 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 138/297] 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 139/297] 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 140/297] 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 141/297] 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 142/297] 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 143/297] 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 144/297] 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 151/297] 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 152/297] 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" >