From 838792843b3eb75f4e55640c3f72000c4451069f Mon Sep 17 00:00:00 2001 From: Yaroslav Borbat Date: Wed, 25 Mar 2026 14:13:11 +0300 Subject: [PATCH] refactor(vm): set non migratable usb if firmware out of date and usb devices exists Signed-off-by: Yaroslav Borbat --- .../pkg/controller/vm/internal/migrating.go | 24 +++++++++++++++++++ .../pkg/controller/vm/vm_controller.go | 2 +- 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/images/virtualization-artifact/pkg/controller/vm/internal/migrating.go b/images/virtualization-artifact/pkg/controller/vm/internal/migrating.go index b7a4ba143a..6c3357680d 100644 --- a/images/virtualization-artifact/pkg/controller/vm/internal/migrating.go +++ b/images/virtualization-artifact/pkg/controller/vm/internal/migrating.go @@ -278,6 +278,9 @@ func (h *MigratingHandler) getVMOPCandidate(ctx context.Context, s state.Virtual } func (h *MigratingHandler) syncMigratable(ctx context.Context, s state.VirtualMachineState, vm *v1alpha2.VirtualMachine, kvvm *virtv1.VirtualMachine) error { + if h.setUSBNonMigratable(vm) { + return nil + } cb := conditions.NewConditionBuilder(vmcondition.TypeMigratable).Generation(vm.GetGeneration()) if kvvm != nil { @@ -345,3 +348,24 @@ func (h *MigratingHandler) syncMigratable(ctx context.Context, s state.VirtualMa func liveMigrationInProgress(migrationState *v1alpha2.VirtualMachineMigrationState) bool { return migrationState != nil && migrationState.StartTimestamp != nil && migrationState.EndTimestamp == nil } + +// TODO: Delete me after 1.7 version +func (h *MigratingHandler) setUSBNonMigratable(vm *v1alpha2.VirtualMachine) bool { + cond, _ := conditions.GetCondition(vmcondition.TypeFirmwareUpToDate, vm.Status.Conditions) + if cond.Status == metav1.ConditionTrue || cond.Reason != vmcondition.ReasonFirmwareOutOfDate.String() { + return false + } + + usbExists := len(vm.Spec.USBDevices) > 0 + if !usbExists { + return false + } + + cb := conditions.NewConditionBuilder(vmcondition.TypeMigratable). + Generation(vm.GetGeneration()). + Status(metav1.ConditionFalse). + Reason(vmcondition.ReasonNonMigratable). + Message("USB devices cannot be migratable on this virtualization version, firmware should be updated first. Please restart virtual machine or unplug usb devices and migrate.") + conditions.SetCondition(cb, &vm.Status.Conditions) + return true +} diff --git a/images/virtualization-artifact/pkg/controller/vm/vm_controller.go b/images/virtualization-artifact/pkg/controller/vm/vm_controller.go index 6a4e231a88..ff78dd16d2 100644 --- a/images/virtualization-artifact/pkg/controller/vm/vm_controller.go +++ b/images/virtualization-artifact/pkg/controller/vm/vm_controller.go @@ -80,8 +80,8 @@ func SetupController( internal.NewSyncPowerStateHandler(client, recorder), internal.NewSyncMetadataHandler(client), internal.NewLifeCycleHandler(client, recorder), - internal.NewMigratingHandler(migrateVolumesService), internal.NewFirmwareHandler(firmwareImage), + internal.NewMigratingHandler(migrateVolumesService), internal.NewEvictHandler(), internal.NewStatisticHandler(client), }