kuma
142 строки · 4.1 Кб
1package meshcircuitbreaker2
3import (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"10meshretry_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
18func MeshCircuitBreaker() {19namespace := "meshcircuitbreaker-namespace"20mesh := "meshcircuitbreaker"21
22BeforeAll(func() {23err := NewClusterSetup().24Install(MeshKubernetes(mesh)).25Install(NamespaceWithSidecarInjection(namespace)).26Install(democlient.Install(democlient.WithNamespace(namespace), democlient.WithMesh(mesh))).27Install(testserver.Install(testserver.WithMesh(mesh), testserver.WithNamespace(namespace))).28Setup(kubernetes.Cluster)29Expect(err).ToNot(HaveOccurred())30
31// Delete the default meshretry policy32Expect(DeleteMeshPolicyOrError(33kubernetes.Cluster,34meshretry_api.MeshRetryResourceTypeDescriptor,35fmt.Sprintf("mesh-retry-all-%s", mesh),36)).To(Succeed())37
38Expect(DeleteMeshPolicyOrError(39kubernetes.Cluster,40v1alpha1.MeshCircuitBreakerResourceTypeDescriptor,41fmt.Sprintf("mesh-circuit-breaker-all-%s", mesh),42)).To(Succeed())43})44
45E2EAfterEach(func() {46Expect(DeleteMeshResources(kubernetes.Cluster, mesh,47v1alpha1.MeshCircuitBreakerResourceTypeDescriptor,48meshretry_api.MeshRetryResourceTypeDescriptor,49)).To(Succeed())50})51
52E2EAfterAll(func() {53Expect(kubernetes.Cluster.TriggerDeleteNamespace(namespace)).To(Succeed())54Expect(kubernetes.Cluster.DeleteMesh(mesh)).To(Succeed())55})56
57DescribeTable("should configure circuit breaker limits and outlier"+58" detectors for connections", func(config string) {59// given no MeshCircuitBreaker60mcbs, err := kubernetes.Cluster.GetKumactlOptions().KumactlList("meshcircuitbreakers", mesh)61Expect(err).ToNot(HaveOccurred())62Expect(mcbs).To(BeEmpty())63
64Eventually(func() ([]client.FailureResponse, error) {65return client.CollectResponsesAndFailures(66kubernetes.Cluster,67"demo-client",68fmt.Sprintf("test-server_%s_svc_80.mesh", namespace),69client.FromKubernetesPod(namespace, "demo-client"),70client.WithNumberOfRequests(10),71)72}, "30s", "1s").Should(And(73HaveLen(10),74HaveEach(HaveField("ResponseCode", 200)),75))76
77// when78Expect(kubernetes.Cluster.Install(YamlK8s(config))).To(Succeed())79
80// then81Eventually(func(g Gomega) ([]client.FailureResponse, error) {82return client.CollectResponsesAndFailures(83kubernetes.Cluster,84"demo-client",85fmt.Sprintf("test-server_%s_svc_80.mesh", namespace),86client.FromKubernetesPod(namespace, "demo-client"),87client.WithNumberOfRequests(10),88// increase processing time of a request to increase a probability of triggering maxPendingRequest limit89client.WithHeader("x-set-response-delay-ms", "1000"),90client.WithoutRetries(),91)92}, "30s", "1s").Should(And(93HaveLen(10),94ContainElement(HaveField("ResponseCode", 503)),95))96},97Entry("outbound circuit breaker", fmt.Sprintf(`98apiVersion: kuma.io/v1alpha1
99kind: MeshCircuitBreaker
100metadata:
101name: mcb-outbound
102namespace: %s
103labels:
104kuma.io/mesh: %s
105spec:
106targetRef:
107kind: Mesh
108to:
109- targetRef:
110kind: Mesh
111default:
112connectionLimits:
113maxConnectionPools: 1
114maxConnections: 1
115maxPendingRequests: 1
116maxRequests: 1
117maxRetries: 1
118`, Config.KumaNamespace, mesh)),119Entry("inbound circuit breaker", fmt.Sprintf(`120apiVersion: kuma.io/v1alpha1
121kind: MeshCircuitBreaker
122metadata:
123name: mcb-inbound
124namespace: %s
125labels:
126kuma.io/mesh: %s
127spec:
128targetRef:
129kind: Mesh
130from:
131- targetRef:
132kind: Mesh
133default:
134connectionLimits:
135maxConnectionPools: 1
136maxConnections: 1
137maxPendingRequests: 1
138maxRequests: 1
139maxRetries: 1
140`, Config.KumaNamespace, mesh)),141)142}
143