6
. "github.com/onsi/ginkgo/v2"
7
. "github.com/onsi/gomega"
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/envs/kubernetes"
16
func CircuitBreaker(config *Config) func() {
21
Expect(framework.DeleteMeshPolicyOrError(
23
v1alpha1.MeshCircuitBreakerResourceTypeDescriptor,
24
fmt.Sprintf("mesh-circuit-breaker-all-%s", config.Mesh),
26
Expect(framework.DeleteMeshPolicyOrError(
28
meshretry_api.MeshRetryResourceTypeDescriptor,
29
fmt.Sprintf("mesh-retry-all-%s", config.Mesh),
33
framework.E2EAfterEach(func() {
34
Expect(framework.DeleteMeshResources(
37
v1alpha1.MeshCircuitBreakerResourceTypeDescriptor,
41
DescribeTable("should configure circuit breaker limits and outlier"+
42
" detectors for connections", func(yaml string) {
43
// given no MeshCircuitBreaker
44
mcbs, err := kubernetes.Cluster.GetKumactlOptions().
45
KumactlList("meshcircuitbreakers", config.Mesh)
46
Expect(err).ToNot(HaveOccurred())
47
Expect(mcbs).To(BeEmpty())
49
Eventually(func() ([]client.FailureResponse, error) {
50
return client.CollectResponsesAndFailures(
53
fmt.Sprintf("http://%s/test-server", config.KicIP),
54
client.FromKubernetesPod(config.NamespaceOutsideMesh, "demo-client"),
55
client.WithNumberOfRequests(10),
57
}, "30s", "1s").Should(And(
59
HaveEach(HaveField("ResponseCode", 200)),
63
Expect(kubernetes.Cluster.Install(framework.YamlK8s(yaml))).To(Succeed())
66
Eventually(func(g Gomega) ([]client.FailureResponse, error) {
67
return client.CollectResponsesAndFailures(
70
fmt.Sprintf("http://%s/test-server", config.KicIP),
71
client.FromKubernetesPod(config.NamespaceOutsideMesh, "demo-client"),
72
client.WithNumberOfRequests(10),
73
// increase processing time of a request to increase
74
// a probability of triggering maxPendingRequest limit
75
client.WithHeader("x-set-response-delay-ms", "1000"),
76
client.WithoutRetries(),
78
}, "30s", "1s").Should(And(
80
ContainElement(HaveField("ResponseCode", 503)),
83
Entry("outbound circuit breaker", fmt.Sprintf(`
84
apiVersion: kuma.io/v1alpha1
85
kind: MeshCircuitBreaker
101
maxPendingRequests: 1
104
`, config.CpNamespace, config.Mesh)),
105
Entry("inbound circuit breaker", fmt.Sprintf(`
106
apiVersion: kuma.io/v1alpha1
107
kind: MeshCircuitBreaker
121
maxConnectionPools: 1
123
maxPendingRequests: 1
126
`, config.CpNamespace, config.Mesh)),