Skip to content

Commit bd80bde

Browse files
init4
Signed-off-by: Yaroslav Borbat <[email protected]>
1 parent 849efc7 commit bd80bde

File tree

11 files changed

+126
-16
lines changed

11 files changed

+126
-16
lines changed

api/core/v1alpha2/vmcondition/condition.go

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -86,12 +86,9 @@ const (
8686
ReasonNonMigratable Reason = "VirtualMachineNonMigratable"
8787
ReasonDisksNotMigratable Reason = "VirtualMachineDisksNotMigratable"
8888

89-
ReasonMigratingPending Reason = "Pending"
90-
ReasonMigratingReadyToMigrate Reason = "ReadyToMigrate"
91-
ReasonMigratingInProgress Reason = "InProgress"
92-
ReasonVmIsMigrating Reason = "VirtualMachineMigrating"
93-
// TODO: remove it
94-
ReasonVmIsNotMigrating Reason = "VirtualMachineNotMigrating"
89+
ReasonMigratingPending Reason = "Pending"
90+
ReasonReadyToMigrate Reason = "ReadyToMigrate"
91+
ReasonMigratingInProgress Reason = "InProgress"
9592
ReasonLastMigrationFinishedWithError Reason = "LastMigrationFinishedWithError"
9693

9794
ReasonVmIsNotRunning Reason = "VirtualMachineNotRunning"

images/virtualization-artifact/pkg/controller/vm/internal/migrating.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ func (h *MigratingHandler) syncMigrating(ctx context.Context, s state.VirtualMac
121121

122122
// 1. Check if live migration is in progress
123123
if liveMigrationInProgress(vm.Status.MigrationState) {
124-
cb.Status(metav1.ConditionTrue).Reason(vmcondition.ReasonVmIsMigrating)
124+
cb.Status(metav1.ConditionTrue).Reason(vmcondition.ReasonMigratingInProgress)
125125
conditions.SetCondition(cb, &vm.Status.Conditions)
126126
return nil
127127
}
@@ -161,11 +161,11 @@ func (h *MigratingHandler) syncMigrating(ctx context.Context, s state.VirtualMac
161161
if len(notReadyToMigrateDisks) > 0 {
162162
cb.Message(fmt.Sprintf("Migration is awaiting virtual disks to be ready to migrate [%s].", strings.Join(notReadyToMigrateDisks, ", ")))
163163
} else {
164-
cb.Reason(vmcondition.ReasonMigratingReadyToMigrate).Message("")
164+
cb.Reason(vmcondition.ReasonReadyToMigrate).Message("")
165165
}
166166

167167
case vmopcondition.ReasonMigrationRunning.String():
168-
cb.Status(metav1.ConditionTrue).Reason(vmcondition.ReasonVmIsMigrating)
168+
cb.Status(metav1.ConditionTrue).Reason(vmcondition.ReasonMigratingInProgress)
169169
}
170170

171171
conditions.SetCondition(cb, &vm.Status.Conditions)

images/virtualization-artifact/pkg/controller/vm/internal/migrating_test.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ var _ = Describe("MigratingHandler", func() {
110110
cond, exists := conditions.GetCondition(vmcondition.TypeMigrating, newVM.Status.Conditions)
111111
Expect(exists).To(BeTrue())
112112
Expect(cond.Status).To(Equal(metav1.ConditionTrue))
113-
Expect(cond.Reason).To(Equal(vmcondition.ReasonVmIsMigrating.String()))
113+
Expect(cond.Reason).To(Equal(vmcondition.ReasonMigratingInProgress.String()))
114114
})
115115

116116
It("Should display condition for last unsuccessful migration", func() {
@@ -172,7 +172,7 @@ var _ = Describe("MigratingHandler", func() {
172172
cond, exists := conditions.GetCondition(vmcondition.TypeMigrating, newVM.Status.Conditions)
173173
Expect(exists).To(BeTrue())
174174
Expect(cond.Status).To(Equal(metav1.ConditionFalse))
175-
Expect(cond.Reason).To(Equal(vmcondition.ReasonVmIsNotMigrating.String()))
175+
Expect(cond.Reason).To(Equal(vmcondition.ReasonMigratingPending.String()))
176176
Expect(cond.Message).To(Equal("Migration is awaiting start."))
177177
})
178178

@@ -191,7 +191,7 @@ var _ = Describe("MigratingHandler", func() {
191191
cond, exists := conditions.GetCondition(vmcondition.TypeMigrating, newVM.Status.Conditions)
192192
Expect(exists).To(BeTrue())
193193
Expect(cond.Status).To(Equal(metav1.ConditionFalse))
194-
Expect(cond.Reason).To(Equal(vmcondition.ReasonVmIsNotMigrating.String()))
194+
Expect(cond.Reason).To(Equal(vmcondition.ReasonMigratingPending.String()))
195195
Expect(cond.Message).To(Equal("Migration is awaiting execution."))
196196
})
197197

@@ -210,7 +210,7 @@ var _ = Describe("MigratingHandler", func() {
210210
cond, exists := conditions.GetCondition(vmcondition.TypeMigrating, newVM.Status.Conditions)
211211
Expect(exists).To(BeTrue())
212212
Expect(cond.Status).To(Equal(metav1.ConditionTrue))
213-
Expect(cond.Reason).To(Equal(vmcondition.ReasonVmIsMigrating.String()))
213+
Expect(cond.Reason).To(Equal(vmcondition.ReasonMigratingInProgress.String()))
214214
})
215215
})
216216
})

