Skip to content

Commit

Permalink
add e2e test for Service ExternalIPs
Browse files Browse the repository at this point in the history
  • Loading branch information
DP19 committed Nov 2, 2020
1 parent d1c2964 commit 0ed8fd6
Show file tree
Hide file tree
Showing 2 changed files with 44 additions and 0 deletions.
13 changes: 13 additions & 0 deletions test/e2e/framework/service/jig.go
Expand Up @@ -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)
Expand Down Expand Up @@ -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 {
Expand All @@ -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
}
Expand Down
31 changes: 31 additions & 0 deletions test/e2e/network/service.go
Expand Up @@ -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
Expand Down

0 comments on commit 0ed8fd6

Please sign in to comment.