From aeab7035f8d8e716478f16eedb0c48fac04af402 Mon Sep 17 00:00:00 2001 From: chenqz1987 Date: Fri, 8 Jun 2018 11:45:51 +0800 Subject: [PATCH 1/2] fix nginx conf test error when not found active service endpoints --- internal/ingress/controller/controller.go | 1 + 1 file changed, 1 insertion(+) diff --git a/internal/ingress/controller/controller.go b/internal/ingress/controller/controller.go index 7dc6dbf3c6..1d3ba81472 100644 --- a/internal/ingress/controller/controller.go +++ b/internal/ingress/controller/controller.go @@ -523,6 +523,7 @@ func (n *NGINXController) getBackendServers(ingresses []*extensions.Ingress) ([] if upstream.Name == location.Backend { if len(upstream.Endpoints) == 0 { glog.V(3).Infof("Upstream %q does not have any active endpoints.", upstream.Name) + location.Backend = "" // for nginx.tmpl checking // check if the location contains endpoints and a custom default backend if location.DefaultBackend != nil { From 0e424bf5a4438821eaf90fa98defe167975c2379 Mon Sep 17 00:00:00 2001 From: chenqz1987 Date: Mon, 11 Jun 2018 09:45:38 +0800 Subject: [PATCH 2/2] add service backend e2e test --- test/e2e/e2e.go | 1 + test/e2e/servicebackend/service_backend.go | 166 +++++++++++++++++++++ 2 files changed, 167 insertions(+) create mode 100644 test/e2e/servicebackend/service_backend.go diff --git a/test/e2e/e2e.go b/test/e2e/e2e.go index 6a628d64dd..33addec8e1 100644 --- a/test/e2e/e2e.go +++ b/test/e2e/e2e.go @@ -33,6 +33,7 @@ import ( _ "k8s.io/ingress-nginx/test/e2e/annotations" _ "k8s.io/ingress-nginx/test/e2e/defaultbackend" _ "k8s.io/ingress-nginx/test/e2e/lua" + _ "k8s.io/ingress-nginx/test/e2e/servicebackend" _ "k8s.io/ingress-nginx/test/e2e/settings" _ "k8s.io/ingress-nginx/test/e2e/ssl" ) diff --git a/test/e2e/servicebackend/service_backend.go b/test/e2e/servicebackend/service_backend.go new file mode 100644 index 0000000000..09968975c7 --- /dev/null +++ b/test/e2e/servicebackend/service_backend.go @@ -0,0 +1,166 @@ +/* +Copyright 2018 The Kubernetes Authors. + +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 servicebackend + +import ( + . "github.com/onsi/ginkgo" + . "github.com/onsi/gomega" + "github.com/parnurzeal/gorequest" + corev1 "k8s.io/api/core/v1" + "k8s.io/api/extensions/v1beta1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/util/intstr" + "k8s.io/ingress-nginx/test/e2e/framework" + "strings" +) + +var _ = framework.IngressNginxDescribe("Service backend - 503", func() { + f := framework.NewDefaultFramework("service-backend") + + BeforeEach(func() { + }) + + AfterEach(func() { + }) + + It("should return 503 when backend service does not exist", func() { + host := "nonexistent.svc.com" + + bi := buildIngressWithNonexistentService(host, f.IngressController.Namespace, "/") + ing, err := f.EnsureIngress(bi) + Expect(err).NotTo(HaveOccurred()) + Expect(ing).NotTo(BeNil()) + + err = f.WaitForNginxServer(host, + func(server string) bool { + return strings.Contains(server, "return 503;") + }) + Expect(err).NotTo(HaveOccurred()) + + resp, _, errs := gorequest.New(). + Get(f.IngressController.HTTPURL). + Set("Host", host). + End() + Expect(len(errs)).Should(BeNumerically("==", 0)) + Expect(resp.StatusCode).Should(Equal(503)) + }) + + It("should return 503 when all backend service endpoints are unavailable", func() { + host := "unavailable.svc.com" + + bi, bs := buildIngressWithUnavailableServiceEndpoints(host, f.IngressController.Namespace, "/") + + svc, err := f.EnsureService(bs) + Expect(err).NotTo(HaveOccurred()) + Expect(svc).NotTo(BeNil()) + + ing, err := f.EnsureIngress(bi) + Expect(err).NotTo(HaveOccurred()) + Expect(ing).NotTo(BeNil()) + + err = f.WaitForNginxServer(host, + func(server string) bool { + return strings.Contains(server, "return 503;") + }) + Expect(err).NotTo(HaveOccurred()) + + resp, _, errs := gorequest.New(). + Get(f.IngressController.HTTPURL). + Set("Host", host). + End() + Expect(len(errs)).Should(BeNumerically("==", 0)) + Expect(resp.StatusCode).Should(Equal(503)) + }) + +}) + +func buildIngressWithNonexistentService(host, namespace, path string) *v1beta1.Ingress { + backendService := "nonexistent-svc" + return &v1beta1.Ingress{ + ObjectMeta: metav1.ObjectMeta{ + Name: host, + Namespace: namespace, + }, + Spec: v1beta1.IngressSpec{ + Rules: []v1beta1.IngressRule{ + { + Host: host, + IngressRuleValue: v1beta1.IngressRuleValue{ + HTTP: &v1beta1.HTTPIngressRuleValue{ + Paths: []v1beta1.HTTPIngressPath{ + { + Path: path, + Backend: v1beta1.IngressBackend{ + ServiceName: backendService, + ServicePort: intstr.FromInt(80), + }, + }, + }, + }, + }, + }, + }, + }, + } +} + +func buildIngressWithUnavailableServiceEndpoints(host, namespace, path string) (*v1beta1.Ingress, *corev1.Service) { + backendService := "unavailable-svc" + return &v1beta1.Ingress{ + ObjectMeta: metav1.ObjectMeta{ + Name: host, + Namespace: namespace, + }, + Spec: v1beta1.IngressSpec{ + Rules: []v1beta1.IngressRule{ + { + Host: host, + IngressRuleValue: v1beta1.IngressRuleValue{ + HTTP: &v1beta1.HTTPIngressRuleValue{ + Paths: []v1beta1.HTTPIngressPath{ + { + Path: path, + Backend: v1beta1.IngressBackend{ + ServiceName: backendService, + ServicePort: intstr.FromInt(80), + }, + }, + }, + }, + }, + }, + }, + }, + }, &corev1.Service{ + ObjectMeta: metav1.ObjectMeta{ + Name: backendService, + Namespace: namespace, + }, + Spec: corev1.ServiceSpec{Ports: []corev1.ServicePort{ + { + Name: "tcp", + Port: 80, + TargetPort: intstr.FromInt(80), + Protocol: "TCP", + }, + }, + Selector: map[string]string{ + "app": backendService, + }, + }, + } +}