diff --git a/libs/types/index.ts b/libs/types/index.ts index d2a4419d0..84a3bdf98 100644 --- a/libs/types/index.ts +++ b/libs/types/index.ts @@ -13,6 +13,7 @@ export type { ApplicationVolume } from './models/ApplicationVolume'; export type { ApplicationVolumeProviderSpec } from './models/ApplicationVolumeProviderSpec'; export type { ApplicationVolumeStatus } from './models/ApplicationVolumeStatus'; export { AppType } from './models/AppType'; +export type { ArtifactApplicationProviderSpec } from './models/ArtifactApplicationProviderSpec'; export type { AuthConfig } from './models/AuthConfig'; export type { AuthOrganizationsConfig } from './models/AuthOrganizationsConfig'; export type { Batch } from './models/Batch'; diff --git a/libs/types/models/AppType.ts b/libs/types/models/AppType.ts index 90eced6c8..570034184 100644 --- a/libs/types/models/AppType.ts +++ b/libs/types/models/AppType.ts @@ -7,4 +7,5 @@ */ export enum AppType { AppTypeCompose = 'compose', + AppTypeQuadlet = 'quadlet', } diff --git a/libs/types/models/ApplicationProviderSpec.ts b/libs/types/models/ApplicationProviderSpec.ts index d3583be37..fd0c4f83d 100644 --- a/libs/types/models/ApplicationProviderSpec.ts +++ b/libs/types/models/ApplicationProviderSpec.ts @@ -4,6 +4,7 @@ /* eslint-disable */ import type { ApplicationEnvVars } from './ApplicationEnvVars'; import type { AppType } from './AppType'; +import type { ArtifactApplicationProviderSpec } from './ArtifactApplicationProviderSpec'; import type { ImageApplicationProviderSpec } from './ImageApplicationProviderSpec'; import type { InlineApplicationProviderSpec } from './InlineApplicationProviderSpec'; export type ApplicationProviderSpec = (ApplicationEnvVars & { @@ -12,5 +13,5 @@ export type ApplicationProviderSpec = (ApplicationEnvVars & { */ name?: string; appType?: AppType; -} & (ImageApplicationProviderSpec | InlineApplicationProviderSpec)); +} & (ImageApplicationProviderSpec | ArtifactApplicationProviderSpec | InlineApplicationProviderSpec)); diff --git a/libs/types/models/ArtifactApplicationProviderSpec.ts b/libs/types/models/ArtifactApplicationProviderSpec.ts new file mode 100644 index 000000000..9243ba7ee --- /dev/null +++ b/libs/types/models/ArtifactApplicationProviderSpec.ts @@ -0,0 +1,11 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export type ArtifactApplicationProviderSpec = { + /** + * Reference to an OCI artifact for the application package. + */ + artifact: string; +}; + diff --git a/libs/types/models/EnrollmentRequestSpec.ts b/libs/types/models/EnrollmentRequestSpec.ts index 30fd2795c..760d88618 100644 --- a/libs/types/models/EnrollmentRequestSpec.ts +++ b/libs/types/models/EnrollmentRequestSpec.ts @@ -16,5 +16,9 @@ export type EnrollmentRequestSpec = { * A set of labels that the service will apply to this device when its enrollment is approved. */ labels?: Record; + /** + * The rendered version of the device from desired.json (optional). + */ + knownRenderedVersion?: string; }; diff --git a/libs/ui-components/src/components/Device/EditDeviceWizard/deviceSpecUtils.ts b/libs/ui-components/src/components/Device/EditDeviceWizard/deviceSpecUtils.ts index ffb6fc86b..0a79e6b62 100644 --- a/libs/ui-components/src/components/Device/EditDeviceWizard/deviceSpecUtils.ts +++ b/libs/ui-components/src/components/Device/EditDeviceWizard/deviceSpecUtils.ts @@ -25,6 +25,7 @@ import { InlineConfigTemplate, KubeSecretTemplate, SpecConfigTemplate, + isArtifactAppProvider, isGitConfigTemplate, isGitProviderSpec, isHttpConfigTemplate, @@ -284,6 +285,7 @@ export const getApplicationPatches = ( value: updatedApps.map(toAPIApplication), }); } else { + // TODO EDM-2451: Add support for artifact applications const needsPatch = currentApps.some((currentApp, index) => { const updatedApp = updatedApps[index]; const isCurrentImageApp = isImageAppProvider(currentApp); @@ -307,7 +309,9 @@ export const getApplicationPatches = ( if (isCurrentImageApp) { return (updatedApp as ImageAppForm).image !== currentApp.image; } - + if (isArtifactAppProvider(currentApp)) { + return false; + } return hasInlineApplicationChanged(currentApp, updatedApp as InlineAppForm); }); if (needsPatch) { @@ -386,28 +390,31 @@ const getAppFormVolumes = (app: ApplicationProviderSpecFixed) => export const getApplicationValues = (deviceSpec?: DeviceSpec): AppForm[] => { const apps = deviceSpec?.applications || []; - return apps.map((app) => { - if (isImageAppProvider(app)) { + return apps + .filter((app) => !isArtifactAppProvider(app)) + .map((app) => { + if (isImageAppProvider(app)) { + return { + specType: AppSpecType.OCI_IMAGE, + name: app.name || '', + image: app.image, + variables: getAppFormVariables(app), + volumes: getAppFormVolumes(app), + }; + } + // TODO EDM-2451: Add support for artifact applications return { - specType: AppSpecType.OCI_IMAGE, + specType: AppSpecType.INLINE, name: app.name || '', - image: app.image, + files: (app as InlineApplicationProviderSpec).inline.map((file) => ({ + path: file.path || '', + content: file.content, + base64: file.contentEncoding === EncodingType.EncodingBase64, + })), variables: getAppFormVariables(app), volumes: getAppFormVolumes(app), }; - } - return { - specType: AppSpecType.INLINE, - name: app.name || '', - files: app.inline.map((file) => ({ - path: file.path || '', - content: file.content, - base64: file.contentEncoding === EncodingType.EncodingBase64, - })), - variables: getAppFormVariables(app), - volumes: getAppFormVolumes(app), - }; - }); + }); }; export const getConfigTemplatesValues = (deviceSpec?: DeviceSpec, registerMicroShift?: boolean) => { diff --git a/libs/ui-components/src/types/deviceSpec.ts b/libs/ui-components/src/types/deviceSpec.ts index 47e68ae06..ad5fba64a 100644 --- a/libs/ui-components/src/types/deviceSpec.ts +++ b/libs/ui-components/src/types/deviceSpec.ts @@ -1,4 +1,5 @@ import { + ArtifactApplicationProviderSpec, ConfigProviderSpec, DisruptionBudget, GitConfigProviderSpec, @@ -87,6 +88,8 @@ export const isInlineAppProvider = (app: ApplicationProviderSpecFixed): app is I 'inline' in app; export const isImageAppProvider = (app: ApplicationProviderSpecFixed): app is ImageApplicationProviderSpec => 'image' in app; +export const isArtifactAppProvider = (app: ApplicationProviderSpecFixed): app is ArtifactApplicationProviderSpec => + 'artifact' in app; export const isImageAppForm = (app: AppBase): app is ImageAppForm => app.specType === AppSpecType.OCI_IMAGE; export const isInlineAppForm = (app: AppBase): app is InlineAppForm => app.specType === AppSpecType.INLINE; diff --git a/libs/ui-components/src/types/extraTypes.ts b/libs/ui-components/src/types/extraTypes.ts index 22344b714..674c785eb 100644 --- a/libs/ui-components/src/types/extraTypes.ts +++ b/libs/ui-components/src/types/extraTypes.ts @@ -2,6 +2,7 @@ import { AppType, ApplicationEnvVars, ApplicationVolumeProviderSpec, + ArtifactApplicationProviderSpec, ConditionType, Device, EnrollmentRequest, @@ -45,7 +46,7 @@ export type ApplicationProviderSpecFixed = ApplicationEnvVars & ApplicationVolumeProviderSpec & { name?: string; appType?: AppType; - } & (ImageApplicationProviderSpec | { inline: InlineApplicationFileFixed[] }); + } & (ImageApplicationProviderSpec | ArtifactApplicationProviderSpec | { inline: InlineApplicationFileFixed[] }); type CliArtifact = { os: string;