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 d46b8e0f feat: support v2 in resource compare (#1093)
d46b8e0f is described below

commit d46b8e0f79172ca38b3e8ce93552b7ba1225aca4
Author: Sarasa Kisaragi <[email protected]>
AuthorDate: Fri Jun 24 20:13:03 2022 +0800

    feat: support v2 in resource compare (#1093)
---
 pkg/ingress/compare.go            | 201 +++++++++++++++++++++++++++-----------
 test/e2e/scaffold/scaffold.go     |  11 ++-
 test/e2e/suite-ingress/compare.go |  57 +++++------
 3 files changed, 185 insertions(+), 84 deletions(-)

diff --git a/pkg/ingress/compare.go b/pkg/ingress/compare.go
index 3818d2e1..ad83186e 100644
--- a/pkg/ingress/compare.go
+++ b/pkg/ingress/compare.go
@@ -18,8 +18,10 @@ import (
        "context"
        "sync"
 
+       "go.uber.org/zap"
        v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 
+       "github.com/apache/apisix-ingress-controller/pkg/config"
        "github.com/apache/apisix-ingress-controller/pkg/log"
 )
 
@@ -54,74 +56,163 @@ func (c *Controller) CompareResources(ctx context.Context) 
error {
                        defer wg.Done()
                        // ApisixRoute
                        opts := v1.ListOptions{}
-                       retRoutes, err := 
c.kubeClient.APISIXClient.ApisixV2beta3().ApisixRoutes(ns).List(ctx, opts)
-                       if err != nil {
-                               log.Error(err.Error())
-                               ctx.Done()
-                       } else {
-                               for _, r := range retRoutes.Items {
-                                       tc, err := 
c.translator.TranslateRouteV2beta3NotStrictly(&r)
-                                       if err != nil {
-                                               log.Error(err.Error())
-                                               ctx.Done()
-                                       } else {
-                                               // routes
-                                               for _, route := range tc.Routes 
{
-                                                       
routeMapK8S.Store(route.ID, route.ID)
+                       switch c.cfg.Kubernetes.ApisixRouteVersion {
+                       case config.ApisixRouteV2beta3:
+                               retRoutes, err := 
c.kubeClient.APISIXClient.ApisixV2beta3().ApisixRoutes(ns).List(ctx, opts)
+                               if err != nil {
+                                       log.Error(err.Error())
+                                       ctx.Done()
+                               } else {
+                                       for _, r := range retRoutes.Items {
+                                               tc, err := 
c.translator.TranslateRouteV2beta3NotStrictly(&r)
+                                               if err != nil {
+                                                       log.Error(err.Error())
+                                                       ctx.Done()
+                                               } else {
+                                                       // routes
+                                                       for _, route := range 
tc.Routes {
+                                                               
routeMapK8S.Store(route.ID, route.ID)
+                                                       }
+                                                       // streamRoutes
+                                                       for _, stRoute := range 
tc.StreamRoutes {
+                                                               
streamRouteMapK8S.Store(stRoute.ID, stRoute.ID)
+                                                       }
+                                                       // upstreams
+                                                       for _, upstream := 
range tc.Upstreams {
+                                                               
upstreamMapK8S.Store(upstream.ID, upstream.ID)
+                                                       }
+                                                       // ssl
+                                                       for _, ssl := range 
tc.SSL {
+                                                               
sslMapK8S.Store(ssl.ID, ssl.ID)
+                                                       }
+                                                       // pluginConfigs
+                                                       for _, pluginConfig := 
range tc.PluginConfigs {
+                                                               
pluginConfigMapK8S.Store(pluginConfig.ID, pluginConfig.ID)
+                                                       }
                                                }
-                                               // streamRoutes
-                                               for _, stRoute := range 
tc.StreamRoutes {
-                                                       
streamRouteMapK8S.Store(stRoute.ID, stRoute.ID)
-                                               }
-                                               // upstreams
-                                               for _, upstream := range 
tc.Upstreams {
-                                                       
upstreamMapK8S.Store(upstream.ID, upstream.ID)
-                                               }
-                                               // ssl
-                                               for _, ssl := range tc.SSL {
-                                                       sslMapK8S.Store(ssl.ID, 
ssl.ID)
-                                               }
-                                               // pluginConfigs
-                                               for _, pluginConfig := range 
tc.PluginConfigs {
-                                                       
pluginConfigMapK8S.Store(pluginConfig.ID, pluginConfig.ID)
+                                       }
+                               }
+                       case config.ApisixRouteV2:
+                               retRoutes, err := 
c.kubeClient.APISIXClient.ApisixV2().ApisixRoutes(ns).List(ctx, opts)
+                               if err != nil {
+                                       log.Error(err.Error())
+                                       ctx.Done()
+                               } else {
+                                       for _, r := range retRoutes.Items {
+                                               tc, err := 
c.translator.TranslateRouteV2NotStrictly(&r)
+                                               if err != nil {
+                                                       log.Error(err.Error())
+                                                       ctx.Done()
+                                               } else {
+                                                       // routes
+                                                       for _, route := range 
tc.Routes {
+                                                               
routeMapK8S.Store(route.ID, route.ID)
+                                                       }
+                                                       // streamRoutes
+                                                       for _, stRoute := range 
tc.StreamRoutes {
+                                                               
streamRouteMapK8S.Store(stRoute.ID, stRoute.ID)
+                                                       }
+                                                       // upstreams
+                                                       for _, upstream := 
range tc.Upstreams {
+                                                               
upstreamMapK8S.Store(upstream.ID, upstream.ID)
+                                                       }
+                                                       // ssl
+                                                       for _, ssl := range 
tc.SSL {
+                                                               
sslMapK8S.Store(ssl.ID, ssl.ID)
+                                                       }
+                                                       // pluginConfigs
+                                                       for _, pluginConfig := 
range tc.PluginConfigs {
+                                                               
pluginConfigMapK8S.Store(pluginConfig.ID, pluginConfig.ID)
+                                                       }
                                                }
                                        }
                                }
+                       default:
+                               log.Errorw("failed to sync ApisixRoute, 
unexpected version",
+                                       zap.String("version", 
c.cfg.Kubernetes.ApisixRouteVersion),
+                               )
                        }
                        // todo ApisixUpstream and ApisixPluginConfig
                        // ApisixUpstream and ApisixPluginConfig should be 
synced with ApisixRoute resource
 
-                       // ApisixSSL TODO: Support v2?
-                       retSSL, err := 
c.kubeClient.APISIXClient.ApisixV2beta3().ApisixTlses(ns).List(ctx, opts)
-                       if err != nil {
-                               log.Error(err.Error())
-                               ctx.Done()
-                       } else {
-                               for _, s := range retSSL.Items {
-                                       ssl, err := 
c.translator.TranslateSSLV2Beta3(&s)
-                                       if err != nil {
-                                               log.Error(err.Error())
-                                               ctx.Done()
-                                       } else {
-                                               sslMapK8S.Store(ssl.ID, ssl.ID)
+                       switch c.cfg.Kubernetes.ApisixTlsVersion {
+                       case config.ApisixV2beta3:
+                               retSSL, err := 
c.kubeClient.APISIXClient.ApisixV2beta3().ApisixTlses(ns).List(ctx, opts)
+                               if err != nil {
+                                       log.Error(err.Error())
+                                       ctx.Done()
+                               } else {
+                                       for _, s := range retSSL.Items {
+                                               ssl, err := 
c.translator.TranslateSSLV2Beta3(&s)
+                                               if err != nil {
+                                                       log.Error(err.Error())
+                                                       ctx.Done()
+                                               } else {
+                                                       sslMapK8S.Store(ssl.ID, 
ssl.ID)
+                                               }
                                        }
                                }
+                       case config.ApisixV2:
+                               retSSL, err := 
c.kubeClient.APISIXClient.ApisixV2().ApisixTlses(ns).List(ctx, opts)
+                               if err != nil {
+                                       log.Error(err.Error())
+                                       ctx.Done()
+                               } else {
+                                       for _, s := range retSSL.Items {
+                                               ssl, err := 
c.translator.TranslateSSLV2(&s)
+                                               if err != nil {
+                                                       log.Error(err.Error())
+                                                       ctx.Done()
+                                               } else {
+                                                       sslMapK8S.Store(ssl.ID, 
ssl.ID)
+                                               }
+                                       }
+                               }
+                       default:
+                               log.Errorw("failed to sync ApisixTls, 
unexpected version",
+                                       zap.String("version", 
c.cfg.Kubernetes.ApisixTlsVersion),
+                               )
                        }
-                       // ApisixConsumer
-                       retConsumer, err := 
c.kubeClient.APISIXClient.ApisixV2beta3().ApisixConsumers(ns).List(ctx, opts)
-                       if err != nil {
-                               log.Error(err.Error())
-                               ctx.Done()
-                       } else {
-                               for _, con := range retConsumer.Items {
-                                       consumer, err := 
c.translator.TranslateApisixConsumerV2beta3(&con)
-                                       if err != nil {
-                                               log.Error(err.Error())
-                                               ctx.Done()
-                                       } else {
-                                               
consumerMapK8S.Store(consumer.Username, consumer.Username)
+
+                       switch c.cfg.Kubernetes.ApisixConsumerVersion {
+                       case config.ApisixV2beta3:
+                               // ApisixConsumer
+                               retConsumer, err := 
c.kubeClient.APISIXClient.ApisixV2beta3().ApisixConsumers(ns).List(ctx, opts)
+                               if err != nil {
+                                       log.Error(err.Error())
+                                       ctx.Done()
+                               } else {
+                                       for _, con := range retConsumer.Items {
+                                               consumer, err := 
c.translator.TranslateApisixConsumerV2beta3(&con)
+                                               if err != nil {
+                                                       log.Error(err.Error())
+                                                       ctx.Done()
+                                               } else {
+                                                       
consumerMapK8S.Store(consumer.Username, consumer.Username)
+                                               }
+                                       }
+                               }
+                       case config.ApisixV2:
+                               // ApisixConsumer
+                               retConsumer, err := 
c.kubeClient.APISIXClient.ApisixV2().ApisixConsumers(ns).List(ctx, opts)
+                               if err != nil {
+                                       log.Error(err.Error())
+                                       ctx.Done()
+                               } else {
+                                       for _, con := range retConsumer.Items {
+                                               consumer, err := 
c.translator.TranslateApisixConsumerV2(&con)
+                                               if err != nil {
+                                                       log.Error(err.Error())
+                                                       ctx.Done()
+                                               } else {
+                                                       
consumerMapK8S.Store(consumer.Username, consumer.Username)
+                                               }
                                        }
                                }
+                       default:
+                               log.Errorw("failed to sync ApisixConsumer, 
unexpected version",
+                                       zap.String("version", 
c.cfg.Kubernetes.ApisixConsumerVersion),
+                               )
                        }
                }(key)
        }
diff --git a/test/e2e/scaffold/scaffold.go b/test/e2e/scaffold/scaffold.go
index 01d4f50c..0519a42b 100644
--- a/test/e2e/scaffold/scaffold.go
+++ b/test/e2e/scaffold/scaffold.go
@@ -509,7 +509,7 @@ func (s *Scaffold) FormatNamespaceLabel(label string) 
string {
 }
 
 var (
-       versionRegex = regexp.MustCompile(`apiVersion: apisix.apache.org/.*?\n`)
+       versionRegex = regexp.MustCompile(`apiVersion: 
apisix.apache.org/v.*?\n`)
 )
 
 func (s *Scaffold) replaceApiVersion(yml, ver string) string {
@@ -551,3 +551,12 @@ func (s *Scaffold) CreateVersionedApisixPluginConfig(yml 
string) error {
        ac := s.replaceApiVersion(yml, s.opts.ApisixPluginConfigVersion)
        return s.CreateResourceFromString(ac)
 }
+
+func (s *Scaffold) CreateVersionedApisixRoute(yml string) error {
+       if !strings.Contains(yml, "kind: ApisixRoute") {
+               return errors.New("not a ApisixRoute")
+       }
+
+       ac := s.replaceApiVersion(yml, s.opts.APISIXRouteVersion)
+       return s.CreateResourceFromString(ac)
+}
diff --git a/test/e2e/suite-ingress/compare.go 
b/test/e2e/suite-ingress/compare.go
index 70ffd367..5330da02 100644
--- a/test/e2e/suite-ingress/compare.go
+++ b/test/e2e/suite-ingress/compare.go
@@ -25,18 +25,11 @@ import (
 )
 
 var _ = ginkgo.Describe("suite-ingress: Testing compare resources", func() {
-       opts := &scaffold.Options{
-               Name:                  "default",
-               Kubeconfig:            scaffold.GetKubeconfig(),
-               APISIXConfigPath:      "testdata/apisix-gw-config.yaml",
-               IngressAPISIXReplicas: 1,
-               HTTPBinServicePort:    80,
-               APISIXRouteVersion:    "apisix.apache.org/v2beta3",
-       }
-       s := scaffold.NewScaffold(opts)
-       ginkgo.It("Compare and find out the redundant objects in APISIX, and 
remove them", func() {
-               backendSvc, backendSvcPort := s.DefaultHTTPBackend()
-               apisixRoute := fmt.Sprintf(`
+       suites := func(scaffoldFunc func() *scaffold.Scaffold) {
+               s := scaffoldFunc()
+               ginkgo.It("Compare and find out the redundant objects in 
APISIX, and remove them", func() {
+                       backendSvc, backendSvcPort := s.DefaultHTTPBackend()
+                       apisixRoute := fmt.Sprintf(`
 apiVersion: apisix.apache.org/v2beta3
 kind: ApisixRoute
 metadata:
@@ -53,22 +46,30 @@ spec:
     - serviceName: %s
       servicePort: %d
 `, backendSvc, backendSvcPort[0])
-               assert.Nil(ginkgo.GinkgoT(), 
s.CreateResourceFromString(apisixRoute))
+                       assert.Nil(ginkgo.GinkgoT(), 
s.CreateVersionedApisixRoute(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")
+                       // scale Ingres Controller --replicas=0
+                       assert.Nil(ginkgo.GinkgoT(), 
s.ScaleIngressController(0), "scaling ingress controller instances = 0")
+                       // remove ApisixRoute resource
+                       assert.Nil(ginkgo.GinkgoT(), 
s.RemoveResourceByString(apisixRoute))
+                       // scale Ingres Controller --replicas=1
+                       assert.Nil(ginkgo.GinkgoT(), 
s.ScaleIngressController(1), "scaling ingress controller instances = 1")
+                       time.Sleep(15 * time.Second)
+                       // should find the warn log
+                       output := 
s.GetDeploymentLogs("ingress-apisix-controller-deployment-e2e-test")
+                       fmt.Println(output)
+                       assert.Contains(ginkgo.GinkgoT(), output, "in APISIX 
but do not in declare yaml")
+               })
+       }
 
-               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")
-               // scale Ingres Controller --replicas=0
-               assert.Nil(ginkgo.GinkgoT(), s.ScaleIngressController(0), 
"scaling ingress controller instances = 0")
-               // remove ApisixRoute resource
-               assert.Nil(ginkgo.GinkgoT(), 
s.RemoveResourceByString(apisixRoute))
-               // scale Ingres Controller --replicas=1
-               assert.Nil(ginkgo.GinkgoT(), s.ScaleIngressController(1), 
"scaling ingress controller instances = 1")
-               time.Sleep(15 * time.Second)
-               // should find the warn log
-               output := 
s.GetDeploymentLogs("ingress-apisix-controller-deployment-e2e-test")
-               fmt.Println(output)
-               assert.Contains(ginkgo.GinkgoT(), output, "in APISIX but do not 
in declare yaml")
+       ginkgo.Describe("suite-ingress: scaffold v2beta3", func() {
+               suites(scaffold.NewDefaultScaffold)
+       })
+       ginkgo.Describe("suite-ingress: scaffold v2", func() {
+               suites(scaffold.NewDefaultV2Scaffold)
        })
 })

Reply via email to