diff --git a/integration/basic_test.go b/integration/basic_test.go index 7684d5507..7b1cab07b 100644 --- a/integration/basic_test.go +++ b/integration/basic_test.go @@ -358,3 +358,31 @@ func (s *SimpleSuite) TestMetricsPrometheusDefaultEntrypoint(c *check.C) { err = try.GetRequest("http://127.0.0.1:8080/metrics", 1*time.Second, try.StatusCodeIs(http.StatusOK)) c.Assert(err, checker.IsNil) } + +func (s *SimpleSuite) TestMultipleProviderSameBackendName(c *check.C) { + + s.createComposeProject(c, "base") + s.composeProject.Start(c) + ipWhoami01 := s.composeProject.Container(c, "whoami1").NetworkSettings.IPAddress + ipWhoami02 := s.composeProject.Container(c, "whoami2").NetworkSettings.IPAddress + file := s.adaptFile(c, "fixtures/multiple_provider.toml", struct{ IP string }{ + IP: ipWhoami02, + }) + defer os.Remove(file) + cmd, output := s.traefikCmd(withConfigFile(file)) + defer output(c) + + err := cmd.Start() + c.Assert(err, checker.IsNil) + defer cmd.Process.Kill() + + err = try.GetRequest("http://127.0.0.1:8080/api/providers", 1*time.Second, try.BodyContains("PathPrefix")) + c.Assert(err, checker.IsNil) + + err = try.GetRequest("http://127.0.0.1:8000/whoami", 1*time.Second, try.BodyContains(ipWhoami01)) + c.Assert(err, checker.IsNil) + + err = try.GetRequest("http://127.0.0.1:8000/file", 1*time.Second, try.BodyContains(ipWhoami02)) + c.Assert(err, checker.IsNil) + +} diff --git a/integration/fixtures/multiple_provider.toml b/integration/fixtures/multiple_provider.toml new file mode 100644 index 000000000..8b197261d --- /dev/null +++ b/integration/fixtures/multiple_provider.toml @@ -0,0 +1,25 @@ +defaultEntryPoints = ["http"] + +debug=true + +[entryPoints] + [entryPoints.http] + address = ":8000" + +[api] + +[docker] +endpoint = "unix:///var/run/docker.sock" +watch = true +exposedbydefault = false + +[file] + [frontends] + [frontends.frontend-1] + backend = "backend-test" + [frontends.frontend-1.routes.test_1] + rule = "PathPrefix:/file" + [backends] + [backends.backend-test] + [backends.backend-test.servers.website] + url = "http://{{ .IP }}" diff --git a/integration/resources/compose/base.yml b/integration/resources/compose/base.yml index 8af2e9a99..f51d51750 100644 --- a/integration/resources/compose/base.yml +++ b/integration/resources/compose/base.yml @@ -3,3 +3,9 @@ whoami1: labels: - traefik.enable=true - traefik.frontend.rule=PathPrefix:/whoami + - traefik.backend="test" + +whoami2: + image: emilevauge/whoami + labels: + - traefik.enable=false \ No newline at end of file diff --git a/server/server.go b/server/server.go index e5857d167..5b8b2a297 100644 --- a/server/server.go +++ b/server/server.go @@ -913,7 +913,7 @@ func (s *Server) loadConfig(configurations types.Configurations, globalConfigura backendsHealthCheck := map[string]*healthcheck.BackendHealthCheck{} errorHandler := NewRecordingErrorHandler(middlewares.DefaultNetErrorRecorder{}) - for _, config := range configurations { + for providerName, config := range configurations { frontendNames := sortedFrontendNamesForConfig(config) frontend: for _, frontendName := range frontendNames { @@ -970,7 +970,7 @@ func (s *Server) loadConfig(configurations types.Configurations, globalConfigura } } } - if backends[entryPointName+frontend.Backend] == nil { + if backends[entryPointName+providerName+frontend.Backend] == nil { log.Debugf("Creating backend %s", frontend.Backend) roundTripper, err := s.getRoundTripper(entryPointName, globalConfiguration, frontend.PassTLSCert, entryPoint.TLS) @@ -1191,14 +1191,14 @@ func (s *Server) loadConfig(configurations types.Configurations, globalConfigura } else { n.UseHandler(lb) } - backends[entryPointName+frontend.Backend] = n + backends[entryPointName+providerName+frontend.Backend] = n } else { log.Debugf("Reusing backend %s", frontend.Backend) } if frontend.Priority > 0 { newServerRoute.route.Priority(frontend.Priority) } - s.wireFrontendBackend(newServerRoute, backends[entryPointName+frontend.Backend]) + s.wireFrontendBackend(newServerRoute, backends[entryPointName+providerName+frontend.Backend]) err := newServerRoute.route.GetError() if err != nil {