This is an automated email from the ASF dual-hosted git repository. ronething pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/apisix-ingress-controller.git
The following commit(s) were added to refs/heads/master by this push: new 59af65e1 fix: adc backend server on different mode (#2455) 59af65e1 is described below commit 59af65e1bcfeb605f1e416fc6b603f17241cba16 Author: 悟空 <rainchan...@163.com> AuthorDate: Sat Jul 5 12:34:51 2025 +0800 fix: adc backend server on different mode (#2455) --- internal/provider/adc/config.go | 53 +++++++++++++++++++++--------------- test/e2e/crds/gatewayproxy.go | 18 ++++++++++++ test/e2e/framework/k8s.go | 6 ++-- test/e2e/gatewayapi/httproute.go | 34 ++++------------------- test/e2e/scaffold/apisix_deployer.go | 24 ++++++++-------- test/e2e/scaffold/scaffold.go | 24 ++++++++++------ 6 files changed, 87 insertions(+), 72 deletions(-) diff --git a/internal/provider/adc/config.go b/internal/provider/adc/config.go index ec6d94fc..7eb55fc5 100644 --- a/internal/provider/adc/config.go +++ b/internal/provider/adc/config.go @@ -92,31 +92,40 @@ func (d *adcClient) getConfigsForGatewayProxy(tctx *provider.TranslateContext, g if !ok { return nil, fmt.Errorf("no service found for service reference: %s", namespacedName) } - endpoint := tctx.EndpointSlices[namespacedName] - if endpoint == nil { - return nil, nil - } - upstreamNodes, err := d.translator.TranslateBackendRefWithFilter(tctx, gatewayv1.BackendRef{ - BackendObjectReference: gatewayv1.BackendObjectReference{ - Name: gatewayv1.ObjectName(provider.ControlPlane.Service.Name), - Namespace: (*gatewayv1.Namespace)(&gatewayProxy.Namespace), - Port: ptr.To(gatewayv1.PortNumber(provider.ControlPlane.Service.Port)), - }, - }, func(endpoint *discoveryv1.Endpoint) bool { - if endpoint.Conditions.Terminating != nil && *endpoint.Conditions.Terminating { - log.Debugw("skip terminating endpoint", zap.Any("endpoint", endpoint)) - return false + + // APISIXStandalone, configurations need to be sent to each data plane instance; + // In other cases, the service is directly accessed as the adc backend server address. + if d.BackendMode == BackendModeAPISIXStandalone { + endpoint := tctx.EndpointSlices[namespacedName] + if endpoint == nil { + return nil, nil + } + upstreamNodes, err := d.translator.TranslateBackendRefWithFilter(tctx, gatewayv1.BackendRef{ + BackendObjectReference: gatewayv1.BackendObjectReference{ + Name: gatewayv1.ObjectName(provider.ControlPlane.Service.Name), + Namespace: (*gatewayv1.Namespace)(&gatewayProxy.Namespace), + Port: ptr.To(gatewayv1.PortNumber(provider.ControlPlane.Service.Port)), + }, + }, func(endpoint *discoveryv1.Endpoint) bool { + if endpoint.Conditions.Terminating != nil && *endpoint.Conditions.Terminating { + log.Debugw("skip terminating endpoint", zap.Any("endpoint", endpoint)) + return false + } + return true + }) + if err != nil { + return nil, err + } + for _, node := range upstreamNodes { + config.ServerAddrs = append(config.ServerAddrs, "http://"+net.JoinHostPort(node.Host, strconv.Itoa(node.Port))) + } + } else { + config.ServerAddrs = []string{ + fmt.Sprintf("http://%s.%s:%d", provider.ControlPlane.Service.Name, gatewayProxy.Namespace, provider.ControlPlane.Service.Port), } - return true - }) - if err != nil { - return nil, err - } - for _, node := range upstreamNodes { - config.ServerAddrs = append(config.ServerAddrs, "http://"+net.JoinHostPort(node.Host, strconv.Itoa(node.Port))) } - log.Debugf("add server address to config.ServiceAddrs: %v", config.ServerAddrs) + log.Debugw("add server address to config.ServiceAddrs", zap.Strings("config.ServerAddrs", config.ServerAddrs)) } return &config, nil diff --git a/test/e2e/crds/gatewayproxy.go b/test/e2e/crds/gatewayproxy.go index 57098df4..70773f6f 100644 --- a/test/e2e/crds/gatewayproxy.go +++ b/test/e2e/crds/gatewayproxy.go @@ -30,6 +30,7 @@ import ( "k8s.io/apimachinery/pkg/util/wait" "k8s.io/utils/ptr" + "github.com/apache/apisix-ingress-controller/internal/provider/adc" "github.com/apache/apisix-ingress-controller/test/e2e/framework" "github.com/apache/apisix-ingress-controller/test/e2e/scaffold" ) @@ -173,4 +174,21 @@ spec: } }) }) + + Context("Backend server", func() { + It("backend server on apisix/apisix-standalone mode", func() { + var ( + keyword string + ) + + if framework.ProviderType == adc.BackendModeAPISIX { + keyword = fmt.Sprintf(`{"config.ServerAddrs": ["%s"]}`, s.Deployer.GetAdminEndpoint()) + } else { + keyword = fmt.Sprintf(`{"config.ServerAddrs": ["http://%s:9180"]}`, s.GetPodIP(s.Namespace(), "app.kubernetes.io/name=apisix")) + } + + By(fmt.Sprintf("wait for keyword: %s", keyword)) + s.WaitControllerManagerLog(keyword, 60, time.Minute) + }) + }) }) diff --git a/test/e2e/framework/k8s.go b/test/e2e/framework/k8s.go index 4848b62d..3fb71598 100644 --- a/test/e2e/framework/k8s.go +++ b/test/e2e/framework/k8s.go @@ -201,8 +201,9 @@ func (f *Framework) Scale(name string, replicas int32) { fmt.Sprintf("ensure service %s/%s has %v endpoints failed", _namespace, name, replicas)) } -func (f *Framework) GetPodIP(selector string) string { - pods := f.GetPods("", selector) +func (f *Framework) GetPodIP(namespace, selector string) string { + pods := f.GetPods(namespace, selector) + f.GomegaT.Expect(pods).ShouldNot(BeEmpty()) return pods[0].Status.PodIP } @@ -211,7 +212,6 @@ func (f *Framework) GetPods(namespace, selector string) []corev1.Pod { LabelSelector: selector, }) f.GomegaT.Expect(err).ShouldNot(HaveOccurred()) - f.GomegaT.Expect(podList.Items).ShouldNot(BeEmpty()) return podList.Items } diff --git a/test/e2e/gatewayapi/httproute.go b/test/e2e/gatewayapi/httproute.go index ae487e93..6ac6f262 100644 --- a/test/e2e/gatewayapi/httproute.go +++ b/test/e2e/gatewayapi/httproute.go @@ -34,7 +34,6 @@ import ( "sigs.k8s.io/gateway-api/apis/v1alpha2" "github.com/apache/apisix-ingress-controller/api/v1alpha1" - "github.com/apache/apisix-ingress-controller/internal/provider/adc" "github.com/apache/apisix-ingress-controller/test/e2e/framework" "github.com/apache/apisix-ingress-controller/test/e2e/scaffold" ) @@ -42,9 +41,7 @@ import ( var _ = Describe("Test HTTPRoute", Label("networking.k8s.io", "httproute"), func() { s := scaffold.NewDefaultScaffold() - getGatewayProxySpec := func(endpoint, adminKey string) string { - if framework.ProviderType == adc.BackendModeAPISIXStandalone { - var gatewayProxyYaml = ` + var gatewayProxyYaml = ` apiVersion: apisix.apache.org/v1alpha1 kind: GatewayProxy metadata: @@ -54,32 +51,15 @@ spec: type: ControlPlane controlPlane: service: - name: apisix-standalone + name: %s port: 9180 auth: type: AdminKey adminKey: value: "%s" ` - return fmt.Sprintf(gatewayProxyYaml, adminKey) - } - var gatewayProxyYaml = ` -apiVersion: apisix.apache.org/v1alpha1 -kind: GatewayProxy -metadata: - name: apisix-proxy-config -spec: - provider: - type: ControlPlane - controlPlane: - endpoints: - - %s - auth: - type: AdminKey - adminKey: - value: "%s" -` - return fmt.Sprintf(gatewayProxyYaml, endpoint, adminKey) + getGatewayProxySpec := func() string { + return fmt.Sprintf(gatewayProxyYaml, framework.ProviderType, s.AdminKey()) } var gatewayClassYaml = ` @@ -153,8 +133,7 @@ spec: var beforeEachHTTP = func() { By("create GatewayProxy") - gatewayProxy := getGatewayProxySpec(s.Deployer.GetAdminEndpoint(), s.AdminKey()) - err := s.CreateResourceFromString(gatewayProxy) + err := s.CreateResourceFromString(getGatewayProxySpec()) Expect(err).NotTo(HaveOccurred(), "creating GatewayProxy") time.Sleep(5 * time.Second) @@ -184,8 +163,7 @@ spec: var beforeEachHTTPS = func() { By("create GatewayProxy") - gatewayProxy := getGatewayProxySpec(s.Deployer.GetAdminEndpoint(), s.AdminKey()) - err := s.CreateResourceFromString(gatewayProxy) + err := s.CreateResourceFromString(getGatewayProxySpec()) Expect(err).NotTo(HaveOccurred(), "creating GatewayProxy") time.Sleep(5 * time.Second) diff --git a/test/e2e/scaffold/apisix_deployer.go b/test/e2e/scaffold/apisix_deployer.go index a0e2d531..67f20a86 100644 --- a/test/e2e/scaffold/apisix_deployer.go +++ b/test/e2e/scaffold/apisix_deployer.go @@ -168,14 +168,12 @@ func (s *APISIXDeployer) DeployDataplane(deployOpts DeployDataplaneOptions) { opts.Replicas = deployOpts.Replicas } - for _, tunnel := range []*k8s.Tunnel{ - s.adminTunnel, - s.apisixHttpTunnel, - s.apisixHttpsTunnel, + for _, close := range []func(){ + s.closeAdminTunnel, + s.closeApisixHttpTunnel, + s.closeApisixHttpsTunnel, } { - if tunnel != nil { - tunnel.Close() - } + close() } svc := s.deployDataplane(&opts) @@ -302,14 +300,18 @@ func (s *APISIXDeployer) createAdminTunnel(svc *corev1.Service) (*k8s.Tunnel, er if err := adminTunnel.ForwardPortE(s.t); err != nil { return nil, err } - s.addFinalizers(func() { - adminTunnel.Close() - s.adminTunnel = nil - }) + s.addFinalizers(s.closeAdminTunnel) return adminTunnel, nil } +func (s *APISIXDeployer) closeAdminTunnel() { + if s.adminTunnel != nil { + s.adminTunnel.Close() + s.adminTunnel = nil + } +} + func (s *APISIXDeployer) CreateAdditionalGateway(namePrefix string) (string, *corev1.Service, error) { // Create a new namespace for this additional gateway additionalNS := fmt.Sprintf("%s-%d", namePrefix, time.Now().Unix()) diff --git a/test/e2e/scaffold/scaffold.go b/test/e2e/scaffold/scaffold.go index f2f97a2d..fe533a82 100644 --- a/test/e2e/scaffold/scaffold.go +++ b/test/e2e/scaffold/scaffold.go @@ -313,23 +313,31 @@ func (s *Scaffold) createDataplaneTunnels( if err := httpTunnel.ForwardPortE(s.t); err != nil { return nil, nil, err } - s.addFinalizers(func() { - httpTunnel.Close() - s.apisixHttpTunnel = nil - }) + s.addFinalizers(s.closeApisixHttpTunnel) if err := httpsTunnel.ForwardPortE(s.t); err != nil { httpTunnel.Close() return nil, nil, err } - s.addFinalizers(func() { - httpsTunnel.Close() - s.apisixHttpsTunnel = nil - }) + s.addFinalizers(s.closeApisixHttpsTunnel) return httpTunnel, httpsTunnel, nil } +func (s *Scaffold) closeApisixHttpTunnel() { + if s.apisixHttpTunnel != nil { + s.apisixHttpTunnel.Close() + s.apisixHttpTunnel = nil + } +} + +func (s *Scaffold) closeApisixHttpsTunnel() { + if s.apisixHttpsTunnel != nil { + s.apisixHttpsTunnel.Close() + s.apisixHttpsTunnel = nil + } +} + // GetAdditionalGateway returns resources associated with a specific gateway func (s *Scaffold) GetAdditionalGateway(identifier string) (*GatewayResources, bool) { resources, exists := s.additionalGateways[identifier]