Skip to content

Commit 29df22d

Browse files
author
Valeriy Khorunzhin
committed
m
Signed-off-by: Valeriy Khorunzhin <[email protected]>
1 parent 5058474 commit 29df22d

File tree

4 files changed

+127
-36
lines changed

4 files changed

+127
-36
lines changed

images/virtualization-artifact/pkg/controller/vdsnapshot/internal/life_cycle.go

Lines changed: 33 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -125,12 +125,22 @@ func (h LifeCycleHandler) Handle(ctx context.Context, vdSnapshot *v1alpha2.Virtu
125125
}
126126

127127
virtualDiskReadyCondition, _ := conditions.GetCondition(vdscondition.VirtualDiskReadyType, vdSnapshot.Status.Conditions)
128-
if vd == nil || virtualDiskReadyCondition.Status != metav1.ConditionTrue {
129-
vdSnapshot.Status.Phase = v1alpha2.VirtualDiskSnapshotPhasePending
128+
if vd == nil {
129+
vdSnapshot.Status.Phase = v1alpha2.VirtualDiskSnapshotPhaseFailed
130+
msg := fmt.Sprintf("Cannot take a snapshot right now: the virtual disk %q does not exist.", vdSnapshot.Spec.VirtualDiskName)
131+
cb.
132+
Status(metav1.ConditionFalse).
133+
Reason(vdscondition.WaitingForTheVirtualDisk).
134+
Message(msg)
135+
return reconcile.Result{}, nil
136+
}
137+
if virtualDiskReadyCondition.Status != metav1.ConditionTrue {
138+
vdSnapshot.Status.Phase = v1alpha2.VirtualDiskSnapshotPhaseFailed
139+
msg := fmt.Sprintf("Cannot take a snapshot right now: the virtual disk %q is not ready.", vdSnapshot.Spec.VirtualDiskName)
130140
cb.
131141
Status(metav1.ConditionFalse).
132142
Reason(vdscondition.WaitingForTheVirtualDisk).
133-
Message(fmt.Sprintf("Waiting for the virtual disk %q to be ready for snapshotting.", vdSnapshot.Spec.VirtualDiskName))
143+
Message(msg)
134144
return reconcile.Result{}, nil
135145
}
136146

@@ -143,12 +153,22 @@ func (h LifeCycleHandler) Handle(ctx context.Context, vdSnapshot *v1alpha2.Virtu
143153
}
144154
}
145155

