diff --git a/pkg/harvester/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/index.vue b/pkg/harvester/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/index.vue index 22be4c10ef3..b507c8c1231 100644 --- a/pkg/harvester/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/index.vue +++ b/pkg/harvester/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/index.vue @@ -8,7 +8,7 @@ import { LabeledInput } from '@components/Form/LabeledInput'; import LabeledSelect from '@shell/components/form/LabeledSelect'; import ModalWithCard from '@shell/components/ModalWithCard'; -import { PVC, STORAGE_CLASS } from '@shell/config/types'; +import { PVC } from '@shell/config/types'; import { HCI } from '../../../types'; import { clone } from '@shell/utils/object'; import { removeObject } from '@shell/utils/array'; @@ -172,10 +172,7 @@ export default { }; if (type === SOURCE_TYPE.NEW) { - const inStore = this.$store.getters['currentProduct'].inStore; - const defaultStorage = this.$store.getters[`${ inStore }/all`](STORAGE_CLASS).find( O => O.isDefault); - - neu.storageClassName = defaultStorage?.metadata?.name || 'longhorn'; + neu.storageClassName = this.defaultStorageClass?.metadata?.name || 'longhorn'; } this.rows.push(neu); diff --git a/pkg/harvester/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/volume.vue b/pkg/harvester/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/volume.vue index 68a1404dace..5e86127a910 100644 --- a/pkg/harvester/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/volume.vue +++ b/pkg/harvester/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/volume.vue @@ -11,6 +11,8 @@ import { VOLUME_TYPE, InterfaceOption } from '../../../../config/harvester-map'; import { _VIEW } from '@shell/config/query-params'; import LabelValue from '@shell/components/LabelValue'; import { ucFirst } from '@shell/utils/string'; +import { LVM_DRIVER } from '../../../../models/harvester/storage.k8s.io.storageclass'; +import { DATA_ENGINE_V2 } from '../../../../edit/harvesterhci.io.storage/index.vue'; export default { name: 'HarvesterEditVolume', @@ -85,10 +87,12 @@ export default { return !this.value.newCreateId && this.isEdit && this.isVirtualType; }, - storageClassOptions() { - const storages = this.$store.getters[`harvester/all`](STORAGE_CLASS) || []; + storageClasses() { + return this.$store.getters[`harvester/all`](STORAGE_CLASS) || []; + }, - const out = storages.filter(s => !s.parameters?.backingImage).map((s) => { + storageClassOptions() { + return this.storageClasses.filter(s => !s.parameters?.backingImage).map((s) => { const label = s.isDefault ? `${ s.name } (${ this.t('generic.default') })` : s.name; return { @@ -96,12 +100,21 @@ export default { value: s.name, }; }) || []; - - return out; }, }, watch: { + 'value.storageClassName': { + immediate: true, + handler(neu) { + const storageClass = this.storageClasses.find(sc => sc.name === neu); + const provisioner = storageClass?.provisioner; + const engine = storageClass?.parameters?.dataEngine; + + this.value.accessMode = provisioner === LVM_DRIVER || engine === DATA_ENGINE_V2 ? 'ReadWriteOnce' : 'ReadWriteMany'; + } + }, + 'value.type'(neu) { if (neu === 'cd-rom') { this.$set(this.value, 'bus', 'sata'); diff --git a/pkg/harvester/mixins/harvester-vm/index.js b/pkg/harvester/mixins/harvester-vm/index.js index bc49bf410a1..7793258ac0b 100644 --- a/pkg/harvester/mixins/harvester-vm/index.js +++ b/pkg/harvester/mixins/harvester-vm/index.js @@ -25,6 +25,9 @@ import { HCI as HCI_ANNOTATIONS } from '@pkg/harvester/config/labels-annotations import impl, { QGA_JSON, USB_TABLET } from './impl'; import { uniq } from '@shell/utils/array'; import { parseVolumeClaimTemplates } from '../../utils/vm'; +import { LONGHORN_VERSION_V1, LONGHORN_VERSION_V2 } from '@shell/models/persistentvolume'; + +const LONGHORN_V2_DATA_ENGINE = 'longhorn-system/v2-data-engine'; export const MANAGEMENT_NETWORK = 'management Network'; @@ -100,6 +103,7 @@ export default { vms: this.$store.dispatch(`${ inStore }/findAll`, { type: HCI.VM }), secrets: this.$store.dispatch(`${ inStore }/findAll`, { type: SECRET }), addons: this.$store.dispatch(`${ inStore }/findAll`, { type: HCI.ADD_ONS }), + longhornV2Engine: this.$store.dispatch(`${ inStore }/find`, { type: LONGHORN.SETTINGS, id: LONGHORN_V2_DATA_ENGINE }), }; if (this.$store.getters[`${ inStore }/schemaFor`](NODE)) { @@ -241,7 +245,7 @@ export default { defaultStorageClass() { const defaultStorage = this.$store.getters[`${ this.inStore }/all`](STORAGE_CLASS).find( O => O.isDefault); - return defaultStorage?.metadata?.name || 'longhorn'; + return defaultStorage; }, storageClassSetting() { @@ -254,6 +258,12 @@ export default { } }, + longhornSystemVersion() { + const v2DataEngine = this.$store.getters[`${ this.inStore }/byId`](LONGHORN.SETTINGS, LONGHORN_V2_DATA_ENGINE) || {}; + + return v2DataEngine.value === 'true' ? LONGHORN_VERSION_V2 : LONGHORN_VERSION_V1; + }, + customVolumeMode() { return this.storageClassSetting.volumeMode || 'Block'; }, @@ -445,7 +455,7 @@ export default { id: randomStr(5), source: SOURCE_TYPE.IMAGE, name: 'disk-0', - accessMode: 'ReadWriteMany', + accessMode: this.longhornSystemVersion === LONGHORN_VERSION_V2 ? 'ReadWriteOnce' : 'ReadWriteMany', bus, volumeName: '', size,