From 7a5b3c43a0e17283b67d4901ec0ddd44026f3c98 Mon Sep 17 00:00:00 2001 From: Chao Xu Date: Mon, 6 Jun 2016 17:23:36 -0700 Subject: [PATCH] plumb --enable_garbage_collector from environment variable; adding a simple e2e test --- cluster/common.sh | 1 + cluster/gce/gci/configure-helper.sh | 2 + cluster/gce/gci/helper.sh | 1 - .../kube-apiserver/kube-apiserver.manifest | 7 +- .../kube-controller-manager.manifest | 7 +- hack/verify-flags/exceptions.txt | 6 +- .../garbagecollector/garbagecollector.go | 1 + test/e2e/garbage_collector.go | 197 ++++++++++++++++++ test/e2e/generated_clientset.go | 9 +- test/e2e/pod_gc.go | 4 +- 10 files changed, 223 insertions(+), 12 deletions(-) create mode 100644 test/e2e/garbage_collector.go diff --git a/cluster/common.sh b/cluster/common.sh index a31ffe2dcf..24233eb036 100755 --- a/cluster/common.sh +++ b/cluster/common.sh @@ -640,6 +640,7 @@ ENABLE_MANIFEST_URL: $(yaml-quote ${ENABLE_MANIFEST_URL:-false}) MANIFEST_URL: $(yaml-quote ${MANIFEST_URL:-}) MANIFEST_URL_HEADER: $(yaml-quote ${MANIFEST_URL_HEADER:-}) NUM_NODES: $(yaml-quote ${NUM_NODES}) +ENABLE_GARBAGE_COLLECTOR: $(yaml-quote ${ENABLE_GARBAGE_COLLECTOR:-false}) EOF if [ -n "${APISERVER_TEST_ARGS:-}" ]; then cat >>$file < 0 { + return true, nil + } else { + return false, nil + } + }); err != nil { + framework.Failf("failed to wait for the rc to create some pods: %v", err) + } + By("delete the rc") + deleteOptions := getNonOrphanOptions() + deleteOptions.Preconditions = api.NewUIDPreconditions(string(rc.UID)) + if err := rcClient.Delete(rc.ObjectMeta.Name, deleteOptions); err != nil { + framework.Failf("failed to delete the rc: %v", err) + } + By("wait for all pods to be garbage collected") + // wait for the RCs and Pods to reach the expected numbers. + if err := wait.Poll(5*time.Second, 60*time.Second, func() (bool, error) { + return verifyRemainingObjects(f, clientSet, 0, 0) + }); err != nil { + framework.Failf("failed to wait for all pods to be deleted: %v", err) + remainingPods, err := podClient.List(api.ListOptions{}) + if err != nil { + framework.Failf("failed to list pods post mortem: %v", err) + } else { + framework.Failf("remaining pods are: %#v", remainingPods) + } + } + }) + + It("[Feature:GarbageCollector] should orphan pods created by rc", func() { + clientSet := f.Clientset_1_3 + rcClient := clientSet.Core().ReplicationControllers(f.Namespace.Name) + podClient := clientSet.Core().Pods(f.Namespace.Name) + rcName := "simpletest.rc" + rc := newOwnerRC(f, rcName) + By("create the rc") + rc, err := rcClient.Create(rc) + if err != nil { + framework.Failf("Failed to create replication controller: %v", err) + } + // wait for rc to create some pods + if err := wait.Poll(5*time.Second, 30*time.Second, func() (bool, error) { + rc, err := rcClient.Get(rc.Name) + if err != nil { + return false, fmt.Errorf("Failed to get rc: %v", err) + } + if rc.Status.Replicas == *rc.Spec.Replicas { + return true, nil + } else { + return false, nil + } + }); err != nil { + framework.Failf("failed to wait for the rc.Status.Replicas to reach rc.Spec.Replicas: %v", err) + } + By("delete the rc") + deleteOptions := getOrphanOptions() + deleteOptions.Preconditions = api.NewUIDPreconditions(string(rc.UID)) + if err := rcClient.Delete(rc.ObjectMeta.Name, deleteOptions); err != nil { + framework.Failf("failed to delete the rc: %v", err) + } + By("wait for 30 seconds to see if the garbage collector mistakenly deletes the pods") + if err := wait.Poll(5*time.Second, 30*time.Second, func() (bool, error) { + pods, err := podClient.List(api.ListOptions{}) + if err != nil { + return false, fmt.Errorf("Failed to list pods: %v", err) + } + if e, a := int(*(rc.Spec.Replicas)), len(pods.Items); e != a { + return false, fmt.Errorf("expect %d pods, got %d pods", e, a) + } + return false, nil + }); err != nil && err != wait.ErrWaitTimeout { + framework.Failf("%v", err) + } + }) +}) diff --git a/test/e2e/generated_clientset.go b/test/e2e/generated_clientset.go index 2cdd22f850..06b2853881 100644 --- a/test/e2e/generated_clientset.go +++ b/test/e2e/generated_clientset.go @@ -17,7 +17,6 @@ limitations under the License. package e2e import ( - "fmt" "strconv" "time" @@ -71,7 +70,7 @@ func observePodCreation(w watch.Interface) { framework.Failf("Failed to observe pod creation: %v", event) } case <-time.After(framework.PodStartTimeout): - Fail("Timeout while waiting for pod creation") + framework.Failf("Timeout while waiting for pod creation") } } @@ -91,7 +90,7 @@ func observeObjectDeletion(w watch.Interface) (obj runtime.Object) { } } if !deleted { - Fail("Failed to observe pod deletion") + framework.Failf("Failed to observe pod deletion") } return } @@ -164,7 +163,7 @@ var _ = framework.KubeDescribe("Generated release_1_2 clientset", func() { options = api.ListOptions{LabelSelector: selector} pods, err = podClient.List(options) if err != nil { - Fail(fmt.Sprintf("Failed to list pods to verify deletion: %v", err)) + framework.Failf("Failed to list pods to verify deletion: %v", err) } Expect(len(pods.Items)).To(Equal(0)) }) @@ -238,7 +237,7 @@ var _ = framework.KubeDescribe("Generated release_1_3 clientset", func() { options = api.ListOptions{LabelSelector: selector} pods, err = podClient.List(options) if err != nil { - Fail(fmt.Sprintf("Failed to list pods to verify deletion: %v", err)) + framework.Failf("Failed to list pods to verify deletion: %v", err) } Expect(len(pods.Items)).To(Equal(0)) }) diff --git a/test/e2e/pod_gc.go b/test/e2e/pod_gc.go index ed545608eb..3b4eef4092 100644 --- a/test/e2e/pod_gc.go +++ b/test/e2e/pod_gc.go @@ -31,8 +31,8 @@ import ( // This test requires that --terminated-pod-gc-threshold=100 be set on the controller manager // // Slow by design (7 min) -var _ = framework.KubeDescribe("Garbage collector [Feature:GarbageCollector] [Slow]", func() { - f := framework.NewDefaultFramework("garbage-collector") +var _ = framework.KubeDescribe("Pod garbage collector [Feature:PodGarbageCollector] [Slow]", func() { + f := framework.NewDefaultFramework("pod-garbage-collector") It("should handle the creation of 1000 pods", func() { var count int for count < 1000 {