From 78d457f1d1d9781737b3999940d0bc54a05904e8 Mon Sep 17 00:00:00 2001 From: Valeriy Khorunzhin Date: Fri, 27 Feb 2026 11:47:09 +0300 Subject: [PATCH 1/3] fix Signed-off-by: Valeriy Khorunzhin --- .../pkg/controller/vm/internal/migrating.go | 9 +++++++++ .../vmop/migration/internal/handler/lifecycle.go | 2 +- .../vmsnapshot/internal/virtual_machine_ready.go | 9 +++++++++ 3 files changed, 19 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 2c52e6cbb7..3aa4f2ef02 100644 --- a/images/virtualization-artifact/pkg/controller/vm/internal/migrating.go +++ b/images/virtualization-artifact/pkg/controller/vm/internal/migrating.go @@ -280,6 +280,15 @@ 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, kvvmi *virtv1.VirtualMachineInstance) error { cb := conditions.NewConditionBuilder(vmcondition.TypeMigratable).Generation(vm.GetGeneration()) + fsFrozen, _ := conditions.GetCondition(vmcondition.TypeFilesystemFrozen, vm.Status.Conditions) + if fsFrozen.Status == metav1.ConditionTrue { + cb.Status(metav1.ConditionFalse). + Reason(vmcondition.ReasonNonMigratable). + Message("For the migration to proceed, the file system must be unfrozen.") + conditions.SetCondition(cb, &vm.Status.Conditions) + return nil + } + if kvvm != nil { liveMigratable := service.GetKVVMCondition(string(virtv1.VirtualMachineInstanceIsMigratable), kvvm.Status.Conditions) switch { diff --git a/images/virtualization-artifact/pkg/controller/vmop/migration/internal/handler/lifecycle.go b/images/virtualization-artifact/pkg/controller/vmop/migration/internal/handler/lifecycle.go index 390fb9069d..7bb9fb9964 100644 --- a/images/virtualization-artifact/pkg/controller/vmop/migration/internal/handler/lifecycle.go +++ b/images/virtualization-artifact/pkg/controller/vmop/migration/internal/handler/lifecycle.go @@ -383,7 +383,7 @@ func (h LifecycleHandler) canExecute(vmop *v1alpha2.VirtualMachineOperation, vm Generation(vmop.GetGeneration()). Reason(vmopcondition.ReasonOperationFailed). Status(metav1.ConditionFalse). - Message("VirtualMachine is not migratable, cannot be processed."), + Message(fmt.Sprintf("VirtualMachine is not migratable, cannot be processed: %s", migratable.Message)), &vmop.Status.Conditions) return false } diff --git a/images/virtualization-artifact/pkg/controller/vmsnapshot/internal/virtual_machine_ready.go b/images/virtualization-artifact/pkg/controller/vmsnapshot/internal/virtual_machine_ready.go index 9bd8cecda8..22defc6c51 100644 --- a/images/virtualization-artifact/pkg/controller/vmsnapshot/internal/virtual_machine_ready.go +++ b/images/virtualization-artifact/pkg/controller/vmsnapshot/internal/virtual_machine_ready.go @@ -82,6 +82,15 @@ func (h VirtualMachineReadyHandler) Handle(ctx context.Context, vmSnapshot *v1al return reconcile.Result{}, nil } + _, migratingConditionExists := conditions.GetCondition(vmcondition.TypeMigrating, vm.Status.Conditions) + if migratingConditionExists { + cb. + Status(metav1.ConditionFalse). + Reason(vmscondition.VirtualMachineNotReadyForSnapshotting). + Message("The virtual machine is migrating at the moment, so a snapshot cannot be taken.") + return reconcile.Result{}, nil + } + switch vm.Status.Phase { case v1alpha2.MachineRunning, v1alpha2.MachineStopped: // If the snapshotting condition is not found, it means that the vm is ready for snapshotting. From 7d334d9585f54a1f600de2adce1fc02f2d1b0d15 Mon Sep 17 00:00:00 2001 From: Valeriy Khorunzhin Date: Wed, 4 Mar 2026 16:06:24 +0300 Subject: [PATCH 2/3] frozen -> snapshotting Signed-off-by: Valeriy Khorunzhin --- .../pkg/controller/vm/internal/migrating.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/images/virtualization-artifact/pkg/controller/vm/internal/migrating.go b/images/virtualization-artifact/pkg/controller/vm/internal/migrating.go index 3aa4f2ef02..18c08a76df 100644 --- a/images/virtualization-artifact/pkg/controller/vm/internal/migrating.go +++ b/images/virtualization-artifact/pkg/controller/vm/internal/migrating.go @@ -280,11 +280,11 @@ 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, kvvmi *virtv1.VirtualMachineInstance) error { cb := conditions.NewConditionBuilder(vmcondition.TypeMigratable).Generation(vm.GetGeneration()) - fsFrozen, _ := conditions.GetCondition(vmcondition.TypeFilesystemFrozen, vm.Status.Conditions) - if fsFrozen.Status == metav1.ConditionTrue { + snapshotting, _ := conditions.GetCondition(vmcondition.TypeSnapshotting, vm.Status.Conditions) + if snapshotting.Status == metav1.ConditionTrue { cb.Status(metav1.ConditionFalse). Reason(vmcondition.ReasonNonMigratable). - Message("For the migration to proceed, the file system must be unfrozen.") + Message("Cannot migrate the machine while a snapshot is in progress.") conditions.SetCondition(cb, &vm.Status.Conditions) return nil } From bc0a8f7a65063ca7051d988ad328d8b5ab773b94 Mon Sep 17 00:00:00 2001 From: Valeriy Khorunzhin Date: Wed, 4 Mar 2026 16:18:04 +0300 Subject: [PATCH 3/3] message refactoring Signed-off-by: Valeriy Khorunzhin --- .../pkg/controller/vmsnapshot/internal/virtual_machine_ready.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/images/virtualization-artifact/pkg/controller/vmsnapshot/internal/virtual_machine_ready.go b/images/virtualization-artifact/pkg/controller/vmsnapshot/internal/virtual_machine_ready.go index 22defc6c51..e6e69e01be 100644 --- a/images/virtualization-artifact/pkg/controller/vmsnapshot/internal/virtual_machine_ready.go +++ b/images/virtualization-artifact/pkg/controller/vmsnapshot/internal/virtual_machine_ready.go @@ -87,7 +87,7 @@ func (h VirtualMachineReadyHandler) Handle(ctx context.Context, vmSnapshot *v1al cb. Status(metav1.ConditionFalse). Reason(vmscondition.VirtualMachineNotReadyForSnapshotting). - Message("The virtual machine is migrating at the moment, so a snapshot cannot be taken.") + Message("Snapshot cannot be taken: the virtual machine is currently migrating.") return reconcile.Result{}, nil }