blob: 4ecc8c19ee2e1956e4eb9a449aec3dda862dcfd9 [file] [log] [blame]
// 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 gatewayapi
import (
"fmt"
"time"
. "github.com/onsi/ginkgo/v2"
. "github.com/onsi/gomega"
"github.com/apache/apisix-ingress-controller/test/e2e/scaffold"
)
var _ = Describe("Test GatewayClass", Label("networking.k8s.io", "gatewayclass"), func() {
s := scaffold.NewDefaultScaffold()
Context("Create GatewayClass", func() {
var defautlGatewayClass = `
apiVersion: gateway.networking.k8s.io/v1
kind: GatewayClass
metadata:
name: %s
spec:
controllerName: "%s"
`
var noGatewayClass = `
apiVersion: gateway.networking.k8s.io/v1
kind: GatewayClass
metadata:
name: apisix-not-accepeted
spec:
controllerName: "apisix.apache.org/not-exist"
`
const defaultGateway = `
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
name: %s
spec:
gatewayClassName: %s
listeners:
- name: http1
protocol: HTTP
port: 80
`
It("Create GatewayClass", func() {
gatewayClassName := s.Namespace()
By("create default GatewayClass")
err := s.CreateResourceFromString(fmt.Sprintf(defautlGatewayClass, gatewayClassName, s.GetControllerName()))
Expect(err).NotTo(HaveOccurred(), "creating GatewayClass")
time.Sleep(5 * time.Second)
gcyaml, err := s.GetResourceYaml("GatewayClass", gatewayClassName)
Expect(err).NotTo(HaveOccurred(), "getting GatewayClass yaml")
Expect(gcyaml).To(ContainSubstring(`status: "True"`), "checking GatewayClass condition status")
Expect(gcyaml).To(ContainSubstring("message: the gatewayclass has been accepted by the apisix-ingress-controller"), "checking GatewayClass condition message")
By("create GatewayClass with not accepted")
err = s.CreateResourceFromString(noGatewayClass)
Expect(err).NotTo(HaveOccurred(), "creating GatewayClass")
time.Sleep(5 * time.Second)
gcyaml, err = s.GetResourceYaml("GatewayClass", "apisix-not-accepeted")
Expect(err).NotTo(HaveOccurred(), "getting GatewayClass yaml")
Expect(gcyaml).To(ContainSubstring(`status: Unknown`), "checking GatewayClass condition status")
Expect(gcyaml).To(ContainSubstring("message: Waiting for controller"), "checking GatewayClass condition message")
})
It("Delete GatewayClass", func() {
gatewayClassName := s.Namespace()
By("create default GatewayClass")
err := s.CreateResourceFromString(fmt.Sprintf(defautlGatewayClass, gatewayClassName, s.GetControllerName()))
Expect(err).NotTo(HaveOccurred(), "creating GatewayClass")
Eventually(func() string {
spec, err := s.GetResourceYaml("GatewayClass", gatewayClassName)
Expect(err).NotTo(HaveOccurred(), "get resource yaml")
return spec
}).WithTimeout(20 * time.Second).ProbeEvery(time.Second).Should(ContainSubstring(`status: "True"`))
By("create a Gateway")
gatewayName := s.Namespace()
err = s.CreateResourceFromString(fmt.Sprintf(defaultGateway, gatewayName, gatewayClassName))
Expect(err).NotTo(HaveOccurred(), "creating Gateway")
time.Sleep(time.Second)
By("try to delete the GatewayClass")
_, err = s.RunKubectlAndGetOutput("delete", "GatewayClass", gatewayClassName, "--wait=false")
Expect(err).NotTo(HaveOccurred())
_, err = s.GetResourceYaml("GatewayClass", gatewayClassName)
Expect(err).NotTo(HaveOccurred(), "get resource yaml")
output, err := s.RunKubectlAndGetOutput("describe", "GatewayClass", gatewayClassName)
Expect(err).NotTo(HaveOccurred(), "describe GatewayClass apisix")
Expect(output).To(And(
ContainSubstring("Warning"),
ContainSubstring("DeletionBlocked"),
ContainSubstring("gatewayclass-controller"),
ContainSubstring("the GatewayClass is still used by Gateways"),
))
By("delete the Gateway")
err = s.DeleteResource("Gateway", gatewayName)
Expect(err).NotTo(HaveOccurred(), "deleting Gateway")
time.Sleep(time.Second)
By("try to delete the GatewayClass again")
err = s.DeleteResource("GatewayClass", gatewayClassName)
Expect(err).NotTo(HaveOccurred())
_, err = s.GetResourceYaml("GatewayClass", gatewayClassName)
Expect(err).To(HaveOccurred(), "get resource yaml")
Expect(err.Error()).To(ContainSubstring("not found"))
})
})
})