Skip to content

Commit

Permalink
fix provider-networks status
Browse files Browse the repository at this point in the history
use UpdateStatus method instead of patch
  • Loading branch information
zhangzujian committed Mar 31, 2022
1 parent 48e0c4e commit d3f6431
Show file tree
Hide file tree
Showing 13 changed files with 105 additions and 275 deletions.
6 changes: 6 additions & 0 deletions dist/images/install.sh
Original file line number Diff line number Diff line change
Expand Up @@ -687,6 +687,8 @@ spec:
- name: v1
served: true
storage: true
subresources:
status: {}
schema:
openAPIV3Schema:
type: object
Expand Down Expand Up @@ -740,6 +742,8 @@ spec:
- name: v1
served: true
storage: true
subresources:
status: {}
schema:
openAPIV3Schema:
type: object
Expand Down Expand Up @@ -991,6 +995,7 @@ rules:
- subnets/status
- ips
- vlans
- vlans/status
- provider-networks
- provider-networks/status
- security-groups
Expand Down Expand Up @@ -1476,6 +1481,7 @@ rules:
- subnets/status
- ips
- vlans
- vlans/status
- provider-networks
- provider-networks/status
- security-groups
Expand Down
20 changes: 0 additions & 20 deletions pkg/apis/kubeovn/v1/status.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,26 +18,6 @@ func (ss *SubnetStatus) Bytes() ([]byte, error) {
return []byte(newStr), nil
}

func (vs *VlanStatus) Bytes() ([]byte, error) {
bytes, err := json.Marshal(vs)
if err != nil {
return nil, err
}
newStr := fmt.Sprintf(`{"status": %s}`, string(bytes))
klog.V(5).Info("status body", newStr)
return []byte(newStr), nil
}

func (pns *ProviderNetworkStatus) Bytes() ([]byte, error) {
bytes, err := json.Marshal(pns)
if err != nil {
return nil, err
}
newStr := fmt.Sprintf(`{"status": %s}`, string(bytes))
klog.V(5).Info("status body", newStr)
return []byte(newStr), nil
}

