From c0fecd5bd71412dea120dc69183d8491f11ed731 Mon Sep 17 00:00:00 2001 From: Antoine Cotten Date: Thu, 31 Aug 2017 15:09:23 +0200 Subject: [PATCH] Add proxy-pass-params annotation and Backend field --- core/pkg/ingress/annotations/proxy/main.go | 15 ++++++++++++++- core/pkg/ingress/annotations/proxy/main_test.go | 8 ++++++++ core/pkg/ingress/defaults/main.go | 3 +++ docs/annotations.md | 1 + 4 files changed, 26 insertions(+), 1 deletion(-) diff --git a/core/pkg/ingress/annotations/proxy/main.go b/core/pkg/ingress/annotations/proxy/main.go index b430402825..568a75dd44 100644 --- a/core/pkg/ingress/annotations/proxy/main.go +++ b/core/pkg/ingress/annotations/proxy/main.go @@ -32,6 +32,7 @@ const ( cookiePath = "ingress.kubernetes.io/proxy-cookie-path" cookieDomain = "ingress.kubernetes.io/proxy-cookie-domain" nextUpstream = "ingress.kubernetes.io/proxy-next-upstream" + passParams = "ingress.kubernetes.io/proxy-pass-params" ) // Configuration returns the proxy timeout to use in the upstream server/s @@ -44,6 +45,7 @@ type Configuration struct { CookieDomain string `json:"cookieDomain"` CookiePath string `json:"cookiePath"` NextUpstream string `json:"nextUpstream"` + PassParams string `json:"passParams"` } // Equal tests for equality between two Configuration types @@ -75,6 +77,12 @@ func (l1 *Configuration) Equal(l2 *Configuration) bool { if l1.CookiePath != l2.CookiePath { return false } + if l1.NextUpstream != l2.NextUpstream { + return false + } + if l1.PassParams != l2.PassParams { + return false + } return true } @@ -132,5 +140,10 @@ func (a proxy) Parse(ing *extensions.Ingress) (interface{}, error) { nu = defBackend.ProxyNextUpstream } - return &Configuration{bs, ct, st, rt, bufs, cd, cp, nu}, nil + pp, err := parser.GetStringAnnotation(passParams, ing) + if err != nil || pp == "" { + pp = defBackend.ProxyPassParams + } + + return &Configuration{bs, ct, st, rt, bufs, cd, cp, nu, pp}, nil } diff --git a/core/pkg/ingress/annotations/proxy/main_test.go b/core/pkg/ingress/annotations/proxy/main_test.go index df8697e6b6..76481a7301 100644 --- a/core/pkg/ingress/annotations/proxy/main_test.go +++ b/core/pkg/ingress/annotations/proxy/main_test.go @@ -74,6 +74,7 @@ func (m mockBackend) GetDefaultBackend() defaults.Backend { ProxyBufferSize: "10k", ProxyBodySize: "3k", ProxyNextUpstream: "error", + ProxyPassParams: "nocanon keepalive=On", } } @@ -87,6 +88,7 @@ func TestProxy(t *testing.T) { data[bufferSize] = "1k" data[bodySize] = "2k" data[nextUpstream] = "off" + data[passParams] = "smax=5 max=10" ing.SetAnnotations(data) i, err := NewParser(mockBackend{}).Parse(ing) @@ -115,6 +117,9 @@ func TestProxy(t *testing.T) { if p.NextUpstream != "off" { t.Errorf("expected off as next-upstream but returned %v", p.NextUpstream) } + if p.PassParams != "smax=5 max=10" { + t.Errorf("expected \"smax=5 max=10\" as pass-params but returned \"%v\"", p.PassParams) + } } func TestProxyWithNoAnnotation(t *testing.T) { @@ -149,4 +154,7 @@ func TestProxyWithNoAnnotation(t *testing.T) { if p.NextUpstream != "error" { t.Errorf("expected error as next-upstream but returned %v", p.NextUpstream) } + if p.PassParams != "nocanon keepalive=On" { + t.Errorf("expected \"nocanon keepalive=On\" as pass-params but returned \"%v\"", p.PassParams) + } } diff --git a/core/pkg/ingress/defaults/main.go b/core/pkg/ingress/defaults/main.go index 63d0fed0e9..5b50ca9bab 100644 --- a/core/pkg/ingress/defaults/main.go +++ b/core/pkg/ingress/defaults/main.go @@ -53,6 +53,9 @@ type Backend struct { // http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_next_upstream ProxyNextUpstream string `json:"proxy-next-upstream"` + // Parameters for proxy-pass directive (eg. Apache web server). + ProxyPassParams string `json:"proxy-pass-params"` + // Name server/s used to resolve names of upstream servers into IP addresses. // The file /etc/resolv.conf is used as DNS resolution configuration. Resolver []net.IP diff --git a/docs/annotations.md b/docs/annotations.md index 068d6f8e95..8f157d3c8f 100644 --- a/docs/annotations.md +++ b/docs/annotations.md @@ -63,6 +63,7 @@ Key: | `session-cookie-name` | When `affinity` is set to `cookie`, the name of the cookie to use. | | nginx | `session-cookie-hash` | When `affinity` is set to `cookie`, the hash algorithm used: `md5`, `sha`, `index`. | | nginx | `proxy-body-size` | Maximum request body size. | | nginx, haproxy +| `proxy-pass-params` | Parameters for proxy-pass directives. | | | `follow-redirects` | Follow HTTP redirects in the response and deliver the redirect target to the client. | | trafficserver | `kubernetes.io/ingress.global-static-ip-name` | Name of the static global IP address in GCP to use when provisioning the HTTPS load balancer. | empty string | gce