add thirdPartyStorage feature flag

Signed-off-by: andy.lee <andy.lee@suse.com>
This commit is contained in:
andy.lee 2025-02-19 13:33:30 +08:00
parent 40794d89a0
commit b828c2f66d
No known key found for this signature in database
GPG Key ID: 10911689462678C7
6 changed files with 45 additions and 11 deletions

View File

@ -51,7 +51,8 @@ const featuresV150 = [
'tpmPersistentState', 'tpmPersistentState',
'efiPersistentState', 'efiPersistentState',
'untaggedNetworkSetting', 'untaggedNetworkSetting',
'skipSingleReplicaDetachedVol' 'skipSingleReplicaDetachedVol',
'thirdPartyStorage'
]; ];
export const RELEASE_FEATURES = { export const RELEASE_FEATURES = {

View File

@ -16,6 +16,7 @@ import { STORAGE_CLASS } from '@shell/config/types';
import { VM_IMAGE_FILE_FORMAT } from '../validators/vm-image'; import { VM_IMAGE_FILE_FORMAT } from '../validators/vm-image';
import { OS } from '../mixins/harvester-vm'; import { OS } from '../mixins/harvester-vm';
import { HCI } from '../types'; import { HCI } from '../types';
import { LVM_DRIVER } from '../models/harvester/storage.k8s.io.storageclass';
const ENCRYPT = 'encrypt'; const ENCRYPT = 'encrypt';
const DECRYPT = 'decrypt'; const DECRYPT = 'decrypt';
@ -161,9 +162,10 @@ export default {
storageClassOptions() { storageClassOptions() {
const storages = this.value.spec?.securityParameters?.cryptoOperation === ENCRYPT ? this.encryptedStorageClasses : this.nonEncryptedStorageClasses; const storages = this.value.spec?.securityParameters?.cryptoOperation === ENCRYPT ? this.encryptedStorageClasses : this.nonEncryptedStorageClasses;
const filteredStorages = this.value.thirdPartyStorageFeatureEnabled ? storages.filter((s) => !s.parameters?.backingImage) : storages
.filter((s) => !s.parameters?.backingImage && s.provisioner !== LVM_DRIVER) ;
return storages return filteredStorages
.filter((s) => !s.parameters?.backingImage)
.map((s) => { .map((s) => {
const label = s.isDefault ? `${ s.name } (${ this.t('generic.default') })` : s.name; const label = s.isDefault ? `${ s.name } (${ this.t('generic.default') })` : s.name;
@ -181,7 +183,9 @@ export default {
set(nue) { set(nue) {
this.value.metadata.annotations[HCI_ANNOTATIONS.STORAGE_CLASS] = nue; this.value.metadata.annotations[HCI_ANNOTATIONS.STORAGE_CLASS] = nue;
this.value.spec.targetStorageClassName = nue; if (this.value.thirdPartyStorageFeatureEnabled) {
this.value.spec.targetStorageClassName = nue;
}
} }
}, },
sourceImageOptions() { sourceImageOptions() {
@ -264,7 +268,7 @@ export default {
'storageClassName'(neu) { 'storageClassName'(neu) {
const storageClass = this.storages.find((s) => s.id === neu); const storageClass = this.storages.find((s) => s.id === neu);
if (storageClass) { if (storageClass && this.value.thirdPartyStorageFeatureEnabled) {
this.value.spec.backend = storageClass.isLonghornV1 ? 'backingimage' : 'cdi'; this.value.spec.backend = storageClass.isLonghornV1 ? 'backingimage' : 'cdi';
} }
} }

View File

@ -90,7 +90,7 @@ export default {
imagesOption() { imagesOption() {
return this.images.filter((c) => c.isReady).sort((a, b) => a.creationTimestamp > b.creationTimestamp ? -1 : 1).map( (I) => { return this.images.filter((c) => c.isReady).sort((a, b) => a.creationTimestamp > b.creationTimestamp ? -1 : 1).map( (I) => {
return { return {
label: `${ I.metadata.namespace }/${ I.spec.displayName } (${ I.imageStorageClass } / ${ I.virtualSize })`, label: this.imageOptionLabel(I),
value: I.id value: I.id
}; };
}); });
@ -116,6 +116,10 @@ export default {
}); });
}, },
thirdPartyStorageEnabled() {
return this.$store.getters['harvester-common/getFeatureEnabled']('thirdPartyStorage');
},
isLonghornV2() { isLonghornV2() {
return this.value.pvc?.isLonghornV2 || this.value.pvc?.storageClass?.isLonghornV2; return this.value.pvc?.isLonghornV2 || this.value.pvc?.storageClass?.isLonghornV2;
}, },
@ -131,7 +135,7 @@ export default {
diskSize() { diskSize() {
const size = this.value?.size || '0'; const size = this.value?.size || '0';
return `${ size.replace('Gi', '') } GiB`; return `${ size.replace('Gi', '') } GB`;
}, },
imageVirtualSizeInByte() { imageVirtualSizeInByte() {
@ -143,6 +147,10 @@ export default {
}, },
showDiskTooSmallError() { showDiskTooSmallError() {
if (!this.thirdPartyStorageEnabled ) {
return false;
}
return this.imageVirtualSizeInByte > this.diskSizeInByte; return this.imageVirtualSizeInByte > this.diskSizeInByte;
} }
}, },
@ -184,6 +192,15 @@ export default {
}, },
methods: { methods: {
imageOptionLabel(image) {
let label = `${ image.metadata.namespace }/${ image.spec.displayName }`;
if (this.thirdPartyStorageEnabled) {
label += ` (${ image.imageStorageClass } / ${ image.virtualSize })`;
}
return label;
},
update() { update() {
this.value.hasDiskError = this.showDiskTooSmallError; this.value.hasDiskError = this.showDiskTooSmallError;
this.$emit('update'); this.$emit('update');

View File

@ -77,4 +77,8 @@ export default class HciStorageClass extends StorageClass {
get volumeEncryptionFeatureEnabled() { get volumeEncryptionFeatureEnabled() {
return this.$rootGetters['harvester-common/getFeatureEnabled']('volumeEncryption'); return this.$rootGetters['harvester-common/getFeatureEnabled']('volumeEncryption');
} }
get thirdPartyStorageFeatureEnabled() {
return this.$rootGetters['harvester-common/getFeatureEnabled']('thirdPartyStorage');
}
} }

View File

@ -243,8 +243,8 @@ export default class HciVmImage extends HarvesterResource {
return formatSi(size, { return formatSi(size, {
increment: 1024, increment: 1024,
maxPrecision: 2, maxPrecision: 2,
suffix: 'iB', suffix: 'B',
firstSuffix: 'iB', firstSuffix: 'B',
}); });
} }
@ -258,8 +258,8 @@ export default class HciVmImage extends HarvesterResource {
return formatSi(virtualSize, { return formatSi(virtualSize, {
increment: 1024, increment: 1024,
maxPrecision: 2, maxPrecision: 2,
suffix: 'iB', suffix: 'B',
firstSuffix: 'iB', firstSuffix: 'B',
}); });
} }
@ -389,6 +389,10 @@ export default class HciVmImage extends HarvesterResource {
return this.$rootGetters['harvester-common/getFeatureEnabled']('volumeEncryption'); return this.$rootGetters['harvester-common/getFeatureEnabled']('volumeEncryption');
} }
get thirdPartyStorageFeatureEnabled() {
return this.$rootGetters['harvester-common/getFeatureEnabled']('thirdPartyStorage');
}
download() { download() {
window.location.href = this.links.download; window.location.href = this.links.download;
} }

View File

@ -1183,6 +1183,10 @@ export default class VirtVm extends HarvesterResource {
return this.$rootGetters['harvester-common/getFeatureEnabled']('efiPersistentState'); return this.$rootGetters['harvester-common/getFeatureEnabled']('efiPersistentState');
} }
get thirdPartyStorageFeatureEnabled() {
return this.$rootGetters['harvester-common/getFeatureEnabled']('thirdPartyStorage');
}
setInstanceLabels(val) { setInstanceLabels(val) {
if ( !this.spec?.template?.metadata?.labels ) { if ( !this.spec?.template?.metadata?.labels ) {
set(this, 'spec.template.metadata.labels', {}); set(this, 'spec.template.metadata.labels', {});