Skip to content

Commit

Permalink
test(trait): Non regression test on CRD default values for Integrations
Browse files Browse the repository at this point in the history
  • Loading branch information
gansheer committed Jan 17, 2024
1 parent f85aac0 commit 0b66230
Show file tree
Hide file tree
Showing 21 changed files with 234 additions and 24 deletions.
10 changes: 10 additions & 0 deletions e2e/common/config/config_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ import (
. "github.com/onsi/gomega"

corev1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"

. "github.com/apache/camel-k/v2/e2e/support"
v1 "github.com/apache/camel-k/v2/pkg/apis/camel/v1"
Expand Down Expand Up @@ -120,6 +121,15 @@ func TestRunConfigExamples(t *testing.T) {
Eventually(IntegrationPodPhase(ns, "property-secret-route"), TestTimeoutLong).Should(Equal(corev1.PodRunning))
Eventually(IntegrationConditionStatus(ns, "property-secret-route", v1.IntegrationConditionReady), TestTimeoutShort).Should(Equal(corev1.ConditionTrue))
Eventually(IntegrationLogs(ns, "property-secret-route"), TestTimeoutShort).Should(ContainSubstring("my-secret-external-value"))

// check integration schema does not contains unwanted default trait value.
Eventually(UnstructuredIntegration(ns, "property-secret-route")).ShouldNot(BeNil())
unstructuredIntegration := UnstructuredIntegration(ns, "property-secret-route")()
mountTrait, _, _ := unstructured.NestedMap(unstructuredIntegration.Object, "spec", "traits", "mount")
Expect(mountTrait).ToNot(BeNil())
Expect(len(mountTrait)).To(Equal(1))
Expect(mountTrait["configs"]).ToNot(BeNil())

Expect(Kamel("delete", "property-secret-route", "-n", ns).Execute()).To(Succeed())

})
Expand Down
9 changes: 9 additions & 0 deletions e2e/common/misc/kamelet_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ import (

. "github.com/onsi/gomega"
corev1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"

. "github.com/apache/camel-k/v2/e2e/support"
)
Expand Down Expand Up @@ -119,6 +120,14 @@ spec:
"-d", "camel:timer").Execute()).To(Succeed())
Eventually(IntegrationPodPhase(ns, "timer-kamelet-integration"), TestTimeoutLong).Should(Equal(corev1.PodRunning))
Eventually(IntegrationLogs(ns, "timer-kamelet-integration")).Should(ContainSubstring("important message"))

// check integration schema does not contains unwanted default trait value.
Eventually(UnstructuredIntegration(ns, "timer-kamelet-integration")).ShouldNot(BeNil())
unstructuredIntegration := UnstructuredIntegration(ns, "timer-kamelet-integration")()
kameletsTrait, _, _ := unstructured.NestedMap(unstructuredIntegration.Object, "spec", "traits", "kamelets")
Expect(kameletsTrait).ToNot(BeNil())
Expect(len(kameletsTrait)).To(Equal(1))
Expect(kameletsTrait["enabled"]).To(Equal(false))
})

