From 42a164631933998f2f78b018320977f484285023 Mon Sep 17 00:00:00 2001 From: rongxin Date: Mon, 8 Dec 2025 08:57:42 +0800 Subject: [PATCH 1/7] feat: support retry for full synchronization --- internal/provider/api7ee/provider.go | 18 ++- test/e2e/api7/gatewayproxy.go | 2 +- test/e2e/api7/route.go | 190 +++++++++++++++++++++++++++ 3 files changed, 208 insertions(+), 2 deletions(-) create mode 100644 test/e2e/api7/route.go diff --git a/internal/provider/api7ee/provider.go b/internal/provider/api7ee/provider.go index aab86a0a6..aed9aedbd 100644 --- a/internal/provider/api7ee/provider.go +++ b/internal/provider/api7ee/provider.go @@ -39,12 +39,18 @@ import ( "github.com/apache/apisix-ingress-controller/internal/controller/status" "github.com/apache/apisix-ingress-controller/internal/manager/readiness" "github.com/apache/apisix-ingress-controller/internal/provider" + "github.com/apache/apisix-ingress-controller/internal/provider/common" "github.com/apache/apisix-ingress-controller/internal/types" "github.com/apache/apisix-ingress-controller/internal/utils" pkgutils "github.com/apache/apisix-ingress-controller/pkg/utils" ) -const ProviderTypeAPI7EE = "api7ee" +const ( + ProviderTypeAPI7EE = "api7ee" + + RetryBaseDelay = 1 * time.Second + RetryMaxDelay = 1000 * time.Second +) type api7eeProvider struct { translator *translator.Translator @@ -252,6 +258,9 @@ func (d *api7eeProvider) Start(ctx context.Context) error { } ticker := time.NewTicker(d.SyncPeriod) defer ticker.Stop() + + retrier := common.NewRetrier(common.NewExponentialBackoff(RetryBaseDelay, RetryMaxDelay)) + for { synced := false select { @@ -267,6 +276,13 @@ func (d *api7eeProvider) Start(ctx context.Context) error { d.log.Error(err, "failed to sync for startup") } } + + if err := d.sync(ctx); err != nil { + d.log.Error(err, "failed to sync") + retrier.Next() + } else { + retrier.Reset() + } } } diff --git a/test/e2e/api7/gatewayproxy.go b/test/e2e/api7/gatewayproxy.go index 1198399af..0bc544594 100644 --- a/test/e2e/api7/gatewayproxy.go +++ b/test/e2e/api7/gatewayproxy.go @@ -15,7 +15,7 @@ // specific language governing permissions and limitations // under the License. -package gatewayapi +package api7 import ( "fmt" diff --git a/test/e2e/api7/route.go b/test/e2e/api7/route.go new file mode 100644 index 000000000..4fbb32aa5 --- /dev/null +++ b/test/e2e/api7/route.go @@ -0,0 +1,190 @@ +// 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 api7 + +import ( + "fmt" + "time" + + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" + corev1 "k8s.io/api/core/v1" + "sigs.k8s.io/yaml" + + "github.com/apache/apisix-ingress-controller/test/e2e/framework" + "github.com/apache/apisix-ingress-controller/test/e2e/scaffold" +) + +var _ = Describe("Test apisix.apache.org/v2 Status", Label("apisix.apache.org", "v2", "apisixroute"), func() { + var ( + s = scaffold.NewScaffold(scaffold.Options{ + // for triggering the sync + SyncPeriod: 3 * time.Second, + }) + applier = framework.NewApplier(s.GinkgoT, s.K8sClient, s.CreateResourceFromString) + ) + + Context("Test ApisixRoute Sync Status", func() { + BeforeEach(func() { + By("create GatewayProxy") + err := s.CreateResourceFromString(s.GetGatewayProxySpec()) + Expect(err).NotTo(HaveOccurred(), "creating GatewayProxy") + time.Sleep(5 * time.Second) + + By("create IngressClass") + err = s.CreateResourceFromStringWithNamespace(s.GetIngressClassYaml(), "") + Expect(err).NotTo(HaveOccurred(), "creating IngressClass") + time.Sleep(5 * time.Second) + }) + const ar = ` +apiVersion: apisix.apache.org/v2 +kind: ApisixRoute +metadata: + name: default + namespace: %s +spec: + ingressClassName: %s + http: + - name: rule0 + match: + hosts: + - httpbin + paths: + - /* + backends: + - serviceName: httpbin-service-e2e-test + servicePort: 80 +` + const arWithInvalidPlugin = ` +apiVersion: apisix.apache.org/v2 +kind: ApisixRoute +metadata: + name: default + namespace: %s +spec: + ingressClassName: %s + http: + - name: rule0 + match: + hosts: + - httpbin + paths: + - /* + backends: + - serviceName: httpbin-service-e2e-test + servicePort: 80 + plugins: + - name: non-existent-plugin + enable: true +` + const arWithInvalidIngressClass = ` +apiVersion: apisix.apache.org/v2 +kind: ApisixRoute +metadata: + name: ar-with-invalid-ingressclass +spec: + ingressClassName: ar-with-invalid-ingressclass + http: + - name: rule0 + match: + hosts: + - httpbin + paths: + - /* + backends: + - serviceName: httpbin-service-e2e-test + servicePort: 80 +` + + It("dataplane unavailable", func() { + s.Deployer.ScaleIngress(0) + By("apply ApisixRoute") + s.CreateResourceFromString(fmt.Sprintf(ar, s.Namespace(), s.Namespace())) + + By("get yaml from service") + serviceYaml, err := s.GetOutputFromString("svc", framework.ProviderType, "-o", "yaml") + Expect(err).NotTo(HaveOccurred(), "getting service yaml") + By("update service to type ExternalName with invalid host") + var k8sservice corev1.Service + err = yaml.Unmarshal([]byte(serviceYaml), &k8sservice) + Expect(err).NotTo(HaveOccurred(), "unmarshalling service") + oldSpec := k8sservice.Spec + k8sservice.Spec = corev1.ServiceSpec{ + Type: corev1.ServiceTypeExternalName, + ExternalName: "invalid.host", + } + newServiceYaml, err := yaml.Marshal(k8sservice) + Expect(err).NotTo(HaveOccurred(), "marshalling service") + err = s.CreateResourceFromString(string(newServiceYaml)) + Expect(err).NotTo(HaveOccurred(), "creating service") + + s.Deployer.ScaleIngress(1) + + By("check route in APISIX") + s.RequestAssert(&scaffold.RequestAssert{ + Method: "GET", + Path: "/get", + Headers: map[string]string{"Host": "httpbin"}, + Check: scaffold.WithExpectedStatus(404), + }) + + By("check ApisixRoute status") + s.RetryAssertion(func() string { + output, _ := s.GetOutputFromString("ar", "default", "-o", "yaml", "-n", s.Namespace()) + return output + }).WithTimeout(60 * time.Second). + Should( + And( + ContainSubstring(`status: "False"`), + ContainSubstring(`reason: SyncFailed`), + ), + ) + + By("update service to original spec") + serviceYaml, err = s.GetOutputFromString("svc", framework.ProviderType, "-o", "yaml") + Expect(err).NotTo(HaveOccurred(), "getting service yaml") + err = yaml.Unmarshal([]byte(serviceYaml), &k8sservice) + Expect(err).NotTo(HaveOccurred(), "unmarshalling service") + k8sservice.Spec = oldSpec + newServiceYaml, err = yaml.Marshal(k8sservice) + Expect(err).NotTo(HaveOccurred(), "marshalling service") + err = s.CreateResourceFromString(string(newServiceYaml)) + Expect(err).NotTo(HaveOccurred(), "creating service") + + By("check ApisixRoute status after scaling up") + s.RetryAssertion(func() string { + output, _ := s.GetOutputFromString("ar", "default", "-o", "yaml", "-n", s.Namespace()) + return output + }).WithTimeout(60 * time.Second). + Should( + And( + ContainSubstring(`status: "True"`), + ContainSubstring(`reason: Accepted`), + ), + ) + + By("check route in APISIX") + s.RequestAssert(&scaffold.RequestAssert{ + Method: "GET", + Path: "/get", + Host: "httpbin", + Check: scaffold.WithExpectedStatus(200), + }) + }) + }) +}) From e0d635c6763f5bf592de3a8d791c177b13112c1e Mon Sep 17 00:00:00 2001 From: rongxin Date: Mon, 8 Dec 2025 09:00:02 +0800 Subject: [PATCH 2/7] f --- test/e2e/api7/route.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/e2e/api7/route.go b/test/e2e/api7/route.go index 4fbb32aa5..7f816fb3c 100644 --- a/test/e2e/api7/route.go +++ b/test/e2e/api7/route.go @@ -111,7 +111,7 @@ spec: servicePort: 80 ` - It("dataplane unavailable", func() { + FIt("dataplane unavailable", func() { s.Deployer.ScaleIngress(0) By("apply ApisixRoute") s.CreateResourceFromString(fmt.Sprintf(ar, s.Namespace(), s.Namespace())) From 925217da16840bcea1f5012c6c2a7e7b68bb140c Mon Sep 17 00:00:00 2001 From: rongxin Date: Mon, 8 Dec 2025 09:12:41 +0800 Subject: [PATCH 3/7] f --- test/e2e/api7/route.go | 1 - 1 file changed, 1 deletion(-) diff --git a/test/e2e/api7/route.go b/test/e2e/api7/route.go index 7f816fb3c..fa1e32657 100644 --- a/test/e2e/api7/route.go +++ b/test/e2e/api7/route.go @@ -36,7 +36,6 @@ var _ = Describe("Test apisix.apache.org/v2 Status", Label("apisix.apache.org", // for triggering the sync SyncPeriod: 3 * time.Second, }) - applier = framework.NewApplier(s.GinkgoT, s.K8sClient, s.CreateResourceFromString) ) Context("Test ApisixRoute Sync Status", func() { From 9b26c288472b7c2e9ee49194401f62be098d989a Mon Sep 17 00:00:00 2001 From: rongxin Date: Mon, 8 Dec 2025 14:21:23 +0800 Subject: [PATCH 4/7] f --- test/e2e/api7/route.go | 45 +++---------------------------- test/e2e/framework/api7_consts.go | 6 +++++ 2 files changed, 9 insertions(+), 42 deletions(-) diff --git a/test/e2e/api7/route.go b/test/e2e/api7/route.go index fa1e32657..f49ecc47a 100644 --- a/test/e2e/api7/route.go +++ b/test/e2e/api7/route.go @@ -69,54 +69,15 @@ spec: - serviceName: httpbin-service-e2e-test servicePort: 80 ` - const arWithInvalidPlugin = ` -apiVersion: apisix.apache.org/v2 -kind: ApisixRoute -metadata: - name: default - namespace: %s -spec: - ingressClassName: %s - http: - - name: rule0 - match: - hosts: - - httpbin - paths: - - /* - backends: - - serviceName: httpbin-service-e2e-test - servicePort: 80 - plugins: - - name: non-existent-plugin - enable: true -` - const arWithInvalidIngressClass = ` -apiVersion: apisix.apache.org/v2 -kind: ApisixRoute -metadata: - name: ar-with-invalid-ingressclass -spec: - ingressClassName: ar-with-invalid-ingressclass - http: - - name: rule0 - match: - hosts: - - httpbin - paths: - - /* - backends: - - serviceName: httpbin-service-e2e-test - servicePort: 80 -` FIt("dataplane unavailable", func() { s.Deployer.ScaleIngress(0) By("apply ApisixRoute") - s.CreateResourceFromString(fmt.Sprintf(ar, s.Namespace(), s.Namespace())) + err := s.CreateResourceFromString(fmt.Sprintf(ar, s.Namespace(), s.Namespace())) + Expect(err).NotTo(HaveOccurred(), "creating ApisixRoute") By("get yaml from service") - serviceYaml, err := s.GetOutputFromString("svc", framework.ProviderType, "-o", "yaml") + serviceYaml, err := s.GetOutputFromString("svc", framework.DashboardServiceName, "-n", framework.Namespace, "-o", "yaml") Expect(err).NotTo(HaveOccurred(), "getting service yaml") By("update service to type ExternalName with invalid host") var k8sservice corev1.Service diff --git a/test/e2e/framework/api7_consts.go b/test/e2e/framework/api7_consts.go index e18116e61..3b424d880 100644 --- a/test/e2e/framework/api7_consts.go +++ b/test/e2e/framework/api7_consts.go @@ -36,12 +36,18 @@ const ( DashboardEndpoint = "http://api7ee3-dashboard.api7-ee-e2e:7080" DashboardTLSEndpoint = "https://api7ee3-dashboard.api7-ee-e2e:7443" DPManagerTLSEndpoint = "https://api7ee3-dp-manager.api7-ee-e2e:7943" + + DashboardServiceName = "api7ee3-dashboard" ) const ( ProviderTypeAPI7EE = "api7ee" ) +const ( + Namespace = "api7-ee-e2e" +) + var ( IngressVersion = cmp.Or(os.Getenv("INGRESS_VERSION"), "v1") ) From 4bb33bd5ae1cc6c33b5202fd0cd2d8c72d7b9568 Mon Sep 17 00:00:00 2001 From: rongxin Date: Mon, 8 Dec 2025 14:55:43 +0800 Subject: [PATCH 5/7] f --- test/e2e/api7/route.go | 2 +- test/e2e/scaffold/k8s.go | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/test/e2e/api7/route.go b/test/e2e/api7/route.go index f49ecc47a..60eb74bec 100644 --- a/test/e2e/api7/route.go +++ b/test/e2e/api7/route.go @@ -77,7 +77,7 @@ spec: Expect(err).NotTo(HaveOccurred(), "creating ApisixRoute") By("get yaml from service") - serviceYaml, err := s.GetOutputFromString("svc", framework.DashboardServiceName, "-n", framework.Namespace, "-o", "yaml") + serviceYaml, err := s.GetOutputFromStringWithNamespace(framework.Namespace, "svc", framework.DashboardServiceName, "-o", "yaml") Expect(err).NotTo(HaveOccurred(), "getting service yaml") By("update service to type ExternalName with invalid host") var k8sservice corev1.Service diff --git a/test/e2e/scaffold/k8s.go b/test/e2e/scaffold/k8s.go index a3547b61a..2b6b361bc 100644 --- a/test/e2e/scaffold/k8s.go +++ b/test/e2e/scaffold/k8s.go @@ -25,6 +25,7 @@ import ( "fmt" "os" "os/exec" + "reflect" "strings" "time" @@ -102,6 +103,17 @@ func (s *Scaffold) GetOutputFromString(shell ...string) (string, error) { return output, err } +func (s *Scaffold) GetOutputFromStringWithNamespace(ns string, shell ...string) (string, error) { + cmdArgs := []string{} + cmdArgs = append(cmdArgs, "get") + cmdArgs = append(cmdArgs, shell...) + var newOpts *k8s.KubectlOptions + reflect.Copy(reflect.ValueOf(newOpts), reflect.ValueOf(s.kubectlOptions)) + newOpts.Namespace = ns + output, err := k8s.RunKubectlAndGetOutputE(GinkgoT(), newOpts, cmdArgs...) + return output, err +} + func (s *Scaffold) GetResourceYamlFromNamespace(resourceType, resourceName, namespace string) (string, error) { return s.GetOutputFromString(resourceType, resourceName, "-n", namespace, "-o", "yaml") } From 957d0d825359fbc6e90d50c32fcb182506931e90 Mon Sep 17 00:00:00 2001 From: rongxin Date: Tue, 9 Dec 2025 10:43:14 +0800 Subject: [PATCH 6/7] update --- test/e2e/api7/route.go | 15 ++++----------- test/e2e/scaffold/k8s.go | 11 ++++++++--- 2 files changed, 12 insertions(+), 14 deletions(-) diff --git a/test/e2e/api7/route.go b/test/e2e/api7/route.go index 60eb74bec..4e70530a3 100644 --- a/test/e2e/api7/route.go +++ b/test/e2e/api7/route.go @@ -76,13 +76,9 @@ spec: err := s.CreateResourceFromString(fmt.Sprintf(ar, s.Namespace(), s.Namespace())) Expect(err).NotTo(HaveOccurred(), "creating ApisixRoute") - By("get yaml from service") - serviceYaml, err := s.GetOutputFromStringWithNamespace(framework.Namespace, "svc", framework.DashboardServiceName, "-o", "yaml") - Expect(err).NotTo(HaveOccurred(), "getting service yaml") - By("update service to type ExternalName with invalid host") - var k8sservice corev1.Service - err = yaml.Unmarshal([]byte(serviceYaml), &k8sservice) - Expect(err).NotTo(HaveOccurred(), "unmarshalling service") + By("update service to invalid host") + k8sservice, err := s.GetService(framework.Namespace, framework.DashboardServiceName) + Expect(err).NotTo(HaveOccurred(), "getting service") oldSpec := k8sservice.Spec k8sservice.Spec = corev1.ServiceSpec{ Type: corev1.ServiceTypeExternalName, @@ -116,10 +112,7 @@ spec: ) By("update service to original spec") - serviceYaml, err = s.GetOutputFromString("svc", framework.ProviderType, "-o", "yaml") - Expect(err).NotTo(HaveOccurred(), "getting service yaml") - err = yaml.Unmarshal([]byte(serviceYaml), &k8sservice) - Expect(err).NotTo(HaveOccurred(), "unmarshalling service") + k8sservice, err = s.GetService(framework.Namespace, framework.DashboardServiceName) k8sservice.Spec = oldSpec newServiceYaml, err = yaml.Marshal(k8sservice) Expect(err).NotTo(HaveOccurred(), "marshalling service") diff --git a/test/e2e/scaffold/k8s.go b/test/e2e/scaffold/k8s.go index 2b6b361bc..4db6687c5 100644 --- a/test/e2e/scaffold/k8s.go +++ b/test/e2e/scaffold/k8s.go @@ -107,10 +107,10 @@ func (s *Scaffold) GetOutputFromStringWithNamespace(ns string, shell ...string) cmdArgs := []string{} cmdArgs = append(cmdArgs, "get") cmdArgs = append(cmdArgs, shell...) - var newOpts *k8s.KubectlOptions - reflect.Copy(reflect.ValueOf(newOpts), reflect.ValueOf(s.kubectlOptions)) + var newOpts k8s.KubectlOptions + reflect.Copy(reflect.ValueOf(newOpts), reflect.ValueOf(*s.kubectlOptions)) newOpts.Namespace = ns - output, err := k8s.RunKubectlAndGetOutputE(GinkgoT(), newOpts, cmdArgs...) + output, err := k8s.RunKubectlAndGetOutputE(GinkgoT(), &newOpts, cmdArgs...) return output, err } @@ -133,6 +133,11 @@ func (s *Scaffold) GetServiceByName(name string) (*corev1.Service, error) { return k8s.GetServiceE(s.t, s.kubectlOptions, name) } +func (s *Scaffold) GetService(namespace, name string) (*corev1.Service, error) { + kubectlOptions := k8s.NewKubectlOptions("", "", namespace) + return k8s.GetServiceE(s.t, kubectlOptions, name) +} + // ListPodsByLabels lists all pods which matching the label selector. func (s *Scaffold) ListPodsByLabels(labels string) ([]corev1.Pod, error) { return k8s.ListPodsE(s.t, s.kubectlOptions, metav1.ListOptions{ From 62c8f83f341eca382026033e4ceb682b98b5ab86 Mon Sep 17 00:00:00 2001 From: rongxin Date: Wed, 10 Dec 2025 09:08:24 +0800 Subject: [PATCH 7/7] fix test --- internal/provider/api7ee/provider.go | 9 +-- test/e2e/api7/route.go | 99 +++++++++++++--------------- test/e2e/framework/api7_consts.go | 6 -- test/e2e/scaffold/api7_deployer.go | 20 +++--- test/e2e/scaffold/k8s.go | 17 ----- 5 files changed, 59 insertions(+), 92 deletions(-) diff --git a/internal/provider/api7ee/provider.go b/internal/provider/api7ee/provider.go index aed9aedbd..0c4915d75 100644 --- a/internal/provider/api7ee/provider.go +++ b/internal/provider/api7ee/provider.go @@ -262,20 +262,13 @@ func (d *api7eeProvider) Start(ctx context.Context) error { retrier := common.NewRetrier(common.NewExponentialBackoff(RetryBaseDelay, RetryMaxDelay)) for { - synced := false select { case <-d.syncCh: - synced = true + case <-retrier.C(): case <-ticker.C: - synced = true case <-ctx.Done(): return nil } - if synced { - if err := d.sync(ctx); err != nil { - d.log.Error(err, "failed to sync for startup") - } - } if err := d.sync(ctx); err != nil { d.log.Error(err, "failed to sync") diff --git a/test/e2e/api7/route.go b/test/e2e/api7/route.go index 4e70530a3..82fde3a3f 100644 --- a/test/e2e/api7/route.go +++ b/test/e2e/api7/route.go @@ -23,34 +23,41 @@ import ( . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" - corev1 "k8s.io/api/core/v1" - "sigs.k8s.io/yaml" - "github.com/apache/apisix-ingress-controller/test/e2e/framework" "github.com/apache/apisix-ingress-controller/test/e2e/scaffold" ) var _ = Describe("Test apisix.apache.org/v2 Status", Label("apisix.apache.org", "v2", "apisixroute"), func() { - var ( - s = scaffold.NewScaffold(scaffold.Options{ - // for triggering the sync - SyncPeriod: 3 * time.Second, - }) - ) + s := scaffold.NewDefaultScaffold() Context("Test ApisixRoute Sync Status", func() { - BeforeEach(func() { - By("create GatewayProxy") - err := s.CreateResourceFromString(s.GetGatewayProxySpec()) - Expect(err).NotTo(HaveOccurred(), "creating GatewayProxy") - time.Sleep(5 * time.Second) - - By("create IngressClass") - err = s.CreateResourceFromStringWithNamespace(s.GetIngressClassYaml(), "") - Expect(err).NotTo(HaveOccurred(), "creating IngressClass") - time.Sleep(5 * time.Second) - }) - const ar = ` + const ( + serviceSpec = ` +apiVersion: v1 +kind: Service +metadata: + name: api7ee3-dashboard +spec: + type: ExternalName + externalName: %s +` + gatewayProxyYaml = ` +apiVersion: apisix.apache.org/v1alpha1 +kind: GatewayProxy +metadata: + name: apisix-proxy-config +spec: + provider: + type: ControlPlane + controlPlane: + endpoints: + - https://api7ee3-dashboard:7443 + auth: + type: AdminKey + adminKey: + value: "%s" +` + ar = ` apiVersion: apisix.apache.org/v2 kind: ApisixRoute metadata: @@ -69,41 +76,33 @@ spec: - serviceName: httpbin-service-e2e-test servicePort: 80 ` + ) - FIt("dataplane unavailable", func() { + It("dataplane unavailable", func() { s.Deployer.ScaleIngress(0) + By("create GatewayProxy") + err := s.CreateResourceFromString(fmt.Sprintf(gatewayProxyYaml, s.AdminKey())) + Expect(err).NotTo(HaveOccurred(), "creating GatewayProxy") + + By("create IngressClass") + err = s.CreateResourceFromStringWithNamespace(s.GetIngressClassYaml(), "") + Expect(err).NotTo(HaveOccurred(), "creating IngressClass") + + By("create Service with invalid host") + err = s.CreateResourceFromString(fmt.Sprintf(serviceSpec, "invalid.host")) + Expect(err).NotTo(HaveOccurred(), "creating Service") + By("apply ApisixRoute") - err := s.CreateResourceFromString(fmt.Sprintf(ar, s.Namespace(), s.Namespace())) + err = s.CreateResourceFromString(fmt.Sprintf(ar, s.Namespace(), s.Namespace())) Expect(err).NotTo(HaveOccurred(), "creating ApisixRoute") - By("update service to invalid host") - k8sservice, err := s.GetService(framework.Namespace, framework.DashboardServiceName) - Expect(err).NotTo(HaveOccurred(), "getting service") - oldSpec := k8sservice.Spec - k8sservice.Spec = corev1.ServiceSpec{ - Type: corev1.ServiceTypeExternalName, - ExternalName: "invalid.host", - } - newServiceYaml, err := yaml.Marshal(k8sservice) - Expect(err).NotTo(HaveOccurred(), "marshalling service") - err = s.CreateResourceFromString(string(newServiceYaml)) - Expect(err).NotTo(HaveOccurred(), "creating service") - s.Deployer.ScaleIngress(1) - By("check route in APISIX") - s.RequestAssert(&scaffold.RequestAssert{ - Method: "GET", - Path: "/get", - Headers: map[string]string{"Host": "httpbin"}, - Check: scaffold.WithExpectedStatus(404), - }) - By("check ApisixRoute status") s.RetryAssertion(func() string { output, _ := s.GetOutputFromString("ar", "default", "-o", "yaml", "-n", s.Namespace()) return output - }).WithTimeout(60 * time.Second). + }).WithTimeout(5 * time.Minute). Should( And( ContainSubstring(`status: "False"`), @@ -111,13 +110,9 @@ spec: ), ) - By("update service to original spec") - k8sservice, err = s.GetService(framework.Namespace, framework.DashboardServiceName) - k8sservice.Spec = oldSpec - newServiceYaml, err = yaml.Marshal(k8sservice) - Expect(err).NotTo(HaveOccurred(), "marshalling service") - err = s.CreateResourceFromString(string(newServiceYaml)) - Expect(err).NotTo(HaveOccurred(), "creating service") + By("update service to dashboard") + err = s.CreateResourceFromString(fmt.Sprintf(serviceSpec, "api7ee3-dashboard.api7-ee-e2e.svc.cluster.local")) + Expect(err).NotTo(HaveOccurred(), "updating Service") By("check ApisixRoute status after scaling up") s.RetryAssertion(func() string { diff --git a/test/e2e/framework/api7_consts.go b/test/e2e/framework/api7_consts.go index 3b424d880..e18116e61 100644 --- a/test/e2e/framework/api7_consts.go +++ b/test/e2e/framework/api7_consts.go @@ -36,18 +36,12 @@ const ( DashboardEndpoint = "http://api7ee3-dashboard.api7-ee-e2e:7080" DashboardTLSEndpoint = "https://api7ee3-dashboard.api7-ee-e2e:7443" DPManagerTLSEndpoint = "https://api7ee3-dp-manager.api7-ee-e2e:7943" - - DashboardServiceName = "api7ee3-dashboard" ) const ( ProviderTypeAPI7EE = "api7ee" ) -const ( - Namespace = "api7-ee-e2e" -) - var ( IngressVersion = cmp.Or(os.Getenv("INGRESS_VERSION"), "v1") ) diff --git a/test/e2e/scaffold/api7_deployer.go b/test/e2e/scaffold/api7_deployer.go index 45faf073a..6ffaf33f5 100644 --- a/test/e2e/scaffold/api7_deployer.go +++ b/test/e2e/scaffold/api7_deployer.go @@ -193,20 +193,22 @@ func (s *API7Deployer) DeployIngress() { } s.Framework.DeployIngress(framework.IngressDeployOpts{ - ProviderType: "api7ee", - ControllerName: s.runtimeOpts.ControllerName, - Namespace: s.namespace, - Replicas: ptr.To(1), - WebhookEnable: s.runtimeOpts.EnableWebhook, + ProviderType: "api7ee", + ControllerName: s.runtimeOpts.ControllerName, + ProviderSyncPeriod: 1 * time.Hour, + Namespace: s.namespace, + Replicas: ptr.To(1), + WebhookEnable: s.runtimeOpts.EnableWebhook, }) } func (s *API7Deployer) ScaleIngress(replicas int) { s.Framework.DeployIngress(framework.IngressDeployOpts{ - ProviderType: "api7ee", - ControllerName: s.runtimeOpts.ControllerName, - Namespace: s.namespace, - Replicas: ptr.To(replicas), + ProviderType: "api7ee", + ControllerName: s.runtimeOpts.ControllerName, + ProviderSyncPeriod: 1 * time.Hour, + Namespace: s.namespace, + Replicas: ptr.To(replicas), }) } diff --git a/test/e2e/scaffold/k8s.go b/test/e2e/scaffold/k8s.go index 4db6687c5..a3547b61a 100644 --- a/test/e2e/scaffold/k8s.go +++ b/test/e2e/scaffold/k8s.go @@ -25,7 +25,6 @@ import ( "fmt" "os" "os/exec" - "reflect" "strings" "time" @@ -103,17 +102,6 @@ func (s *Scaffold) GetOutputFromString(shell ...string) (string, error) { return output, err } -func (s *Scaffold) GetOutputFromStringWithNamespace(ns string, shell ...string) (string, error) { - cmdArgs := []string{} - cmdArgs = append(cmdArgs, "get") - cmdArgs = append(cmdArgs, shell...) - var newOpts k8s.KubectlOptions - reflect.Copy(reflect.ValueOf(newOpts), reflect.ValueOf(*s.kubectlOptions)) - newOpts.Namespace = ns - output, err := k8s.RunKubectlAndGetOutputE(GinkgoT(), &newOpts, cmdArgs...) - return output, err -} - func (s *Scaffold) GetResourceYamlFromNamespace(resourceType, resourceName, namespace string) (string, error) { return s.GetOutputFromString(resourceType, resourceName, "-n", namespace, "-o", "yaml") } @@ -133,11 +121,6 @@ func (s *Scaffold) GetServiceByName(name string) (*corev1.Service, error) { return k8s.GetServiceE(s.t, s.kubectlOptions, name) } -func (s *Scaffold) GetService(namespace, name string) (*corev1.Service, error) { - kubectlOptions := k8s.NewKubectlOptions("", "", namespace) - return k8s.GetServiceE(s.t, kubectlOptions, name) -} - // ListPodsByLabels lists all pods which matching the label selector. func (s *Scaffold) ListPodsByLabels(labels string) ([]corev1.Pod, error) { return k8s.ListPodsE(s.t, s.kubectlOptions, metav1.ListOptions{