images/virtualization-artifact/pkg/controller/vmop/internal/lifecycle.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -309,7 +309,8 @@ func (h LifecycleHandler) canBeRun(ctx context.Context, vmop *virtv2.VirtualMach
309309
func isOperationInProgress(vmop *virtv2.VirtualMachineOperation) bool {
310310
sent, _ := conditions.GetCondition(vmopcondition.TypeSignalSent, vmop.Status.Conditions)
311311
completed, _ := conditions.GetCondition(vmopcondition.TypeCompleted, vmop.Status.Conditions)
312-
return sent.Status == metav1.ConditionTrue && completed.Status != metav1.ConditionTrue
312+
return (sent.Status == metav1.ConditionTrue && completed.Status != metav1.ConditionTrue) ||
313+
(commonvmop.IsMigration(vmop) && completed.Reason == vmopcondition.ReasonWaitingForVirtualMachineToBeReadyToMigrate.String())
313314
}
314315

315316
func (h LifecycleHandler) otherMigrationsAreInProgress(ctx context.Context, vmop *virtv2.VirtualMachineOperation) (bool, error) {

images/virtualization-artifact/pkg/controller/vmop/internal/operation.go

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import (
2929
"github.com/deckhouse/virtualization-controller/pkg/common/object"
3030
commonvmop "github.com/deckhouse/virtualization-controller/pkg/common/vmop"
3131
"github.com/deckhouse/virtualization-controller/pkg/controller/conditions"
32+
"github.com/deckhouse/virtualization-controller/pkg/controller/vmop/internal/service"
3233
"github.com/deckhouse/virtualization-controller/pkg/eventrecord"
3334
"github.com/deckhouse/virtualization-controller/pkg/logger"
3435
virtv2 "github.com/deckhouse/virtualization/api/core/v1alpha2"
@@ -89,6 +90,34 @@ func (h OperationHandler) Handle(ctx context.Context, vmop *virtv2.VirtualMachin
8990
if err != nil {
9091
return reconcile.Result{}, err
9192
}
93+
canResult, err := svcOp.CanDo(ctx)
94+
if err != nil {
95+
return reconcile.Result{}, err
96+
}
97+
switch canResult.DoTime {
98+
case service.DoTimeNone:
99+
return reconcile.Result{}, nil
100+
case service.DoTimeNow:
101+
case service.DoTimeAfter:
102+
vmop.Status.Phase = virtv2.VMOPPhasePending
103+
conditions.SetCondition(
104+
completedCond.
105+
Reason(canResult.Reason).
106+
Status(metav1.ConditionFalse).
107+
Message(canResult.Message),
108+
&vmop.Status.Conditions)
109+
return reconcile.Result{}, nil
110+
case service.DoTimeNewer:
111+
vmop.Status.Phase = virtv2.VMOPPhaseFailed
112+
conditions.SetCondition(
113+
completedCond.
114+
Reason(canResult.Reason).
115+
Status(metav1.ConditionFalse).
116+
Message(canResult.Message),
117+
&vmop.Status.Conditions)
118+
return reconcile.Result{}, nil
119+
}
120+
92121
err = svcOp.Do(ctx)
93122
if err != nil {
94123
failMsg := fmt.Sprintf("Sending signal %q to VM", vmop.Spec.Type)

images/virtualization-artifact/pkg/controller/vmop/internal/service/migrate.go

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ import (
3030
"github.com/deckhouse/virtualization-controller/pkg/common/object"
3131
"github.com/deckhouse/virtualization-controller/pkg/controller/conditions"
3232
virtv2 "github.com/deckhouse/virtualization/api/core/v1alpha2"
33+
"github.com/deckhouse/virtualization/api/core/v1alpha2/vmcondition"
3334
"github.com/deckhouse/virtualization/api/core/v1alpha2/vmopcondition"
3435
)
3536

@@ -45,6 +46,37 @@ type MigrateOperation struct {
4546
vmop *virtv2.VirtualMachineOperation
4647
}
4748

49+
func (o MigrateOperation) CanDo(ctx context.Context) (CanDoResult, error) {
50+
vm := &virtv2.VirtualMachine{}
51+
err := o.client.Get(ctx, client.ObjectKey{Namespace: o.vmop.Namespace, Name: o.vmop.Spec.VirtualMachine}, vm)
52+
if err != nil {
53+
return CanDoResult{DoTime: DoTimeNone}, err
54+
}
55+
56+
migratable, _ := conditions.GetCondition(vmcondition.TypeMigratable, vm.Status.Conditions)
57+
if migratable.Status == metav1.ConditionTrue {
58+
return CanDoResult{DoTime: DoTimeNow}, nil
59+
}
60+
61+
if migratable.Reason == vmcondition.ReasonDisksNotMigratable.String() {
62+
migrating, _ := conditions.GetCondition(vmcondition.TypeMigrating, vm.Status.Conditions)
63+
if migrating.Reason == vmcondition.ReasonReadyToMigrate.String() {
64+
return CanDoResult{DoTime: DoTimeNow}, nil
65+
}
66+
return CanDoResult{
67+
DoTime: DoTimeAfter,
68+
Reason: vmopcondition.ReasonWaitingForVirtualMachineToBeReadyToMigrate,
69+
Message: "",
70+
}, nil
71+
}
72+
73+
return CanDoResult{
74+
DoTime: DoTimeNewer,
75+
Reason: vmopcondition.ReasonOperationFailed,
76+
Message: "VirtualMachine is not migratable, cannot be processed.",
77+
}, nil
78+
}
79+
4880
func (o MigrateOperation) Do(ctx context.Context) error {
4981
return o.createMigration(ctx)
5082
}

images/virtualization-artifact/pkg/controller/vmop/internal/service/operation.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,23 @@ import (
3030
"github.com/deckhouse/virtualization/api/core/v1alpha2/vmopcondition"
3131
)
3232

33+
type DoTime int
34+
35+
const (
36+
DoTimeNone DoTime = iota
37+
DoTimeNow = iota
38+
DoTimeAfter
39+
DoTimeNewer
40+
)
41+
42+
type CanDoResult struct {
43+
DoTime DoTime
44+
Reason vmopcondition.ReasonCompleted
45+
Message string
46+
}
47+
3348
type Operation interface {
49+
CanDo(ctx context.Context) (CanDoResult, error)
3450
Do(ctx context.Context) error
3551
Cancel(ctx context.Context) (bool, error)
3652
IsApplicableForVMPhase(phase virtv2.MachinePhase) bool

images/virtualization-artifact/pkg/controller/vmop/internal/service/restart.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,10 @@ type RestartOperation struct {
3939
vmop *virtv2.VirtualMachineOperation
4040
}
4141

42+
func (o RestartOperation) CanDo(_ context.Context) (CanDoResult, error) {
43+
return CanDoResult{DoTime: DoTimeNow}, nil
44+
}
45+
4246
func (o RestartOperation) Do(ctx context.Context) error {
4347
kvvm := &virtv1.VirtualMachine{}
4448
err := o.client.Get(ctx, virtualMachineKeyByVmop(o.vmop), kvvm)

images/virtualization-artifact/pkg/controller/vmop/internal/service/start.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,10 @@ type StartOperation struct {
3939
vmop *virtv2.VirtualMachineOperation
4040
}
4141

42+
func (o StartOperation) CanDo(_ context.Context) (CanDoResult, error) {
43+
return CanDoResult{DoTime: DoTimeNow}, nil
44+
}
45+
4246
func (o StartOperation) Do(ctx context.Context) error {
4347
kvvm := &virtv1.VirtualMachine{}
4448
err := o.client.Get(ctx, virtualMachineKeyByVmop(o.vmop), kvvm)

images/virtualization-artifact/pkg/controller/vmop/internal/service/stop.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,10 @@ type StopOperation struct {
3939
vmop *virtv2.VirtualMachineOperation
4040
}
4141

42+
func (o StopOperation) CanDo(_ context.Context) (CanDoResult, error) {
43+
return CanDoResult{DoTime: DoTimeNow}, nil
44+
}
45+
4246
func (o StopOperation) Do(ctx context.Context) error {
4347
kvvmi := &virtv1.VirtualMachineInstance{}
4448
err := o.client.Get(ctx, virtualMachineKeyByVmop(o.vmop), kvvmi)

0 commit comments

Comments
 (0)