diff --git a/test/e2e/federated-service.go b/test/e2e/federated-service.go index ec2f448805d..c9fa7f1cf53 100644 --- a/test/e2e/federated-service.go +++ b/test/e2e/federated-service.go @@ -44,7 +44,7 @@ const ( KubeAPIQPS = 20.0 KubeAPIBurst = 30 - FederatedServiceTimeout = 5 * time.Minute + FederatedServiceTimeout = 60 * time.Second FederatedServiceName = "federated-service" FederatedServicePod = "federated-service-test-pod" @@ -52,7 +52,7 @@ const ( DefaultFederationName = "federation" ) -var _ = framework.KubeDescribe("Service [Feature:Federation]", func() { +var _ = framework.KubeDescribe("[Feature:Federation] Federated Services", func() { var clusterClientSets []*release_1_3.Clientset var federationName string f := framework.NewDefaultFederatedFramework("service") @@ -68,28 +68,7 @@ var _ = framework.KubeDescribe("Service [Feature:Federation]", func() { contexts := f.GetUnderlyingFederatedContexts() for _, context := range contexts { - framework.Logf("Creating cluster object: %s (%s)", context.Name, context.Cluster.Cluster.Server) - cluster := federation.Cluster{ - ObjectMeta: api.ObjectMeta{ - Name: context.Name, - }, - Spec: federation.ClusterSpec{ - ServerAddressByClientCIDRs: []federation.ServerAddressByClientCIDR{ - { - ClientCIDR: "0.0.0.0/0", - ServerAddress: context.Cluster.Cluster.Server, - }, - }, - SecretRef: &api.LocalObjectReference{ - // Note: Name must correlate with federation build script secret name, - // which currently matches the cluster name. - // See federation/cluster/common.sh:132 - Name: context.Name, - }, - }, - } - _, err := f.FederationClientset.Federation().Clusters().Create(&cluster) - framework.ExpectNoError(err, "Creating cluster") + createClusterObjectOrFail(f, &context) } var clusterList *federation.ClusterList @@ -109,6 +88,12 @@ var _ = framework.KubeDescribe("Service [Feature:Federation]", func() { framework.Failf("Failed to list registered clusters: %+v", err) } + framework.Logf("Checking that %d clusters are Ready", len(contexts)) + for _, context := range contexts { + clusterIsReadyOrFail(f, &context) + } + framework.Logf("%d clusters are Ready", len(contexts)) + for _, cluster := range clusterList.Items { framework.Logf("Creating a clientset for the cluster %s", cluster.Name) @@ -240,6 +225,12 @@ func waitForFederatedServiceShard(cs *release_1_3.Clientset, namespace string, s clSvc.Spec.ClusterIP = "" Expect(clSvc.Name).To(Equal(service.Name)) + // Some fields are expected to be different, so make them the same before checking equality. + clSvc.Spec.ClusterIP = service.Spec.ClusterIP + clSvc.Spec.ExternalIPs = service.Spec.ExternalIPs + clSvc.Spec.DeprecatedPublicIPs = service.Spec.DeprecatedPublicIPs + clSvc.Spec.LoadBalancerIP = service.Spec.LoadBalancerIP + clSvc.Spec.LoadBalancerSourceRanges = service.Spec.LoadBalancerSourceRanges Expect(clSvc.Spec).To(Equal(service.Spec)) } } @@ -275,7 +266,8 @@ func createService(fcs *federation_release_1_3.Clientset, clusterClientSets []*r }, } nservice, err := fcs.Core().Services(namespace).Create(service) - Expect(err).NotTo(HaveOccurred()) + framework.Logf("Trying to create service %q in namespace %q", service.ObjectMeta.Name, service.ObjectMeta.Namespace) + Expect(err).NotTo(HaveOccurred(), fmt.Sprintf("creating service %s: %+v", service.Name, err)) for _, cs := range clusterClientSets { waitForFederatedServiceShard(cs, namespace, nservice, 1) } diff --git a/test/e2e/federation-apiserver.go b/test/e2e/federation-apiserver.go index 1d5d086b8f3..e12ce229148 100644 --- a/test/e2e/federation-apiserver.go +++ b/test/e2e/federation-apiserver.go @@ -35,7 +35,7 @@ var _ = framework.KubeDescribe("Federation apiserver [Feature:Federation]", func f := framework.NewDefaultFederatedFramework("federation-cluster") AfterEach(func() { - framework.SkipUnlessFederated(f.Client) + // framework.SkipUnlessFederated(f.Client) TODO: quinton-hoole: Temporarily disabled // Delete registered clusters. // This is if a test failed, it should not affect other tests. @@ -52,54 +52,34 @@ var _ = framework.KubeDescribe("Federation apiserver [Feature:Federation]", func contexts := f.GetUnderlyingFederatedContexts() + framework.Logf("Creating %d cluster objects", len(contexts)) for _, context := range contexts { - framework.Logf("Creating cluster object: %s (%s, secret: %s)", context.Name, context.Cluster.Cluster.Server, context.Name) - cluster := federationapi.Cluster{ - ObjectMeta: api.ObjectMeta{ - Name: context.Name, - }, - Spec: federationapi.ClusterSpec{ - ServerAddressByClientCIDRs: []federationapi.ServerAddressByClientCIDR{ - { - ClientCIDR: "0.0.0.0/0", - ServerAddress: context.Cluster.Cluster.Server, - }, - }, - SecretRef: &api.LocalObjectReference{ - // Note: Name must correlate with federation build script secret name, - // which currently matches the cluster name. - // See federation/cluster/common.sh:132 - Name: context.Name, - }, - }, - } - _, err := f.FederationClientset.Federation().Clusters().Create(&cluster) - framework.ExpectNoError(err, fmt.Sprintf("creating cluster: %+v", err)) + createClusterObjectOrFail(f, &context) } + framework.Logf("Checking that %d clusters are Ready", len(contexts)) for _, context := range contexts { - c, err := f.FederationClientset.Federation().Clusters().Get(context.Name) - framework.ExpectNoError(err, fmt.Sprintf("get cluster: %+v", err)) - if c.ObjectMeta.Name != context.Name { - framework.Failf("cluster name does not match input context: actual=%+v, expected=%+v", c, context) - } - err = isReady(context.Name, f.FederationClientset) - framework.ExpectNoError(err, fmt.Sprintf("unexpected error in verifying if cluster %s is ready: %+v", context.Name, err)) + clusterIsReadyOrFail(f, &context) } + framework.Logf("%d clusters are Ready", len(contexts)) // Verify that deletion works. + framework.Logf("Deleting %d clusters", len(contexts)) for _, context := range contexts { framework.Logf("Deleting cluster object: %s (%s, secret: %s)", context.Name, context.Cluster.Cluster.Server, context.Name) err := f.FederationClientset.Federation().Clusters().Delete(context.Name, &api.DeleteOptions{}) framework.ExpectNoError(err, fmt.Sprintf("unexpected error in deleting cluster %s: %+v", context.Name, err)) + framework.Logf("Successfully deleted cluster object: %s (%s, secret: %s)", context.Name, context.Cluster.Cluster.Server, context.Name) } // There should not be any remaining cluster. + framework.Logf("Verifying that zero clusters remain") clusterList, err := f.FederationClientset.Federation().Clusters().List(api.ListOptions{}) Expect(err).NotTo(HaveOccurred()) if len(clusterList.Items) != 0 { framework.Failf("there should not have been any remaining clusters. Found: %+v", clusterList) } + framework.Logf("Verified that zero clusters remain") }) }) diff --git a/test/e2e/federation-util.go b/test/e2e/federation-util.go new file mode 100644 index 00000000000..2082a122a50 --- /dev/null +++ b/test/e2e/federation-util.go @@ -0,0 +1,62 @@ +/* +Copyright 2016 The Kubernetes Authors All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package e2e + +import ( + "fmt" + + federationapi "k8s.io/kubernetes/federation/apis/federation" + "k8s.io/kubernetes/pkg/api" + "k8s.io/kubernetes/test/e2e/framework" +) + +func createClusterObjectOrFail(f *framework.Framework, context *framework.E2EContext) { + framework.Logf("Creating cluster object: %s (%s, secret: %s)", context.Name, context.Cluster.Cluster.Server, context.Name) + cluster := federationapi.Cluster{ + ObjectMeta: api.ObjectMeta{ + Name: context.Name, + }, + Spec: federationapi.ClusterSpec{ + ServerAddressByClientCIDRs: []federationapi.ServerAddressByClientCIDR{ + { + ClientCIDR: "0.0.0.0/0", + ServerAddress: context.Cluster.Cluster.Server, + }, + }, + SecretRef: &api.LocalObjectReference{ + // Note: Name must correlate with federation build script secret name, + // which currently matches the cluster name. + // See federation/cluster/common.sh:132 + Name: context.Name, + }, + }, + } + _, err := f.FederationClientset.Federation().Clusters().Create(&cluster) + framework.ExpectNoError(err, fmt.Sprintf("creating cluster: %+v", err)) + framework.Logf("Successfully created cluster object: %s (%s, secret: %s)", context.Name, context.Cluster.Cluster.Server, context.Name) +} + +func clusterIsReadyOrFail(f *framework.Framework, context *framework.E2EContext) { + c, err := f.FederationClientset.Federation().Clusters().Get(context.Name) + framework.ExpectNoError(err, fmt.Sprintf("get cluster: %+v", err)) + if c.ObjectMeta.Name != context.Name { + framework.Failf("cluster name does not match input context: actual=%+v, expected=%+v", c, context) + } + err = isReady(context.Name, f.FederationClientset) + framework.ExpectNoError(err, fmt.Sprintf("unexpected error in verifying if cluster %s is ready: %+v", context.Name, err)) + framework.Logf("Cluster %s is Ready", context.Name) +}