From b2bdc9235ebeb0e48f82f51472f97742b146bcce Mon Sep 17 00:00:00 2001 From: Maru Newby Date: Tue, 4 Apr 2017 08:49:23 -0700 Subject: [PATCH] fed: Refactor e2e backend pod management for maintainability This change separates backend pod management from cluster management --- test/e2e_federation/framework/cluster.go | 1 - test/e2e_federation/ingress.go | 8 ++++++-- test/e2e_federation/service.go | 8 +++++--- test/e2e_federation/util.go | 26 +++++++++++++++--------- 4 files changed, 27 insertions(+), 16 deletions(-) diff --git a/test/e2e_federation/framework/cluster.go b/test/e2e_federation/framework/cluster.go index bbfdcf7c12e..dd073e12912 100644 --- a/test/e2e_federation/framework/cluster.go +++ b/test/e2e_federation/framework/cluster.go @@ -53,7 +53,6 @@ type ClusterMap map[string]*Cluster type Cluster struct { Name string *kubeclientset.Clientset - BackendPod *v1.Pod // The backend pod, if one's been created. } // can not be moved to util, as By and Expect must be put in Ginkgo test unit diff --git a/test/e2e_federation/ingress.go b/test/e2e_federation/ingress.go index 24ac3306afb..f035efa9845 100644 --- a/test/e2e_federation/ingress.go +++ b/test/e2e_federation/ingress.go @@ -221,10 +221,12 @@ var _ = framework.KubeDescribe("Federated ingresses [Feature:Federation]", func( var _ = Describe("Ingress connectivity and DNS", func() { + var backendPods BackendPodMap + BeforeEach(func() { fedframework.SkipUnlessFederated(f.ClientSet) // create backend pod - createBackendPodsOrFail(clusters, ns, FederatedIngressServicePodName) + backendPods = createBackendPodsOrFail(clusters, ns, FederatedIngressServicePodName) // create ingress object jig.ing = createIngressOrFail(f.FederationClientset, ns, service.Name, FederatedIngressTLSSecretName) // wait for ingress objects sync @@ -233,7 +235,9 @@ var _ = framework.KubeDescribe("Federated ingresses [Feature:Federation]", func( }) AfterEach(func() { - deleteBackendPodsOrFail(clusters, ns) + deleteBackendPodsOrFail(clusters, backendPods) + backendPods = nil + if jig.ing != nil { By(fmt.Sprintf("Deleting ingress %v on all clusters", jig.ing.Name)) orphanDependents := false diff --git a/test/e2e_federation/service.go b/test/e2e_federation/service.go index 3fd01506e36..ecd745400e0 100644 --- a/test/e2e_federation/service.go +++ b/test/e2e_federation/service.go @@ -146,6 +146,7 @@ var _ = framework.KubeDescribe("Federated Services [Feature:Federation]", func() var ( service *v1.Service serviceShard *v1.Service + backendPods BackendPodMap ) BeforeEach(func() { @@ -153,7 +154,7 @@ var _ = framework.KubeDescribe("Federated Services [Feature:Federation]", func() nsName := f.FederationNamespace.Name - createBackendPodsOrFail(clusters, nsName, FederatedServicePodName) + backendPods = createBackendPodsOrFail(clusters, nsName, FederatedServicePodName) service = createServiceOrFail(f.FederationClientset, nsName, FederatedServiceName) obj, err := api.Scheme.DeepCopy(service) @@ -191,7 +192,8 @@ var _ = framework.KubeDescribe("Federated Services [Feature:Federation]", func() fedframework.SkipUnlessFederated(f.ClientSet) nsName := f.FederationNamespace.Name - deleteBackendPodsOrFail(clusters, nsName) + deleteBackendPodsOrFail(clusters, backendPods) + backendPods = nil if service != nil { deleteServiceOrFail(f.FederationClientset, nsName, service.Name, nil) @@ -245,7 +247,7 @@ var _ = framework.KubeDescribe("Federated Services [Feature:Federation]", func() fedframework.SkipUnlessFederated(f.ClientSet) // Delete all the backend pods from the shard which is local to the discovery pod. - deleteOneBackendPodOrFail(clusters[primaryClusterName]) + deleteOneBackendPodOrFail(clusters[primaryClusterName], backendPods[primaryClusterName]) }) diff --git a/test/e2e_federation/util.go b/test/e2e_federation/util.go index 7817431cc9f..3ba14101754 100644 --- a/test/e2e_federation/util.go +++ b/test/e2e_federation/util.go @@ -337,9 +337,12 @@ func discoverService(f *fedframework.Framework, name string, exists bool, podNam } } -// createBackendPodsOrFail creates one pod in each cluster, and returns the created pods (in the same order as clusterClientSets). -// If creation of any pod fails, the test fails (possibly with a partially created set of pods). No retries are attempted. -func createBackendPodsOrFail(clusters fedframework.ClusterMap, namespace string, name string) { +// BackendPodMap maps a cluster name to a backend pod created in that cluster +type BackendPodMap map[string]*v1.Pod + +// createBackendPodsOrFail creates one pod in each cluster, and returns the created pods. If creation of any pod fails, +// the test fails (possibly with a partially created set of pods). No retries are attempted. +func createBackendPodsOrFail(clusters fedframework.ClusterMap, namespace string, name string) BackendPodMap { pod := &v1.Pod{ ObjectMeta: metav1.ObjectMeta{ Name: name, @@ -356,19 +359,20 @@ func createBackendPodsOrFail(clusters fedframework.ClusterMap, namespace string, RestartPolicy: v1.RestartPolicyAlways, }, } + podMap := make(BackendPodMap) for name, c := range clusters { By(fmt.Sprintf("Creating pod %q in namespace %q in cluster %q", pod.Name, namespace, name)) createdPod, err := c.Clientset.Core().Pods(namespace).Create(pod) framework.ExpectNoError(err, "Creating pod %q in namespace %q in cluster %q", name, namespace, name) By(fmt.Sprintf("Successfully created pod %q in namespace %q in cluster %q: %v", pod.Name, namespace, name, *createdPod)) - c.BackendPod = createdPod + podMap[name] = createdPod } + return podMap } // deleteOneBackendPodOrFail deletes exactly one backend pod which must not be nil // The test fails if there are any errors. -func deleteOneBackendPodOrFail(c *fedframework.Cluster) { - pod := c.BackendPod +func deleteOneBackendPodOrFail(c *fedframework.Cluster, pod *v1.Pod) { Expect(pod).ToNot(BeNil()) err := c.Clientset.Core().Pods(pod.Namespace).Delete(pod.Name, metav1.NewDeleteOptions(0)) msgFmt := fmt.Sprintf("Deleting Pod %q in namespace %q in cluster %q %%v", pod.Name, pod.Namespace, c.Name) @@ -382,11 +386,13 @@ func deleteOneBackendPodOrFail(c *fedframework.Cluster) { // deleteBackendPodsOrFail deletes one pod from each cluster that has one. // If deletion of any pod fails, the test fails (possibly with a partially deleted set of pods). No retries are attempted. -func deleteBackendPodsOrFail(clusters fedframework.ClusterMap, namespace string) { +func deleteBackendPodsOrFail(clusters fedframework.ClusterMap, backendPods BackendPodMap) { + if backendPods == nil { + return + } for name, c := range clusters { - if c.BackendPod != nil { - deleteOneBackendPodOrFail(c) - c.BackendPod = nil + if pod, ok := backendPods[name]; ok { + deleteOneBackendPodOrFail(c, pod) } else { By(fmt.Sprintf("No backend pod to delete for cluster %q", name)) }