mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-24 20:24:09 +00:00
Address review comments.
This commit is contained in:
parent
c4dcb42078
commit
839d98adfb
@ -17,6 +17,8 @@ limitations under the License.
|
|||||||
package e2e
|
package e2e
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"k8s.io/kubernetes/federation/apis/federation"
|
"k8s.io/kubernetes/federation/apis/federation"
|
||||||
@ -28,6 +30,7 @@ import (
|
|||||||
"k8s.io/kubernetes/pkg/client/unversioned/clientcmd"
|
"k8s.io/kubernetes/pkg/client/unversioned/clientcmd"
|
||||||
clientcmdapi "k8s.io/kubernetes/pkg/client/unversioned/clientcmd/api"
|
clientcmdapi "k8s.io/kubernetes/pkg/client/unversioned/clientcmd/api"
|
||||||
"k8s.io/kubernetes/pkg/util/intstr"
|
"k8s.io/kubernetes/pkg/util/intstr"
|
||||||
|
"k8s.io/kubernetes/pkg/util/wait"
|
||||||
"k8s.io/kubernetes/test/e2e/framework"
|
"k8s.io/kubernetes/test/e2e/framework"
|
||||||
|
|
||||||
. "github.com/onsi/ginkgo"
|
. "github.com/onsi/ginkgo"
|
||||||
@ -53,9 +56,18 @@ const (
|
|||||||
|
|
||||||
var _ = framework.KubeDescribe("Service [Feature:Federation]", func() {
|
var _ = framework.KubeDescribe("Service [Feature:Federation]", func() {
|
||||||
var clusterClientSets []*release_1_3.Clientset
|
var clusterClientSets []*release_1_3.Clientset
|
||||||
|
var federationName string
|
||||||
f := framework.NewDefaultFederatedFramework("service")
|
f := framework.NewDefaultFederatedFramework("service")
|
||||||
|
|
||||||
BeforeEach(func() {
|
BeforeEach(func() {
|
||||||
|
framework.SkipUnlessFederated(f.Client)
|
||||||
|
|
||||||
|
// TODO: Federation API server should be able to answer this.
|
||||||
|
if federationName = os.Getenv("FEDERATION_NAME"); federationName == "" {
|
||||||
|
// Tests cannot proceed without this value, so fail early here.
|
||||||
|
framework.Failf("FEDERATION_NAME environment variable must be set")
|
||||||
|
}
|
||||||
|
|
||||||
contexts := f.GetUnderlyingFederatedContexts()
|
contexts := f.GetUnderlyingFederatedContexts()
|
||||||
|
|
||||||
for _, context := range contexts {
|
for _, context := range contexts {
|
||||||
@ -77,10 +89,22 @@ var _ = framework.KubeDescribe("Service [Feature:Federation]", func() {
|
|||||||
framework.ExpectNoError(err, "Creating cluster")
|
framework.ExpectNoError(err, "Creating cluster")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var clusterList *federation.ClusterList
|
||||||
By("Obtaining a list of all the clusters")
|
By("Obtaining a list of all the clusters")
|
||||||
clusterList, err := f.FederationClientset.Federation().Clusters().List(api.ListOptions{})
|
if err := wait.PollImmediate(framework.Poll, FederatedServiceTimeout, func() (bool, error) {
|
||||||
Expect(err).NotTo(HaveOccurred())
|
var err error
|
||||||
framework.Logf("%d clusters found", len(clusterList.Items))
|
clusterList, err = f.FederationClientset.Federation().Clusters().List(api.ListOptions{})
|
||||||
|
if err != nil {
|
||||||
|
return false, err
|
||||||
|
}
|
||||||
|
framework.Logf("%d clusters registered, waiting for %d", len(clusterList.Items), len(contexts))
|
||||||
|
if len(clusterList.Items) == len(contexts) {
|
||||||
|
return true, nil
|
||||||
|
}
|
||||||
|
return false, nil
|
||||||
|
}); err != nil {
|
||||||
|
framework.Failf("Failed to list registered clusters: %+v", err)
|
||||||
|
}
|
||||||
|
|
||||||
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)
|
||||||
@ -105,12 +129,33 @@ var _ = framework.KubeDescribe("Service [Feature:Federation]", func() {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
AfterEach(func() {
|
||||||
|
framework.SkipUnlessFederated(f.Client)
|
||||||
|
|
||||||
|
// Delete the registered clusters in the federation API server.
|
||||||
|
clusterList, err := f.FederationClientset.Federation().Clusters().List(api.ListOptions{})
|
||||||
|
Expect(err).NotTo(HaveOccurred())
|
||||||
|
for _, cluster := range clusterList.Items {
|
||||||
|
err := f.FederationClientset.Federation().Clusters().Delete(cluster.Name, &api.DeleteOptions{})
|
||||||
|
Expect(err).NotTo(HaveOccurred())
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
It("should be able to discover a federated service", func() {
|
It("should be able to discover a federated service", func() {
|
||||||
framework.SkipUnlessFederated(f.Client)
|
framework.SkipUnlessFederated(f.Client)
|
||||||
|
|
||||||
createService(f.FederationClientset, clusterClientSets, f.Namespace.Name)
|
createService(f.FederationClientset, clusterClientSets, f.Namespace.Name)
|
||||||
|
|
||||||
discoverService(f)
|
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),
|
||||||
|
}
|
||||||
|
for _, name := range svcDNSNames {
|
||||||
|
discoverService(f, name, true)
|
||||||
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
It("should be able to discover a non-local federated service", func() {
|
It("should be able to discover a non-local federated service", func() {
|
||||||
@ -123,26 +168,49 @@ var _ = framework.KubeDescribe("Service [Feature:Federation]", func() {
|
|||||||
Expect(err).NotTo(HaveOccurred())
|
Expect(err).NotTo(HaveOccurred())
|
||||||
waitForFederatedServiceShard(f.Clientset_1_3, f.Namespace.Name, nil, 0)
|
waitForFederatedServiceShard(f.Clientset_1_3, f.Namespace.Name, nil, 0)
|
||||||
|
|
||||||
discoverService(f)
|
localSvcDNSNames := []string{
|
||||||
|
FederatedServiceName,
|
||||||
|
fmt.Sprintf("%s.%s", FederatedServiceName, f.Namespace.Name),
|
||||||
|
fmt.Sprintf("%s.%s.svc.cluster.local.", FederatedServiceName, f.Namespace.Name),
|
||||||
|
}
|
||||||
|
for _, name := range localSvcDNSNames {
|
||||||
|
discoverService(f, name, false)
|
||||||
|
}
|
||||||
|
|
||||||
|
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),
|
||||||
|
}
|
||||||
|
for _, name := range svcDNSNames {
|
||||||
|
discoverService(f, name, true)
|
||||||
|
}
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
// waitForFederatedServiceShard waits until the number of shards of a given federated
|
||||||
|
// service reaches the expected value, i.e. numSvcs in the given individual Kubernetes
|
||||||
|
// cluster. If the shard count, i.e. numSvcs is expected to be at least one, then
|
||||||
|
// it also checks if the first shard's name and spec matches that of the given service.
|
||||||
func waitForFederatedServiceShard(cs *release_1_3.Clientset, namespace string, service *api.Service, numSvcs int) {
|
func waitForFederatedServiceShard(cs *release_1_3.Clientset, namespace string, service *api.Service, numSvcs int) {
|
||||||
By("Fetching a federated service shard")
|
By("Fetching a federated service shard")
|
||||||
var clSvcList *v1.ServiceList
|
var clSvcList *v1.ServiceList
|
||||||
for t := time.Now(); time.Since(t) < FederatedServiceTimeout; time.Sleep(framework.Poll) {
|
if err := wait.PollImmediate(framework.Poll, FederatedServiceTimeout, func() (bool, error) {
|
||||||
var err error
|
var err error
|
||||||
clSvcList, err = cs.Core().Services(namespace).List(api.ListOptions{})
|
clSvcList, err = cs.Core().Services(namespace).List(api.ListOptions{})
|
||||||
Expect(err).NotTo(HaveOccurred())
|
if err != nil {
|
||||||
|
return false, err
|
||||||
|
}
|
||||||
n := len(clSvcList.Items)
|
n := len(clSvcList.Items)
|
||||||
if n == numSvcs {
|
if n == numSvcs {
|
||||||
break
|
return true, nil
|
||||||
}
|
}
|
||||||
framework.Logf("%d services found, trying again in %s", n, framework.Poll)
|
framework.Logf("%d services found, waiting for %d, trying again in %s", n, numSvcs, framework.Poll)
|
||||||
|
return false, nil
|
||||||
|
}); err != nil {
|
||||||
|
framework.Failf("Failed to list registered clusters: %+v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
Expect(len(clSvcList.Items)).To(Equal(numSvcs))
|
if numSvcs > 0 && service != nil {
|
||||||
if numSvcs > 0 {
|
|
||||||
// Renaming for clarity/readability
|
// Renaming for clarity/readability
|
||||||
clSvc := clSvcList.Items[0]
|
clSvc := clSvcList.Items[0]
|
||||||
Expect(clSvc.Name).To(Equal(service.Name))
|
Expect(clSvc.Name).To(Equal(service.Name))
|
||||||
@ -150,7 +218,7 @@ func waitForFederatedServiceShard(cs *release_1_3.Clientset, namespace string, s
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func createService(fcs *federation_internalclientset.Clientset, clusterClientSets []*release_1_3.Clientset, ns string) {
|
func createService(fcs *federation_internalclientset.Clientset, clusterClientSets []*release_1_3.Clientset, namespace string) {
|
||||||
By("Creating a federated service")
|
By("Creating a federated service")
|
||||||
labels := map[string]string{
|
labels := map[string]string{
|
||||||
"foo": "bar",
|
"foo": "bar",
|
||||||
@ -179,14 +247,14 @@ func createService(fcs *federation_internalclientset.Clientset, clusterClientSet
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
_, err := fcs.Core().Services(ns).Create(service)
|
_, err := fcs.Core().Services(namespace).Create(service)
|
||||||
Expect(err).NotTo(HaveOccurred())
|
Expect(err).NotTo(HaveOccurred())
|
||||||
for _, cs := range clusterClientSets {
|
for _, cs := range clusterClientSets {
|
||||||
waitForFederatedServiceShard(cs, ns, service, 1)
|
waitForFederatedServiceShard(cs, namespace, service, 1)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func discoverService(f *framework.Framework) {
|
func discoverService(f *framework.Framework, name string, exists bool) {
|
||||||
pod := &api.Pod{
|
pod := &api.Pod{
|
||||||
ObjectMeta: api.ObjectMeta{
|
ObjectMeta: api.ObjectMeta{
|
||||||
Name: FederatedServicePod,
|
Name: FederatedServicePod,
|
||||||
@ -197,13 +265,19 @@ func discoverService(f *framework.Framework) {
|
|||||||
{
|
{
|
||||||
Name: "federated-service-discovery-container",
|
Name: "federated-service-discovery-container",
|
||||||
Image: "gcr.io/google_containers/busybox:1.24",
|
Image: "gcr.io/google_containers/busybox:1.24",
|
||||||
Command: []string{"sh", "-c", "nslookup", FederatedServiceName},
|
Command: []string{"sh", "-c", "nslookup", name},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
RestartPolicy: api.RestartPolicyNever,
|
RestartPolicy: api.RestartPolicyNever,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
f.TestContainerOutputRegexp("federated service discovery", pod, 0, []string{
|
if exists {
|
||||||
`Name:\s+` + FederatedDNS1123Regexp + `\nAddress \d+:\s+` + FederatedIPAddrRegexp + `\s+` + FederatedDNS1123Regexp,
|
f.TestContainerOutputRegexp("federated service discovery", pod, 0, []string{
|
||||||
})
|
`Name:\s+` + FederatedDNS1123Regexp + `\nAddress \d+:\s+` + FederatedIPAddrRegexp + `\s+` + FederatedDNS1123Regexp,
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
f.TestContainerOutputRegexp("federated service discovery", pod, 0, []string{
|
||||||
|
`nslookup: can't resolve '` + name + `'`,
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user