diff --git a/pkg/harvester/config/labels-annotations.js b/pkg/harvester/config/labels-annotations.js index 0dd01da0..e52e577e 100644 --- a/pkg/harvester/config/labels-annotations.js +++ b/pkg/harvester/config/labels-annotations.js @@ -50,6 +50,7 @@ export const HCI = { STORAGE_NETWORK: 'storage-network.settings.harvesterhci.io', ADDON_EXPERIMENTAL: 'addon.harvesterhci.io/experimental', VOLUME_ERROR: 'longhorn.io/volume-scheduling-error', + VOLUME_FOR_VM: 'harvesterhci.io/volumeForVirtualMachine', KVM_AMD_CPU: 'cpu-feature.node.kubevirt.io/svm', KVM_INTEL_CPU: 'cpu-feature.node.kubevirt.io/vmx', NODE_MANUFACTURER: 'manufacturer', diff --git a/pkg/harvester/config/types.js b/pkg/harvester/config/types.js index d07bacc9..552f9361 100644 --- a/pkg/harvester/config/types.js +++ b/pkg/harvester/config/types.js @@ -7,3 +7,8 @@ export const NETWORK_TYPE = { L2VLAN: 'L2VlanNetwork', UNTAGGED: 'UntaggedNetwork' }; + +export const VOLUME_MODE = { + BLOCK: 'Block', + FILE_SYSTEM: 'Filesystem' +}; diff --git a/pkg/harvester/edit/harvesterhci.io.volume.vue b/pkg/harvester/edit/harvesterhci.io.volume.vue index f9e36d84..ad93ce1c 100644 --- a/pkg/harvester/edit/harvesterhci.io.volume.vue +++ b/pkg/harvester/edit/harvesterhci.io.volume.vue @@ -22,6 +22,7 @@ import { HCI, VOLUME_SNAPSHOT } from '../types'; import { LVM_DRIVER } from '../models/harvester/storage.k8s.io.storageclass'; import { DATA_ENGINE_V2 } from '../models/harvester/persistentvolumeclaim'; import { GIBIBYTE } from '../utils/unit'; +import { VOLUME_MODE } from '@pkg/harvester/config/types'; export default { name: 'HarvesterVolume', @@ -73,7 +74,8 @@ export default { data() { if (this.mode === _CREATE) { - this.value.spec.volumeMode = 'Block'; + // default volumeMode to Block + this.value.spec.volumeMode = VOLUME_MODE.BLOCK; this.value.spec.accessModes = ['ReadWriteMany']; } @@ -126,6 +128,10 @@ export default { return InterfaceOption; }, + volumeModeOptions() { + return Object.values(VOLUME_MODE); + }, + imageOption() { return sortBy( this.images @@ -179,6 +185,25 @@ export default { return this.$store.getters[`${ inStore }/all`](STORAGE_CLASS); }, + isLonghornStorageClass() { + const selectedSC = this.storageClasses.find((sc) => sc.name === this.value?.spec?.storageClassName) || {}; + + return selectedSC && selectedSC.isLonghorn; + }, + + showVolumeMode() { + // we won't let user choose volumeMode if source = vmimage + if (!this.value.thirdPartyStorageFeatureEnabled || this.isVMImage || !!this.value?.spec?.storageClassName === false) { + return false; + } + + if (this.isLonghornStorageClass) { + return false; + } + + return true; + }, + storageClassOptions() { return this.storageClasses.filter((s) => !s.parameters?.backingImage).map((s) => { const label = s.isDefault ? `${ s.name } (${ this.t('generic.default') })` : s.name; @@ -237,7 +262,43 @@ export default { } }, + watch: { + 'source'(neu) { + if (neu === 'url') { + this.setBlockVolumeMode(); + this.deleteVolumeForVmAnnotation(); + } + }, + 'value.spec.storageClassName'() { + if (this.isLonghornStorageClass) { + this.setBlockVolumeMode(); + this.deleteVolumeForVmAnnotation(); + } + }, + 'value.spec.volumeMode'(neu) { + if (neu === VOLUME_MODE.FILE_SYSTEM) { + this.setVolumeForVmAnnotation(); + } else if (neu === VOLUME_MODE.BLOCK ) { + this.deleteVolumeForVmAnnotation(); + } + } + }, + methods: { + setBlockVolumeMode() { + this.value.spec.volumeMode = VOLUME_MODE.BLOCK; + }, + + setVolumeForVmAnnotation() { + this.value.setAnnotation(HCI_ANNOTATIONS.VOLUME_FOR_VM, 'true'); + }, + + deleteVolumeForVmAnnotation() { + if (this.value?.metadata?.annotations?.[HCI_ANNOTATIONS.VOLUME_FOR_VM]) { + delete this.value.metadata.annotations[HCI_ANNOTATIONS.VOLUME_FOR_VM]; + } + }, + getAccessMode() { if (!this.longhornV2LVMSupport) { return ['ReadWriteMany']; @@ -359,7 +420,7 @@ export default { /> + +