kuma
153 строки · 5.5 Кб
1package inspect
2
3import (
4"encoding/json"
5"fmt"
6"io"
7"net/http"
8"strings"
9
10. "github.com/onsi/ginkgo/v2"
11. "github.com/onsi/gomega"
12
13api_types "github.com/kumahq/kuma/api/openapi/types"
14"github.com/kumahq/kuma/pkg/plugins/policies/meshtimeout/api/v1alpha1"
15. "github.com/kumahq/kuma/test/framework"
16"github.com/kumahq/kuma/test/framework/deployments/democlient"
17"github.com/kumahq/kuma/test/framework/envs/kubernetes"
18)
19
20func Inspect() {
21nsName := "inspect"
22meshName := "inspect"
23
24BeforeAll(func() {
25err := NewClusterSetup().
26Install(NamespaceWithSidecarInjection(nsName)).
27Install(MeshKubernetes(meshName)).
28Install(democlient.Install(democlient.WithNamespace(nsName), democlient.WithMesh(meshName))).
29Install(TimeoutKubernetes(meshName)).
30Setup(kubernetes.Cluster)
31Expect(err).ToNot(HaveOccurred())
32// remove default meshtimeout policies
33Expect(DeleteMeshPolicyOrError(
34kubernetes.Cluster,
35v1alpha1.MeshTimeoutResourceTypeDescriptor,
36fmt.Sprintf("mesh-timeout-all-%s", meshName),
37)).To(Succeed())
38Expect(DeleteMeshPolicyOrError(
39kubernetes.Cluster,
40v1alpha1.MeshTimeoutResourceTypeDescriptor,
41fmt.Sprintf("mesh-gateways-timeout-all-%s", meshName),
42)).To(Succeed())
43})
44
45E2EAfterAll(func() {
46Expect(kubernetes.Cluster.TriggerDeleteNamespace(nsName)).To(Succeed())
47Expect(kubernetes.Cluster.DeleteMesh(meshName)).To(Succeed())
48})
49
50It("should return bad request on invalid name(#4985)", func() {
51_, err := kubernetes.Cluster.GetKumactlOptions().RunKumactlAndGetOutput("inspect", "dataplane", "-m", meshName, "dummy-name", "--type=config-dump")
52Expect(err).To(HaveOccurred())
53Expect(err.Error()).To(ContainSubstring(`Bad Request (invalid format: name "dummy-name" must include namespace after the dot, ex. "name.namespace")`))
54})
55
56It("should return envoy config_dump", func() {
57// Synchronize on the dataplanes coming up.
58Eventually(func(g Gomega) {
59dataplanes, err := kubernetes.Cluster.GetKumactlOptions().KumactlList("dataplanes", meshName)
60g.Expect(err).ToNot(HaveOccurred())
61// Dataplane names are generated, so we check for a partial match.
62g.Expect(dataplanes).Should(ContainElement(ContainSubstring("demo-client")))
63}, "10s", "250ms").Should(Succeed())
64
65podName, err := PodNameOfApp(kubernetes.Cluster, "demo-client", nsName)
66Expect(err).ToNot(HaveOccurred())
67dataplaneName := fmt.Sprintf("%s.%s", podName, nsName)
68stdout, err := kubernetes.Cluster.GetKumactlOptions().RunKumactlAndGetOutput("inspect", "dataplane", "-m", meshName, dataplaneName, "--type=config-dump")
69Expect(err).ToNot(HaveOccurred())
70
71Expect(stdout).To(ContainSubstring(fmt.Sprintf(`"name": "demo-client_%s_svc"`, nsName)))
72Expect(stdout).To(ContainSubstring(`"name": "inbound:passthrough:ipv4"`))
73Expect(stdout).To(ContainSubstring(`"name": "inbound:passthrough:ipv6"`))
74Expect(stdout).To(ContainSubstring(`"name": "kuma:envoy:admin"`))
75Expect(stdout).To(ContainSubstring(`"name": "outbound:passthrough:ipv4"`))
76Expect(stdout).To(ContainSubstring(`"name": "outbound:passthrough:ipv6"`))
77})
78
79DescribeTable("should execute inspect of policies",
80func(policyType string, policyName string) {
81Eventually(func(g Gomega) {
82r, err := http.Get(kubernetes.Cluster.GetKuma().GetAPIServerAddress() + fmt.Sprintf("/meshes/%s/timeouts/timeout-all-%s/_resources/dataplanes", meshName, meshName))
83g.Expect(err).ToNot(HaveOccurred())
84defer r.Body.Close()
85g.Expect(r).To(HaveHTTPStatus(200))
86
87body, err := io.ReadAll(r.Body)
88g.Expect(err).ToNot(HaveOccurred())
89result := api_types.InspectDataplanesForPolicyResponse{}
90g.Expect(json.Unmarshal(body, &result)).To(Succeed())
91
92g.Expect(result.Items).To(HaveLen(1))
93g.Expect(result.Total).To(Equal(1))
94g.Expect(result.Items[0].Name).To(HavePrefix("demo-client-"))
95}, "30s", "1s").Should(Succeed())
96},
97Entry("of dataplanes", "timeouts", fmt.Sprintf("timeout-all-%s", meshName)),
98)
99
100It("should execute inspect rules of dataplane", func() {
101Expect(YamlK8s(fmt.Sprintf(`
102apiVersion: kuma.io/v1alpha1
103kind: MeshTimeout
104metadata:
105name: mt1
106namespace: %s
107labels:
108kuma.io/mesh: %s
109spec:
110targetRef:
111kind: Mesh
112to:
113- targetRef:
114kind: Mesh
115default:
116idleTimeout: 20s
117http:
118requestTimeout: 2s
119maxStreamDuration: 20s`, Config.KumaNamespace, meshName))(kubernetes.Cluster)).To(Succeed())
120Eventually(func(g Gomega) {
121dataplanes, err := kubernetes.Cluster.GetKumactlOptions().KumactlList("dataplanes", meshName)
122g.Expect(err).ToNot(HaveOccurred())
123clientDp := ""
124for _, dp := range dataplanes {
125if strings.Contains(dp, "demo-client") {
126clientDp = dp
127break
128}
129}
130Expect(clientDp).ToNot(BeEmpty(), "no demo-client dpp found")
131
132r, err := http.Get(kubernetes.Cluster.GetKuma().GetAPIServerAddress() + fmt.Sprintf("/meshes/%s/dataplanes/%s/_rules", meshName, clientDp))
133g.Expect(err).ToNot(HaveOccurred())
134defer r.Body.Close()
135g.Expect(r).To(HaveHTTPStatus(200))
136
137body, err := io.ReadAll(r.Body)
138g.Expect(err).ToNot(HaveOccurred())
139result := api_types.InspectRulesResponse{}
140g.Expect(json.Unmarshal(body, &result)).To(Succeed())
141
142g.Expect(result.Resource.Name).To(Equal(clientDp))
143g.Expect(result.Rules).ToNot(BeEmpty())
144for _, rule := range result.Rules {
145if rule.Type == "MeshTimeout" {
146g.Expect(rule.ToRules).ToNot(BeNil())
147g.Expect(*rule.ToRules).ToNot(BeEmpty())
148g.Expect((*rule.ToRules)[0].Origin[0].Name).To(Equal(fmt.Sprintf("mt1.%s", Config.KumaNamespace)))
149}
150}
151}, "30s", "1s").Should(Succeed())
152})
153}
154