diff --git a/examples/whoami-group.json b/examples/whoami-group.json new file mode 100644 index 000000000..9c21a8dae --- /dev/null +++ b/examples/whoami-group.json @@ -0,0 +1,40 @@ +{ + "id": "/foo", + "groups": [ + { + "id": "/foo/bar", + "apps": [ + { + "id": "whoami", + "cpus": 0.1, + "mem": 64.0, + "instances": 3, + "container": { + "type": "DOCKER", + "docker": { + "image": "emilevauge/whoami", + "network": "BRIDGE", + "portMappings": [ + { + "containerPort": 80, + "hostPort": 0, + "protocol": "tcp" + } + ] + } + }, + "healthChecks": [ + { + "protocol": "HTTP", + "portIndex": 0, + "path": "/", + "gracePeriodSeconds": 5, + "intervalSeconds": 20, + "maxConsecutiveFailures": 3 + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/provider/docker.go b/provider/docker.go index 542f244ab..964fc8ea8 100644 --- a/provider/docker.go +++ b/provider/docker.go @@ -236,7 +236,7 @@ func (provider *Docker) getFrontendRule(container dockertypes.ContainerJSON) str if label, err := getLabel(container, "traefik.frontend.rule"); err == nil { return label } - return "Host:" + getEscapedName(container.Name) + "." + provider.Domain + return "Host:" + provider.getEscapedName(container.Name) + "." + provider.Domain } func (provider *Docker) getBackend(container dockertypes.ContainerJSON) string { @@ -349,3 +349,8 @@ func listContainers(dockerClient client.APIClient) ([]dockertypes.ContainerJSON, } return containersInspected, nil } + +// Escape beginning slash "/", convert all others to dash "-" +func (provider *Docker) getEscapedName(name string) string { + return strings.Replace(strings.TrimPrefix(name, "/"), "/", "-", -1) +} diff --git a/provider/marathon.go b/provider/marathon.go index efdaaf238..7612b3b26 100644 --- a/provider/marathon.go +++ b/provider/marathon.go @@ -3,6 +3,7 @@ package provider import ( "errors" "net/url" + "sort" "strconv" "strings" "text/template" @@ -341,7 +342,7 @@ func (provider *Marathon) getFrontendRule(application marathon.Application) stri if label, err := provider.getLabel(application, "traefik.frontend.rule"); err == nil { return label } - return "Host:" + getEscapedName(application.ID) + "." + provider.Domain + return "Host:" + provider.getEscapedName(application.ID) + "." + provider.Domain } func (provider *Marathon) getBackend(task marathon.Task, applications []marathon.Application) string { @@ -359,3 +360,10 @@ func (provider *Marathon) getFrontendBackend(application marathon.Application) s } return replace("/", "-", application.ID) } + +func (provider *Marathon) getEscapedName(name string) string { + splitedName := strings.Split(strings.TrimPrefix(name, "/"), "/") + sort.Sort(sort.Reverse(sort.StringSlice(splitedName))) + reverseName := strings.Join(splitedName, ".") + return reverseName +} diff --git a/provider/provider.go b/provider/provider.go index fafc39c7e..5f52988e0 100644 --- a/provider/provider.go +++ b/provider/provider.go @@ -85,11 +85,6 @@ func replace(s1 string, s2 string, s3 string) string { return strings.Replace(s3, s1, s2, -1) } -// Escape beginning slash "/", convert all others to dash "-" -func getEscapedName(name string) string { - return strings.Replace(strings.TrimPrefix(name, "/"), "/", "-", -1) -} - func normalize(name string) string { fargs := func(c rune) bool { return !unicode.IsLetter(c) && !unicode.IsNumber(c)