Fixing/updating e2e tests

pull/6/head
nikhiljindal 2016-08-22 10:48:43 -07:00
parent 18a8597a4e
commit db7af6c0d7
10 changed files with 196 additions and 113 deletions

View File

@ -94,7 +94,7 @@ function create-federation-api-objects {
export FEDERATION_API_NODEPORT=32111
export FEDERATION_NAMESPACE
export FEDERATION_NAME="${FEDERATION_NAME:-federation}"
export DNS_ZONE_NAME="${DNS_ZONE_NAME:-federation.example}" # See https://tools.ietf.org/html/rfc2606
export DNS_ZONE_NAME="${DNS_ZONE_NAME:-federation.example.}" # See https://tools.ietf.org/html/rfc2606
template="go run ${KUBE_ROOT}/federation/cluster/template.go"

View File

@ -40,24 +40,27 @@ var _ = framework.KubeDescribe("Federation secrets [Feature:Federation]", func()
AfterEach(func() {
framework.SkipUnlessFederated(f.Client)
nsName := f.FederationNamespace.Name
// Delete registered secrets.
// This is if a test failed, it should not affect other tests.
secretList, err := f.FederationClientset_1_4.Core().Secrets(f.Namespace.Name).List(api.ListOptions{})
secretList, err := f.FederationClientset_1_4.Core().Secrets(nsName).List(api.ListOptions{})
Expect(err).NotTo(HaveOccurred())
for _, secret := range secretList.Items {
err := f.FederationClientset_1_4.Core().Secrets(f.Namespace.Name).Delete(secret.Name, &api.DeleteOptions{})
err := f.FederationClientset_1_4.Core().Secrets(nsName).Delete(secret.Name, &api.DeleteOptions{})
Expect(err).NotTo(HaveOccurred())
}
})
It("should be created and deleted successfully", func() {
framework.SkipUnlessFederated(f.Client)
secret := createSecretOrFail(f.FederationClientset_1_4, f.Namespace.Name)
By(fmt.Sprintf("Creation of secret %q in namespace %q succeeded. Deleting secret.", secret.Name, f.Namespace.Name))
nsName := f.FederationNamespace.Name
secret := createSecretOrFail(f.FederationClientset_1_4, nsName)
By(fmt.Sprintf("Creation of secret %q in namespace %q succeeded. Deleting secret.", secret.Name, nsName))
// Cleanup
err := f.FederationClientset_1_4.Core().Secrets(f.Namespace.Name).Delete(secret.Name, &api.DeleteOptions{})
err := f.FederationClientset_1_4.Core().Secrets(nsName).Delete(secret.Name, &api.DeleteOptions{})
framework.ExpectNoError(err, "Error deleting secret %q in namespace %q", secret.Name, secret.Namespace)
By(fmt.Sprintf("Deletion of secret %q in namespace %q succeeded.", secret.Name, f.Namespace.Name))
By(fmt.Sprintf("Deletion of secret %q in namespace %q succeeded.", secret.Name, nsName))
})
})

View File

