@@ -31,13 +31,15 @@ import (
3131 vmbuilder "github.com/deckhouse/virtualization-controller/pkg/builder/vm"
3232 vmopbuilder "github.com/deckhouse/virtualization-controller/pkg/builder/vmop"
3333 "github.com/deckhouse/virtualization-controller/pkg/common/testutil"
34+ "github.com/deckhouse/virtualization-controller/pkg/controller/conditions"
3435 "github.com/deckhouse/virtualization-controller/pkg/controller/reconciler"
3536 "github.com/deckhouse/virtualization-controller/pkg/controller/vmop/migration/internal/service"
3637 genericservice "github.com/deckhouse/virtualization-controller/pkg/controller/vmop/service"
3738 "github.com/deckhouse/virtualization-controller/pkg/eventrecord"
3839 "github.com/deckhouse/virtualization-controller/pkg/featuregates"
3940 "github.com/deckhouse/virtualization/api/core/v1alpha2"
4041 "github.com/deckhouse/virtualization/api/core/v1alpha2/vmcondition"
42+ "github.com/deckhouse/virtualization/api/core/v1alpha2/vmopcondition"
4143)
4244
4345var _ = Describe ("LifecycleHandler" , func () {
@@ -186,6 +188,41 @@ var _ = Describe("LifecycleHandler", func() {
186188 ),
187189 )
188190
191+ It ("should keep migration scheduling in progress after migration starts" , func () {
192+ vm := newVM (v1alpha2 .PreferSafeMigrationPolicy )
193+ vm .Status .Conditions = []metav1.Condition {{
194+ Type : string (vmcondition .TypeMigrating ),
195+ Reason : string (vmcondition .ReasonReadyToMigrate ),
196+ }}
197+ vmop := newVMOPMigrate ()
198+ vmop .Status .Phase = v1alpha2 .VMOPPhaseInProgress
199+
200+ mig := & virtv1.VirtualMachineInstanceMigration {}
201+ mig .Namespace = namespace
202+ mig .Name = fmt .Sprintf ("vmop-%s" , vmop .Name )
203+ mig .Status .Phase = virtv1 .MigrationScheduling
204+ mig .OwnerReferences = []metav1.OwnerReference {{
205+ Kind : "VirtualMachineOperation" ,
206+ Name : vmop .Name ,
207+ UID : vmop .UID ,
208+ Controller : ptr .To (true ),
209+ }}
210+ mig .Spec .VMIName = name
211+
212+ fakeClient , srv = setupEnvironment (vmop , vm , mig )
213+ migrationService := service .NewMigrationService (fakeClient , featuregates .Default ())
214+ base := genericservice .NewBaseVMOPService (fakeClient , recorderMock )
215+
216+ h := NewLifecycleHandler (fakeClient , migrationService , base , recorderMock )
217+ _ , err := h .Handle (ctx , srv .Changed ())
218+ Expect (err ).NotTo (HaveOccurred ())
219+
220+ Expect (srv .Changed ().Status .Phase ).To (Equal (v1alpha2 .VMOPPhaseInProgress ))
221+ completed , found := conditions .GetCondition (vmopcondition .TypeCompleted , srv .Changed ().Status .Conditions )
222+ Expect (found ).To (BeTrue ())
223+ Expect (completed .Reason ).To (Equal (vmopcondition .ReasonMigrationPrepareTarget .String ()))
224+ })
225+
189226 DescribeTable ("TargetMigration" , func (vmPolicy v1alpha2.LiveMigrationPolicy , nodeSelector map [string ]string , targetMigrationEnabled bool ) {
190227 vm := newVM (vmPolicy )
191228 vm .Status .Conditions = []metav1.Condition {
0 commit comments