From 35193be08882bb6313ebc970af36f2cf291e80c1 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 | 6 + .../kube-apiserver/kube-apiserver.manifest | 7 +- .../kube-controller-manager.manifest | 7 +- hack/verify-flags/exceptions.txt | 6 +- test/e2e/garbage_collector.go | 197 ++++++++++++++++++ test/e2e/generated_clientset.go | 9 +- test/e2e/pod_gc.go | 4 +- 8 files changed, 226 insertions(+), 11 deletions(-) create mode 100644 test/e2e/garbage_collector.go diff --git a/cluster/common.sh b/cluster/common.sh index 492bdc63a3..ac3e9ee21f 100755 --- a/cluster/common.sh +++ b/cluster/common.sh @@ -645,6 +645,7 @@ MANIFEST_URL: $(yaml-quote ${MANIFEST_URL:-}) MANIFEST_URL_HEADER: $(yaml-quote ${MANIFEST_URL_HEADER:-}) NUM_NODES: $(yaml-quote ${NUM_NODES}) INITIAL_ETCD_CLUSTER: $(yaml-quote ${MASTER_NAME}) +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 cf1f7d7eb7..2ca552ce26 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 692b3fca0f..cb4fa4eb82 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 {