Skip to content

Commit

Permalink
Propagate PVC/DV not found from VMI cond to VM status
Browse files Browse the repository at this point in the history
Signed-off-by: Zvi Cahana <zvic@il.ibm.com>
  • Loading branch information
zcahana committed Aug 6, 2021
1 parent 8e389c6 commit 633e578
Show file tree
Hide file tree
Showing 3 changed files with 60 additions and 17 deletions.
18 changes: 18 additions & 0 deletions pkg/virt-controller/watch/vm.go
Original file line number Diff line number Diff line change
Expand Up @@ -1522,6 +1522,8 @@ func (c *VMController) setPrintableStatus(vm *virtv1.VirtualMachine, vmi *virtv1
{virtv1.VirtualMachineStatusPaused, c.isVirtualMachineStatusPaused},
{virtv1.VirtualMachineStatusRunning, c.isVirtualMachineStatusRunning},
{virtv1.VirtualMachineStatusUnschedulable, c.isVirtualMachineStatusUnschedulable},
{virtv1.VirtualMachineStatusPvcNotFound, c.isVirtualMachineStatusPvcNotFound},
{virtv1.VirtualMachineStatusDataVolumeNotFound, c.isVirtualMachineStatusDataVolumeNotFound},
{virtv1.VirtualMachineStatusProvisioning, c.isVirtualMachineStatusProvisioning},
{virtv1.VirtualMachineStatusErrImagePull, c.isVirtualMachineStatusErrImagePull},
{virtv1.VirtualMachineStatusImagePullBackOff, c.isVirtualMachineStatusImagePullBackOff},
Expand Down Expand Up @@ -1646,6 +1648,22 @@ func (c *VMController) isVirtualMachineStatusImagePullBackOff(vm *virtv1.Virtual
return syncCond != nil && syncCond.Status == k8score.ConditionFalse && syncCond.Reason == ImagePullBackOffReason
}

// isVirtualMachineStatusPvcNotFound determines whether the VM status field should be set to "FailedPvcNotFound".
func (c *VMController) isVirtualMachineStatusPvcNotFound(vm *virtv1.VirtualMachine, vmi *virtv1.VirtualMachineInstance) bool {
return controller.NewVirtualMachineInstanceConditionManager().HasConditionWithStatusAndReason(vmi,
virtv1.VirtualMachineInstanceSynchronized,
k8score.ConditionFalse,
FailedPvcNotFoundReason)
}

// isVirtualMachineStatusDataVolumeNotFound determines whether the VM status field should be set to "FailedDataVolumeNotFound".
func (c *VMController) isVirtualMachineStatusDataVolumeNotFound(vm *virtv1.VirtualMachine, vmi *virtv1.VirtualMachineInstance) bool {
return controller.NewVirtualMachineInstanceConditionManager().HasConditionWithStatusAndReason(vmi,
virtv1.VirtualMachineInstanceSynchronized,
k8score.ConditionFalse,
FailedDataVolumeNotFoundReason)
}

func (c *VMController) syncReadyConditionFromVMI(vm *virtv1.VirtualMachine, vmi *virtv1.VirtualMachineInstance) {
conditionManager := controller.NewVirtualMachineConditionManager()
vmiReadyCond := controller.NewVirtualMachineInstanceConditionManager().
Expand Down
53 changes: 37 additions & 16 deletions pkg/virt-controller/watch/vm_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -1940,25 +1940,46 @@ var _ = Describe("VirtualMachine", func() {
controller.Execute()
})

It("should set a FailedUnschedulable status when VMI has a PodScheduled=False condition with Unschedulable reason", func() {
vm, vmi := DefaultVirtualMachine(true)
vmi.Status.Phase = virtv1.Scheduling
vmi.Status.Conditions = append(vmi.Status.Conditions, virtv1.VirtualMachineInstanceCondition{
Type: virtv1.VirtualMachineInstanceConditionType(k8sv1.PodScheduled),
Status: k8sv1.ConditionFalse,
Reason: k8sv1.PodReasonUnschedulable,
})
table.DescribeTable("should set a failure status in accordance to VMI condition",
func(status virtv1.VirtualMachinePrintableStatus, cond v1.VirtualMachineInstanceCondition) {

addVirtualMachine(vm)
vmiFeeder.Add(vmi)
vm, vmi := DefaultVirtualMachine(true)
vmi.Status.Phase = virtv1.Scheduling
vmi.Status.Conditions = append(vmi.Status.Conditions, cond)

vmInterface.EXPECT().UpdateStatus(gomock.Any()).Times(1).Do(func(obj interface{}) {
objVM := obj.(*v1.VirtualMachine)
Expect(objVM.Status.PrintableStatus).To(Equal(v1.VirtualMachineStatusUnschedulable))
})
addVirtualMachine(vm)
vmiFeeder.Add(vmi)

controller.Execute()
})
vmInterface.EXPECT().UpdateStatus(gomock.Any()).Times(1).Do(func(obj interface{}) {
objVM := obj.(*v1.VirtualMachine)
Expect(objVM.Status.PrintableStatus).To(Equal(status))
})

controller.Execute()
},

table.Entry("FailedUnschedulable", v1.VirtualMachineStatusUnschedulable,
virtv1.VirtualMachineInstanceCondition{
Type: virtv1.VirtualMachineInstanceConditionType(k8sv1.PodScheduled),
Status: k8sv1.ConditionFalse,
Reason: k8sv1.PodReasonUnschedulable,
},
),
table.Entry("FailedPvcNotFound", v1.VirtualMachineStatusPvcNotFound,
virtv1.VirtualMachineInstanceCondition{
Type: virtv1.VirtualMachineInstanceSynchronized,
Status: k8sv1.ConditionFalse,
Reason: FailedPvcNotFoundReason,
},
),
table.Entry("FailedDataVolumeNotFound", v1.VirtualMachineStatusDataVolumeNotFound,
virtv1.VirtualMachineInstanceCondition{
Type: virtv1.VirtualMachineInstanceSynchronized,
Status: k8sv1.ConditionFalse,
Reason: FailedDataVolumeNotFoundReason,
},
),
)

table.DescribeTable("should set an ImagePullBackOff/ErrPullImage statuses according to VMI Synchronized condition", func(reason string) {
vm, vmi := DefaultVirtualMachine(true)
Expand Down
6 changes: 5 additions & 1 deletion staging/src/kubevirt.io/client-go/api/v1/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -1214,7 +1214,7 @@ const (
// VirtualMachineStatusTerminating indicates that the virtual machine is in the process of deletion,
// as well as its associated resources (VirtualMachineInstance, DataVolumes, …).
VirtualMachineStatusTerminating VirtualMachinePrintableStatus = "Terminating"
// VirtualMachineStatusCrashLoopBackOff indicates that the virtual machine is currently in a crash loop waiting to be retried
// VirtualMachineStatusCrashLoopBackOff indicates that the virtual machine is currently in a crash loop waiting to be retried.
VirtualMachineStatusCrashLoopBackOff VirtualMachinePrintableStatus = "CrashLoopBackOff"
// VirtualMachineStatusMigrating indicates that the virtual machine is in the process of being migrated
// to another host.
Expand All @@ -1231,6 +1231,10 @@ const (
// VirtualMachineStatusImagePullBackOff indicates that an error has occured while pulling an image for
// a containerDisk VM volume, and that kubelet is backing off before retrying.
VirtualMachineStatusImagePullBackOff VirtualMachinePrintableStatus = "ImagePullBackOff"
// VirtualMachineStatusPvcNotFound indicates that the virtual machine references a PVC volume which doesn't exist.
VirtualMachineStatusPvcNotFound VirtualMachinePrintableStatus = "FailedPvcNotFound"
// VirtualMachineStatusDataVolumeNotFound indicates that the virtual machine references a DataVolume volume which doesn't exist.
VirtualMachineStatusDataVolumeNotFound VirtualMachinePrintableStatus = "FailedDataVolumeNotFound"
)

// VirtualMachineStartFailure tracks VMIs which failed to transition successfully
Expand Down

0 comments on commit 633e578

Please sign in to comment.