From 832e4718da86a7c2bbf4cdb7a992dbb5fdc6cf92 Mon Sep 17 00:00:00 2001 From: Stephen Heywood Date: Wed, 24 Jun 2020 05:47:34 +0000 Subject: [PATCH 1/4] Ensure that a set of pods can be removed by delete collection --- test/e2e/common/pods.go | 63 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) diff --git a/test/e2e/common/pods.go b/test/e2e/common/pods.go index 1898e972430..78bb35c7ed4 100644 --- a/test/e2e/common/pods.go +++ b/test/e2e/common/pods.go @@ -54,6 +54,8 @@ const ( buildBackOffDuration = time.Minute syncLoopFrequency = 10 * time.Second maxBackOffTolerance = time.Duration(1.3 * float64(kubelet.MaxContainerBackOff)) + podRetryPeriod = 1 * time.Second + podRetryTimeout = 1 * time.Minute ) // testHostIP tests that a pod gets a host IP @@ -829,4 +831,65 @@ var _ = framework.KubeDescribe("Pods", func() { validatePodReadiness(false) }) + + ginkgo.It("should delete a collection of pods", func() { + podTestNames := []string{"test-pod-1", "test-pod-2", "test-pod-3"} + + ginkgo.By("Create set of pods") + // create a set of pods in test namespace + for _, podTestName := range podTestNames { + _, err := f.ClientSet.CoreV1().Pods(f.Namespace.Name).Create(context.TODO(), &v1.Pod{ + ObjectMeta: metav1.ObjectMeta{ + Name: podTestName, + Labels: map[string]string{ + "type": "Testing"}, + }, + Spec: v1.PodSpec{ + Containers: []v1.Container{{ + Image: imageutils.GetE2EImage(imageutils.Agnhost), + Name: "token-test", + }}, + RestartPolicy: v1.RestartPolicyNever, + }}, metav1.CreateOptions{}) + framework.ExpectNoError(err, "failed to create pod") + framework.Logf("created %v", podTestName) + } + + // wait as required for all 3 pods to be found + framework.Logf("waiting for all 3 pods to be located") + err := wait.PollImmediate(podRetryPeriod, podRetryTimeout, checkPodListQuantity(f, "type=Testing", 3)) + framework.ExpectNoError(err, "3 pods not found") + + // delete Collection of pods with a label in the current namespace + _ = f.ClientSet.CoreV1().Pods(f.Namespace.Name).DeleteCollection(context.TODO(), metav1.DeleteOptions{}, metav1.ListOptions{ + LabelSelector: "type=Testing"}) + fmt.Println("DeleteCollection processed") + + // wait for all pods to be deleted + framework.Logf("waiting for all pods to be deleted") + err = wait.PollImmediate(podRetryPeriod, podRetryTimeout, checkPodListQuantity(f, "type=Testing", 0)) + framework.ExpectNoError(err, "found a pod(s)") + + ginkgo.By("Collection of pods deleted") + }) }) + +func checkPodListQuantity(f *framework.Framework, label string, quantity int) func() (bool, error) { + return func() (bool, error) { + var err error + + framework.Logf("requesting list of pods to confirm quantity") + + list, err := f.ClientSet.CoreV1().Pods(f.Namespace.Name).List(context.TODO(), metav1.ListOptions{ + LabelSelector: label}) + + if err != nil { + return false, err + } + + if len(list.Items) != quantity { + return false, err + } + return true, nil + } +} From eb8ddc464ae2f33c33049e85295055db33126071 Mon Sep 17 00:00:00 2001 From: Stephen Heywood Date: Wed, 1 Jul 2020 02:46:34 +0000 Subject: [PATCH 2/4] Add check on deleteCollection, improve logging --- test/e2e/common/pods.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/e2e/common/pods.go b/test/e2e/common/pods.go index 78bb35c7ed4..7dbf6cc8305 100644 --- a/test/e2e/common/pods.go +++ b/test/e2e/common/pods.go @@ -861,8 +861,9 @@ var _ = framework.KubeDescribe("Pods", func() { framework.ExpectNoError(err, "3 pods not found") // delete Collection of pods with a label in the current namespace - _ = f.ClientSet.CoreV1().Pods(f.Namespace.Name).DeleteCollection(context.TODO(), metav1.DeleteOptions{}, metav1.ListOptions{ + err = f.ClientSet.CoreV1().Pods(f.Namespace.Name).DeleteCollection(context.TODO(), metav1.DeleteOptions{}, metav1.ListOptions{ LabelSelector: "type=Testing"}) + framework.ExpectNoError(err, "failed to delete collection of pods") fmt.Println("DeleteCollection processed") // wait for all pods to be deleted @@ -878,8 +879,6 @@ func checkPodListQuantity(f *framework.Framework, label string, quantity int) fu return func() (bool, error) { var err error - framework.Logf("requesting list of pods to confirm quantity") - list, err := f.ClientSet.CoreV1().Pods(f.Namespace.Name).List(context.TODO(), metav1.ListOptions{ LabelSelector: label}) @@ -888,6 +887,7 @@ func checkPodListQuantity(f *framework.Framework, label string, quantity int) fu } if len(list.Items) != quantity { + framework.Logf("Pod quantity %d is different from expected quantity %d", len(list.Items), quantity) return false, err } return true, nil From ec949fc50b311f353bf4334f9459f0f7c8dd2d32 Mon Sep 17 00:00:00 2001 From: Stephen Heywood Date: Wed, 1 Jul 2020 19:43:44 +0000 Subject: [PATCH 3/4] Update to keep logging consistent --- test/e2e/common/pods.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/e2e/common/pods.go b/test/e2e/common/pods.go index 7dbf6cc8305..71bb939c2f8 100644 --- a/test/e2e/common/pods.go +++ b/test/e2e/common/pods.go @@ -864,7 +864,7 @@ var _ = framework.KubeDescribe("Pods", func() { err = f.ClientSet.CoreV1().Pods(f.Namespace.Name).DeleteCollection(context.TODO(), metav1.DeleteOptions{}, metav1.ListOptions{ LabelSelector: "type=Testing"}) framework.ExpectNoError(err, "failed to delete collection of pods") - fmt.Println("DeleteCollection processed") + framework.Logf("DeleteCollection processed") // wait for all pods to be deleted framework.Logf("waiting for all pods to be deleted") From bcd7d08616592d6af4adab303dc3483d66b7a95e Mon Sep 17 00:00:00 2001 From: Stephen Heywood Date: Wed, 1 Jul 2020 21:04:59 +0000 Subject: [PATCH 4/4] Reduce log verbosity --- test/e2e/common/pods.go | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/test/e2e/common/pods.go b/test/e2e/common/pods.go index 71bb939c2f8..279598b7464 100644 --- a/test/e2e/common/pods.go +++ b/test/e2e/common/pods.go @@ -856,7 +856,7 @@ var _ = framework.KubeDescribe("Pods", func() { } // wait as required for all 3 pods to be found - framework.Logf("waiting for all 3 pods to be located") + ginkgo.By("waiting for all 3 pods to be located") err := wait.PollImmediate(podRetryPeriod, podRetryTimeout, checkPodListQuantity(f, "type=Testing", 3)) framework.ExpectNoError(err, "3 pods not found") @@ -864,14 +864,11 @@ var _ = framework.KubeDescribe("Pods", func() { err = f.ClientSet.CoreV1().Pods(f.Namespace.Name).DeleteCollection(context.TODO(), metav1.DeleteOptions{}, metav1.ListOptions{ LabelSelector: "type=Testing"}) framework.ExpectNoError(err, "failed to delete collection of pods") - framework.Logf("DeleteCollection processed") // wait for all pods to be deleted - framework.Logf("waiting for all pods to be deleted") + ginkgo.By("waiting for all pods to be deleted") err = wait.PollImmediate(podRetryPeriod, podRetryTimeout, checkPodListQuantity(f, "type=Testing", 0)) framework.ExpectNoError(err, "found a pod(s)") - - ginkgo.By("Collection of pods deleted") }) })