kuma

Форк
0
142 строки · 4.1 Кб
1
package meshcircuitbreaker
2

3
import (
4
	"fmt"
5

6
	. "github.com/onsi/ginkgo/v2"
7
	. "github.com/onsi/gomega"
8

9
	"github.com/kumahq/kuma/pkg/plugins/policies/meshcircuitbreaker/api/v1alpha1"
10
	meshretry_api "github.com/kumahq/kuma/pkg/plugins/policies/meshretry/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/democlient"
14
	"github.com/kumahq/kuma/test/framework/deployments/testserver"
15
	"github.com/kumahq/kuma/test/framework/envs/kubernetes"
16
)
17

18
func MeshCircuitBreaker() {
19
	namespace := "meshcircuitbreaker-namespace"
20
	mesh := "meshcircuitbreaker"
21

22
	BeforeAll(func() {
23
		err := NewClusterSetup().
24
			Install(MeshKubernetes(mesh)).
25
			Install(NamespaceWithSidecarInjection(namespace)).
26
			Install(democlient.Install(democlient.WithNamespace(namespace), democlient.WithMesh(mesh))).
27
			Install(testserver.Install(testserver.WithMesh(mesh), testserver.WithNamespace(namespace))).
28
			Setup(kubernetes.Cluster)
29
		Expect(err).ToNot(HaveOccurred())
30

31
		// Delete the default meshretry policy
32
		Expect(DeleteMeshPolicyOrError(
33
			kubernetes.Cluster,
34
			meshretry_api.MeshRetryResourceTypeDescriptor,
35
			fmt.Sprintf("mesh-retry-all-%s", mesh),
36
		)).To(Succeed())
37

38
		Expect(DeleteMeshPolicyOrError(
39
			kubernetes.Cluster,
40
			v1alpha1.MeshCircuitBreakerResourceTypeDescriptor,
41
			fmt.Sprintf("mesh-circuit-breaker-all-%s", mesh),
42
		)).To(Succeed())
43
	})
44

45
	E2EAfterEach(func() {
46
		Expect(DeleteMeshResources(kubernetes.Cluster, mesh,
47
			v1alpha1.MeshCircuitBreakerResourceTypeDescriptor,
48
			meshretry_api.MeshRetryResourceTypeDescriptor,
49
		)).To(Succeed())
50
	})
51

52
	E2EAfterAll(func() {
53
		Expect(kubernetes.Cluster.TriggerDeleteNamespace(namespace)).To(Succeed())
54
		Expect(kubernetes.Cluster.DeleteMesh(mesh)).To(Succeed())
55
	})
56

57
	DescribeTable("should configure circuit breaker limits and outlier"+
58
		" detectors for connections", func(config string) {
59
		// given no MeshCircuitBreaker
60
		mcbs, err := kubernetes.Cluster.GetKumactlOptions().KumactlList("meshcircuitbreakers", mesh)
61
		Expect(err).ToNot(HaveOccurred())
62
		Expect(mcbs).To(BeEmpty())
63

64
		Eventually(func() ([]client.FailureResponse, error) {
65
			return client.CollectResponsesAndFailures(
66
				kubernetes.Cluster,
67
				"demo-client",
68
				fmt.Sprintf("test-server_%s_svc_80.mesh", namespace),
69
				client.FromKubernetesPod(namespace, "demo-client"),
70
				client.WithNumberOfRequests(10),
71
			)
72
		}, "30s", "1s").Should(And(
73
			HaveLen(10),
74
			HaveEach(HaveField("ResponseCode", 200)),
75
		))
76

77
		// when
78
		Expect(kubernetes.Cluster.Install(YamlK8s(config))).To(Succeed())
79

80
		// then
81
		Eventually(func(g Gomega) ([]client.FailureResponse, error) {
82
			return client.CollectResponsesAndFailures(
83
				kubernetes.Cluster,
84
				"demo-client",
85
				fmt.Sprintf("test-server_%s_svc_80.mesh", namespace),
86
				client.FromKubernetesPod(namespace, "demo-client"),
87
				client.WithNumberOfRequests(10),
88
				// increase processing time of a request to increase a probability of triggering maxPendingRequest limit
89
				client.WithHeader("x-set-response-delay-ms", "1000"),
90
				client.WithoutRetries(),
91
			)
92
		}, "30s", "1s").Should(And(
93
			HaveLen(10),
94
			ContainElement(HaveField("ResponseCode", 503)),
95
		))
96
	},
97
		Entry("outbound circuit breaker", fmt.Sprintf(`
98
apiVersion: kuma.io/v1alpha1
99
kind: MeshCircuitBreaker
100
metadata:
101
  name: mcb-outbound
102
  namespace: %s
103
  labels:
104
    kuma.io/mesh: %s
105
spec:
106
  targetRef:
107
    kind: Mesh
108
  to:
109
    - targetRef:
110
        kind: Mesh
111
      default:
112
        connectionLimits:
113
          maxConnectionPools: 1
114
          maxConnections: 1
115
          maxPendingRequests: 1
116
          maxRequests: 1
117
          maxRetries: 1
118
`, Config.KumaNamespace, mesh)),
119
		Entry("inbound circuit breaker", fmt.Sprintf(`
120
apiVersion: kuma.io/v1alpha1
121
kind: MeshCircuitBreaker
122
metadata:
123
  name: mcb-inbound
124
  namespace: %s
125
  labels:
126
    kuma.io/mesh: %s
127
spec:
128
  targetRef:
129
    kind: Mesh
130
  from:
131
    - targetRef:
132
        kind: Mesh
133
      default:
134
        connectionLimits:
135
          maxConnectionPools: 1
136
          maxConnections: 1
137
          maxPendingRequests: 1
138
          maxRequests: 1
139
          maxRetries: 1
140
`, Config.KumaNamespace, mesh)),
141
	)
142
}
143

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

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

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

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