146-
if pvc == nil || pvc.Status.Phase != corev1.ClaimBound {
147-
vdSnapshot.Status.Phase = v1alpha2.VirtualDiskSnapshotPhasePending
156+
if pvc == nil {
157+
vdSnapshot.Status.Phase = v1alpha2.VirtualDiskSnapshotPhaseFailed
158+
msg := fmt.Sprintf("Cannot take a snapshot right now: the persistent volume claim for virtual disk %q does not exist.", vdSnapshot.Spec.VirtualDiskName)
159+
cb.
160+
Status(metav1.ConditionFalse).
161+
Reason(vdscondition.WaitingForTheVirtualDisk).
162+
Message(msg)
163+
return reconcile.Result{}, nil
164+
}
165+
if pvc.Status.Phase != corev1.ClaimBound {
166+
vdSnapshot.Status.Phase = v1alpha2.VirtualDiskSnapshotPhaseFailed
167+
msg := fmt.Sprintf("Cannot take a snapshot right now: the persistent volume claim %q for virtual disk %q is not in phase %s.", pvc.Name, vdSnapshot.Spec.VirtualDiskName, corev1.ClaimBound)
148168
cb.
149169
Status(metav1.ConditionFalse).
150170
Reason(vdscondition.WaitingForTheVirtualDisk).
151-
Message("Waiting for the virtual disk's pvc to be in phase Bound.")
171+
Message(msg)
152172
return reconcile.Result{}, nil
153173
}
154174

@@ -243,27 +263,21 @@ func (h LifeCycleHandler) Handle(ctx context.Context, vdSnapshot *v1alpha2.Virtu
243263
}
244264

245265
if vdSnapshot.Spec.RequiredConsistency {
246-
vdSnapshot.Status.Phase = v1alpha2.VirtualDiskSnapshotPhasePending
266+
vdSnapshot.Status.Phase = v1alpha2.VirtualDiskSnapshotPhaseFailed
247267
cb.
248268
Status(metav1.ConditionFalse).
249269
Reason(vdscondition.PotentiallyInconsistent)
250270

251271
agentReadyCondition, _ := conditions.GetCondition(vmcondition.TypeAgentReady, vm.Status.Conditions)
252-
switch {
253-
case agentReadyCondition.Status != metav1.ConditionTrue:
272+
if agentReadyCondition.Status != metav1.ConditionTrue {
254273
cb.Message(fmt.Sprintf(
255-
"The virtual machine %q with an attached virtual disk %q is %s: "+
256-
"the snapshotting of virtual disk might result in an inconsistent snapshot: "+
257-
"virtual machine agent is not ready and virtual machine cannot be frozen: "+
258-
"waiting for virtual machine agent to be ready, or virtual machine will stop",
259-
vm.Name, vd.Name, vm.Status.Phase,
274+
"Cannot take a consistent snapshot of virtual disk %q attached to virtual machine %q: virtual machine agent is not ready and the virtual machine cannot be frozen.",
275+
vd.Name, vm.Name,
260276
))
261-
default:
277+
} else {
262278
cb.Message(fmt.Sprintf(
263-
"The virtual machine %q with an attached virtual disk %q is %s: "+
264-
"the snapshotting of virtual disk might result in an inconsistent snapshot: "+
265-
"waiting for the virtual machine to be %s or the disk to be detached",
266-
vm.Name, vd.Name, vm.Status.Phase, v1alpha2.MachineStopped,
279+
"Cannot take a consistent snapshot of virtual disk %q attached to virtual machine %q.",
280+
vd.Name, vm.Name,
267281
))
268282
}
269283

images/virtualization-artifact/pkg/controller/vdsnapshot/internal/life_cycle_test.go

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,36 @@ var _ = Describe("LifeCycle handler", func() {
174174
Expect(ready.Reason).To(Equal(vdscondition.VirtualDiskSnapshotReady.String()))
175175
Expect(ready.Message).To(BeEmpty())
176176
})
177+
178+
It("fails when the virtual disk is missing", func() {
179+
snapshotter.GetVirtualDiskFunc = func(_ context.Context, _, _ string) (*v1alpha2.VirtualDisk, error) {
180+
return nil, nil
181+
}
182+
183+
h := NewLifeCycleHandler(snapshotter)
184+
185+
_, err := h.Handle(testContext(), vdSnapshot)
186+
Expect(err).To(BeNil())
187+
Expect(vdSnapshot.Status.Phase).To(Equal(v1alpha2.VirtualDiskSnapshotPhaseFailed))
188+
ready, _ := conditions.GetCondition(vdscondition.VirtualDiskSnapshotReadyType, vdSnapshot.Status.Conditions)
189+
Expect(ready.Status).To(Equal(metav1.ConditionFalse))
190+
Expect(ready.Reason).To(Equal(vdscondition.WaitingForTheVirtualDisk.String()))
191+
Expect(ready.Message).To(ContainSubstring("does not exist"))
192+
})
193+
194+
It("fails when the virtual disk pvc is not Bound", func() {
195+
pvc.Status.Phase = corev1.ClaimPending
196+
197+
h := NewLifeCycleHandler(snapshotter)
198+
199+
_, err := h.Handle(testContext(), vdSnapshot)
200+
Expect(err).To(BeNil())
201+
Expect(vdSnapshot.Status.Phase).To(Equal(v1alpha2.VirtualDiskSnapshotPhaseFailed))
202+
ready, _ := conditions.GetCondition(vdscondition.VirtualDiskSnapshotReadyType, vdSnapshot.Status.Conditions)
203+
Expect(ready.Status).To(Equal(metav1.ConditionFalse))
204+
Expect(ready.Reason).To(Equal(vdscondition.WaitingForTheVirtualDisk.String()))
205+
Expect(ready.Message).To(ContainSubstring("not in phase"))
206+
})
177207
})
178208

179209
Context("The virtual disk snapshot with virtual machine", func() {
@@ -258,11 +288,11 @@ var _ = Describe("LifeCycle handler", func() {
258288

259289
_, err := h.Handle(testContext(), vdSnapshot)
260290
Expect(err).To(BeNil())
261-
Expect(vdSnapshot.Status.Phase).To(Equal(v1alpha2.VirtualDiskSnapshotPhasePending))
291+
Expect(vdSnapshot.Status.Phase).To(Equal(v1alpha2.VirtualDiskSnapshotPhaseFailed))
262292
ready, _ := conditions.GetCondition(vdscondition.VirtualDiskSnapshotReadyType, vdSnapshot.Status.Conditions)
263293
Expect(ready.Status).To(Equal(metav1.ConditionFalse))
264294
Expect(ready.Reason).To(Equal(vdscondition.PotentiallyInconsistent.String()))
265-
Expect(ready.Message).ToNot(BeEmpty())
295+
Expect(ready.Message).To(ContainSubstring("Cannot take a consistent snapshot"))
266296
})
267297

268298
It("Cannot freeze virtual machine: allow potentially inconsistent", func() {

images/virtualization-artifact/pkg/controller/vmsnapshot/internal/life_cycle.go

Lines changed: 26 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -200,13 +200,28 @@ func (h LifeCycleHandler) Handle(ctx context.Context, vmSnapshot *v1alpha2.Virtu
200200
}
201201

202202
virtualMachineReadyCondition, _ := conditions.GetCondition(vmscondition.VirtualMachineReadyType, vmSnapshot.Status.Conditions)
203-
if vm == nil || virtualMachineReadyCondition.Status != metav1.ConditionTrue {
204-
vmSnapshot.Status.Phase = v1alpha2.VirtualMachineSnapshotPhasePending
205-
msg := fmt.Sprintf("Waiting for the virtual machine %q to be ready for snapshotting.", vmSnapshot.Spec.VirtualMachineName)
203+
if vm == nil {
204+
vmSnapshot.Status.Phase = v1alpha2.VirtualMachineSnapshotPhaseFailed
205+
msg := fmt.Sprintf("Cannot take a snapshot right now: the virtual machine %q does not exist.", vmSnapshot.Spec.VirtualMachineName)
206206
h.recorder.Event(
207207
vmSnapshot,
208-
corev1.EventTypeNormal,
209-
v1alpha2.ReasonVMSnapshottingPending,
208+
corev1.EventTypeWarning,
209+
v1alpha2.ReasonVMSnapshottingFailed,
210+
msg,
211+
)
212+
cb.
213+
Status(metav1.ConditionFalse).
214+
Reason(vmscondition.WaitingForTheVirtualMachine).
215+
Message(msg)
216+
return reconcile.Result{}, nil
217+
}
218+
if virtualMachineReadyCondition.Status != metav1.ConditionTrue {
219+
vmSnapshot.Status.Phase = v1alpha2.VirtualMachineSnapshotPhaseFailed
220+
msg := fmt.Sprintf("Cannot take a snapshot right now: the virtual machine %q is not ready.", vmSnapshot.Spec.VirtualMachineName)
221+
h.recorder.Event(
222+
vmSnapshot,
223+
corev1.EventTypeWarning,
224+
v1alpha2.ReasonVMSnapshottingFailed,
210225
msg,
211226
)
212227
cb.
@@ -251,27 +266,24 @@ func (h LifeCycleHandler) Handle(ctx context.Context, vmSnapshot *v1alpha2.Virtu
251266
}
252267
isAwaitingConsistency := needToFreeze && !canFreeze && vmSnapshot.Spec.RequiredConsistency
253268
if isAwaitingConsistency {
254-
vmSnapshot.Status.Phase = v1alpha2.VirtualMachineSnapshotPhasePending
269+
vmSnapshot.Status.Phase = v1alpha2.VirtualMachineSnapshotPhaseFailed
255270
msg := fmt.Sprintf(
256-
"The snapshotting of virtual machine %q might result in an inconsistent snapshot: "+
257-
"waiting for the virtual machine to be %s",
258-
vm.Name, v1alpha2.MachineStopped,
271+
"Cannot take a consistent snapshot of virtual machine %q.",
272+
vm.Name,
259273
)
260274

261275
agentReadyCondition, _ := conditions.GetCondition(vmcondition.TypeAgentReady, vm.Status.Conditions)
262276
if agentReadyCondition.Status != metav1.ConditionTrue {
263277
msg = fmt.Sprintf(
264-
"The snapshotting of virtual machine %q might result in an inconsistent snapshot: "+
265-
"virtual machine agent is not ready and virtual machine cannot be frozen: "+
266-
"waiting for virtual machine agent to be ready or virtual machine will stop",
278+
"Cannot take a consistent snapshot of virtual machine %q: virtual machine agent is not ready and the virtual machine cannot be frozen.",
267279
vm.Name,
268280
)
269281
}
270282

271283
h.recorder.Event(
272284
vmSnapshot,
273-
corev1.EventTypeNormal,
274-
v1alpha2.ReasonVMSnapshottingPending,
285+
corev1.EventTypeWarning,
286+
v1alpha2.ReasonVMSnapshottingFailed,
275287
msg,
276288
)
277289
cb.

images/virtualization-artifact/pkg/controller/vmsnapshot/internal/life_cycle_test.go

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,41 @@ var _ = Describe("LifeCycle handler", func() {
168168
}
169169
})
170170

171+
Context("The virtual machine is not ready", func() {
172+
It("fails when the virtual machine is missing", func() {
173+
snapshotter.GetVirtualMachineFunc = func(_ context.Context, _, _ string) (*v1alpha2.VirtualMachine, error) {
174+
return nil, nil
175+
}
176+
177+
h := NewLifeCycleHandler(recorder, snapshotter, storer, fakeClient)
178+
179+
_, err := h.Handle(testContext(), vmSnapshot)
180+
Expect(err).To(BeNil())
181+
Expect(vmSnapshot.Status.Phase).To(Equal(v1alpha2.VirtualMachineSnapshotPhaseFailed))
182+
ready, _ := conditions.GetCondition(vmscondition.VirtualMachineSnapshotReadyType, vmSnapshot.Status.Conditions)
183+
Expect(ready.Status).To(Equal(metav1.ConditionFalse))
184+
Expect(ready.Reason).To(Equal(vmscondition.WaitingForTheVirtualMachine.String()))
185+
Expect(ready.Message).To(ContainSubstring("does not exist"))
186+
})
187+
188+
It("fails when the virtual machine is reported as not ready", func() {
189+
cb := conditions.NewConditionBuilder(vmscondition.VirtualMachineReadyType).
190+
Generation(vmSnapshot.Generation).
191+
Status(metav1.ConditionFalse)
192+
conditions.SetCondition(cb, &vmSnapshot.Status.Conditions)
193+
194+
h := NewLifeCycleHandler(recorder, snapshotter, storer, fakeClient)
195+
196+
_, err := h.Handle(testContext(), vmSnapshot)
197+
Expect(err).To(BeNil())
198+
Expect(vmSnapshot.Status.Phase).To(Equal(v1alpha2.VirtualMachineSnapshotPhaseFailed))
199+
ready, _ := conditions.GetCondition(vmscondition.VirtualMachineSnapshotReadyType, vmSnapshot.Status.Conditions)
200+
Expect(ready.Status).To(Equal(metav1.ConditionFalse))
201+
Expect(ready.Reason).To(Equal(vmscondition.WaitingForTheVirtualMachine.String()))
202+
Expect(ready.Message).To(ContainSubstring("not ready"))
203+
})
204+
})
205+
171206
Context("The block devices of the virtual machine are not in the consistent state", func() {
172207
It("The BlockDevicesReady condition of the virtual machine isn't True", func() {
173208
snapshotter.GetVirtualMachineFunc = func(_ context.Context, _, _ string) (*v1alpha2.VirtualMachine, error) {
@@ -274,7 +309,7 @@ var _ = Describe("LifeCycle handler", func() {
274309

275310
_, err := h.Handle(testContext(), vmSnapshot)
276311
Expect(err).To(BeNil())
277-
Expect(vmSnapshot.Status.Phase).To(Equal(v1alpha2.VirtualMachineSnapshotPhasePending))
312+
Expect(vmSnapshot.Status.Phase).To(Equal(v1alpha2.VirtualMachineSnapshotPhaseFailed))
278313
ready, _ := conditions.GetCondition(vmscondition.VirtualMachineSnapshotReadyType, vmSnapshot.Status.Conditions)
279314
Expect(ready.Status).To(Equal(metav1.ConditionFalse))
280315
Expect(ready.Reason).To(Equal(vmscondition.PotentiallyInconsistent.String()))

0 commit comments

Comments
 (0)