@ -76,23 +76,27 @@ var _ = framework.KubeDescribe("[Feature:Federation]", func() {
It("should succeed", func() {
framework.SkipUnlessFederated(f.Client)
service := createServiceOrFail(f.FederationClientset_1_4, f.Namespace.Name, FederatedServiceName)
By(fmt.Sprintf("Creation of service %q in namespace %q succeeded. Deleting service.", service.Name, f.Namespace.Name))
nsName := f.FederationNamespace.Name
service := createServiceOrFail(f.FederationClientset_1_4, nsName, FederatedServiceName)
By(fmt.Sprintf("Creation of service %q in namespace %q succeeded. Deleting service.", service.Name, nsName))
// Cleanup
err := f.FederationClientset_1_4.Services(f.Namespace.Name).Delete(service.Name, &api.DeleteOptions{})
err := f.FederationClientset_1_4.Services(nsName).Delete(service.Name, &api.DeleteOptions{})
framework.ExpectNoError(err, "Error deleting service %q in namespace %q", service.Name, service.Namespace)
By(fmt.Sprintf("Deletion of service %q in namespace %q succeeded.", service.Name, f.Namespace.Name))
By(fmt.Sprintf("Deletion of service %q in namespace %q succeeded.", service.Name, nsName))
})
It("should create matching services in underlying clusters", func() {
framework.SkipUnlessFederated(f.Client)
service := createServiceOrFail(f.FederationClientset_1_4, f.Namespace.Name, FederatedServiceName)
nsName := f.FederationNamespace.Name
service := createServiceOrFail(f.FederationClientset_1_4, nsName, FederatedServiceName)
defer func() { // Cleanup
By(fmt.Sprintf("Deleting service %q in namespace %q", service.Name, f.Namespace.Name))
err := f.FederationClientset_1_4.Services(f.Namespace.Name).Delete(service.Name, &api.DeleteOptions{})
framework.ExpectNoError(err, "Error deleting service %q in namespace %q", service.Name, f.Namespace.Name)
By(fmt.Sprintf("Deleting service %q in namespace %q", service.Name, nsName))
err := f.FederationClientset_1_4.Services(nsName).Delete(service.Name, &api.DeleteOptions{})
framework.ExpectNoError(err, "Error deleting service %q in namespace %q", service.Name, nsName)
}()
waitForServiceShardsOrFail(f.Namespace.Name, service, clusters)
waitForServiceShardsOrFail(nsName, service, clusters)
})
})
@ -104,17 +108,21 @@ var _ = framework.KubeDescribe("[Feature:Federation]", func() {
BeforeEach(func() {
framework.SkipUnlessFederated(f.Client)
createBackendPodsOrFail(clusters, f.Namespace.Name, FederatedServicePodName)
service = createServiceOrFail(f.FederationClientset_1_4, f.Namespace.Name, FederatedServiceName)
waitForServiceShardsOrFail(f.Namespace.Name, service, clusters)
nsName := f.FederationNamespace.Name
createBackendPodsOrFail(clusters, nsName, FederatedServicePodName)
service = createServiceOrFail(f.FederationClientset_1_4, nsName, FederatedServiceName)
waitForServiceShardsOrFail(nsName, service, clusters)
})
AfterEach(func() {
framework.SkipUnlessFederated(f.Client)
deleteBackendPodsOrFail(clusters, f.Namespace.Name)
nsName := f.FederationNamespace.Name
deleteBackendPodsOrFail(clusters, nsName)
if service != nil {
deleteServiceOrFail(f.FederationClientset_1_4, f.Namespace.Name, service.Name)
deleteServiceOrFail(f.FederationClientset_1_4, nsName, service.Name)
service = nil
} else {
By("No service to delete. Service is nil")
@ -124,12 +132,13 @@ var _ = framework.KubeDescribe("[Feature:Federation]", func() {
It("should be able to discover a federated service", func() {
framework.SkipUnlessFederated(f.Client)
nsName := f.FederationNamespace.Name
svcDNSNames := []string{
FederatedServiceName,
fmt.Sprintf("%s.%s", FederatedServiceName, f.Namespace.Name),
fmt.Sprintf("%s.%s.svc.cluster.local.", FederatedServiceName, f.Namespace.Name),
fmt.Sprintf("%s.%s.%s", FederatedServiceName, f.Namespace.Name, federationName),
fmt.Sprintf("%s.%s.%s.svc.cluster.local.", FederatedServiceName, f.Namespace.Name, federationName),
fmt.Sprintf("%s.%s", FederatedServiceName, nsName),
fmt.Sprintf("%s.%s.svc.cluster.local.", FederatedServiceName, nsName),
fmt.Sprintf("%s.%s.%s", FederatedServiceName, nsName, federationName),
fmt.Sprintf("%s.%s.%s.svc.cluster.local.", FederatedServiceName, nsName, federationName),
}
// TODO(mml): This could be much faster. We can launch all the test
// pods, perhaps in the BeforeEach, and then just poll until we get
@ -151,9 +160,10 @@ var _ = framework.KubeDescribe("[Feature:Federation]", func() {
It("should be able to discover a non-local federated service", func() {
framework.SkipUnlessFederated(f.Client)
nsName := f.FederationNamespace.Name
svcDNSNames := []string{
fmt.Sprintf("%s.%s.%s", FederatedServiceName, f.Namespace.Name, federationName),
fmt.Sprintf("%s.%s.%s.svc.cluster.local.", FederatedServiceName, f.Namespace.Name, federationName),
fmt.Sprintf("%s.%s.%s", FederatedServiceName, nsName, federationName),
fmt.Sprintf("%s.%s.%s.svc.cluster.local.", FederatedServiceName, nsName, federationName),
}
for i, name := range svcDNSNames {
discoverService(f, name, true, "federated-service-e2e-discovery-pod-"+strconv.Itoa(i))
@ -166,10 +176,11 @@ var _ = framework.KubeDescribe("[Feature:Federation]", func() {
It("should never find DNS entries for a missing local service", func() {
framework.SkipUnlessFederated(f.Client)
nsName := f.FederationNamespace.Name
localSvcDNSNames := []string{
FederatedServiceName,
fmt.Sprintf("%s.%s", FederatedServiceName, f.Namespace.Name),
fmt.Sprintf("%s.%s.svc.cluster.local.", FederatedServiceName, f.Namespace.Name),
fmt.Sprintf("%s.%s", FederatedServiceName, nsName),
fmt.Sprintf("%s.%s.svc.cluster.local.", FederatedServiceName, nsName),
}
for i, name := range localSvcDNSNames {
discoverService(f, name, false, "federated-service-e2e-discovery-pod-"+strconv.Itoa(i))

View File

@ -89,33 +89,19 @@ var _ = framework.KubeDescribe("Federation apiserver [Feature:Federation]", func
framework.SkipUnlessFederated(f.Client)
})
It("Namespace lifecycle admission control should work as expected", func() {
It("should not be able to create resources if namespace does not exist", func() {
framework.SkipUnlessFederated(f.Client)
// Ensure that a service can be created in default namespace.
svcName := "mysvc"
clientSet := f.FederationClientset_1_4
framework.Logf("Creating service %s in default namespace", svcName)
if _, err := clientSet.Core().Services(api.NamespaceDefault).Create(newService(svcName, api.NamespaceDefault)); err != nil {
framework.Failf("Expected service to be created fine in default namespace, got error: %v", err)
}
// Creating a service in a non-existing namespace should fail.
svcNamespace := "myns"
svcNamespace := "federation-admission-test-ns"
svcName := "myns"
clientset := f.FederationClientset_1_4
framework.Logf("Trying to create service %s in namespace %s, expect to get error", svcName, svcNamespace)
if _, err := clientSet.Core().Services(svcNamespace).Create(newService(svcName, svcNamespace)); err == nil {
if _, err := clientset.Core().Services(svcNamespace).Create(newService(svcName, svcNamespace)); err == nil {
framework.Failf("Expected to get an error while creating a service in a non-existing namespace")
}
// Verify that we can create the service after first creating the namespace.
framework.Logf("Creating namespace %s", svcNamespace)
if _, err := clientSet.Core().Namespaces().Create(newNamespace(svcNamespace)); err != nil {
framework.Failf("unexpected error in creating namespace: %v", err)
}
framework.Logf("Creating service %s in namespace %s", svcName, svcNamespace)
if _, err := clientSet.Core().Services(svcNamespace).Create(newService(svcName, svcNamespace)); err != nil {
framework.Failf("unexpected error in creating service after creating the namespace: %v", err)
}
// Note: We have other tests that verify that we can create resources in existing namespaces, so we dont test it again here.
})
})
})
@ -136,14 +122,6 @@ func newService(name, namespace string) *v1.Service {
}
}
func newNamespace(name string) *v1.Namespace {
return &v1.Namespace{
ObjectMeta: v1.ObjectMeta{
Name: name,
},
}
}
// Verify that the cluster is marked ready.
func isReady(clusterName string, clientset *federation_release_1_4.Clientset) error {
return wait.PollImmediate(time.Second, 5*time.Minute, func() (bool, error) {

View File

@ -40,8 +40,9 @@ var _ = framework.KubeDescribe("[Feature:Federation]", func() {
It("should accept cluster resources when the client has right authentication credentials", func() {
framework.SkipUnlessFederated(f.Client)
svc := createServiceOrFail(f.FederationClientset_1_4, f.Namespace.Name, FederatedServiceName)
deleteServiceOrFail(f.FederationClientset_1_4, f.Namespace.Name, svc.Name)
nsName := f.FederationNamespace.Name
svc := createServiceOrFail(f.FederationClientset_1_4, nsName, FederatedServiceName)
deleteServiceOrFail(f.FederationClientset_1_4, nsName, svc.Name)
})
It("should not accept cluster resources when the client has invalid authentication credentials", func() {
@ -57,10 +58,11 @@ var _ = framework.KubeDescribe("[Feature:Federation]", func() {
fcs, err := invalidAuthFederationClientSet(contexts[0].User)
framework.ExpectNoError(err)
svc, err := createService(fcs, f.Namespace.Name, FederatedServiceName)
nsName := f.FederationNamespace.Name
svc, err := createService(fcs, nsName, FederatedServiceName)
Expect(errors.IsUnauthorized(err)).To(BeTrue())
if err == nil && svc != nil {
deleteServiceOrFail(fcs, f.Namespace.Name, svc.Name)
deleteServiceOrFail(fcs, nsName, svc.Name)
}
})
@ -70,10 +72,11 @@ var _ = framework.KubeDescribe("[Feature:Federation]", func() {
fcs, err := invalidAuthFederationClientSet(nil)
ExpectNoError(err)
svc, err := createService(fcs, f.Namespace.Name, FederatedServiceName)
nsName := f.FederationNamespace.Name
svc, err := createService(fcs, nsName, FederatedServiceName)
Expect(errors.IsUnauthorized(err)).To(BeTrue())
if err == nil && svc != nil {
deleteServiceOrFail(fcs, f.Namespace.Name, svc.Name)
deleteServiceOrFail(fcs, nsName, svc.Name)
}
})
})

View File

@ -40,23 +40,26 @@ var _ = framework.KubeDescribe("Federation events [Feature:Federation]", func()
AfterEach(func() {
framework.SkipUnlessFederated(f.Client)
nsName := f.FederationNamespace.Name
// Delete registered events.
eventList, err := f.FederationClientset_1_4.Core().Events(f.Namespace.Name).List(api.ListOptions{})
eventList, err := f.FederationClientset_1_4.Core().Events(nsName).List(api.ListOptions{})
Expect(err).NotTo(HaveOccurred())
for _, event := range eventList.Items {
err := f.FederationClientset_1_4.Core().Events(f.Namespace.Name).Delete(event.Name, &api.DeleteOptions{})
err := f.FederationClientset_1_4.Core().Events(nsName).Delete(event.Name, &api.DeleteOptions{})
Expect(err).NotTo(HaveOccurred())
}
})
It("should be created and deleted successfully", func() {
framework.SkipUnlessFederated(f.Client)
event := createEventOrFail(f.FederationClientset_1_4, f.Namespace.Name)
By(fmt.Sprintf("Creation of event %q in namespace %q succeeded. Deleting event.", event.Name, f.Namespace.Name))
nsName := f.FederationNamespace.Name
event := createEventOrFail(f.FederationClientset_1_4, nsName)
By(fmt.Sprintf("Creation of event %q in namespace %q succeeded. Deleting event.", event.Name, nsName))
// Cleanup
err := f.FederationClientset_1_4.Core().Events(f.Namespace.Name).Delete(event.Name, &api.DeleteOptions{})
err := f.FederationClientset_1_4.Core().Events(nsName).Delete(event.Name, &api.DeleteOptions{})
framework.ExpectNoError(err, "Error deleting event %q in namespace %q", event.Name, event.Namespace)
By(fmt.Sprintf("Deletion of event %q in namespace %q succeeded.", event.Name, f.Namespace.Name))
By(fmt.Sprintf("Deletion of event %q in namespace %q succeeded.", event.Name, nsName))
})
})

View File

@ -42,23 +42,26 @@ var _ = framework.KubeDescribe("Federation ingresses [Feature:Federation]", func
AfterEach(func() {
framework.SkipUnlessFederated(f.Client)
nsName := f.FederationNamespace.Name
// Delete registered ingresses.
ingressList, err := f.FederationClientset_1_4.Extensions().Ingresses(f.Namespace.Name).List(api.ListOptions{})
ingressList, err := f.FederationClientset_1_4.Extensions().Ingresses(nsName).List(api.ListOptions{})
Expect(err).NotTo(HaveOccurred())
for _, ingress := range ingressList.Items {
err := f.FederationClientset_1_4.Extensions().Ingresses(f.Namespace.Name).Delete(ingress.Name, &api.DeleteOptions{})
err := f.FederationClientset_1_4.Extensions().Ingresses(nsName).Delete(ingress.Name, &api.DeleteOptions{})
Expect(err).NotTo(HaveOccurred())
}
})
It("should be created and deleted successfully", func() {
framework.SkipUnlessFederated(f.Client)
ingress := createIngressOrFail(f.FederationClientset_1_4, f.Namespace.Name)
By(fmt.Sprintf("Creation of ingress %q in namespace %q succeeded. Deleting ingress.", ingress.Name, f.Namespace.Name))
nsName := f.FederationNamespace.Name
ingress := createIngressOrFail(f.FederationClientset_1_4, nsName)
By(fmt.Sprintf("Creation of ingress %q in namespace %q succeeded. Deleting ingress.", ingress.Name, nsName))
// Cleanup
err := f.FederationClientset_1_4.Extensions().Ingresses(f.Namespace.Name).Delete(ingress.Name, &api.DeleteOptions{})
err := f.FederationClientset_1_4.Extensions().Ingresses(nsName).Delete(ingress.Name, &api.DeleteOptions{})
framework.ExpectNoError(err, "Error deleting ingress %q in namespace %q", ingress.Name, ingress.Namespace)
By(fmt.Sprintf("Deletion of ingress %q in namespace %q succeeded.", ingress.Name, f.Namespace.Name))
By(fmt.Sprintf("Deletion of ingress %q in namespace %q succeeded.", ingress.Name, nsName))
})
})

View File

@ -42,22 +42,25 @@ var _ = framework.KubeDescribe("Federation replicasets [Feature:Federation]", fu
framework.SkipUnlessFederated(f.Client)
// Delete registered replicasets.
replicasetList, err := f.FederationClientset_1_4.Extensions().ReplicaSets(f.Namespace.Name).List(api.ListOptions{})
nsName := f.FederationNamespace.Name
replicasetList, err := f.FederationClientset_1_4.Extensions().ReplicaSets(nsName).List(api.ListOptions{})
Expect(err).NotTo(HaveOccurred())
for _, replicaset := range replicasetList.Items {
err := f.FederationClientset_1_4.Extensions().ReplicaSets(f.Namespace.Name).Delete(replicaset.Name, &api.DeleteOptions{})
err := f.FederationClientset_1_4.Extensions().ReplicaSets(nsName).Delete(replicaset.Name, &api.DeleteOptions{})
Expect(err).NotTo(HaveOccurred())
}
})
It("should be created and deleted successfully", func() {
framework.SkipUnlessFederated(f.Client)
replicaset := createReplicaSetOrFail(f.FederationClientset_1_4, f.Namespace.Name)
By(fmt.Sprintf("Creation of replicaset %q in namespace %q succeeded. Deleting replicaset.", replicaset.Name, f.Namespace.Name))
nsName := f.FederationNamespace.Name
replicaset := createReplicaSetOrFail(f.FederationClientset_1_4, nsName)
By(fmt.Sprintf("Creation of replicaset %q in namespace %q succeeded. Deleting replicaset.", replicaset.Name, nsName))
// Cleanup
err := f.FederationClientset_1_4.Extensions().ReplicaSets(f.Namespace.Name).Delete(replicaset.Name, &api.DeleteOptions{})
err := f.FederationClientset_1_4.Extensions().ReplicaSets(nsName).Delete(replicaset.Name, &api.DeleteOptions{})
framework.ExpectNoError(err, "Error deleting replicaset %q in namespace %q", replicaset.Name, replicaset.Namespace)
By(fmt.Sprintf("Deletion of replicaset %q in namespace %q succeeded.", replicaset.Name, f.Namespace.Name))
By(fmt.Sprintf("Deletion of replicaset %q in namespace %q succeeded.", replicaset.Name, nsName))
})
})
@ -72,7 +75,8 @@ func createReplicaSetOrFail(clientset *federation_release_1_4.Clientset, namespa
replicas := int32(5)
replicaset := &v1beta1.ReplicaSet{
ObjectMeta: v1.ObjectMeta{
Name: FederationReplicaSetName,
Name: FederationReplicaSetName,
Namespace: namespace,
},
Spec: v1beta1.ReplicaSetSpec{
Replicas: &replicas,

View File

@ -134,34 +134,41 @@ func createClientsetForCluster(c federationapi.Cluster, i int, userAgentName str
return release_1_3.NewForConfigOrDie(restclient.AddUserAgent(cfg, userAgentName))
}
// Creates the federation namespace in all underlying clusters.
func createNamespaceInClusters(clusters map[string]*cluster, f *framework.Framework) {
nsName := f.FederationNamespace.Name
for name, c := range clusters {
// The e2e Framework created the required namespace in one of the clusters, but we need to create it in all the others, if it doesn't yet exist.
if _, err := c.Clientset.Core().Namespaces().Get(f.Namespace.Name); errors.IsNotFound(err) {
// The e2e Framework created the required namespace in federation control plane, but we need to create it in all the others, if it doesn't yet exist.
// TODO(nikhiljindal): remove this once we have the namespace controller working as expected.
if _, err := c.Clientset.Core().Namespaces().Get(nsName); errors.IsNotFound(err) {
ns := &v1.Namespace{
ObjectMeta: v1.ObjectMeta{
Name: f.Namespace.Name,
Name: nsName,
},
}
_, err := c.Clientset.Core().Namespaces().Create(ns)
if err == nil {
c.namespaceCreated = true
}
framework.ExpectNoError(err, "Couldn't create the namespace %s in cluster %q", f.Namespace.Name, name)
framework.Logf("Namespace %s created in cluster %q", f.Namespace.Name, name)
framework.ExpectNoError(err, "Couldn't create the namespace %s in cluster %q", nsName, name)
framework.Logf("Namespace %s created in cluster %q", nsName, name)
} else if err != nil {
framework.Logf("Couldn't create the namespace %s in cluster %q: %v", f.Namespace.Name, name, err)
framework.Logf("Couldn't create the namespace %s in cluster %q: %v", nsName, name, err)
}
}
}
// Unregisters the given clusters from federation control plane.
// Also deletes the federation namespace from each cluster.
func unregisterClusters(clusters map[string]*cluster, f *framework.Framework) {
nsName := f.FederationNamespace.Name
for name, c := range clusters {
if c.namespaceCreated {
if _, err := c.Clientset.Core().Namespaces().Get(f.Namespace.Name); !errors.IsNotFound(err) {
err := c.Clientset.Core().Namespaces().Delete(f.Namespace.Name, &api.DeleteOptions{})
framework.ExpectNoError(err, "Couldn't delete the namespace %s in cluster %q: %v", f.Namespace.Name, name, err)
if _, err := c.Clientset.Core().Namespaces().Get(nsName); !errors.IsNotFound(err) {
err := c.Clientset.Core().Namespaces().Delete(nsName, &api.DeleteOptions{})
framework.ExpectNoError(err, "Couldn't delete the namespace %s in cluster %q: %v", nsName, name, err)
}
framework.Logf("Namespace %s deleted in cluster %q", f.Namespace.Name, name)
framework.Logf("Namespace %s deleted in cluster %q", nsName, name)
}
}
@ -248,7 +255,8 @@ func createService(clientset *federation_release_1_4.Clientset, namespace, name
service := &v1.Service{
ObjectMeta: v1.ObjectMeta{
Name: name,
Name: name,
Namespace: namespace,
},
Spec: v1.ServiceSpec{
Selector: FederatedServiceLabels,
@ -281,7 +289,7 @@ func deleteServiceOrFail(clientset *federation_release_1_4.Clientset, namespace
framework.ExpectNoError(err, "Error deleting service %q from namespace %q", serviceName, namespace)
}
func podExitCodeDetector(f *framework.Framework, name string, code int32) func() error {
func podExitCodeDetector(f *framework.Framework, name, namespace string, code int32) func() error {
// If we ever get any container logs, stash them here.
logs := ""
@ -296,7 +304,7 @@ func podExitCodeDetector(f *framework.Framework, name string, code int32) func()
}
return func() error {
pod, err := f.Client.Pods(f.Namespace.Name).Get(name)
pod, err := f.Client.Pods(namespace).Get(name)
if err != nil {
return logerr(err)
}
@ -305,7 +313,7 @@ func podExitCodeDetector(f *framework.Framework, name string, code int32) func()
}
// Best effort attempt to grab pod logs for debugging
logs, err = framework.GetPodLogs(f.Client, f.Namespace.Name, name, pod.Spec.Containers[0].Name)
logs, err = framework.GetPodLogs(f.Client, namespace, name, pod.Spec.Containers[0].Name)
if err != nil {
framework.Logf("Cannot fetch pod logs: %v", err)
}
@ -342,23 +350,24 @@ func discoverService(f *framework.Framework, name string, exists bool, podName s
},
}
By(fmt.Sprintf("Creating pod %q in namespace %q", pod.Name, f.Namespace.Name))
_, err := f.Client.Pods(f.Namespace.Name).Create(pod)
nsName := f.FederationNamespace.Name
By(fmt.Sprintf("Creating pod %q in namespace %q", pod.Name, nsName))
_, err := f.Client.Pods(nsName).Create(pod)
framework.ExpectNoError(err, "Trying to create pod to run %q", command)
By(fmt.Sprintf("Successfully created pod %q in namespace %q", pod.Name, f.Namespace.Name))
By(fmt.Sprintf("Successfully created pod %q in namespace %q", pod.Name, nsName))
defer func() {
By(fmt.Sprintf("Deleting pod %q from namespace %q", podName, f.Namespace.Name))
err := f.Client.Pods(f.Namespace.Name).Delete(podName, api.NewDeleteOptions(0))
framework.ExpectNoError(err, "Deleting pod %q from namespace %q", podName, f.Namespace.Name)
By(fmt.Sprintf("Deleted pod %q from namespace %q", podName, f.Namespace.Name))
By(fmt.Sprintf("Deleting pod %q from namespace %q", podName, nsName))
err := f.Client.Pods(nsName).Delete(podName, api.NewDeleteOptions(0))
framework.ExpectNoError(err, "Deleting pod %q from namespace %q", podName, nsName)
By(fmt.Sprintf("Deleted pod %q from namespace %q", podName, nsName))
}()
if exists {
// TODO(mml): Eventually check the IP address is correct, too.
Eventually(podExitCodeDetector(f, podName, 0), 3*DNSTTL, time.Second*2).
Eventually(podExitCodeDetector(f, podName, nsName, 0), 3*DNSTTL, time.Second*2).
Should(BeNil(), "%q should exit 0, but it never did", command)
} else {
Eventually(podExitCodeDetector(f, podName, 0), 3*DNSTTL, time.Second*2).
Eventually(podExitCodeDetector(f, podName, nsName, 0), 3*DNSTTL, time.Second*2).
ShouldNot(BeNil(), "%q should eventually not exit 0, but it always did", command)
}
}

View File

@ -33,6 +33,7 @@ import (
"k8s.io/kubernetes/pkg/api"
apierrs "k8s.io/kubernetes/pkg/api/errors"
"k8s.io/kubernetes/pkg/api/unversioned"
"k8s.io/kubernetes/pkg/api/v1"
"k8s.io/kubernetes/pkg/client/clientset_generated/release_1_2"
"k8s.io/kubernetes/pkg/client/clientset_generated/release_1_3"
"k8s.io/kubernetes/pkg/client/restclient"
@ -62,8 +63,6 @@ type Framework struct {
Clientset_1_3 *release_1_3.Clientset
StagingClient *release_1_4.Clientset
FederationClientset_1_4 *federation_release_1_4.Clientset
Namespace *api.Namespace // Every test has at least one namespace
namespacesToDelete []*api.Namespace // Some tests have more than one.
NamespaceDeletionTimeout time.Duration
@ -88,6 +87,10 @@ type Framework struct {
// will this framework exercise a federated cluster as well
federated bool
// Federation specific params. These are set only if federated = true.
FederationClientset_1_4 *federation_release_1_4.Clientset
FederationNamespace *v1.Namespace
}
type TestDataSummary interface {
@ -192,12 +195,6 @@ func (f *Framework) BeforeEach() {
}
if f.federated {
if f.FederationClientset_1_4 == nil {
By("Creating a release 1.4 federation Clientset")
var err error
f.FederationClientset_1_4, err = LoadFederationClientset_1_4()
Expect(err).NotTo(HaveOccurred())
}
if f.FederationClientset_1_4 == nil {
By("Creating a release 1.4 federation Clientset")
var err error
@ -208,6 +205,12 @@ func (f *Framework) BeforeEach() {
err := WaitForFederationApiserverReady(f.FederationClientset_1_4)
Expect(err).NotTo(HaveOccurred())
By("federation-apiserver is ready")
By("Creating a federation namespace")
ns, err := f.createFederationNamespace(f.BaseName)
Expect(err).NotTo(HaveOccurred())
f.FederationNamespace = ns
By(fmt.Sprintf("Created federation namespace %s", ns.Name))
}
By("Building a namespace api object")
@ -250,6 +253,41 @@ func (f *Framework) BeforeEach() {
}
}
func (f *Framework) deleteFederationNs() {
ns := f.FederationNamespace
By(fmt.Sprintf("Destroying federation namespace %q for this suite.", ns.Name))
timeout := 5 * time.Minute
if f.NamespaceDeletionTimeout != 0 {
timeout = f.NamespaceDeletionTimeout
}
clientset := f.FederationClientset_1_4
// First delete the namespace from federation apiserver.
if err := clientset.Core().Namespaces().Delete(ns.Name, &api.DeleteOptions{}); err != nil {
Failf("Error while deleting federation namespace %s: %s", ns.Name, err)
}
// Verify that it got deleted.
err := wait.PollImmediate(5*time.Second, timeout, func() (bool, error) {
if _, err := clientset.Core().Namespaces().Get(ns.Name); err != nil {
if apierrs.IsNotFound(err) {
return true, nil
}
Logf("Error while waiting for namespace to be terminated: %v", err)
return false, nil
}
return false, nil
})
if err != nil {
if !apierrs.IsNotFound(err) {
Failf("Couldn't delete ns %q: %s", ns.Name, err)
} else {
Logf("Namespace %v was already deleted", ns.Name)
}
}
// TODO: Delete the namespace from underlying clusters.
}
// AfterEach deletes the namespace, after reading its events.
func (f *Framework) AfterEach() {
RemoveCleanupAction(f.cleanupHandle)
@ -274,12 +312,20 @@ func (f *Framework) AfterEach() {
}
}
f.namespacesToDelete = nil
// Delete the federation namespace.
// TODO(nikhiljindal): Uncomment this, once https://github.com/kubernetes/kubernetes/issues/31077 is fixed.
// In the meantime, we will have these extra namespaces in all clusters.
// Note: this will not cause any failure since we create a new namespace for each test in BeforeEach().
// f.deleteFederationNs()
} else {
Logf("Found DeleteNamespace=false, skipping namespace deletion!")
}
// Paranoia-- prevent reuse!
f.Namespace = nil
f.FederationNamespace = nil
f.Client = nil
}()
@ -375,6 +421,29 @@ func (f *Framework) CreateNamespace(baseName string, labels map[string]string) (
return ns, err
}
func (f *Framework) createFederationNamespace(baseName string) (*v1.Namespace, error) {
clientset := f.FederationClientset_1_4
namespaceObj := &v1.Namespace{
ObjectMeta: v1.ObjectMeta{
GenerateName: fmt.Sprintf("e2e-tests-%v-", baseName),
},
}
// Be robust about making the namespace creation call.
var got *v1.Namespace
if err := wait.PollImmediate(Poll, SingleCallTimeout, func() (bool, error) {
var err error
got, err = clientset.Core().Namespaces().Create(namespaceObj)
if err != nil {
Logf("Unexpected error while creating namespace: %v", err)
return false, nil
}
return true, nil
}); err != nil {
return nil, err
}
return got, nil
}
// WaitForPodTerminated waits for the pod to be terminated with the given reason.
func (f *Framework) WaitForPodTerminated(podName, reason string) error {
return waitForPodTerminatedInNamespace(f.Client, podName, reason, f.Namespace.Name)