diff --git a/provider/kubernetes/builder_configuration_test.go b/provider/kubernetes/builder_configuration_test.go index 89999d992..edf9ab017 100644 --- a/provider/kubernetes/builder_configuration_test.go +++ b/provider/kubernetes/builder_configuration_test.go @@ -219,6 +219,39 @@ func redirectRegex(regex, replacement string) func(*types.Frontend) { } } +func errorPage(name string, opts ...func(*types.ErrorPage)) func(*types.Frontend) { + return func(f *types.Frontend) { + if f.Errors == nil { + f.Errors = make(map[string]*types.ErrorPage) + } + + if len(name) > 0 { + f.Errors[name] = &types.ErrorPage{} + for _, opt := range opts { + opt(f.Errors[name]) + } + } + } +} + +func errorStatus(status ...string) func(*types.ErrorPage) { + return func(page *types.ErrorPage) { + page.Status = status + } +} + +func errorQuery(query string) func(*types.ErrorPage) { + return func(page *types.ErrorPage) { + page.Query = query + } +} + +func errorBackend(backend string) func(*types.ErrorPage) { + return func(page *types.ErrorPage) { + page.Backend = backend + } +} + func passTLSCert() func(*types.Frontend) { return func(f *types.Frontend) { f.PassTLSCert = true diff --git a/provider/kubernetes/kubernetes.go b/provider/kubernetes/kubernetes.go index 3dc4d76e8..479eee0ca 100644 --- a/provider/kubernetes/kubernetes.go +++ b/provider/kubernetes/kubernetes.go @@ -220,6 +220,8 @@ func (p *Provider) loadIngresses(k8sClient Client) (*types.Configuration, error) whitelistSourceRange := label.GetSliceStringValue(i.Annotations, annotationKubernetesWhitelistSourceRange) + errorPages := label.ParseErrorPages(i.Annotations, label.Prefix+label.BaseFrontendErrorPage, label.RegexpFrontendErrorPage) + templateObjects.Frontends[r.Host+pa.Path] = &types.Frontend{ Backend: r.Host + pa.Path, PassHostHeader: passHostHeader, @@ -231,6 +233,7 @@ func (p *Provider) loadIngresses(k8sClient Client) (*types.Configuration, error) Redirect: getFrontendRedirect(i), EntryPoints: entryPoints, Headers: getHeader(i), + Errors: errorPages, } } diff --git a/provider/kubernetes/kubernetes_test.go b/provider/kubernetes/kubernetes_test.go index a432a220b..207344d20 100644 --- a/provider/kubernetes/kubernetes_test.go +++ b/provider/kubernetes/kubernetes_test.go @@ -673,6 +673,18 @@ func TestIngressAnnotations(t *testing.T) { iPaths(onePath(iPath("/https"), iBackend("service1", intstr.FromInt(80))))), ), ), + buildIngress( + iNamespace("testing"), + iAnnotation(annotationKubernetesIngressClass, "traefik"), + iAnnotation(label.Prefix+label.BaseFrontendErrorPage+"foo."+label.SuffixErrorPageQuery, "/bar"), + iAnnotation(label.Prefix+label.BaseFrontendErrorPage+"foo."+label.SuffixErrorPageStatus, "123,456"), + iAnnotation(label.Prefix+label.BaseFrontendErrorPage+"foo."+label.SuffixErrorPageBackend, "bar"), + iRules( + iRule( + iHost("error-pages"), + iPaths(onePath(iPath("/errorpages"), iBackend("service1", intstr.FromInt(80))))), + ), + ), } services := []*v1.Service{ @@ -767,6 +779,12 @@ func TestIngressAnnotations(t *testing.T) { server("http://example.com", weight(1))), lbMethod("wrr"), ), + backend("error-pages/errorpages", + servers( + server("http://example.com", weight(1)), + server("http://example.com", weight(1))), + lbMethod("wrr"), + ), ), frontends( frontend("foo/bar", @@ -837,6 +855,14 @@ func TestIngressAnnotations(t *testing.T) { route("/api", "PathPrefix:/api;ReplacePath:/"), route("rewrite", "Host:rewrite")), ), + frontend("error-pages/errorpages", + headers(), + passHostHeader(), + errorPage("foo", errorQuery("/bar"), errorStatus("123", "456"), errorBackend("bar")), + routes( + route("/errorpages", "PathPrefix:/errorpages"), + route("error-pages", "Host:error-pages")), + ), ), ) diff --git a/templates/kubernetes.tmpl b/templates/kubernetes.tmpl index e38d74a5f..769df0a4c 100644 --- a/templates/kubernetes.tmpl +++ b/templates/kubernetes.tmpl @@ -63,6 +63,18 @@ replacement = "{{$frontend.RedirectReplacement}}" {{end}} + {{ if $frontend.Errors }} + [frontends."frontend-{{$frontendName}}".errors] + {{ range $pageName, $page := $frontend.Errors }} + [frontends."frontend-{{$frontendName}}".errors.{{ $pageName }}] + status = [{{range $page.Status}} + "{{.}}", + {{end}}] + backend = "{{$page.Backend}}" + query = "{{$page.Query}}" + {{end}} + {{end}} + {{if $frontend.Headers }} [frontends."{{$frontendName}}".headers] SSLRedirect = {{$frontend.Headers.SSLRedirect}}