diff --git a/images/virtualization-artifact/pkg/controller/vm/internal/migrating.go b/images/virtualization-artifact/pkg/controller/vm/internal/migrating.go index b7a4ba143a..7ca3067f28 100644 --- a/images/virtualization-artifact/pkg/controller/vm/internal/migrating.go +++ b/images/virtualization-artifact/pkg/controller/vm/internal/migrating.go @@ -169,10 +169,10 @@ func (h *MigratingHandler) syncMigrating(ctx context.Context, s state.VirtualMac cb.Message(fmt.Sprintf("Migration is pending: %s.", completed.Message)) case vmopcondition.ReasonMigrationPrepareTarget.String(): - cb.Message("Migration is awaiting target preparation.") + cb.Message("Migration is in progress: target pod is being scheduled and prepared.") case vmopcondition.ReasonMigrationTargetReady.String(): - cb.Message("Migration is awaiting execution.") + cb.Message("Migration is in progress: source and target are being synchronized.") case vmopcondition.ReasonWaitingForVirtualMachineToBeReadyToMigrate.String(): // 3.1 Check if virtual disks can be migrated or ready to migrate diff --git a/images/virtualization-artifact/pkg/controller/vm/internal/migrating_test.go b/images/virtualization-artifact/pkg/controller/vm/internal/migrating_test.go index e267cf51be..ecf10128e0 100644 --- a/images/virtualization-artifact/pkg/controller/vm/internal/migrating_test.go +++ b/images/virtualization-artifact/pkg/controller/vm/internal/migrating_test.go @@ -180,7 +180,26 @@ var _ = Describe("MigratingHandler", func() { Expect(cond.Message).To(Equal("Migration is awaiting start.")) }) - It("Should set condition when vmop is in progress with target ready reason", func() { + It("Should set active progress message when vmop is in progress with target preparing reason", func() { + vm := newVM() + kvvmi := newKVVMI(nil) + vmop := newVMOP(v1alpha2.VMOPPhaseInProgress, vmopcondition.ReasonMigrationPrepareTarget.String(), true) + fakeClient, resource, vmState = setupEnvironment(vm, kvvmi, vmop) + + reconcile() + + newVM := &v1alpha2.VirtualMachine{} + err := fakeClient.Get(ctx, client.ObjectKeyFromObject(vm), newVM) + Expect(err).NotTo(HaveOccurred()) + + cond, exists := conditions.GetCondition(vmcondition.TypeMigrating, newVM.Status.Conditions) + Expect(exists).To(BeTrue()) + Expect(cond.Status).To(Equal(metav1.ConditionFalse)) + Expect(cond.Reason).To(Equal(vmcondition.ReasonMigratingPending.String())) + Expect(cond.Message).To(Equal("Migration is in progress: target pod is being scheduled and prepared.")) + }) + + It("Should set active progress message when vmop is in progress with target ready reason", func() { vm := newVM() kvvmi := newKVVMI(nil) vmop := newVMOP(v1alpha2.VMOPPhaseInProgress, vmopcondition.ReasonMigrationTargetReady.String(), true) @@ -196,7 +215,7 @@ var _ = Describe("MigratingHandler", func() { Expect(exists).To(BeTrue()) Expect(cond.Status).To(Equal(metav1.ConditionFalse)) Expect(cond.Reason).To(Equal(vmcondition.ReasonMigratingPending.String())) - Expect(cond.Message).To(Equal("Migration is awaiting execution.")) + Expect(cond.Message).To(Equal("Migration is in progress: source and target are being synchronized.")) }) It("Should set condition when vmop is in progress with running reason", func() { diff --git a/images/virtualization-artifact/pkg/controller/vmop/migration/internal/handler/lifecycle_test.go b/images/virtualization-artifact/pkg/controller/vmop/migration/internal/handler/lifecycle_test.go index 94d139f9a9..31661d41d0 100644 --- a/images/virtualization-artifact/pkg/controller/vmop/migration/internal/handler/lifecycle_test.go +++ b/images/virtualization-artifact/pkg/controller/vmop/migration/internal/handler/lifecycle_test.go @@ -31,6 +31,7 @@ import ( vmbuilder "github.com/deckhouse/virtualization-controller/pkg/builder/vm" vmopbuilder "github.com/deckhouse/virtualization-controller/pkg/builder/vmop" "github.com/deckhouse/virtualization-controller/pkg/common/testutil" + "github.com/deckhouse/virtualization-controller/pkg/controller/conditions" "github.com/deckhouse/virtualization-controller/pkg/controller/reconciler" "github.com/deckhouse/virtualization-controller/pkg/controller/vmop/migration/internal/service" genericservice "github.com/deckhouse/virtualization-controller/pkg/controller/vmop/service" @@ -38,6 +39,7 @@ import ( "github.com/deckhouse/virtualization-controller/pkg/featuregates" "github.com/deckhouse/virtualization/api/core/v1alpha2" "github.com/deckhouse/virtualization/api/core/v1alpha2/vmcondition" + "github.com/deckhouse/virtualization/api/core/v1alpha2/vmopcondition" ) var _ = Describe("LifecycleHandler", func() { @@ -186,6 +188,41 @@ var _ = Describe("LifecycleHandler", func() { ), ) + It("should keep migration scheduling in progress after migration starts", func() { + vm := newVM(v1alpha2.PreferSafeMigrationPolicy) + vm.Status.Conditions = []metav1.Condition{{ + Type: string(vmcondition.TypeMigrating), + Reason: string(vmcondition.ReasonReadyToMigrate), + }} + vmop := newVMOPMigrate() + vmop.Status.Phase = v1alpha2.VMOPPhaseInProgress + + mig := &virtv1.VirtualMachineInstanceMigration{} + mig.Namespace = namespace + mig.Name = fmt.Sprintf("vmop-%s", vmop.Name) + mig.Status.Phase = virtv1.MigrationScheduling + mig.OwnerReferences = []metav1.OwnerReference{{ + Kind: "VirtualMachineOperation", + Name: vmop.Name, + UID: vmop.UID, + Controller: ptr.To(true), + }} + mig.Spec.VMIName = name + + fakeClient, srv = setupEnvironment(vmop, vm, mig) + migrationService := service.NewMigrationService(fakeClient, featuregates.Default()) + base := genericservice.NewBaseVMOPService(fakeClient, recorderMock) + + h := NewLifecycleHandler(fakeClient, migrationService, base, recorderMock) + _, err := h.Handle(ctx, srv.Changed()) + Expect(err).NotTo(HaveOccurred()) + + Expect(srv.Changed().Status.Phase).To(Equal(v1alpha2.VMOPPhaseInProgress)) + completed, found := conditions.GetCondition(vmopcondition.TypeCompleted, srv.Changed().Status.Conditions) + Expect(found).To(BeTrue()) + Expect(completed.Reason).To(Equal(vmopcondition.ReasonMigrationPrepareTarget.String())) + }) + DescribeTable("TargetMigration", func(vmPolicy v1alpha2.LiveMigrationPolicy, nodeSelector map[string]string, targetMigrationEnabled bool) { vm := newVM(vmPolicy) vm.Status.Conditions = []metav1.Condition{