kuma

Форк
0
153 строки · 5.5 Кб
1
package inspect
2

3
import (
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

13
	api_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

20
func Inspect() {
21
	nsName := "inspect"
22
	meshName := "inspect"
23

24
	BeforeAll(func() {
25
		err := NewClusterSetup().
26
			Install(NamespaceWithSidecarInjection(nsName)).
27
			Install(MeshKubernetes(meshName)).
28
			Install(democlient.Install(democlient.WithNamespace(nsName), democlient.WithMesh(meshName))).
29
			Install(TimeoutKubernetes(meshName)).
30
			Setup(kubernetes.Cluster)
31
		Expect(err).ToNot(HaveOccurred())
32
		// remove default meshtimeout policies
33
		Expect(DeleteMeshPolicyOrError(
34
			kubernetes.Cluster,
35
			v1alpha1.MeshTimeoutResourceTypeDescriptor,
36
			fmt.Sprintf("mesh-timeout-all-%s", meshName),
37
		)).To(Succeed())
38
		Expect(DeleteMeshPolicyOrError(
39
			kubernetes.Cluster,
40
			v1alpha1.MeshTimeoutResourceTypeDescriptor,
41
			fmt.Sprintf("mesh-gateways-timeout-all-%s", meshName),
42
		)).To(Succeed())
43
	})
44

45
	E2EAfterAll(func() {
46
		Expect(kubernetes.Cluster.TriggerDeleteNamespace(nsName)).To(Succeed())
47
		Expect(kubernetes.Cluster.DeleteMesh(meshName)).To(Succeed())
48
	})
49

50
	It("should return bad request on invalid name(#4985)", func() {
51
		_, err := kubernetes.Cluster.GetKumactlOptions().RunKumactlAndGetOutput("inspect", "dataplane", "-m", meshName, "dummy-name", "--type=config-dump")
52
		Expect(err).To(HaveOccurred())
53
		Expect(err.Error()).To(ContainSubstring(`Bad Request (invalid format: name "dummy-name" must include namespace after the dot, ex. "name.namespace")`))
54
	})
55

56
	It("should return envoy config_dump", func() {
57
		// Synchronize on the dataplanes coming up.
58
		Eventually(func(g Gomega) {
59
			dataplanes, err := kubernetes.Cluster.GetKumactlOptions().KumactlList("dataplanes", meshName)
60
			g.Expect(err).ToNot(HaveOccurred())
61
			// Dataplane names are generated, so we check for a partial match.
62
			g.Expect(dataplanes).Should(ContainElement(ContainSubstring("demo-client")))
63
		}, "10s", "250ms").Should(Succeed())
64

65
		podName, err := PodNameOfApp(kubernetes.Cluster, "demo-client", nsName)
66
		Expect(err).ToNot(HaveOccurred())
67
		dataplaneName := fmt.Sprintf("%s.%s", podName, nsName)
68
		stdout, err := kubernetes.Cluster.GetKumactlOptions().RunKumactlAndGetOutput("inspect", "dataplane", "-m", meshName, dataplaneName, "--type=config-dump")
69
		Expect(err).ToNot(HaveOccurred())
70

71
		Expect(stdout).To(ContainSubstring(fmt.Sprintf(`"name": "demo-client_%s_svc"`, nsName)))
72
		Expect(stdout).To(ContainSubstring(`"name": "inbound:passthrough:ipv4"`))
73
		Expect(stdout).To(ContainSubstring(`"name": "inbound:passthrough:ipv6"`))
74
		Expect(stdout).To(ContainSubstring(`"name": "kuma:envoy:admin"`))
75
		Expect(stdout).To(ContainSubstring(`"name": "outbound:passthrough:ipv4"`))
76
		Expect(stdout).To(ContainSubstring(`"name": "outbound:passthrough:ipv6"`))
77
	})
78

79
	DescribeTable("should execute inspect of policies",
80
		func(policyType string, policyName string) {
81
			Eventually(func(g Gomega) {
82
				r, err := http.Get(kubernetes.Cluster.GetKuma().GetAPIServerAddress() + fmt.Sprintf("/meshes/%s/timeouts/timeout-all-%s/_resources/dataplanes", meshName, meshName))
83
				g.Expect(err).ToNot(HaveOccurred())
84
				defer r.Body.Close()
85
				g.Expect(r).To(HaveHTTPStatus(200))
86

87
				body, err := io.ReadAll(r.Body)
88
				g.Expect(err).ToNot(HaveOccurred())
89
				result := api_types.InspectDataplanesForPolicyResponse{}
90
				g.Expect(json.Unmarshal(body, &result)).To(Succeed())
91

92
				g.Expect(result.Items).To(HaveLen(1))
93
				g.Expect(result.Total).To(Equal(1))
94
				g.Expect(result.Items[0].Name).To(HavePrefix("demo-client-"))
95
			}, "30s", "1s").Should(Succeed())
96
		},
97
		Entry("of dataplanes", "timeouts", fmt.Sprintf("timeout-all-%s", meshName)),
98
	)
99

100
	It("should execute inspect rules of dataplane", func() {
101
		Expect(YamlK8s(fmt.Sprintf(`
102
apiVersion: kuma.io/v1alpha1
103
kind: MeshTimeout
104
metadata:
105
  name: mt1
106
  namespace: %s
107
  labels:
108
    kuma.io/mesh: %s
109
spec:
110
  targetRef:
111
    kind: Mesh
112
  to:
113
    - targetRef:
114
        kind: Mesh
115
      default:
116
        idleTimeout: 20s
117
        http:
118
          requestTimeout: 2s
119
          maxStreamDuration: 20s`, Config.KumaNamespace, meshName))(kubernetes.Cluster)).To(Succeed())
120
		Eventually(func(g Gomega) {
121
			dataplanes, err := kubernetes.Cluster.GetKumactlOptions().KumactlList("dataplanes", meshName)
122
			g.Expect(err).ToNot(HaveOccurred())
123
			clientDp := ""
124
			for _, dp := range dataplanes {
125
				if strings.Contains(dp, "demo-client") {
126
					clientDp = dp
127
					break
128
				}
129
			}
130
			Expect(clientDp).ToNot(BeEmpty(), "no demo-client dpp found")
131

132
			r, err := http.Get(kubernetes.Cluster.GetKuma().GetAPIServerAddress() + fmt.Sprintf("/meshes/%s/dataplanes/%s/_rules", meshName, clientDp))
133
			g.Expect(err).ToNot(HaveOccurred())
134
			defer r.Body.Close()
135
			g.Expect(r).To(HaveHTTPStatus(200))
136

137
			body, err := io.ReadAll(r.Body)
138
			g.Expect(err).ToNot(HaveOccurred())
139
			result := api_types.InspectRulesResponse{}
140
			g.Expect(json.Unmarshal(body, &result)).To(Succeed())
141

142
			g.Expect(result.Resource.Name).To(Equal(clientDp))
143
			g.Expect(result.Rules).ToNot(BeEmpty())
144
			for _, rule := range result.Rules {
145
				if rule.Type == "MeshTimeout" {
146
					g.Expect(rule.ToRules).ToNot(BeNil())
147
					g.Expect(*rule.ToRules).ToNot(BeEmpty())
148
					g.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

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.