From 0cecf90c21c172817ee17d03b6269efecf79ff2a Mon Sep 17 00:00:00 2001 From: Francesco Torchia Date: Tue, 24 Sep 2024 10:28:31 +0200 Subject: [PATCH] Rebase driver.longhorn.io Signed-off-by: Francesco Torchia --- .../provisioners/driver.longhorn.io_v1.vue | 8 +- .../provisioners/driver.longhorn.io_v2.vue | 122 ++++++++++++++++-- 2 files changed, 115 insertions(+), 15 deletions(-) diff --git a/pkg/harvester/edit/harvesterhci.io.storage/provisioners/driver.longhorn.io_v1.vue b/pkg/harvester/edit/harvesterhci.io.storage/provisioners/driver.longhorn.io_v1.vue index 984535f023..5393307025 100644 --- a/pkg/harvester/edit/harvesterhci.io.storage/provisioners/driver.longhorn.io_v1.vue +++ b/pkg/harvester/edit/harvesterhci.io.storage/provisioners/driver.longhorn.io_v1.vue @@ -10,12 +10,14 @@ import { clone } from '@shell/utils/object'; import { uniq } from '@shell/utils/array'; import { ENGINE_VERSION_V1 } from '../index.vue'; +// UI components for Longhorn storage class parameters const DEFAULT_PARAMETERS = [ 'numberOfReplicas', 'staleReplicaTimeout', 'diskSelector', 'nodeSelector', 'migratable', + 'encrypted', 'engineVersion', ]; @@ -29,7 +31,7 @@ const { } = CSI_SECRETS; export default { - name: 'DriverLonghornIO', + name: 'DriverLonghornIOV1', components: { KeyValue, @@ -70,12 +72,13 @@ export default { staleReplicaTimeout: '30', diskSelector: null, nodeSelector: null, + encrypted: 'false', migratable: 'true', engineVersion: ENGINE_VERSION_V1 }); } - return {}; + return { secrets: [] }; }, computed: { longhornNodes() { @@ -327,7 +330,6 @@ export default { :label="t('harvester.storage.secret')" :options="secretOptions" :mode="mode" - :options="migratableOptions" /> diff --git a/pkg/harvester/edit/harvesterhci.io.storage/provisioners/driver.longhorn.io_v2.vue b/pkg/harvester/edit/harvesterhci.io.storage/provisioners/driver.longhorn.io_v2.vue index 6b0f991c6f..fb0b21024a 100644 --- a/pkg/harvester/edit/harvesterhci.io.storage/provisioners/driver.longhorn.io_v2.vue +++ b/pkg/harvester/edit/harvesterhci.io.storage/provisioners/driver.longhorn.io_v2.vue @@ -3,23 +3,36 @@ import KeyValue from '@shell/components/form/KeyValue'; import LabeledSelect from '@shell/components/form/LabeledSelect'; import { LabeledInput } from '@components/Form/LabeledInput'; import RadioGroup from '@components/Form/Radio/RadioGroup'; - +import { SECRET, NAMESPACE, LONGHORN } from '@shell/config/types'; import { _CREATE, _VIEW } from '@shell/config/query-params'; -import { LONGHORN } from '@shell/config/types'; +import { CSI_SECRETS } from '@pkg/harvester/config/harvester-map'; import { clone } from '@shell/utils/object'; import { uniq } from '@shell/utils/array'; import { ENGINE_VERSION_V2 } from '../index.vue'; +// UI components for Longhorn storage class parameters const DEFAULT_PARAMETERS = [ 'numberOfReplicas', 'staleReplicaTimeout', 'diskSelector', 'nodeSelector', 'migratable', + 'encrypted', 'engineVersion', ]; +const { + CSI_PROVISIONER_SECRET_NAME, + CSI_PROVISIONER_SECRET_NAMESPACE, + CSI_NODE_PUBLISH_SECRET_NAME, + CSI_NODE_PUBLISH_SECRET_NAMESPACE, + CSI_NODE_STAGE_SECRET_NAME, + CSI_NODE_STAGE_SECRET_NAMESPACE +} = CSI_SECRETS; + export default { + name: 'DriverLonghornIOV2', + components: { KeyValue, LabeledSelect, @@ -42,6 +55,16 @@ export default { }, }, + async fetch() { + const inStore = this.$store.getters['currentProduct'].inStore; + + await this.$store.dispatch(`${ inStore }/findAll`, { type: NAMESPACE }); + + const allSecrets = await this.$store.dispatch(`${ inStore }/findAll`, { type: SECRET }); + + // only show non-system secret to user to select + this.secrets = allSecrets.filter(secret => secret.isSystem === false); + }, data() { if (this.realMode === _CREATE) { this.$set(this.value, 'parameters', { @@ -49,14 +72,14 @@ export default { staleReplicaTimeout: '30', diskSelector: null, nodeSelector: null, + encrypted: 'false', migratable: 'false', engineVersion: ENGINE_VERSION_V2 }); } - return {}; + return { secrets: [] }; }, - computed: { longhornNodes() { const inStore = this.$store.getters['currentProduct'].inStore; @@ -100,11 +123,29 @@ export default { }]; }, + secretOptions() { + return this.secrets.map(secret => secret.id); + }, + + volumeEncryptionOptions() { + return [{ + label: this.t('generic.yes'), + value: 'true' + }, { + label: this.t('generic.no'), + value: 'false' + }]; + }, + parameters: { get() { const parameters = clone(this.value?.parameters) || {}; - DEFAULT_PARAMETERS.map((key) => { + DEFAULT_PARAMETERS.forEach((key) => { + delete parameters[key]; + }); + + Object.values(CSI_SECRETS).forEach((key) => { delete parameters[key]; }); @@ -116,6 +157,46 @@ export default { } }, + volumeEncryption: { + set(neu) { + this.$set(this.value, 'parameters', { + ...this.value.parameters, + encrypted: neu + }); + }, + + get() { + return this.value?.parameters?.encrypted || 'false'; + } + }, + + secret: { + get() { + const selectedNs = this.value.parameters[CSI_PROVISIONER_SECRET_NAMESPACE]; + const selectedName = this.value.parameters[CSI_PROVISIONER_SECRET_NAME]; + + if (selectedNs && selectedName) { + return `${ selectedNs }/${ selectedName }`; + } + + return ''; + }, + + set(selectedSecret) { + const [namespace, name] = selectedSecret.split('/'); + + this.$set(this.value, 'parameters', { + ...this.value.parameters, + [CSI_PROVISIONER_SECRET_NAME]: name, + [CSI_NODE_PUBLISH_SECRET_NAME]: name, + [CSI_NODE_STAGE_SECRET_NAME]: name, + [CSI_PROVISIONER_SECRET_NAMESPACE]: namespace, + [CSI_NODE_PUBLISH_SECRET_NAMESPACE]: namespace, + [CSI_NODE_STAGE_SECRET_NAMESPACE]: namespace + }); + } + }, + nodeSelector: { get() { const nodeSelector = this.value?.parameters?.nodeSelector; @@ -224,15 +305,32 @@ export default { -
+
+ +
+
+ +
+
-