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 {
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

View File

@ -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

View File

@ -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])
})

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).
// 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))
}