From 773cf73f0ef9a963c89a829176b6425405297588 Mon Sep 17 00:00:00 2001 From: derekwaynecarr Date: Wed, 2 Mar 2016 23:34:45 -0500 Subject: [PATCH] Add e2e tests to verify more resources are deleted --- test/e2e/namespace.go | 112 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 112 insertions(+) diff --git a/test/e2e/namespace.go b/test/e2e/namespace.go index fef6129682b..91039e2708e 100644 --- a/test/e2e/namespace.go +++ b/test/e2e/namespace.go @@ -23,6 +23,8 @@ import ( "time" "k8s.io/kubernetes/pkg/api" + "k8s.io/kubernetes/pkg/api/errors" + "k8s.io/kubernetes/pkg/util/intstr" "k8s.io/kubernetes/pkg/util/wait" . "github.com/onsi/ginkgo" @@ -74,6 +76,109 @@ func extinguish(f *Framework, totalNS int, maxAllowedAfterDel int, maxSeconds in })) } +func ensurePodsAreRemovedWhenNamespaceIsDeleted(f *Framework) { + var err error + + By("Creating a test namespace") + namespace, err := f.CreateNamespace("nsdeletetest", nil) + Expect(err).NotTo(HaveOccurred()) + + By("Waiting for a default service account to be provisioned in namespace") + err = waitForDefaultServiceAccountInNamespace(f.Client, namespace.Name) + Expect(err).NotTo(HaveOccurred()) + + By("Creating a pod in the namespace") + pod := &api.Pod{ + ObjectMeta: api.ObjectMeta{ + Name: "test-pod", + }, + Spec: api.PodSpec{ + Containers: []api.Container{ + { + Name: "nginx", + Image: "gcr.io/google_containers/pause:2.0", + }, + }, + }, + } + pod, err = f.Client.Pods(namespace.Name).Create(pod) + Expect(err).NotTo(HaveOccurred()) + + By("Waiting for the pod to have running status") + expectNoError(waitForPodRunningInNamespace(f.Client, pod.Name, pod.Namespace)) + + By("Deleting the namespace") + err = f.Client.Namespaces().Delete(namespace.Name) + Expect(err).NotTo(HaveOccurred()) + + By("Waiting for the namespace to be removed.") + maxWaitSeconds := int64(60) + *pod.Spec.TerminationGracePeriodSeconds + expectNoError(wait.Poll(1*time.Second, time.Duration(maxWaitSeconds)*time.Second, + func() (bool, error) { + _, err = f.Client.Namespaces().Get(namespace.Name) + if err != nil && errors.IsNotFound(err) { + return true, nil + } + return false, nil + })) + + By("Verifying there is no pod in the namespace") + _, err = f.Client.Pods(namespace.Name).Get(pod.Name) + Expect(err).To(HaveOccurred()) +} + +func ensureServicesAreRemovedWhenNamespaceIsDeleted(f *Framework) { + var err error + + By("Creating a test namespace") + namespace, err := f.CreateNamespace("nsdeletetest", nil) + Expect(err).NotTo(HaveOccurred()) + + By("Waiting for a default service account to be provisioned in namespace") + err = waitForDefaultServiceAccountInNamespace(f.Client, namespace.Name) + Expect(err).NotTo(HaveOccurred()) + + By("Creating a service in the namespace") + serviceName := "test-service" + labels := map[string]string{ + "foo": "bar", + "baz": "blah", + } + service := &api.Service{ + ObjectMeta: api.ObjectMeta{ + Name: serviceName, + }, + Spec: api.ServiceSpec{ + Selector: labels, + Ports: []api.ServicePort{{ + Port: 80, + TargetPort: intstr.FromInt(80), + }}, + }, + } + service, err = f.Client.Services(namespace.Name).Create(service) + Expect(err).NotTo(HaveOccurred()) + + By("Deleting the namespace") + err = f.Client.Namespaces().Delete(namespace.Name) + Expect(err).NotTo(HaveOccurred()) + + By("Waiting for the namespace to be removed.") + maxWaitSeconds := int64(60) + expectNoError(wait.Poll(1*time.Second, time.Duration(maxWaitSeconds)*time.Second, + func() (bool, error) { + _, err = f.Client.Namespaces().Get(namespace.Name) + if err != nil && errors.IsNotFound(err) { + return true, nil + } + return false, nil + })) + + By("Verifying there is no service in the namespace") + _, err = f.Client.Services(namespace.Name).Get(service.Name) + Expect(err).To(HaveOccurred()) +} + // This test must run [Serial] due to the impact of running other parallel // tests can have on its performance. Each test that follows the common // test framework follows this pattern: @@ -106,10 +211,17 @@ var _ = Describe("Namespaces [Serial]", func() { f := NewDefaultFramework("namespaces") + It("should ensure that all pods are removed when a namespace is deleted.", + func() { ensurePodsAreRemovedWhenNamespaceIsDeleted(f) }) + + It("should ensure that all services are removed when a namespace is deleted.", + func() { ensureServicesAreRemovedWhenNamespaceIsDeleted(f) }) + It("should delete fast enough (90 percent of 100 namespaces in 150 seconds)", func() { extinguish(f, 100, 10, 150) }) // On hold until etcd3; see #7372 It("should always delete fast (ALL of 100 namespaces in 150 seconds) [Feature:ComprehensiveNamespaceDraining]", func() { extinguish(f, 100, 0, 150) }) + })