Skip to content

Commit

Permalink
fix read-only pointer in vlan and provider-network
Browse files Browse the repository at this point in the history
  • Loading branch information
zhangzujian committed Nov 2, 2021
1 parent 0a2c767 commit a9c0a4a
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 23 deletions.
25 changes: 14 additions & 11 deletions pkg/controller/vlan.go
Original file line number Diff line number Diff line change
Expand Up @@ -177,7 +177,7 @@ func (c *Controller) processNextDelVlanWorkItem() bool {
}

func (c *Controller) handleAddVlan(key string) error {
vlan, err := c.vlansLister.Get(key)
cachedVlan, err := c.vlansLister.Get(key)
if err != nil {
if k8serrors.IsNotFound(err) {
return nil
Expand All @@ -186,9 +186,10 @@ func (c *Controller) handleAddVlan(key string) error {
return err
}

vlan := cachedVlan.DeepCopy()
if vlan.Spec.Provider == "" {
vlan.Spec.Provider = c.config.DefaultProviderName
if vlan, err = c.config.KubeOvnClient.KubeovnV1().Vlans().Update(context.Background(), vlan, metav1.UpdateOptions{}); err != nil {
if _, err = c.config.KubeOvnClient.KubeovnV1().Vlans().Update(context.Background(), vlan, metav1.UpdateOptions{}); err != nil {
klog.Errorf("failed to update vlan %s, %v", vlan.Name, err)
return err
}
Expand All @@ -215,7 +216,7 @@ func (c *Controller) handleAddVlan(key string) error {
return err
}

vlan, err = c.config.KubeOvnClient.KubeovnV1().Vlans().Patch(context.Background(), vlan.Name, types.MergePatchType, bytes, metav1.PatchOptions{})
_, err = c.config.KubeOvnClient.KubeovnV1().Vlans().Patch(context.Background(), vlan.Name, types.MergePatchType, bytes, metav1.PatchOptions{})
if err != nil {
klog.Errorf("failed to patch vlan %s: %v", vlan.Name, err)
return err
Expand All @@ -229,8 +230,9 @@ func (c *Controller) handleAddVlan(key string) error {
}

if !util.ContainsString(pn.Status.Vlans, vlan.Name) {
pn.Status.Vlans = append(pn.Status.Vlans, vlan.Name)
bytes, err := pn.Status.Bytes()
newPn := pn.DeepCopy()
newPn.Status.Vlans = append(pn.Status.Vlans, vlan.Name)
bytes, err := newPn.Status.Bytes()
if err != nil {
klog.Error(err)
return err
Expand All @@ -252,13 +254,13 @@ func (c *Controller) handleUpdateVlan(key string) error {
if k8serrors.IsNotFound(err) {
return nil
}

return err
}

if vlan.Spec.Provider == "" {
vlan.Spec.Provider = c.config.DefaultProviderName
if _, err = c.config.KubeOvnClient.KubeovnV1().Vlans().Update(context.Background(), vlan, metav1.UpdateOptions{}); err != nil {
newVlan := vlan.DeepCopy()
newVlan.Spec.Provider = c.config.DefaultProviderName
if _, err = c.config.KubeOvnClient.KubeovnV1().Vlans().Update(context.Background(), newVlan, metav1.UpdateOptions{}); err != nil {
klog.Errorf("failed to update vlan %s: %v", vlan.Name, err)
return err
}
Expand Down Expand Up @@ -313,16 +315,17 @@ func (c *Controller) updateProviderNetworkStatusForVlanDeletion(pn *kubeovnv1.Pr
return nil
}

pn.Status.Vlans = util.RemoveString(pn.Status.Vlans, vlan)
if len(pn.Status.Vlans) == 0 {
newPn := pn.DeepCopy()
newPn.Status.Vlans = util.RemoveString(newPn.Status.Vlans, vlan)
if len(newPn.Status.Vlans) == 0 {
bytes := []byte(`[{ "op": "remove", "path": "/status/vlans"}]`)
_, err := c.config.KubeOvnClient.KubeovnV1().ProviderNetworks().Patch(context.Background(), pn.Name, types.JSONPatchType, bytes, metav1.PatchOptions{})
if err != nil {
klog.Errorf("failed to patch provider network %s: %v", pn.Name, err)
return err
}
} else {
bytes, err := pn.Status.Bytes()
bytes, err := newPn.Status.Bytes()
if err != nil {
klog.Error(err)
return err
Expand Down
24 changes: 12 additions & 12 deletions pkg/daemon/controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -265,9 +265,9 @@ func (c *Controller) handleAddOrUpdateProviderNetwork(key string) error {
}

if util.ContainsString(pn.Spec.ExcludeNodes, node.Name) {
return c.cleanProviderNetwork(pn, node)
return c.cleanProviderNetwork(pn.DeepCopy(), node.DeepCopy())
}
return c.initProviderNetwork(pn, node)
return c.initProviderNetwork(pn.DeepCopy(), node.DeepCopy())
}

func (c *Controller) initProviderNetwork(pn *kubeovnv1.ProviderNetwork, node *v1.Node) error {
Expand All @@ -277,7 +277,7 @@ func (c *Controller) initProviderNetwork(pn *kubeovnv1.ProviderNetwork, node *v1
klog.Error(err)
return err
}
pn, err = c.config.KubeOvnClient.KubeovnV1().ProviderNetworks().Patch(context.Background(), pn.Name, types.MergePatchType, bytes, metav1.PatchOptions{})
_, err = c.config.KubeOvnClient.KubeovnV1().ProviderNetworks().Patch(context.Background(), pn.Name, types.MergePatchType, bytes, metav1.PatchOptions{})
if err != nil {
klog.Errorf("failed to patch provider network %s: %v", pn.Name, err)
return err
Expand Down Expand Up @@ -451,7 +451,7 @@ func (c *Controller) cleanProviderNetwork(pn *kubeovnv1.ProviderNetwork, node *v
if pn.Status.RemoveNodeConditions(node.Name) {
if len(pn.Status.Conditions) == 0 {
bytes := []byte(`[{ "op": "remove", "path": "/status/conditions"}]`)
pn, err = c.config.KubeOvnClient.KubeovnV1().ProviderNetworks().Patch(context.Background(), pn.Name, types.JSONPatchType, bytes, metav1.PatchOptions{})
_, err = c.config.KubeOvnClient.KubeovnV1().ProviderNetworks().Patch(context.Background(), pn.Name, types.JSONPatchType, bytes, metav1.PatchOptions{})
if err != nil {
klog.Errorf("failed to patch provider network %s: %v", pn.Name, err)
return err
Expand All @@ -462,7 +462,7 @@ func (c *Controller) cleanProviderNetwork(pn *kubeovnv1.ProviderNetwork, node *v
klog.Error(err)
return err
}
pn, err = c.config.KubeOvnClient.KubeovnV1().ProviderNetworks().Patch(context.Background(), pn.Name, types.MergePatchType, bytes, metav1.PatchOptions{})
_, err = c.config.KubeOvnClient.KubeovnV1().ProviderNetworks().Patch(context.Background(), pn.Name, types.MergePatchType, bytes, metav1.PatchOptions{})
if err != nil {
klog.Errorf("failed to patch provider network %s: %v", pn.Name, err)
return err
Expand Down Expand Up @@ -505,17 +505,17 @@ func (c *Controller) handleDeleteProviderNetwork(pn *kubeovnv1.ProviderNetwork)
return nil
}

newNode := node.DeepCopy()
delete(newNode.Labels, fmt.Sprintf(util.ProviderNetworkReadyTemplate, pn.Name))
delete(newNode.Labels, fmt.Sprintf(util.ProviderNetworkExcludeTemplate, pn.Name))
delete(newNode.Labels, fmt.Sprintf(util.ProviderNetworkInterfaceTemplate, pn.Name))
delete(newNode.Labels, fmt.Sprintf(util.ProviderNetworkMtuTemplate, pn.Name))
raw, _ := json.Marshal(newNode.Labels)
patchPayloadTemplate := `[{ "op": "replace", "path": "/metadata/labels", "value": %s }]`
delete(node.Labels, fmt.Sprintf(util.ProviderNetworkReadyTemplate, pn.Name))
delete(node.Labels, fmt.Sprintf(util.ProviderNetworkExcludeTemplate, pn.Name))
delete(node.Labels, fmt.Sprintf(util.ProviderNetworkInterfaceTemplate, pn.Name))
delete(node.Labels, fmt.Sprintf(util.ProviderNetworkMtuTemplate, pn.Name))

raw, _ := json.Marshal(node.Labels)
patchPayload := fmt.Sprintf(patchPayloadTemplate, raw)
_, err = c.config.KubeClient.CoreV1().Nodes().Patch(context.Background(), node.Name, types.JSONPatchType, []byte(patchPayload), metav1.PatchOptions{})
if err != nil {
klog.Errorf("patch node %s failed %v", node.Name, err)
klog.Errorf("failed to patch node %s: %v", node.Name, err)
return err
}

Expand Down

0 comments on commit a9c0a4a

Please sign in to comment.