From 73fa5ef2939b008f51b9a9b17603a35be7057fe6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=82=9F=E7=A9=BA?= Date: Wed, 25 Jun 2025 10:31:00 +0800 Subject: [PATCH 01/13] feat: add support for "apisix" provider_type --- .github/workflows/apisix-conformance-test.yml | 7 +++++ .github/workflows/apisix-e2e-test.yml | 6 ++++ config/rbac/gatewayproxy_editor_role.yaml | 31 ------------------- config/rbac/gatewayproxy_viewer_role.yaml | 27 ---------------- config/rbac/role.yaml | 9 ++++++ internal/controller/config/config.go | 2 +- internal/controller/config/types.go | 1 + internal/manager/controllers.go | 2 ++ internal/provider/adc/adc.go | 21 ++++++++++--- test/conformance/apisix/suite_test.go | 3 +- test/e2e/scaffold/apisix_deployer.go | 7 +++-- 11 files changed, 49 insertions(+), 67 deletions(-) delete mode 100644 config/rbac/gatewayproxy_editor_role.yaml delete mode 100644 config/rbac/gatewayproxy_viewer_role.yaml diff --git a/.github/workflows/apisix-conformance-test.yml b/.github/workflows/apisix-conformance-test.yml index fd90266e7..708511924 100644 --- a/.github/workflows/apisix-conformance-test.yml +++ b/.github/workflows/apisix-conformance-test.yml @@ -36,6 +36,11 @@ jobs: timeout-minutes: 60 needs: - prepare + strategy: + matrix: + provider_type: + - apisix-standalone + - apisix runs-on: buildjet-2vcpu-ubuntu-2204 steps: - name: Checkout @@ -79,6 +84,8 @@ jobs: - name: Run Conformance Test shell: bash continue-on-error: true + env: + PROVIDER_TYPE: ${{ matrix.provider_type }} run: | make conformance-test-standalone diff --git a/.github/workflows/apisix-e2e-test.yml b/.github/workflows/apisix-e2e-test.yml index 05a4582b1..a299ada93 100644 --- a/.github/workflows/apisix-e2e-test.yml +++ b/.github/workflows/apisix-e2e-test.yml @@ -35,6 +35,11 @@ jobs: e2e-test: needs: - prepare + strategy: + matrix: + provider_type: + - apisix-standalone + - apisix runs-on: buildjet-2vcpu-ubuntu-2204 steps: - name: Checkout @@ -83,5 +88,6 @@ jobs: shell: bash env: TEST_DIR: "./test/e2e/apisix/" + PROVIDER_TYPE: ${{ matrix.provider_type }} run: | make e2e-test diff --git a/config/rbac/gatewayproxy_editor_role.yaml b/config/rbac/gatewayproxy_editor_role.yaml deleted file mode 100644 index 7ea08d91a..000000000 --- a/config/rbac/gatewayproxy_editor_role.yaml +++ /dev/null @@ -1,31 +0,0 @@ -# permissions for end users to edit gatewayproxies. -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - labels: - app.kubernetes.io/name: clusterrole - app.kubernetes.io/instance: gatewayproxy-editor-role - app.kubernetes.io/component: rbac - app.kubernetes.io/created-by: apisix-ingress-controller - app.kubernetes.io/part-of: apisix-ingress-controller - app.kubernetes.io/managed-by: kustomize - name: gatewayproxy-editor-role -rules: -- apiGroups: - - apisix.apache.org - resources: - - gatewayproxies - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - apisix.apache.org - resources: - - gatewayproxies/status - verbs: - - get diff --git a/config/rbac/gatewayproxy_viewer_role.yaml b/config/rbac/gatewayproxy_viewer_role.yaml deleted file mode 100644 index 75ae42552..000000000 --- a/config/rbac/gatewayproxy_viewer_role.yaml +++ /dev/null @@ -1,27 +0,0 @@ -# permissions for end users to view gatewayproxies. -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - labels: - app.kubernetes.io/name: clusterrole - app.kubernetes.io/instance: gatewayproxy-viewer-role - app.kubernetes.io/component: rbac - app.kubernetes.io/created-by: apisix-ingress-controller - app.kubernetes.io/part-of: apisix-ingress-controller - app.kubernetes.io/managed-by: kustomize - name: gatewayproxy-viewer-role -rules: -- apiGroups: - - apisix.apache.org - resources: - - gatewayproxies - verbs: - - get - - list - - watch -- apiGroups: - - apisix.apache.org - resources: - - gatewayproxies/status - verbs: - - get diff --git a/config/rbac/role.yaml b/config/rbac/role.yaml index 516b74bec..c9dc78391 100644 --- a/config/rbac/role.yaml +++ b/config/rbac/role.yaml @@ -91,6 +91,7 @@ rules: - gatewayclasses/status - gateways/status - httproutes/status + - referencegrants/status verbs: - get - update @@ -102,6 +103,14 @@ rules: - get - list - watch +- apiGroups: + - gateway.networking.k8s.io + resources: + - referencegrants + verbs: + - list + - update + - watch - apiGroups: - networking.k8s.io resources: diff --git a/internal/controller/config/config.go b/internal/controller/config/config.go index ae9845e55..0e8f64c75 100644 --- a/internal/controller/config/config.go +++ b/internal/controller/config/config.go @@ -118,7 +118,7 @@ func validateProvider(config ProviderConfig) error { return fmt.Errorf("sync_period must be greater than 0 for standalone provider") } return nil - case ProviderTypeAPI7EE: + case ProviderTypeAPI7EE, ProviderTypeAPISIX: return nil default: return fmt.Errorf("unsupported provider type: %s", config.Type) diff --git a/internal/controller/config/types.go b/internal/controller/config/types.go index af4cfa190..207babb46 100644 --- a/internal/controller/config/types.go +++ b/internal/controller/config/types.go @@ -21,6 +21,7 @@ type ProviderType string const ( ProviderTypeStandalone ProviderType = "apisix-standalone" ProviderTypeAPI7EE ProviderType = "api7ee" + ProviderTypeAPISIX ProviderType = "apisix" ) const ( diff --git a/internal/manager/controllers.go b/internal/manager/controllers.go index f651d957f..5ece9d66d 100644 --- a/internal/manager/controllers.go +++ b/internal/manager/controllers.go @@ -66,6 +66,8 @@ import ( // +kubebuilder:rbac:groups=gateway.networking.k8s.io,resources=gateways/status,verbs=get;update // +kubebuilder:rbac:groups=gateway.networking.k8s.io,resources=httproutes,verbs=get;list;watch // +kubebuilder:rbac:groups=gateway.networking.k8s.io,resources=httproutes/status,verbs=get;update +// +kubebuilder:rbac:groups=gateway.networking.k8s.io,resources=referencegrants,verbs=list;watch;update +// +kubebuilder:rbac:groups=gateway.networking.k8s.io,resources=referencegrants/status,verbs=get;update // Networking // +kubebuilder:rbac:groups=networking.k8s.io,resources=ingresses,verbs=get;list;watch;update diff --git a/internal/provider/adc/adc.go b/internal/provider/adc/adc.go index 463202bd2..a3fad7436 100644 --- a/internal/provider/adc/adc.go +++ b/internal/provider/adc/adc.go @@ -15,12 +15,12 @@ package adc import ( "context" "encoding/json" - "errors" "os" "sync" "time" "github.com/api7/gopkg/pkg/log" + "github.com/pkg/errors" "go.uber.org/zap" networkingv1 "k8s.io/api/networking/v1" "sigs.k8s.io/controller-runtime/pkg/client" @@ -48,6 +48,7 @@ type BackendMode string const ( BackendModeAPISIXStandalone string = "apisix-standalone" BackendModeAPI7EE string = "api7ee" + BackendModeAPISIX string = "apisix" ) type adcClient struct { @@ -185,11 +186,21 @@ func (d *adcClient) Update(ctx context.Context, tctx *provider.TranslateContext, } } - // This mode is full synchronization, - // which only needs to be saved in cache - // and triggered by a timer for synchronization - if d.BackendMode == BackendModeAPISIXStandalone || apiv2.Is(obj) { + switch d.BackendMode { + case BackendModeAPISIXStandalone: + // This mode is full synchronization, + // which only needs to be saved in cache + // and triggered by a timer for synchronization return nil + case BackendModeAPISIX: + // sync by apisix admin api + case BackendModeAPI7EE: + // apiv2 is not support on api7ee mode + if apiv2.Is(obj) { + return nil + } + default: + return errors.Errorf("unknown backend mode: %s", d.BackendMode) } return d.sync(ctx, Task{ diff --git a/test/conformance/apisix/suite_test.go b/test/conformance/apisix/suite_test.go index 12fd57522..5e28e4d4b 100644 --- a/test/conformance/apisix/suite_test.go +++ b/test/conformance/apisix/suite_test.go @@ -12,6 +12,7 @@ package conformance import ( + "cmp" "context" "fmt" "os" @@ -160,7 +161,7 @@ func TestMain(m *testing.M) { Namespace: namespace, StatusAddress: address, InitSyncDelay: 1 * time.Minute, - ProviderType: "apisix-standalone", + ProviderType: cmp.Or(os.Getenv("PROVIDER_TYPE"), "apisix-standalone"), ProviderSyncPeriod: 10 * time.Millisecond, }) diff --git a/test/e2e/scaffold/apisix_deployer.go b/test/e2e/scaffold/apisix_deployer.go index 8d53c8362..537e4d9dd 100644 --- a/test/e2e/scaffold/apisix_deployer.go +++ b/test/e2e/scaffold/apisix_deployer.go @@ -14,6 +14,7 @@ package scaffold import ( "bytes" + "cmp" "fmt" "os" "time" @@ -218,8 +219,9 @@ func (s *APISIXDeployer) deployDataplane(opts *APISIXDeployOptions) *corev1.Serv func (s *APISIXDeployer) DeployIngress() { s.Framework.DeployIngress(framework.IngressDeployOpts{ - ProviderSyncPeriod: 200 * time.Millisecond, ControllerName: s.opts.ControllerName, + ProviderType: cmp.Or(os.Getenv("PROVIDER_TYPE"), "apisix-standalone"), + ProviderSyncPeriod: 200 * time.Millisecond, Namespace: s.namespace, Replicas: 1, }) @@ -227,8 +229,9 @@ func (s *APISIXDeployer) DeployIngress() { func (s *APISIXDeployer) ScaleIngress(replicas int) { s.Framework.DeployIngress(framework.IngressDeployOpts{ - ProviderSyncPeriod: 200 * time.Millisecond, ControllerName: s.opts.ControllerName, + ProviderType: cmp.Or(os.Getenv("PROVIDER_TYPE"), "apisix-standalone"), + ProviderSyncPeriod: 200 * time.Millisecond, Namespace: s.namespace, Replicas: replicas, }) From a840f9251270fb961f6cc92cb899e29f510e5453 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=82=9F=E7=A9=BA?= Date: Wed, 25 Jun 2025 12:59:17 +0800 Subject: [PATCH 02/13] feat: enhance provider_type support with etcd integration - Introduced `EnvKeyProviderType` constant for environment variable reference. - Added support for dynamically configuring `config_provider` based on provider type. - Enabled etcd deployment for `apisix` provider type in E2E tests. - Embedded `etcd` manifests for streamlined test setup. --- internal/provider/adc/adc.go | 18 ++------ internal/provider/adc/executor.go | 10 +++-- test/conformance/apisix/suite_test.go | 2 +- test/e2e/framework/apisix_consts.go | 7 ++++ .../manifests/apisix-standalone.yaml | 9 +++- test/e2e/framework/manifests/etcd.yaml | 41 +++++++++++++++++++ test/e2e/scaffold/apisix_deployer.go | 21 ++++++++-- 7 files changed, 86 insertions(+), 22 deletions(-) create mode 100644 test/e2e/framework/manifests/etcd.yaml diff --git a/internal/provider/adc/adc.go b/internal/provider/adc/adc.go index a3fad7436..dcb8780fd 100644 --- a/internal/provider/adc/adc.go +++ b/internal/provider/adc/adc.go @@ -186,21 +186,11 @@ func (d *adcClient) Update(ctx context.Context, tctx *provider.TranslateContext, } } - switch d.BackendMode { - case BackendModeAPISIXStandalone: - // This mode is full synchronization, - // which only needs to be saved in cache - // and triggered by a timer for synchronization + // This mode is full synchronization, + // which only needs to be saved in cache + // and triggered by a timer for synchronization + if d.BackendMode == BackendModeAPISIXStandalone || d.BackendMode == BackendModeAPISIX || apiv2.Is(obj) { return nil - case BackendModeAPISIX: - // sync by apisix admin api - case BackendModeAPI7EE: - // apiv2 is not support on api7ee mode - if apiv2.Is(obj) { - return nil - } - default: - return errors.Errorf("unknown backend mode: %s", d.BackendMode) } return d.sync(ctx, Task{ diff --git a/internal/provider/adc/executor.go b/internal/provider/adc/executor.go index bf6f2a033..70715ab63 100644 --- a/internal/provider/adc/executor.go +++ b/internal/provider/adc/executor.go @@ -46,15 +46,19 @@ func (e *DefaultADCExecutor) Execute(ctx context.Context, mode string, config ad func (e *DefaultADCExecutor) runADC(ctx context.Context, mode string, config adcConfig, args []string) error { for _, addr := range config.ServerAddrs { - ctxWithTimeout, cancel := context.WithTimeout(ctx, 15*time.Second) - defer cancel() - if err := e.runForSingleServer(ctxWithTimeout, addr, mode, config, args); err != nil { + if err := e.runForSingleServerWithTimeout(ctx, addr, mode, config, args); err != nil { return err } } return nil } +func (e *DefaultADCExecutor) runForSingleServerWithTimeout(ctx context.Context, serverAddr, mode string, config adcConfig, args []string) error { + ctx, cancel := context.WithTimeout(ctx, 15*time.Second) + defer cancel() + return e.runForSingleServer(ctx, serverAddr, mode, config, args) +} + func (e *DefaultADCExecutor) runForSingleServer(ctx context.Context, serverAddr, mode string, config adcConfig, args []string) error { cmdArgs := append([]string{}, args...) if !config.TlsVerify { diff --git a/test/conformance/apisix/suite_test.go b/test/conformance/apisix/suite_test.go index 5e28e4d4b..6652cab6e 100644 --- a/test/conformance/apisix/suite_test.go +++ b/test/conformance/apisix/suite_test.go @@ -161,7 +161,7 @@ func TestMain(m *testing.M) { Namespace: namespace, StatusAddress: address, InitSyncDelay: 1 * time.Minute, - ProviderType: cmp.Or(os.Getenv("PROVIDER_TYPE"), "apisix-standalone"), + ProviderType: cmp.Or(os.Getenv(framework.EnvKeyProviderType), "apisix-standalone"), ProviderSyncPeriod: 10 * time.Millisecond, }) diff --git a/test/e2e/framework/apisix_consts.go b/test/e2e/framework/apisix_consts.go index 1f733ffc3..0f4b1af8c 100644 --- a/test/e2e/framework/apisix_consts.go +++ b/test/e2e/framework/apisix_consts.go @@ -19,10 +19,17 @@ import ( "github.com/Masterminds/sprig/v3" ) +const ( + EnvKeyProviderType = "PROVIDER_TYPE" +) + var ( //go:embed manifests/apisix-standalone.yaml apisixStandaloneTemplate string APISIXStandaloneTpl *template.Template + + //go:embed manifests/etcd.yaml + EtcdSpec string ) var ( diff --git a/test/e2e/framework/manifests/apisix-standalone.yaml b/test/e2e/framework/manifests/apisix-standalone.yaml index 912aa8325..8f63cb003 100644 --- a/test/e2e/framework/manifests/apisix-standalone.yaml +++ b/test/e2e/framework/manifests/apisix-standalone.yaml @@ -7,7 +7,9 @@ data: deployment: role: traditional role_traditional: - config_provider: yaml + # on backend mode apisix-standalone, config_provider is "yaml" + # on backend mode apisix, config_provider is "etcd" + config_provider: {{ .ConfigProvider | default "yaml" }} admin: allow_admin: - 0.0.0.0/0 @@ -15,6 +17,11 @@ data: - key: {{ .AdminKey }} name: admin role: admin + {{- if eq .ConfigProvider "etcd" }} + etcd: + host: + - "http://etcd:2379" + {{- end }} nginx_config: worker_processes: 2 error_log_level: info diff --git a/test/e2e/framework/manifests/etcd.yaml b/test/e2e/framework/manifests/etcd.yaml new file mode 100644 index 000000000..13a6f8e5b --- /dev/null +++ b/test/e2e/framework/manifests/etcd.yaml @@ -0,0 +1,41 @@ +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: etcd +spec: + replicas: 1 + selector: + matchLabels: + app: etcd + template: + metadata: + labels: + app: etcd + spec: + containers: + - name: etcd + image: quay.io/coreos/etcd:v3.5.0 + command: + - etcd + - --data-dir=/etcd-data + - --name=node1 + - --initial-advertise-peer-urls=http://0.0.0.0:2380 + - --listen-peer-urls=http://0.0.0.0:2380 + - --advertise-client-urls=http://0.0.0.0:2379 + - --listen-client-urls=http://0.0.0.0:2379 + - --initial-cluster=node1=http://0.0.0.0:2380 + ports: + - containerPort: 2379 + - containerPort: 2380 +--- +apiVersion: v1 +kind: Service +metadata: + name: etcd +spec: + ports: + - port: 2379 + targetPort: 2379 + selector: + app: etcd \ No newline at end of file diff --git a/test/e2e/scaffold/apisix_deployer.go b/test/e2e/scaffold/apisix_deployer.go index 537e4d9dd..2292f311b 100644 --- a/test/e2e/scaffold/apisix_deployer.go +++ b/test/e2e/scaffold/apisix_deployer.go @@ -25,6 +25,7 @@ import ( corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "github.com/apache/apisix-ingress-controller/internal/provider/adc" "github.com/apache/apisix-ingress-controller/pkg/utils" "github.com/apache/apisix-ingress-controller/test/e2e/framework" ) @@ -37,6 +38,8 @@ type APISIXDeployOptions struct { ServiceType string ServiceHTTPPort int ServiceHTTPSPort int + + ConfigProvider string } type APISIXDeployer struct { @@ -187,12 +190,24 @@ func (s *APISIXDeployer) deployDataplane(opts *APISIXDeployOptions) *corev1.Serv if opts.ServiceHTTPSPort == 0 { opts.ServiceHTTPSPort = 443 } + opts.ConfigProvider = "yaml" + + kubectlOpts := k8s.NewKubectlOptions("", "", opts.Namespace) + + if os.Getenv(framework.EnvKeyProviderType) == adc.BackendModeAPISIX { + // deploy etcd + opts.ConfigProvider = "etcd" + k8s.KubectlApplyFromString(s.GinkgoT, kubectlOpts, framework.EtcdSpec) + err := framework.WaitPodsAvailable(s.GinkgoT, kubectlOpts, metav1.ListOptions{ + LabelSelector: "app=etcd", + }) + Expect(err).ToNot(HaveOccurred(), "waiting for etcd pod ready") + } buf := bytes.NewBuffer(nil) err := framework.APISIXStandaloneTpl.Execute(buf, opts) Expect(err).ToNot(HaveOccurred(), "executing template") - kubectlOpts := k8s.NewKubectlOptions("", "", opts.Namespace) k8s.KubectlApplyFromString(s.GinkgoT, kubectlOpts, buf.String()) err = framework.WaitPodsAvailable(s.GinkgoT, kubectlOpts, metav1.ListOptions{ @@ -220,7 +235,7 @@ func (s *APISIXDeployer) deployDataplane(opts *APISIXDeployOptions) *corev1.Serv func (s *APISIXDeployer) DeployIngress() { s.Framework.DeployIngress(framework.IngressDeployOpts{ ControllerName: s.opts.ControllerName, - ProviderType: cmp.Or(os.Getenv("PROVIDER_TYPE"), "apisix-standalone"), + ProviderType: cmp.Or(os.Getenv(framework.EnvKeyProviderType), "apisix-standalone"), ProviderSyncPeriod: 200 * time.Millisecond, Namespace: s.namespace, Replicas: 1, @@ -230,7 +245,7 @@ func (s *APISIXDeployer) DeployIngress() { func (s *APISIXDeployer) ScaleIngress(replicas int) { s.Framework.DeployIngress(framework.IngressDeployOpts{ ControllerName: s.opts.ControllerName, - ProviderType: cmp.Or(os.Getenv("PROVIDER_TYPE"), "apisix-standalone"), + ProviderType: cmp.Or(os.Getenv(framework.EnvKeyProviderType), "apisix-standalone"), ProviderSyncPeriod: 200 * time.Millisecond, Namespace: s.namespace, Replicas: replicas, From c1f257d20c5b2c7959cf341fe3ed16f47c424be6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=82=9F=E7=A9=BA?= Date: Wed, 25 Jun 2025 13:37:46 +0800 Subject: [PATCH 03/13] feat: extend ADC environment configuration for provider type - Allow dynamic configuration of ADC_BACKEND via `EnvKeyProviderType`. --- test/e2e/scaffold/adc.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/test/e2e/scaffold/adc.go b/test/e2e/scaffold/adc.go index aab8b50a1..0abcbdf10 100644 --- a/test/e2e/scaffold/adc.go +++ b/test/e2e/scaffold/adc.go @@ -26,6 +26,7 @@ import ( adctypes "github.com/apache/apisix-ingress-controller/api/adc" "github.com/apache/apisix-ingress-controller/internal/provider/adc/translator" + "github.com/apache/apisix-ingress-controller/test/e2e/framework" ) // DataplaneResource defines the interface for accessing dataplane resources @@ -131,6 +132,9 @@ func (a *adcDataplaneResource) dumpResources(ctx context.Context) (*translator.T "ADC_SERVER=" + a.serverAddr, "ADC_TOKEN=" + a.token, } + if providerType := os.Getenv(framework.EnvKeyProviderType); providerType != "" { + adcEnv = append(adcEnv, "ADC_BACKEND="+providerType) + } var stdout, stderr bytes.Buffer cmd := exec.CommandContext(ctxWithTimeout, "adc", args...) From 68e56be97ed72dca7f855e157f13b39723491e3d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=82=9F=E7=A9=BA?= Date: Wed, 25 Jun 2025 14:40:32 +0800 Subject: [PATCH 04/13] feat: add E2E test case labeling and enhance test framework - Introduced Ginkgo labels for categorizing E2E test cases based on apisix resource type and networking components. - Updated Makefile and GitHub Actions workflow to include label-based test execution. - Improved ADC output handling and extended backend mode validation logic. --- .github/workflows/apisix-e2e-test.yml | 4 ++++ Makefile | 2 +- internal/provider/adc/adc.go | 12 +++++++++++- internal/provider/adc/executor.go | 4 ++++ test/e2e/apisix/basic.go | 2 +- test/e2e/apisix/consumer.go | 2 +- test/e2e/apisix/globalrule.go | 2 +- test/e2e/apisix/pluginconfig.go | 2 +- test/e2e/apisix/route.go | 2 +- test/e2e/apisix/tls.go | 2 +- test/e2e/crds/backendtrafficpolicy.go | 2 +- test/e2e/crds/consumer.go | 2 +- test/e2e/framework/assertion.go | 2 +- test/e2e/gatewayapi/controller.go | 2 +- test/e2e/gatewayapi/gateway.go | 2 +- test/e2e/gatewayapi/gatewayclass.go | 2 +- test/e2e/gatewayapi/gatewayproxy.go | 2 +- test/e2e/gatewayapi/httproute.go | 2 +- test/e2e/ingress/ingress.go | 2 +- test/e2e/scaffold/apisix_deployer.go | 3 ++- 20 files changed, 37 insertions(+), 18 deletions(-) diff --git a/.github/workflows/apisix-e2e-test.yml b/.github/workflows/apisix-e2e-test.yml index a299ada93..51f74f89b 100644 --- a/.github/workflows/apisix-e2e-test.yml +++ b/.github/workflows/apisix-e2e-test.yml @@ -40,6 +40,9 @@ jobs: provider_type: - apisix-standalone - apisix + cases_subset: + - apisix + - networking runs-on: buildjet-2vcpu-ubuntu-2204 steps: - name: Checkout @@ -89,5 +92,6 @@ jobs: env: TEST_DIR: "./test/e2e/apisix/" PROVIDER_TYPE: ${{ matrix.provider_type }} + TEST_LABEL: ${{ matrix.cases_subset }} run: | make e2e-test diff --git a/Makefile b/Makefile index 3349e2107..ee1974877 100644 --- a/Makefile +++ b/Makefile @@ -111,7 +111,7 @@ kind-e2e-test: kind-up build-image kind-load-images e2e-test .PHONY: e2e-test e2e-test: @kind get kubeconfig --name $(KIND_NAME) > $$KUBECONFIG - DASHBOARD_VERSION=$(DASHBOARD_VERSION) go test $(TEST_DIR) -test.timeout=$(TEST_TIMEOUT) -v -ginkgo.v -ginkgo.focus="$(TEST_FOCUS)" + DASHBOARD_VERSION=$(DASHBOARD_VERSION) go test $(TEST_DIR) -test.timeout=$(TEST_TIMEOUT) -v -ginkgo.v -ginkgo.focus="$(TEST_FOCUS)" -ginkgo.label-filter="$(TEST_LABEL)" .PHONY: download-api7ee3-chart download-api7ee3-chart: diff --git a/internal/provider/adc/adc.go b/internal/provider/adc/adc.go index dcb8780fd..7d079e013 100644 --- a/internal/provider/adc/adc.go +++ b/internal/provider/adc/adc.go @@ -189,8 +189,18 @@ func (d *adcClient) Update(ctx context.Context, tctx *provider.TranslateContext, // This mode is full synchronization, // which only needs to be saved in cache // and triggered by a timer for synchronization - if d.BackendMode == BackendModeAPISIXStandalone || d.BackendMode == BackendModeAPISIX || apiv2.Is(obj) { + switch d.BackendMode { + case BackendModeAPI7EE: + if apiv2.Is(obj) { + return nil + } + case BackendModeAPISIX: + // do nothing + case BackendModeAPISIXStandalone: return nil + default: + return errors.Errorf("unknown backend mode: %s", d.BackendMode) + } return d.sync(ctx, Task{ diff --git a/internal/provider/adc/executor.go b/internal/provider/adc/executor.go index 70715ab63..eb9d2b747 100644 --- a/internal/provider/adc/executor.go +++ b/internal/provider/adc/executor.go @@ -112,6 +112,10 @@ func (e *DefaultADCExecutor) buildCmdError(runErr error, stdout, stderr []byte) func (e *DefaultADCExecutor) handleOutput(output []byte) error { var result adctypes.SyncResult + if index := strings.IndexByte(string(output), '{'); index > 0 { + log.Warnf("extra output: %s", string(output[:index])) + output = output[index:] + } if err := json.Unmarshal(output, &result); err != nil { log.Errorw("failed to unmarshal adc output", zap.Error(err), diff --git a/test/e2e/apisix/basic.go b/test/e2e/apisix/basic.go index 7231aa3e6..f151084fa 100644 --- a/test/e2e/apisix/basic.go +++ b/test/e2e/apisix/basic.go @@ -19,7 +19,7 @@ import ( "github.com/apache/apisix-ingress-controller/test/e2e/scaffold" ) -var _ = Describe("APISIX Standalone Basic Tests", func() { +var _ = Describe("APISIX Standalone Basic Tests", Label("apisix", "v2", "basic"), func() { s := scaffold.NewScaffold(&scaffold.Options{ ControllerName: "apisix.apache.org/apisix-ingress-controller", }) diff --git a/test/e2e/apisix/consumer.go b/test/e2e/apisix/consumer.go index e750da9d4..e5000146d 100644 --- a/test/e2e/apisix/consumer.go +++ b/test/e2e/apisix/consumer.go @@ -28,7 +28,7 @@ import ( type Headers map[string]string -var _ = Describe("Test ApisixConsumer", func() { +var _ = Describe("Test ApisixConsumer", Label("apisix", "v2", "apisixconsumer"), func() { var ( s = scaffold.NewScaffold(&scaffold.Options{ ControllerName: "apisix.apache.org/apisix-ingress-controller", diff --git a/test/e2e/apisix/globalrule.go b/test/e2e/apisix/globalrule.go index ceac7038f..c01c48586 100644 --- a/test/e2e/apisix/globalrule.go +++ b/test/e2e/apisix/globalrule.go @@ -56,7 +56,7 @@ spec: scope: "Namespace" ` -var _ = Describe("Test GlobalRule", func() { +var _ = Describe("Test GlobalRule", Label("apisix", "v2", "apisixglobalrule"), func() { s := scaffold.NewScaffold(&scaffold.Options{ ControllerName: "apisix.apache.org/apisix-ingress-controller", }) diff --git a/test/e2e/apisix/pluginconfig.go b/test/e2e/apisix/pluginconfig.go index 1dda08a68..8ffcb7303 100644 --- a/test/e2e/apisix/pluginconfig.go +++ b/test/e2e/apisix/pluginconfig.go @@ -59,7 +59,7 @@ spec: scope: "Namespace" ` -var _ = Describe("Test ApisixPluginConfig", func() { +var _ = Describe("Test ApisixPluginConfig", Label("apisix", "v2", "apisixpluginconfig"), func() { var ( s = scaffold.NewScaffold(&scaffold.Options{ ControllerName: "apisix.apache.org/apisix-ingress-controller", diff --git a/test/e2e/apisix/route.go b/test/e2e/apisix/route.go index 3e24082c7..95216fe27 100644 --- a/test/e2e/apisix/route.go +++ b/test/e2e/apisix/route.go @@ -27,7 +27,7 @@ import ( "github.com/apache/apisix-ingress-controller/test/e2e/scaffold" ) -var _ = Describe("Test ApisixRoute", func() { +var _ = Describe("Test ApisixRoute", Label("apisix", "v2", "apisixroute"), func() { var ( s = scaffold.NewScaffold(&scaffold.Options{ ControllerName: "apisix.apache.org/apisix-ingress-controller", diff --git a/test/e2e/apisix/tls.go b/test/e2e/apisix/tls.go index 4fb950dfa..c080ab2dd 100644 --- a/test/e2e/apisix/tls.go +++ b/test/e2e/apisix/tls.go @@ -85,7 +85,7 @@ var Cert = strings.TrimSpace(framework.TestServerCert) var Key = strings.TrimSpace(framework.TestServerKey) -var _ = Describe("Test ApisixTls", func() { +var _ = Describe("Test ApisixTls", Label("apisix", "v2", "apisixtls"), func() { var ( s = scaffold.NewScaffold(&scaffold.Options{ ControllerName: "apisix.apache.org/apisix-ingress-controller", diff --git a/test/e2e/crds/backendtrafficpolicy.go b/test/e2e/crds/backendtrafficpolicy.go index 4d81caaab..e7d4d768c 100644 --- a/test/e2e/crds/backendtrafficpolicy.go +++ b/test/e2e/crds/backendtrafficpolicy.go @@ -22,7 +22,7 @@ import ( "github.com/apache/apisix-ingress-controller/test/e2e/scaffold" ) -var _ = Describe("Test BackendTrafficPolicy base on HTTPRoute", func() { +var _ = Describe("Test BackendTrafficPolicy base on HTTPRoute", Label("apisix", "v1alpha1", "backendtrafficpolicy"), func() { s := scaffold.NewDefaultScaffold() var defaultGatewayProxy = ` diff --git a/test/e2e/crds/consumer.go b/test/e2e/crds/consumer.go index ae060e3fb..4a8b83748 100644 --- a/test/e2e/crds/consumer.go +++ b/test/e2e/crds/consumer.go @@ -23,7 +23,7 @@ import ( "github.com/apache/apisix-ingress-controller/test/e2e/scaffold" ) -var _ = Describe("Test Consumer", func() { +var _ = Describe("Test Consumer", Label("apisix", "v1alpha1", "consumer"), func() { s := scaffold.NewDefaultScaffold() var defaultGatewayProxy = ` diff --git a/test/e2e/framework/assertion.go b/test/e2e/framework/assertion.go index 851997b7b..52d6ac286 100644 --- a/test/e2e/framework/assertion.go +++ b/test/e2e/framework/assertion.go @@ -111,7 +111,7 @@ func APIv2MustHaveCondition(t testing.TestingT, cli client.Client, timeout time. } err := PollUntilAPIv2MustHaveStatus(cli, timeout, nn, obj, f) - require.NoError(t, err, "error waiting status to have a Condition matching %+v", nn, cond) + require.NoError(t, err, "error waiting %s status to have a Condition matching %+v", nn, cond) } func PollUntilAPIv2MustHaveStatus(cli client.Client, timeout time.Duration, nn types.NamespacedName, obj client.Object, f func(client.Object) bool) error { diff --git a/test/e2e/gatewayapi/controller.go b/test/e2e/gatewayapi/controller.go index 6776e71b9..c279e8d8f 100644 --- a/test/e2e/gatewayapi/controller.go +++ b/test/e2e/gatewayapi/controller.go @@ -23,7 +23,7 @@ import ( "github.com/apache/apisix-ingress-controller/test/e2e/scaffold" ) -var _ = Describe("Check if controller cache gets synced with correct resources", func() { +var _ = Describe("Check if controller cache gets synced with correct resources", Label("networking", "basic"), func() { var gatewayProxyYaml = ` apiVersion: apisix.apache.org/v1alpha1 diff --git a/test/e2e/gatewayapi/gateway.go b/test/e2e/gatewayapi/gateway.go index 355b3d79e..131dedca5 100644 --- a/test/e2e/gatewayapi/gateway.go +++ b/test/e2e/gatewayapi/gateway.go @@ -37,7 +37,7 @@ func createSecret(s *scaffold.Scaffold, secretName string) { assert.Nil(GinkgoT(), err, "create secret error") } -var _ = Describe("Test Gateway", func() { +var _ = Describe("Test Gateway", Label("networking", "gateway"), func() { s := scaffold.NewScaffold(&scaffold.Options{ ControllerName: "apisix.apache.org/apisix-ingress-controller", }) diff --git a/test/e2e/gatewayapi/gatewayclass.go b/test/e2e/gatewayapi/gatewayclass.go index 803fb0fa8..737b24e9f 100644 --- a/test/e2e/gatewayapi/gatewayclass.go +++ b/test/e2e/gatewayapi/gatewayclass.go @@ -21,7 +21,7 @@ import ( "github.com/apache/apisix-ingress-controller/test/e2e/scaffold" ) -var _ = Describe("Test GatewayClass", func() { +var _ = Describe("Test GatewayClass", Label("networking", "gatewayclass"), func() { s := scaffold.NewScaffold(&scaffold.Options{ ControllerName: "apisix.apache.org/apisix-ingress-controller", }) diff --git a/test/e2e/gatewayapi/gatewayproxy.go b/test/e2e/gatewayapi/gatewayproxy.go index 05972dbf1..805ea8caf 100644 --- a/test/e2e/gatewayapi/gatewayproxy.go +++ b/test/e2e/gatewayapi/gatewayproxy.go @@ -23,7 +23,7 @@ import ( "github.com/apache/apisix-ingress-controller/test/e2e/scaffold" ) -var _ = Describe("Test GatewayProxy", func() { +var _ = Describe("Test GatewayProxy", Label("apisix", "v1alpha1", "gatewayproxy"), func() { s := scaffold.NewDefaultScaffold() var defaultGatewayClass = ` diff --git a/test/e2e/gatewayapi/httproute.go b/test/e2e/gatewayapi/httproute.go index 824c39203..c4ffbbf5b 100644 --- a/test/e2e/gatewayapi/httproute.go +++ b/test/e2e/gatewayapi/httproute.go @@ -33,7 +33,7 @@ import ( "github.com/apache/apisix-ingress-controller/test/e2e/scaffold" ) -var _ = Describe("Test HTTPRoute", func() { +var _ = Describe("Test HTTPRoute", Label("networking", "httproute"), func() { s := scaffold.NewDefaultScaffold() var gatewayProxyYaml = ` diff --git a/test/e2e/ingress/ingress.go b/test/e2e/ingress/ingress.go index 411af3647..d093447a3 100644 --- a/test/e2e/ingress/ingress.go +++ b/test/e2e/ingress/ingress.go @@ -41,7 +41,7 @@ func createSecret(s *scaffold.Scaffold, secretName string) { assert.Nil(GinkgoT(), err, "create secret error") } -var _ = Describe("Test Ingress", func() { +var _ = Describe("Test Ingress", Label("networking", "ingress"), func() { s := scaffold.NewScaffold(&scaffold.Options{ ControllerName: "apisix.apache.org/apisix-ingress-controller", }) diff --git a/test/e2e/scaffold/apisix_deployer.go b/test/e2e/scaffold/apisix_deployer.go index 2292f311b..b9451d991 100644 --- a/test/e2e/scaffold/apisix_deployer.go +++ b/test/e2e/scaffold/apisix_deployer.go @@ -195,8 +195,9 @@ func (s *APISIXDeployer) deployDataplane(opts *APISIXDeployOptions) *corev1.Serv kubectlOpts := k8s.NewKubectlOptions("", "", opts.Namespace) if os.Getenv(framework.EnvKeyProviderType) == adc.BackendModeAPISIX { - // deploy etcd + opts.ServiceName = "apisix" opts.ConfigProvider = "etcd" + // deploy etcd k8s.KubectlApplyFromString(s.GinkgoT, kubectlOpts, framework.EtcdSpec) err := framework.WaitPodsAvailable(s.GinkgoT, kubectlOpts, metav1.ListOptions{ LabelSelector: "app=etcd", From 9f8890a957c26b1e80ba0b1803ba7edfb73e257c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=82=9F=E7=A9=BA?= Date: Wed, 25 Jun 2025 14:51:29 +0800 Subject: [PATCH 05/13] chore: update Ginkgo labels to use full domain names for consistency - Replaced shorthand labels like "apisix" and "networking" with "apisix.apache.org" and "networking.k8s.io" respectively across E2E test cases. - Adjusted GitHub Actions workflows to reflect updated labels. --- .github/workflows/apisix-e2e-test.yml | 4 ++-- test/e2e/api7/gatewayproxy.go | 2 +- test/e2e/apisix/basic.go | 2 +- test/e2e/apisix/consumer.go | 2 +- test/e2e/apisix/globalrule.go | 2 +- test/e2e/apisix/pluginconfig.go | 2 +- test/e2e/apisix/route.go | 2 +- test/e2e/apisix/tls.go | 2 +- test/e2e/crds/backendtrafficpolicy.go | 4 ++-- test/e2e/crds/consumer.go | 2 +- test/e2e/gatewayapi/controller.go | 2 +- test/e2e/gatewayapi/gateway.go | 2 +- test/e2e/gatewayapi/gatewayclass.go | 2 +- test/e2e/gatewayapi/gatewayproxy.go | 2 +- test/e2e/gatewayapi/httproute.go | 2 +- test/e2e/ingress/ingress.go | 2 +- 16 files changed, 18 insertions(+), 18 deletions(-) diff --git a/.github/workflows/apisix-e2e-test.yml b/.github/workflows/apisix-e2e-test.yml index 51f74f89b..5759c5e55 100644 --- a/.github/workflows/apisix-e2e-test.yml +++ b/.github/workflows/apisix-e2e-test.yml @@ -41,8 +41,8 @@ jobs: - apisix-standalone - apisix cases_subset: - - apisix - - networking + - apisix.apache.org + - networking.k8s.io runs-on: buildjet-2vcpu-ubuntu-2204 steps: - name: Checkout diff --git a/test/e2e/api7/gatewayproxy.go b/test/e2e/api7/gatewayproxy.go index 6e589d9ad..02c6bd3fa 100644 --- a/test/e2e/api7/gatewayproxy.go +++ b/test/e2e/api7/gatewayproxy.go @@ -23,7 +23,7 @@ import ( "github.com/apache/apisix-ingress-controller/test/e2e/scaffold" ) -var _ = Describe("Test GatewayProxy", func() { +var _ = Describe("Test GatewayProxy", Label("apisix.apache.org", "v1alpha1", "gatewayproxy"), func() { s := scaffold.NewDefaultScaffold() var defaultGatewayClass = ` diff --git a/test/e2e/apisix/basic.go b/test/e2e/apisix/basic.go index f151084fa..9da130c91 100644 --- a/test/e2e/apisix/basic.go +++ b/test/e2e/apisix/basic.go @@ -19,7 +19,7 @@ import ( "github.com/apache/apisix-ingress-controller/test/e2e/scaffold" ) -var _ = Describe("APISIX Standalone Basic Tests", Label("apisix", "v2", "basic"), func() { +var _ = Describe("APISIX Standalone Basic Tests", Label("apisix.apache.org", "v2", "basic"), func() { s := scaffold.NewScaffold(&scaffold.Options{ ControllerName: "apisix.apache.org/apisix-ingress-controller", }) diff --git a/test/e2e/apisix/consumer.go b/test/e2e/apisix/consumer.go index e5000146d..e8a86d989 100644 --- a/test/e2e/apisix/consumer.go +++ b/test/e2e/apisix/consumer.go @@ -28,7 +28,7 @@ import ( type Headers map[string]string -var _ = Describe("Test ApisixConsumer", Label("apisix", "v2", "apisixconsumer"), func() { +var _ = Describe("Test ApisixConsumer", Label("apisix.apache.org", "v2", "apisixconsumer"), func() { var ( s = scaffold.NewScaffold(&scaffold.Options{ ControllerName: "apisix.apache.org/apisix-ingress-controller", diff --git a/test/e2e/apisix/globalrule.go b/test/e2e/apisix/globalrule.go index c01c48586..a6c09673d 100644 --- a/test/e2e/apisix/globalrule.go +++ b/test/e2e/apisix/globalrule.go @@ -56,7 +56,7 @@ spec: scope: "Namespace" ` -var _ = Describe("Test GlobalRule", Label("apisix", "v2", "apisixglobalrule"), func() { +var _ = Describe("Test GlobalRule", Label("apisix.apache.org", "v2", "apisixglobalrule"), func() { s := scaffold.NewScaffold(&scaffold.Options{ ControllerName: "apisix.apache.org/apisix-ingress-controller", }) diff --git a/test/e2e/apisix/pluginconfig.go b/test/e2e/apisix/pluginconfig.go index 8ffcb7303..5d7968c70 100644 --- a/test/e2e/apisix/pluginconfig.go +++ b/test/e2e/apisix/pluginconfig.go @@ -59,7 +59,7 @@ spec: scope: "Namespace" ` -var _ = Describe("Test ApisixPluginConfig", Label("apisix", "v2", "apisixpluginconfig"), func() { +var _ = Describe("Test ApisixPluginConfig", Label("apisix.apache.org", "v2", "apisixpluginconfig"), func() { var ( s = scaffold.NewScaffold(&scaffold.Options{ ControllerName: "apisix.apache.org/apisix-ingress-controller", diff --git a/test/e2e/apisix/route.go b/test/e2e/apisix/route.go index 95216fe27..63261a16d 100644 --- a/test/e2e/apisix/route.go +++ b/test/e2e/apisix/route.go @@ -27,7 +27,7 @@ import ( "github.com/apache/apisix-ingress-controller/test/e2e/scaffold" ) -var _ = Describe("Test ApisixRoute", Label("apisix", "v2", "apisixroute"), func() { +var _ = Describe("Test ApisixRoute", Label("apisix.apache.org", "v2", "apisixroute"), func() { var ( s = scaffold.NewScaffold(&scaffold.Options{ ControllerName: "apisix.apache.org/apisix-ingress-controller", diff --git a/test/e2e/apisix/tls.go b/test/e2e/apisix/tls.go index c080ab2dd..e5e8ee513 100644 --- a/test/e2e/apisix/tls.go +++ b/test/e2e/apisix/tls.go @@ -85,7 +85,7 @@ var Cert = strings.TrimSpace(framework.TestServerCert) var Key = strings.TrimSpace(framework.TestServerKey) -var _ = Describe("Test ApisixTls", Label("apisix", "v2", "apisixtls"), func() { +var _ = Describe("Test ApisixTls", Label("apisix.apache.org", "v2", "apisixtls"), func() { var ( s = scaffold.NewScaffold(&scaffold.Options{ ControllerName: "apisix.apache.org/apisix-ingress-controller", diff --git a/test/e2e/crds/backendtrafficpolicy.go b/test/e2e/crds/backendtrafficpolicy.go index e7d4d768c..144edb311 100644 --- a/test/e2e/crds/backendtrafficpolicy.go +++ b/test/e2e/crds/backendtrafficpolicy.go @@ -22,7 +22,7 @@ import ( "github.com/apache/apisix-ingress-controller/test/e2e/scaffold" ) -var _ = Describe("Test BackendTrafficPolicy base on HTTPRoute", Label("apisix", "v1alpha1", "backendtrafficpolicy"), func() { +var _ = Describe("Test BackendTrafficPolicy base on HTTPRoute", Label("apisix.apache.org", "v1alpha1", "backendtrafficpolicy"), func() { s := scaffold.NewDefaultScaffold() var defaultGatewayProxy = ` @@ -156,7 +156,7 @@ spec: }) }) -var _ = Describe("Test BackendTrafficPolicy base on Ingress", func() { +var _ = Describe("Test BackendTrafficPolicy base on Ingress", Label("apisix.apache.org", "v1alpha1", "backendtrafficpolicy"), func() { s := scaffold.NewScaffold(&scaffold.Options{ ControllerName: "apisix.apache.org/apisix-ingress-controller", }) diff --git a/test/e2e/crds/consumer.go b/test/e2e/crds/consumer.go index 4a8b83748..7bba40e88 100644 --- a/test/e2e/crds/consumer.go +++ b/test/e2e/crds/consumer.go @@ -23,7 +23,7 @@ import ( "github.com/apache/apisix-ingress-controller/test/e2e/scaffold" ) -var _ = Describe("Test Consumer", Label("apisix", "v1alpha1", "consumer"), func() { +var _ = Describe("Test Consumer", Label("apisix.apache.org", "v1alpha1", "consumer"), func() { s := scaffold.NewDefaultScaffold() var defaultGatewayProxy = ` diff --git a/test/e2e/gatewayapi/controller.go b/test/e2e/gatewayapi/controller.go index c279e8d8f..a3f657f11 100644 --- a/test/e2e/gatewayapi/controller.go +++ b/test/e2e/gatewayapi/controller.go @@ -23,7 +23,7 @@ import ( "github.com/apache/apisix-ingress-controller/test/e2e/scaffold" ) -var _ = Describe("Check if controller cache gets synced with correct resources", Label("networking", "basic"), func() { +var _ = Describe("Check if controller cache gets synced with correct resources", Label("networking.k8s.io", "basic"), func() { var gatewayProxyYaml = ` apiVersion: apisix.apache.org/v1alpha1 diff --git a/test/e2e/gatewayapi/gateway.go b/test/e2e/gatewayapi/gateway.go index 131dedca5..9a12e9e03 100644 --- a/test/e2e/gatewayapi/gateway.go +++ b/test/e2e/gatewayapi/gateway.go @@ -37,7 +37,7 @@ func createSecret(s *scaffold.Scaffold, secretName string) { assert.Nil(GinkgoT(), err, "create secret error") } -var _ = Describe("Test Gateway", Label("networking", "gateway"), func() { +var _ = Describe("Test Gateway", Label("networking.k8s.io", "gateway"), func() { s := scaffold.NewScaffold(&scaffold.Options{ ControllerName: "apisix.apache.org/apisix-ingress-controller", }) diff --git a/test/e2e/gatewayapi/gatewayclass.go b/test/e2e/gatewayapi/gatewayclass.go index 737b24e9f..6cc94322d 100644 --- a/test/e2e/gatewayapi/gatewayclass.go +++ b/test/e2e/gatewayapi/gatewayclass.go @@ -21,7 +21,7 @@ import ( "github.com/apache/apisix-ingress-controller/test/e2e/scaffold" ) -var _ = Describe("Test GatewayClass", Label("networking", "gatewayclass"), func() { +var _ = Describe("Test GatewayClass", Label("networking.k8s.io", "gatewayclass"), func() { s := scaffold.NewScaffold(&scaffold.Options{ ControllerName: "apisix.apache.org/apisix-ingress-controller", }) diff --git a/test/e2e/gatewayapi/gatewayproxy.go b/test/e2e/gatewayapi/gatewayproxy.go index 805ea8caf..3100ca2fb 100644 --- a/test/e2e/gatewayapi/gatewayproxy.go +++ b/test/e2e/gatewayapi/gatewayproxy.go @@ -23,7 +23,7 @@ import ( "github.com/apache/apisix-ingress-controller/test/e2e/scaffold" ) -var _ = Describe("Test GatewayProxy", Label("apisix", "v1alpha1", "gatewayproxy"), func() { +var _ = Describe("Test GatewayProxy", Label("apisix.apache.org", "v1alpha1", "gatewayproxy"), func() { s := scaffold.NewDefaultScaffold() var defaultGatewayClass = ` diff --git a/test/e2e/gatewayapi/httproute.go b/test/e2e/gatewayapi/httproute.go index c4ffbbf5b..255a54ded 100644 --- a/test/e2e/gatewayapi/httproute.go +++ b/test/e2e/gatewayapi/httproute.go @@ -33,7 +33,7 @@ import ( "github.com/apache/apisix-ingress-controller/test/e2e/scaffold" ) -var _ = Describe("Test HTTPRoute", Label("networking", "httproute"), func() { +var _ = Describe("Test HTTPRoute", Label("networking.k8s.io", "httproute"), func() { s := scaffold.NewDefaultScaffold() var gatewayProxyYaml = ` diff --git a/test/e2e/ingress/ingress.go b/test/e2e/ingress/ingress.go index d093447a3..a02793b8c 100644 --- a/test/e2e/ingress/ingress.go +++ b/test/e2e/ingress/ingress.go @@ -41,7 +41,7 @@ func createSecret(s *scaffold.Scaffold, secretName string) { assert.Nil(GinkgoT(), err, "create secret error") } -var _ = Describe("Test Ingress", Label("networking", "ingress"), func() { +var _ = Describe("Test Ingress", Label("networking.k8s.io", "ingress"), func() { s := scaffold.NewScaffold(&scaffold.Options{ ControllerName: "apisix.apache.org/apisix-ingress-controller", }) From d5d228ac4465d1158a092dcd4821140076a96399 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=82=9F=E7=A9=BA?= Date: Wed, 25 Jun 2025 14:58:10 +0800 Subject: [PATCH 06/13] feat: add support for `apisix` backend mode --- .github/workflows/apisix-conformance-test.yml | 7 ++++ .github/workflows/apisix-e2e-test.yml | 6 +++ internal/controller/config/config.go | 2 +- internal/controller/config/types.go | 1 + internal/provider/adc/adc.go | 21 +++++++--- internal/provider/adc/executor.go | 14 +++++-- test/conformance/apisix/suite_test.go | 3 +- test/e2e/framework/apisix_consts.go | 7 ++++ test/e2e/framework/assertion.go | 2 +- .../manifests/apisix-standalone.yaml | 9 +++- test/e2e/framework/manifests/etcd.yaml | 41 +++++++++++++++++++ test/e2e/scaffold/adc.go | 4 ++ test/e2e/scaffold/apisix_deployer.go | 25 +++++++++-- 13 files changed, 127 insertions(+), 15 deletions(-) create mode 100644 test/e2e/framework/manifests/etcd.yaml diff --git a/.github/workflows/apisix-conformance-test.yml b/.github/workflows/apisix-conformance-test.yml index fd90266e7..708511924 100644 --- a/.github/workflows/apisix-conformance-test.yml +++ b/.github/workflows/apisix-conformance-test.yml @@ -36,6 +36,11 @@ jobs: timeout-minutes: 60 needs: - prepare + strategy: + matrix: + provider_type: + - apisix-standalone + - apisix runs-on: buildjet-2vcpu-ubuntu-2204 steps: - name: Checkout @@ -79,6 +84,8 @@ jobs: - name: Run Conformance Test shell: bash continue-on-error: true + env: + PROVIDER_TYPE: ${{ matrix.provider_type }} run: | make conformance-test-standalone diff --git a/.github/workflows/apisix-e2e-test.yml b/.github/workflows/apisix-e2e-test.yml index 05a4582b1..a299ada93 100644 --- a/.github/workflows/apisix-e2e-test.yml +++ b/.github/workflows/apisix-e2e-test.yml @@ -35,6 +35,11 @@ jobs: e2e-test: needs: - prepare + strategy: + matrix: + provider_type: + - apisix-standalone + - apisix runs-on: buildjet-2vcpu-ubuntu-2204 steps: - name: Checkout @@ -83,5 +88,6 @@ jobs: shell: bash env: TEST_DIR: "./test/e2e/apisix/" + PROVIDER_TYPE: ${{ matrix.provider_type }} run: | make e2e-test diff --git a/internal/controller/config/config.go b/internal/controller/config/config.go index ae9845e55..0e8f64c75 100644 --- a/internal/controller/config/config.go +++ b/internal/controller/config/config.go @@ -118,7 +118,7 @@ func validateProvider(config ProviderConfig) error { return fmt.Errorf("sync_period must be greater than 0 for standalone provider") } return nil - case ProviderTypeAPI7EE: + case ProviderTypeAPI7EE, ProviderTypeAPISIX: return nil default: return fmt.Errorf("unsupported provider type: %s", config.Type) diff --git a/internal/controller/config/types.go b/internal/controller/config/types.go index af4cfa190..207babb46 100644 --- a/internal/controller/config/types.go +++ b/internal/controller/config/types.go @@ -21,6 +21,7 @@ type ProviderType string const ( ProviderTypeStandalone ProviderType = "apisix-standalone" ProviderTypeAPI7EE ProviderType = "api7ee" + ProviderTypeAPISIX ProviderType = "apisix" ) const ( diff --git a/internal/provider/adc/adc.go b/internal/provider/adc/adc.go index 463202bd2..ee9416336 100644 --- a/internal/provider/adc/adc.go +++ b/internal/provider/adc/adc.go @@ -15,12 +15,12 @@ package adc import ( "context" "encoding/json" - "errors" "os" "sync" "time" "github.com/api7/gopkg/pkg/log" + "github.com/pkg/errors" "go.uber.org/zap" networkingv1 "k8s.io/api/networking/v1" "sigs.k8s.io/controller-runtime/pkg/client" @@ -48,6 +48,7 @@ type BackendMode string const ( BackendModeAPISIXStandalone string = "apisix-standalone" BackendModeAPI7EE string = "api7ee" + BackendModeAPISIX string = "apisix" ) type adcClient struct { @@ -185,11 +186,21 @@ func (d *adcClient) Update(ctx context.Context, tctx *provider.TranslateContext, } } - // This mode is full synchronization, - // which only needs to be saved in cache - // and triggered by a timer for synchronization - if d.BackendMode == BackendModeAPISIXStandalone || apiv2.Is(obj) { + switch d.BackendMode { + case BackendModeAPI7EE: + if apiv2.Is(obj) { + return nil + } + case BackendModeAPISIX: + // do nothing + case BackendModeAPISIXStandalone: + // This mode is full synchronization, + // which only needs to be saved in cache + // and triggered by a timer for synchronization return nil + default: + return errors.Errorf("unknown backend mode: %s", d.BackendMode) + } return d.sync(ctx, Task{ diff --git a/internal/provider/adc/executor.go b/internal/provider/adc/executor.go index bf6f2a033..eb9d2b747 100644 --- a/internal/provider/adc/executor.go +++ b/internal/provider/adc/executor.go @@ -46,15 +46,19 @@ func (e *DefaultADCExecutor) Execute(ctx context.Context, mode string, config ad func (e *DefaultADCExecutor) runADC(ctx context.Context, mode string, config adcConfig, args []string) error { for _, addr := range config.ServerAddrs { - ctxWithTimeout, cancel := context.WithTimeout(ctx, 15*time.Second) - defer cancel() - if err := e.runForSingleServer(ctxWithTimeout, addr, mode, config, args); err != nil { + if err := e.runForSingleServerWithTimeout(ctx, addr, mode, config, args); err != nil { return err } } return nil } +func (e *DefaultADCExecutor) runForSingleServerWithTimeout(ctx context.Context, serverAddr, mode string, config adcConfig, args []string) error { + ctx, cancel := context.WithTimeout(ctx, 15*time.Second) + defer cancel() + return e.runForSingleServer(ctx, serverAddr, mode, config, args) +} + func (e *DefaultADCExecutor) runForSingleServer(ctx context.Context, serverAddr, mode string, config adcConfig, args []string) error { cmdArgs := append([]string{}, args...) if !config.TlsVerify { @@ -108,6 +112,10 @@ func (e *DefaultADCExecutor) buildCmdError(runErr error, stdout, stderr []byte) func (e *DefaultADCExecutor) handleOutput(output []byte) error { var result adctypes.SyncResult + if index := strings.IndexByte(string(output), '{'); index > 0 { + log.Warnf("extra output: %s", string(output[:index])) + output = output[index:] + } if err := json.Unmarshal(output, &result); err != nil { log.Errorw("failed to unmarshal adc output", zap.Error(err), diff --git a/test/conformance/apisix/suite_test.go b/test/conformance/apisix/suite_test.go index 12fd57522..6652cab6e 100644 --- a/test/conformance/apisix/suite_test.go +++ b/test/conformance/apisix/suite_test.go @@ -12,6 +12,7 @@ package conformance import ( + "cmp" "context" "fmt" "os" @@ -160,7 +161,7 @@ func TestMain(m *testing.M) { Namespace: namespace, StatusAddress: address, InitSyncDelay: 1 * time.Minute, - ProviderType: "apisix-standalone", + ProviderType: cmp.Or(os.Getenv(framework.EnvKeyProviderType), "apisix-standalone"), ProviderSyncPeriod: 10 * time.Millisecond, }) diff --git a/test/e2e/framework/apisix_consts.go b/test/e2e/framework/apisix_consts.go index 1f733ffc3..0f4b1af8c 100644 --- a/test/e2e/framework/apisix_consts.go +++ b/test/e2e/framework/apisix_consts.go @@ -19,10 +19,17 @@ import ( "github.com/Masterminds/sprig/v3" ) +const ( + EnvKeyProviderType = "PROVIDER_TYPE" +) + var ( //go:embed manifests/apisix-standalone.yaml apisixStandaloneTemplate string APISIXStandaloneTpl *template.Template + + //go:embed manifests/etcd.yaml + EtcdSpec string ) var ( diff --git a/test/e2e/framework/assertion.go b/test/e2e/framework/assertion.go index 851997b7b..52d6ac286 100644 --- a/test/e2e/framework/assertion.go +++ b/test/e2e/framework/assertion.go @@ -111,7 +111,7 @@ func APIv2MustHaveCondition(t testing.TestingT, cli client.Client, timeout time. } err := PollUntilAPIv2MustHaveStatus(cli, timeout, nn, obj, f) - require.NoError(t, err, "error waiting status to have a Condition matching %+v", nn, cond) + require.NoError(t, err, "error waiting %s status to have a Condition matching %+v", nn, cond) } func PollUntilAPIv2MustHaveStatus(cli client.Client, timeout time.Duration, nn types.NamespacedName, obj client.Object, f func(client.Object) bool) error { diff --git a/test/e2e/framework/manifests/apisix-standalone.yaml b/test/e2e/framework/manifests/apisix-standalone.yaml index 912aa8325..8f63cb003 100644 --- a/test/e2e/framework/manifests/apisix-standalone.yaml +++ b/test/e2e/framework/manifests/apisix-standalone.yaml @@ -7,7 +7,9 @@ data: deployment: role: traditional role_traditional: - config_provider: yaml + # on backend mode apisix-standalone, config_provider is "yaml" + # on backend mode apisix, config_provider is "etcd" + config_provider: {{ .ConfigProvider | default "yaml" }} admin: allow_admin: - 0.0.0.0/0 @@ -15,6 +17,11 @@ data: - key: {{ .AdminKey }} name: admin role: admin + {{- if eq .ConfigProvider "etcd" }} + etcd: + host: + - "http://etcd:2379" + {{- end }} nginx_config: worker_processes: 2 error_log_level: info diff --git a/test/e2e/framework/manifests/etcd.yaml b/test/e2e/framework/manifests/etcd.yaml new file mode 100644 index 000000000..13a6f8e5b --- /dev/null +++ b/test/e2e/framework/manifests/etcd.yaml @@ -0,0 +1,41 @@ +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: etcd +spec: + replicas: 1 + selector: + matchLabels: + app: etcd + template: + metadata: + labels: + app: etcd + spec: + containers: + - name: etcd + image: quay.io/coreos/etcd:v3.5.0 + command: + - etcd + - --data-dir=/etcd-data + - --name=node1 + - --initial-advertise-peer-urls=http://0.0.0.0:2380 + - --listen-peer-urls=http://0.0.0.0:2380 + - --advertise-client-urls=http://0.0.0.0:2379 + - --listen-client-urls=http://0.0.0.0:2379 + - --initial-cluster=node1=http://0.0.0.0:2380 + ports: + - containerPort: 2379 + - containerPort: 2380 +--- +apiVersion: v1 +kind: Service +metadata: + name: etcd +spec: + ports: + - port: 2379 + targetPort: 2379 + selector: + app: etcd \ No newline at end of file diff --git a/test/e2e/scaffold/adc.go b/test/e2e/scaffold/adc.go index aab8b50a1..0abcbdf10 100644 --- a/test/e2e/scaffold/adc.go +++ b/test/e2e/scaffold/adc.go @@ -26,6 +26,7 @@ import ( adctypes "github.com/apache/apisix-ingress-controller/api/adc" "github.com/apache/apisix-ingress-controller/internal/provider/adc/translator" + "github.com/apache/apisix-ingress-controller/test/e2e/framework" ) // DataplaneResource defines the interface for accessing dataplane resources @@ -131,6 +132,9 @@ func (a *adcDataplaneResource) dumpResources(ctx context.Context) (*translator.T "ADC_SERVER=" + a.serverAddr, "ADC_TOKEN=" + a.token, } + if providerType := os.Getenv(framework.EnvKeyProviderType); providerType != "" { + adcEnv = append(adcEnv, "ADC_BACKEND="+providerType) + } var stdout, stderr bytes.Buffer cmd := exec.CommandContext(ctxWithTimeout, "adc", args...) diff --git a/test/e2e/scaffold/apisix_deployer.go b/test/e2e/scaffold/apisix_deployer.go index 8d53c8362..b9451d991 100644 --- a/test/e2e/scaffold/apisix_deployer.go +++ b/test/e2e/scaffold/apisix_deployer.go @@ -14,6 +14,7 @@ package scaffold import ( "bytes" + "cmp" "fmt" "os" "time" @@ -24,6 +25,7 @@ import ( corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "github.com/apache/apisix-ingress-controller/internal/provider/adc" "github.com/apache/apisix-ingress-controller/pkg/utils" "github.com/apache/apisix-ingress-controller/test/e2e/framework" ) @@ -36,6 +38,8 @@ type APISIXDeployOptions struct { ServiceType string ServiceHTTPPort int ServiceHTTPSPort int + + ConfigProvider string } type APISIXDeployer struct { @@ -186,12 +190,25 @@ func (s *APISIXDeployer) deployDataplane(opts *APISIXDeployOptions) *corev1.Serv if opts.ServiceHTTPSPort == 0 { opts.ServiceHTTPSPort = 443 } + opts.ConfigProvider = "yaml" + + kubectlOpts := k8s.NewKubectlOptions("", "", opts.Namespace) + + if os.Getenv(framework.EnvKeyProviderType) == adc.BackendModeAPISIX { + opts.ServiceName = "apisix" + opts.ConfigProvider = "etcd" + // deploy etcd + k8s.KubectlApplyFromString(s.GinkgoT, kubectlOpts, framework.EtcdSpec) + err := framework.WaitPodsAvailable(s.GinkgoT, kubectlOpts, metav1.ListOptions{ + LabelSelector: "app=etcd", + }) + Expect(err).ToNot(HaveOccurred(), "waiting for etcd pod ready") + } buf := bytes.NewBuffer(nil) err := framework.APISIXStandaloneTpl.Execute(buf, opts) Expect(err).ToNot(HaveOccurred(), "executing template") - kubectlOpts := k8s.NewKubectlOptions("", "", opts.Namespace) k8s.KubectlApplyFromString(s.GinkgoT, kubectlOpts, buf.String()) err = framework.WaitPodsAvailable(s.GinkgoT, kubectlOpts, metav1.ListOptions{ @@ -218,8 +235,9 @@ func (s *APISIXDeployer) deployDataplane(opts *APISIXDeployOptions) *corev1.Serv func (s *APISIXDeployer) DeployIngress() { s.Framework.DeployIngress(framework.IngressDeployOpts{ - ProviderSyncPeriod: 200 * time.Millisecond, ControllerName: s.opts.ControllerName, + ProviderType: cmp.Or(os.Getenv(framework.EnvKeyProviderType), "apisix-standalone"), + ProviderSyncPeriod: 200 * time.Millisecond, Namespace: s.namespace, Replicas: 1, }) @@ -227,8 +245,9 @@ func (s *APISIXDeployer) DeployIngress() { func (s *APISIXDeployer) ScaleIngress(replicas int) { s.Framework.DeployIngress(framework.IngressDeployOpts{ - ProviderSyncPeriod: 200 * time.Millisecond, ControllerName: s.opts.ControllerName, + ProviderType: cmp.Or(os.Getenv(framework.EnvKeyProviderType), "apisix-standalone"), + ProviderSyncPeriod: 200 * time.Millisecond, Namespace: s.namespace, Replicas: replicas, }) From 9c55597b0ecba3f07cc2fddd76e070ca891c9db8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=82=9F=E7=A9=BA?= Date: Wed, 25 Jun 2025 16:10:14 +0800 Subject: [PATCH 07/13] feat: add support for `apisix` backend mode and refine e2e test logic --- internal/provider/adc/adc.go | 2 +- test/e2e/gatewayapi/httproute.go | 15 ++++++++------- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/internal/provider/adc/adc.go b/internal/provider/adc/adc.go index ee9416336..79b1cdd00 100644 --- a/internal/provider/adc/adc.go +++ b/internal/provider/adc/adc.go @@ -271,7 +271,7 @@ func (d *adcClient) Delete(ctx context.Context, obj client.Object) error { }) } return nil - case BackendModeAPI7EE: + case BackendModeAPI7EE, BackendModeAPISIX: return d.sync(ctx, Task{ Name: obj.GetName(), Labels: labels, diff --git a/test/e2e/gatewayapi/httproute.go b/test/e2e/gatewayapi/httproute.go index 824c39203..65092fd3f 100644 --- a/test/e2e/gatewayapi/httproute.go +++ b/test/e2e/gatewayapi/httproute.go @@ -524,7 +524,7 @@ spec: By("create HTTPRoute") ResourceApplied("HTTPRoute", "httpbin", exactRouteByGet, 1) - By("access daataplane to check the HTTPRoute") + By("access dataplane to check the HTTPRoute") s.NewAPISIXClient(). GET("/get"). WithHost("httpbin.example"). @@ -534,13 +534,14 @@ spec: By("delete Gateway") err := s.DeleteResource("Gateway", "apisix") Expect(err).NotTo(HaveOccurred(), "deleting Gateway") - time.Sleep(5 * time.Second) - s.NewAPISIXClient(). - GET("/get"). - WithHost("httpbin.example"). - Expect(). - Status(404) + Eventually(func() int { + return s.NewAPISIXClient(). + GET("/get"). + WithHost("httpbin.example"). + Expect(). + Raw().StatusCode + }).WithTimeout(5 * time.Second).ProbeEvery(time.Second).Should(Equal(http.StatusNotFound)) }) It("Proxy External Service", func() { From 1d0d379ed00861b58de4b10b9ba46acd1e13c16d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=82=9F=E7=A9=BA?= Date: Wed, 25 Jun 2025 16:11:58 +0800 Subject: [PATCH 08/13] chore: update conformance test report to include provider_type in title --- .github/workflows/apisix-conformance-test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/apisix-conformance-test.yml b/.github/workflows/apisix-conformance-test.yml index 708511924..5080c8f5e 100644 --- a/.github/workflows/apisix-conformance-test.yml +++ b/.github/workflows/apisix-conformance-test.yml @@ -105,7 +105,7 @@ jobs: - name: Format Conformance Test Report if: ${{ github.event_name == 'pull_request' }} run: | - echo '# conformance test report' > report.md + echo '# conformance test report - ${{ matrix.provider_type }} mode' > report.md echo '```yaml' >> report.md cat apisix-ingress-controller-conformance-report.yaml >> report.md echo '```' >> report.md From 9ed3758c8465dda9432b4205843371eaf19bcab1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=82=9F=E7=A9=BA?= Date: Wed, 25 Jun 2025 16:36:40 +0800 Subject: [PATCH 09/13] resolve comments --- internal/controller/config/config.go | 4 ++-- internal/provider/adc/adc.go | 22 ++++++---------------- 2 files changed, 8 insertions(+), 18 deletions(-) diff --git a/internal/controller/config/config.go b/internal/controller/config/config.go index 0e8f64c75..b9fc4aed2 100644 --- a/internal/controller/config/config.go +++ b/internal/controller/config/config.go @@ -113,12 +113,12 @@ func (c *Config) Validate() error { func validateProvider(config ProviderConfig) error { switch config.Type { - case ProviderTypeStandalone: + case ProviderTypeStandalone, ProviderTypeAPISIX: if config.SyncPeriod.Duration <= 0 { return fmt.Errorf("sync_period must be greater than 0 for standalone provider") } return nil - case ProviderTypeAPI7EE, ProviderTypeAPISIX: + case ProviderTypeAPI7EE: return nil default: return fmt.Errorf("unsupported provider type: %s", config.Type) diff --git a/internal/provider/adc/adc.go b/internal/provider/adc/adc.go index 79b1cdd00..f9b33d27c 100644 --- a/internal/provider/adc/adc.go +++ b/internal/provider/adc/adc.go @@ -186,21 +186,11 @@ func (d *adcClient) Update(ctx context.Context, tctx *provider.TranslateContext, } } - switch d.BackendMode { - case BackendModeAPI7EE: - if apiv2.Is(obj) { - return nil - } - case BackendModeAPISIX: - // do nothing - case BackendModeAPISIXStandalone: - // This mode is full synchronization, - // which only needs to be saved in cache - // and triggered by a timer for synchronization + // This mode is full synchronization, + // which only needs to be saved in cache + // and triggered by a timer for synchronization + if d.BackendMode == BackendModeAPISIXStandalone || d.BackendMode == BackendModeAPISIX || apiv2.Is(obj) { return nil - default: - return errors.Errorf("unknown backend mode: %s", d.BackendMode) - } return d.sync(ctx, Task{ @@ -260,7 +250,7 @@ func (d *adcClient) Delete(ctx context.Context, obj client.Object) error { log.Debugw("successfully deleted resources from store", zap.Any("object", obj)) switch d.BackendMode { - case BackendModeAPISIXStandalone: + case BackendModeAPISIXStandalone, BackendModeAPISIX: // Full synchronization is performed on a gateway by gateway basis // and it is not possible to perform scheduled synchronization // on deleted gateway level resources @@ -271,7 +261,7 @@ func (d *adcClient) Delete(ctx context.Context, obj client.Object) error { }) } return nil - case BackendModeAPI7EE, BackendModeAPISIX: + case BackendModeAPI7EE: return d.sync(ctx, Task{ Name: obj.GetName(), Labels: labels, From de499eed51c1f9f13a68a3fd4c7fbee38073f82b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=82=9F=E7=A9=BA?= Date: Wed, 25 Jun 2025 16:48:09 +0800 Subject: [PATCH 10/13] resolve comments --- test/conformance/apisix/suite_test.go | 2 +- test/e2e/framework/apisix_consts.go | 5 +++-- test/e2e/framework/manifests/etcd.yaml | 2 +- test/e2e/scaffold/adc.go | 4 ++-- test/e2e/scaffold/apisix_deployer.go | 6 +++--- 5 files changed, 10 insertions(+), 9 deletions(-) diff --git a/test/conformance/apisix/suite_test.go b/test/conformance/apisix/suite_test.go index 6652cab6e..2da911db3 100644 --- a/test/conformance/apisix/suite_test.go +++ b/test/conformance/apisix/suite_test.go @@ -161,7 +161,7 @@ func TestMain(m *testing.M) { Namespace: namespace, StatusAddress: address, InitSyncDelay: 1 * time.Minute, - ProviderType: cmp.Or(os.Getenv(framework.EnvKeyProviderType), "apisix-standalone"), + ProviderType: cmp.Or(framework.ProviderType, "apisix-standalone"), ProviderSyncPeriod: 10 * time.Millisecond, }) diff --git a/test/e2e/framework/apisix_consts.go b/test/e2e/framework/apisix_consts.go index 0f4b1af8c..ce530298d 100644 --- a/test/e2e/framework/apisix_consts.go +++ b/test/e2e/framework/apisix_consts.go @@ -14,13 +14,14 @@ package framework import ( _ "embed" + "os" "text/template" "github.com/Masterminds/sprig/v3" ) -const ( - EnvKeyProviderType = "PROVIDER_TYPE" +var ( + ProviderType = os.Getenv("PROVIDER_TYPE") ) var ( diff --git a/test/e2e/framework/manifests/etcd.yaml b/test/e2e/framework/manifests/etcd.yaml index 13a6f8e5b..688fceaa1 100644 --- a/test/e2e/framework/manifests/etcd.yaml +++ b/test/e2e/framework/manifests/etcd.yaml @@ -38,4 +38,4 @@ spec: - port: 2379 targetPort: 2379 selector: - app: etcd \ No newline at end of file + app: etcd diff --git a/test/e2e/scaffold/adc.go b/test/e2e/scaffold/adc.go index 0abcbdf10..80112042f 100644 --- a/test/e2e/scaffold/adc.go +++ b/test/e2e/scaffold/adc.go @@ -132,8 +132,8 @@ func (a *adcDataplaneResource) dumpResources(ctx context.Context) (*translator.T "ADC_SERVER=" + a.serverAddr, "ADC_TOKEN=" + a.token, } - if providerType := os.Getenv(framework.EnvKeyProviderType); providerType != "" { - adcEnv = append(adcEnv, "ADC_BACKEND="+providerType) + if framework.ProviderType != "" { + adcEnv = append(adcEnv, "ADC_BACKEND="+framework.ProviderType) } var stdout, stderr bytes.Buffer diff --git a/test/e2e/scaffold/apisix_deployer.go b/test/e2e/scaffold/apisix_deployer.go index b9451d991..97480037d 100644 --- a/test/e2e/scaffold/apisix_deployer.go +++ b/test/e2e/scaffold/apisix_deployer.go @@ -194,7 +194,7 @@ func (s *APISIXDeployer) deployDataplane(opts *APISIXDeployOptions) *corev1.Serv kubectlOpts := k8s.NewKubectlOptions("", "", opts.Namespace) - if os.Getenv(framework.EnvKeyProviderType) == adc.BackendModeAPISIX { + if framework.ProviderType == adc.BackendModeAPISIX { opts.ServiceName = "apisix" opts.ConfigProvider = "etcd" // deploy etcd @@ -236,7 +236,7 @@ func (s *APISIXDeployer) deployDataplane(opts *APISIXDeployOptions) *corev1.Serv func (s *APISIXDeployer) DeployIngress() { s.Framework.DeployIngress(framework.IngressDeployOpts{ ControllerName: s.opts.ControllerName, - ProviderType: cmp.Or(os.Getenv(framework.EnvKeyProviderType), "apisix-standalone"), + ProviderType: cmp.Or(framework.ProviderType, "apisix-standalone"), ProviderSyncPeriod: 200 * time.Millisecond, Namespace: s.namespace, Replicas: 1, @@ -246,7 +246,7 @@ func (s *APISIXDeployer) DeployIngress() { func (s *APISIXDeployer) ScaleIngress(replicas int) { s.Framework.DeployIngress(framework.IngressDeployOpts{ ControllerName: s.opts.ControllerName, - ProviderType: cmp.Or(os.Getenv(framework.EnvKeyProviderType), "apisix-standalone"), + ProviderType: cmp.Or(framework.ProviderType, "apisix-standalone"), ProviderSyncPeriod: 200 * time.Millisecond, Namespace: s.namespace, Replicas: replicas, From 4a8d3c81d3fad8d63ad45c6725377c22650852f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=82=9F=E7=A9=BA?= Date: Wed, 25 Jun 2025 17:49:30 +0800 Subject: [PATCH 11/13] resolve comments --- test/conformance/apisix/suite_test.go | 3 +-- test/e2e/framework/apisix_consts.go | 5 +++-- .../manifests/{apisix-standalone.yaml => apisix.yaml} | 0 test/e2e/scaffold/apisix_deployer.go | 8 +++----- 4 files changed, 7 insertions(+), 9 deletions(-) rename test/e2e/framework/manifests/{apisix-standalone.yaml => apisix.yaml} (100%) diff --git a/test/conformance/apisix/suite_test.go b/test/conformance/apisix/suite_test.go index 2da911db3..dead6f037 100644 --- a/test/conformance/apisix/suite_test.go +++ b/test/conformance/apisix/suite_test.go @@ -12,7 +12,6 @@ package conformance import ( - "cmp" "context" "fmt" "os" @@ -161,7 +160,7 @@ func TestMain(m *testing.M) { Namespace: namespace, StatusAddress: address, InitSyncDelay: 1 * time.Minute, - ProviderType: cmp.Or(framework.ProviderType, "apisix-standalone"), + ProviderType: framework.ProviderType, ProviderSyncPeriod: 10 * time.Millisecond, }) diff --git a/test/e2e/framework/apisix_consts.go b/test/e2e/framework/apisix_consts.go index ce530298d..f1132275e 100644 --- a/test/e2e/framework/apisix_consts.go +++ b/test/e2e/framework/apisix_consts.go @@ -13,6 +13,7 @@ package framework import ( + "cmp" _ "embed" "os" "text/template" @@ -21,11 +22,11 @@ import ( ) var ( - ProviderType = os.Getenv("PROVIDER_TYPE") + ProviderType = cmp.Or(os.Getenv("PROVIDER_TYPE"), "apisix-standalone") ) var ( - //go:embed manifests/apisix-standalone.yaml + //go:embed manifests/apisix.yaml apisixStandaloneTemplate string APISIXStandaloneTpl *template.Template diff --git a/test/e2e/framework/manifests/apisix-standalone.yaml b/test/e2e/framework/manifests/apisix.yaml similarity index 100% rename from test/e2e/framework/manifests/apisix-standalone.yaml rename to test/e2e/framework/manifests/apisix.yaml diff --git a/test/e2e/scaffold/apisix_deployer.go b/test/e2e/scaffold/apisix_deployer.go index 97480037d..17152af42 100644 --- a/test/e2e/scaffold/apisix_deployer.go +++ b/test/e2e/scaffold/apisix_deployer.go @@ -14,7 +14,6 @@ package scaffold import ( "bytes" - "cmp" "fmt" "os" "time" @@ -180,7 +179,7 @@ func (s *APISIXDeployer) newAPISIXTunnels(serviceName string) error { func (s *APISIXDeployer) deployDataplane(opts *APISIXDeployOptions) *corev1.Service { if opts.ServiceName == "" { - opts.ServiceName = "apisix-standalone" + opts.ServiceName = framework.ProviderType } if opts.ServiceHTTPPort == 0 { @@ -195,7 +194,6 @@ func (s *APISIXDeployer) deployDataplane(opts *APISIXDeployOptions) *corev1.Serv kubectlOpts := k8s.NewKubectlOptions("", "", opts.Namespace) if framework.ProviderType == adc.BackendModeAPISIX { - opts.ServiceName = "apisix" opts.ConfigProvider = "etcd" // deploy etcd k8s.KubectlApplyFromString(s.GinkgoT, kubectlOpts, framework.EtcdSpec) @@ -236,7 +234,7 @@ func (s *APISIXDeployer) deployDataplane(opts *APISIXDeployOptions) *corev1.Serv func (s *APISIXDeployer) DeployIngress() { s.Framework.DeployIngress(framework.IngressDeployOpts{ ControllerName: s.opts.ControllerName, - ProviderType: cmp.Or(framework.ProviderType, "apisix-standalone"), + ProviderType: framework.ProviderType, ProviderSyncPeriod: 200 * time.Millisecond, Namespace: s.namespace, Replicas: 1, @@ -246,7 +244,7 @@ func (s *APISIXDeployer) DeployIngress() { func (s *APISIXDeployer) ScaleIngress(replicas int) { s.Framework.DeployIngress(framework.IngressDeployOpts{ ControllerName: s.opts.ControllerName, - ProviderType: cmp.Or(framework.ProviderType, "apisix-standalone"), + ProviderType: framework.ProviderType, ProviderSyncPeriod: 200 * time.Millisecond, Namespace: s.namespace, Replicas: replicas, From 7fd98ba6a07c3c69e5335496c69bafec32a69618 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=82=9F=E7=A9=BA?= Date: Thu, 26 Jun 2025 10:04:53 +0800 Subject: [PATCH 12/13] chore: disable fail-fast in e2e test workflow --- .github/workflows/apisix-e2e-test.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/apisix-e2e-test.yml b/.github/workflows/apisix-e2e-test.yml index 5759c5e55..416ffbd8e 100644 --- a/.github/workflows/apisix-e2e-test.yml +++ b/.github/workflows/apisix-e2e-test.yml @@ -43,6 +43,7 @@ jobs: cases_subset: - apisix.apache.org - networking.k8s.io + fail-fast: false runs-on: buildjet-2vcpu-ubuntu-2204 steps: - name: Checkout From fb12bf49a4c3776f8e369d336b910b4290f2aa90 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=82=9F=E7=A9=BA?= Date: Thu, 26 Jun 2025 12:32:51 +0800 Subject: [PATCH 13/13] fix: --- .github/workflows/e2e-test.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/e2e-test.yml b/.github/workflows/e2e-test.yml index 514e5747f..2f15abfde 100644 --- a/.github/workflows/e2e-test.yml +++ b/.github/workflows/e2e-test.yml @@ -99,5 +99,6 @@ jobs: shell: bash env: API7_EE_LICENSE: ${{ secrets.API7_EE_LICENSE }} + PROVIDER_TYPE: api7ee run: | make e2e-test