From 0ed8fd6dc9befb1d19ca05edf5b042ff26dcb94d Mon Sep 17 00:00:00 2001 From: DP19 Date: Mon, 2 Nov 2020 11:36:22 -0500 Subject: [PATCH] add e2e test for Service ExternalIPs --- test/e2e/framework/service/jig.go | 13 +++++++++++++ test/e2e/network/service.go | 31 +++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+) diff --git a/test/e2e/framework/service/jig.go b/test/e2e/framework/service/jig.go index 5eaf83b7523c..227c8721f9f1 100644 --- a/test/e2e/framework/service/jig.go +++ b/test/e2e/framework/service/jig.go @@ -829,6 +829,10 @@ func testReachabilityOverClusterIP(clusterIP string, sp v1.ServicePort, execPod return nil } +func testReachabilityOverExternalIP(externalIP string, sp v1.ServicePort, execPod *v1.Pod) error { + return testEndpointReachability(externalIP, sp.Port, sp.Protocol, execPod) +} + func testReachabilityOverNodePorts(nodes *v1.NodeList, sp v1.ServicePort, pod *v1.Pod, clusterIP string) error { internalAddrs := e2enode.CollectAddresses(nodes, v1.NodeInternalIP) externalAddrs := e2enode.CollectAddresses(nodes, v1.NodeExternalIP) @@ -911,6 +915,7 @@ func testEndpointReachability(endpoint string, port int32, protocol v1.Protocol, func (j *TestJig) checkClusterIPServiceReachability(svc *v1.Service, pod *v1.Pod) error { clusterIP := svc.Spec.ClusterIP servicePorts := svc.Spec.Ports + externalIPs := svc.Spec.ExternalIPs err := j.waitForAvailableEndpoint(ServiceEndpointsTimeout) if err != nil { @@ -926,6 +931,14 @@ func (j *TestJig) checkClusterIPServiceReachability(svc *v1.Service, pod *v1.Pod if err != nil { return err } + if len(externalIPs) > 0 { + for _, externalIP := range externalIPs { + err = testReachabilityOverExternalIP(externalIP, servicePort, pod) + if err != nil { + return err + } + } + } } return nil } diff --git a/test/e2e/network/service.go b/test/e2e/network/service.go index 8092e6cd7014..e003b58ea4fa 100644 --- a/test/e2e/network/service.go +++ b/test/e2e/network/service.go @@ -1217,6 +1217,37 @@ var _ = SIGDescribe("Services", func() { framework.ExpectNoError(err) }) + /* + Create a ClusterIP service with an External IP that is not assigned to an interface. + The IP ranges here are reserved for documentation according to + [RFC 5737](https://tools.ietf.org/html/rfc5737) Section 3 and should not be used by any host. + */ + ginkgo.It("should be possible to connect to a service via ExternalIP when the external IP is not assigned to a node", func() { + serviceName := "externalip-test" + ns := f.Namespace.Name + externalIP := "203.0.113.250" + if framework.TestContext.ClusterIsIPv6() { + externalIP = "2001:DB8::cb00:71fa" + } + + jig := e2eservice.NewTestJig(cs, ns, serviceName) + + ginkgo.By("creating service " + serviceName + " with type=clusterIP in namespace " + ns) + clusterIPService, err := jig.CreateTCPService(func(svc *v1.Service) { + svc.Spec.Type = v1.ServiceTypeClusterIP + svc.Spec.ExternalIPs = []string{externalIP} + svc.Spec.Ports = []v1.ServicePort{ + {Port: 80, Name: "http", Protocol: v1.ProtocolTCP, TargetPort: intstr.FromInt(9376)}, + } + }) + framework.ExpectNoError(err) + err = jig.CreateServicePods(2) + framework.ExpectNoError(err) + execPod := e2epod.CreateExecPodOrFail(cs, ns, "execpod", nil) + err = jig.CheckServiceReachability(clusterIPService, execPod) + framework.ExpectNoError(err) + }) + // TODO: Get rid of [DisabledForLargeClusters] tag when issue #56138 is fixed. ginkgo.It("should be able to change the type and ports of a service [Slow] [DisabledForLargeClusters]", func() { // requires cloud load-balancer support