mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-29 14:37:00 +00:00
Improve e2e tests for Cluster Federation.
This commit is contained in:
parent
25d8aec037
commit
4445dc2b59
@ -44,7 +44,7 @@ const (
|
|||||||
KubeAPIQPS = 20.0
|
KubeAPIQPS = 20.0
|
||||||
KubeAPIBurst = 30
|
KubeAPIBurst = 30
|
||||||
|
|
||||||
FederatedServiceTimeout = 5 * time.Minute
|
FederatedServiceTimeout = 60 * time.Second
|
||||||
|
|
||||||
FederatedServiceName = "federated-service"
|
FederatedServiceName = "federated-service"
|
||||||
FederatedServicePod = "federated-service-test-pod"
|
FederatedServicePod = "federated-service-test-pod"
|
||||||
@ -52,7 +52,7 @@ const (
|
|||||||
DefaultFederationName = "federation"
|
DefaultFederationName = "federation"
|
||||||
)
|
)
|
||||||
|
|
||||||
var _ = framework.KubeDescribe("Service [Feature:Federation]", func() {
|
var _ = framework.KubeDescribe("[Feature:Federation] Federated Services", func() {
|
||||||
var clusterClientSets []*release_1_3.Clientset
|
var clusterClientSets []*release_1_3.Clientset
|
||||||
var federationName string
|
var federationName string
|
||||||
f := framework.NewDefaultFederatedFramework("service")
|
f := framework.NewDefaultFederatedFramework("service")
|
||||||
@ -68,28 +68,7 @@ var _ = framework.KubeDescribe("Service [Feature:Federation]", func() {
|
|||||||
contexts := f.GetUnderlyingFederatedContexts()
|
contexts := f.GetUnderlyingFederatedContexts()
|
||||||
|
|
||||||
for _, context := range contexts {
|
for _, context := range contexts {
|
||||||
framework.Logf("Creating cluster object: %s (%s)", context.Name, context.Cluster.Cluster.Server)
|
createClusterObjectOrFail(f, &context)
|
||||||
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")
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var clusterList *federation.ClusterList
|
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.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 {
|
for _, cluster := range clusterList.Items {
|
||||||
framework.Logf("Creating a clientset for the cluster %s", cluster.Name)
|
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 = ""
|
clSvc.Spec.ClusterIP = ""
|
||||||
|
|
||||||
Expect(clSvc.Name).To(Equal(service.Name))
|
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))
|
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)
|
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 {
|
for _, cs := range clusterClientSets {
|
||||||
waitForFederatedServiceShard(cs, namespace, nservice, 1)
|
waitForFederatedServiceShard(cs, namespace, nservice, 1)
|
||||||
}
|
}
|
||||||
|
@ -35,7 +35,7 @@ var _ = framework.KubeDescribe("Federation apiserver [Feature:Federation]", func
|
|||||||
f := framework.NewDefaultFederatedFramework("federation-cluster")
|
f := framework.NewDefaultFederatedFramework("federation-cluster")
|
||||||
|
|
||||||
AfterEach(func() {
|
AfterEach(func() {
|
||||||
framework.SkipUnlessFederated(f.Client)
|
// framework.SkipUnlessFederated(f.Client) TODO: quinton-hoole: Temporarily disabled
|
||||||
|
|
||||||
// Delete registered clusters.
|
// Delete registered clusters.
|
||||||
// This is if a test failed, it should not affect other tests.
|
// 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()
|
contexts := f.GetUnderlyingFederatedContexts()
|
||||||
|
|
||||||
|
framework.Logf("Creating %d cluster objects", len(contexts))
|
||||||
for _, context := range contexts {
|
for _, context := range contexts {
|
||||||
framework.Logf("Creating cluster object: %s (%s, secret: %s)", context.Name, context.Cluster.Cluster.Server, context.Name)
|
createClusterObjectOrFail(f, &context)
|
||||||
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("Checking that %d clusters are Ready", len(contexts))
|
||||||
for _, context := range contexts {
|
for _, context := range contexts {
|
||||||
c, err := f.FederationClientset.Federation().Clusters().Get(context.Name)
|
clusterIsReadyOrFail(f, &context)
|
||||||
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("%d clusters are Ready", len(contexts))
|
||||||
|
|
||||||
// Verify that deletion works.
|
// Verify that deletion works.
|
||||||
|
framework.Logf("Deleting %d clusters", len(contexts))
|
||||||
for _, context := range contexts {
|
for _, context := range contexts {
|
||||||
framework.Logf("Deleting cluster object: %s (%s, secret: %s)", context.Name, context.Cluster.Cluster.Server, context.Name)
|
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{})
|
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.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.
|
// There should not be any remaining cluster.
|
||||||
|
framework.Logf("Verifying that zero clusters remain")
|
||||||
clusterList, err := f.FederationClientset.Federation().Clusters().List(api.ListOptions{})
|
clusterList, err := f.FederationClientset.Federation().Clusters().List(api.ListOptions{})
|
||||||
Expect(err).NotTo(HaveOccurred())
|
Expect(err).NotTo(HaveOccurred())
|
||||||
if len(clusterList.Items) != 0 {
|
if len(clusterList.Items) != 0 {
|
||||||
framework.Failf("there should not have been any remaining clusters. Found: %+v", clusterList)
|
framework.Failf("there should not have been any remaining clusters. Found: %+v", clusterList)
|
||||||
}
|
}
|
||||||
|
framework.Logf("Verified that zero clusters remain")
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
62
test/e2e/federation-util.go
Normal file
62
test/e2e/federation-util.go
Normal 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)
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user