diff --git a/test/e2e/autoscaling/cluster_size_autoscaling.go b/test/e2e/autoscaling/cluster_size_autoscaling.go index 8744a8df0e3..50c65aaa45e 100644 --- a/test/e2e/autoscaling/cluster_size_autoscaling.go +++ b/test/e2e/autoscaling/cluster_size_autoscaling.go @@ -478,6 +478,7 @@ func runDrainTest(f *framework.Framework, migSizes map[string]int, podsPerNode, defer framework.DeleteRCAndPods(f.ClientSet, f.InternalClientset, f.Namespace.Name, "reschedulable-pods") By("Create a PodDisruptionBudget") + minAvailable := intstr.FromInt(numPods - pdbSize) pdb := &policy.PodDisruptionBudget{ ObjectMeta: metav1.ObjectMeta{ Name: "test_pdb", @@ -485,7 +486,7 @@ func runDrainTest(f *framework.Framework, migSizes map[string]int, podsPerNode, }, Spec: policy.PodDisruptionBudgetSpec{ Selector: &metav1.LabelSelector{MatchLabels: labelMap}, - MinAvailable: intstr.FromInt(numPods - pdbSize), + MinAvailable: &minAvailable, }, } _, err = f.StagingClient.Policy().PodDisruptionBudgets(namespace).Create(pdb) diff --git a/test/e2e/disruption.go b/test/e2e/disruption.go index 6d7ac97bd69..a9ffe753260 100644 --- a/test/e2e/disruption.go +++ b/test/e2e/disruption.go @@ -52,11 +52,11 @@ var _ = framework.KubeDescribe("DisruptionController", func() { }) It("should create a PodDisruptionBudget", func() { - createPodDisruptionBudgetOrDie(cs, ns, intstr.FromString("1%")) + createPDBMinAvailableOrDie(cs, ns, intstr.FromString("1%")) }) It("should update PodDisruptionBudget status", func() { - createPodDisruptionBudgetOrDie(cs, ns, intstr.FromInt(2)) + createPDBMinAvailableOrDie(cs, ns, intstr.FromInt(2)) createPodsOrDie(cs, ns, 3) waitForPodsOrDie(cs, ns, 3) @@ -71,12 +71,12 @@ var _ = framework.KubeDescribe("DisruptionController", func() { return pdb.Status.PodDisruptionsAllowed > 0, nil }) Expect(err).NotTo(HaveOccurred()) - }) evictionCases := []struct { description string minAvailable intstr.IntOrString + maxUnavailable intstr.IntOrString podCount int replicaSetSize int32 shouldDeny bool @@ -84,29 +84,52 @@ var _ = framework.KubeDescribe("DisruptionController", func() { skipForBigClusters bool }{ { - description: "no PDB", - minAvailable: intstr.FromString(""), - podCount: 1, - shouldDeny: false, + description: "no PDB", + minAvailable: intstr.FromString(""), + maxUnavailable: intstr.FromString(""), + podCount: 1, + shouldDeny: false, }, { - description: "too few pods, absolute", - minAvailable: intstr.FromInt(2), - podCount: 2, - shouldDeny: true, + description: "too few pods, absolute", + minAvailable: intstr.FromInt(2), + maxUnavailable: intstr.FromString(""), + podCount: 2, + shouldDeny: true, }, { - description: "enough pods, absolute", - minAvailable: intstr.FromInt(2), - podCount: 3, - shouldDeny: false, + description: "enough pods, absolute", + minAvailable: intstr.FromInt(2), + maxUnavailable: intstr.FromString(""), + podCount: 3, + shouldDeny: false, }, { description: "enough pods, replicaSet, percentage", minAvailable: intstr.FromString("90%"), + maxUnavailable: intstr.FromString(""), replicaSetSize: 10, exclusive: false, shouldDeny: false, }, { description: "too few pods, replicaSet, percentage", minAvailable: intstr.FromString("90%"), + maxUnavailable: intstr.FromString(""), + replicaSetSize: 10, + exclusive: true, + shouldDeny: true, + // This tests assumes that there is less than replicaSetSize nodes in the cluster. + skipForBigClusters: true, + }, + { + description: "maxUnavailable allow single eviction, percentage", + minAvailable: intstr.FromString(""), + maxUnavailable: intstr.FromString("10%"), + replicaSetSize: 10, + exclusive: false, + shouldDeny: false, + }, + { + description: "maxUnavailable deny evictions, integer", + minAvailable: intstr.FromString(""), + maxUnavailable: intstr.FromInt(1), replicaSetSize: 10, exclusive: true, shouldDeny: true, @@ -130,7 +153,11 @@ var _ = framework.KubeDescribe("DisruptionController", func() { } if c.minAvailable.String() != "" { - createPodDisruptionBudgetOrDie(cs, ns, c.minAvailable) + createPDBMinAvailableOrDie(cs, ns, c.minAvailable) + } + + if c.maxUnavailable.String() != "" { + createPDBMaxUnavailableOrDie(cs, ns, c.maxUnavailable) } // Locate a running pod. @@ -186,10 +213,9 @@ var _ = framework.KubeDescribe("DisruptionController", func() { } }) } - }) -func createPodDisruptionBudgetOrDie(cs *kubernetes.Clientset, ns string, minAvailable intstr.IntOrString) { +func createPDBMinAvailableOrDie(cs *kubernetes.Clientset, ns string, minAvailable intstr.IntOrString) { pdb := policy.PodDisruptionBudget{ ObjectMeta: metav1.ObjectMeta{ Name: "foo", @@ -197,7 +223,22 @@ func createPodDisruptionBudgetOrDie(cs *kubernetes.Clientset, ns string, minAvai }, Spec: policy.PodDisruptionBudgetSpec{ Selector: &metav1.LabelSelector{MatchLabels: map[string]string{"foo": "bar"}}, - MinAvailable: minAvailable, + MinAvailable: &minAvailable, + }, + } + _, err := cs.Policy().PodDisruptionBudgets(ns).Create(&pdb) + Expect(err).NotTo(HaveOccurred()) +} + +func createPDBMaxUnavailableOrDie(cs *kubernetes.Clientset, ns string, maxUnavailable intstr.IntOrString) { + pdb := policy.PodDisruptionBudget{ + ObjectMeta: metav1.ObjectMeta{ + Name: "foo", + Namespace: ns, + }, + Spec: policy.PodDisruptionBudgetSpec{ + Selector: &metav1.LabelSelector{MatchLabels: map[string]string{"foo": "bar"}}, + MaxUnavailable: &maxUnavailable, }, } _, err := cs.Policy().PodDisruptionBudgets(ns).Create(&pdb) diff --git a/test/integration/evictions/evictions_test.go b/test/integration/evictions/evictions_test.go index d2a0d0dec5c..dd4747cb867 100644 --- a/test/integration/evictions/evictions_test.go +++ b/test/integration/evictions/evictions_test.go @@ -200,7 +200,7 @@ func newPDB() *v1beta1.PodDisruptionBudget { Name: "test-pdb", }, Spec: v1beta1.PodDisruptionBudgetSpec{ - MinAvailable: intstr.IntOrString{ + MinAvailable: &intstr.IntOrString{ Type: intstr.Int, IntVal: 0, },