diff --git a/provider/docker.go b/provider/docker.go index cd5ddc847..faff0b6d2 100644 --- a/provider/docker.go +++ b/provider/docker.go @@ -364,10 +364,6 @@ func (provider *Docker) containerFilter(container dockerData) bool { log.Debugf("Filtering container without port and no traefik.port label %s", container.Name) return false } - if len(container.NetworkSettings.Ports) > 1 && err != nil { - log.Debugf("Filtering container with more than 1 port and no traefik.port label %s", container.Name) - return false - } if !isContainerEnabled(container, provider.ExposedByDefault) { log.Debugf("Filtering disabled container %s", container.Name) diff --git a/provider/docker_test.go b/provider/docker_test.go index 3d106bd71..1873c5d56 100644 --- a/provider/docker_test.go +++ b/provider/docker_test.go @@ -390,6 +390,27 @@ func TestDockerGetPort(t *testing.T) { }, expected: "8080", }, + { + container: docker.ContainerJSON{ + ContainerJSONBase: &docker.ContainerJSONBase{ + Name: "test-multi-ports", + }, + Config: &container.Config{ + Labels: map[string]string{ + "traefik.port": "8080", + }, + }, + NetworkSettings: &docker.NetworkSettings{ + NetworkSettingsBase: docker.NetworkSettingsBase{ + Ports: nat.PortMap{ + "8080/tcp": {}, + "80/tcp": {}, + }, + }, + }, + }, + expected: "8080", + }, } for _, e := range containers { @@ -735,7 +756,7 @@ func TestDockerTraefikFilter(t *testing.T) { { container: docker.ContainerJSON{ ContainerJSONBase: &docker.ContainerJSONBase{ - Name: "container", + Name: "container-multi-ports", }, Config: &container.Config{}, NetworkSettings: &docker.NetworkSettings{ @@ -748,7 +769,7 @@ func TestDockerTraefikFilter(t *testing.T) { }, }, exposedByDefault: true, - expected: false, + expected: true, }, { container: docker.ContainerJSON{ diff --git a/provider/marathon.go b/provider/marathon.go index f2ec40918..f6cc85563 100644 --- a/provider/marathon.go +++ b/provider/marathon.go @@ -219,10 +219,7 @@ func (provider *Marathon) taskFilter(task marathon.Task, applications *marathon. log.Debugf("Filtering marathon task %s specifying both traefik.portIndex and traefik.port labels", task.AppID) return false } - if portIndexLabel == "" && portValueLabel == "" && len(application.Ports) > 1 { - log.Debugf("Filtering marathon task %s with more than 1 port and no traefik.portIndex or traefik.port label", task.AppID) - return false - } + if portIndexLabel != "" { index, err := strconv.Atoi((*application.Labels)["traefik.portIndex"]) if err != nil || index < 0 || index > len(application.Ports)-1 { diff --git a/provider/marathon_test.go b/provider/marathon_test.go index b9e712ea1..6ce7c4009 100644 --- a/provider/marathon_test.go +++ b/provider/marathon_test.go @@ -371,30 +371,30 @@ func TestMarathonTaskFilter(t *testing.T) { }, { task: marathon.Task{ - AppID: "foo", - Ports: []int{80}, + AppID: "multiple-ports", + Ports: []int{80, 443}, }, applications: &marathon.Applications{ Apps: []marathon.Application{ { - ID: "foo", + ID: "multiple-ports", Ports: []int{80, 443}, Labels: &map[string]string{}, }, }, }, - expected: false, + expected: true, exposedByDefault: true, }, { task: marathon.Task{ - AppID: "foo", + AppID: "disable", Ports: []int{80}, }, applications: &marathon.Applications{ Apps: []marathon.Application{ { - ID: "foo", + ID: "disable", Ports: []int{80}, Labels: &map[string]string{ "traefik.enable": "false", @@ -523,7 +523,7 @@ func TestMarathonTaskFilter(t *testing.T) { }, { task: marathon.Task{ - AppID: "foo", + AppID: "healthcheck-false", Ports: []int{80}, HealthCheckResults: []*marathon.HealthCheckResult{ { @@ -534,7 +534,7 @@ func TestMarathonTaskFilter(t *testing.T) { applications: &marathon.Applications{ Apps: []marathon.Application{ { - ID: "foo", + ID: "healthcheck-false", Ports: []int{80}, Labels: &map[string]string{}, HealthChecks: &[]marathon.HealthCheck{ @@ -576,13 +576,13 @@ func TestMarathonTaskFilter(t *testing.T) { }, { task: marathon.Task{ - AppID: "foo", + AppID: "single-port", Ports: []int{80}, }, applications: &marathon.Applications{ Apps: []marathon.Application{ { - ID: "foo", + ID: "single-port", Ports: []int{80}, Labels: &map[string]string{}, }, @@ -593,7 +593,7 @@ func TestMarathonTaskFilter(t *testing.T) { }, { task: marathon.Task{ - AppID: "foo", + AppID: "healthcheck-alive", Ports: []int{80}, HealthCheckResults: []*marathon.HealthCheckResult{ { @@ -604,7 +604,7 @@ func TestMarathonTaskFilter(t *testing.T) { applications: &marathon.Applications{ Apps: []marathon.Application{ { - ID: "foo", + ID: "healthcheck-alive", Ports: []int{80}, Labels: &map[string]string{}, HealthChecks: &[]marathon.HealthCheck{ @@ -677,7 +677,7 @@ func TestMarathonTaskFilter(t *testing.T) { for _, c := range cases { actual := provider.taskFilter(c.task, c.applications, c.exposedByDefault) if actual != c.expected { - t.Fatalf("expected %v, got %v", c.expected, actual) + t.Fatalf("App %s: expected %v, got %v", c.task.AppID, c.expected, actual) } } } @@ -927,12 +927,12 @@ func TestMarathonGetPort(t *testing.T) { { applications: []marathon.Application{ { - ID: "test1", + ID: "multiple-ports-take-first", Labels: &map[string]string{}, }, }, task: marathon.Task{ - AppID: "test1", + AppID: "multiple-ports-take-first", Ports: []int{80, 443}, }, expected: "80", diff --git a/provider/mesos.go b/provider/mesos.go index 4064c1671..a99318249 100644 --- a/provider/mesos.go +++ b/provider/mesos.go @@ -212,10 +212,6 @@ func mesosTaskFilter(task state.Task, exposedByDefaultFlag bool) bool { log.Debugf("Filtering mesos task %s specifying both traefik.portIndex and traefik.port labels", task.Name) return false } - if portIndexLabel == "" && portValueLabel == "" && len(task.DiscoveryInfo.Ports.DiscoveryPorts) > 1 { - log.Debugf("Filtering mesos task %s with more than 1 port and no traefik.portIndex or traefik.port label", task.Name) - return false - } if portIndexLabel != "" { index, err := strconv.Atoi(labels(task, "traefik.portIndex")) if err != nil || index < 0 || index > len(task.DiscoveryInfo.Ports.DiscoveryPorts)-1 { diff --git a/provider/mesos_test.go b/provider/mesos_test.go index 5968db8e9..5434915b3 100644 --- a/provider/mesos_test.go +++ b/provider/mesos_test.go @@ -95,7 +95,7 @@ func TestMesosTaskFilter(t *testing.T) { setLabels("traefik.enable", "true"), discovery(setDiscoveryPorts("TCP", 80, "WEB HTTP", "TCP", 443, "WEB HTTPS")), ), - expected: false, // more than 1 discovery port but no traefik.port* label + expected: true, // Default to first index exposedByDefault: true, }, {