diff --git a/pkg/elemental/components/BuildMedia.vue b/pkg/elemental/components/BuildMedia.vue index f11538a..e941c36 100644 --- a/pkg/elemental/components/BuildMedia.vue +++ b/pkg/elemental/components/BuildMedia.vue @@ -9,6 +9,7 @@ import { getOperatorVersion, checkGatedFeatureCompatibility, BUILD_MEDIA_RAW_SUPPORT, + BUILD_MEDIA_ARCH_SUPPORT, CHANNEL_NO_LONGER_IN_SYNC, ALL_AREAS, ALL_MODES, @@ -28,6 +29,8 @@ export const MEDIA_TYPES = { } }; +const SPECIAL_DELIMITATOR = ':::::'; + export default { name: 'BuildMedia', components: { @@ -93,12 +96,25 @@ export default { const selectedFilterType = neu === MEDIA_TYPES.ISO.type ? MEDIA_TYPES.ISO.type : MEDIA_TYPES.RAW.filterType; this.filteredManagedOsVersions = this.managedOsVersions.filter(v => v.spec?.type === selectedFilterType) || []; - this.buildMediaOsVersions = this.filteredManagedOsVersions.map((f) => { - return { - label: `${ f.spec?.metadata?.displayName } ${ f.spec?.version } ${ this.supportChannelNoLongerInSync && typeof f.inSync === 'boolean' && !f.inSync ? '(deprecated)' : '' }`, - value: neu === MEDIA_TYPES.ISO.type ? f.spec?.metadata?.uri : f.spec?.metadata?.upgradeImage, - }; + const buildMediaOsVersions = []; + + this.filteredManagedOsVersions.forEach((osVersion) => { + if (this.supportBuildMediaArchitecture && osVersion.spec?.metadata?.platforms?.length) { + osVersion.spec?.metadata?.platforms.forEach((arch) => { + buildMediaOsVersions.push({ + label: `${ osVersion.spec?.metadata?.displayName } ${ osVersion.spec?.version } - ${arch}${ this.supportChannelNoLongerInSync && typeof osVersion.inSync === 'boolean' && !osVersion.inSync ? ' - (deprecated)' : '' }`, + value: `${neu === MEDIA_TYPES.ISO.type ? osVersion.spec?.metadata?.uri : osVersion.spec?.metadata?.upgradeImage}${SPECIAL_DELIMITATOR}${arch}`, + }); + }); + } else { + buildMediaOsVersions.push({ + label: `${ osVersion.spec?.metadata?.displayName } ${ osVersion.spec?.version } ${ this.supportChannelNoLongerInSync && typeof osVersion.inSync === 'boolean' && !osVersion.inSync ? '(deprecated)' : '' }`, + value: neu === MEDIA_TYPES.ISO.type ? osVersion.spec?.metadata?.uri : osVersion.spec?.metadata?.upgradeImage, + }); + } }); + + this.buildMediaOsVersions = buildMediaOsVersions; } } }, @@ -106,6 +122,9 @@ export default { supportChannelNoLongerInSync() { return checkGatedFeatureCompatibility(ALL_AREAS, ALL_MODES, CHANNEL_NO_LONGER_IN_SYNC, this.operatorVersion); }, + supportBuildMediaArchitecture() { + return checkGatedFeatureCompatibility(this.resource, this.mode, BUILD_MEDIA_ARCH_SUPPORT, this.operatorVersion); + }, isRawDiskImageBuildSupported() { const check = checkGatedFeatureCompatibility(this.resource, this.mode, BUILD_MEDIA_RAW_SUPPORT, this.operatorVersion); @@ -188,13 +207,21 @@ export default { const machineRegName = this.displayRegEndpoints ? this.registrationEndpointSelected.split('/')[1] : this.registrationEndpoint.split('/')[1]; const machineRegNamespace = this.displayRegEndpoints ? this.registrationEndpointSelected.split('/')[0] : this.registrationEndpoint.split('/')[0]; + let targetPlatform = ''; + let baseImage = this.buildMediaOsVersionSelected; + + if (this.supportBuildMediaArchitecture && this.buildMediaOsVersionSelected.includes(SPECIAL_DELIMITATOR)) { + targetPlatform = this.buildMediaOsVersionSelected.split(SPECIAL_DELIMITATOR)[1]; + baseImage = this.buildMediaOsVersionSelected.split(SPECIAL_DELIMITATOR)[0]; + } + const seedImageObject = { metadata: { name: `media-image-reg-${ machineRegName }-${ randomStr(8, CHARSET.ALPHA_LOWER ) }`, namespace: 'fleet-default' }, spec: { - baseImage: this.buildMediaOsVersionSelected, + baseImage, registrationRef: { name: machineRegName, namespace: machineRegNamespace @@ -207,6 +234,10 @@ export default { seedImageObject.spec.type = this.buildMediaTypeSelected; } + if (targetPlatform) { + seedImageObject.spec.targetPlatform = targetPlatform; + } + const seedImageModel = await this.$store.dispatch('management/create', seedImageObject); try { diff --git a/pkg/elemental/utils/feature-versioning.ts b/pkg/elemental/utils/feature-versioning.ts index d735177..5d6cc66 100644 --- a/pkg/elemental/utils/feature-versioning.ts +++ b/pkg/elemental/utils/feature-versioning.ts @@ -17,6 +17,7 @@ export const ALL_MODES:string = 'all-modes'; // features to be gated to specific operator versions export const MACH_REG_CONFIG_DEFAULTS:string = 'machine-reg-config-defaults'; export const BUILD_MEDIA_RAW_SUPPORT:string = 'build-media-raw-support'; +export const BUILD_MEDIA_ARCH_SUPPORT:string = 'build-media-arch-support'; export const DELETE_NO_LONGER_IN_SYNC_CHANNELS:string = 'delete-no-longer-in-sync-channels'; export const CHANNEL_NO_LONGER_IN_SYNC:string = 'channel-no-longer-in-sync'; @@ -39,6 +40,18 @@ const FEATURES_GATING:FeaturesGatingConfig[] = [ minOperatorVersion: '1.6.2', features: [BUILD_MEDIA_RAW_SUPPORT] }, + { + area: ELEMENTAL_TYPES.DASHBOARD, + mode: [_VIEW], + minOperatorVersion: '1.6.3', + features: [BUILD_MEDIA_ARCH_SUPPORT] + }, + { + area: ELEMENTAL_SCHEMA_IDS.MACHINE_REGISTRATIONS, + mode: [_VIEW], + minOperatorVersion: '1.6.3', + features: [BUILD_MEDIA_ARCH_SUPPORT] + }, { area: ELEMENTAL_SCHEMA_IDS.MANAGED_OS_VERSION_CHANNELS, mode: [_CREATE, _EDIT, _DETAIL, _VIEW],