kuma
135 строк · 3.3 Кб
1package gateway
2
3import (
4"fmt"
5"net"
6"net/url"
7"path"
8"strconv"
9"strings"
10
11"github.com/gruntwork-io/terratest/modules/k8s"
12. "github.com/onsi/ginkgo/v2"
13. "github.com/onsi/gomega"
14metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
15
16. "github.com/kumahq/kuma/test/framework"
17"github.com/kumahq/kuma/test/framework/client"
18"github.com/kumahq/kuma/test/framework/envs/kubernetes"
19)
20
21func SuccessfullyProxyRequestToGateway(cluster Cluster, instance string, gatewayAddr string, namespace string) func(Gomega) {
22return func(g Gomega) {
23target := fmt.Sprintf("http://%s/%s",
24gatewayAddr, path.Join("test", url.PathEscape(GinkgoT().Name())),
25)
26
27response, err := client.CollectEchoResponse(
28cluster, "demo-client", target,
29client.FromKubernetesPod(namespace, "demo-client"),
30)
31
32g.Expect(err).ToNot(HaveOccurred())
33g.Expect(response.Instance).To(Equal(instance))
34}
35}
36
37func FailToProxyRequestToGateway(cluster Cluster, gatewayAddr string, namespace string) func(Gomega) {
38return func(g Gomega) {
39Logf("expecting failure from %q", gatewayAddr)
40target := fmt.Sprintf("http://%s/%s",
41gatewayAddr, path.Join("test", url.PathEscape(GinkgoT().Name())),
42)
43
44response, err := client.CollectFailure(
45cluster, "demo-client", target,
46client.FromKubernetesPod(namespace, "demo-client"),
47)
48
49g.Expect(err).ToNot(HaveOccurred())
50g.Expect(response.Exitcode).To(Or(Equal(56), Equal(7), Equal(28)))
51}
52}
53
54func mkGateway(resourceName, serviceName, mesh string, crossMesh bool, hostname, backendService string, port int) string {
55meshGateway := fmt.Sprintf(`
56apiVersion: kuma.io/v1alpha1
57kind: MeshGateway
58metadata:
59name: %s
60mesh: %s
61spec:
62selectors:
63- match:
64kuma.io/service: %s
65conf:
66listeners:
67- port: %d
68protocol: HTTP
69crossMesh: %t
70hostname: %s
71`, resourceName, mesh, serviceName, port, crossMesh, hostname)
72
73route := fmt.Sprintf(`
74apiVersion: kuma.io/v1alpha1
75kind: MeshGatewayRoute
76metadata:
77name: %s
78mesh: %s
79spec:
80selectors:
81- match:
82kuma.io/service: %s
83conf:
84http:
85rules:
86- matches:
87- path:
88match: PREFIX
89value: /
90backends:
91- destination:
92kuma.io/service: %s # Matches the echo-server we deployed.
93`, resourceName, mesh, serviceName, backendService)
94return strings.Join([]string{meshGateway, route}, "\n---\n")
95}
96
97func MkGatewayInstance(name, namespace, mesh string) string {
98instance := fmt.Sprintf(`
99apiVersion: kuma.io/v1alpha1
100kind: MeshGatewayInstance
101metadata:
102name: %s
103namespace: %s
104labels:
105kuma.io/mesh: %s
106spec:
107replicas: 1
108serviceType: ClusterIP
109tags:
110kuma.io/service: %s
111`, name, namespace, mesh, name)
112
113return instance
114}
115
116func gatewayAddress(instanceName, instanceNamespace string, port int) string {
117services, err := k8s.ListServicesE(kubernetes.Cluster.GetTesting(), kubernetes.Cluster.GetKubectlOptions(instanceNamespace), metav1.ListOptions{})
118Expect(err).ToNot(HaveOccurred())
119
120var rawIP string
121
122// Find the service that is owned by the named GatewayInstance.
123for _, svc := range services {
124for _, ref := range svc.GetOwnerReferences() {
125if ref.Kind == "MeshGatewayInstance" && ref.Name == instanceName {
126rawIP = svc.Spec.ClusterIP
127}
128}
129}
130
131ip := net.ParseIP(rawIP)
132Expect(ip).ToNot(BeNil(), "invalid clusterIP for gateway")
133
134return net.JoinHostPort(rawIP, strconv.Itoa(port))
135}
136