diff --git a/pkg/daemon/handler.go b/pkg/daemon/handler.go index 49dad4b2c80e..18117404f87b 100644 --- a/pkg/daemon/handler.go +++ b/pkg/daemon/handler.go @@ -331,25 +331,33 @@ func (csh cniServerHandler) handleAdd(req *restful.Request, resp *restful.Respon func (csh cniServerHandler) UpdateIPCr(podRequest request.CniRequest, subnet, ip string) error { ipCrName := ovs.PodNameToPortName(podRequest.PodName, podRequest.PodNamespace, podRequest.Provider) - oriIpCr, err := csh.KubeOvnClient.KubeovnV1().IPs().Get(context.Background(), ipCrName, metav1.GetOptions{}) - if err != nil { - errMsg := fmt.Errorf("failed to get ip crd for %s, %v", ip, err) - klog.Error(errMsg) - return errMsg - } else { - ipCr := oriIpCr.DeepCopy() - ipCr.Spec.NodeName = csh.Config.NodeName - ipCr.Spec.AttachIPs = []string{} - ipCr.Labels[subnet] = "" - ipCr.Spec.AttachSubnets = []string{} - ipCr.Spec.AttachMacs = []string{} - if _, err := csh.KubeOvnClient.KubeovnV1().IPs().Update(context.Background(), ipCr, metav1.UpdateOptions{}); err != nil { - errMsg := fmt.Errorf("failed to update ip crd for %s, %v", ip, err) - klog.Error(errMsg) - return errMsg + var err error + for i := 0; i < 20; i++ { + oriIpCr, err := csh.KubeOvnClient.KubeovnV1().IPs().Get(context.Background(), ipCrName, metav1.GetOptions{}) + if err != nil { + err = fmt.Errorf("failed to get ip crd for %s, %v", ip, err) + // maybe create a backup pod with previous annotations + klog.Error(err) + } else { + ipCr := oriIpCr.DeepCopy() + ipCr.Spec.NodeName = csh.Config.NodeName + ipCr.Spec.AttachIPs = []string{} + ipCr.Labels[subnet] = "" + ipCr.Spec.AttachSubnets = []string{} + ipCr.Spec.AttachMacs = []string{} + if _, err := csh.KubeOvnClient.KubeovnV1().IPs().Update(context.Background(), ipCr, metav1.UpdateOptions{}); err != nil { + err = fmt.Errorf("failed to update ip crd for %s, %v", ip, err) + klog.Error(err) + } else { + return nil + } + } + if err != nil { + klog.Warning("wait pod ip %s to be ready", ipCrName) + time.Sleep(1 * time.Second) } } - return nil + return err } func (csh cniServerHandler) handleDel(req *restful.Request, resp *restful.Response) {