use list of IPs as a discovery

Signed-off-by: Victor Vieux <vieux@docker.com>
This commit is contained in:
Victor Vieux 2015-01-09 21:42:29 +00:00
parent 336c1e265e
commit 957fce6a6c
4 changed files with 75 additions and 23 deletions

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

@ -0,0 +1,33 @@
package list
import (
"strings"
"github.com/docker/swarm/discovery"
)
type ListDiscoveryService struct {
list []*discovery.Node
}
func init() {
discovery.Register("list", &ListDiscoveryService{})
}
func (s *ListDiscoveryService) Initialize(uris string, _ int) error {
for _, ip := range strings.Split(uris, ",") {
s.list = append(s.list, discovery.NewNode(ip))
}
return nil
}
func (s *ListDiscoveryService) Fetch() ([]*discovery.Node, error) {
return s.list, nil
}
func (s *ListDiscoveryService) Watch(callback discovery.WatchCallback) {
}
func (s *ListDiscoveryService) Register(addr string) error {
return discovery.ErrNotImplemented
}

View File

@ -0,0 +1,20 @@
package list
import (
"testing"
"github.com/stretchr/testify/assert"
)
func TestInitialise(t *testing.T) {
discovery := &ListDiscoveryService{}
discovery.Initialize("1.1.1.1:1111,2.2.2.2:2222", 0)
assert.Equal(t, len(discovery.list), 2)
assert.Equal(t, discovery.list[0].String(), "http://1.1.1.1:1111")
assert.Equal(t, discovery.list[1].String(), "http://2.2.2.2:2222")
}
func TestRegister(t *testing.T) {
discovery := &ListDiscoveryService{}
assert.Error(t, discovery.Register("0.0.0.0"))
}

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/list"
"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,