2018-04-16 16:14:04 +00:00
|
|
|
package integration
|
|
|
|
|
|
|
|
import (
|
|
|
|
"encoding/json"
|
|
|
|
"net/http"
|
|
|
|
"os"
|
2019-11-14 15:40:05 +00:00
|
|
|
"strings"
|
2018-04-16 16:14:04 +00:00
|
|
|
"time"
|
|
|
|
|
2019-08-03 01:58:23 +00:00
|
|
|
"github.com/containous/traefik/v2/integration/try"
|
|
|
|
"github.com/containous/traefik/v2/pkg/api"
|
|
|
|
"github.com/containous/traefik/v2/pkg/testhelpers"
|
2018-04-16 16:14:04 +00:00
|
|
|
"github.com/go-check/check"
|
|
|
|
checker "github.com/vdemeester/shakers"
|
|
|
|
)
|
|
|
|
|
|
|
|
const (
|
|
|
|
composeProject = "minimal"
|
|
|
|
)
|
|
|
|
|
|
|
|
// Docker test suites
|
|
|
|
type DockerComposeSuite struct {
|
|
|
|
BaseSuite
|
|
|
|
}
|
|
|
|
|
|
|
|
func (s *DockerComposeSuite) SetUpSuite(c *check.C) {
|
|
|
|
s.createComposeProject(c, composeProject)
|
|
|
|
s.composeProject.Start(c)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (s *DockerComposeSuite) TearDownSuite(c *check.C) {
|
|
|
|
// shutdown and delete compose project
|
|
|
|
if s.composeProject != nil {
|
|
|
|
s.composeProject.Stop(c)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func (s *DockerComposeSuite) TestComposeScale(c *check.C) {
|
|
|
|
var serviceCount = 2
|
|
|
|
var composeService = "whoami1"
|
|
|
|
|
|
|
|
s.composeProject.Scale(c, composeService, serviceCount)
|
|
|
|
|
2019-01-21 18:06:02 +00:00
|
|
|
tempObjects := struct {
|
|
|
|
DockerHost string
|
|
|
|
DefaultRule string
|
|
|
|
}{
|
|
|
|
DockerHost: s.getDockerHost(),
|
2019-01-30 15:24:07 +00:00
|
|
|
DefaultRule: "Host(`{{ normalize .Name }}.docker.localhost`)",
|
2019-01-21 18:06:02 +00:00
|
|
|
}
|
|
|
|
file := s.adaptFile(c, "fixtures/docker/minimal.toml", tempObjects)
|
2018-04-16 16:14:04 +00:00
|
|
|
defer os.Remove(file)
|
|
|
|
|
|
|
|
cmd, display := s.traefikCmd(withConfigFile(file))
|
|
|
|
defer display(c)
|
|
|
|
err := cmd.Start()
|
|
|
|
c.Assert(err, checker.IsNil)
|
|
|
|
defer cmd.Process.Kill()
|
|
|
|
|
|
|
|
req := testhelpers.MustNewRequest(http.MethodGet, "http://127.0.0.1:8000/whoami", nil)
|
|
|
|
req.Host = "my.super.host"
|
|
|
|
|
|
|
|
_, err = try.ResponseUntilStatusCode(req, 1500*time.Millisecond, http.StatusOK)
|
|
|
|
c.Assert(err, checker.IsNil)
|
|
|
|
|
2019-05-16 08:58:06 +00:00
|
|
|
resp, err := http.Get("http://127.0.0.1:8080/api/rawdata")
|
2018-04-16 16:14:04 +00:00
|
|
|
c.Assert(err, checker.IsNil)
|
|
|
|
defer resp.Body.Close()
|
2019-01-18 14:18:04 +00:00
|
|
|
|
2019-05-16 08:58:06 +00:00
|
|
|
var rtconf api.RunTimeRepresentation
|
|
|
|
err = json.NewDecoder(resp.Body).Decode(&rtconf)
|
2018-04-16 16:14:04 +00:00
|
|
|
c.Assert(err, checker.IsNil)
|
|
|
|
|
2019-11-14 15:40:05 +00:00
|
|
|
// check that we have only three routers (the one from this test + 2 unrelated internal ones)
|
|
|
|
c.Assert(rtconf.Routers, checker.HasLen, 3)
|
2019-05-16 08:58:06 +00:00
|
|
|
|
2019-11-14 15:40:05 +00:00
|
|
|
// check that we have only one service (not counting the internal ones) with n servers
|
2019-05-16 08:58:06 +00:00
|
|
|
services := rtconf.Services
|
2019-11-14 15:40:05 +00:00
|
|
|
c.Assert(services, checker.HasLen, 3)
|
|
|
|
for name, service := range services {
|
|
|
|
if strings.HasSuffix(name, "@internal") {
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
c.Assert(name, checker.Equals, composeService+"-integrationtest"+composeProject+"@docker")
|
|
|
|
c.Assert(service.LoadBalancer.Servers, checker.HasLen, serviceCount)
|
2019-05-16 08:58:06 +00:00
|
|
|
// We could break here, but we don't just to keep us honest.
|
|
|
|
}
|
2018-04-16 16:14:04 +00:00
|
|
|
}
|