From 0bbc99fd3ce459b970b43983118f719addbca60d Mon Sep 17 00:00:00 2001 From: wenqiq Date: Wed, 2 Jun 2021 03:01:13 +0800 Subject: [PATCH] Add egress status of api and Update codegen of egress status --- build/yamls/antrea-aks.yml | 14 ++++ build/yamls/antrea-eks.yml | 14 ++++ build/yamls/antrea-gke.yml | 14 ++++ build/yamls/antrea-ipsec.yml | 14 ++++ build/yamls/antrea.yml | 14 ++++ build/yamls/base/agent-rbac.yml | 3 + build/yamls/base/crds.yml | 11 +++ cmd/antrea-agent/agent.go | 13 ++-- .../controller/egress/egress_controller.go | 68 +++++++++++++------ pkg/agent/memberlist/cluster.go | 65 +++++++++--------- pkg/agent/memberlist/cluster_test.go | 6 +- pkg/apis/crd/v1alpha2/types.go | 3 +- .../crd/v1alpha2/zz_generated.deepcopy.go | 17 +++++ .../versioned/typed/crd/v1alpha2/egress.go | 16 +++++ .../typed/crd/v1alpha2/fake/fake_egress.go | 11 +++ pkg/controller/metrics/prometheus.go | 7 ++ 16 files changed, 231 insertions(+), 59 deletions(-) diff --git a/build/yamls/antrea-aks.yml b/build/yamls/antrea-aks.yml index e7eca1cb196..111efe17cb4 100644 --- a/build/yamls/antrea-aks.yml +++ b/build/yamls/antrea-aks.yml @@ -1345,6 +1345,10 @@ spec: - jsonPath: .metadata.creationTimestamp name: Age type: date + - description: The Owner Node of egress IP + jsonPath: .status.nodeName + name: Status + type: string name: v1alpha2 schema: openAPIV3Schema: @@ -1414,11 +1418,18 @@ spec: - appliedTo - egressIP type: object + status: + properties: + nodeName: + type: string + type: object required: - spec type: object served: true storage: true + subresources: + status: {} --- apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition @@ -3199,10 +3210,13 @@ rules: - crd.antrea.io resources: - egresses + - egresses/status verbs: - get - watch - list + - update + - patch --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole diff --git a/build/yamls/antrea-eks.yml b/build/yamls/antrea-eks.yml index a32a3e41011..044758f5597 100644 --- a/build/yamls/antrea-eks.yml +++ b/build/yamls/antrea-eks.yml @@ -1345,6 +1345,10 @@ spec: - jsonPath: .metadata.creationTimestamp name: Age type: date + - description: The Owner Node of egress IP + jsonPath: .status.nodeName + name: Status + type: string name: v1alpha2 schema: openAPIV3Schema: @@ -1414,11 +1418,18 @@ spec: - appliedTo - egressIP type: object + status: + properties: + nodeName: + type: string + type: object required: - spec type: object served: true storage: true + subresources: + status: {} --- apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition @@ -3199,10 +3210,13 @@ rules: - crd.antrea.io resources: - egresses + - egresses/status verbs: - get - watch - list + - update + - patch --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole diff --git a/build/yamls/antrea-gke.yml b/build/yamls/antrea-gke.yml index e7bba9c03e4..a52c6e70ce6 100644 --- a/build/yamls/antrea-gke.yml +++ b/build/yamls/antrea-gke.yml @@ -1345,6 +1345,10 @@ spec: - jsonPath: .metadata.creationTimestamp name: Age type: date + - description: The Owner Node of egress IP + jsonPath: .status.nodeName + name: Status + type: string name: v1alpha2 schema: openAPIV3Schema: @@ -1414,11 +1418,18 @@ spec: - appliedTo - egressIP type: object + status: + properties: + nodeName: + type: string + type: object required: - spec type: object served: true storage: true + subresources: + status: {} --- apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition @@ -3199,10 +3210,13 @@ rules: - crd.antrea.io resources: - egresses + - egresses/status verbs: - get - watch - list + - update + - patch --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole diff --git a/build/yamls/antrea-ipsec.yml b/build/yamls/antrea-ipsec.yml index 04843997e24..7aed137e6a0 100644 --- a/build/yamls/antrea-ipsec.yml +++ b/build/yamls/antrea-ipsec.yml @@ -1345,6 +1345,10 @@ spec: - jsonPath: .metadata.creationTimestamp name: Age type: date + - description: The Owner Node of egress IP + jsonPath: .status.nodeName + name: Status + type: string name: v1alpha2 schema: openAPIV3Schema: @@ -1414,11 +1418,18 @@ spec: - appliedTo - egressIP type: object + status: + properties: + nodeName: + type: string + type: object required: - spec type: object served: true storage: true + subresources: + status: {} --- apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition @@ -3199,10 +3210,13 @@ rules: - crd.antrea.io resources: - egresses + - egresses/status verbs: - get - watch - list + - update + - patch --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole diff --git a/build/yamls/antrea.yml b/build/yamls/antrea.yml index 7e5bba28c20..613f05ff8d3 100644 --- a/build/yamls/antrea.yml +++ b/build/yamls/antrea.yml @@ -1345,6 +1345,10 @@ spec: - jsonPath: .metadata.creationTimestamp name: Age type: date + - description: The Owner Node of egress IP + jsonPath: .status.nodeName + name: Status + type: string name: v1alpha2 schema: openAPIV3Schema: @@ -1414,11 +1418,18 @@ spec: - appliedTo - egressIP type: object + status: + properties: + nodeName: + type: string + type: object required: - spec type: object served: true storage: true + subresources: + status: {} --- apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition @@ -3199,10 +3210,13 @@ rules: - crd.antrea.io resources: - egresses + - egresses/status verbs: - get - watch - list + - update + - patch --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole diff --git a/build/yamls/base/agent-rbac.yml b/build/yamls/base/agent-rbac.yml index 13c94107750..73b3531a459 100644 --- a/build/yamls/base/agent-rbac.yml +++ b/build/yamls/base/agent-rbac.yml @@ -146,10 +146,13 @@ rules: - crd.antrea.io resources: - egresses + - egresses/status verbs: - get - watch - list + - update + - patch --- kind: ClusterRoleBinding apiVersion: rbac.authorization.k8s.io/v1 diff --git a/build/yamls/base/crds.yml b/build/yamls/base/crds.yml index 6e06ef13027..9143f2431ae 100644 --- a/build/yamls/base/crds.yml +++ b/build/yamls/base/crds.yml @@ -80,6 +80,11 @@ spec: enum: - Auto - None + status: + type: object + properties: + nodeName: + type: string additionalPrinterColumns: - description: Specifies the SNAT IP address for the selected workloads. jsonPath: .spec.egressIP @@ -88,6 +93,12 @@ spec: - jsonPath: .metadata.creationTimestamp name: Age type: date + - description: The Owner Node of egress IP + jsonPath: .status.nodeName + name: Status + type: string + subresources: + status: {} scope: Cluster names: plural: egresses diff --git a/cmd/antrea-agent/agent.go b/cmd/antrea-agent/agent.go index a2d451b650c..4cf90b02ee2 100644 --- a/cmd/antrea-agent/agent.go +++ b/cmd/antrea-agent/agent.go @@ -225,12 +225,17 @@ func run(o *Options) error { var egressController *egress.EgressController if features.DefaultFeatureGate.Enabled(features.Egress) { - gossipCluster, err := memberlist.NewGossipCluster(o.config.GossipClusterPort, nodeInformer, nodeConfig) - if err != nil { - return fmt.Errorf("initializing egress node memberlist cluster error: %v", err) + // turn on the egress auto failover switch, to-do + nodeAutoFailoverSupport := true + var gossipCluster *memberlist.GossipCluster + if nodeAutoFailoverSupport { + gossipCluster, err = memberlist.NewGossipCluster(o.config.GossipClusterPort, nodeInformer, nodeConfig) + if err != nil { + return fmt.Errorf("initializing egress node memberlist cluster error: %v", err) + } } egressController = egress.NewEgressController(ofClient, egressInformer, antreaClientProvider, ifaceStore, - routeClient, nodeConfig.Name, gossipCluster) + routeClient, nodeConfig.Name, gossipCluster, crdClient, nodeAutoFailoverSupport) } isChaining := false diff --git a/pkg/agent/controller/egress/egress_controller.go b/pkg/agent/controller/egress/egress_controller.go index a74502d9598..f5aa6cb1c68 100644 --- a/pkg/agent/controller/egress/egress_controller.go +++ b/pkg/agent/controller/egress/egress_controller.go @@ -41,8 +41,10 @@ import ( "antrea.io/antrea/pkg/agent/route" cpv1b2 "antrea.io/antrea/pkg/apis/controlplane/v1beta2" crdv1a2 "antrea.io/antrea/pkg/apis/crd/v1alpha2" + clientsetversioned "antrea.io/antrea/pkg/client/clientset/versioned" crdinformers "antrea.io/antrea/pkg/client/informers/externalversions/crd/v1alpha2" crdlisters "antrea.io/antrea/pkg/client/listers/crd/v1alpha2" + "antrea.io/antrea/pkg/controller/metrics" "antrea.io/antrea/pkg/util/k8s" ) @@ -103,6 +105,7 @@ type egressBinding struct { type EgressController struct { ofClient openflow.Client routeClient route.Interface + crdClient clientsetversioned.Interface antreaClientProvider agent.AntreaClientProvider egressInformer cache.SharedIndexInformer @@ -130,7 +133,8 @@ type EgressController struct { egressIPStates map[string]*egressIPState egressIPStatesMutex sync.Mutex - gossipCluster *memberlist.GossipCluster + gossipCluster *memberlist.GossipCluster + autoFailoverSupport bool } func NewEgressController( @@ -141,6 +145,8 @@ func NewEgressController( routeClient route.Interface, nodeName string, gossipCluster *memberlist.GossipCluster, + crdClient clientsetversioned.Interface, + failoverSupport bool, ) *EgressController { localIPDetector := NewLocalIPDetector() c := &EgressController{ @@ -160,6 +166,8 @@ func NewEgressController( localIPDetector: localIPDetector, idAllocator: newIDAllocator(minEgressMark, maxEgressMark), gossipCluster: gossipCluster, + crdClient: crdClient, + autoFailoverSupport: failoverSupport, } c.egressInformer.AddIndexers(cache.Indexers{egressIPIndex: func(obj interface{}) ([]string, error) { @@ -180,7 +188,9 @@ func NewEgressController( resyncPeriod, ) localIPDetector.AddEventHandler(c.onLocalIPUpdate) - c.gossipCluster.EventHandler = c.onClusterNodeUpdate + if c.autoFailoverSupport { + c.gossipCluster.AddEventHandler(c.onClusterNodeUpdate) + } return c } @@ -219,7 +229,7 @@ func (c *EgressController) onLocalIPUpdate(ip string, added bool) { func (c *EgressController) onClusterNodeUpdate(nodeName string, join bool) { var egresses []*crdv1a2.Egress if join { - // list all egress of local node, and move not hitted egress + // list all egress of local node, and move not hit egress c.egressStatesMutex.RLock() defer c.egressStatesMutex.RUnlock() for egressName := range c.egressStates { @@ -229,15 +239,11 @@ func (c *EgressController) onClusterNodeUpdate(nodeName string, join bool) { egress, _ := c.egressLister.Get(egressName) egresses = append(egresses, egress) } - klog.V(0).Infof("..........Detected cluster node (%s) joined", nodeName) + klog.V(0).Infof("Detected cluster node (%s) joined, and egress should unbind", nodeName) } else { - // list egress of leave node and handler the egress if hitted by local node - klog.V(0).Infof("............Detected cluster node (%s) leave", nodeName) - - // how to list all egress by node_name? selector := labels.NewSelector() selector.Add(*labels.NewRequirement("status", selection.In, []string{nodeName})) - egressesOfLeaveNode, _ := c.egressLister.List(labels.Everything()) - klog.V(0).Infof("..........List %d egresses by node %s", len(egressesOfLeaveNode), nodeName) - for _, egress := range egressesOfLeaveNode { + // list egress owned by left node and handler the egress if hit by local node + egressesOfLeftNode, _ := c.egressLister.List(labels.Everything()) + for _, egress := range egressesOfLeftNode { if egress.Status.NodeName != nodeName { continue } @@ -245,12 +251,12 @@ func (c *EgressController) onClusterNodeUpdate(nodeName string, join bool) { egresses = append(egresses, egress) } } - klog.V(0).Infof("........list egresses: %#v, filtered egress: %#v", egressesOfLeaveNode, egresses) + klog.V(0).Infof("Detected cluster node (%s) left, and egress should bind", nodeName) } - klog.V(0).Infof("...........enqueue egress work: %#v", egresses) for _, egress := range egresses { c.enqueueEgress(egress) } + klog.V(0).Infof("%d egress should move and enqueue egress worker", len(egresses)) } // Run will create defaultWorkers workers (go routines) which will process the Egress events from the @@ -263,15 +269,19 @@ func (c *EgressController) Run(stopCh <-chan struct{}) { go c.localIPDetector.Run(stopCh) - go c.gossipCluster.Run(stopCh) + if c.autoFailoverSupport { + go c.gossipCluster.Run(stopCh) + } if !cache.WaitForNamedCacheSync(controllerName, stopCh, c.egressListerSynced, c.localIPDetector.HasSynced) { return } + go wait.NonSlidingUntil(c.watchEgressGroup, 5*time.Second, stopCh) + // if node support egress failover - if true { - // when a new node join gossip cluster, it shoud handle the egress that hited itself(moved from other nodes) + if c.autoFailoverSupport { + // when a new node join gossip cluster, it should handle the egress that hit itself(moved from other nodes) egresses, _ := c.egressLister.List(labels.Everything()) for _, e := range egresses { @@ -281,8 +291,6 @@ func (c *EgressController) Run(stopCh <-chan struct{}) { } } - go wait.NonSlidingUntil(c.watchEgressGroup, 5*time.Second, stopCh) - for i := 0; i < defaultWorkers; i++ { go wait.Until(c.worker, time.Second, stopCh) } @@ -501,6 +509,22 @@ func (c *EgressController) unbindPodEgress(pod, egress string) (string, bool) { return "", false } +func (c *EgressController) updateEgressStatus(egress *crdv1a2.Egress, nodeName string) error { + klog.V(0).Infof("Egress status : %#v, update to : %s", egress.Status, nodeName) + if egress.Status.NodeName == nodeName { + return nil + } + toUpdate := egress.DeepCopy() + toUpdate.Status.NodeName = nodeName + if _, err := c.crdClient.CrdV1alpha2().Egresses().UpdateStatus(context.TODO(), toUpdate, metav1.UpdateOptions{}); err != nil { + klog.Warningf("egress update error: %s", err) + return err + } + klog.V(0).Infof("update egress %s status success", egress.Name) + metrics.AntreaEgressStatusUpdates.Inc() + return nil +} + func (c *EgressController) syncEgress(egressName string) error { startTime := time.Now() defer func() { @@ -524,7 +548,7 @@ func (c *EgressController) syncEgress(egressName string) error { return err } - if egress.Spec.EgressFailoverPolicyType == crdv1a2.EgressFailoverPolicyTypeAuto { + if c.autoFailoverSupport && egress.Spec.EgressFailoverPolicyType == crdv1a2.EgressFailoverPolicyTypeAuto { if c.gossipCluster.ShouldSelect(egressName) { if !c.localIPDetector.IsLocalIP(egress.Spec.EgressIP) { a := NewNodeEgressIPAssigner(c.gossipCluster.NodeConfig) @@ -532,7 +556,11 @@ func (c *EgressController) syncEgress(egressName string) error { return err } } - egress.Status.NodeName = c.nodeName + if err := c.updateEgressStatus(egress, c.nodeName); err != nil { + return fmt.Errorf("update egress status error:%s", err.Error()) + } + klog.V(0).Infof("Assigned owner node %s for egress %s and update status", + c.nodeName, egressName) } else { if c.localIPDetector.IsLocalIP(egress.Spec.EgressIP) { a := NewNodeEgressIPAssigner(c.gossipCluster.NodeConfig) diff --git a/pkg/agent/memberlist/cluster.go b/pkg/agent/memberlist/cluster.go index 7ab2926172c..b363e66fd36 100644 --- a/pkg/agent/memberlist/cluster.go +++ b/pkg/agent/memberlist/cluster.go @@ -20,7 +20,6 @@ import ( "time" "github.com/golang/groupcache/consistenthash" - "github.com/hashicorp/memberlist" corev1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/labels" @@ -31,26 +30,27 @@ import ( "antrea.io/antrea/pkg/agent/config" ) -const defaultInterval = 30 * time.Second +const defaultClusterHealthzAskInterval = 40 * time.Second type IGossipCluster interface { Run(stopCh <-chan struct{}) ShouldSelect(name string) bool + AddEventHandler(handler clusterNodeEventHandler) } type clusterNodeEventHandler func(ip string, added bool) type GossipCluster struct { - bindPort int - NodeConfig *config.NodeConfig - nodeInformer coreinformers.NodeInformer - memberList *memberlist.Memberlist - memberRWLock sync.RWMutex - existingMembers []string - defaultInterval time.Duration - conHash *consistenthash.Map - nodeEventsCh chan memberlist.NodeEvent - EventHandler clusterNodeEventHandler + bindPort int + NodeConfig *config.NodeConfig + nodeInformer coreinformers.NodeInformer + memberList *memberlist.Memberlist + memberRWLock sync.RWMutex + existingMembers []string + defaultClusterHealthzAskInterval time.Duration + conHash *consistenthash.Map + nodeEventsCh chan memberlist.NodeEvent + ClusterNodeEventHandlers []clusterNodeEventHandler } func NewGossipCluster(p int, nodeInformer coreinformers.NodeInformer, nodeConfig *config.NodeConfig) (*GossipCluster, error) { @@ -59,11 +59,11 @@ func NewGossipCluster(p int, nodeInformer coreinformers.NodeInformer, nodeConfig // The Node join/leave events will be notified via it. nodeEventCh := make(chan memberlist.NodeEvent, 1024) s := &GossipCluster{ - bindPort: p, - nodeInformer: nodeInformer, - NodeConfig: nodeConfig, - defaultInterval: defaultInterval, - nodeEventsCh: nodeEventCh, + bindPort: p, + nodeInformer: nodeInformer, + NodeConfig: nodeConfig, + defaultClusterHealthzAskInterval: defaultClusterHealthzAskInterval, + nodeEventsCh: nodeEventCh, } s.conHash = newNodeConsistentHashMap() @@ -178,13 +178,10 @@ func (gc *GossipCluster) Run(stopCh <-chan struct{}) { gc.joinMembers(newClusterMembers) } - // Ask for members of the cluster - for i, member := range gc.memberList.Members() { - klog.V(4).Infof("Member %d: %s, Address: %s, State: %#v", i, member.Name, member.Addr, member.State) - } + gc.askClusterMemberHealthz() // Memberlist will maintain membership information in the background. - timeTicker := time.NewTicker(gc.defaultInterval) + timeTicker := time.NewTicker(gc.defaultClusterHealthzAskInterval) defer func() { timeTicker.Stop() close(gc.nodeEventsCh) @@ -196,14 +193,18 @@ func (gc *GossipCluster) Run(stopCh <-chan struct{}) { case nodeEvent := <-gc.nodeEventsCh: gc.updateNodeConsistenHash(&nodeEvent) case <-timeTicker.C: - for i, member := range gc.memberList.Members() { - klog.V(0).Infof("Gossip cluster member %d: %s, Address: %s, State: %#v", - i, member.Name, member.Addr, member.State) - } + gc.askClusterMemberHealthz() } } } +func (gc *GossipCluster) askClusterMemberHealthz() { + for i, member := range gc.memberList.Members() { + klog.V(0).Infof("Gossip cluster member %d: %s, Address: %s, State: %#v", + i, member.Name, member.Addr, member.State) + } +} + func (gc *GossipCluster) updateNodeConsistenHash(nodeEvent *memberlist.NodeEvent) { gc.memberRWLock.Lock() defer gc.memberRWLock.Unlock() @@ -243,11 +244,11 @@ func hitNodeByConsistentHash(conHash *consistenthash.Map, name, myNode string) b } func (gc *GossipCluster) notify(nodeName string, join bool) { - gc.EventHandler(nodeName, join) + for _, handler := range gc.ClusterNodeEventHandlers { + handler(nodeName, join) + } } -//func (gc *GossipCluster) HasSynced() bool { -// gc.memberRWLock.RLock() -// defer gc.memberRWLock.RUnlock() -// return gc.hasSynced -//} +func (gc *GossipCluster) AddEventHandler(handler clusterNodeEventHandler) { + gc.ClusterNodeEventHandlers = append(gc.ClusterNodeEventHandlers, handler) +} diff --git a/pkg/agent/memberlist/cluster_test.go b/pkg/agent/memberlist/cluster_test.go index 7c98e9ed86c..254b165c8f0 100644 --- a/pkg/agent/memberlist/cluster_test.go +++ b/pkg/agent/memberlist/cluster_test.go @@ -88,13 +88,17 @@ func TestMemberlistServer_Run(t *testing.T) { if err != nil { t.Fatalf("new memberlist server error: %s", err.Error()) } - s.defaultInterval = testDefaultInterval + s.defaultClusterHealthzAskInterval = testDefaultInterval // Make sure informers are running. informerFactory.Start(ctx.Done()) cache.WaitForCacheSync(ctx.Done(), nodeInformer.Informer().HasSynced) + s.AddEventHandler(func(ip string, added bool) { + t.Logf("notified node %s added (%t) node event handler", nodeName, added) + }) + go s.Run(stopCh) assert.Equal(t, 2, s.memberNum(), "expected node member num is 2") diff --git a/pkg/apis/crd/v1alpha2/types.go b/pkg/apis/crd/v1alpha2/types.go index dbe0d0c0833..711ece2b41f 100644 --- a/pkg/apis/crd/v1alpha2/types.go +++ b/pkg/apis/crd/v1alpha2/types.go @@ -190,7 +190,6 @@ type AppliedTo struct { // +genclient // +genclient:nonNamespaced -// +genclient:noStatus // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object // Egress defines which egress (SNAT) IP the traffic from the selected Pods to @@ -203,7 +202,7 @@ type Egress struct { // Specification of the desired behavior of Egress. Spec EgressSpec `json:"spec"` - // Most recently observed status of the group. + // Egress status show the owner node name of egress, if failoverPolicy set auto. Status EgressStatus `json:"status"` } diff --git a/pkg/apis/crd/v1alpha2/zz_generated.deepcopy.go b/pkg/apis/crd/v1alpha2/zz_generated.deepcopy.go index 1349bf9a243..62fc32200bc 100644 --- a/pkg/apis/crd/v1alpha2/zz_generated.deepcopy.go +++ b/pkg/apis/crd/v1alpha2/zz_generated.deepcopy.go @@ -122,6 +122,7 @@ func (in *Egress) DeepCopyInto(out *Egress) { out.TypeMeta = in.TypeMeta in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) in.Spec.DeepCopyInto(&out.Spec) + out.Status = in.Status return } @@ -193,6 +194,22 @@ func (in *EgressSpec) DeepCopy() *EgressSpec { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *EgressStatus) DeepCopyInto(out *EgressStatus) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new EgressStatus. +func (in *EgressStatus) DeepCopy() *EgressStatus { + if in == nil { + return nil + } + out := new(EgressStatus) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *Endpoint) DeepCopyInto(out *Endpoint) { *out = *in diff --git a/pkg/client/clientset/versioned/typed/crd/v1alpha2/egress.go b/pkg/client/clientset/versioned/typed/crd/v1alpha2/egress.go index 784d5c1aec8..52326a2f0ce 100644 --- a/pkg/client/clientset/versioned/typed/crd/v1alpha2/egress.go +++ b/pkg/client/clientset/versioned/typed/crd/v1alpha2/egress.go @@ -38,6 +38,7 @@ type EgressesGetter interface { type EgressInterface interface { Create(ctx context.Context, egress *v1alpha2.Egress, opts v1.CreateOptions) (*v1alpha2.Egress, error) Update(ctx context.Context, egress *v1alpha2.Egress, opts v1.UpdateOptions) (*v1alpha2.Egress, error) + UpdateStatus(ctx context.Context, egress *v1alpha2.Egress, opts v1.UpdateOptions) (*v1alpha2.Egress, error) Delete(ctx context.Context, name string, opts v1.DeleteOptions) error DeleteCollection(ctx context.Context, opts v1.DeleteOptions, listOpts v1.ListOptions) error Get(ctx context.Context, name string, opts v1.GetOptions) (*v1alpha2.Egress, error) @@ -126,6 +127,21 @@ func (c *egresses) Update(ctx context.Context, egress *v1alpha2.Egress, opts v1. return } +// UpdateStatus was generated because the type contains a Status member. +// Add a +genclient:noStatus comment above the type to avoid generating UpdateStatus(). +func (c *egresses) UpdateStatus(ctx context.Context, egress *v1alpha2.Egress, opts v1.UpdateOptions) (result *v1alpha2.Egress, err error) { + result = &v1alpha2.Egress{} + err = c.client.Put(). + Resource("egresses"). + Name(egress.Name). + SubResource("status"). + VersionedParams(&opts, scheme.ParameterCodec). + Body(egress). + Do(ctx). + Into(result) + return +} + // Delete takes name of the egress and deletes it. Returns an error if one occurs. func (c *egresses) Delete(ctx context.Context, name string, opts v1.DeleteOptions) error { return c.client.Delete(). diff --git a/pkg/client/clientset/versioned/typed/crd/v1alpha2/fake/fake_egress.go b/pkg/client/clientset/versioned/typed/crd/v1alpha2/fake/fake_egress.go index 6e142d760b1..9c463ebf406 100644 --- a/pkg/client/clientset/versioned/typed/crd/v1alpha2/fake/fake_egress.go +++ b/pkg/client/clientset/versioned/typed/crd/v1alpha2/fake/fake_egress.go @@ -94,6 +94,17 @@ func (c *FakeEgresses) Update(ctx context.Context, egress *v1alpha2.Egress, opts return obj.(*v1alpha2.Egress), err } +// UpdateStatus was generated because the type contains a Status member. +// Add a +genclient:noStatus comment above the type to avoid generating UpdateStatus(). +func (c *FakeEgresses) UpdateStatus(ctx context.Context, egress *v1alpha2.Egress, opts v1.UpdateOptions) (*v1alpha2.Egress, error) { + obj, err := c.Fake. + Invokes(testing.NewRootUpdateSubresourceAction(egressesResource, "status", egress), &v1alpha2.Egress{}) + if obj == nil { + return nil, err + } + return obj.(*v1alpha2.Egress), err +} + // Delete takes name of the egress and deletes it. Returns an error if one occurs. func (c *FakeEgresses) Delete(ctx context.Context, name string, opts v1.DeleteOptions) error { _, err := c.Fake. diff --git a/pkg/controller/metrics/prometheus.go b/pkg/controller/metrics/prometheus.go index 1d8735c0c9b..d346ab67efa 100644 --- a/pkg/controller/metrics/prometheus.go +++ b/pkg/controller/metrics/prometheus.go @@ -96,6 +96,13 @@ var ( Help: "The total number of actual status updates performed for Antrea NetworkPolicy Custom Resources", StabilityLevel: metrics.ALPHA, }) + AntreaEgressStatusUpdates = metrics.NewCounter(&metrics.CounterOpts{ + Namespace: metricNamespaceAntrea, + Subsystem: metricSubsystemController, + Name: "eg_status_updates", + Help: "The total number of actual status updates performed for Antrea Egress Custom Resources", + StabilityLevel: metrics.ALPHA, + }) AntreaClusterNetworkPolicyStatusUpdates = metrics.NewCounter(&metrics.CounterOpts{ Namespace: metricNamespaceAntrea, Subsystem: metricSubsystemController,