Expect(Kamel("delete", "--all", "-n", ns).Execute()).To(Succeed())
Expand Down
21 changes: 16 additions & 5 deletions e2e/common/traits/affinity_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ import (

corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"

. "github.com/apache/camel-k/v2/e2e/support"
v1 "github.com/apache/camel-k/v2/pkg/apis/camel/v1"
Expand All @@ -48,21 +49,31 @@ func TestAffinityTrait(t *testing.T) {

if hostname != "" {
t.Run("Run Java with node affinity", func(t *testing.T) {
name1 := RandomizedSuffixName("java1")
Expect(KamelRunWithID(operatorID, ns, "files/Java.java",
"--name", "java1",
"--name", name1,
"-t", "affinity.enabled=true",
"-t", fmt.Sprintf("affinity.node-affinity-labels=kubernetes.io/hostname in(%s)", hostname)).Execute()).To(Succeed())
Eventually(IntegrationPodPhase(ns, "java1"), TestTimeoutLong).Should(Equal(corev1.PodRunning))
Eventually(IntegrationConditionStatus(ns, "java1", v1.IntegrationConditionReady), TestTimeoutShort).Should(Equal(corev1.ConditionTrue))
Eventually(IntegrationLogs(ns, "java1"), TestTimeoutShort).Should(ContainSubstring("Magicstring!"))
Eventually(IntegrationPodPhase(ns, name1), TestTimeoutLong).Should(Equal(corev1.PodRunning))
Eventually(IntegrationConditionStatus(ns, name1, v1.IntegrationConditionReady), TestTimeoutShort).Should(Equal(corev1.ConditionTrue))
Eventually(IntegrationLogs(ns, name1), TestTimeoutShort).Should(ContainSubstring("Magicstring!"))

pod := IntegrationPod(ns, "java1")()
pod := IntegrationPod(ns, name1)()
Expect(pod.Spec.Affinity).NotTo(BeNil())
Expect(pod.Spec.Affinity.NodeAffinity).To(Equal(&corev1.NodeAffinity{
RequiredDuringSchedulingIgnoredDuringExecution: nodeSelector("kubernetes.io/hostname", corev1.NodeSelectorOpIn, hostname),
}))
Expect(pod.Spec.NodeName).To(Equal(hostname))

// check integration schema does not contains unwanted default trait value.
Eventually(UnstructuredIntegration(ns, name1)).ShouldNot(BeNil())
unstructuredIntegration := UnstructuredIntegration(ns, name1)()
affinityTrait, _, _ := unstructured.NestedMap(unstructuredIntegration.Object, "spec", "traits", "affinity")
Expect(affinityTrait).NotTo(BeNil())
Expect(len(affinityTrait)).To(Equal(2))
Expect(affinityTrait["enabled"]).To(Equal(true))
Expect(affinityTrait["nodeAffinityLabels"]).NotTo(BeNil())

Expect(Kamel("delete", "--all", "-n", ns).Execute()).To(Succeed())
})
}
Expand Down
11 changes: 10 additions & 1 deletion e2e/common/traits/builder_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ import (

corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"

. "github.com/apache/camel-k/v2/e2e/support"
v1 "github.com/apache/camel-k/v2/pkg/apis/camel/v1"
Expand Down Expand Up @@ -66,7 +67,7 @@ func TestBuilderTrait(t *testing.T) {
})

t.Run("Run build order strategy dependencies", func(t *testing.T) {
name := RandomizedSuffixName("java-fifo-strategy")
name := RandomizedSuffixName("java-dependencies-strategy")
Expect(KamelRunWithID(operatorID, ns, "files/Java.java",
"--name", name,
"-t", "builder.order-strategy=dependencies").Execute()).To(Succeed())
Expand All @@ -88,6 +89,14 @@ func TestBuilderTrait(t *testing.T) {

Eventually(BuilderPod(integrationKitNamespace, builderKitName), TestTimeoutShort).Should(BeNil())

// check integration schema does not contains unwanted default trait value.
Eventually(UnstructuredIntegration(ns, name)).ShouldNot(BeNil())
unstructuredIntegration := UnstructuredIntegration(ns, name)()
builderTrait, _, _ := unstructured.NestedMap(unstructuredIntegration.Object, "spec", "traits", "builder")
Expect(builderTrait).NotTo(BeNil())
Expect(len(builderTrait)).To(Equal(1))
Expect(builderTrait["orderStrategy"]).To(Equal("dependencies"))

// We need to remove the kit as well
Expect(Kamel("reset", "-n", ns).Execute()).To(Succeed())
})
Expand Down
9 changes: 9 additions & 0 deletions e2e/common/traits/container_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ import (
. "github.com/onsi/gomega"

corev1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"

. "github.com/apache/camel-k/v2/e2e/support"
v1 "github.com/apache/camel-k/v2/pkg/apis/camel/v1"
Expand Down Expand Up @@ -93,6 +94,14 @@ func TestContainerTrait(t *testing.T) {
return podContainerName == containerName
}), TestTimeoutShort).Should(BeTrue())

// check integration schema does not contains unwanted default trait value.
Eventually(UnstructuredIntegration(ns, name)).ShouldNot(BeNil())
unstructuredIntegration := UnstructuredIntegration(ns, name)()
containerTrait, _, _ := unstructured.NestedMap(unstructuredIntegration.Object, "spec", "traits", "container")
Expect(containerTrait).ToNot(BeNil())
Expect(len(containerTrait)).To(Equal(1))
Expect(containerTrait["name"]).To(Equal(containerName))

})

