feat(kv): add frontend redirect configuration.

This commit is contained in:
Fernandez Ludovic 2018-01-03 16:37:31 +01:00 committed by Traefiker
parent 40b59da224
commit cfa1f47226
4 changed files with 99 additions and 0 deletions

View file

@ -33,6 +33,8 @@ func (p *Provider) buildConfiguration() *types.Configuration {
"Last": p.last,
"Has": p.has,
// Frontend functions
"getRedirect": p.getRedirect,
// Backend functions
"getSticky": p.getSticky,
"hasStickinessLabel": p.hasStickinessLabel,
@ -77,6 +79,23 @@ func (p *Provider) getStickinessCookieName(rootPath string) string {
return p.get("", rootPath, pathBackendLoadBalancerStickinessCookieName)
}
func (p *Provider) getRedirect(rootPath string) *types.Redirect {
if p.has(rootPath, pathFrontendRedirectEntryPoint) {
return &types.Redirect{
EntryPoint: p.get("", rootPath, pathFrontendRedirectEntryPoint),
}
}
if p.has(rootPath, pathFrontendRedirectRegex) && p.has(rootPath, pathFrontendRedirectReplacement) {
return &types.Redirect{
Regex: p.get("", rootPath, pathFrontendRedirectRegex),
Replacement: p.get("", rootPath, pathFrontendRedirectReplacement),
}
}
return nil
}
func (p *Provider) listServers(backend string) []string {
serverNames := p.list(backend, pathBackendServers)
return fun.Filter(p.serverFilter, serverNames).([]string)

View file

@ -707,3 +707,66 @@ func TestProviderHasStickinessLabel(t *testing.T) {
})
}
}
func TestProviderGetRedirect(t *testing.T) {
testCases := []struct {
desc string
rootPath string
kvPairs []*store.KVPair
expected *types.Redirect
}{
{
desc: "should use entry point when entry point key is valued in the store",
rootPath: "traefik/frontends/foo",
kvPairs: filler("traefik",
frontend("foo",
withPair(pathFrontendRedirectEntryPoint, "https"))),
expected: &types.Redirect{
EntryPoint: "https",
},
},
{
desc: "should use regex when regex keys are valued in the store",
rootPath: "traefik/frontends/foo",
kvPairs: filler("traefik",
frontend("foo",
withPair(pathFrontendRedirectRegex, "(.*)"),
withPair(pathFrontendRedirectReplacement, "$1"))),
expected: &types.Redirect{
Regex: "(.*)",
Replacement: "$1",
},
},
{
desc: "should only use entry point when entry point and regex base are valued in the store",
rootPath: "traefik/frontends/foo",
kvPairs: filler("traefik",
frontend("foo",
withPair(pathFrontendRedirectEntryPoint, "https"),
withPair(pathFrontendRedirectRegex, "nope"),
withPair(pathFrontendRedirectReplacement, "nope"))),
expected: &types.Redirect{
EntryPoint: "https",
},
},
{
desc: "should return when redirect keys are not valued in the store",
rootPath: "traefik/frontends/foo",
kvPairs: filler("traefik", frontend("foo")),
expected: nil,
},
}
for _, test := range testCases {
test := test
t.Run(test.desc, func(t *testing.T) {
t.Parallel()
p := newProviderMock(test.kvPairs)
actual := p.getRedirect(test.rootPath)
assert.Equal(t, test.expected, actual)
})
}
}

View file

@ -7,6 +7,15 @@ import (
"github.com/docker/libkv/store"
)
func newProviderMock(kvPairs []*store.KVPair) *Provider {
return &Provider{
Prefix: "traefik",
kvClient: &Mock{
KVPairs: kvPairs,
},
}
}
// Override Get/List to return a error
type KvError struct {
Get error

View file

@ -70,6 +70,14 @@
"{{.}}",
{{end}}]
{{$redirect := getRedirect $frontend }}
{{ if $redirect }}
[frontends."{{$frontendName}}".redirect]
entryPoint = "{{ $redirect.EntryPoint }}"
regex = "{{ $redirect.Regex }}"
replacement = "{{ $redirect.Replacement }}"
{{end}}
{{range $route := List $frontend "/routes/"}}
[frontends."{{$frontendName}}".routes."{{Last $route}}"]
rule = "{{Get "" $route "/rule"}}"