kuma
189 строк · 5.4 Кб
1package gateway
2
3import (
4"fmt"
5"net"
6
7. "github.com/onsi/ginkgo/v2"
8. "github.com/onsi/gomega"
9
10. "github.com/kumahq/kuma/test/framework"
11"github.com/kumahq/kuma/test/framework/client"
12"github.com/kumahq/kuma/test/framework/deployments/democlient"
13"github.com/kumahq/kuma/test/framework/deployments/testserver"
14"github.com/kumahq/kuma/test/framework/envs/kubernetes"
15)
16
17func Resources() {
18meshName := "gateway-resources"
19gatewayName := "resources-edge-gateway"
20namespace := "gateway-resources"
21waitingClientNamespace := "gateway-resources-client-wait"
22curlingClientNamespace := "gateway-resources-client-curl"
23
24meshGatewayWithoutLimit := fmt.Sprintf(`
25apiVersion: kuma.io/v1alpha1
26kind: MeshGateway
27metadata:
28name: %s
29mesh: %s
30spec:
31selectors:
32- match:
33kuma.io/service: %s
34conf:
35listeners:
36- port: 8080
37protocol: HTTP
38`, gatewayName, meshName, gatewayName)
39
40meshGatewayWithLimit := fmt.Sprintf(`
41apiVersion: kuma.io/v1alpha1
42kind: MeshGateway
43metadata:
44name: %s
45mesh: %s
46spec:
47selectors:
48- match:
49kuma.io/service: %s
50conf:
51listeners:
52- port: 8080
53protocol: HTTP
54resources:
55connectionLimit: 1
56`, gatewayName, meshName, gatewayName)
57
58serverSvc := fmt.Sprintf("test-server_%s_svc_80", namespace)
59
60httpRoute := fmt.Sprintf(`
61apiVersion: kuma.io/v1alpha1
62kind: MeshGatewayRoute
63metadata:
64name: %s
65mesh: %s
66spec:
67selectors:
68- match:
69kuma.io/service: %s
70conf:
71http:
72rules:
73- matches:
74- path:
75match: PREFIX
76value: /
77backends:
78- destination:
79kuma.io/service: %s
80`, gatewayName, meshName, gatewayName, serverSvc)
81
82BeforeAll(func() {
83err := NewClusterSetup().
84Install(MTLSMeshKubernetes(meshName)).
85Install(NamespaceWithSidecarInjection(namespace)).
86Install(Namespace(waitingClientNamespace)).
87Install(Namespace(curlingClientNamespace)).
88Install(MeshTrafficPermissionAllowAllKubernetes(meshName)).
89Install(democlient.Install(democlient.WithNamespace(waitingClientNamespace), democlient.WithMesh(meshName))).
90Install(democlient.Install(democlient.WithNamespace(curlingClientNamespace), democlient.WithMesh(meshName))).
91Install(YamlK8s(meshGatewayWithoutLimit)).
92Install(YamlK8s(MkGatewayInstance(gatewayName, namespace, meshName))).
93Install(YamlK8s(httpRoute)).
94Install(testserver.Install(
95testserver.WithMesh(meshName),
96testserver.WithNamespace(namespace),
97testserver.WithName("test-server"),
98testserver.WithEchoArgs("echo", "--instance", "kubernetes"),
99)).
100Setup(kubernetes.Cluster)
101Expect(err).ToNot(HaveOccurred())
102})
103
104E2EAfterAll(func() {
105Expect(kubernetes.Cluster.TriggerDeleteNamespace(namespace)).To(Succeed())
106Expect(kubernetes.Cluster.TriggerDeleteNamespace(waitingClientNamespace)).To(Succeed())
107Expect(kubernetes.Cluster.TriggerDeleteNamespace(curlingClientNamespace)).To(Succeed())
108Expect(kubernetes.Cluster.DeleteMesh(meshName)).To(Succeed())
109})
110
111gatewayHost := fmt.Sprintf("%s.%s", gatewayName, namespace)
112target := fmt.Sprintf("http://%s", net.JoinHostPort(gatewayHost, "8080"))
113
114keepConnectionOpen := func() {
115// Open TCP connections to the gateway
116defer GinkgoRecover()
117
118demoClientPod, err := PodNameOfApp(kubernetes.Cluster, "demo-client", waitingClientNamespace)
119Expect(err).ToNot(HaveOccurred())
120
121cmd := []string{"telnet", gatewayHost, "8080"}
122// We pass in a stdin that blocks so that telnet will keep the
123// connection open
124_, _, _ = kubernetes.Cluster.ExecWithOptions(ExecOptions{
125Command: cmd,
126Namespace: waitingClientNamespace,
127PodName: demoClientPod,
128ContainerName: "demo-client",
129Stdin: &BlockingReader{},
130CaptureStdout: true,
131CaptureStderr: true,
132PreserveWhitespace: false,
133})
134}
135
136Specify("connection limit is respected", func() {
137By("allowing connections without a limit")
138
139Eventually(func(g Gomega) {
140response, err := client.CollectEchoResponse(
141kubernetes.Cluster, "demo-client", target,
142client.FromKubernetesPod(curlingClientNamespace, "demo-client"),
143)
144
145g.Expect(err).ToNot(HaveOccurred())
146g.Expect(response.Instance).To(Equal("kubernetes"))
147}, "20s", "1s").Should(Succeed())
148
149By("allowing more than 1 connection without a limit")
150
151go keepConnectionOpen()
152
153Eventually(func(g Gomega) {
154_, err := client.CollectEchoResponse(
155kubernetes.Cluster, "demo-client", target,
156client.FromKubernetesPod(curlingClientNamespace, "demo-client"),
157)
158
159g.Expect(err).ToNot(HaveOccurred())
160}).Should(Succeed())
161Consistently(func(g Gomega) {
162response, err := client.CollectEchoResponse(
163kubernetes.Cluster, "demo-client", target,
164client.FromKubernetesPod(curlingClientNamespace, "demo-client"),
165)
166
167g.Expect(err).ToNot(HaveOccurred())
168g.Expect(response.Instance).To(Equal("kubernetes"))
169}, "40s", "1s").Should(Succeed())
170
171By("not allowing more than 1 connection with a limit of 1")
172
173Expect(kubernetes.Cluster.Install(YamlK8s(meshGatewayWithLimit))).To(Succeed())
174
175Expect(kubernetes.Cluster.KillAppPod("demo-client", waitingClientNamespace)).To(Succeed())
176
177go keepConnectionOpen()
178
179Eventually(func(g Gomega) {
180response, err := client.CollectFailure(
181kubernetes.Cluster, "demo-client", target,
182client.FromKubernetesPod(curlingClientNamespace, "demo-client"),
183)
184
185g.Expect(err).ToNot(HaveOccurred())
186g.Expect(response.Exitcode).To(Or(Equal(52), Equal(56)))
187}, "40s", "1s").Should(Succeed())
188})
189}
190