diff --git a/cmd.go b/cmd.go index e846bc464..d0c766e00 100644 --- a/cmd.go +++ b/cmd.go @@ -131,7 +131,7 @@ func init() { traefikCmd.PersistentFlags().BoolVar(&arguments.consul, "consul", false, "Enable Consul backend") traefikCmd.PersistentFlags().BoolVar(&arguments.Consul.Watch, "consul.watch", true, "Watch provider") traefikCmd.PersistentFlags().StringVar(&arguments.Consul.Filename, "consul.filename", "", "Override default configuration template. For advanced users :)") - traefikCmd.PersistentFlags().StringVar(&arguments.Consul.Endpoint, "consul.endpoint", "127.0.0.1:8500", "Consul server endpoint") + traefikCmd.PersistentFlags().StringVar(&arguments.Consul.Endpoint, "consul.endpoint", "127.0.0.1:8500", "Comma sepparated Consul server endpoints") traefikCmd.PersistentFlags().StringVar(&arguments.Consul.Prefix, "consul.prefix", "/traefik", "Prefix used for KV store") traefikCmd.PersistentFlags().BoolVar(&arguments.consulTLS, "consul.tls", false, "Enable Consul TLS support") traefikCmd.PersistentFlags().StringVar(&arguments.Consul.TLS.CA, "consul.tls.ca", "", "TLS CA") @@ -146,13 +146,13 @@ func init() { traefikCmd.PersistentFlags().BoolVar(&arguments.zookeeper, "zookeeper", false, "Enable Zookeeper backend") traefikCmd.PersistentFlags().BoolVar(&arguments.Zookeeper.Watch, "zookeeper.watch", true, "Watch provider") traefikCmd.PersistentFlags().StringVar(&arguments.Zookeeper.Filename, "zookeeper.filename", "", "Override default configuration template. For advanced users :)") - traefikCmd.PersistentFlags().StringVar(&arguments.Zookeeper.Endpoint, "zookeeper.endpoint", "127.0.0.1:2181", "Zookeeper server endpoint") + traefikCmd.PersistentFlags().StringVar(&arguments.Zookeeper.Endpoint, "zookeeper.endpoint", "127.0.0.1:2181", "Comma sepparated Zookeeper server endpoints") traefikCmd.PersistentFlags().StringVar(&arguments.Zookeeper.Prefix, "zookeeper.prefix", "/traefik", "Prefix used for KV store") traefikCmd.PersistentFlags().BoolVar(&arguments.etcd, "etcd", false, "Enable Etcd backend") traefikCmd.PersistentFlags().BoolVar(&arguments.Etcd.Watch, "etcd.watch", true, "Watch provider") traefikCmd.PersistentFlags().StringVar(&arguments.Etcd.Filename, "etcd.filename", "", "Override default configuration template. For advanced users :)") - traefikCmd.PersistentFlags().StringVar(&arguments.Etcd.Endpoint, "etcd.endpoint", "127.0.0.1:4001", "Etcd server endpoint") + traefikCmd.PersistentFlags().StringVar(&arguments.Etcd.Endpoint, "etcd.endpoint", "127.0.0.1:4001", "Comma sepparated Etcd server endpoints") traefikCmd.PersistentFlags().StringVar(&arguments.Etcd.Prefix, "etcd.prefix", "/traefik", "Prefix used for KV store") traefikCmd.PersistentFlags().BoolVar(&arguments.etcdTLS, "etcd.tls", false, "Enable Etcd TLS support") traefikCmd.PersistentFlags().StringVar(&arguments.Etcd.TLS.CA, "etcd.tls.ca", "", "TLS CA") diff --git a/docs/index.md b/docs/index.md index 0ca267c72..5b6500757 100644 --- a/docs/index.md +++ b/docs/index.md @@ -106,7 +106,7 @@ Flags: --boltdb.watch Watch provider (default true) -c, --configFile string Configuration file to use (TOML, JSON, YAML, HCL). --consul Enable Consul backend - --consul.endpoint string Consul server endpoint (default "127.0.0.1:8500") + --consul.endpoint string Comma sepparated Consul server endpoints (default "127.0.0.1:8500") --consul.filename string Override default configuration template. For advanced users :) --consul.prefix string Prefix used for KV store (default "/traefik") --consul.tls Enable Consul TLS support @@ -131,7 +131,7 @@ Flags: --docker.watch Watch provider (default true) --entryPoints value Entrypoints definition using format: --entryPoints='Name:http Address::8000 Redirect.EntryPoint:https' --entryPoints='Name:https Address::4442 TLS:tests/traefik.crt,tests/traefik.key' --etcd Enable Etcd backend - --etcd.endpoint string Etcd server endpoint (default "127.0.0.1:4001") + --etcd.endpoint string Comma sepparated Etcd server endpoints (default "127.0.0.1:4001") --etcd.filename string Override default configuration template. For advanced users :) --etcd.prefix string Prefix used for KV store (default "/traefik") --etcd.tls Enable Etcd TLS support @@ -160,7 +160,7 @@ Flags: --web.keyFile string SSL certificate --web.readOnly Enable read only API --zookeeper Enable Zookeeper backend - --zookeeper.endpoint string Zookeeper server endpoint (default "127.0.0.1:2181") + --zookeeper.endpoint string Comma sepparated Zookeeper server endpoints (default "127.0.0.1:2181") --zookeeper.filename string Override default configuration template. For advanced users :) --zookeeper.prefix string Prefix used for KV store (default "/traefik") --zookeeper.watch Watch provider (default true) diff --git a/integration/etcd_test.go b/integration/etcd_test.go new file mode 100644 index 000000000..377bbc437 --- /dev/null +++ b/integration/etcd_test.go @@ -0,0 +1,27 @@ +package main + +import ( + "net/http" + "os/exec" + "time" + + "fmt" + checker "github.com/vdemeester/shakers" + check "gopkg.in/check.v1" +) + +func (s *EtcdSuite) TestSimpleConfiguration(c *check.C) { + cmd := exec.Command(traefikBinary, "--configFile=fixtures/etcd/simple.toml") + err := cmd.Start() + c.Assert(err, checker.IsNil) + defer cmd.Process.Kill() + + time.Sleep(1000 * time.Millisecond) + // TODO validate : run on 80 + resp, err := http.Get("http://127.0.0.1:8000/") + + // Expected no response as we did not configure anything + c.Assert(resp, checker.IsNil) + c.Assert(err, checker.NotNil) + c.Assert(err.Error(), checker.Contains, fmt.Sprintf("getsockopt: connection refused")) +} diff --git a/integration/fixtures/etcd/simple.toml b/integration/fixtures/etcd/simple.toml new file mode 100644 index 000000000..26d15d83d --- /dev/null +++ b/integration/fixtures/etcd/simple.toml @@ -0,0 +1,10 @@ +defaultEntryPoints = ["http"] + +[entryPoints] + [entryPoints.http] + address = ":8000" + +logLevel = "DEBUG" + +[etcd] + endpoint = "127.0.0.1:4003,127.0.0.1:4002,127.0.0.1:4001" diff --git a/integration/integration_test.go b/integration/integration_test.go index b5ee8fbf6..f0c7580e1 100644 --- a/integration/integration_test.go +++ b/integration/integration_test.go @@ -29,6 +29,7 @@ func init() { check.Suite(&DockerSuite{}) check.Suite(&ConsulSuite{}) check.Suite(&ConsulCatalogSuite{}) + check.Suite(&EtcdSuite{}) check.Suite(&MarathonSuite{}) } @@ -50,6 +51,13 @@ func (s *ConsulSuite) SetUpSuite(c *check.C) { s.createComposeProject(c, "consul") } +// Etcd test suites (using libcompose) +type EtcdSuite struct{ BaseSuite } + +func (s *EtcdSuite) SetUpSuite(c *check.C) { + s.createComposeProject(c, "etcd") +} + // Marathon test suites (using libcompose) type MarathonSuite struct{ BaseSuite } diff --git a/integration/resources/compose/etcd.yml b/integration/resources/compose/etcd.yml new file mode 100644 index 000000000..622dca78b --- /dev/null +++ b/integration/resources/compose/etcd.yml @@ -0,0 +1,30 @@ +etcd1: + image: quay.io/coreos/etcd:v2.2.0 + net: "host" + command: > + --name etcd1 + --listen-peer-urls http://localhost:7001 + --listen-client-urls http://localhost:4001 + --initial-advertise-peer-urls http://localhost:7001 + --advertise-client-urls http://localhost:4001 + --initial-cluster etcd1=http://localhost:7001,etcd2=http://localhost:7002,etcd3=http://localhost:7003 +etcd2: + image: quay.io/coreos/etcd:v2.2.0 + net: "host" + command: > + --name etcd2 + --listen-peer-urls http://localhost:7002 + --listen-client-urls http://localhost:4002 + --initial-advertise-peer-urls http://localhost:7002 + --advertise-client-urls http://localhost:4002 + --initial-cluster etcd1=http://localhost:7001,etcd2=http://localhost:7002,etcd3=http://localhost:7003 +etcd3: + image: quay.io/coreos/etcd:v2.2.0 + net: "host" + command: > + --name etcd3 + --listen-peer-urls http://localhost:7003 + --listen-client-urls http://localhost:4003 + --initial-advertise-peer-urls http://localhost:7003 + --advertise-client-urls http://localhost:4003 + --initial-cluster etcd1=http://localhost:7001,etcd2=http://localhost:7002,etcd3=http://localhost:7003 diff --git a/provider/kv.go b/provider/kv.go index 8699a5f20..a509ec0a6 100644 --- a/provider/kv.go +++ b/provider/kv.go @@ -69,7 +69,7 @@ func (provider *Kv) provide(configurationChan chan<- types.ConfigMessage) error kv, err := libkv.NewStore( provider.storeType, - []string{provider.Endpoint}, + strings.Split(provider.Endpoint, ","), storeConfig, ) if err != nil {