fix: used 'traefik.domain' in frontend rule.
This commit is contained in:
parent
3df588047d
commit
7e2ad827aa
17 changed files with 220 additions and 67 deletions
|
@ -182,12 +182,14 @@ func (p *Provider) getFrontendRule(container dockerData, segmentLabels map[strin
|
||||||
return value
|
return value
|
||||||
}
|
}
|
||||||
|
|
||||||
|
domain := label.GetStringValue(segmentLabels, label.TraefikDomain, p.Domain)
|
||||||
|
|
||||||
if values, err := label.GetStringMultipleStrict(container.Labels, labelDockerComposeProject, labelDockerComposeService); err == nil {
|
if values, err := label.GetStringMultipleStrict(container.Labels, labelDockerComposeProject, labelDockerComposeService); err == nil {
|
||||||
return "Host:" + getSubDomain(values[labelDockerComposeService]+"."+values[labelDockerComposeProject]) + "." + p.Domain
|
return "Host:" + getSubDomain(values[labelDockerComposeService]+"."+values[labelDockerComposeProject]) + "." + domain
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(p.Domain) > 0 {
|
if len(domain) > 0 {
|
||||||
return "Host:" + getSubDomain(container.ServiceName) + "." + p.Domain
|
return "Host:" + getSubDomain(container.ServiceName) + "." + domain
|
||||||
}
|
}
|
||||||
|
|
||||||
return ""
|
return ""
|
||||||
|
|
|
@ -802,15 +802,19 @@ func TestDockerGetFrontendRule(t *testing.T) {
|
||||||
expected: "Host:foo.docker.localhost",
|
expected: "Host:foo.docker.localhost",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
container: containerJSON(name("bar")),
|
container: containerJSON(name("foo"),
|
||||||
expected: "Host:bar.docker.localhost",
|
labels(map[string]string{
|
||||||
|
label.TraefikDomain: "traefik.localhost",
|
||||||
|
})),
|
||||||
|
expected: "Host:foo.traefik.localhost",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
container: containerJSON(labels(map[string]string{
|
container: containerJSON(labels(map[string]string{
|
||||||
label.TraefikFrontendRule: "Host:foo.bar",
|
label.TraefikFrontendRule: "Host:foo.bar",
|
||||||
})),
|
})),
|
||||||
expected: "Host:foo.bar",
|
expected: "Host:foo.bar",
|
||||||
}, {
|
},
|
||||||
|
{
|
||||||
container: containerJSON(labels(map[string]string{
|
container: containerJSON(labels(map[string]string{
|
||||||
"com.docker.compose.project": "foo",
|
"com.docker.compose.project": "foo",
|
||||||
"com.docker.compose.service": "bar",
|
"com.docker.compose.service": "bar",
|
||||||
|
|
|
@ -554,8 +554,11 @@ func TestSwarmGetFrontendRule(t *testing.T) {
|
||||||
networks: map[string]*docker.NetworkResource{},
|
networks: map[string]*docker.NetworkResource{},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
service: swarmService(serviceName("bar")),
|
service: swarmService(serviceName("foo"),
|
||||||
expected: "Host:bar.docker.localhost",
|
serviceLabels(map[string]string{
|
||||||
|
label.TraefikDomain: "traefik.localhost",
|
||||||
|
})),
|
||||||
|
expected: "Host:foo.traefik.localhost",
|
||||||
networks: map[string]*docker.NetworkResource{},
|
networks: map[string]*docker.NetworkResource{},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
|
@ -27,12 +27,14 @@ func (p Provider) getFrontendRuleV1(container dockerData) string {
|
||||||
return value
|
return value
|
||||||
}
|
}
|
||||||
|
|
||||||
|
domain := label.GetStringValue(container.Labels, label.TraefikDomain, p.Domain)
|
||||||
|
|
||||||
if values, err := label.GetStringMultipleStrict(container.Labels, labelDockerComposeProject, labelDockerComposeService); err == nil {
|
if values, err := label.GetStringMultipleStrict(container.Labels, labelDockerComposeProject, labelDockerComposeService); err == nil {
|
||||||
return "Host:" + getSubDomain(values[labelDockerComposeService]+"."+values[labelDockerComposeProject]) + "." + p.Domain
|
return "Host:" + getSubDomain(values[labelDockerComposeService]+"."+values[labelDockerComposeProject]) + "." + domain
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(p.Domain) > 0 {
|
if len(domain) > 0 {
|
||||||
return "Host:" + getSubDomain(container.ServiceName) + "." + p.Domain
|
return "Host:" + getSubDomain(container.ServiceName) + "." + domain
|
||||||
}
|
}
|
||||||
|
|
||||||
return ""
|
return ""
|
||||||
|
|
|
@ -752,15 +752,19 @@ func TestDockerGetFrontendRuleV1(t *testing.T) {
|
||||||
expected: "Host:foo.docker.localhost",
|
expected: "Host:foo.docker.localhost",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
container: containerJSON(name("bar")),
|
container: containerJSON(name("foo"),
|
||||||
expected: "Host:bar.docker.localhost",
|
labels(map[string]string{
|
||||||
|
label.TraefikDomain: "traefik.localhost",
|
||||||
|
})),
|
||||||
|
expected: "Host:foo.traefik.localhost",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
container: containerJSON(labels(map[string]string{
|
container: containerJSON(labels(map[string]string{
|
||||||
label.TraefikFrontendRule: "Host:foo.bar",
|
label.TraefikFrontendRule: "Host:foo.bar",
|
||||||
})),
|
})),
|
||||||
expected: "Host:foo.bar",
|
expected: "Host:foo.bar",
|
||||||
}, {
|
},
|
||||||
|
{
|
||||||
container: containerJSON(labels(map[string]string{
|
container: containerJSON(labels(map[string]string{
|
||||||
"com.docker.compose.project": "foo",
|
"com.docker.compose.project": "foo",
|
||||||
"com.docker.compose.service": "bar",
|
"com.docker.compose.service": "bar",
|
||||||
|
|
|
@ -527,8 +527,11 @@ func TestSwarmGetFrontendRuleV1(t *testing.T) {
|
||||||
networks: map[string]*docker.NetworkResource{},
|
networks: map[string]*docker.NetworkResource{},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
service: swarmService(serviceName("bar")),
|
service: swarmService(serviceName("foo"),
|
||||||
expected: "Host:bar.docker.localhost",
|
serviceLabels(map[string]string{
|
||||||
|
label.TraefikDomain: "traefik.localhost",
|
||||||
|
})),
|
||||||
|
expected: "Host:foo.traefik.localhost",
|
||||||
networks: map[string]*docker.NetworkResource{},
|
networks: map[string]*docker.NetworkResource{},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
|
@ -91,7 +91,9 @@ func (p *Provider) filterInstance(i ecsInstance) bool {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *Provider) getFrontendRule(i ecsInstance) string {
|
func (p *Provider) getFrontendRule(i ecsInstance) string {
|
||||||
defaultRule := "Host:" + strings.ToLower(strings.Replace(i.Name, "_", "-", -1)) + "." + p.Domain
|
domain := label.GetStringValue(i.TraefikLabels, label.TraefikDomain, p.Domain)
|
||||||
|
defaultRule := "Host:" + strings.ToLower(strings.Replace(i.Name, "_", "-", -1)) + "." + domain
|
||||||
|
|
||||||
return label.GetStringValue(i.TraefikLabels, label.TraefikFrontendRule, defaultRule)
|
return label.GetStringValue(i.TraefikLabels, label.TraefikFrontendRule, defaultRule)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -10,6 +10,16 @@ import (
|
||||||
|
|
||||||
const testTaskName = "taskID"
|
const testTaskName = "taskID"
|
||||||
|
|
||||||
|
func withAppData(app marathon.Application, segmentName string) appData {
|
||||||
|
segmentProperties := label.ExtractTraefikLabels(stringValueMap(app.Labels))
|
||||||
|
return appData{
|
||||||
|
Application: app,
|
||||||
|
SegmentLabels: segmentProperties[segmentName],
|
||||||
|
SegmentName: segmentName,
|
||||||
|
LinkedApps: nil,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Functions related to building applications.
|
// Functions related to building applications.
|
||||||
|
|
||||||
func withApplications(apps ...marathon.Application) *marathon.Applications {
|
func withApplications(apps ...marathon.Application) *marathon.Applications {
|
||||||
|
|
|
@ -210,10 +210,12 @@ func (p *Provider) getFrontendRule(app appData) string {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
domain := label.GetStringValue(app.SegmentLabels, label.TraefikDomain, p.Domain)
|
||||||
|
|
||||||
if len(app.SegmentName) > 0 {
|
if len(app.SegmentName) > 0 {
|
||||||
return "Host:" + strings.ToLower(provider.Normalize(app.SegmentName)) + "." + p.getSubDomain(app.ID) + "." + p.Domain
|
return "Host:" + strings.ToLower(provider.Normalize(app.SegmentName)) + "." + p.getSubDomain(app.ID) + "." + domain
|
||||||
}
|
}
|
||||||
return "Host:" + p.getSubDomain(app.ID) + "." + p.Domain
|
return "Host:" + p.getSubDomain(app.ID) + "." + domain
|
||||||
}
|
}
|
||||||
|
|
||||||
func getPort(task marathon.Task, app appData) string {
|
func getPort(task marathon.Task, app appData) string {
|
||||||
|
@ -345,6 +347,9 @@ func (p *Provider) getServer(app appData, task marathon.Task) (string, *types.Se
|
||||||
|
|
||||||
func (p *Provider) getServerHost(task marathon.Task, app appData) (string, error) {
|
func (p *Provider) getServerHost(task marathon.Task, app appData) (string, error) {
|
||||||
if app.IPAddressPerTask == nil || p.ForceTaskHostname {
|
if app.IPAddressPerTask == nil || p.ForceTaskHostname {
|
||||||
|
if len(task.Host) == 0 {
|
||||||
|
return "", fmt.Errorf("host is undefined for task %q app %q", task.ID, app.ID)
|
||||||
|
}
|
||||||
return task.Host, nil
|
return task.Host, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1026,7 +1026,7 @@ func TestGetPort(t *testing.T) {
|
||||||
desc string
|
desc string
|
||||||
application marathon.Application
|
application marathon.Application
|
||||||
task marathon.Task
|
task marathon.Task
|
||||||
serviceName string
|
segmentName string
|
||||||
expected string
|
expected string
|
||||||
}{
|
}{
|
||||||
{
|
{
|
||||||
|
@ -1108,23 +1108,23 @@ func TestGetPort(t *testing.T) {
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
desc: "multiple task ports with service index available",
|
desc: "multiple task ports with service index available",
|
||||||
application: application(withLabel(label.Prefix+"http.portIndex", "0")),
|
application: application(withSegmentLabel(label.TraefikPortIndex, "0", "http")),
|
||||||
task: task(taskPorts(80, 443)),
|
task: task(taskPorts(80, 443)),
|
||||||
serviceName: "http",
|
segmentName: "http",
|
||||||
expected: "80",
|
expected: "80",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
desc: "multiple task ports with service port available",
|
desc: "multiple task ports with service port available",
|
||||||
application: application(withLabel(label.Prefix+"https.port", "443")),
|
application: application(withSegmentLabel(label.TraefikPort, "443", "https")),
|
||||||
task: task(taskPorts(80, 443)),
|
task: task(taskPorts(80, 443)),
|
||||||
serviceName: "https",
|
segmentName: "https",
|
||||||
expected: "443",
|
expected: "443",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
desc: "multiple task ports with services but default port available",
|
desc: "multiple task ports with services but default port available",
|
||||||
application: application(withLabel(label.Prefix+"http.weight", "100")),
|
application: application(withSegmentLabel(label.TraefikWeight, "100", "http")),
|
||||||
task: task(taskPorts(80, 443)),
|
task: task(taskPorts(80, 443)),
|
||||||
serviceName: "http",
|
segmentName: "http",
|
||||||
expected: "80",
|
expected: "80",
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
@ -1134,7 +1134,7 @@ func TestGetPort(t *testing.T) {
|
||||||
t.Run(test.desc, func(t *testing.T) {
|
t.Run(test.desc, func(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
actual := getPortV1(test.task, test.application, test.serviceName)
|
actual := getPort(test.task, withAppData(test.application, test.segmentName))
|
||||||
|
|
||||||
assert.Equal(t, test.expected, actual)
|
assert.Equal(t, test.expected, actual)
|
||||||
})
|
})
|
||||||
|
@ -1145,7 +1145,7 @@ func TestGetFrontendRule(t *testing.T) {
|
||||||
testCases := []struct {
|
testCases := []struct {
|
||||||
desc string
|
desc string
|
||||||
application marathon.Application
|
application marathon.Application
|
||||||
serviceName string
|
segmentName string
|
||||||
expected string
|
expected string
|
||||||
marathonLBCompatibility bool
|
marathonLBCompatibility bool
|
||||||
}{
|
}{
|
||||||
|
@ -1155,6 +1155,15 @@ func TestGetFrontendRule(t *testing.T) {
|
||||||
marathonLBCompatibility: true,
|
marathonLBCompatibility: true,
|
||||||
expected: "Host:test.marathon.localhost",
|
expected: "Host:test.marathon.localhost",
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
desc: "label domain",
|
||||||
|
application: application(
|
||||||
|
appID("test"),
|
||||||
|
withLabel(label.TraefikDomain, "traefik.localhost"),
|
||||||
|
),
|
||||||
|
marathonLBCompatibility: true,
|
||||||
|
expected: "Host:test.traefik.localhost",
|
||||||
|
},
|
||||||
{
|
{
|
||||||
desc: "HAProxy vhost available and LB compat disabled",
|
desc: "HAProxy vhost available and LB compat disabled",
|
||||||
application: application(
|
application: application(
|
||||||
|
@ -1172,7 +1181,6 @@ func TestGetFrontendRule(t *testing.T) {
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
desc: "frontend rule available",
|
desc: "frontend rule available",
|
||||||
|
|
||||||
application: application(
|
application: application(
|
||||||
withLabel(label.TraefikFrontendRule, "Host:foo.bar"),
|
withLabel(label.TraefikFrontendRule, "Host:foo.bar"),
|
||||||
withLabel("HAPROXY_0_VHOST", "unused"),
|
withLabel("HAPROXY_0_VHOST", "unused"),
|
||||||
|
@ -1181,9 +1189,9 @@ func TestGetFrontendRule(t *testing.T) {
|
||||||
expected: "Host:foo.bar",
|
expected: "Host:foo.bar",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
desc: "service label existing",
|
desc: "segment label frontend rule",
|
||||||
application: application(withSegmentLabel(label.TraefikFrontendRule, "Host:foo.bar", "app")),
|
application: application(withSegmentLabel(label.TraefikFrontendRule, "Host:foo.bar", "app")),
|
||||||
serviceName: "app",
|
segmentName: "app",
|
||||||
marathonLBCompatibility: true,
|
marathonLBCompatibility: true,
|
||||||
expected: "Host:foo.bar",
|
expected: "Host:foo.bar",
|
||||||
},
|
},
|
||||||
|
@ -1198,7 +1206,7 @@ func TestGetFrontendRule(t *testing.T) {
|
||||||
MarathonLBCompatibility: test.marathonLBCompatibility,
|
MarathonLBCompatibility: test.marathonLBCompatibility,
|
||||||
}
|
}
|
||||||
|
|
||||||
actual := p.getFrontendRuleV1(test.application, test.serviceName)
|
actual := p.getFrontendRule(withAppData(test.application, test.segmentName))
|
||||||
|
|
||||||
assert.Equal(t, test.expected, actual)
|
assert.Equal(t, test.expected, actual)
|
||||||
})
|
})
|
||||||
|
@ -1209,7 +1217,7 @@ func TestGetBackendName(t *testing.T) {
|
||||||
testCases := []struct {
|
testCases := []struct {
|
||||||
desc string
|
desc string
|
||||||
application marathon.Application
|
application marathon.Application
|
||||||
serviceName string
|
segmentName string
|
||||||
expected string
|
expected string
|
||||||
}{
|
}{
|
||||||
{
|
{
|
||||||
|
@ -1223,9 +1231,9 @@ func TestGetBackendName(t *testing.T) {
|
||||||
expected: "backendbar",
|
expected: "backendbar",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
desc: "service label existing",
|
desc: "segment label existing",
|
||||||
application: application(withSegmentLabel(label.TraefikBackend, "bar", "app")),
|
application: application(withSegmentLabel(label.TraefikBackend, "bar", "app")),
|
||||||
serviceName: "app",
|
segmentName: "app",
|
||||||
expected: "backendbar",
|
expected: "backendbar",
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
@ -1237,7 +1245,7 @@ func TestGetBackendName(t *testing.T) {
|
||||||
|
|
||||||
p := &Provider{}
|
p := &Provider{}
|
||||||
|
|
||||||
actual := p.getBackendNameV1(test.application, test.serviceName)
|
actual := p.getBackendName(withAppData(test.application, test.segmentName))
|
||||||
|
|
||||||
assert.Equal(t, test.expected, actual)
|
assert.Equal(t, test.expected, actual)
|
||||||
})
|
})
|
||||||
|
@ -1248,7 +1256,7 @@ func TestGetServers(t *testing.T) {
|
||||||
testCases := []struct {
|
testCases := []struct {
|
||||||
desc string
|
desc string
|
||||||
application marathon.Application
|
application marathon.Application
|
||||||
serviceName string
|
segmentName string
|
||||||
expected map[string]types.Server
|
expected map[string]types.Server
|
||||||
}{
|
}{
|
||||||
{
|
{
|
||||||
|
@ -1296,12 +1304,14 @@ func TestGetServers(t *testing.T) {
|
||||||
|
|
||||||
for _, test := range testCases {
|
for _, test := range testCases {
|
||||||
test := test
|
test := test
|
||||||
|
if test.desc == "should return nil when all hosts are empty" {
|
||||||
t.Run(test.desc, func(t *testing.T) {
|
t.Run(test.desc, func(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
actual := p.getServersV1(test.application, test.serviceName)
|
actual := p.getServers(withAppData(test.application, test.segmentName))
|
||||||
|
|
||||||
assert.Equal(t, test.expected, actual)
|
assert.Equal(t, test.expected, actual)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -138,10 +138,11 @@ func (p *Provider) getFrontendRuleV1(application marathon.Application, serviceNa
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
domain := label.GetStringValue(labels, label.SuffixDomain, p.Domain)
|
||||||
if len(serviceName) > 0 {
|
if len(serviceName) > 0 {
|
||||||
return "Host:" + strings.ToLower(provider.Normalize(serviceName)) + "." + p.getSubDomain(application.ID) + "." + p.Domain
|
return "Host:" + strings.ToLower(provider.Normalize(serviceName)) + "." + p.getSubDomain(application.ID) + "." + domain
|
||||||
}
|
}
|
||||||
return "Host:" + p.getSubDomain(application.ID) + "." + p.Domain
|
return "Host:" + p.getSubDomain(application.ID) + "." + domain
|
||||||
}
|
}
|
||||||
|
|
||||||
// Deprecated
|
// Deprecated
|
||||||
|
|
|
@ -760,3 +760,67 @@ func TestGetStickyV1(t *testing.T) {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestGetServersV1(t *testing.T) {
|
||||||
|
testCases := []struct {
|
||||||
|
desc string
|
||||||
|
application marathon.Application
|
||||||
|
segmentName string
|
||||||
|
expected map[string]types.Server
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
desc: "should return nil when no task",
|
||||||
|
application: application(ipAddrPerTask(80)),
|
||||||
|
expected: nil,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
desc: "should return nil when all hosts are empty",
|
||||||
|
application: application(
|
||||||
|
withTasks(
|
||||||
|
task(ipAddresses("1.1.1.1"), withTaskID("A"), taskPorts(80)),
|
||||||
|
task(ipAddresses("1.1.1.2"), withTaskID("B"), taskPorts(80)),
|
||||||
|
task(ipAddresses("1.1.1.3"), withTaskID("C"), taskPorts(80))),
|
||||||
|
),
|
||||||
|
expected: nil,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
desc: "with 3 tasks",
|
||||||
|
application: application(
|
||||||
|
ipAddrPerTask(80),
|
||||||
|
withTasks(
|
||||||
|
task(ipAddresses("1.1.1.1"), withTaskID("A"), taskPorts(80)),
|
||||||
|
task(ipAddresses("1.1.1.2"), withTaskID("B"), taskPorts(80)),
|
||||||
|
task(ipAddresses("1.1.1.3"), withTaskID("C"), taskPorts(80))),
|
||||||
|
),
|
||||||
|
expected: map[string]types.Server{
|
||||||
|
"server-A": {
|
||||||
|
URL: "http://1.1.1.1:80",
|
||||||
|
Weight: label.DefaultWeight,
|
||||||
|
},
|
||||||
|
"server-B": {
|
||||||
|
URL: "http://1.1.1.2:80",
|
||||||
|
Weight: label.DefaultWeight,
|
||||||
|
},
|
||||||
|
"server-C": {
|
||||||
|
URL: "http://1.1.1.3:80",
|
||||||
|
Weight: label.DefaultWeight,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
p := &Provider{}
|
||||||
|
|
||||||
|
for _, test := range testCases {
|
||||||
|
test := test
|
||||||
|
if test.desc == "should return nil when all hosts are empty" {
|
||||||
|
t.Run(test.desc, func(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
actual := p.getServersV1(test.application, test.segmentName)
|
||||||
|
|
||||||
|
assert.Equal(t, test.expected, actual)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -166,7 +166,9 @@ func (p *Provider) getFrontendRule(task taskData) string {
|
||||||
if v := label.GetStringValue(task.TraefikLabels, label.TraefikFrontendRule, ""); len(v) > 0 {
|
if v := label.GetStringValue(task.TraefikLabels, label.TraefikFrontendRule, ""); len(v) > 0 {
|
||||||
return v
|
return v
|
||||||
}
|
}
|
||||||
return "Host:" + strings.ToLower(strings.Replace(p.getSubDomain(task.DiscoveryInfo.Name), "_", "-", -1)) + "." + p.Domain
|
|
||||||
|
domain := label.GetStringValue(task.TraefikLabels, label.TraefikDomain, p.Domain)
|
||||||
|
return "Host:" + strings.ToLower(strings.Replace(p.getSubDomain(task.DiscoveryInfo.Name), "_", "-", -1)) + "." + domain
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *Provider) getServers(tasks []taskData) map[string]types.Server {
|
func (p *Provider) getServers(tasks []taskData) map[string]types.Server {
|
||||||
|
|
|
@ -652,3 +652,50 @@ func TestGetServers(t *testing.T) {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestGetFrontendRule(t *testing.T) {
|
||||||
|
p := Provider{
|
||||||
|
Domain: "mesos.localhost",
|
||||||
|
}
|
||||||
|
|
||||||
|
testCases := []struct {
|
||||||
|
desc string
|
||||||
|
mesosTask taskData
|
||||||
|
expected string
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
desc: "label missing",
|
||||||
|
mesosTask: aTaskData("test",
|
||||||
|
withInfo("foo"),
|
||||||
|
),
|
||||||
|
expected: "Host:foo.mesos.localhost",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
desc: "label domain",
|
||||||
|
mesosTask: aTaskData("test",
|
||||||
|
withInfo("foo"),
|
||||||
|
withLabel(label.TraefikDomain, "traefik.localhost"),
|
||||||
|
),
|
||||||
|
expected: "Host:foo.traefik.localhost",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
desc: "frontend rule available",
|
||||||
|
mesosTask: aTaskData("test",
|
||||||
|
withInfo("foo"),
|
||||||
|
withLabel(label.TraefikFrontendRule, "Host:foo.bar"),
|
||||||
|
),
|
||||||
|
expected: "Host:foo.bar",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, test := range testCases {
|
||||||
|
test := test
|
||||||
|
t.Run(test.desc, func(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
rule := p.getFrontendRule(test.mesosTask)
|
||||||
|
|
||||||
|
assert.Equal(t, test.expected, rule)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -196,7 +196,9 @@ func (p *Provider) getFrontendRuleV1(task state.Task) string {
|
||||||
if v := getStringValueV1(task, label.TraefikFrontendRule, ""); len(v) > 0 {
|
if v := getStringValueV1(task, label.TraefikFrontendRule, ""); len(v) > 0 {
|
||||||
return v
|
return v
|
||||||
}
|
}
|
||||||
return "Host:" + strings.ToLower(strings.Replace(p.getSubDomain(task.DiscoveryInfo.Name), "_", "-", -1)) + "." + p.Domain
|
|
||||||
|
domain := getStringValueV1(task, label.TraefikDomain, p.Domain)
|
||||||
|
return "Host:" + strings.ToLower(strings.Replace(p.getSubDomain(task.DiscoveryInfo.Name), "_", "-", -1)) + "." + domain
|
||||||
}
|
}
|
||||||
|
|
||||||
// Deprecated
|
// Deprecated
|
||||||
|
|
|
@ -124,7 +124,9 @@ func (p *Provider) serviceFilter(service rancherData) bool {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *Provider) getFrontendRule(serviceName string, labels map[string]string) string {
|
func (p *Provider) getFrontendRule(serviceName string, labels map[string]string) string {
|
||||||
defaultRule := "Host:" + strings.ToLower(strings.Replace(serviceName, "/", ".", -1)) + "." + p.Domain
|
domain := label.GetStringValue(labels, label.TraefikDomain, p.Domain)
|
||||||
|
defaultRule := "Host:" + strings.ToLower(strings.Replace(serviceName, "/", ".", -1)) + "." + domain
|
||||||
|
|
||||||
return label.GetStringValue(labels, label.TraefikFrontendRule, defaultRule)
|
return label.GetStringValue(labels, label.TraefikFrontendRule, defaultRule)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -722,6 +722,16 @@ func TestProviderGetFrontendRule(t *testing.T) {
|
||||||
},
|
},
|
||||||
expected: "Host:foo.rancher.localhost",
|
expected: "Host:foo.rancher.localhost",
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
desc: "with domain label",
|
||||||
|
service: rancherData{
|
||||||
|
Name: "test-service",
|
||||||
|
Labels: map[string]string{
|
||||||
|
label.TraefikDomain: "traefik.localhost",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
expected: "Host:test-service.traefik.localhost",
|
||||||
|
},
|
||||||
{
|
{
|
||||||
desc: "host with /",
|
desc: "host with /",
|
||||||
service: rancherData{
|
service: rancherData{
|
||||||
|
@ -739,26 +749,6 @@ func TestProviderGetFrontendRule(t *testing.T) {
|
||||||
},
|
},
|
||||||
expected: "Host:foo.bar.com",
|
expected: "Host:foo.bar.com",
|
||||||
},
|
},
|
||||||
{
|
|
||||||
desc: "with Path label",
|
|
||||||
service: rancherData{
|
|
||||||
Name: "test-service",
|
|
||||||
Labels: map[string]string{
|
|
||||||
label.TraefikFrontendRule: "Path:/test",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
expected: "Path:/test",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
desc: "with PathPrefix label",
|
|
||||||
service: rancherData{
|
|
||||||
Name: "test-service",
|
|
||||||
Labels: map[string]string{
|
|
||||||
label.TraefikFrontendRule: "PathPrefix:/test2",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
expected: "PathPrefix:/test2",
|
|
||||||
},
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, test := range testCases {
|
for _, test := range testCases {
|
||||||
|
|
Loading…
Reference in a new issue