diff --git a/pkg/harvester/config/harvester-map.js b/pkg/harvester/config/harvester-map.js
index 3a685557af..f2f00bed3d 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 19bc9f6edb..6767cf6733 100644
--- a/pkg/harvester/config/labels-annotations.js
+++ b/pkg/harvester/config/labels-annotations.js
@@ -49,5 +49,6 @@ export const HCI = {
NODE_NTP_SYNC_STATUS: 'node.harvesterhci.io/ntp-service',
PARENT_SRIOV: 'harvesterhci.io/parent-sriov-network-device',
PARENT_SRIOV_GPU: 'harvesterhci.io/parentSRIOVGPUDevice',
- VM_MAINTENANCE_MODE_STRATEGY: 'harvesterhci.io/maintain-mode-strategy'
+ VM_MAINTENANCE_MODE_STRATEGY: 'harvesterhci.io/maintain-mode-strategy',
+ 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 0a441a6045..3a820f35fe 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 ac66a65b55..9b2d6a994d 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,
},
@@ -60,29 +66,71 @@ export default {
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 }),
});
},
+ 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,80 @@ 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;
+ }
},
+
+ '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 +425,14 @@ export default {
{}"
/>
@@ -363,16 +462,38 @@ export default {
{}"
/>
+
+
+ {{ t('harvester.host.disk.lvmVolumeGroup.label') }}
+
+
+
+ {}"
+ />
+
+
diff --git a/pkg/harvester/edit/harvesterhci.io.host/index.vue b/pkg/harvester/edit/harvesterhci.io.host/index.vue
index 951b8395ab..50c79d8973 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 e3629fe30f..66a49cf86e 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 0000000000..60a78d9f32
--- /dev/null
+++ b/pkg/harvester/edit/harvesterhci.io.storage/provisioners/driver.longhorn.io_LonghornV2.vue
@@ -0,0 +1,253 @@
+
+
+
+
+
+
+
+
+
+ {{ t('harvester.storage.parameters.nodeSelector.no-options', null, true) }}
+
+
+
+
+
+
+
+
+ {{ t('harvester.storage.parameters.diskSelector.no-options', null, true) }}
+
+
+
+
+
+
+
+
+
+
+
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 f20a2a2349..fdc549f092 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 {
>
- {{ t('harvester.storage.parameters.diskSelector.no-options', null, true) }}
+ {{ t('harvester.storage.parameters.lvmVolumeGroup.no-options', null, true) }}
@@ -149,13 +149,7 @@ export default {
:options="volumeGroupTypes"
:mode="mode"
:required="true"
- >
-
-
- {{ t('harvester.storage.parameters.nodeSelector.no-options', null, 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 80dffc49df..1effc40256 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 df3e72696b..7b38d2fc5a 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);