From b79535f3691cc72d49820317b8026bbfa8775274 Mon Sep 17 00:00:00 2001 From: Ed Robinson Date: Wed, 25 May 2016 13:16:19 +0100 Subject: [PATCH] Support ingresses without a host (#406) fixes #370 --- provider/kubernetes.go | 8 ++-- provider/kubernetes_test.go | 87 +++++++++++++++++++++++++++++++++++++ 2 files changed, 92 insertions(+), 3 deletions(-) diff --git a/provider/kubernetes.go b/provider/kubernetes.go index 0cfb75625..7362898b2 100644 --- a/provider/kubernetes.go +++ b/provider/kubernetes.go @@ -162,9 +162,11 @@ func (provider *Kubernetes) loadIngresses(k8sClient k8s.Client) (*types.Configur Routes: make(map[string]types.Route), } } - if _, exists := templateObjects.Frontends[r.Host+pa.Path].Routes[r.Host]; !exists { - templateObjects.Frontends[r.Host+pa.Path].Routes[r.Host] = types.Route{ - Rule: "Host:" + r.Host, + if len(r.Host) > 0 { + if _, exists := templateObjects.Frontends[r.Host+pa.Path].Routes[r.Host]; !exists { + templateObjects.Frontends[r.Host+pa.Path].Routes[r.Host] = types.Route{ + Rule: "Host:" + r.Host, + } } } if len(pa.Path) > 0 { diff --git a/provider/kubernetes_test.go b/provider/kubernetes_test.go index 0b9b98d62..b74b0536d 100644 --- a/provider/kubernetes_test.go +++ b/provider/kubernetes_test.go @@ -1060,6 +1060,93 @@ func TestLoadMultipleNamespacedIngresses(t *testing.T) { } } +func TestHostlessIngress(t *testing.T) { + ingresses := []k8s.Ingress{{ + ObjectMeta: k8s.ObjectMeta{ + Namespace: "awesome", + }, + Spec: k8s.IngressSpec{ + Rules: []k8s.IngressRule{ + { + IngressRuleValue: k8s.IngressRuleValue{ + HTTP: &k8s.HTTPIngressRuleValue{ + Paths: []k8s.HTTPIngressPath{ + { + Path: "/bar", + Backend: k8s.IngressBackend{ + ServiceName: "service1", + ServicePort: k8s.FromInt(801), + }, + }, + }, + }, + }, + }, + }, + }, + }} + services := []k8s.Service{ + { + ObjectMeta: k8s.ObjectMeta{ + Name: "service1", + Namespace: "awesome", + UID: "1", + }, + Spec: k8s.ServiceSpec{ + ClusterIP: "10.0.0.1", + Ports: []k8s.ServicePort{ + { + Name: "http", + Port: 801, + }, + }, + }, + }, + } + watchChan := make(chan interface{}) + client := clientMock{ + ingresses: ingresses, + services: services, + watchChan: watchChan, + } + provider := Kubernetes{disablePassHostHeaders: true} + actual, err := provider.loadIngresses(client) + if err != nil { + t.Fatalf("error %+v", err) + } + + expected := &types.Configuration{ + Backends: map[string]*types.Backend{ + "/bar": { + Servers: map[string]types.Server{ + "1": { + URL: "http://10.0.0.1:801", + Weight: 1, + }, + }, + CircuitBreaker: nil, + LoadBalancer: nil, + }, + }, + Frontends: map[string]*types.Frontend{ + "/bar": { + Backend: "/bar", + Routes: map[string]types.Route{ + "/bar": { + Rule: "PathPrefix:/bar", + }, + }, + }, + }, + } + actualJSON, _ := json.Marshal(actual) + expectedJSON, _ := json.Marshal(expected) + + if !reflect.DeepEqual(actual, expected) { + t.Fatalf("expected %+v, got %+v", string(expectedJSON), string(actualJSON)) + } +} + type clientMock struct { ingresses []k8s.Ingress services []k8s.Service