diff --git a/internal/ingress/controller/template/template.go b/internal/ingress/controller/template/template.go index e796ab2b14..f7b17af2b4 100644 --- a/internal/ingress/controller/template/template.go +++ b/internal/ingress/controller/template/template.go @@ -731,13 +731,19 @@ func (info *ingressInformation) Equal(other *ingressInformation) bool { return true } -func getIngressInformation(i, p interface{}) *ingressInformation { +func getIngressInformation(i, h, p interface{}) *ingressInformation { ing, ok := i.(*ingress.Ingress) if !ok { klog.Errorf("expected an '*ingress.Ingress' type but %T was returned", i) return &ingressInformation{} } + hostname, ok := h.(string) + if !ok { + klog.Errorf("expected a 'string' type but %T was returned", h) + return &ingressInformation{} + } + path, ok := p.(string) if !ok { klog.Errorf("expected a 'string' type but %T was returned", p) @@ -763,6 +769,10 @@ func getIngressInformation(i, p interface{}) *ingressInformation { continue } + if hostname != "" && hostname != rule.Host { + continue + } + for _, rPath := range rule.HTTP.Paths { if path == rPath.Path { info.Service = rPath.Backend.ServiceName diff --git a/internal/ingress/controller/template/template_test.go b/internal/ingress/controller/template/template_test.go index 2afcc60904..3f8edbfa8a 100644 --- a/internal/ingress/controller/template/template_test.go +++ b/internal/ingress/controller/template/template_test.go @@ -832,16 +832,17 @@ func TestOpentracingPropagateContext(t *testing.T) { func TestGetIngressInformation(t *testing.T) { validIngress := &ingress.Ingress{} invalidIngress := "wrongtype" + host := "host1" validPath := "/ok" invalidPath := 10 - info := getIngressInformation(invalidIngress, validPath) + info := getIngressInformation(invalidIngress, host, validPath) expected := &ingressInformation{} if !info.Equal(expected) { t.Errorf("Expected %v, but got %v", expected, info) } - info = getIngressInformation(validIngress, invalidPath) + info = getIngressInformation(validIngress, host, invalidPath) if !info.Equal(expected) { t.Errorf("Expected %v, but got %v", expected, info) } @@ -856,7 +857,7 @@ func TestGetIngressInformation(t *testing.T) { ServiceName: "a-svc", } - info = getIngressInformation(validIngress, validPath) + info = getIngressInformation(validIngress, host, validPath) expected = &ingressInformation{ Namespace: "default", Rule: "validIng", @@ -872,6 +873,7 @@ func TestGetIngressInformation(t *testing.T) { validIngress.Spec.Backend = nil validIngress.Spec.Rules = []extensions.IngressRule{ { + Host: host, IngressRuleValue: extensions.IngressRuleValue{ HTTP: &extensions.HTTPIngressRuleValue{ Paths: []extensions.HTTPIngressPath{ @@ -888,7 +890,7 @@ func TestGetIngressInformation(t *testing.T) { {}, } - info = getIngressInformation(validIngress, validPath) + info = getIngressInformation(validIngress, host, validPath) expected = &ingressInformation{ Namespace: "default", Rule: "validIng", @@ -900,6 +902,33 @@ func TestGetIngressInformation(t *testing.T) { if !info.Equal(expected) { t.Errorf("Expected %v, but got %v", expected, info) } + + validIngress.Spec.Rules = append(validIngress.Spec.Rules, extensions.IngressRule{ + Host: "host2", + IngressRuleValue: extensions.IngressRuleValue{ + HTTP: &extensions.HTTPIngressRuleValue{ + Paths: []extensions.HTTPIngressPath{ + { + Path: "/ok", + Backend: extensions.IngressBackend{ + ServiceName: "c-svc", + }, + }, + }, + }, + }, + }) + + info = getIngressInformation(validIngress, host, validPath) + if !info.Equal(expected) { + t.Errorf("Expected %v, but got %v", expected, info) + } + + info = getIngressInformation(validIngress, "host2", validPath) + expected.Service = "c-svc" + if !info.Equal(expected) { + t.Errorf("Expected %v, but got %v", expected, info) + } } func TestBuildCustomErrorLocationsPerServer(t *testing.T) { diff --git a/rootfs/etc/nginx/template/nginx.tmpl b/rootfs/etc/nginx/template/nginx.tmpl index a1919abcd1..8f140ceea6 100644 --- a/rootfs/etc/nginx/template/nginx.tmpl +++ b/rootfs/etc/nginx/template/nginx.tmpl @@ -1014,7 +1014,7 @@ stream { {{ end }} location {{ $path }} { - {{ $ing := (getIngressInformation $location.Ingress $location.Path) }} + {{ $ing := (getIngressInformation $location.Ingress $server.Hostname $location.Path) }} set $namespace "{{ $ing.Namespace }}"; set $ingress_name "{{ $ing.Rule }}"; set $service_name "{{ $ing.Service }}";