func (vs *VpcStatus) Bytes() ([]byte, error) {
bytes, err := json.Marshal(vs)
if err != nil {
Expand Down
19 changes: 6 additions & 13 deletions pkg/apis/kubeovn/v1/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -219,13 +219,11 @@ type VlanSpec struct {
type VlanStatus struct {
// +optional
// +patchStrategy=merge
Subnets []string `json:"subnets,omitempty" patchStrategy:"merge"`
Subnets []string `json:"subnets,omitempty"`

// Conditions represents the latest state of the object
// +optional
// +patchMergeKey=type
// +patchStrategy=merge
Conditions []VlanCondition `json:"conditions,omitempty" patchStrategy:"merge" patchMergeKey:"type"`
Conditions []VlanCondition `json:"conditions,omitempty"`
}

// Condition describes the state of an object at a certain point.
Expand Down Expand Up @@ -283,22 +281,17 @@ type ProviderNetworkSpec struct {

type ProviderNetworkStatus struct {
// +optional
// +patchStrategy=merge
Ready bool `json:"ready" patchStrategy:"merge"`
Ready bool `json:"ready"`

// +optional
// +patchStrategy=merge
ReadyNodes []string `json:"readyNodes,omitempty" patchStrategy:"merge"`
ReadyNodes []string `json:"readyNodes,omitempty"`

// +optional
// +patchStrategy=merge
Vlans []string `json:"vlans,omitempty" patchStrategy:"merge"`
Vlans []string `json:"vlans,omitempty"`

// Conditions represents the latest state of the object
// +optional
// +patchMergeKey=node
// +patchStrategy=merge
Conditions []ProviderNetworkCondition `json:"conditions,omitempty" patchStrategy:"merge" patchMergeKey:"node"`
Conditions []ProviderNetworkCondition `json:"conditions,omitempty"`
}

// Condition describes the state of an object at a certain point.
Expand Down
77 changes: 25 additions & 52 deletions pkg/controller/node.go
Original file line number Diff line number Diff line change
Expand Up @@ -410,7 +410,7 @@ func (c *Controller) handleNodeAnnotationsForProviderNetworks(node *v1.Node) err
}

if newPn != nil {
if _, err = c.config.KubeOvnClient.KubeovnV1().ProviderNetworks().Update(context.Background(), newPn, metav1.UpdateOptions{}); err != nil {
if newPn, err = c.config.KubeOvnClient.KubeovnV1().ProviderNetworks().Update(context.Background(), newPn, metav1.UpdateOptions{}); err != nil {
klog.Errorf("failed to update provider network %s: %v", pn.Name, err)
return err
}
Expand All @@ -429,16 +429,16 @@ func (c *Controller) handleNodeAnnotationsForProviderNetworks(node *v1.Node) err
}

if excluded {
status := pn.Status.DeepCopy()
if status.EnsureNodeStandardConditions(node.Name) {
bytes, err := status.Bytes()
if err != nil {
klog.Error(err)
return err
}
_, err = c.config.KubeOvnClient.KubeovnV1().ProviderNetworks().Patch(context.Background(), pn.Name, types.MergePatchType, bytes, metav1.PatchOptions{})
if newPn == nil {
newPn = pn.DeepCopy()
} else {
newPn = newPn.DeepCopy()
}

if newPn.Status.EnsureNodeStandardConditions(node.Name) {
_, err = c.config.KubeOvnClient.KubeovnV1().ProviderNetworks().UpdateStatus(context.Background(), newPn, metav1.UpdateOptions{})
if err != nil {
klog.Errorf("failed to patch provider network %s: %v", pn.Name, err)
klog.Errorf("failed to update status of provider network %s: %v", pn.Name, err)
return err
}
}
Expand Down Expand Up @@ -512,53 +512,26 @@ func (c *Controller) handleDeleteNode(key string) error {

func (c *Controller) updateProviderNetworkForNodeDeletion(pn *kubeovnv1.ProviderNetwork, node string) error {
// update provider network status
status := pn.Status.DeepCopy()
if util.ContainsString(status.ReadyNodes, node) {
status.ReadyNodes = util.RemoveString(status.ReadyNodes, node)
if len(status.ReadyNodes) == 0 {
bytes := []byte(`[{ "op": "remove", "path": "/status/readyNodes"}]`)
_, 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 := status.Bytes()
if err != nil {
klog.Error(err)
return err
}
_, 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
}
}
var needUpdate bool
newPn := pn.DeepCopy()
if util.ContainsString(newPn.Status.ReadyNodes, node) {
newPn.Status.ReadyNodes = util.RemoveString(newPn.Status.ReadyNodes, node)
needUpdate = true
}
if status.RemoveNodeConditions(node) {
if len(status.Conditions) == 0 {
bytes := []byte(`[{ "op": "remove", "path": "/status/conditions"}]`)
_, 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 := status.Bytes()
if err != nil {
klog.Error(err)
return err
}
_, 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
}
if newPn.Status.RemoveNodeConditions(node) {
needUpdate = true
}
if needUpdate {
var err error
newPn, err = c.config.KubeOvnClient.KubeovnV1().ProviderNetworks().UpdateStatus(context.Background(), newPn, metav1.UpdateOptions{})
if err != nil {
klog.Errorf("failed to update status of provider network %s: %v", pn.Name, err)
return err
}
}

// update provider network spec
var newPn *kubeovnv1.ProviderNetwork
pn, newPn = newPn, nil
if excludeNodes := util.RemoveString(pn.Spec.ExcludeNodes, node); len(excludeNodes) != len(pn.Spec.ExcludeNodes) {
newPn := pn.DeepCopy()
newPn.Spec.ExcludeNodes = excludeNodes
Expand Down
8 changes: 4 additions & 4 deletions pkg/controller/provider-network.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ import (
k8serrors "k8s.io/apimachinery/pkg/api/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/labels"
"k8s.io/apimachinery/pkg/types"
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
"k8s.io/client-go/tools/cache"
"k8s.io/klog/v2"
Expand Down Expand Up @@ -83,10 +82,11 @@ func (c *Controller) handleUpdateProviderNetwork(key string) error {
}

if providerNetworkIsReady(pn, nodes) != pn.Status.Ready {
patchPayload := []byte(fmt.Sprintf(`[{ "op": "replace", "path": "/status/ready", "value": %t }]`, !pn.Status.Ready))
_, err = c.config.KubeOvnClient.KubeovnV1().ProviderNetworks().Patch(context.Background(), pn.Name, types.JSONPatchType, patchPayload, metav1.PatchOptions{})
newPn := pn.DeepCopy()
newPn.Status.Ready = !pn.Status.Ready
_, err = c.config.KubeOvnClient.KubeovnV1().ProviderNetworks().UpdateStatus(context.Background(), newPn, metav1.UpdateOptions{})
if err != nil {
klog.Errorf("failed to patch provider network %s: %v", pn.Name, err)
klog.Errorf("failed to update status of provider network %s: %v", pn.Name, err)
return err
}
}
Expand Down
46 changes: 14 additions & 32 deletions pkg/controller/subnet.go
Original file line number Diff line number Diff line change
Expand Up @@ -889,30 +889,18 @@ func (c *Controller) handleDeleteSubnet(subnet *kubeovnv1.Subnet) error {
}

func (c *Controller) updateVlanStatusForSubnetDeletion(vlan *kubeovnv1.Vlan, subnet string) error {
if util.ContainsString(vlan.Status.Subnets, subnet) {
status := vlan.Status.DeepCopy()
status.Subnets = util.RemoveString(status.Subnets, subnet)
if len(status.Subnets) == 0 {
bytes := []byte(`[{ "op": "remove", "path": "/status/subnets"}]`)
_, err := c.config.KubeOvnClient.KubeovnV1().Vlans().Patch(context.Background(), vlan.Name, types.JSONPatchType, bytes, metav1.PatchOptions{})
if err != nil {
klog.Errorf("failed to patch vlan %s: %v", vlan.Name, err)
return err
}
} else {
bytes, err := status.Bytes()
if err != nil {
klog.Error(err)
return err
}
if !util.ContainsString(vlan.Status.Subnets, subnet) {
return nil
}

_, 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
}
}
newVlan := vlan.DeepCopy()
newVlan.Status.Subnets = util.RemoveString(newVlan.Status.Subnets, subnet)
_, err := c.config.KubeOvnClient.KubeovnV1().Vlans().UpdateStatus(context.Background(), newVlan, metav1.UpdateOptions{})
if err != nil {
klog.Errorf("failed to update status of vlan %s: %v", vlan.Name, err)
return err
}

return nil
}

Expand Down Expand Up @@ -1362,17 +1350,11 @@ func (c *Controller) reconcileVlan(subnet *kubeovnv1.Subnet) error {
}

if !util.ContainsString(vlan.Status.Subnets, subnet.Name) {
status := vlan.Status.DeepCopy()
status.Subnets = append(status.Subnets, subnet.Name)
bytes, err := status.Bytes()
if err != nil {
klog.Error(err)
return err
}

_, err = c.config.KubeOvnClient.KubeovnV1().Vlans().Patch(context.Background(), vlan.Name, types.MergePatchType, bytes, metav1.PatchOptions{})
newVlan := vlan.DeepCopy()
newVlan.Status.Subnets = append(newVlan.Status.Subnets, subnet.Name)
_, err = c.config.KubeOvnClient.KubeovnV1().Vlans().UpdateStatus(context.Background(), newVlan, metav1.UpdateOptions{})
if err != nil {
klog.Errorf("failed to patch vlan %s: %v", vlan.Name, err)
klog.Errorf("failed to update status of vlan %s: %v", vlan.Name, err)
return err
}
}
Expand Down
55 changes: 14 additions & 41 deletions pkg/controller/vlan.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ import (
k8serrors "k8s.io/apimachinery/pkg/api/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/labels"
"k8s.io/apimachinery/pkg/types"
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
"k8s.io/client-go/tools/cache"
"k8s.io/klog/v2"
Expand Down Expand Up @@ -189,10 +188,11 @@ func (c *Controller) handleAddVlan(key string) error {
vlan := cachedVlan.DeepCopy()
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 {
if vlan, 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
}
vlan = vlan.DeepCopy()
}

subnets, err := c.subnetsLister.List(labels.Everything())
Expand All @@ -210,15 +210,9 @@ func (c *Controller) handleAddVlan(key string) error {
}

if needUpdate {
bytes, err := vlan.Status.Bytes()
_, err = c.config.KubeOvnClient.KubeovnV1().Vlans().UpdateStatus(context.Background(), vlan, metav1.UpdateOptions{})
if err != nil {
klog.Error(err)
return err
}

_, 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)
klog.Errorf("failed to update status of vlan %s: %v", vlan.Name, err)
return err
}
}
Expand All @@ -230,17 +224,11 @@ func (c *Controller) handleAddVlan(key string) error {
}

if !util.ContainsString(pn.Status.Vlans, vlan.Name) {
status := pn.Status.DeepCopy()
status.Vlans = append(status.Vlans, vlan.Name)
bytes, err := status.Bytes()
if err != nil {
klog.Error(err)
return err
}

_, err = c.config.KubeOvnClient.KubeovnV1().ProviderNetworks().Patch(context.Background(), pn.Name, types.MergePatchType, bytes, metav1.PatchOptions{})
newPn := pn.DeepCopy()
newPn.Status.Vlans = append(newPn.Status.Vlans, vlan.Name)
_, err = c.config.KubeOvnClient.KubeovnV1().ProviderNetworks().UpdateStatus(context.Background(), newPn, metav1.UpdateOptions{})
if err != nil {
klog.Errorf("failed to patch provider network %s: %v", pn.Name, err)
klog.Errorf("failed to update status of provider network %s: %v", pn.Name, err)
return err
}
}
Expand Down Expand Up @@ -315,27 +303,12 @@ func (c *Controller) updateProviderNetworkStatusForVlanDeletion(pn *kubeovnv1.Pr
return nil
}

status := pn.Status.DeepCopy()
status.Vlans = util.RemoveString(status.Vlans, vlan)
if len(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 := status.Bytes()
if err != nil {
klog.Error(err)
return err
}

_, 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
}
newPn := pn.DeepCopy()
newPn.Status.Vlans = util.RemoveString(newPn.Status.Vlans, vlan)
_, err := c.config.KubeOvnClient.KubeovnV1().ProviderNetworks().UpdateStatus(context.Background(), newPn, metav1.UpdateOptions{})
if err != nil {
klog.Errorf("failed to update status of provider network %s: %v", pn.Name, err)
return err
}

return nil
Expand Down

0 comments on commit d3f6431

Please sign in to comment.