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)
})
})