fed: Refactor e2e backend pod management for maintainability

This change separates backend pod management from cluster management
This commit is contained in:
Maru Newby 2017-04-04 08:49:23 -07:00
parent 25da547399
commit b2bdc9235e
4 changed files with 27 additions and 16 deletions

View File

@ -53,7 +53,6 @@ type ClusterMap map[string]*Cluster
type Cluster struct { type Cluster struct {
Name string Name string
*kubeclientset.Clientset *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 // can not be moved to util, as By and Expect must be put in Ginkgo test unit

View File

@ -221,10 +221,12 @@ var _ = framework.KubeDescribe("Federated ingresses [Feature:Federation]", func(
var _ = Describe("Ingress connectivity and DNS", func() { var _ = Describe("Ingress connectivity and DNS", func() {
var backendPods BackendPodMap
BeforeEach(func() { BeforeEach(func() {
fedframework.SkipUnlessFederated(f.ClientSet) fedframework.SkipUnlessFederated(f.ClientSet)
// create backend pod // create backend pod
createBackendPodsOrFail(clusters, ns, FederatedIngressServicePodName) backendPods = createBackendPodsOrFail(clusters, ns, FederatedIngressServicePodName)
// create ingress object // create ingress object
jig.ing = createIngressOrFail(f.FederationClientset, ns, service.Name, FederatedIngressTLSSecretName) jig.ing = createIngressOrFail(f.FederationClientset, ns, service.Name, FederatedIngressTLSSecretName)
// wait for ingress objects sync // wait for ingress objects sync
@ -233,7 +235,9 @@ var _ = framework.KubeDescribe("Federated ingresses [Feature:Federation]", func(
}) })
AfterEach(func() { AfterEach(func() {
deleteBackendPodsOrFail(clusters, ns) deleteBackendPodsOrFail(clusters, backendPods)
backendPods = nil
if jig.ing != nil { if jig.ing != nil {
By(fmt.Sprintf("Deleting ingress %v on all clusters", jig.ing.Name)) By(fmt.Sprintf("Deleting ingress %v on all clusters", jig.ing.Name))
orphanDependents := false orphanDependents := false

View File

@ -146,6 +146,7 @@ var _ = framework.KubeDescribe("Federated Services [Feature:Federation]", func()
var ( var (
service *v1.Service service *v1.Service
serviceShard *v1.Service serviceShard *v1.Service
backendPods BackendPodMap
) )
BeforeEach(func() { BeforeEach(func() {
@ -153,7 +154,7 @@ var _ = framework.KubeDescribe("Federated Services [Feature:Federation]", func()
nsName := f.FederationNamespace.Name nsName := f.FederationNamespace.Name
createBackendPodsOrFail(clusters, nsName, FederatedServicePodName) backendPods = createBackendPodsOrFail(clusters, nsName, FederatedServicePodName)
service = createServiceOrFail(f.FederationClientset, nsName, FederatedServiceName) service = createServiceOrFail(f.FederationClientset, nsName, FederatedServiceName)
obj, err := api.Scheme.DeepCopy(service) obj, err := api.Scheme.DeepCopy(service)
@ -191,7 +192,8 @@ var _ = framework.KubeDescribe("Federated Services [Feature:Federation]", func()
fedframework.SkipUnlessFederated(f.ClientSet) fedframework.SkipUnlessFederated(f.ClientSet)
nsName := f.FederationNamespace.Name nsName := f.FederationNamespace.Name
deleteBackendPodsOrFail(clusters, nsName) deleteBackendPodsOrFail(clusters, backendPods)
backendPods = nil
if service != nil { if service != nil {
deleteServiceOrFail(f.FederationClientset, nsName, service.Name, nil) deleteServiceOrFail(f.FederationClientset, nsName, service.Name, nil)
@ -245,7 +247,7 @@ var _ = framework.KubeDescribe("Federated Services [Feature:Federation]", func()
fedframework.SkipUnlessFederated(f.ClientSet) fedframework.SkipUnlessFederated(f.ClientSet)
// Delete all the backend pods from the shard which is local to the discovery pod. // Delete all the backend pods from the shard which is local to the discovery pod.
deleteOneBackendPodOrFail(clusters[primaryClusterName]) deleteOneBackendPodOrFail(clusters[primaryClusterName], backendPods[primaryClusterName])
}) })

View File

@ -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). // BackendPodMap maps a cluster name to a backend pod created in that cluster
// If creation of any pod fails, the test fails (possibly with a partially created set of pods). No retries are attempted. type BackendPodMap map[string]*v1.Pod
func createBackendPodsOrFail(clusters fedframework.ClusterMap, namespace string, name string) {
// 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{ pod := &v1.Pod{
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
Name: name, Name: name,
@ -356,19 +359,20 @@ func createBackendPodsOrFail(clusters fedframework.ClusterMap, namespace string,
RestartPolicy: v1.RestartPolicyAlways, RestartPolicy: v1.RestartPolicyAlways,
}, },
} }
podMap := make(BackendPodMap)
for name, c := range clusters { for name, c := range clusters {
By(fmt.Sprintf("Creating pod %q in namespace %q in cluster %q", pod.Name, namespace, name)) 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) createdPod, err := c.Clientset.Core().Pods(namespace).Create(pod)
framework.ExpectNoError(err, "Creating pod %q in namespace %q in cluster %q", name, namespace, name) 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)) 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 // deleteOneBackendPodOrFail deletes exactly one backend pod which must not be nil
// The test fails if there are any errors. // The test fails if there are any errors.
func deleteOneBackendPodOrFail(c *fedframework.Cluster) { func deleteOneBackendPodOrFail(c *fedframework.Cluster, pod *v1.Pod) {
pod := c.BackendPod
Expect(pod).ToNot(BeNil()) Expect(pod).ToNot(BeNil())
err := c.Clientset.Core().Pods(pod.Namespace).Delete(pod.Name, metav1.NewDeleteOptions(0)) 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) 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. // 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. // 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 { for name, c := range clusters {
if c.BackendPod != nil { if pod, ok := backendPods[name]; ok {
deleteOneBackendPodOrFail(c) deleteOneBackendPodOrFail(c, pod)
c.BackendPod = nil
} else { } else {
By(fmt.Sprintf("No backend pod to delete for cluster %q", name)) By(fmt.Sprintf("No backend pod to delete for cluster %q", name))
} }