Merge pull request #1515 from mynameiswhm/master
Allow usage of non_idempotent option in proxy_next_upstream
This commit is contained in:
commit
99a355f25d
4 changed files with 51 additions and 11 deletions
|
@ -28,6 +28,7 @@ The following annotations are supported:
|
||||||
|[ingress.kubernetes.io/proxy-connect-timeout](#custom-timeouts)|number|
|
|[ingress.kubernetes.io/proxy-connect-timeout](#custom-timeouts)|number|
|
||||||
|[ingress.kubernetes.io/proxy-send-timeout](#custom-timeouts)|number|
|
|[ingress.kubernetes.io/proxy-send-timeout](#custom-timeouts)|number|
|
||||||
|[ingress.kubernetes.io/proxy-read-timeout](#custom-timeouts)|number|
|
|[ingress.kubernetes.io/proxy-read-timeout](#custom-timeouts)|number|
|
||||||
|
|[ingress.kubernetes.io/proxy-next-upstream](#custom-timeouts)|string|
|
||||||
|[ingress.kubernetes.io/proxy-request-buffering](#custom-timeouts)|string|
|
|[ingress.kubernetes.io/proxy-request-buffering](#custom-timeouts)|string|
|
||||||
|[ingress.kubernetes.io/rewrite-target](#rewrite)|URI|
|
|[ingress.kubernetes.io/rewrite-target](#rewrite)|URI|
|
||||||
|[ingress.kubernetes.io/secure-backends](#secure-backends)|true or false|
|
|[ingress.kubernetes.io/secure-backends](#secure-backends)|true or false|
|
||||||
|
@ -313,6 +314,7 @@ In some scenarios is required to have different values. To allow this we provide
|
||||||
- `ingress.kubernetes.io/proxy-connect-timeout`
|
- `ingress.kubernetes.io/proxy-connect-timeout`
|
||||||
- `ingress.kubernetes.io/proxy-send-timeout`
|
- `ingress.kubernetes.io/proxy-send-timeout`
|
||||||
- `ingress.kubernetes.io/proxy-read-timeout`
|
- `ingress.kubernetes.io/proxy-read-timeout`
|
||||||
|
- `ingress.kubernetes.io/proxy-next-upstream`
|
||||||
- `ingress.kubernetes.io/proxy-request-buffering`
|
- `ingress.kubernetes.io/proxy-request-buffering`
|
||||||
|
|
||||||
### Custom max body size
|
### Custom max body size
|
||||||
|
|
|
@ -44,6 +44,7 @@ import (
|
||||||
|
|
||||||
const (
|
const (
|
||||||
slash = "/"
|
slash = "/"
|
||||||
|
nonIdempotent = "non_idempotent"
|
||||||
defBufferSize = 65535
|
defBufferSize = 65535
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -548,20 +549,30 @@ func isSticky(host string, loc *ingress.Location, stickyLocations map[string][]s
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
func buildNextUpstream(input interface{}) string {
|
func buildNextUpstream(i, r interface{}) string {
|
||||||
nextUpstream, ok := input.(string)
|
nextUpstream, ok := i.(string)
|
||||||
if !ok {
|
if !ok {
|
||||||
glog.Errorf("expected a 'string' type but %T was returned", input)
|
glog.Errorf("expected a 'string' type but %T was returned", i)
|
||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
|
|
||||||
|
retryNonIdempotent := r.(bool)
|
||||||
|
|
||||||
parts := strings.Split(nextUpstream, " ")
|
parts := strings.Split(nextUpstream, " ")
|
||||||
|
|
||||||
nextUpstreamCodes := make([]string, 0, len(parts))
|
nextUpstreamCodes := make([]string, 0, len(parts))
|
||||||
for _, v := range parts {
|
for _, v := range parts {
|
||||||
if v != "" && v != "non_idempotent" {
|
if v != "" && v != nonIdempotent {
|
||||||
nextUpstreamCodes = append(nextUpstreamCodes, v)
|
nextUpstreamCodes = append(nextUpstreamCodes, v)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if v == nonIdempotent {
|
||||||
|
retryNonIdempotent = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if retryNonIdempotent {
|
||||||
|
nextUpstreamCodes = append(nextUpstreamCodes, nonIdempotent)
|
||||||
}
|
}
|
||||||
|
|
||||||
return strings.Join(nextUpstreamCodes, " ")
|
return strings.Join(nextUpstreamCodes, " ")
|
||||||
|
|
|
@ -311,13 +311,40 @@ func TestBuildResolvers(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestBuildNextUpstream(t *testing.T) {
|
func TestBuildNextUpstream(t *testing.T) {
|
||||||
nextUpstream := "timeout http_500 http_502 non_idempotent"
|
cases := map[string]struct {
|
||||||
validNextUpstream := "timeout http_500 http_502"
|
NextUpstream string
|
||||||
|
NonIdempotent bool
|
||||||
|
Output string
|
||||||
|
}{
|
||||||
|
"default": {
|
||||||
|
"timeout http_500 http_502",
|
||||||
|
false,
|
||||||
|
"timeout http_500 http_502",
|
||||||
|
},
|
||||||
|
"global": {
|
||||||
|
"timeout http_500 http_502",
|
||||||
|
true,
|
||||||
|
"timeout http_500 http_502 non_idempotent",
|
||||||
|
},
|
||||||
|
"local": {
|
||||||
|
"timeout http_500 http_502 non_idempotent",
|
||||||
|
false,
|
||||||
|
"timeout http_500 http_502 non_idempotent",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
buildNextUpstream := buildNextUpstream(nextUpstream)
|
for k, tc := range cases {
|
||||||
|
nextUpstream := buildNextUpstream(tc.NextUpstream, tc.NonIdempotent)
|
||||||
if buildNextUpstream != validNextUpstream {
|
if nextUpstream != tc.Output {
|
||||||
t.Errorf("Expected '%v' but returned '%v'", validNextUpstream, buildNextUpstream)
|
t.Errorf(
|
||||||
|
"%s: called buildNextUpstream('%s', %v); expected '%v' but returned '%v'",
|
||||||
|
k,
|
||||||
|
tc.NextUpstream,
|
||||||
|
tc.NonIdempotent,
|
||||||
|
tc.Output,
|
||||||
|
nextUpstream,
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -788,7 +788,7 @@ stream {
|
||||||
proxy_cookie_path {{ $location.Proxy.CookiePath }};
|
proxy_cookie_path {{ $location.Proxy.CookiePath }};
|
||||||
|
|
||||||
# In case of errors try the next upstream server before returning an error
|
# In case of errors try the next upstream server before returning an error
|
||||||
proxy_next_upstream {{ buildNextUpstream $location.Proxy.NextUpstream }}{{ if $all.Cfg.RetryNonIdempotent }} non_idempotent{{ end }};
|
proxy_next_upstream {{ buildNextUpstream $location.Proxy.NextUpstream $all.Cfg.RetryNonIdempotent }};
|
||||||
|
|
||||||
{{/* rewrite only works if the content is not compressed */}}
|
{{/* rewrite only works if the content is not compressed */}}
|
||||||
{{ if $location.Rewrite.AddBaseURL }}
|
{{ if $location.Rewrite.AddBaseURL }}
|
||||||
|
|
Loading…
Reference in a new issue