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 {
/>
+
+