kuma
382 строки · 10.6 Кб
1package meshtcproute
2
3import (
4"fmt"
5
6. "github.com/onsi/ginkgo/v2"
7. "github.com/onsi/gomega"
8
9core_mesh "github.com/kumahq/kuma/pkg/core/resources/apis/mesh"
10"github.com/kumahq/kuma/pkg/plugins/policies/meshtcproute/api/v1alpha1"
11. "github.com/kumahq/kuma/test/framework"
12"github.com/kumahq/kuma/test/framework/client"
13"github.com/kumahq/kuma/test/framework/deployments/testserver"
14"github.com/kumahq/kuma/test/framework/envs/kubernetes"
15)
16
17func Test() {
18meshName := "meshtcproute"
19namespace := "meshtcproute"
20
21BeforeAll(func() {
22Expect(NewClusterSetup().
23Install(MeshKubernetes(meshName)).
24Install(NamespaceWithSidecarInjection(namespace)).
25Install(testserver.Install(
26testserver.WithName("test-client"),
27testserver.WithMesh(meshName),
28testserver.WithNamespace(namespace),
29)).
30Install(testserver.Install(
31testserver.WithName("test-http-server"),
32testserver.WithMesh(meshName),
33testserver.WithNamespace(namespace),
34)).
35Install(testserver.Install(
36testserver.WithName("test-http-server-2"),
37testserver.WithMesh(meshName),
38testserver.WithNamespace(namespace),
39)).
40Install(testserver.Install(
41testserver.WithName("test-tcp-server"),
42testserver.WithServicePortAppProtocol("tcp"),
43testserver.WithMesh(meshName),
44testserver.WithNamespace(namespace),
45)).
46Install(testserver.Install(
47testserver.WithName("external-http-service"),
48testserver.WithNamespace(namespace),
49)).
50Install(testserver.Install(
51testserver.WithName("external-tcp-service"),
52testserver.WithNamespace(namespace),
53)).
54Setup(kubernetes.Cluster),
55).To(Succeed())
56})
57
58E2EAfterEach(func() {
59Expect(DeleteMeshResources(
60kubernetes.Cluster,
61meshName,
62v1alpha1.MeshTCPRouteResourceTypeDescriptor,
63)).To(Succeed())
64Expect(DeleteMeshResources(
65kubernetes.Cluster,
66meshName,
67core_mesh.ExternalServiceResourceTypeDescriptor,
68)).To(Succeed())
69})
70
71E2EAfterAll(func() {
72Expect(kubernetes.Cluster.TriggerDeleteNamespace(namespace)).To(Succeed())
73Expect(kubernetes.Cluster.DeleteMesh(meshName)).To(Succeed())
74})
75
76It("should use MeshTCPRoute if no TrafficRoutes are present", func() {
77Eventually(func(g Gomega) {
78response, err := client.CollectEchoResponse(
79kubernetes.Cluster,
80"test-client",
81"test-http-server_meshtcproute_svc_80.mesh",
82client.FromKubernetesPod(namespace, "test-client"),
83)
84g.Expect(err).ToNot(HaveOccurred())
85g.Expect(response.Instance).To(HavePrefix("test-http-server"))
86}, "30s", "1s").Should(Succeed())
87})
88
89It("should split traffic between internal and external services "+
90"with mixed (tcp and http) protocols", func() {
91// given
92Expect(kubernetes.Cluster.Install(YamlK8s(fmt.Sprintf(`
93apiVersion: kuma.io/v1alpha1
94kind: ExternalService
95metadata:
96name: external-http-service-mtcpr
97mesh: %s
98spec:
99tags:
100kuma.io/service: external-http-service-mtcpr
101kuma.io/protocol: http
102networking:
103# .svc.cluster.local is needed, otherwise Kubernetes will resolve this
104# to the real IP
105address: external-http-service.%s.svc.cluster.local:80
106`, meshName, namespace)))).To(Succeed())
107
108Expect(kubernetes.Cluster.Install(YamlK8s(fmt.Sprintf(`
109apiVersion: kuma.io/v1alpha1
110kind: ExternalService
111metadata:
112name: external-tcp-service-mtcpr
113mesh: %s
114spec:
115tags:
116kuma.io/service: external-tcp-service-mtcpr
117kuma.io/protocol: tcp
118networking:
119# .svc.cluster.local is needed, otherwise Kubernetes will resolve this
120# to the real IP
121address: external-tcp-service.%s.svc.cluster.local:80
122`, meshName, namespace)))).To(Succeed())
123
124// when
125Expect(YamlK8s(fmt.Sprintf(`
126apiVersion: kuma.io/v1alpha1
127kind: MeshTCPRoute
128metadata:
129name: route-2
130namespace: %s
131labels:
132kuma.io/mesh: %s
133spec:
134targetRef:
135kind: MeshService
136name: test-client_%s_svc_80
137to:
138- targetRef:
139kind: MeshService
140name: test-http-server_meshtcproute_svc_80
141rules:
142- default:
143backendRefs:
144- kind: MeshService
145name: test-http-server_meshtcproute_svc_80
146weight: 25
147- kind: MeshService
148name: test-tcp-server_meshtcproute_svc_80
149weight: 25
150- kind: MeshService
151name: external-http-service-mtcpr
152weight: 25
153- kind: MeshService
154name: external-tcp-service-mtcpr
155weight: 25
156`, Config.KumaNamespace, meshName, meshName))(kubernetes.Cluster)).To(Succeed())
157
158// then receive responses from "test-http-server_meshtcproute_svc_80"
159Eventually(func(g Gomega) {
160response, err := client.CollectEchoResponse(
161kubernetes.Cluster,
162"test-client",
163"test-http-server_meshtcproute_svc_80.mesh",
164client.FromKubernetesPod(namespace, "test-client"),
165)
166g.Expect(err).ToNot(HaveOccurred())
167g.Expect(response.Instance).To(HavePrefix("test-http-server"))
168}, "30s", "1s").Should(Succeed())
169
170// then receive responses from "test-tcp-server_meshtcproute_svc_80"
171Eventually(func(g Gomega) {
172response, err := client.CollectEchoResponse(
173kubernetes.Cluster,
174"test-client",
175"test-http-server_meshtcproute_svc_80.mesh",
176client.FromKubernetesPod(namespace, "test-client"),
177)
178g.Expect(err).ToNot(HaveOccurred())
179g.Expect(response.Instance).To(HavePrefix("test-tcp-server"))
180}, "30s", "1s").Should(Succeed())
181
182// and then receive responses from "external-http-service"
183Eventually(func(g Gomega) {
184response, err := client.CollectEchoResponse(
185kubernetes.Cluster,
186"test-client",
187"test-http-server_meshtcproute_svc_80.mesh",
188client.FromKubernetesPod(namespace, "test-client"),
189)
190g.Expect(err).ToNot(HaveOccurred())
191g.Expect(response.Instance).To(HavePrefix("external-http-service"))
192}, "30s", "1s").Should(Succeed())
193
194// and then receive responses from "external-tcp-service"
195Eventually(func(g Gomega) {
196response, err := client.CollectEchoResponse(
197kubernetes.Cluster,
198"test-client",
199"test-http-server_meshtcproute_svc_80.mesh",
200client.FromKubernetesPod(namespace, "test-client"),
201)
202g.Expect(err).ToNot(HaveOccurred())
203g.Expect(response.Instance).To(HavePrefix("external-tcp-service"))
204}, "30s", "1s").Should(Succeed())
205})
206
207It("should use MeshHTTPRoute if both MeshTCPRoute and MeshHTTPRoute "+
208"are present and point to the same source and http destination", func() {
209// given
210Expect(kubernetes.Cluster.Install(YamlK8s(fmt.Sprintf(`
211apiVersion: kuma.io/v1alpha1
212kind: ExternalService
213metadata:
214name: external-tcp-service-mtcpr
215mesh: %s
216spec:
217tags:
218kuma.io/service: external-tcp-service
219kuma.io/protocol: tcp
220networking:
221# .svc.cluster.local is needed, otherwise Kubernetes will resolve this
222# to the real IP
223address: external-tcp-service.%s.svc.cluster.local:80
224`, meshName, namespace)))).To(Succeed())
225
226// when
227meshRoutes := func(meshName string, namespace string) string {
228meshHTTPRoute := fmt.Sprintf(`
229apiVersion: kuma.io/v1alpha1
230kind: MeshHTTPRoute
231metadata:
232name: http-route
233namespace: %s
234labels:
235kuma.io/mesh: %s
236spec:
237targetRef:
238kind: MeshService
239name: test-client_%s_svc_80
240to:
241- targetRef:
242kind: MeshService
243name: test-http-server_meshtcproute_svc_80
244rules:
245- matches:
246- path:
247type: PathPrefix
248value: "/"
249default:
250backendRefs:
251- kind: MeshService
252name: test-http-server-2_meshtcproute_svc_80
253`, Config.KumaNamespace, meshName, namespace)
254meshTCPRoute := fmt.Sprintf(`
255apiVersion: kuma.io/v1alpha1
256kind: MeshTCPRoute
257metadata:
258name: tcp-route
259namespace: %s
260labels:
261kuma.io/mesh: %s
262spec:
263targetRef:
264kind: MeshService
265name: test-client_%s_svc_80
266to:
267- targetRef:
268kind: MeshService
269name: test-http-server_meshtcproute_svc_80
270rules:
271- default:
272backendRefs:
273- kind: MeshService
274name: external-tcp-service
275`, Config.KumaNamespace, meshName, namespace)
276return fmt.Sprintf("%s\n---%s", meshTCPRoute, meshHTTPRoute)
277}
278
279Expect(YamlK8s(meshRoutes(meshName, namespace))(kubernetes.Cluster)).
280To(Succeed())
281
282// then
283Eventually(func(g Gomega) {
284response, err := client.CollectEchoResponse(
285kubernetes.Cluster,
286"test-client",
287"test-http-server_meshtcproute_svc_80.mesh",
288client.FromKubernetesPod(namespace, "test-client"),
289)
290g.Expect(err).ToNot(HaveOccurred())
291g.Expect(response.Instance).To(HavePrefix("test-http-server-2"))
292}, "30s", "1s").Should(Succeed())
293})
294
295It("should use MeshTCPRoute if both MeshTCPRoute and MeshHTTPRoute "+
296"are present and point to the same source and tcp destination", func() {
297// given
298Expect(kubernetes.Cluster.Install(YamlK8s(fmt.Sprintf(`
299apiVersion: kuma.io/v1alpha1
300kind: ExternalService
301metadata:
302name: external-tcp-service-mtcpr
303mesh: %s
304spec:
305tags:
306kuma.io/service: external-tcp-service
307kuma.io/protocol: tcp
308networking:
309# .svc.cluster.local is needed, otherwise Kubernetes will resolve this
310# to the real IP
311address: external-tcp-service.%s.svc.cluster.local:80
312`, meshName, namespace)))).To(Succeed())
313
314// when
315meshRoutes := func(meshName string, namespace string) string {
316meshHTTPRoute := fmt.Sprintf(`
317apiVersion: kuma.io/v1alpha1
318kind: MeshHTTPRoute
319metadata:
320name: http-route
321namespace: %s
322labels:
323kuma.io/mesh: %s
324spec:
325targetRef:
326kind: MeshService
327name: test-client_%s_svc_80
328to:
329- targetRef:
330kind: MeshService
331name: test-tcp-server_meshtcproute_svc_80
332rules:
333- matches:
334- path:
335type: PathPrefix
336value: "/"
337default:
338backendRefs:
339- kind: MeshService
340name: test-http-server-2_meshtcproute_svc_80
341`, Config.KumaNamespace, meshName, namespace)
342meshTCPRoute := fmt.Sprintf(`
343apiVersion: kuma.io/v1alpha1
344kind: MeshTCPRoute
345metadata:
346name: tcp-route
347namespace: %s
348labels:
349kuma.io/mesh: %s
350spec:
351targetRef:
352kind: MeshService
353name: test-client_%s_svc_80
354to:
355- targetRef:
356kind: MeshService
357name: test-tcp-server_meshtcproute_svc_80
358rules:
359- default:
360backendRefs:
361- kind: MeshService
362name: external-tcp-service
363`, Config.KumaNamespace, meshName, namespace)
364return fmt.Sprintf("%s\n---%s", meshTCPRoute, meshHTTPRoute)
365}
366
367Expect(YamlK8s(meshRoutes(meshName, namespace))(kubernetes.Cluster)).
368To(Succeed())
369
370// then
371Eventually(func(g Gomega) {
372response, err := client.CollectEchoResponse(
373kubernetes.Cluster,
374"test-client",
375"test-tcp-server_meshtcproute_svc_80.mesh",
376client.FromKubernetesPod(namespace, "test-client"),
377)
378g.Expect(err).ToNot(HaveOccurred())
379g.Expect(response.Instance).To(HavePrefix("external-tcp-service"))
380}, "30s", "1s").Should(Succeed())
381})
382}
383