Skip to content
This repository has been archived by the owner on Apr 27, 2021. It is now read-only.

Commit

Permalink
Fix buildupstream name to work with dynamic session affinity
Browse files Browse the repository at this point in the history
  • Loading branch information
Zenara Daley committed Apr 10, 2018
1 parent 518f474 commit c064c04
Show file tree
Hide file tree
Showing 3 changed files with 54 additions and 10 deletions.
19 changes: 10 additions & 9 deletions internal/ingress/controller/template/template.go
Original file line number Diff line number Diff line change
Expand Up @@ -629,8 +629,7 @@ func buildDenyVariable(a interface{}) string {
return fmt.Sprintf("$deny_%v", denyPathSlugMap[l])
}

// TODO: Needs Unit Tests
func buildUpstreamName(host string, b interface{}, loc interface{}) string {
func buildUpstreamName(host string, b interface{}, loc interface{}, dynamicConfigurationEnabled bool) string {

backends, ok := b.([]*ingress.Backend)
if !ok {
Expand All @@ -646,14 +645,16 @@ func buildUpstreamName(host string, b interface{}, loc interface{}) string {

upstreamName := location.Backend

for _, backend := range backends {
if backend.Name == location.Backend {
if backend.SessionAffinity.AffinityType == "cookie" &&
isSticky(host, location, backend.SessionAffinity.CookieSessionAffinity.Locations) {
upstreamName = fmt.Sprintf("sticky-%v", upstreamName)
if !dynamicConfigurationEnabled{
for _, backend := range backends {
if backend.Name == location.Backend {
if backend.SessionAffinity.AffinityType == "cookie" &&
isSticky(host, location, backend.SessionAffinity.CookieSessionAffinity.Locations) {
upstreamName = fmt.Sprintf("sticky-%v", upstreamName)
}

break
}

break
}
}

Expand Down
43 changes: 43 additions & 0 deletions internal/ingress/controller/template/template_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -709,3 +709,46 @@ func TestIsLocationInLocationList(t *testing.T) {
}
}
}

func TestBuildUpstreamName(t *testing.T) {
defaultBackend := "upstream-name"
defaultHost := "example.com"

for k, tc := range tmplFuncTestcases {
loc := &ingress.Location{
Path: tc.Path,
Rewrite: rewrite.Config{Target: tc.Target, AddBaseURL: tc.AddBaseURL, BaseURLScheme: tc.BaseURLScheme},
Backend: defaultBackend,
XForwardedPrefix: tc.XForwardedPrefix,
}

backend := &ingress.Backend{
Name: defaultBackend,
Secure: tc.SecureBackend,
}

expected := defaultBackend

if tc.Sticky {
if !tc.DynamicConfigurationEnabled{
expected = fmt.Sprintf("sticky-" + expected)
}

backend.SessionAffinity = ingress.SessionAffinityConfig{
AffinityType: "cookie",
CookieSessionAffinity: ingress.CookieSessionAffinity{
Locations: map[string][]string{
defaultHost: {tc.Path},
},
},
}
}

backends := []*ingress.Backend{backend}

pp := buildUpstreamName(defaultHost, backends, loc, tc.DynamicConfigurationEnabled)
if !strings.EqualFold(expected, pp) {
t.Errorf("%s: expected \n'%v'\nbut returned \n'%v'", k, expected, pp)
}
}
}
2 changes: 1 addition & 1 deletion rootfs/etc/nginx/template/nginx.tmpl
Original file line number Diff line number Diff line change
Expand Up @@ -881,7 +881,7 @@ stream {

{{ if $all.Cfg.EnableVtsStatus }}{{ if $location.VtsFilterKey }} vhost_traffic_status_filter_by_set_key {{ $location.VtsFilterKey }};{{ end }}{{ end }}

set $proxy_upstream_name "{{ buildUpstreamName $server.Hostname $all.Backends $location }}";
set $proxy_upstream_name "{{ buildUpstreamName $server.Hostname $all.Backends $location $all.DynamicConfigurationEnabled }}";

{{ $ing := (getIngressInformation $location.Ingress $location.Path) }}
{{/* $ing.Metadata contains the Ingress metadata */}}
Expand Down

0 comments on commit c064c04

Please sign in to comment.