diff --git a/provider/marathon.go b/provider/marathon.go index c2fc96f25..7cc04c483 100644 --- a/provider/marathon.go +++ b/provider/marathon.go @@ -80,6 +80,7 @@ func (provider *Marathon) Provide(configurationChan chan<- types.ConfigMessage) func (provider *Marathon) loadMarathonConfig() *types.Configuration { var MarathonFuncMap = template.FuncMap{ + "getBackend": provider.getBackend, "getPort": provider.getPort, "getWeight": provider.getWeight, "getDomain": provider.getDomain, @@ -302,3 +303,10 @@ func (provider *Marathon) getFrontendRule(application marathon.Application) stri } return "Host" } + +func (provider *Marathon) getBackend(application marathon.Application) string { + if label, err := provider.getLabel(application, "traefik.backend"); err == nil { + return label + } + return replace("/", "-", application.ID) +} diff --git a/provider/marathon_test.go b/provider/marathon_test.go index bac35f1f4..8ffc026eb 100644 --- a/provider/marathon_test.go +++ b/provider/marathon_test.go @@ -800,3 +800,29 @@ func TestMarathonGetFrontendRule(t *testing.T) { } } } + +func TestMarathonGetBackend(t *testing.T) { + provider := &Marathon{} + + applications := []struct { + application marathon.Application + expected string + }{ + { + application: marathon.Application{ + ID: "foo", + Labels: map[string]string{ + "traefik.backend": "bar", + }, + }, + expected: "bar", + }, + } + + for _, a := range applications { + actual := provider.getBackend(a.application) + if actual != a.expected { + t.Fatalf("expected %q, got %q", a.expected, actual) + } + } +} diff --git a/templates/marathon.tmpl b/templates/marathon.tmpl index 9e689174e..ae31e9f8f 100644 --- a/templates/marathon.tmpl +++ b/templates/marathon.tmpl @@ -1,13 +1,13 @@ {{$apps := .Applications}} [backends]{{range .Tasks}} - [backends.backend{{.AppID | replace "/" "-"}}.servers.server-{{.ID | replace "." "-"}}] + [backends.backend{{with index $apps 0 }}{{getBackend .}}{{end}}.servers.server-{{.ID | replace "." "-"}}] url = "{{getProtocol . $apps}}://{{.Host}}:{{getPort . $apps}}" weight = {{getWeight . $apps}} {{end}} [frontends]{{range .Applications}} [frontends.frontend{{.ID | replace "/" "-"}}] - backend = "backend{{.ID | replace "/" "-"}}" + backend = "backend{{getBackend .}}" passHostHeader = {{getPassHostHeader .}} [frontends.frontend{{.ID | replace "/" "-"}}.routes.route-host{{.ID | replace "/" "-"}}] rule = "{{getFrontendRule .}}"