Improve e2e tests for Cluster Federation.

This commit is contained in:
Quinton Hoole 2016-06-16 21:07:39 -07:00
parent 25d8aec037
commit 4445dc2b59
3 changed files with 89 additions and 55 deletions

View File

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

View File

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

View File

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