From 5a3b8a11fc722b3e57e6431c8565d035cfa20d90 Mon Sep 17 00:00:00 2001 From: Vallery Lancey Date: Sat, 5 Jan 2019 00:26:55 -0800 Subject: [PATCH 1/2] Add an e2e test for services with no endpoints (#72561) --- test/e2e/network/service.go | 57 +++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) diff --git a/test/e2e/network/service.go b/test/e2e/network/service.go index c1bbdb5280..320085db29 100644 --- a/test/e2e/network/service.go +++ b/test/e2e/network/service.go @@ -18,6 +18,7 @@ package network import ( "bytes" + "errors" "fmt" "math/rand" "net" @@ -1748,6 +1749,62 @@ var _ = SIGDescribe("Services", func() { By("verifying service-disabled is still not up") framework.ExpectNoError(framework.VerifyServeHostnameServiceDown(cs, host, svcDisabledIP, servicePort)) }) + + It("should be rejected when no endpoints exist", func() { + namespace := f.Namespace.Name + serviceName := "no-pods" + jig := framework.NewServiceTestJig(cs, serviceName) + nodes := jig.GetNodes(framework.MaxNodesForEndpointsTests) + labels := map[string]string{ + "nopods": "nopods", + } + ports := []v1.ServicePort{{ + Port: 80, + TargetPort: intstr.FromInt(80), + }} + + By("creating a service with no endpoints") + svc, err := jig.CreateServiceWithServicePort(labels, namespace, ports) + if err != nil { + framework.Failf("Failed to create service: %v", err) + } + + port := strconv.Itoa(int(svc.Spec.Ports[0].Port)) + servicePort := net.JoinHostPort(serviceName, port) + nodeName := nodes.Items[0].Name + podName := "execpod-noendpoints" + + By(fmt.Sprintf("creating %v on node %v", podName, nodeName)) + execPodName := framework.CreateExecPodOrFail(f.ClientSet, namespace, podName, func(pod *v1.Pod) { + pod.Spec.NodeName = nodeName + }) + execPod, err := f.ClientSet.CoreV1().Pods(namespace).Get(execPodName, metav1.GetOptions{}) + framework.ExpectNoError(err) + + framework.Logf("waiting up to %v wget %v", framework.KubeProxyEndpointLagTimeout, servicePort) + cmd := fmt.Sprintf(`wget -T 10 -qO- %v`, servicePort) + + By(fmt.Sprintf("hitting service %v from pod %v on node %v", servicePort, podName, nodeName)) + expectedErr := "connection refused" + if pollErr := wait.PollImmediate(framework.Poll, framework.KubeProxyEndpointLagTimeout, func() (bool, error) { + _, err := framework.RunHostCmd(execPod.Namespace, execPod.Name, cmd) + + if err != nil { + if strings.Contains(strings.ToLower(err.Error()), expectedErr) { + framework.Logf("error contained '%s', as expected: %s", expectedErr, err.Error()) + return true, nil + } else { + framework.Logf("error didn't contain '%s', keep trying: %s", expectedErr, err.Error()) + return false, nil + } + } else { + return true, errors.New("expected wget call to fail") + } + }); pollErr != nil { + Expect(pollErr).NotTo(HaveOccurred()) + } + }) + }) // TODO: Get rid of [DisabledForLargeClusters] tag when issue #56138 is fixed. From 21cccbb8634a9aaf512c221698d0157d40acc3a9 Mon Sep 17 00:00:00 2001 From: Vallery Lancey Date: Fri, 25 Jan 2019 16:17:22 -0800 Subject: [PATCH 2/2] Variable & timeout cleanup in no-endpoints e2e test --- test/e2e/network/service.go | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/test/e2e/network/service.go b/test/e2e/network/service.go index 320085db29..fbe77cf059 100644 --- a/test/e2e/network/service.go +++ b/test/e2e/network/service.go @@ -1758,19 +1758,18 @@ var _ = SIGDescribe("Services", func() { labels := map[string]string{ "nopods": "nopods", } + port := 80 ports := []v1.ServicePort{{ - Port: 80, + Port: int32(port), TargetPort: intstr.FromInt(80), }} By("creating a service with no endpoints") - svc, err := jig.CreateServiceWithServicePort(labels, namespace, ports) + _, err := jig.CreateServiceWithServicePort(labels, namespace, ports) if err != nil { framework.Failf("Failed to create service: %v", err) } - port := strconv.Itoa(int(svc.Spec.Ports[0].Port)) - servicePort := net.JoinHostPort(serviceName, port) nodeName := nodes.Items[0].Name podName := "execpod-noendpoints" @@ -1781,10 +1780,11 @@ var _ = SIGDescribe("Services", func() { execPod, err := f.ClientSet.CoreV1().Pods(namespace).Get(execPodName, metav1.GetOptions{}) framework.ExpectNoError(err) - framework.Logf("waiting up to %v wget %v", framework.KubeProxyEndpointLagTimeout, servicePort) - cmd := fmt.Sprintf(`wget -T 10 -qO- %v`, servicePort) + serviceAddress := net.JoinHostPort(serviceName, strconv.Itoa(port)) + framework.Logf("waiting up to %v wget %v", framework.KubeProxyEndpointLagTimeout, serviceAddress) + cmd := fmt.Sprintf(`wget -T 3 -qO- %v`, serviceAddress) - By(fmt.Sprintf("hitting service %v from pod %v on node %v", servicePort, podName, nodeName)) + By(fmt.Sprintf("hitting service %v from pod %v on node %v", serviceAddress, podName, nodeName)) expectedErr := "connection refused" if pollErr := wait.PollImmediate(framework.Poll, framework.KubeProxyEndpointLagTimeout, func() (bool, error) { _, err := framework.RunHostCmd(execPod.Namespace, execPod.Name, cmd)