Merge pull request #232 from vieux/ip_discovery

Proposal: add a `list` discovery service to give a list of ips
This commit is contained in:
Victor Vieux 2015-01-13 13:53:18 -08:00
commit 59ea9e5681
7 changed files with 97 additions and 24 deletions

View File

@ -128,6 +128,22 @@ $ swarm list --discovery zk://<zookeeper_addr1>,<zookeeper_addr2>/<path>
<node_ip:2375>
```
###### Using a static list of ips
```bash
# start the manager on any machine or your laptop
$ swarm manage --discovery <node_ip1:2375>,<node_ip2:2375> -H=<swarm_ip:swarm_port>
#or
$ swarm manage --discovery nodes://<node_ip1:2375>,<node_ip2:2375> -H=<swarm_ip:swarm_port>
# use the regular docker cli
$ docker -H <swarm_ip:swarm_port> info
$ docker -H <swarm_ip:swarm_port> run ...
$ docker -H <swarm_ip:swarm_port> ps
$ docker -H <swarm_ip:swarm_port> logs ...
...
```
## Contributing
Contributing a new discovery backend is easy,

View File

@ -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)

33
discovery/nodes/nodes.go Normal file
View File

@ -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
}

View File

@ -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"))
}

View File

@ -6,7 +6,7 @@ var (
flDiscovery = cli.StringFlag{
Name: "discovery",
Value: "",
Usage: "DiscoveryService to use [token://<token>, etcd://<ip1>,<ip2>/<path>, file://path/to/file, consul://<addr>/<path>, zk://<ip1>,<ip2>/<path>]",
Usage: "DiscoveryService to use [token://<token>,\n\t\t\t\t etcd://<ip1>,<ip2>/<path>,\n\t\t\t\t file://path/to/file,\n\t\t\t\t consul://<addr>/<path>,\n\t\t\t\t zk://<ip1>,<ip2>/<path>,\n\t\t\t\t <ip1>,<ip2>]",
EnvVar: "SWARM_DISCOVERY",
}
flAddr = cli.StringFlag{

View File

@ -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"
)

View File

@ -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,