From 28d3fab64a5d394eb655636d22d23f8e5ef67eb7 Mon Sep 17 00:00:00 2001 From: Francesco Torchia Date: Sun, 22 Sep 2024 16:11:04 +0200 Subject: [PATCH] Various enhancements - Add lvm driver addon - Add longhorn v2 engine in provisioner dropdowns - Save storage class parameters for longhorn - Decouple Storage class longhron params - Add create new option for LVM groups Signed-off-by: Francesco Torchia --- pkg/harvester/config/harvester-map.js | 3 +- pkg/harvester/config/labels-annotations.js | 3 +- .../HarvesterHostDisk.vue | 2 +- .../harvesterhci.io.host/HarvesterDisk.vue | 169 ++++++++++-- .../edit/harvesterhci.io.host/index.vue | 29 +- .../edit/harvesterhci.io.storage/index.vue | 103 +++---- ....vue => driver.longhorn.io_LonghornV1.vue} | 19 +- .../driver.longhorn.io_LonghornV2.vue | 253 ++++++++++++++++++ .../lvm.driver.harvesterhci.io.vue | 12 +- .../harvesterhci.io.virtualmachineimage.vue | 2 +- pkg/harvester/l10n/en-us.yaml | 10 +- .../harvester/storage.k8s.io.storageclass.js | 25 ++ shell/models/storage.k8s.io.storageclass.js | 2 - 13 files changed, 523 insertions(+), 109 deletions(-) rename pkg/harvester/edit/harvesterhci.io.storage/provisioners/{driver.longhorn.io.vue => driver.longhorn.io_LonghornV1.vue} (86%) create mode 100644 pkg/harvester/edit/harvesterhci.io.storage/provisioners/driver.longhorn.io_LonghornV2.vue diff --git a/pkg/harvester/config/harvester-map.js b/pkg/harvester/config/harvester-map.js index 3a685557afd..f2f00bed3d7 100644 --- a/pkg/harvester/config/harvester-map.js +++ b/pkg/harvester/config/harvester-map.js @@ -67,5 +67,6 @@ export const ADD_ONS = { NVIDIA_DRIVER_TOOLKIT_CONTROLLER: 'nvidia-driver-toolkit', RANCHER_LOGGING: 'rancher-logging', RANCHER_MONITORING: 'rancher-monitoring', - VM_IMPORT_CONTROLLER: 'vm-import-controller' + VM_IMPORT_CONTROLLER: 'vm-import-controller', + LVM_DRIVER: 'lvm.driver.harvesterhci.io' }; diff --git a/pkg/harvester/config/labels-annotations.js b/pkg/harvester/config/labels-annotations.js index 1a01034507f..67703c80c43 100644 --- a/pkg/harvester/config/labels-annotations.js +++ b/pkg/harvester/config/labels-annotations.js @@ -51,5 +51,6 @@ export const HCI = { PARENT_SRIOV_GPU: 'harvesterhci.io/parentSRIOVGPUDevice', VM_MAINTENANCE_MODE_STRATEGY: 'harvesterhci.io/maintain-mode-strategy', NODE_CPU_MANAGER_UPDATE_STATUS: 'harvesterhci.io/cpu-manager-update-status', - CPU_MANAGER: 'cpumanager' + CPU_MANAGER: 'cpumanager', + DISABLE_LONGHORN_V2_ENGINE: 'node.longhorn.io/disable-v2-data-engine' }; diff --git a/pkg/harvester/detail/harvesterhci.io.host/HarvesterHostDisk.vue b/pkg/harvester/detail/harvesterhci.io.host/HarvesterHostDisk.vue index 0a441a6045f..3a820f35fe4 100644 --- a/pkg/harvester/detail/harvesterhci.io.host/HarvesterHostDisk.vue +++ b/pkg/harvester/detail/harvesterhci.io.host/HarvesterHostDisk.vue @@ -91,7 +91,7 @@ export default { let labelKey = `harvester.storage.storageClass.longhorn.${ LONGHORN_VERSION_V1 }.label`; if (this.value?.blockDevice?.spec?.provisioner.longhorn) { - labelKey = `harvester.storage.storageClass.longhorn.${ this.value.blockDevice.spec.provisioner.engineVersion }.label`; + labelKey = `harvester.storage.storageClass.longhorn.${ this.value.blockDevice.spec.provisioner.longhorn.engineVersion }.label`; } if (this.value?.blockDevice?.spec?.provisioner.lvm) { diff --git a/pkg/harvester/edit/harvesterhci.io.host/HarvesterDisk.vue b/pkg/harvester/edit/harvesterhci.io.host/HarvesterDisk.vue index ac66a65b559..40c4f2d2c15 100644 --- a/pkg/harvester/edit/harvesterhci.io.host/HarvesterDisk.vue +++ b/pkg/harvester/edit/harvesterhci.io.host/HarvesterDisk.vue @@ -10,11 +10,16 @@ import { RadioGroup, RadioButton } from '@components/Form/Radio'; import HarvesterDisk from '../../mixins/harvester-disk'; import Tags from '../../components/DiskTags'; import { HCI } from '../../types'; +import { HCI as HCI_LABELS_ANNOTATIONS } from '@pkg/harvester/config/labels-annotations'; import { LONGHORN_SYSTEM } from './index'; import { LONGHORN_DRIVER, LONGHORN_VERSION_V1, LONGHORN_VERSION_V2 } from '@shell/models/persistentvolume'; -import { LVM_DRIVER } from '@shell/models/storage.k8s.io.storageclass'; +import { LVM_DRIVER } from '../../models/harvester/storage.k8s.io.storageclass'; +import ModalWithCard from '@shell/components/ModalWithCard'; +import { randomStr } from '@shell/utils/string'; +import { LONGHORN_V2_DATA_ENGINE } from './index.vue'; +import { _EDIT } from '@shell/config/query-params'; -const LONGHORN_V2_DATA_ENGINE = 'longhorn-system/v2-data-engine'; +const _NEW = '_NEW'; export default { components: { @@ -25,6 +30,7 @@ export default { Banner, RadioGroup, RadioButton, + ModalWithCard, Tags, }, @@ -59,30 +65,72 @@ export default { const inStore = this.$store.getters['currentProduct'].inStore; await allHash({ - csiDrivers: this.$store.dispatch(`${ inStore }/findAll`, { type: CSI_DRIVER }), - longhornV2DataEngine: this.$store.dispatch(`${ inStore }/find`, { type: LONGHORN.SETTINGS, id: LONGHORN_V2_DATA_ENGINE }), - lvmVolumeGroups: this.$store.dispatch(`${ inStore }/findAll`, { type: HCI.LVM_VOLUME_GROUP }), + csiDrivers: this.$store.dispatch(`${ inStore }/findAll`, { type: CSI_DRIVER }), + lvmVolumeGroups: this.$store.dispatch(`${ inStore }/findAll`, { type: HCI.LVM_VOLUME_GROUP }), }); }, + data() { + let provisioner = `${ this.value.provisioner || LONGHORN_DRIVER }`; + + if (provisioner === LONGHORN_DRIVER) { + provisioner = `${ provisioner }_${ this.value.provisionerVersion || LONGHORN_VERSION_V1 }`; + } + + return { + provisioner, + volumeGroupDialog: null, + randomStr: randomStr(10).toLowerCase(), + }; + }, + computed: { provisioners() { + const out = []; + const inStore = this.$store.getters['currentProduct'].inStore; const csiDrivers = this.$store.getters[`${ inStore }/all`](CSI_DRIVER) || []; - return csiDrivers.map((provisioner) => { - return { - label: this.provisionersLabelKeys[provisioner.name], - value: provisioner.name, - }; + csiDrivers.forEach(({ name }) => { + switch (name) { + case LONGHORN_DRIVER: + out.push({ + label: `harvester.storage.storageClass.longhorn.${ LONGHORN_VERSION_V1 }.label`, + value: `${ name }_${ LONGHORN_VERSION_V1 }`, + }); + + if (this.longhornSystemVersion === LONGHORN_VERSION_V2 || this.value.provisionerVersion === LONGHORN_VERSION_V2) { + out.push({ + label: `harvester.storage.storageClass.longhorn.${ LONGHORN_VERSION_V2 }.label`, + value: `${ name }_${ LONGHORN_VERSION_V2 }`, + disabled: this.forceLonghornV1 + }); + } + break; + case LVM_DRIVER: + out.push({ + label: 'harvester.storage.storageClass.lvm.label', + value: name, + }); + break; + } }); + + return out; }, lvmVolumeGroups() { const inStore = this.$store.getters['currentProduct'].inStore; const lvmVolumeGroups = this.$store.getters[`${ inStore }/all`](HCI.LVM_VOLUME_GROUP) || []; - return lvmVolumeGroups.filter(group => group.spec.nodeName === this.node.name).map(g => g.spec.vgName); + const out = lvmVolumeGroups.filter(group => group.spec.nodeName === this.node.name).map(g => g.spec.vgName); + + out.unshift({ + label: this.t('harvester.host.disk.lvmVolumeGroup.create'), + value: _NEW, + }); + + return out; }, targetDisk() { @@ -130,7 +178,7 @@ export default { }, isProvisioned() { - return this.blockDevice?.spec.fileSystem.provisioned; + return this.blockDevice?.spec?.fileSystem?.provisioned; }, forceFormattedDisabled() { @@ -197,30 +245,82 @@ export default { return this.blockDevice.isFormatting; }, - longhornVersion() { + longhornSystemVersion() { const inStore = this.$store.getters['currentProduct'].inStore; const v2DataEngine = this.$store.getters[`${ inStore }/byId`](LONGHORN.SETTINGS, LONGHORN_V2_DATA_ENGINE) || {}; return v2DataEngine.value === 'true' ? LONGHORN_VERSION_V2 : LONGHORN_VERSION_V1; }, + forceLonghornV1() { + return this.node?.labels[HCI_LABELS_ANNOTATIONS.DISABLE_LONGHORN_V2_ENGINE] === 'true'; + }, + isLvm() { return this.value.provisioner === LVM_DRIVER; }, + isLonghorn() { + return this.value.provisioner === LONGHORN_DRIVER; + }, + isLonghornV1() { - return this.value.provisioner === LONGHORN_DRIVER && this.longhornVersion === LONGHORN_VERSION_V1; + return this.value.provisioner === LONGHORN_DRIVER && (this.longhornSystemVersion === LONGHORN_VERSION_V1 || this.forceLonghornV1); }, - provisionersLabelKeys() { - return { - [LONGHORN_DRIVER]: `harvester.storage.storageClass.longhorn.${ this.longhornVersion }.label`, - [LVM_DRIVER]: 'harvester.storage.storageClass.lvm.label' - }; + provisionerTooltip() { + if ( + this.mode === _EDIT && + this.isLonghorn && + this.longhornSystemVersion === LONGHORN_VERSION_V2 && + this.forceLonghornV1 + ) { + return this.t('harvester.storage.storageClass.longhorn.versionTooltip'); + } + + return null; + } + }, + + watch: { + provisioner(value) { + this.randomStr = randomStr(10).toLowerCase(); + + const [provisioner, provisionerVersion] = value?.split('_'); + + this.value.provisioner = provisioner; + + if (provisioner === LONGHORN_DRIVER) { + this.value.provisionerVersion = provisionerVersion || LONGHORN_VERSION_V1; + } else { + delete this.value.provisionerVersion; + } }, + + 'value.lvmVolumeGroup'(neu) { + if (neu === _NEW) { + this.value.lvmVolumeGroup = null; + this.showCreateVolumeGroup(); + } + } }, methods: { + showCreateVolumeGroup() { + this.volumeGroupDialog = null; + this.$modal.show(this.randomStr); + }, + + hideCreateVolumeGroup() { + this.$modal.hide(this.randomStr); + }, + + saveCreateVolumeGroup(buttonCb) { + buttonCb(true); + this.value.lvmVolumeGroup = this.volumeGroupDialog; + this.hideCreateVolumeGroup(); + }, + update() { this.$emit('input', this.value); }, @@ -327,13 +427,14 @@ export default {
@@ -363,16 +464,38 @@ export default { + + + + + diff --git a/pkg/harvester/edit/harvesterhci.io.host/index.vue b/pkg/harvester/edit/harvesterhci.io.host/index.vue index 951b8395abf..50c79d8973b 100644 --- a/pkg/harvester/edit/harvesterhci.io.host/index.vue +++ b/pkg/harvester/edit/harvesterhci.io.host/index.vue @@ -29,12 +29,14 @@ import HarvesterDisk from './HarvesterDisk'; import HarvesterKsmtuned from './HarvesterKsmtuned'; import HarvesterSeeder from './HarvesterSeeder'; import Tags from '../../components/DiskTags'; -import { LONGHORN_DRIVER, LONGHORN_VERSION_V1 } from '@shell/models/persistentvolume'; -import { LVM_DRIVER } from '@shell/models/storage.k8s.io.storageclass'; +import { LONGHORN_DRIVER, LONGHORN_VERSION_V1, LONGHORN_VERSION_V2 } from '@shell/models/persistentvolume'; +import { LVM_DRIVER } from '../../models/harvester/storage.k8s.io.storageclass'; import isEqual from 'lodash/isEqual'; export const LONGHORN_SYSTEM = 'longhorn-system'; +export const LONGHORN_V2_DATA_ENGINE = 'longhorn-system/v2-data-engine'; + export default { name: 'HarvesterEditNode', components: { @@ -65,10 +67,11 @@ export default { const inStore = this.$store.getters['currentProduct'].inStore; const hash = { - longhornNodes: this.$store.dispatch(`${ inStore }/findAll`, { type: LONGHORN.NODES }), - blockDevices: this.$store.dispatch(`${ inStore }/findAll`, { type: HCI.BLOCK_DEVICE }), - addons: this.$store.dispatch(`${ inStore }/findAll`, { type: HCI.ADD_ONS }), - secrets: this.$store.dispatch(`${ inStore }/findAll`, { type: SECRET }), + longhornNodes: this.$store.dispatch(`${ inStore }/findAll`, { type: LONGHORN.NODES }), + blockDevices: this.$store.dispatch(`${ inStore }/findAll`, { type: HCI.BLOCK_DEVICE }), + addons: this.$store.dispatch(`${ inStore }/findAll`, { type: HCI.ADD_ONS }), + secrets: this.$store.dispatch(`${ inStore }/findAll`, { type: SECRET }), + longhornV2DataEngine: this.$store.dispatch(`${ inStore }/find`, { type: LONGHORN.SETTINGS, id: LONGHORN_V2_DATA_ENGINE }), }; if (this.$store.getters[`${ inStore }/schemaFor`](HCI.INVENTORY)) { @@ -97,7 +100,7 @@ export default { displayName: d?.displayName, forceFormatted: corrupted ? true : d?.spec?.fileSystem?.forceFormatted || false, provisioner: d?.spec?.provisioner?.lvm ? LVM_DRIVER : LONGHORN_DRIVER, - provisionerVersion: d?.spec?.provisioner?.longhorn?.engineVersion || LONGHORN_VERSION_V1, // todo get default from system version + provisionerVersion: d?.spec?.provisioner?.longhorn?.engineVersion || LONGHORN_VERSION_V1, lvmVolumeGroup: d?.spec?.provisioner?.lvm?.vgName, }; }); @@ -162,6 +165,13 @@ export default { return out; }, + longhornSystemVersion() { + const inStore = this.$store.getters['currentProduct'].inStore; + const v2DataEngine = this.$store.getters[`${ inStore }/byId`](LONGHORN.SETTINGS, LONGHORN_V2_DATA_ENGINE) || {}; + + return v2DataEngine.value === 'true' ? LONGHORN_VERSION_V2 : LONGHORN_VERSION_V1; + }, + longhornDisks() { const inStore = this.$store.getters['currentProduct'].inStore; const longhornNode = this.$store.getters[`${ inStore }/byId`](LONGHORN.NODES, `${ LONGHORN_SYSTEM }/${ this.value.id }`); @@ -193,7 +203,7 @@ export default { forceFormatted: blockDevice?.spec?.fileSystem?.forceFormatted || false, tags: diskSpec?.[key]?.tags || [], provisioner: blockDevice?.spec?.provisioner?.lvm ? LVM_DRIVER : LONGHORN_DRIVER, - provisionerVersion: blockDevice?.spec?.provisioner?.longhorn?.engineVersion || LONGHORN_VERSION_V1, // todo get default from system version + provisionerVersion: blockDevice?.spec?.provisioner?.longhorn?.engineVersion || LONGHORN_VERSION_V1, lvmVolumeGroup: blockDevice?.spec?.provisioner?.lvm?.vgName, }; }); @@ -331,7 +341,7 @@ export default { displayName: disk?.displayName, forceFormatted, provisioner: LONGHORN_DRIVER, - provisionerVersion: LONGHORN_VERSION_V1, // todo get default from system version + provisionerVersion: LONGHORN_VERSION_V1, lvmVolumeGroup: null, }); }, @@ -370,6 +380,7 @@ export default { break; case LVM_DRIVER: blockDevice.spec.provisioner = { lvm: { vgName: d.lvmVolumeGroup } }; + blockDevice.spec.provision = true; break; } diff --git a/pkg/harvester/edit/harvesterhci.io.storage/index.vue b/pkg/harvester/edit/harvesterhci.io.storage/index.vue index e3629fe30ff..63ce3235680 100644 --- a/pkg/harvester/edit/harvesterhci.io.storage/index.vue +++ b/pkg/harvester/edit/harvesterhci.io.storage/index.vue @@ -19,9 +19,9 @@ import { CSI_DRIVER } from '../../types'; import { allHash } from '@shell/utils/promise'; import { clone } from '@shell/utils/object'; import { LONGHORN_DRIVER, LONGHORN_VERSION_V1, LONGHORN_VERSION_V2 } from '@shell/models/persistentvolume'; -import { LVM_DRIVER } from '@shell/models/storage.k8s.io.storageclass'; +import { LVM_DRIVER } from '../../models/harvester/storage.k8s.io.storageclass'; -const LONGHORN_V2_DATA_ENGINE = 'longhorn-system/v2-data-engine'; +const LONGHORN_V2_DATA_ENGINE = 'longhorn-system/v2-data-engine'; export const LVM_TOPOLOGY_LABEL = 'topology.lvm.csi/node'; @@ -78,17 +78,28 @@ export default { this.$set(this.value, 'parameters', this.value.parameters || {}); this.$set(this.value, 'provisioner', this.value.provisioner || LONGHORN_DRIVER); + + if (this.value.provisioner === LONGHORN_DRIVER) { + this.$set(this.value.parameters, 'engineVersion', this.value.longhornVersion); + } + this.$set(this.value, 'allowVolumeExpansion', this.value.allowVolumeExpansion || allowVolumeExpansionOptions[0].value); this.$set(this.value, 'reclaimPolicy', this.value.reclaimPolicy || reclaimPolicyOptions[0].value); this.$set(this.value, 'volumeBindingMode', this.value.volumeBindingMode || volumeBindingModeOptions[0].value); + let provisioner = `${ this.value.provisioner || LONGHORN_DRIVER }`; + + if (provisioner === LONGHORN_DRIVER) { + provisioner = `${ provisioner }_${ this.value.longhornVersion }`; + } + return { reclaimPolicyOptions, allowVolumeExpansionOptions, volumeBindingModeOptions, mountOptions: [], - provisioner: LONGHORN_DRIVER, STORAGE_CLASS, + provisioner, allowedTopologies, defaultAddValue: { key: '', @@ -119,19 +130,37 @@ export default { return this.isCreate ? _CREATE : _VIEW; }, - provisionerWatch() { - return this.value.provisioner; - }, - provisioners() { - const csiDrivers = this.$store.getters[`${ this.inStore }/all`](CSI_DRIVER) || []; + const out = []; - return csiDrivers.map((provisioner) => { - return { - label: this.provisionersLabelKeys[provisioner.name], - value: provisioner.name, - }; + const inStore = this.$store.getters['currentProduct'].inStore; + const csiDrivers = this.$store.getters[`${ inStore }/all`](CSI_DRIVER) || []; + + csiDrivers.forEach(({ name }) => { + switch (name) { + case LONGHORN_DRIVER: + out.push({ + label: `harvester.storage.storageClass.longhorn.${ LONGHORN_VERSION_V1 }.label`, + value: `${ name }_${ LONGHORN_VERSION_V1 }`, + }); + + if (this.longhornSystemVersion === LONGHORN_VERSION_V2 || this.value.longhornVersion === LONGHORN_VERSION_V2) { + out.push({ + label: `harvester.storage.storageClass.longhorn.${ LONGHORN_VERSION_V2 }.label`, + value: `${ name }_${ LONGHORN_VERSION_V2 }`, + }); + } + break; + case LVM_DRIVER: + out.push({ + label: 'harvester.storage.storageClass.lvm.label', + value: name, + }); + break; + } }); + + return out; }, schema() { @@ -140,38 +169,21 @@ export default { return this.$store.getters[`${ inStore }/schemaFor`](STORAGE_CLASS); }, - provisionersLabelKeys() { - return { - [LONGHORN_DRIVER]: `harvester.storage.storageClass.longhorn.${ this.longhornVersion }.label`, - [LVM_DRIVER]: 'harvester.storage.storageClass.lvm.label' - }; - }, - - longhornVersion() { + longhornSystemVersion() { const inStore = this.$store.getters['currentProduct'].inStore; const v2DataEngine = this.$store.getters[`${ inStore }/byId`](LONGHORN.SETTINGS, LONGHORN_V2_DATA_ENGINE) || {}; return v2DataEngine.value === 'true' ? LONGHORN_VERSION_V2 : LONGHORN_VERSION_V1; }, - - isLonghornV2() { - return this.value.provisioner === LONGHORN_DRIVER && this.longhornVersion === LONGHORN_VERSION_V2; - }, - - isLvm() { - return this.value.provisioner === LVM_DRIVER; - }, }, watch: { - provisionerWatch() { - const parameters = {}; + provisioner(neu) { + const [provisioner, engineVersion] = neu?.split('_'); - if (this.isLonghornV2) { - parameters.migratable = false; - } + let parameters = {}; - if (!this.isLvm) { + if (provisioner === LVM_DRIVER) { const matchLabelExpressions = (this.value.allowedTopologies?.[0]?.matchLabelExpressions || []).filter(t => t.key !== LVM_TOPOLOGY_LABEL); if (matchLabelExpressions.length > 0) { @@ -181,11 +193,18 @@ export default { } } + this.$set(this.value, 'provisioner', provisioner); + + if (provisioner === LONGHORN_DRIVER) { + parameters = { engineVersion }; + } + + this.$set(this.value, 'allowVolumeExpansion', this.value.provisioner === LONGHORN_DRIVER); this.$set(this.value, 'parameters', parameters); } }, - created() { + created(neu) { this.registerBeforeHook(this.willSave, 'willSave'); }, @@ -198,11 +217,6 @@ export default { } }, - updateProvisioner(provisioner) { - this.$set(this.value, 'provisioner', provisioner); - this.$set(this.value, 'allowVolumeExpansion', provisioner === LONGHORN_DRIVER); - }, - willSave() { Object.keys(this.value.parameters).forEach((key) => { if (this.value.parameters[key] === null || this.value.parameters[key] === '') { @@ -259,7 +273,7 @@ export default { :register-before-hook="registerBeforeHook" /> diff --git a/pkg/harvester/edit/harvesterhci.io.storage/provisioners/driver.longhorn.io_LonghornV2.vue b/pkg/harvester/edit/harvesterhci.io.storage/provisioners/driver.longhorn.io_LonghornV2.vue new file mode 100644 index 00000000000..60a78d9f32f --- /dev/null +++ b/pkg/harvester/edit/harvesterhci.io.storage/provisioners/driver.longhorn.io_LonghornV2.vue @@ -0,0 +1,253 @@ + + + + diff --git a/pkg/harvester/edit/harvesterhci.io.storage/provisioners/lvm.driver.harvesterhci.io.vue b/pkg/harvester/edit/harvesterhci.io.storage/provisioners/lvm.driver.harvesterhci.io.vue index f20a2a23497..2f00234062a 100644 --- a/pkg/harvester/edit/harvesterhci.io.storage/provisioners/lvm.driver.harvesterhci.io.vue +++ b/pkg/harvester/edit/harvesterhci.io.storage/provisioners/lvm.driver.harvesterhci.io.vue @@ -77,7 +77,7 @@ export default { const inStore = this.$store.getters['currentProduct'].inStore; const nodes = this.$store.getters[`${ inStore }/all`](NODE) || []; - return nodes.map(n => n.name); + return nodes.filter(n => n.labels[LVM_TOPOLOGY_LABEL] === n.name).map(n => n.name); }, volumeGroups() { @@ -137,7 +137,7 @@ export default { > @@ -149,13 +149,7 @@ export default { :options="volumeGroupTypes" :mode="mode" :required="true" - > - - + /> Storage` page node: label: Node allowedTopologies: diff --git a/pkg/harvester/models/harvester/storage.k8s.io.storageclass.js b/pkg/harvester/models/harvester/storage.k8s.io.storageclass.js index 80dffc49df6..30fcf79411f 100644 --- a/pkg/harvester/models/harvester/storage.k8s.io.storageclass.js +++ b/pkg/harvester/models/harvester/storage.k8s.io.storageclass.js @@ -2,6 +2,9 @@ import { clone } from '@shell/utils/object'; import { HCI } from '../../types'; import StorageClass from '@shell/models/storage.k8s.io.storageclass'; import { PRODUCT_NAME as HARVESTER_PRODUCT } from '../../config/harvester'; +import { LONGHORN_DRIVER, LONGHORN_VERSION_V1 } from '@shell/models/persistentvolume'; + +export const LVM_DRIVER = 'lvm.driver.harvesterhci.io'; export default class HciStorageClass extends StorageClass { get detailLocation() { @@ -31,4 +34,26 @@ export default class HciStorageClass extends StorageClass { get parentNameOverride() { return this.$rootGetters['i18n/t'](`typeLabel."${ HCI.STORAGE }"`, { count: 1 })?.trim(); } + + get longhornVersion() { + if (this.provisioner === LONGHORN_DRIVER) { + return (this.parameters || {}).engineVersion || LONGHORN_VERSION_V1; + } + + return null; + } + + get provisionerDisplay() { + let key = ''; + + if (this.provisioner === LONGHORN_DRIVER) { + key = `harvester.storage.storageClass.longhorn.${ this.longhornVersion }.label`; + } + + if (this.provisioner === LVM_DRIVER) { + key = `harvester.storage.storageClass.lvm.label`; + } + + return this.$rootGetters['i18n/t'](key); + } } diff --git a/shell/models/storage.k8s.io.storageclass.js b/shell/models/storage.k8s.io.storageclass.js index df3e72696b0..7b38d2fc5a4 100644 --- a/shell/models/storage.k8s.io.storageclass.js +++ b/shell/models/storage.k8s.io.storageclass.js @@ -81,8 +81,6 @@ export const PROVISIONER_OPTIONS = [ } ]; -export const LVM_DRIVER = 'lvm.driver.harvesterhci.io'; - export default class extends SteveModel { get provisionerDisplay() { const option = PROVISIONER_OPTIONS.find(o => o.value === this.provisioner);