Skip to content

Commit a9fdbf9

Browse files
Longchuanzhengzhangzujian
Longchuanzheng
andauthored
Fix relevant annotations are not deleted in hotnoplug nic process (#3108)
* Fix relevant annotations are not deleted in hotnoplug nic process Signed-off-by: zhuanlan <zhuanlan_yewu@cmss.chinamobile.com> * change error log and update pod when patch Signed-off-by: zhuanlan <zhuanlan_yewu@cmss.chinamobile.com> * Determine whether the pod has changed before updating the pod Signed-off-by: zhuanlan <zhuanlan_yewu@cmss.chinamobile.com> * Apply suggestions from code review Thanks :) Co-authored-by: 张祖建 <zhangzujian.7@gmail.com> * Return patch result to use the latest object later Signed-off-by: zhuanlan <zhuanlan_yewu@cmss.chinamobile.com> --------- Signed-off-by: zhuanlan <zhuanlan_yewu@cmss.chinamobile.com> Co-authored-by: 张祖建 <zhangzujian.7@gmail.com>
1 parent 3c6d6bc commit a9fdbf9

File tree

1 file changed

+30
-9
lines changed

1 file changed

+30
-9
lines changed

pkg/controller/pod.go

+30-9
Original file line numberDiff line numberDiff line change
@@ -579,11 +579,15 @@ func (c *Controller) handleAddOrUpdatePod(key string) (err error) {
579579
}
580580

581581
// check and do hotnoplug nic
582-
if err = c.syncKubeOvnNet(pod, podNets); err != nil {
582+
if cachedPod, err = c.syncKubeOvnNet(cachedPod, pod, podNets); err != nil {
583583
klog.Errorf("failed to sync pod nets %v", err)
584584
return err
585585
}
586-
586+
if cachedPod == nil {
587+
// pod has been deleted
588+
return nil
589+
}
590+
pod = cachedPod.DeepCopy()
587591
// check if allocate subnet is need. also allocate subnet when hotplug nic
588592
needAllocatePodNets := needAllocateSubnets(pod, podNets)
589593
if len(needAllocatePodNets) != 0 {
@@ -1080,7 +1084,7 @@ func (c *Controller) handleUpdatePodSecurity(key string) error {
10801084
}
10811085
return nil
10821086
}
1083-
func (c *Controller) syncKubeOvnNet(pod *v1.Pod, podNets []*kubeovnNet) error {
1087+
func (c *Controller) syncKubeOvnNet(cachedPod, pod *v1.Pod, podNets []*kubeovnNet) (*v1.Pod, error) {
10841088
podName := c.getNameByPod(pod)
10851089
key := fmt.Sprintf("%s/%s", pod.Namespace, podName)
10861090
targetPortNameList := strset.NewWithSize(len(podNets))
@@ -1096,7 +1100,7 @@ func (c *Controller) syncKubeOvnNet(pod *v1.Pod, podNets []*kubeovnNet) error {
10961100
ports, err := c.ovnClient.ListNormalLogicalSwitchPorts(true, map[string]string{"pod": key})
10971101
if err != nil {
10981102
klog.Errorf("failed to list lsps of pod '%s', %v", pod.Name, err)
1099-
return err
1103+
return nil, err
11001104
}
11011105

11021106
for _, port := range ports {
@@ -1113,7 +1117,7 @@ func (c *Controller) syncKubeOvnNet(pod *v1.Pod, podNets []*kubeovnNet) error {
11131117
}
11141118

11151119
if len(portsNeedToDel) == 0 {
1116-
return nil
1120+
return pod, nil
11171121
}
11181122

11191123
for _, portNeedDel := range portsNeedToDel {
@@ -1124,25 +1128,42 @@ func (c *Controller) syncKubeOvnNet(pod *v1.Pod, podNets []*kubeovnNet) error {
11241128

11251129
if err := c.ovnClient.DeleteLogicalSwitchPort(portNeedDel); err != nil {
11261130
klog.Errorf("failed to delete lsp %s, %v", portNeedDel, err)
1127-
return err
1131+
return nil, err
11281132
}
11291133
if err := c.config.KubeOvnClient.KubeovnV1().IPs().Delete(context.Background(), portNeedDel, metav1.DeleteOptions{}); err != nil {
11301134
if !k8serrors.IsNotFound(err) {
11311135
klog.Errorf("failed to delete ip %s, %v", portNeedDel, err)
1132-
return err
1136+
return nil, err
11331137
}
11341138
}
11351139
}
11361140

11371141
for _, providerName := range annotationsNeedToDel {
11381142
for annotationKey := range pod.Annotations {
1139-
if strings.HasPrefix(key, providerName) {
1143+
if strings.HasPrefix(annotationKey, providerName) {
11401144
delete(pod.Annotations, annotationKey)
11411145
}
11421146
}
11431147
}
1148+
if len(cachedPod.Annotations) == len(pod.Annotations) {
1149+
return pod, nil
1150+
}
1151+
patch, err := util.GenerateMergePatchPayload(cachedPod, pod)
1152+
if err != nil {
1153+
klog.Errorf("failed to generate patch payload for pod '%s', %v", pod.Name, err)
1154+
return nil, err
1155+
}
1156+
patchedPod, err := c.config.KubeClient.CoreV1().Pods(pod.Namespace).Patch(context.Background(), pod.Name,
1157+
types.MergePatchType, patch, metav1.PatchOptions{}, "")
1158+
if err != nil {
1159+
if k8serrors.IsNotFound(err) {
1160+
return nil, nil
1161+
}
1162+
klog.Errorf("failed to delete useless annotations for pod %s: %v", pod.Name, err)
1163+
return nil, err
1164+
}
11441165

1145-
return nil
1166+
return patchedPod.DeepCopy(), nil
11461167
}
11471168

11481169
func isStatefulSetPod(pod *v1.Pod) (bool, string) {

0 commit comments

Comments
 (0)