From 176946e5e9650c335f5b4b7ef5ef02aa8039856e Mon Sep 17 00:00:00 2001 From: "andy.lee" Date: Tue, 11 Feb 2025 14:48:07 +0800 Subject: [PATCH 1/5] fix: unable to create new sshkey in VM create page Signed-off-by: andy.lee --- .../edit/kubevirt.io.virtualmachine/VirtualMachineSSHKey.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/harvester/edit/kubevirt.io.virtualmachine/VirtualMachineSSHKey.vue b/pkg/harvester/edit/kubevirt.io.virtualmachine/VirtualMachineSSHKey.vue index a94b2fb6..55a35f01 100644 --- a/pkg/harvester/edit/kubevirt.io.virtualmachine/VirtualMachineSSHKey.vue +++ b/pkg/harvester/edit/kubevirt.io.virtualmachine/VirtualMachineSSHKey.vue @@ -249,7 +249,7 @@ export default { :searchable="searchable" :disabled="disabled" :options="sshOption" - @update:value="update" + @input="update" /> Date: Mon, 10 Feb 2025 16:44:36 +0800 Subject: [PATCH 2/5] add network type in storage-network setting Signed-off-by: andy.lee --- .../components/settings/storage-network.vue | 85 ++++++++++++++++++- pkg/harvester/config/feature-flags.js | 3 +- pkg/harvester/config/settings.ts | 4 +- pkg/harvester/config/types.js | 5 ++ 4 files changed, 93 insertions(+), 4 deletions(-) diff --git a/pkg/harvester/components/settings/storage-network.vue b/pkg/harvester/components/settings/storage-network.vue index c843480d..5da629b9 100644 --- a/pkg/harvester/components/settings/storage-network.vue +++ b/pkg/harvester/components/settings/storage-network.vue @@ -12,6 +12,9 @@ import { NODE } from '@shell/config/types'; import { HCI } from '../../types'; import { DOC } from '../../config/doc-links'; import { docLink } from '../../utils/feature-flags'; +import { NETWORK_TYPE } from '../../config/types'; + +const { L2VLAN, UNTAGGED } = NETWORK_TYPE; export default { name: 'HarvesterEditStorageNetwork', @@ -57,11 +60,14 @@ export default { data() { let parsedDefaultValue = {}; let openVlan = false; + let networkType = L2VLAN; try { parsedDefaultValue = JSON.parse(this.value.value); + networkType = 'vlan' in parsedDefaultValue ? L2VLAN : UNTAGGED; // backend doesn't provide networkType, so we check if vlan is provided instead openVlan = true; } catch (error) { + networkType = L2VLAN; parsedDefaultValue = { vlan: '', clusterNetwork: '', @@ -73,6 +79,7 @@ export default { return { openVlan, + networkType, errors: [], exclude, parsedDefaultValue, @@ -87,16 +94,35 @@ export default { }, computed: { + showVlan() { + return this.networkType === L2VLAN; + }, + networkTypes() { + const types = [L2VLAN]; + + if (this.unTaggedNetworkSettingEnabled) { + types.push(UNTAGGED); + } + + return types; + }, storageNetworkExampleLink() { const version = this.$store.getters['harvester-common/getServerVersion'](); return docLink(DOC.STORAGE_NETWORK_EXAMPLE, version); }, + + unTaggedNetworkSettingEnabled() { + return this.$store.getters['harvester-common/getFeatureEnabled']('unTaggedNetworkSetting'); + }, + clusterNetworkOptions() { const inStore = this.$store.getters['currentProduct'].inStore; const clusterNetworks = this.$store.getters[`${ inStore }/all`](HCI.CLUSTER_NETWORK) || []; + // untaggedNetwork filter out mgmt cluster network + const clusterNetworksOptions = this.networkType === UNTAGGED ? clusterNetworks.filter((net) => net.id !== 'mgmt') : clusterNetworks; - return clusterNetworks.map((n) => { + return clusterNetworksOptions.map((n) => { const disabled = !n.isReadyForStorageNetwork; return { @@ -108,7 +134,50 @@ export default { }, }, + watch: { + networkType: { + handler(neu) { + this.parsedDefaultValue.clusterNetwork = ''; + + if (neu === L2VLAN) { + this.parsedDefaultValue.vlan = ''; + } else { + delete this.parsedDefaultValue.vlan; + } + }, + deep: true + } + }, + methods: { + inputVlan(neu) { + if (neu === '') { + this.parsedDefaultValue.vlan = ''; + + return; + } + const newValue = Number(neu); + + if (newValue > 4094) { + this.parsedDefaultValue.vlan = 4094; + } else if (newValue < 1) { + this.parsedDefaultValue.vlan = 1; + } else { + this.parsedDefaultValue.vlan = newValue; + } + }, + + useDefault() { + this.openVlan = false; + this.networkType = L2VLAN; + this.parsedDefaultValue = { + vlan: '', + clusterNetwork: '', + range: '', + exclude: [] + }; + }, + update() { const exclude = this.exclude.filter((ip) => ip); @@ -138,7 +207,7 @@ export default { errors.push(this.t('harvester.setting.storageNetwork.range.invalid', null, true)); } - if (!this.parsedDefaultValue.vlan) { + if (this.networkType === L2VLAN && !this.parsedDefaultValue.vlan) { errors.push(this.t('validation.required', { key: this.t('harvester.setting.storageNetwork.vlan') }, true)); } @@ -191,13 +260,25 @@ export default { />
+ + Date: Mon, 10 Feb 2025 16:45:48 +0800 Subject: [PATCH 3/5] fix number of IP formula Signed-off-by: andy.lee --- pkg/harvester/l10n/en-us.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/harvester/l10n/en-us.yaml b/pkg/harvester/l10n/en-us.yaml index 965373e5..f24a9dd1 100644 --- a/pkg/harvester/l10n/en-us.yaml +++ b/pkg/harvester/l10n/en-us.yaml @@ -1027,7 +1027,7 @@ harvester: invalid: '"Exclude list" is invalid.' addIp: Add Exclude IP warning: 'WARNING:
Any change to storage-network requires shutting down all virtual machines before applying this setting.
Users have to ensure the cluster network is configured and VLAN Configuration will cover all nodes and ensure the network connectivity is working and expected in all nodes.' - tip: 'Specify an IP range in the IPv4 CIDR format. Number of IPs Required = Number of Nodes * 4 + Number of Disks * 2 + Number of Images to Download/Upload . For more information about storage network settings, see the documentation.' + tip: 'Specify an IP range in the IPv4 CIDR format. Number of IPs Required = Number of Nodes * 2 + Number of Disks * 2 + Number of Images to Download/Upload . For more information about storage network settings, see the documentation.' vmForceDeletionPolicy: period: Period ratio : Ratio From 5f76da4629136344e06b7a3b1d62e5e59599dfff Mon Sep 17 00:00:00 2001 From: "andy.lee" Date: Mon, 10 Feb 2025 16:54:09 +0800 Subject: [PATCH 4/5] extract network_type to config/types Signed-off-by: andy.lee --- .../harvesterhci.io.networkattachmentdefinition.vue | 11 +++++++---- .../k8s.cni.cncf.io.networkattachmentdefinition.js | 7 +++++-- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/pkg/harvester/edit/harvesterhci.io.networkattachmentdefinition.vue b/pkg/harvester/edit/harvesterhci.io.networkattachmentdefinition.vue index cbfe66a5..b5c3a393 100644 --- a/pkg/harvester/edit/harvesterhci.io.networkattachmentdefinition.vue +++ b/pkg/harvester/edit/harvesterhci.io.networkattachmentdefinition.vue @@ -11,6 +11,9 @@ import { HCI as HCI_LABELS_ANNOTATIONS } from '@pkg/harvester/config/labels-anno import CreateEditView from '@shell/mixins/create-edit-view'; import { allHash } from '@shell/utils/promise'; import { HCI } from '../types'; +import { NETWORK_TYPE } from '../config/types'; + +const { L2VLAN, UNTAGGED } = NETWORK_TYPE; const AUTO = 'auto'; const MANUAL = 'manual'; @@ -48,7 +51,7 @@ export default { config.bridge = config.bridge.slice(0, -3); } - const type = this.value.vlanType || 'L2VlanNetwork' ; + const type = this.value.vlanType || L2VLAN ; return { config, @@ -101,15 +104,15 @@ export default { }, networkType() { - return ['L2VlanNetwork', 'UntaggedNetwork']; + return [L2VLAN, UNTAGGED]; }, isUntaggedNetwork() { if (this.isView) { - return this.value.vlanType === 'UntaggedNetwork'; + return this.value.vlanType === UNTAGGED; } - return this.type === 'UntaggedNetwork'; + return this.type === UNTAGGED; } }, diff --git a/pkg/harvester/models/k8s.cni.cncf.io.networkattachmentdefinition.js b/pkg/harvester/models/k8s.cni.cncf.io.networkattachmentdefinition.js index a916386c..351e6017 100644 --- a/pkg/harvester/models/k8s.cni.cncf.io.networkattachmentdefinition.js +++ b/pkg/harvester/models/k8s.cni.cncf.io.networkattachmentdefinition.js @@ -1,5 +1,8 @@ import SteveModel from '@shell/plugins/steve/steve-class'; import { HCI } from '@shell/config/labels-annotations'; +import { NETWORK_TYPE } from '../config/types'; + +const { UNTAGGED } = NETWORK_TYPE; export default class NetworkAttachmentDef extends SteveModel { applyDefaults() { @@ -42,7 +45,7 @@ export default class NetworkAttachmentDef extends SteveModel { } get vlanId() { - return this.vlanType === 'UntaggedNetwork' ? 'N/A' : this.parseConfig.vlan; + return this.vlanType === UNTAGGED ? 'N/A' : this.parseConfig.vlan; } get customValidationRules() { @@ -65,7 +68,7 @@ export default class NetworkAttachmentDef extends SteveModel { const route = annotations[HCI.NETWORK_ROUTE]; let config = {}; - if (this.vlanType === 'UntaggedNetwork') { + if (this.vlanType === UNTAGGED) { return 'N/A'; } From fc09e030a08fc1fa3d0510c576d9b044cbdb0740 Mon Sep 17 00:00:00 2001 From: "andy.lee" Date: Tue, 11 Feb 2025 14:56:17 +0800 Subject: [PATCH 5/5] update feature flag Signed-off-by: andy.lee --- pkg/harvester/components/settings/storage-network.vue | 6 +++--- pkg/harvester/config/feature-flags.js | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/pkg/harvester/components/settings/storage-network.vue b/pkg/harvester/components/settings/storage-network.vue index 5da629b9..57ffc017 100644 --- a/pkg/harvester/components/settings/storage-network.vue +++ b/pkg/harvester/components/settings/storage-network.vue @@ -100,7 +100,7 @@ export default { networkTypes() { const types = [L2VLAN]; - if (this.unTaggedNetworkSettingEnabled) { + if (this.untaggedNetworkSettingEnabled) { types.push(UNTAGGED); } @@ -112,8 +112,8 @@ export default { return docLink(DOC.STORAGE_NETWORK_EXAMPLE, version); }, - unTaggedNetworkSettingEnabled() { - return this.$store.getters['harvester-common/getFeatureEnabled']('unTaggedNetworkSetting'); + untaggedNetworkSettingEnabled() { + return this.$store.getters['harvester-common/getFeatureEnabled']('untaggedNetworkSetting'); }, clusterNetworkOptions() { diff --git a/pkg/harvester/config/feature-flags.js b/pkg/harvester/config/feature-flags.js index 5b5ef625..3edbd7bf 100644 --- a/pkg/harvester/config/feature-flags.js +++ b/pkg/harvester/config/feature-flags.js @@ -49,7 +49,7 @@ const featuresV142 = [ const featuresV150 = [ ...featuresV142, 'tpmPersistentState', - 'unTaggedNetworkSetting' + 'untaggedNetworkSetting' ]; export const RELEASE_FEATURES = {