From c19341bec9905e4117295108b1ddb52c68bcb938 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Tue, 11 Nov 2025 11:46:43 +0800 Subject: [PATCH] feat: support for HotPlugNICs from Kubevirt (#582) (#594) * refactor: rename hotplug volume * feat: add hotplug NIC * feat: add hot unplug * refactor: rename NIC * feat: get latest status * feat: disable not ready options * feat: filter out system networks * refactor: update wordings --------- (cherry picked from commit f9bff21e840885a120679864a0ef312163bd48a7) Signed-off-by: Yi-Ya Chen Co-authored-by: Yiya Chen --- pkg/harvester/config/feature-flags.js | 3 +- .../kubevirt.io.virtualmachine/index.vue | 2 + .../dialog/HarvesterAddHotplugNic.vue | 212 ++++++++++++++++++ ...vue => HarvesterAddHotplugVolumeModal.vue} | 6 +- ...nplugVolume.vue => HarvesterHotUnplug.vue} | 50 ++++- .../VirtualMachineNetwork/index.vue | 117 +++++++--- .../VirtualMachineVolume/index.vue | 115 +++++----- pkg/harvester/l10n/en-us.yaml | 30 ++- ...cni.cncf.io.networkattachmentdefinition.js | 10 + .../models/kubevirt.io.virtualmachine.js | 41 +++- 10 files changed, 471 insertions(+), 115 deletions(-) create mode 100644 pkg/harvester/dialog/HarvesterAddHotplugNic.vue rename pkg/harvester/dialog/{HarvesterAddHotplugModal.vue => HarvesterAddHotplugVolumeModal.vue} (94%) rename pkg/harvester/dialog/{HarvesterUnplugVolume.vue => HarvesterHotUnplug.vue} (63%) diff --git a/pkg/harvester/config/feature-flags.js b/pkg/harvester/config/feature-flags.js index 906e6f0f..e50033ad 100644 --- a/pkg/harvester/config/feature-flags.js +++ b/pkg/harvester/config/feature-flags.js @@ -53,7 +53,8 @@ const FEATURE_FLAGS = { 'vmMachineTypeAuto', 'lhV2VolExpansion', 'l2VlanTrunkMode', - 'kubevirtMigration' + 'kubevirtMigration', + 'hotplugNic' ] }; diff --git a/pkg/harvester/detail/kubevirt.io.virtualmachine/index.vue b/pkg/harvester/detail/kubevirt.io.virtualmachine/index.vue index de924ebf..9f97bf4f 100644 --- a/pkg/harvester/detail/kubevirt.io.virtualmachine/index.vue +++ b/pkg/harvester/detail/kubevirt.io.virtualmachine/index.vue @@ -213,6 +213,7 @@ export default { const diskRows = this.getDiskRows(neu); this['diskRows'] = diskRows; + this['networkRows'] = this.getNetworkRows(neu, { fromTemplate: false, init: false }); }, deep: true } @@ -265,6 +266,7 @@ export default { diff --git a/pkg/harvester/dialog/HarvesterAddHotplugNic.vue b/pkg/harvester/dialog/HarvesterAddHotplugNic.vue new file mode 100644 index 00000000..aede3404 --- /dev/null +++ b/pkg/harvester/dialog/HarvesterAddHotplugNic.vue @@ -0,0 +1,212 @@ + + + + + diff --git a/pkg/harvester/dialog/HarvesterAddHotplugModal.vue b/pkg/harvester/dialog/HarvesterAddHotplugVolumeModal.vue similarity index 94% rename from pkg/harvester/dialog/HarvesterAddHotplugModal.vue rename to pkg/harvester/dialog/HarvesterAddHotplugVolumeModal.vue index accf9394..14dcfb2d 100644 --- a/pkg/harvester/dialog/HarvesterAddHotplugModal.vue +++ b/pkg/harvester/dialog/HarvesterAddHotplugVolumeModal.vue @@ -11,7 +11,7 @@ import { LabeledInput } from '@components/Form/LabeledInput'; import LabeledSelect from '@shell/components/form/LabeledSelect'; export default { - name: 'HotplugModal', + name: 'HotplugVolumeModal', emits: ['close'], @@ -90,7 +90,7 @@ export default { if (res._status === 200 || res._status === 204) { this.$store.dispatch('growl/success', { title: this.t('generic.notification.title.succeed'), - message: this.t('harvester.modal.hotplug.success', { diskName: this.diskName, vm: this.actionResource.nameDisplay }) + message: this.t('harvester.modal.hotplugVolume.success', { diskName: this.diskName, vm: this.actionResource.nameDisplay }) }, { root: true }); this.close(); @@ -122,7 +122,7 @@ export default { > diff --git a/pkg/harvester/dialog/HarvesterUnplugVolume.vue b/pkg/harvester/dialog/HarvesterHotUnplug.vue similarity index 63% rename from pkg/harvester/dialog/HarvesterUnplugVolume.vue rename to pkg/harvester/dialog/HarvesterHotUnplug.vue index dd72f8b8..cf3f0ea9 100644 --- a/pkg/harvester/dialog/HarvesterUnplugVolume.vue +++ b/pkg/harvester/dialog/HarvesterHotUnplug.vue @@ -1,13 +1,12 @@ @@ -129,17 +186,28 @@ export default { v-for="(row, i) in rows" :key="i" > - - -

{{ t('harvester.virtualMachine.network.title') }}

- +
+

+ {{ t('harvester.virtualMachine.network.title') }} +

+ + +
diff --git a/pkg/harvester/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/index.vue b/pkg/harvester/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/index.vue index 012cacd7..13c0221c 100644 --- a/pkg/harvester/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/index.vue +++ b/pkg/harvester/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/index.vue @@ -303,55 +303,57 @@ export default { v-for="(volume, i) in rows" :key="volume.id" > - - - -

- - - {{ t('harvester.virtualMachine.volume.edit') }} {{ headerFor(volume.source) }} - - - - +
+

+ - - - + + {{ t('harvester.virtualMachine.volume.edit') }} {{ headerFor(volume.source) }} + - - {{ headerFor(volume.source, !!volume?.volumeBackups) }} - -

+ + + + + + + + {{ headerFor(volume.source, !!volume?.volumeBackups) }} + +

+ + +