This is an automated email from the ASF dual-hosted git repository. astefanutti pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/camel-k.git
commit 26fac28c153be4574918772732ac742f87840d08 Author: Antonin Stefanutti <[email protected]> AuthorDate: Mon Feb 22 10:36:42 2021 +0100 test: Add eviction cases to the PodDisruptionBudget trait e2e tests --- e2e/common/pdb_test.go | 67 ++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 57 insertions(+), 10 deletions(-) diff --git a/e2e/common/pdb_test.go b/e2e/common/pdb_test.go index 9ca1567..c1bce60 100644 --- a/e2e/common/pdb_test.go +++ b/e2e/common/pdb_test.go @@ -22,16 +22,17 @@ limitations under the License. package common import ( + "net/http" "testing" . "github.com/onsi/gomega" "github.com/onsi/gomega/gstruct" - "k8s.io/apimachinery/pkg/util/intstr" v1 "k8s.io/api/core/v1" - "k8s.io/api/policy/v1beta1" - k8serrors "k8s.io/apimachinery/pkg/api/errors" + policy "k8s.io/api/policy/v1beta1" + "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/util/intstr" "sigs.k8s.io/controller-runtime/pkg/client" @@ -62,7 +63,7 @@ func TestPodDisruptionBudget(t *testing.T) { Eventually(podDisruptionBudget(ns, name), TestTimeoutShort).Should(gstruct.PointTo(gstruct.MatchFields( gstruct.IgnoreExtras, gstruct.Fields{ - "Status": Equal(v1beta1.PodDisruptionBudgetStatus{ + "Status": Equal(policy.PodDisruptionBudgetStatus{ ObservedGeneration: 1, DisruptionsAllowed: 0, CurrentHealthy: 1, @@ -80,6 +81,7 @@ func TestPodDisruptionBudget(t *testing.T) { Eventually(IntegrationPods(ns, name), TestTimeoutMedium).Should(HaveLen(2)) Eventually(IntegrationStatusReplicas(ns, name), TestTimeoutShort). Should(gstruct.PointTo(BeNumerically("==", 2))) + Eventually(IntegrationCondition(ns, name, camelv1.IntegrationConditionReady), TestTimeoutShort).Should(Equal(v1.ConditionTrue)) // Check PodDisruptionBudget pdb = podDisruptionBudget(ns, name)() @@ -88,7 +90,7 @@ func TestPodDisruptionBudget(t *testing.T) { Eventually(podDisruptionBudget(ns, name), TestTimeoutShort).Should(gstruct.PointTo(gstruct.MatchFields( gstruct.IgnoreExtras, gstruct.Fields{ - "Status": Equal(v1beta1.PodDisruptionBudgetStatus{ + "Status": Equal(policy.PodDisruptionBudgetStatus{ ObservedGeneration: 1, DisruptionsAllowed: 0, CurrentHealthy: 2, @@ -98,16 +100,61 @@ func TestPodDisruptionBudget(t *testing.T) { }), )) + // Eviction attempt + pods := IntegrationPods(ns, name)() + Expect(pods).To(HaveLen(2)) + err := TestClient().CoreV1().Pods(ns).Evict(TestContext, &policy.Eviction{ + ObjectMeta: metav1.ObjectMeta{ + Name: pods[0].Name, + }, + }) + Expect(err).To(MatchError(&errors.StatusError{ + ErrStatus: metav1.Status{ + Status: "Failure", + Message: "Cannot evict pod as it would violate the pod's disruption budget.", + Reason: "TooManyRequests", + Code: http.StatusTooManyRequests, + Details: &metav1.StatusDetails{ + Causes: []metav1.StatusCause{ + { + Type: "DisruptionBudget", + Message: "The disruption budget java needs 2 healthy pods and has 2 currently", + }, + }, + }, + }, + })) + + // Scale Integration to Scale > PodDisruptionBudgetSpec.MinAvailable + // for the eviction request to succeed once replicas are ready + Expect(UpdateIntegration(ns, name, func(it *camelv1.Integration) { + replicas := int32(3) + it.Spec.Replicas = &replicas + })).To(BeNil()) + Eventually(IntegrationPods(ns, name), TestTimeoutMedium).Should(HaveLen(3)) + Eventually(IntegrationStatusReplicas(ns, name), TestTimeoutShort). + Should(gstruct.PointTo(BeNumerically("==", 3))) + Eventually(IntegrationCondition(ns, name, camelv1.IntegrationConditionReady), TestTimeoutShort).Should(Equal(v1.ConditionTrue)) + + pods = IntegrationPods(ns, name)() + Expect(pods).To(HaveLen(3)) + err = TestClient().CoreV1().Pods(ns).Evict(TestContext, &policy.Eviction{ + ObjectMeta: metav1.ObjectMeta{ + Name: pods[0].Name, + }, + }) + Expect(err).To(Succeed()) + // Clean up Expect(Kamel("delete", "--all", "-n", ns).Execute()).To(BeNil()) }) } -func podDisruptionBudget(ns string, name string) func() *v1beta1.PodDisruptionBudget { - return func() *v1beta1.PodDisruptionBudget { - pdb := v1beta1.PodDisruptionBudget{ +func podDisruptionBudget(ns string, name string) func() *policy.PodDisruptionBudget { + return func() *policy.PodDisruptionBudget { + pdb := policy.PodDisruptionBudget{ TypeMeta: metav1.TypeMeta{ - APIVersion: v1beta1.SchemeGroupVersion.String(), + APIVersion: policy.SchemeGroupVersion.String(), Kind: "PodDisruptionBudget", }, ObjectMeta: metav1.ObjectMeta{ @@ -120,7 +167,7 @@ func podDisruptionBudget(ns string, name string) func() *v1beta1.PodDisruptionBu panic(err) } err = TestClient().Get(TestContext, key, &pdb) - if err != nil && k8serrors.IsNotFound(err) { + if err != nil && errors.IsNotFound(err) { return nil } else if err != nil { panic(err)
