blob: 17fe62f174e4f7a33a5f067d6cfc71bed8bf12d2 [file]
// 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 apisix
import (
"fmt"
"net/http"
. "github.com/onsi/ginkgo/v2"
. "github.com/onsi/gomega"
"github.com/apache/apisix-ingress-controller/test/e2e/framework"
"github.com/apache/apisix-ingress-controller/test/e2e/scaffold"
)
var _ = Describe("Test Multi-Mode Deployment", Label("networking.k8s.io", "ingress"), func() {
s := scaffold.NewDefaultScaffold()
Context("apisix and apisix-standalone", func() {
var ns1 string
var gatewayProxyYaml = `
apiVersion: apisix.apache.org/v1alpha1
kind: GatewayProxy
metadata:
name: apisix-proxy-config
spec:
provider:
type: ControlPlane
controlPlane:
mode: %s
service:
name: %s
port: 9180
auth:
type: AdminKey
adminKey:
value: "%s"
`
const ingressClassYaml = `
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
name: %s
spec:
controller: %s
parameters:
apiGroup: "apisix.apache.org"
kind: "GatewayProxy"
name: "apisix-proxy-config"
namespace: %s
scope: Namespace
`
var ingressHttpbin = `
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: httpbin
spec:
ingressClassName: %s
rules:
- host: httpbin.example
http:
paths:
- path: /get
pathType: Exact
backend:
service:
name: httpbin-service-e2e-test
port:
number: 80
`
var ingressHttpbin2 = `
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: httpbin2
spec:
ingressClassName: %s
rules:
- host: httpbin2.example
http:
paths:
- path: /get
pathType: Exact
backend:
service:
name: httpbin-service-e2e-test
port:
number: 80
`
It("apisix and apisix-standalone", func() {
gateway1, svc1, err := s.Deployer.CreateAdditionalGatewayWithOptions("multi-mode-v1", scaffold.DeployDataplaneOptions{
ProviderType: framework.ProviderTypeAPISIX,
})
Expect(err).NotTo(HaveOccurred(), "creating Additional Gateway")
resources1, exists := s.GetAdditionalGateway(gateway1)
Expect(exists).To(BeTrue(), "additional gateway group should exist")
ns1 = resources1.Namespace
By("create GatewayProxy for Additional Gateway")
err = s.CreateResourceFromStringWithNamespace(fmt.Sprintf(gatewayProxyYaml, framework.ProviderTypeAPISIX, svc1.Name, resources1.AdminAPIKey), resources1.Namespace)
Expect(err).NotTo(HaveOccurred(), "creating GatewayProxy for Additional Gateway")
By("create IngressClass for Additional Gateway")
err = s.CreateResourceFromStringWithNamespace(fmt.Sprintf(ingressClassYaml, ns1, s.GetControllerName(), resources1.Namespace), "")
Expect(err).NotTo(HaveOccurred(), "creating IngressClass for Additional Gateway")
gateway2, svc2, err := s.Deployer.CreateAdditionalGatewayWithOptions("multi-mode-v2", scaffold.DeployDataplaneOptions{
ProviderType: framework.ProviderTypeAPISIXStandalone,
})
Expect(err).NotTo(HaveOccurred(), "creating Additional Gateway")
resources2, exists := s.GetAdditionalGateway(gateway2)
Expect(exists).To(BeTrue(), "additional gateway group should exist")
ns2 := resources2.Namespace
By("create GatewayProxy for Additional Gateway")
err = s.CreateResourceFromStringWithNamespace(fmt.Sprintf(gatewayProxyYaml, framework.ProviderTypeAPISIXStandalone, svc2.Name, resources2.AdminAPIKey), resources2.Namespace)
Expect(err).NotTo(HaveOccurred(), "creating GatewayProxy for Additional Gateway")
By("create IngressClass for Additional Gateway")
err = s.CreateResourceFromStringWithNamespace(fmt.Sprintf(ingressClassYaml, ns2, s.GetControllerName(), resources2.Namespace), "")
Expect(err).NotTo(HaveOccurred(), "creating IngressClass for Additional Gateway")
Expect(s.CreateResourceFromString(fmt.Sprintf(ingressHttpbin, ns1))).ShouldNot(HaveOccurred(), "creating Ingress in ns1")
Expect(s.CreateResourceFromString(fmt.Sprintf(ingressHttpbin2, ns2))).ShouldNot(HaveOccurred(), "creating Ingress in ns2")
client1, err := s.NewAPISIXClientForGateway(gateway1)
Expect(err).NotTo(HaveOccurred(), "creating APISIX client for gateway1")
client2, err := s.NewAPISIXClientForGateway(gateway2)
Expect(err).NotTo(HaveOccurred(), "creating APISIX client for gateway2")
s.RequestAssert(&scaffold.RequestAssert{
Client: client1,
Method: "GET",
Path: "/get",
Host: "httpbin.example",
Check: scaffold.WithExpectedStatus(http.StatusOK),
})
s.RequestAssert(&scaffold.RequestAssert{
Client: client2,
Method: "GET",
Path: "/get",
Host: "httpbin.example",
Check: scaffold.WithExpectedStatus(http.StatusNotFound),
})
s.RequestAssert(&scaffold.RequestAssert{
Client: client1,
Method: "GET",
Path: "/get",
Host: "httpbin2.example",
Check: scaffold.WithExpectedStatus(http.StatusNotFound),
})
s.RequestAssert(&scaffold.RequestAssert{
Client: client2,
Method: "GET",
Path: "/get",
Host: "httpbin2.example",
Check: scaffold.WithExpectedStatus(http.StatusOK),
})
})
})
})