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)

Reply via email to