This is an automated email from the ASF dual-hosted git repository.

zhangjintao pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/apisix-ingress-controller.git


The following commit(s) were added to refs/heads/master by this push:
     new 199dcffe feat: support disable status (#1595)
199dcffe is described below

commit 199dcffe174d68ffe9984ab471565084b95788eb
Author: Xin Rong <[email protected]>
AuthorDate: Tue Feb 14 10:39:45 2023 +0800

    feat: support disable status (#1595)
---
 cmd/ingress/ingress.go                             |   1 +
 conf/config-default.yaml                           |   6 +-
 pkg/config/config.go                               |  36 +--
 pkg/config/config_test.go                          |  31 +--
 pkg/providers/apisix/apisix_cluster_config.go      |   5 +-
 pkg/providers/apisix/apisix_consumer.go            |   3 +
 pkg/providers/apisix/apisix_plugin_config.go       |   5 +-
 pkg/providers/apisix/apisix_route.go               |  16 +-
 pkg/providers/apisix/apisix_tls.go                 |   5 +-
 pkg/providers/apisix/apisix_upstream.go            |   5 +-
 pkg/providers/controller.go                        |   1 +
 pkg/providers/gateway/gateway.go                   |   2 +-
 pkg/providers/gateway/provider.go                  |   2 +
 pkg/providers/ingress/ingress.go                   |  61 ++---
 pkg/providers/utils/ingress_status.go              | 104 ++++++++-
 pkg/providers/utils/ingress_status_test.go         | 257 +++++++++++++++++++++
 pkg/providers/utils/status.go                      |  16 ++
 pkg/providers/utils/status_test.go                 | 102 ++++++++
 test/e2e/scaffold/ingress.go                       |  41 +++-
 test/e2e/scaffold/scaffold.go                      |   1 +
 .../suite-ingress/suite-ingress-features/status.go |  74 ++++++
 21 files changed, 690 insertions(+), 84 deletions(-)

diff --git a/cmd/ingress/ingress.go b/cmd/ingress/ingress.go
index 2b2b9a6e..c38485f8 100644
--- a/cmd/ingress/ingress.go
+++ b/cmd/ingress/ingress.go
@@ -186,6 +186,7 @@ For example, no available LB exists in the bare metal 
environment.`)
        cmd.PersistentFlags().StringVar(&cfg.Kubernetes.APIVersion, 
"api-version", config.DefaultAPIVersion, config.APIVersionDescribe)
        cmd.PersistentFlags().BoolVar(&cfg.Kubernetes.WatchEndpointSlices, 
"watch-endpointslices", false, "whether to watch endpointslices rather than 
endpoints")
        cmd.PersistentFlags().BoolVar(&cfg.Kubernetes.EnableGatewayAPI, 
"enable-gateway-api", false, "whether to enable support for Gateway API")
+       cmd.PersistentFlags().BoolVar(&cfg.Kubernetes.DisableStatusUpdates, 
"disable-status-updates", false, "Disable resource status updates")
        cmd.PersistentFlags().StringVar(&cfg.APISIX.AdminAPIVersion, 
"apisix-admin-api-version", "v2", `the APISIX admin API version. can be "v2" or 
"v3". Default value is v2.`)
        cmd.PersistentFlags().StringVar(&cfg.APISIX.DefaultClusterBaseURL, 
"default-apisix-cluster-base-url", "", "the base URL of admin api / manager api 
for the default APISIX cluster")
        cmd.PersistentFlags().StringVar(&cfg.APISIX.DefaultClusterAdminKey, 
"default-apisix-cluster-admin-key", "", "admin key used for the authorization 
of admin api / manager api for the default APISIX cluster")
diff --git a/conf/config-default.yaml b/conf/config-default.yaml
index 7610ded4..9b3570a0 100644
--- a/conf/config-default.yaml
+++ b/conf/config-default.yaml
@@ -50,6 +50,7 @@ ingress_status_address: []   # when there is no available 
information on the Ser
 enable_profiling: true # enable profiling via web interfaces
                        # host:port/debug/pprof, default is true.
 apisix-resource-sync-interval: "300s" # Default interval for synchronizing 
Kubernetes resources to APISIX
+
 # Kubernetes related configurations.
 kubernetes:
   kubeconfig: ""                       # the Kubernetes configuration file 
path, default is
@@ -82,11 +83,14 @@ kubernetes:
   api_version: apisix.apache.org/v2    # the default value of API version is 
"apisix.apache.org/v2", support "apisix.apache.org/v2beta3" and 
"apisix.apache.org/v2".
 
   plugin_metadata_cm: plugin-metadata-config-map
+
+  disable_status_updates: false # In the case of a large number of resources 
and the status of resources is not concerned
+                    # you can consider disabling status to speed up the 
synchronization cycle of resources.
 # APISIX related configurations.
 apisix:
   admin_api_version: v3  # the APISIX admin API version. can be "v2" or "v3"
 
-  default_cluster_base_url: "http://127.0.0.1:9080/apisix/admin"; # The base 
url of admin api / manager api
+  default_cluster_base_url: "http://127.0.0.1:9180/apisix/admin"; # The base 
url of admin api / manager api
                                                                  # of the 
default APISIX cluster
 
   default_cluster_admin_key: "" # the admin key used for the authentication of 
admin api / manager api in the
diff --git a/pkg/config/config.go b/pkg/config/config.go
index 98283535..2e7c63f2 100644
--- a/pkg/config/config.go
+++ b/pkg/config/config.go
@@ -90,15 +90,16 @@ type Config struct {
 
 // KubernetesConfig contains all Kubernetes related config items.
 type KubernetesConfig struct {
-       Kubeconfig          string             `json:"kubeconfig" 
yaml:"kubeconfig"`
-       ResyncInterval      types.TimeDuration `json:"resync_interval" 
yaml:"resync_interval"`
-       NamespaceSelector   []string           `json:"namespace_selector" 
yaml:"namespace_selector"`
-       ElectionID          string             `json:"election_id" 
yaml:"election_id"`
-       IngressClass        string             `json:"ingress_class" 
yaml:"ingress_class"`
-       IngressVersion      string             `json:"ingress_version" 
yaml:"ingress_version"`
-       WatchEndpointSlices bool               `json:"watch_endpoint_slices" 
yaml:"watch_endpoint_slices"`
-       APIVersion          string             `json:"api_version" 
yaml:"api_version"`
-       EnableGatewayAPI    bool               `json:"enable_gateway_api" 
yaml:"enable_gateway_api"`
+       Kubeconfig           string             `json:"kubeconfig" 
yaml:"kubeconfig"`
+       ResyncInterval       types.TimeDuration `json:"resync_interval" 
yaml:"resync_interval"`
+       NamespaceSelector    []string           `json:"namespace_selector" 
yaml:"namespace_selector"`
+       ElectionID           string             `json:"election_id" 
yaml:"election_id"`
+       IngressClass         string             `json:"ingress_class" 
yaml:"ingress_class"`
+       IngressVersion       string             `json:"ingress_version" 
yaml:"ingress_version"`
+       WatchEndpointSlices  bool               `json:"watch_endpoint_slices" 
yaml:"watch_endpoint_slices"`
+       APIVersion           string             `json:"api_version" 
yaml:"api_version"`
+       EnableGatewayAPI     bool               `json:"enable_gateway_api" 
yaml:"enable_gateway_api"`
+       DisableStatusUpdates bool               `json:"disable_status_updates" 
yaml:"disable_status_updates"`
 }
 
 // APISIXConfig contains all APISIX related config items.
@@ -133,14 +134,15 @@ func NewDefaultConfig() *Config {
                EnableProfiling:            true,
                ApisixResourceSyncInterval: types.TimeDuration{Duration: 300 * 
time.Second},
                Kubernetes: KubernetesConfig{
-                       Kubeconfig:          "", // Use in-cluster 
configurations.
-                       ResyncInterval:      types.TimeDuration{Duration: 6 * 
time.Hour},
-                       ElectionID:          IngressAPISIXLeader,
-                       IngressClass:        IngressClass,
-                       IngressVersion:      IngressNetworkingV1,
-                       APIVersion:          DefaultAPIVersion,
-                       WatchEndpointSlices: false,
-                       EnableGatewayAPI:    false,
+                       Kubeconfig:           "", // Use in-cluster 
configurations.
+                       ResyncInterval:       types.TimeDuration{Duration: 6 * 
time.Hour},
+                       ElectionID:           IngressAPISIXLeader,
+                       IngressClass:         IngressClass,
+                       IngressVersion:       IngressNetworkingV1,
+                       APIVersion:           DefaultAPIVersion,
+                       WatchEndpointSlices:  false,
+                       EnableGatewayAPI:     false,
+                       DisableStatusUpdates: false,
                },
                APISIX: APISIXConfig{
                        AdminAPIVersion:    "v2",
diff --git a/pkg/config/config_test.go b/pkg/config/config_test.go
index dfb7dc10..e931716d 100644
--- a/pkg/config/config_test.go
+++ b/pkg/config/config_test.go
@@ -42,12 +42,13 @@ func TestNewConfigFromFile(t *testing.T) {
                EnableProfiling:            true,
                ApisixResourceSyncInterval: types.TimeDuration{Duration: 200 * 
time.Second},
                Kubernetes: KubernetesConfig{
-                       ResyncInterval: types.TimeDuration{Duration: time.Hour},
-                       Kubeconfig:     "/path/to/foo/baz",
-                       ElectionID:     "my-election-id",
-                       IngressClass:   IngressClass,
-                       IngressVersion: IngressNetworkingV1,
-                       APIVersion:     DefaultAPIVersion,
+                       ResyncInterval:       types.TimeDuration{Duration: 
time.Hour},
+                       Kubeconfig:           "/path/to/foo/baz",
+                       ElectionID:           "my-election-id",
+                       IngressClass:         IngressClass,
+                       IngressVersion:       IngressNetworkingV1,
+                       APIVersion:           DefaultAPIVersion,
+                       DisableStatusUpdates: true,
                },
                APISIX: APISIXConfig{
                        AdminAPIVersion:        "v2",
@@ -94,6 +95,7 @@ kubernetes:
   ingress_class: apisix
   ingress_version: networking/v1
   api_version: apisix.apache.org/v2
+  disable_status_updates: true
 apisix:
   admin_api_version: v2
   default_cluster_base_url: http://127.0.0.1:8080/apisix
@@ -132,12 +134,13 @@ func TestConfigWithEnvVar(t *testing.T) {
                EnableProfiling:            true,
                ApisixResourceSyncInterval: types.TimeDuration{Duration: 200 * 
time.Second},
                Kubernetes: KubernetesConfig{
-                       ResyncInterval: types.TimeDuration{Duration: time.Hour},
-                       Kubeconfig:     "",
-                       ElectionID:     "my-election-id",
-                       IngressClass:   IngressClass,
-                       IngressVersion: IngressNetworkingV1,
-                       APIVersion:     DefaultAPIVersion,
+                       ResyncInterval:       types.TimeDuration{Duration: 
time.Hour},
+                       Kubeconfig:           "",
+                       ElectionID:           "my-election-id",
+                       IngressClass:         IngressClass,
+                       IngressVersion:       IngressNetworkingV1,
+                       APIVersion:           DefaultAPIVersion,
+                       DisableStatusUpdates: true,
                },
                APISIX: APISIXConfig{
                        AdminAPIVersion:        "v2",
@@ -173,7 +176,8 @@ func TestConfigWithEnvVar(t *testing.T) {
         "resync_interval": "1h0m0s",
         "election_id": "my-election-id",
         "ingress_class": "apisix",
-        "ingress_version": "networking/v1"
+        "ingress_version": "networking/v1",
+        "disable_status_updates": true
     },
     "apisix": {
         "admin_api_version": "v2",
@@ -212,6 +216,7 @@ kubernetes:
   election_id: my-election-id
   ingress_class: apisix
   ingress_version: networking/v1
+  disable_status_updates: true
 apisix:
   admin_api_version: v2
   default_cluster_base_url: {{.DEFAULT_CLUSTER_BASE_URL}}
diff --git a/pkg/providers/apisix/apisix_cluster_config.go 
b/pkg/providers/apisix/apisix_cluster_config.go
index b9ebcb62..d5348fac 100644
--- a/pkg/providers/apisix/apisix_cluster_config.go
+++ b/pkg/providers/apisix/apisix_cluster_config.go
@@ -434,6 +434,9 @@ func (c *apisixClusterConfigController) ResourceSync() {
 
 // recordStatus record resources status
 func (c *apisixClusterConfigController) recordStatus(at interface{}, reason 
string, err error, status metav1.ConditionStatus, generation int64) {
+       if c.Kubernetes.DisableStatusUpdates {
+               return
+       }
        // build condition
        message := utils.CommonSuccessMessage
        if err != nil {
@@ -475,7 +478,7 @@ func (c *apisixClusterConfigController) recordStatus(at 
interface{}, reason stri
                        conditions := make([]metav1.Condition, 0)
                        v.Status.Conditions = conditions
                }
-               if utils.VerifyGeneration(&v.Status.Conditions, condition) {
+               if utils.VerifyConditions(&v.Status.Conditions, condition) {
                        meta.SetStatusCondition(&v.Status.Conditions, condition)
                        if _, errRecord := 
apisixClient.ApisixV2().ApisixClusterConfigs().
                                UpdateStatus(context.TODO(), v, 
metav1.UpdateOptions{}); errRecord != nil {
diff --git a/pkg/providers/apisix/apisix_consumer.go 
b/pkg/providers/apisix/apisix_consumer.go
index 02645379..0706f10b 100644
--- a/pkg/providers/apisix/apisix_consumer.go
+++ b/pkg/providers/apisix/apisix_consumer.go
@@ -351,6 +351,9 @@ func (c *apisixConsumerController) ResourceSync() {
 
 // recordStatus record resources status
 func (c *apisixConsumerController) recordStatus(at interface{}, reason string, 
err error, status metav1.ConditionStatus, generation int64) {
+       if c.Kubernetes.DisableStatusUpdates {
+               return
+       }
        // build condition
        message := utils.CommonSuccessMessage
        if err != nil {
diff --git a/pkg/providers/apisix/apisix_plugin_config.go 
b/pkg/providers/apisix/apisix_plugin_config.go
index f6705710..1f60e59a 100644
--- a/pkg/providers/apisix/apisix_plugin_config.go
+++ b/pkg/providers/apisix/apisix_plugin_config.go
@@ -392,6 +392,9 @@ func (c *apisixPluginConfigController) ResourceSync() {
 
 // recordStatus record resources status
 func (c *apisixPluginConfigController) recordStatus(at interface{}, reason 
string, err error, status metav1.ConditionStatus, generation int64) {
+       if c.Kubernetes.DisableStatusUpdates {
+               return
+       }
        // build condition
        message := utils.CommonSuccessMessage
        if err != nil {
@@ -434,7 +437,7 @@ func (c *apisixPluginConfigController) recordStatus(at 
interface{}, reason strin
                        conditions := make([]metav1.Condition, 0)
                        v.Status.Conditions = conditions
                }
-               if utils.VerifyGeneration(&v.Status.Conditions, condition) {
+               if utils.VerifyConditions(&v.Status.Conditions, condition) {
                        meta.SetStatusCondition(&v.Status.Conditions, condition)
                        if _, errRecord := 
apisixClient.ApisixV2().ApisixPluginConfigs(v.Namespace).
                                UpdateStatus(context.TODO(), v, 
metav1.UpdateOptions{}); errRecord != nil {
diff --git a/pkg/providers/apisix/apisix_route.go 
b/pkg/providers/apisix/apisix_route.go
index 53113d88..d051fb5a 100644
--- a/pkg/providers/apisix/apisix_route.go
+++ b/pkg/providers/apisix/apisix_route.go
@@ -843,8 +843,20 @@ func (c *apisixRouteController) handleApisixUpstreamErr(ev 
*routeEvent, errOrigi
        c.workqueue.AddRateLimited(ev)
 }
 
-// recordStatus record resources status
+/*
+recordStatus record resources status
+
+TODO: The resouceVersion of the sync phase and the recordStatus phase may be 
different. There is consistency
+problem here, and incorrect status may be recorded.(It will only be triggered 
when it is updated multiple times in a short time)
+
+       IsUpdateStatus(currentObject, latestObject) bool {
+               return currentObject.resourceVersion >= 
latestObject.resourceVersion && !Equal(currentObject.status, 
latestObject.status)
+       }
+*/
 func (c *apisixRouteController) recordStatus(at interface{}, reason string, 
err error, status metav1.ConditionStatus, generation int64) {
+       if c.Kubernetes.DisableStatusUpdates {
+               return
+       }
        // build condition
        message := utils.CommonSuccessMessage
        if err != nil {
@@ -887,7 +899,7 @@ func (c *apisixRouteController) recordStatus(at 
interface{}, reason string, err
                        conditions := make([]metav1.Condition, 0)
                        v.Status.Conditions = conditions
                }
-               if utils.VerifyGeneration(&v.Status.Conditions, condition) {
+               if utils.VerifyConditions(&v.Status.Conditions, condition) && 
!meta.IsStatusConditionPresentAndEqual(v.Status.Conditions, condition.Type, 
condition.Status) {
                        meta.SetStatusCondition(&v.Status.Conditions, condition)
                        if _, errRecord := 
apisixClient.ApisixV2().ApisixRoutes(v.Namespace).
                                UpdateStatus(context.TODO(), v, 
metav1.UpdateOptions{}); errRecord != nil {
diff --git a/pkg/providers/apisix/apisix_tls.go 
b/pkg/providers/apisix/apisix_tls.go
index c5714cfc..d10f5ca0 100644
--- a/pkg/providers/apisix/apisix_tls.go
+++ b/pkg/providers/apisix/apisix_tls.go
@@ -400,6 +400,9 @@ func (c *apisixTlsController) ResourceSync() {
 
 // recordStatus record resources status
 func (c *apisixTlsController) recordStatus(at interface{}, reason string, err 
error, status metav1.ConditionStatus, generation int64) {
+       if c.Kubernetes.DisableStatusUpdates {
+               return
+       }
        // build condition
        message := utils.CommonSuccessMessage
        if err != nil {
@@ -442,7 +445,7 @@ func (c *apisixTlsController) recordStatus(at interface{}, 
reason string, err er
                        conditions := make([]metav1.Condition, 0)
                        v.Status.Conditions = conditions
                }
-               if utils.VerifyGeneration(&v.Status.Conditions, condition) {
+               if utils.VerifyConditions(&v.Status.Conditions, condition) {
                        meta.SetStatusCondition(&v.Status.Conditions, condition)
                        if _, errRecord := 
apisixClient.ApisixV2().ApisixTlses(v.Namespace).
                                UpdateStatus(context.TODO(), v, 
metav1.UpdateOptions{}); errRecord != nil {
diff --git a/pkg/providers/apisix/apisix_upstream.go 
b/pkg/providers/apisix/apisix_upstream.go
index 39803238..afbfebe5 100644
--- a/pkg/providers/apisix/apisix_upstream.go
+++ b/pkg/providers/apisix/apisix_upstream.go
@@ -804,6 +804,9 @@ func (c *apisixUpstreamController) handleSvcErr(key string, 
errOrigin error) {
 
 // recordStatus record resources status
 func (c *apisixUpstreamController) recordStatus(at interface{}, reason string, 
err error, status metav1.ConditionStatus, generation int64) {
+       if c.Kubernetes.DisableStatusUpdates {
+               return
+       }
        // build condition
        message := utils.CommonSuccessMessage
        if err != nil {
@@ -847,7 +850,7 @@ func (c *apisixUpstreamController) recordStatus(at 
interface{}, reason string, e
                        conditions := make([]metav1.Condition, 0)
                        v.Status.Conditions = conditions
                }
-               if utils.VerifyGeneration(&v.Status.Conditions, condition) {
+               if utils.VerifyConditions(&v.Status.Conditions, condition) {
                        meta.SetStatusCondition(&v.Status.Conditions, condition)
                        if _, errRecord := 
apisixClient.ApisixV2().ApisixUpstreams(v.Namespace).
                                UpdateStatus(context.TODO(), v, 
metav1.UpdateOptions{}); errRecord != nil {
diff --git a/pkg/providers/controller.go b/pkg/providers/controller.go
index 463609c0..a577063d 100644
--- a/pkg/providers/controller.go
+++ b/pkg/providers/controller.go
@@ -465,6 +465,7 @@ func (c *Controller) run(ctx context.Context) {
                        KubeClient:        c.kubeClient.Client,
                        MetricsCollector:  c.MetricsCollector,
                        NamespaceProvider: c.namespaceProvider,
+                       ListerInformer:    common.ListerInformer,
                })
                if err != nil {
                        ctx.Done()
diff --git a/pkg/providers/gateway/gateway.go b/pkg/providers/gateway/gateway.go
index 6611f839..e5c46dc1 100644
--- a/pkg/providers/gateway/gateway.go
+++ b/pkg/providers/gateway/gateway.go
@@ -246,7 +246,7 @@ func (c *gatewayController) recordStatus(v 
*gatewayv1beta1.Gateway, reason strin
                meta.SetStatusCondition(&v.Status.Conditions, gatewayCondition)
        }
 
-       lbips, err := 
utils.IngressLBStatusIPs(c.controller.Cfg.IngressPublishService, 
c.controller.Cfg.IngressStatusAddress, c.controller.KubeClient)
+       lbips, err := 
utils.IngressLBStatusIPs(c.controller.Cfg.IngressPublishService, 
c.controller.Cfg.IngressStatusAddress, c.controller.ListerInformer.SvcLister)
        if err != nil {
                log.Errorw("failed to get APISIX gateway external IPs",
                        zap.Error(err),
diff --git a/pkg/providers/gateway/provider.go 
b/pkg/providers/gateway/provider.go
index 05663181..1c9773c2 100644
--- a/pkg/providers/gateway/provider.go
+++ b/pkg/providers/gateway/provider.go
@@ -38,6 +38,7 @@ import (
        
"github.com/apache/apisix-ingress-controller/pkg/providers/gateway/types"
        
"github.com/apache/apisix-ingress-controller/pkg/providers/k8s/namespace"
        "github.com/apache/apisix-ingress-controller/pkg/providers/translation"
+       providertypes 
"github.com/apache/apisix-ingress-controller/pkg/providers/types"
        "github.com/apache/apisix-ingress-controller/pkg/providers/utils"
 )
 
@@ -96,6 +97,7 @@ type ProviderOptions struct {
        KubeClient        kubernetes.Interface
        MetricsCollector  metrics.Collector
        NamespaceProvider namespace.WatchingNamespaceProvider
+       ListerInformer    *providertypes.ListerInformer
 }
 
 func NewGatewayProvider(opts *ProviderOptions) (*Provider, error) {
diff --git a/pkg/providers/ingress/ingress.go b/pkg/providers/ingress/ingress.go
index e1de15ce..7c3d405b 100644
--- a/pkg/providers/ingress/ingress.go
+++ b/pkg/providers/ingress/ingress.go
@@ -465,6 +465,9 @@ func (c *ingressController) ResourceSync() {
 
 // recordStatus record resources status
 func (c *ingressController) recordStatus(at runtime.Object, reason string, err 
error, status metav1.ConditionStatus, generation int64) {
+       if c.Kubernetes.DisableStatusUpdates {
+               return
+       }
        client := c.KubeClient.Client
 
        at = at.DeepCopyObject()
@@ -479,15 +482,16 @@ func (c *ingressController) recordStatus(at 
runtime.Object, reason string, err e
                        )
 
                }
-
-               v.ObjectMeta.Generation = generation
-               v.Status.LoadBalancer.Ingress = utils.CoreV1ToNetworkV1LB(lbips)
-               if _, errRecord := 
client.NetworkingV1().Ingresses(v.Namespace).UpdateStatus(context.TODO(), v, 
metav1.UpdateOptions{}); errRecord != nil {
-                       log.Errorw("failed to record status change for 
IngressV1",
-                               zap.Error(errRecord),
-                               zap.String("name", v.Name),
-                               zap.String("namespace", v.Namespace),
-                       )
+               ingressLB := utils.CoreV1ToNetworkV1LB(lbips)
+               if 
!utils.CompareNetworkingV1LBEqual(v.Status.LoadBalancer.Ingress, ingressLB) {
+                       v.Status.LoadBalancer.Ingress = ingressLB
+                       if _, errRecord := 
client.NetworkingV1().Ingresses(v.Namespace).UpdateStatus(context.TODO(), v, 
metav1.UpdateOptions{}); errRecord != nil {
+                               log.Errorw("failed to record status change for 
IngressV1",
+                                       zap.Error(errRecord),
+                                       zap.String("name", v.Name),
+                                       zap.String("namespace", v.Namespace),
+                               )
+                       }
                }
 
        case *networkingv1beta1.Ingress:
@@ -497,17 +501,18 @@ func (c *ingressController) recordStatus(at 
runtime.Object, reason string, err e
                        log.Errorw("failed to get APISIX gateway external IPs",
                                zap.Error(err),
                        )
-
                }
 
-               v.ObjectMeta.Generation = generation
-               v.Status.LoadBalancer.Ingress = 
utils.CoreV1ToNetworkV1beta1LB(lbips)
-               if _, errRecord := 
client.NetworkingV1beta1().Ingresses(v.Namespace).UpdateStatus(context.TODO(), 
v, metav1.UpdateOptions{}); errRecord != nil {
-                       log.Errorw("failed to record status change for 
IngressV1",
-                               zap.Error(errRecord),
-                               zap.String("name", v.Name),
-                               zap.String("namespace", v.Namespace),
-                       )
+               ingressLB := utils.CoreV1ToNetworkV1beta1LB(lbips)
+               if 
!utils.CompareNetworkingV1beta1LBEqual(v.Status.LoadBalancer.Ingress, 
ingressLB) {
+                       v.Status.LoadBalancer.Ingress = ingressLB
+                       if _, errRecord := 
client.NetworkingV1beta1().Ingresses(v.Namespace).UpdateStatus(context.TODO(), 
v, metav1.UpdateOptions{}); errRecord != nil {
+                               log.Errorw("failed to record status change for 
IngressV1beta1",
+                                       zap.Error(errRecord),
+                                       zap.String("name", v.Name),
+                                       zap.String("namespace", v.Namespace),
+                               )
+                       }
                }
        case *extensionsv1beta1.Ingress:
                // set to status
@@ -519,14 +524,16 @@ func (c *ingressController) recordStatus(at 
runtime.Object, reason string, err e
 
                }
 
-               v.ObjectMeta.Generation = generation
-               v.Status.LoadBalancer.Ingress = 
utils.CoreV1ToExtensionsV1beta1LB(lbips)
-               if _, errRecord := 
client.ExtensionsV1beta1().Ingresses(v.Namespace).UpdateStatus(context.TODO(), 
v, metav1.UpdateOptions{}); errRecord != nil {
-                       log.Errorw("failed to record status change for 
IngressV1",
-                               zap.Error(errRecord),
-                               zap.String("name", v.Name),
-                               zap.String("namespace", v.Namespace),
-                       )
+               ingressLB := utils.CoreV1ToExtensionsV1beta1LB(lbips)
+               if 
!utils.CompareExtensionsV1beta1LBEqual(v.Status.LoadBalancer.Ingress, 
ingressLB) {
+                       v.Status.LoadBalancer.Ingress = ingressLB
+                       if _, errRecord := 
client.ExtensionsV1beta1().Ingresses(v.Namespace).UpdateStatus(context.TODO(), 
v, metav1.UpdateOptions{}); errRecord != nil {
+                               log.Errorw("failed to record status change for 
IngressExtensionsv1beta1",
+                                       zap.Error(errRecord),
+                                       zap.String("name", v.Name),
+                                       zap.String("namespace", v.Namespace),
+                               )
+                       }
                }
        default:
                // This should not be executed
@@ -536,7 +543,7 @@ func (c *ingressController) recordStatus(at runtime.Object, 
reason string, err e
 
 // ingressLBStatusIPs organizes the available addresses
 func (c *ingressController) ingressLBStatusIPs() 
([]corev1.LoadBalancerIngress, error) {
-       return utils.IngressLBStatusIPs(c.IngressPublishService, 
c.IngressStatusAddress, c.KubeClient.Client)
+       return utils.IngressLBStatusIPs(c.IngressPublishService, 
c.IngressStatusAddress, c.SvcLister)
 }
 
 func (c *ingressController) storeSecretReference(secretKey string, ingressKey 
string, evType types.EventType, ssl *v1.Ssl) {
diff --git a/pkg/providers/utils/ingress_status.go 
b/pkg/providers/utils/ingress_status.go
index 18d7c9b9..c106a19b 100644
--- a/pkg/providers/utils/ingress_status.go
+++ b/pkg/providers/utils/ingress_status.go
@@ -17,17 +17,17 @@
 package utils
 
 import (
-       "context"
        "fmt"
        "net"
+       "sort"
+       "strings"
        "time"
 
        corev1 "k8s.io/api/core/v1"
        extensionsv1beta1 "k8s.io/api/extensions/v1beta1"
        networkingv1 "k8s.io/api/networking/v1"
        networkingv1beta1 "k8s.io/api/networking/v1beta1"
-       metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
-       "k8s.io/client-go/kubernetes"
+       listerscorev1 "k8s.io/client-go/listers/core/v1"
        "k8s.io/client-go/tools/cache"
        gatewayv1beta1 "sigs.k8s.io/gateway-api/apis/v1beta1"
 
@@ -39,7 +39,7 @@ const (
 )
 
 // IngressPublishAddresses get addressed used to expose Ingress
-func IngressPublishAddresses(ingressPublishService string, 
ingressStatusAddress []string, kubeClient kubernetes.Interface) ([]string, 
error) {
+func IngressPublishAddresses(ingressPublishService string, 
ingressStatusAddress []string, svcLister listerscorev1.ServiceLister) 
([]string, error) {
        addrs := []string{}
 
        // if ingressStatusAddress is specified, it will be used first
@@ -54,7 +54,7 @@ func IngressPublishAddresses(ingressPublishService string, 
ingressStatusAddress
                return nil, err
        }
 
-       svc, err := kubeClient.CoreV1().Services(namespace).Get(context.TODO(), 
name, metav1.GetOptions{})
+       svc, err := svcLister.Services(namespace).Get(name)
        if err != nil {
                return nil, err
        }
@@ -83,13 +83,13 @@ func IngressPublishAddresses(ingressPublishService string, 
ingressStatusAddress
 }
 
 // IngressLBStatusIPs organizes the available addresses
-func IngressLBStatusIPs(ingressPublishService string, ingressStatusAddress 
[]string, kubeClient kubernetes.Interface) ([]corev1.LoadBalancerIngress, 
error) {
+func IngressLBStatusIPs(ingressPublishService string, ingressStatusAddress 
[]string, svcLister listerscorev1.ServiceLister) ([]corev1.LoadBalancerIngress, 
error) {
        lbips := []corev1.LoadBalancerIngress{}
        var ips []string
 
        for {
                var err error
-               ips, err = IngressPublishAddresses(ingressPublishService, 
ingressStatusAddress, kubeClient)
+               ips, err = IngressPublishAddresses(ingressPublishService, 
ingressStatusAddress, svcLister)
                if err != nil {
                        if err.Error() == _gatewayLBNotReadyMessage {
                                log.Warnf("%s. Provided service: %s", 
_gatewayLBNotReadyMessage, ingressPublishService)
@@ -114,6 +114,96 @@ func IngressLBStatusIPs(ingressPublishService string, 
ingressStatusAddress []str
        return lbips, nil
 }
 
+func lessNetworkingV1LB(addrs []networkingv1.IngressLoadBalancerIngress) 
func(int, int) bool {
+       return func(a, b int) bool {
+               switch strings.Compare(addrs[a].Hostname, addrs[b].Hostname) {
+               case -1:
+                       return true
+               case 1:
+                       return false
+               }
+               return addrs[a].IP < addrs[b].IP
+       }
+}
+
+func lessNetworkingV1beta1LB(addrs 
[]networkingv1beta1.IngressLoadBalancerIngress) func(int, int) bool {
+       return func(a, b int) bool {
+               switch strings.Compare(addrs[a].Hostname, addrs[b].Hostname) {
+               case -1:
+                       return true
+               case 1:
+                       return false
+               }
+               return addrs[a].IP < addrs[b].IP
+       }
+}
+
+func lessExtensionsV1beta1LB(addrs 
[]extensionsv1beta1.IngressLoadBalancerIngress) func(int, int) bool {
+       return func(a, b int) bool {
+               switch strings.Compare(addrs[a].Hostname, addrs[b].Hostname) {
+               case -1:
+                       return true
+               case 1:
+                       return false
+               }
+               return addrs[a].IP < addrs[b].IP
+       }
+}
+
+func CompareNetworkingV1LBEqual(lb1 []networkingv1.IngressLoadBalancerIngress, 
lb2 []networkingv1.IngressLoadBalancerIngress) bool {
+       if len(lb1) != len(lb2) {
+               return false
+       }
+       sort.SliceStable(lb1, lessNetworkingV1LB(lb1))
+       sort.SliceStable(lb2, lessNetworkingV1LB(lb2))
+       size := len(lb1)
+       for i := 0; i < size; i++ {
+               if lb1[i].IP != lb2[i].IP {
+                       return false
+               }
+               if lb1[i].Hostname != lb2[i].Hostname {
+                       return false
+               }
+       }
+       return true
+}
+
+func CompareNetworkingV1beta1LBEqual(lb1 
[]networkingv1beta1.IngressLoadBalancerIngress, lb2 
[]networkingv1beta1.IngressLoadBalancerIngress) bool {
+       if len(lb1) != len(lb2) {
+               return false
+       }
+       sort.SliceStable(lb1, lessNetworkingV1beta1LB(lb1))
+       sort.SliceStable(lb2, lessNetworkingV1beta1LB(lb2))
+       size := len(lb1)
+       for i := 0; i < size; i++ {
+               if lb1[i].IP != lb2[i].IP {
+                       return false
+               }
+               if lb1[i].Hostname != lb2[i].Hostname {
+                       return false
+               }
+       }
+       return true
+}
+
+func CompareExtensionsV1beta1LBEqual(lb1 
[]extensionsv1beta1.IngressLoadBalancerIngress, lb2 
[]extensionsv1beta1.IngressLoadBalancerIngress) bool {
+       if len(lb1) != len(lb2) {
+               return false
+       }
+       sort.SliceStable(lb1, lessExtensionsV1beta1LB(lb1))
+       sort.SliceStable(lb2, lessExtensionsV1beta1LB(lb2))
+       size := len(lb1)
+       for i := 0; i < size; i++ {
+               if lb1[i].IP != lb2[i].IP {
+                       return false
+               }
+               if lb1[i].Hostname != lb2[i].Hostname {
+                       return false
+               }
+       }
+       return true
+}
+
 // CoreV1ToNetworkV1LB convert []corev1.LoadBalancerIngress to 
[]networkingv1.IngressLoadBalancerIngress
 func CoreV1ToNetworkV1LB(lbips []corev1.LoadBalancerIngress) 
[]networkingv1.IngressLoadBalancerIngress {
        t := make([]networkingv1.IngressLoadBalancerIngress, 0, len(lbips))
diff --git a/pkg/providers/utils/ingress_status_test.go 
b/pkg/providers/utils/ingress_status_test.go
new file mode 100644
index 00000000..cb2b1bab
--- /dev/null
+++ b/pkg/providers/utils/ingress_status_test.go
@@ -0,0 +1,257 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+package utils
+
+import (
+       "testing"
+
+       "github.com/stretchr/testify/assert"
+       extensionsv1beta1 "k8s.io/api/extensions/v1beta1"
+       networkingv1 "k8s.io/api/networking/v1"
+       networkingv1beta1 "k8s.io/api/networking/v1beta1"
+)
+
+func TestCompareNetworkingV1LBEqual(t *testing.T) {
+       lb1 := []networkingv1.IngressLoadBalancerIngress{
+               {
+                       IP: "0.0.0.0",
+               },
+       }
+       lb2 := []networkingv1.IngressLoadBalancerIngress{
+               {
+                       IP: "0.0.0.0",
+               },
+       }
+       assert.Equal(t, true, CompareNetworkingV1LBEqual(lb1, lb2))
+
+       lb1 = []networkingv1.IngressLoadBalancerIngress{
+               {
+                       IP: "0.0.0.0",
+               },
+       }
+       lb2 = []networkingv1.IngressLoadBalancerIngress{
+               {
+                       IP: "0.0.0.0",
+               },
+               {
+                       Hostname: "test.com",
+               },
+       }
+       assert.Equal(t, false, CompareNetworkingV1LBEqual(lb1, lb2))
+
+       lb1 = []networkingv1.IngressLoadBalancerIngress{
+               {
+                       IP: "127.0.0.1",
+               },
+               {
+                       IP: "0.0.0.0",
+               },
+       }
+       lb2 = []networkingv1.IngressLoadBalancerIngress{
+               {
+                       IP: "0.0.0.0",
+               },
+               {
+                       IP: "127.0.0.1",
+               },
+       }
+       assert.Equal(t, true, CompareNetworkingV1LBEqual(lb1, lb2))
+
+       lb1 = []networkingv1.IngressLoadBalancerIngress{
+               {
+                       IP: "127.0.0.1",
+               },
+               {
+                       IP: "1.1.1.1",
+               },
+       }
+       lb2 = []networkingv1.IngressLoadBalancerIngress{
+               {
+                       IP: "127.0.0.1",
+               },
+               {
+                       IP: "0.0.0.0",
+               },
+       }
+       assert.Equal(t, false, CompareNetworkingV1LBEqual(lb1, lb2))
+
+       lb1 = []networkingv1.IngressLoadBalancerIngress{
+               {
+                       Hostname: "test.com",
+               },
+               {
+                       IP: "127.0.0.1",
+               },
+               {
+                       IP: "0.0.0.0",
+               },
+       }
+       lb2 = []networkingv1.IngressLoadBalancerIngress{
+               {
+                       IP: "0.0.0.0",
+               },
+               {
+                       IP: "127.0.0.1",
+               },
+               {
+                       Hostname: "test.com",
+               },
+       }
+       assert.Equal(t, true, CompareNetworkingV1LBEqual(lb1, lb2))
+}
+
+func TestCompareNetworkingV1beta1LBEqual(t *testing.T) {
+       lb1 := []networkingv1beta1.IngressLoadBalancerIngress{
+               {
+                       IP: "0.0.0.0",
+               },
+       }
+       lb2 := []networkingv1beta1.IngressLoadBalancerIngress{
+               {
+                       IP: "0.0.0.0",
+               },
+       }
+       assert.Equal(t, true, CompareNetworkingV1beta1LBEqual(lb1, lb2))
+
+       lb1 = []networkingv1beta1.IngressLoadBalancerIngress{
+               {
+                       IP: "0.0.0.0",
+               },
+       }
+       lb2 = []networkingv1beta1.IngressLoadBalancerIngress{
+               {
+                       IP: "0.0.0.0",
+               },
+               {
+                       Hostname: "test.com",
+               },
+       }
+       assert.Equal(t, false, CompareNetworkingV1beta1LBEqual(lb1, lb2))
+
+       lb1 = []networkingv1beta1.IngressLoadBalancerIngress{
+               {
+                       IP: "127.0.0.1",
+               },
+               {
+                       IP: "1.1.1.1",
+               },
+       }
+       lb2 = []networkingv1beta1.IngressLoadBalancerIngress{
+               {
+                       IP: "127.0.0.1",
+               },
+               {
+                       IP: "0.0.0.0",
+               },
+       }
+       assert.Equal(t, false, CompareNetworkingV1beta1LBEqual(lb1, lb2))
+
+       lb1 = []networkingv1beta1.IngressLoadBalancerIngress{
+               {
+                       Hostname: "test.com",
+               },
+               {
+                       IP: "127.0.0.1",
+               },
+               {
+                       IP: "0.0.0.0",
+               },
+       }
+       lb2 = []networkingv1beta1.IngressLoadBalancerIngress{
+               {
+                       IP: "0.0.0.0",
+               },
+               {
+                       IP: "127.0.0.1",
+               },
+               {
+                       Hostname: "test.com",
+               },
+       }
+       assert.Equal(t, true, CompareNetworkingV1beta1LBEqual(lb1, lb2))
+}
+
+func TestCompareExtensionsV1beta1LBEqual(t *testing.T) {
+       lb1 := []extensionsv1beta1.IngressLoadBalancerIngress{
+               {
+                       IP: "0.0.0.0",
+               },
+       }
+       lb2 := []extensionsv1beta1.IngressLoadBalancerIngress{
+               {
+                       IP: "0.0.0.0",
+               },
+       }
+       assert.Equal(t, true, CompareExtensionsV1beta1LBEqual(lb1, lb2))
+
+       lb1 = []extensionsv1beta1.IngressLoadBalancerIngress{
+               {
+                       IP: "0.0.0.0",
+               },
+       }
+       lb2 = []extensionsv1beta1.IngressLoadBalancerIngress{
+               {
+                       IP: "0.0.0.0",
+               },
+               {
+                       Hostname: "test.com",
+               },
+       }
+       assert.Equal(t, false, CompareExtensionsV1beta1LBEqual(lb1, lb2))
+
+       lb1 = []extensionsv1beta1.IngressLoadBalancerIngress{
+               {
+                       IP: "127.0.0.1",
+               },
+               {
+                       IP: "1.1.1.1",
+               },
+       }
+       lb2 = []extensionsv1beta1.IngressLoadBalancerIngress{
+               {
+                       IP: "127.0.0.1",
+               },
+               {
+                       IP: "0.0.0.0",
+               },
+       }
+       assert.Equal(t, false, CompareExtensionsV1beta1LBEqual(lb1, lb2))
+
+       lb1 = []extensionsv1beta1.IngressLoadBalancerIngress{
+               {
+                       Hostname: "test.com",
+               },
+               {
+                       IP: "127.0.0.1",
+               },
+               {
+                       IP: "0.0.0.0",
+               },
+       }
+       lb2 = []extensionsv1beta1.IngressLoadBalancerIngress{
+               {
+                       IP: "0.0.0.0",
+               },
+               {
+                       IP: "127.0.0.1",
+               },
+               {
+                       Hostname: "test.com",
+               },
+       }
+       assert.Equal(t, true, CompareExtensionsV1beta1LBEqual(lb1, lb2))
+}
diff --git a/pkg/providers/utils/status.go b/pkg/providers/utils/status.go
index 3f624aa1..12e73f43 100644
--- a/pkg/providers/utils/status.go
+++ b/pkg/providers/utils/status.go
@@ -64,3 +64,19 @@ func VerifyGeneration(conditions *[]metav1.Condition, 
newCondition metav1.Condit
        }
        return true
 }
+
+// VerifyConditions verify conditions to decide whether to update status
+func VerifyConditions(conditions *[]metav1.Condition, newCondition 
metav1.Condition) bool {
+       existingCondition := meta.FindStatusCondition(*conditions, 
newCondition.Type)
+       if existingCondition == nil {
+               return true
+       }
+
+       if existingCondition.ObservedGeneration > 
newCondition.ObservedGeneration {
+               return false
+       }
+       if *existingCondition == newCondition {
+               return false
+       }
+       return true
+}
diff --git a/pkg/providers/utils/status_test.go 
b/pkg/providers/utils/status_test.go
new file mode 100644
index 00000000..7f90e980
--- /dev/null
+++ b/pkg/providers/utils/status_test.go
@@ -0,0 +1,102 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+package utils
+
+import (
+       "testing"
+
+       "github.com/stretchr/testify/assert"
+       metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+)
+
+func TestVerifyConditions(t *testing.T) {
+       // Different status
+       conditions := []metav1.Condition{
+               {
+                       Type:               ConditionType,
+                       Status:             metav1.ConditionTrue,
+                       ObservedGeneration: 1,
+               },
+       }
+       newCondition := metav1.Condition{
+               Type:               ConditionType,
+               Status:             metav1.ConditionFalse,
+               ObservedGeneration: 1,
+       }
+       assert.Equal(t, true, VerifyConditions(&conditions, newCondition))
+
+       // same condition
+       conditions = []metav1.Condition{
+               {
+                       Type:               ConditionType,
+                       Status:             metav1.ConditionTrue,
+                       ObservedGeneration: 1,
+               },
+       }
+       newCondition = metav1.Condition{
+               Type:               ConditionType,
+               Status:             metav1.ConditionTrue,
+               ObservedGeneration: 1,
+       }
+       assert.Equal(t, false, VerifyConditions(&conditions, newCondition))
+
+       // Different ObservedGeneration
+       conditions = []metav1.Condition{
+               {
+                       Type:               ConditionType,
+                       Status:             metav1.ConditionTrue,
+                       ObservedGeneration: 1,
+               },
+       }
+       newCondition = metav1.Condition{
+               Type:               ConditionType,
+               Status:             metav1.ConditionTrue,
+               ObservedGeneration: 2,
+       }
+       assert.Equal(t, true, VerifyConditions(&conditions, newCondition))
+
+       conditions = []metav1.Condition{
+               {
+                       Type:               ConditionType,
+                       Status:             metav1.ConditionTrue,
+                       ObservedGeneration: 2,
+               },
+       }
+       newCondition = metav1.Condition{
+               Type:               ConditionType,
+               Status:             metav1.ConditionTrue,
+               ObservedGeneration: 1,
+       }
+       assert.Equal(t, false, VerifyConditions(&conditions, newCondition))
+
+       // Different message
+       conditions = []metav1.Condition{
+               {
+                       Type:               ConditionType,
+                       Status:             metav1.ConditionFalse,
+                       Message:            "port does not exist",
+                       ObservedGeneration: 1,
+               },
+       }
+       newCondition = metav1.Condition{
+               Type:               ConditionType,
+               Status:             metav1.ConditionFalse,
+               Message:            "service does not exist",
+               ObservedGeneration: 1,
+       }
+       assert.Equal(t, true, VerifyConditions(&conditions, newCondition))
+}
diff --git a/test/e2e/scaffold/ingress.go b/test/e2e/scaffold/ingress.go
index 87e639d9..21b50e7c 100644
--- a/test/e2e/scaffold/ingress.go
+++ b/test/e2e/scaffold/ingress.go
@@ -398,6 +398,7 @@ spec:
             - "%s"
             - --enable-gateway-api
             - "true"
+            %s
           %s
       volumes:
        - name: webhook-certs
@@ -433,20 +434,25 @@ func (s *Scaffold) newIngressAPISIXController() error {
                assert.Nil(s.t, err, "deleting ClusterRole")
        })
 
-       var ingressAPISIXDeployment string
+       var (
+               ingressAPISIXDeployment string
+               disableStatusStr        string
+               webhookVolumeMounts     string
+       )
        label := `""`
        if labels := s.NamespaceSelectorLabelStrings(); labels != nil && 
!s.opts.DisableNamespaceSelector {
                label = labels[0]
        }
-
+       if s.opts.DisableStatus {
+               disableStatusStr = "- --disable-status-updates"
+       }
        if s.opts.EnableWebhooks {
-               ingressAPISIXDeployment = 
fmt.Sprintf(s.FormatRegistry(_ingressAPISIXDeploymentTemplate), 
s.opts.IngressAPISIXReplicas, s.namespace, s.opts.APISIXAdminAPIVersion, 
s.opts.ApisixResourceSyncInterval,
-                       label, s.opts.ApisixResourceVersion, 
s.opts.APISIXPublishAddress, _volumeMounts, _webhookCertSecret)
-       } else {
-               ingressAPISIXDeployment = 
fmt.Sprintf(s.FormatRegistry(_ingressAPISIXDeploymentTemplate), 
s.opts.IngressAPISIXReplicas, s.namespace, s.opts.APISIXAdminAPIVersion, 
s.opts.ApisixResourceSyncInterval,
-                       label, s.opts.ApisixResourceVersion, 
s.opts.APISIXPublishAddress, "", _webhookCertSecret)
+               webhookVolumeMounts = _volumeMounts
        }
 
+       ingressAPISIXDeployment = 
fmt.Sprintf(s.FormatRegistry(_ingressAPISIXDeploymentTemplate), 
s.opts.IngressAPISIXReplicas, s.namespace, s.opts.APISIXAdminAPIVersion, 
s.opts.ApisixResourceSyncInterval,
+               label, s.opts.ApisixResourceVersion, 
s.opts.APISIXPublishAddress, disableStatusStr, webhookVolumeMounts, 
_webhookCertSecret)
+
        err = s.CreateResourceFromString(ingressAPISIXDeployment)
        assert.Nil(s.t, err, "create deployment")
 
@@ -547,16 +553,27 @@ func (s *Scaffold) GetIngressPodDetails() ([]corev1.Pod, 
error) {
 
 // ScaleIngressController scales the number of Ingress Controller pods to 
desired.
 func (s *Scaffold) ScaleIngressController(desired int) error {
-       var ingressDeployment string
-       var label string
+       var (
+               ingressDeployment   string
+               label               string
+               disableStatusStr    string
+               webhookVolumeMounts string
+       )
+
        if labels := s.NamespaceSelectorLabelStrings(); labels != nil {
                label = labels[0]
        }
+       if s.opts.DisableStatus {
+               disableStatusStr = "- --disable-status-updates"
+       }
        if s.opts.EnableWebhooks {
-               ingressDeployment = 
fmt.Sprintf(s.FormatRegistry(_ingressAPISIXDeploymentTemplate), desired, 
s.namespace, s.opts.APISIXAdminAPIVersion, s.opts.ApisixResourceSyncInterval, 
label, s.opts.ApisixResourceVersion, s.opts.APISIXPublishAddress, 
_volumeMounts, _webhookCertSecret)
-       } else {
-               ingressDeployment = 
fmt.Sprintf(s.FormatRegistry(_ingressAPISIXDeploymentTemplate), desired, 
s.namespace, s.opts.APISIXAdminAPIVersion, s.opts.ApisixResourceSyncInterval, 
label, s.opts.ApisixResourceVersion, s.opts.APISIXPublishAddress, "", 
_webhookCertSecret)
+               webhookVolumeMounts = _volumeMounts
        }
+
+       ingressDeployment = 
fmt.Sprintf(s.FormatRegistry(_ingressAPISIXDeploymentTemplate), desired, 
s.namespace,
+               s.opts.APISIXAdminAPIVersion, 
s.opts.ApisixResourceSyncInterval, label, s.opts.ApisixResourceVersion, 
s.opts.APISIXPublishAddress,
+               disableStatusStr, webhookVolumeMounts, _webhookCertSecret)
+
        if err := s.CreateResourceFromString(ingressDeployment); err != nil {
                return err
        }
diff --git a/test/e2e/scaffold/scaffold.go b/test/e2e/scaffold/scaffold.go
index ce9869b2..cf15b8a2 100644
--- a/test/e2e/scaffold/scaffold.go
+++ b/test/e2e/scaffold/scaffold.go
@@ -59,6 +59,7 @@ type Options struct {
        APISIXPublishAddress       string
        ApisixResourceSyncInterval string
        ApisixResourceVersion      string
+       DisableStatus              bool
 
        NamespaceSelectorLabel   map[string]string
        DisableNamespaceSelector bool
diff --git a/test/e2e/suite-ingress/suite-ingress-features/status.go 
b/test/e2e/suite-ingress/suite-ingress-features/status.go
index 7ddd1a0d..5a2f1d71 100644
--- a/test/e2e/suite-ingress/suite-ingress-features/status.go
+++ b/test/e2e/suite-ingress/suite-ingress-features/status.go
@@ -144,3 +144,77 @@ spec:
                assert.True(ginkgo.GinkgoT(), hasIP, "LB Status is recorded")
        })
 })
+
+var _ = ginkgo.Describe("suite-ingress-features: disable status", func() {
+       opts := &scaffold.Options{
+               Name:                  "default",
+               IngressAPISIXReplicas: 1,
+               APISIXPublishAddress:  "10.6.6.6",
+               DisableStatus:         true,
+       }
+       s := scaffold.NewScaffold(opts)
+       ginkgo.It("check the ApisixRoute status is recorded", func() {
+               backendSvc, backendSvcPort := s.DefaultHTTPBackend()
+               apisixRoute := fmt.Sprintf(`
+apiVersion: apisix.apache.org/v2
+kind: ApisixRoute
+metadata:
+  name: httpbin-route
+spec:
+  http:
+  - name: rule1
+    match:
+      hosts:
+      - httpbin.com
+      paths:
+      - /ip
+    backends:
+    - serviceName: %s
+      servicePort: %d
+`, backendSvc, backendSvcPort[0])
+               assert.Nil(ginkgo.GinkgoT(), 
s.CreateVersionedApisixResource(apisixRoute))
+
+               err := s.EnsureNumApisixRoutesCreated(1)
+               assert.Nil(ginkgo.GinkgoT(), err, "Checking number of routes")
+               err = s.EnsureNumApisixUpstreamsCreated(1)
+               assert.Nil(ginkgo.GinkgoT(), err, "Checking number of 
upstreams")
+               // status should be recorded as successful
+               output, err := s.GetOutputFromString("ar", "httpbin-route", 
"-o", "jsonpath='{ .status }'")
+               assert.Nil(ginkgo.GinkgoT(), err)
+               assert.Equal(ginkgo.GinkgoT(), "''", output)
+       })
+
+       ginkgo.It("check the ingress lb status is updated", func() {
+               backendSvc, backendPort := s.DefaultHTTPBackend()
+               ing := fmt.Sprintf(`
+apiVersion: networking.k8s.io/v1
+kind: Ingress
+metadata:
+  annotations:
+    kubernetes.io/ingress.class: apisix
+  name: ingress-v1-lb
+spec:
+  rules:
+  - host: httpbin.org
+    http:
+      paths:
+      - path: /ip
+        pathType: Exact
+        backend:
+          service:
+            name: %s
+            port:
+              number: %d
+`, backendSvc, backendPort[0])
+               err := s.CreateResourceFromString(ing)
+               assert.Nil(ginkgo.GinkgoT(), err, "creating ingress")
+               time.Sleep(5 * time.Second)
+
+               _ = s.NewAPISIXClient().GET("/ip").WithHeader("Host", 
"httpbin.org").Expect().Status(http.StatusOK)
+
+               output, err := s.GetOutputFromString("ingress", 
"ingress-v1-lb", "-o", "jsonpath='{ .status.loadBalancer }'")
+               assert.Nil(ginkgo.GinkgoT(), err, "Get output of ingress 
status")
+
+               assert.Equal(ginkgo.GinkgoT(), "'{}'", output)
+       })
+})


Reply via email to