// Clean-up
Expand Down
19 changes: 15 additions & 4 deletions e2e/common/traits/deployment_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ import (
"testing"

appsv1 "k8s.io/api/apps/v1"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"

. "github.com/onsi/gomega"
. "github.com/onsi/gomega/gstruct"
Expand All @@ -40,15 +41,17 @@ func TestRecreateDeploymentStrategyTrait(t *testing.T) {
RegisterTestingT(t)

t.Run("Run with Recreate Deployment Strategy", func(t *testing.T) {
name := RandomizedSuffixName("java")
Expect(KamelRunWithID(operatorID, ns, "files/Java.java",
"--name", name,
"-t", "deployment.strategy="+string(appsv1.RecreateDeploymentStrategyType)).
Execute()).To(Succeed())

Eventually(IntegrationPodPhase(ns, "java"), TestTimeoutLong).Should(Equal(corev1.PodRunning))
Eventually(IntegrationConditionStatus(ns, "java", v1.IntegrationConditionReady), TestTimeoutShort).Should(Equal(corev1.ConditionTrue))
Eventually(IntegrationLogs(ns, "java"), TestTimeoutShort).Should(ContainSubstring("Magicstring!"))
Eventually(IntegrationPodPhase(ns, name), TestTimeoutLong).Should(Equal(corev1.PodRunning))
Eventually(IntegrationConditionStatus(ns, name, v1.IntegrationConditionReady), TestTimeoutShort).Should(Equal(corev1.ConditionTrue))
Eventually(IntegrationLogs(ns, name), TestTimeoutShort).Should(ContainSubstring("Magicstring!"))

Eventually(Deployment(ns, "java"), TestTimeoutMedium).Should(PointTo(MatchFields(IgnoreExtras,
Eventually(Deployment(ns, name), TestTimeoutMedium).Should(PointTo(MatchFields(IgnoreExtras,
Fields{
"Spec": MatchFields(IgnoreExtras,
Fields{
Expand All @@ -60,6 +63,14 @@ func TestRecreateDeploymentStrategyTrait(t *testing.T) {
}),
))

// check integration schema does not contains unwanted default trait value.
Eventually(UnstructuredIntegration(ns, name)).ShouldNot(BeNil())
unstructuredIntegration := UnstructuredIntegration(ns, name)()
deploymentTrait, _, _ := unstructured.NestedMap(unstructuredIntegration.Object, "spec", "traits", "deployment")
Expect(deploymentTrait).ToNot(BeNil())
Expect(len(deploymentTrait)).To(Equal(1))
Expect(deploymentTrait["strategy"]).To(Equal(string(appsv1.RecreateDeploymentStrategyType)))

})

Expect(Kamel("delete", "--all", "-n", ns).Execute()).To(Succeed())
Expand Down
9 changes: 9 additions & 0 deletions e2e/common/traits/health_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ import (
. "github.com/onsi/gomega"

corev1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"

. "github.com/apache/camel-k/v2/e2e/support"
v1 "github.com/apache/camel-k/v2/pkg/apis/camel/v1"
Expand Down Expand Up @@ -72,6 +73,14 @@ func TestHealthTrait(t *testing.T) {
// Finally check the readiness condition becomes truthy back
Eventually(IntegrationConditionStatus(ns, name, v1.IntegrationConditionReady), TestTimeoutMedium).Should(Equal(corev1.ConditionTrue))

// check integration schema does not contains unwanted default trait value.
Eventually(UnstructuredIntegration(ns, name)).ShouldNot(BeNil())
unstructuredIntegration := UnstructuredIntegration(ns, name)()
healthTrait, _, _ := unstructured.NestedMap(unstructuredIntegration.Object, "spec", "traits", "health")
Expect(healthTrait).ToNot(BeNil())
Expect(len(healthTrait)).To(Equal(1))
Expect(healthTrait["enabled"]).To(Equal(true))

pods := IntegrationPods(ns, name)()

for i, pod := range pods {
Expand Down
9 changes: 9 additions & 0 deletions e2e/common/traits/istio_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ import (
. "github.com/onsi/gomega"

corev1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"

. "github.com/apache/camel-k/v2/e2e/support"
v1 "github.com/apache/camel-k/v2/pkg/apis/camel/v1"
Expand All @@ -51,6 +52,14 @@ func TestIstioTrait(t *testing.T) {
Expect(annotations["sidecar.istio.io/inject"]).To(Equal("true"))
Expect(annotations["traffic.sidecar.istio.io/includeOutboundIPRanges"]).To(Equal("10.0.0.0/8,172.16.0.0/12,192.168.0.0/16"))

// check integration schema does not contains unwanted default trait value.
Eventually(UnstructuredIntegration(ns, name)).ShouldNot(BeNil())
unstructuredIntegration := UnstructuredIntegration(ns, name)()
istioTrait, _, _ := unstructured.NestedMap(unstructuredIntegration.Object, "spec", "traits", "istio")
Expect(istioTrait).ToNot(BeNil())
Expect(len(istioTrait)).To(Equal(1))
Expect(istioTrait["enabled"]).To(Equal(true))

})

Expect(Kamel("delete", "--all", "-n", ns).Execute()).To(Succeed())
Expand Down
22 changes: 18 additions & 4 deletions e2e/common/traits/jolokia_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ import (
. "github.com/onsi/gomega"

corev1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"

. "github.com/apache/camel-k/v2/e2e/support"
v1 "github.com/apache/camel-k/v2/pkg/apis/camel/v1"
Expand All @@ -38,21 +39,34 @@ func TestJolokiaTrait(t *testing.T) {
RegisterTestingT(t)

t.Run("Run Java with Jolokia", func(t *testing.T) {
name := RandomizedSuffixName("java")
Expect(KamelRunWithID(operatorID, ns, "files/Java.java",
"--name", name,
"-t", "jolokia.enabled=true",
"-t", "jolokia.use-ssl-client-authentication=false",
"-t", "jolokia.protocol=http",
"-t", "jolokia.extended-client-check=false").Execute()).To(Succeed())
Eventually(IntegrationPodPhase(ns, "java"), TestTimeoutLong).Should(Equal(corev1.PodRunning))
Eventually(IntegrationConditionStatus(ns, "java", v1.IntegrationConditionReady), TestTimeoutShort).Should(Equal(corev1.ConditionTrue))
Eventually(IntegrationLogs(ns, "java"), TestTimeoutShort).Should(ContainSubstring("Magicstring!"))
Eventually(IntegrationPodPhase(ns, name), TestTimeoutLong).Should(Equal(corev1.PodRunning))
Eventually(IntegrationConditionStatus(ns, name, v1.IntegrationConditionReady), TestTimeoutShort).Should(Equal(corev1.ConditionTrue))
Eventually(IntegrationLogs(ns, name), TestTimeoutShort).Should(ContainSubstring("Magicstring!"))

pod := IntegrationPod(ns, "java")
pod := IntegrationPod(ns, name)
response, err := TestClient().CoreV1().RESTClient().Get().
AbsPath(fmt.Sprintf("/api/v1/namespaces/%s/pods/%s/proxy/jolokia/", ns, pod().Name)).DoRaw(TestContext)
Expect(err).To(BeNil())
Expect(response).To(ContainSubstring(`"status":200`))

// check integration schema does not contains unwanted default trait value.
Eventually(UnstructuredIntegration(ns, name)).ShouldNot(BeNil())
unstructuredIntegration := UnstructuredIntegration(ns, name)()
jolokiaTrait, _, _ := unstructured.NestedMap(unstructuredIntegration.Object, "spec", "traits", "jolokia")
Expect(jolokiaTrait).ToNot(BeNil())
Expect(len(jolokiaTrait)).To(Equal(4))
Expect(jolokiaTrait["enabled"]).To(Equal(true))
Expect(jolokiaTrait["useSSLClientAuthentication"]).To(Equal(false))
Expect(jolokiaTrait["protocol"]).To(Equal("http"))
Expect(jolokiaTrait["extendedClientCheck"]).To(Equal(false))

})

Expect(Kamel("delete", "--all", "-n", ns).Execute()).To(Succeed())
Expand Down
10 changes: 10 additions & 0 deletions e2e/common/traits/jvm_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ import (
"github.com/stretchr/testify/assert"

corev1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"

. "github.com/apache/camel-k/v2/e2e/support"
v1 "github.com/apache/camel-k/v2/pkg/apis/camel/v1"
Expand All @@ -55,6 +56,15 @@ func TestJVMTrait(t *testing.T) {
Eventually(IntegrationPodPhase(ns, "classpath"), TestTimeoutLong).Should(Equal(corev1.PodRunning))
Eventually(IntegrationConditionStatus(ns, "classpath", v1.IntegrationConditionReady), TestTimeoutShort).Should(Equal(corev1.ConditionTrue))
Eventually(IntegrationLogs(ns, "classpath"), TestTimeoutShort).Should(ContainSubstring("Hello World!"))

// check integration schema does not contains unwanted default trait value.
Eventually(UnstructuredIntegration(ns, "classpath")).ShouldNot(BeNil())
unstructuredIntegration := UnstructuredIntegration(ns, "classpath")()
jvmTrait, _, _ := unstructured.NestedMap(unstructuredIntegration.Object, "spec", "traits", "jvm")
Expect(jvmTrait).ToNot(BeNil())
Expect(len(jvmTrait)).To(Equal(1))
Expect(jvmTrait["classpath"]).To(Equal("/etc/camel/resources/my-deps/sample-1.0.jar"))

Expect(Kamel("delete", "--all", "-n", ns).Execute()).To(Succeed())
})
}
26 changes: 19 additions & 7 deletions e2e/common/traits/master_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ import (
. "github.com/onsi/gomega"

corev1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"

. "github.com/apache/camel-k/v2/e2e/support"
)
Expand All @@ -44,25 +45,36 @@ func TestMasterTrait(t *testing.T) {
})

t.Run("only one integration with master runs", func(t *testing.T) {
nameFirst := RandomizedSuffixName("first")
Expect(KamelRunWithID(operatorID, ns, "files/Master.java",
"--name", "first",
"--name", nameFirst,
"--label", "leader-group=same",
"-t", "master.label-key=leader-group",
"-t", "master.label-value=same",
"-t", "owner.target-labels=leader-group").Execute()).To(Succeed())
Eventually(IntegrationPodPhase(ns, "first"), TestTimeoutLong).Should(Equal(corev1.PodRunning))
Eventually(IntegrationLogs(ns, "first"), TestTimeoutShort).Should(ContainSubstring("Magicstring!"))
Eventually(IntegrationPodPhase(ns, nameFirst), TestTimeoutLong).Should(Equal(corev1.PodRunning))
Eventually(IntegrationLogs(ns, nameFirst), TestTimeoutShort).Should(ContainSubstring("Magicstring!"))
// Start a second integration with the same lock (it should not start the route)
nameSecond := RandomizedSuffixName("second")
Expect(KamelRunWithID(operatorID, ns, "files/Master.java",
"--name", "second",
"--name", nameSecond,
"--label", "leader-group=same",
"-t", "master.label-key=leader-group",
"-t", "master.label-value=same",
"-t", "master.resource-name=first-lock",
"-t", "owner.target-labels=leader-group").Execute()).To(Succeed())
Eventually(IntegrationPodPhase(ns, "second"), TestTimeoutLong).Should(Equal(corev1.PodRunning))
Eventually(IntegrationLogs(ns, "second"), TestTimeoutShort).Should(ContainSubstring("started in"))
Eventually(IntegrationLogs(ns, "second"), 30*time.Second).ShouldNot(ContainSubstring("Magicstring!"))
Eventually(IntegrationPodPhase(ns, nameSecond), TestTimeoutLong).Should(Equal(corev1.PodRunning))
Eventually(IntegrationLogs(ns, nameSecond), TestTimeoutShort).Should(ContainSubstring("started in"))
Eventually(IntegrationLogs(ns, nameSecond), 30*time.Second).ShouldNot(ContainSubstring("Magicstring!"))

// check integration schema does not contains unwanted default trait value.
Eventually(UnstructuredIntegration(ns, nameFirst)).ShouldNot(BeNil())
unstructuredIntegration := UnstructuredIntegration(ns, nameFirst)()
builderTrait, _, _ := unstructured.NestedMap(unstructuredIntegration.Object, "spec", "traits", "addons", "master")
Expect(builderTrait).ToNot(BeNil())
Expect(len(builderTrait)).To(Equal(2))
Expect(builderTrait["labelKey"]).To(Equal("leader-group"))
Expect(builderTrait["labelValue"]).To(Equal("same"))
})

Expect(Kamel("delete", "--all", "-n", ns).Execute()).To(Succeed())
Expand Down
10 changes: 10 additions & 0 deletions e2e/common/traits/pdb_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ import (
policyv1 "k8s.io/api/policy/v1"
k8serrors "k8s.io/apimachinery/pkg/api/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
"k8s.io/apimachinery/pkg/util/intstr"

ctrl "sigs.k8s.io/controller-runtime/pkg/client"
Expand All @@ -55,6 +56,15 @@ func TestPodDisruptionBudgetTrait(t *testing.T) {
Eventually(IntegrationConditionStatus(ns, name, v1.IntegrationConditionReady), TestTimeoutShort).Should(Equal(corev1.ConditionTrue))
Eventually(IntegrationLogs(ns, name), TestTimeoutShort).Should(ContainSubstring("Magicstring!"))

// check integration schema does not contains unwanted default trait value.
Eventually(UnstructuredIntegration(ns, name)).ShouldNot(BeNil())
unstructuredIntegration := UnstructuredIntegration(ns, name)()
pdbTrait, _, _ := unstructured.NestedMap(unstructuredIntegration.Object, "spec", "traits", "pdb")
Expect(pdbTrait).ToNot(BeNil())
Expect(len(pdbTrait)).To(Equal(2))
Expect(pdbTrait["enabled"]).To(Equal(true))
Expect(pdbTrait["minAvailable"]).To(Equal("2"))

// Check PodDisruptionBudget
Eventually(podDisruptionBudget(ns, name), TestTimeoutShort).ShouldNot(BeNil())
pdb := podDisruptionBudget(ns, name)()
Expand Down
Loading

0 comments on commit 0b66230

Please sign in to comment.