diff --git a/internal/ingress/controller/template/template.go b/internal/ingress/controller/template/template.go index ed052e4ec..5a6b75654 100644 --- a/internal/ingress/controller/template/template.go +++ b/internal/ingress/controller/template/template.go @@ -37,6 +37,7 @@ import ( text_template "text/template" networkingv1 "k8s.io/api/networking/v1" + v1 "k8s.io/api/networking/v1" "k8s.io/apimachinery/pkg/util/sets" "k8s.io/klog/v2" @@ -1051,7 +1052,7 @@ func (info *ingressInformation) Equal(other *ingressInformation) bool { return true } -func getIngressInformation(i, h, p interface{}) *ingressInformation { +func getIngressInformation(i, h, p, t interface{}) *ingressInformation { ing, ok := i.(*ingress.Ingress) if !ok { klog.Errorf("expected an '*ingress.Ingress' type but %T was returned", i) @@ -1070,6 +1071,11 @@ func getIngressInformation(i, h, p interface{}) *ingressInformation { return &ingressInformation{} } + ingressPathType, ok := t.(*v1.PathType) + if !ok { + klog.Errorf("expected a '*v1.PathType' type but %T was returned", t) + } + if ing == nil { return &ingressInformation{} } @@ -1118,6 +1124,10 @@ func getIngressInformation(i, h, p interface{}) *ingressInformation { continue } + if *ingressPathType != *rPath.PathType { + continue + } + if rPath.Backend.Service == nil { continue } diff --git a/internal/ingress/controller/template/template_test.go b/internal/ingress/controller/template/template_test.go index 6553f5daf..3bf5ef0f8 100644 --- a/internal/ingress/controller/template/template_test.go +++ b/internal/ingress/controller/template/template_test.go @@ -55,6 +55,7 @@ func init() { var ( pathPrefix networking.PathType = networking.PathTypePrefix + pathExact networking.PathType = networking.PathTypeExact // TODO: add tests for SSLPassthrough tmplFuncTestcases = map[string]struct { @@ -1154,18 +1155,21 @@ func TestGetIngressInformation(t *testing.T) { Ingress interface{} Host string Path interface{} + PathType interface{} Expected *ingressInformation }{ "wrong ingress type": { "wrongtype", "host1", "/ok", + "", &ingressInformation{}, }, "wrong path type": { &ingress.Ingress{}, "host1", 10, + "", &ingressInformation{}, }, "valid ingress definition with name validIng in namespace default using a service with name a-svc port number 8080": { @@ -1192,6 +1196,7 @@ func TestGetIngressInformation(t *testing.T) { }, "host1", "", + "", &ingressInformation{ Namespace: "default", Rule: "validIng", @@ -1227,6 +1232,7 @@ func TestGetIngressInformation(t *testing.T) { }, "host1", "", + "", &ingressInformation{ Namespace: "default", Rule: "validIng", @@ -1259,6 +1265,7 @@ func TestGetIngressInformation(t *testing.T) { }, "host1", "", + "", &ingressInformation{ Namespace: "default", Rule: "validIng", @@ -1309,6 +1316,7 @@ func TestGetIngressInformation(t *testing.T) { }, "foo.bar", "/ok", + &pathPrefix, &ingressInformation{ Namespace: "something", Rule: "demo", @@ -1359,6 +1367,7 @@ func TestGetIngressInformation(t *testing.T) { }, "foo.bar", "/ok", + &pathPrefix, &ingressInformation{ Namespace: "something", Rule: "demo", @@ -1404,6 +1413,7 @@ func TestGetIngressInformation(t *testing.T) { }, "foo.bar", "/ok", + &pathPrefix, &ingressInformation{ Namespace: "something", Rule: "demo", @@ -1459,6 +1469,7 @@ func TestGetIngressInformation(t *testing.T) { }, "foo.bar", "/oksvc", + &pathPrefix, &ingressInformation{ Namespace: "something", Rule: "demo", @@ -1469,10 +1480,66 @@ func TestGetIngressInformation(t *testing.T) { ServicePort: "b-svc-80", }, }, + "valid ingress definition with name demo in namespace something and two path / with Prefix and Exact": { + &ingress.Ingress{ + Ingress: networking.Ingress{ + ObjectMeta: metav1.ObjectMeta{ + Name: "demo", + Namespace: "something", + Annotations: map[string]string{ + "ingress.annotation": "ok", + }, + }, + Spec: networking.IngressSpec{ + Rules: []networking.IngressRule{ + { + Host: "foo.bar", + IngressRuleValue: networking.IngressRuleValue{ + HTTP: &networking.HTTPIngressRuleValue{ + Paths: []networking.HTTPIngressPath{ + { + Path: "/", + PathType: &pathPrefix, + Backend: networking.IngressBackend{ + Service: &networking.IngressServiceBackend{ + Name: "a-svc", + }, + }, + }, + { + Path: "/", + PathType: &pathExact, + Backend: networking.IngressBackend{ + Service: &networking.IngressServiceBackend{ + Name: "b-svc", + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + "foo.bar", + "/", + &pathExact, + &ingressInformation{ + Path: "/", + Namespace: "something", + Rule: "demo", + Annotations: map[string]string{ + "ingress.annotation": "ok", + }, + Service: "b-svc", + }, + }, } for title, testCase := range testcases { - info := getIngressInformation(testCase.Ingress, testCase.Host, testCase.Path) + info := getIngressInformation(testCase.Ingress, testCase.Host, testCase.Path, testCase.PathType) if !info.Equal(testCase.Expected) { t.Fatalf("%s: expected '%v' but returned %v", title, testCase.Expected, info) diff --git a/rootfs/etc/nginx/template/nginx.tmpl b/rootfs/etc/nginx/template/nginx.tmpl index 6b8e750b0..bdaf46d34 100644 --- a/rootfs/etc/nginx/template/nginx.tmpl +++ b/rootfs/etc/nginx/template/nginx.tmpl @@ -1110,7 +1110,7 @@ stream { {{ end }} location {{ $path }} { - {{ $ing := (getIngressInformation $location.Ingress $server.Hostname $location.IngressPath) }} + {{ $ing := (getIngressInformation $location.Ingress $server.Hostname $location.IngressPath $location.PathType) }} set $namespace {{ $ing.Namespace | quote}}; set $ingress_name {{ $ing.Rule | quote }}; set $service_name {{ $ing.Service | quote }};