Skip to content

Commit

Permalink
fix pod could not be ready (#1562)
Browse files Browse the repository at this point in the history
when pod is created by ephemeral VMI which not managed by a VM
  • Loading branch information
lrh3321 committed Jun 1, 2022
1 parent 337f6e0 commit f5d5b0b
Show file tree
Hide file tree
Showing 2 changed files with 47 additions and 3 deletions.
49 changes: 46 additions & 3 deletions pkg/controller/pod.go
Expand Up @@ -1375,7 +1375,10 @@ func appendCheckPodToDel(c *Controller, pod *v1.Pod, ownerRefName, ownerRefKind
klog.Errorf("failed to get VirtualMachine %s, %v", ownerRefName, err)
}
}
if vm.Spec.Template.ObjectMeta.Annotations[util.LogicalSwitchAnnotation] != "" {
if vm != nil &&
vm.Spec.Template != nil &&
vm.Spec.Template.ObjectMeta.Annotations != nil &&
vm.Spec.Template.ObjectMeta.Annotations[util.LogicalSwitchAnnotation] != "" {
ownerRefSubnetExist = true
}
}
Expand Down Expand Up @@ -1459,14 +1462,54 @@ func isVmPod(pod *v1.Pod) (bool, string) {
return false, ""
}

func (c *Controller) isVmPodToDel(pod *v1.Pod, vmName string) bool {
func isOwnsByTheVM(vmi metav1.Object) (bool, string) {
for _, owner := range vmi.GetOwnerReferences() {
if owner.Kind == util.Vm && strings.HasPrefix(owner.APIVersion, "kubevirt.io") {
return true, owner.Name
}
}
return false, ""
}

func (c *Controller) isVmPodToDel(pod *v1.Pod, vmiName string) bool {
var (
vmiAlived bool
vmName string
)
// The vmi is also deleted when pod is deleted, only left vm exists.
vmi, err := c.config.KubevirtClient.VirtualMachineInstance(pod.Namespace).Get(vmiName, &metav1.GetOptions{})
if err != nil {
if k8serrors.IsNotFound(err) {
vmiAlived = false
// The name of vmi is consistent with vm's name.
vmName = vmiName
klog.V(4).ErrorS(err, "failed to get vmi, will try to get the vm directly", "name", vmiName)
} else {
klog.ErrorS(err, "failed to get vmi", "name", vmiName)
return false
}
} else {
var ownsByVM bool
ownsByVM, vmName = isOwnsByTheVM(vmi)
if !ownsByVM && vmi.DeletionTimestamp != nil {
// deleteting ephemeral vmi
return true
}
vmiAlived = (vmi.DeletionTimestamp == nil)
}

if vmiAlived {
return false
}

vm, err := c.config.KubevirtClient.VirtualMachine(pod.Namespace).Get(vmName, &metav1.GetOptions{})
if err != nil {
// the vm has gone
if k8serrors.IsNotFound(err) {
klog.V(4).ErrorS(err, "failed to get vm", "name", vmName)
return true
} else {
klog.Errorf("failed to get vm %s, %v", vmName, err)
klog.ErrorS(err, "failed to get vm", "name", vmName)
}
return false
}
Expand Down
1 change: 1 addition & 0 deletions pkg/util/const.go
Expand Up @@ -140,6 +140,7 @@ const (
HostnameEnv = "KUBE_NODE_NAME"
ChasRetryTime = 5
ChasRetryIntev = 1
Vm = "VirtualMachine"
VmInstance = "VirtualMachineInstance"

MirrorControlAnnotation = "ovn.kubernetes.io/mirror"
Expand Down

0 comments on commit f5d5b0b

Please sign in to comment.