Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Improve federation e2e tests #27585

Merged
merged 1 commit into from Jun 17, 2016
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
42 changes: 17 additions & 25 deletions test/e2e/federated-service.go
Original file line number Diff line number Diff line change
Expand Up @@ -44,15 +44,15 @@ const (
KubeAPIQPS = 20.0
KubeAPIBurst = 30

FederatedServiceTimeout = 5 * time.Minute
FederatedServiceTimeout = 60 * time.Second

FederatedServiceName = "federated-service"
FederatedServicePod = "federated-service-test-pod"

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")
Expand All @@ -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
Expand All @@ -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)

Expand Down Expand Up @@ -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))
}
}
Expand Down Expand Up @@ -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))
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can we combine these and just mention the namespace in the assertion line? Those only get printed if something goes wrong.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The log messages are also output when the --verbose option is used, even when they pass. I'd suggest we leave as is.

for _, cs := range clusterClientSets {
waitForFederatedServiceShard(cs, namespace, nservice, 1)
}
Expand Down
40 changes: 10 additions & 30 deletions test/e2e/federation-apiserver.go
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand All @@ -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")
})
})

Expand Down
62 changes: 62 additions & 0 deletions test/e2e/federation-util.go
Original file line number Diff line number Diff line change
@@ -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)
}