diff --git a/discovery/README.md b/discovery/README.md index 765738cc8e..b89a3a8def 100644 --- a/discovery/README.md +++ b/discovery/README.md @@ -128,6 +128,22 @@ $ swarm list --discovery zk://,/ ``` +###### Using a static list of ips + +```bash +# start the manager on any machine or your laptop +$ swarm manage --discovery , -H= +#or +$ swarm manage --discovery nodes://, -H= + +# use the regular docker cli +$ docker -H info +$ docker -H run ... +$ docker -H ps +$ docker -H logs ... +... +``` + ## Contributing Contributing a new discovery backend is easy, diff --git a/discovery/discovery.go b/discovery/discovery.go index 779acb01ce..2e53be4c85 100644 --- a/discovery/discovery.go +++ b/discovery/discovery.go @@ -55,6 +55,11 @@ func New(rawurl string, heartbeat int) (DiscoveryService, error) { return nil, err } + // nodes:port,node2:port => nodes://node1:port,node2:port + if url.Scheme == "" { + url.Scheme = "nodes" + } + if discovery, exists := discoveries[url.Scheme]; exists { log.Debugf("Initializing %q discovery service with %q", url.Scheme, url.Host+url.Path) err := discovery.Initialize(url.Host+url.Path, heartbeat) diff --git a/discovery/nodes/nodes.go b/discovery/nodes/nodes.go new file mode 100644 index 0000000000..9428a1aada --- /dev/null +++ b/discovery/nodes/nodes.go @@ -0,0 +1,33 @@ +package nodes + +import ( + "strings" + + "github.com/docker/swarm/discovery" +) + +type NodesDiscoveryService struct { + nodes []*discovery.Node +} + +func init() { + discovery.Register("nodes", &NodesDiscoveryService{}) +} + +func (s *NodesDiscoveryService) Initialize(uris string, _ int) error { + for _, ip := range strings.Split(uris, ",") { + s.nodes = append(s.nodes, discovery.NewNode(ip)) + } + + return nil +} +func (s *NodesDiscoveryService) Fetch() ([]*discovery.Node, error) { + return s.nodes, nil +} + +func (s *NodesDiscoveryService) Watch(callback discovery.WatchCallback) { +} + +func (s *NodesDiscoveryService) Register(addr string) error { + return discovery.ErrNotImplemented +} diff --git a/discovery/nodes/nodes_test.go b/discovery/nodes/nodes_test.go new file mode 100644 index 0000000000..b4e4569700 --- /dev/null +++ b/discovery/nodes/nodes_test.go @@ -0,0 +1,20 @@ +package nodes + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestInitialise(t *testing.T) { + discovery := &NodesDiscoveryService{} + discovery.Initialize("1.1.1.1:1111,2.2.2.2:2222", 0) + assert.Equal(t, len(discovery.nodes), 2) + assert.Equal(t, discovery.nodes[0].String(), "1.1.1.1:1111") + assert.Equal(t, discovery.nodes[1].String(), "2.2.2.2:2222") +} + +func TestRegister(t *testing.T) { + discovery := &NodesDiscoveryService{} + assert.Error(t, discovery.Register("0.0.0.0")) +} diff --git a/flags.go b/flags.go index c97d19bdec..5f4ac86be0 100644 --- a/flags.go +++ b/flags.go @@ -6,7 +6,7 @@ var ( flDiscovery = cli.StringFlag{ Name: "discovery", Value: "", - Usage: "DiscoveryService to use [token://, etcd://,/, file://path/to/file, consul:///, zk://,/]", + Usage: "DiscoveryService to use [token://,\n\t\t\t\t etcd://,/,\n\t\t\t\t file://path/to/file,\n\t\t\t\t consul:///,\n\t\t\t\t zk://,/,\n\t\t\t\t ,]", EnvVar: "SWARM_DISCOVERY", } flAddr = cli.StringFlag{ diff --git a/main.go b/main.go index 1965d24080..5359d6e88e 100644 --- a/main.go +++ b/main.go @@ -11,6 +11,7 @@ import ( _ "github.com/docker/swarm/discovery/consul" _ "github.com/docker/swarm/discovery/etcd" _ "github.com/docker/swarm/discovery/file" + _ "github.com/docker/swarm/discovery/nodes" "github.com/docker/swarm/discovery/token" _ "github.com/docker/swarm/discovery/zookeeper" ) diff --git a/manage.go b/manage.go index 143eb63fdf..63395cebe4 100644 --- a/manage.go +++ b/manage.go @@ -74,29 +74,9 @@ func manage(c *cli.Context) { cluster := cluster.NewCluster(tlsConfig) cluster.Events(&logHandler{}) - go func() { - if c.String("discovery") != "" { - d, err := discovery.New(c.String("discovery"), c.Int("heartbeat")) - if err != nil { - log.Fatal(err) - } - - nodes, err := d.Fetch() - if err != nil { - log.Fatal(err) - - } - cluster.UpdateNodes(nodes) - - go d.Watch(cluster.UpdateNodes) - } else { - var nodes []*discovery.Node - for _, arg := range c.Args() { - nodes = append(nodes, discovery.NewNode(arg)) - } - cluster.UpdateNodes(nodes) - } - }() + if !c.IsSet("discovery") { + log.Fatal("--discovery required to manage a cluster") + } s, err := strategy.New(c.String("strategy")) if err != nil { @@ -112,6 +92,24 @@ func manage(c *cli.Context) { if err != nil { log.Fatal(err) } + + // get the list of nodes from the discovery service + go func() { + d, err := discovery.New(c.String("discovery"), c.Int("heartbeat")) + if err != nil { + log.Fatal(err) + } + + nodes, err := d.Fetch() + if err != nil { + log.Fatal(err) + + } + cluster.UpdateNodes(nodes) + + go d.Watch(cluster.UpdateNodes) + }() + sched := scheduler.NewScheduler( cluster, s,