diff --git a/cluster/cluster.go b/cluster/cluster.go index 79388819dd..daa06ed838 100644 --- a/cluster/cluster.go +++ b/cluster/cluster.go @@ -102,7 +102,7 @@ func (c *Cluster) UpdateNodes(nodes []*discovery.Node) { for _, addr := range nodes { go func(node *discovery.Node) { if c.Node(node.String()) == nil { - n := NewNode(node.Host, node.Port, c.overcommitRatio) + n := NewNode(node.String(), c.overcommitRatio) if err := n.Connect(c.tlsConfig); err != nil { log.Error(err) return diff --git a/cluster/cluster_test.go b/cluster/cluster_test.go index 19513da448..0bbbb59ced 100644 --- a/cluster/cluster_test.go +++ b/cluster/cluster_test.go @@ -11,8 +11,8 @@ import ( "github.com/stretchr/testify/mock" ) -func createNode(t *testing.T, ID string, Port string, containers ...dockerclient.Container) *Node { - node := NewNode(ID, Port, 0) +func createNode(t *testing.T, ID string, containers ...dockerclient.Container) *Node { + node := NewNode(ID, 0) node.Name = ID assert.False(t, node.IsConnected()) @@ -46,15 +46,15 @@ func TestAddNode(t *testing.T) { assert.Nil(t, c.Node("test")) assert.Nil(t, c.Node("test2")) - assert.NoError(t, c.AddNode(createNode(t, "test", "2375"))) + assert.NoError(t, c.AddNode(createNode(t, "test"))) assert.Equal(t, len(c.Nodes()), 1) assert.NotNil(t, c.Node("test")) - assert.Error(t, c.AddNode(createNode(t, "test", "2375"))) + assert.Error(t, c.AddNode(createNode(t, "test"))) assert.Equal(t, len(c.Nodes()), 1) assert.NotNil(t, c.Node("test")) - assert.NoError(t, c.AddNode(createNode(t, "test2", "2375"))) + assert.NoError(t, c.AddNode(createNode(t, "test2"))) assert.Equal(t, len(c.Nodes()), 2) assert.NotNil(t, c.Node("test2")) } @@ -65,7 +65,7 @@ func TestContainerLookup(t *testing.T) { Id: "container-id", Names: []string{"/container-name1", "/container-name2"}, } - node := createNode(t, "test-node", "2375", container) + node := createNode(t, "test-node", container) assert.NoError(t, c.AddNode(node)) // Invalid lookup @@ -85,7 +85,7 @@ func TestContainerLookup(t *testing.T) { func TestDeployContainer(t *testing.T) { // Create a test node. - node := createNode(t, "test", "2375") + node := createNode(t, "test") // Create a test cluster. c := newCluster(t) diff --git a/cluster/node.go b/cluster/node.go index 0703cf95c5..4eb3e8fdbf 100644 --- a/cluster/node.go +++ b/cluster/node.go @@ -21,10 +21,9 @@ const ( requestTimeout = 10 * time.Second ) -func NewNode(host, port string, overcommitRatio float64) *Node { +func NewNode(addr string, overcommitRatio float64) *Node { e := &Node{ - Addr: host, - Port: port, + Addr: addr, Labels: make(map[string]string), ch: make(chan bool), containers: make(map[string]*Container), @@ -40,7 +39,6 @@ type Node struct { ID string IP string Addr string - Port string Name string Cpus int64 Memory int64 @@ -58,13 +56,18 @@ type Node struct { // Connect will initialize a connection to the Docker daemon running on the // host, gather machine specs (memory, cpu, ...) and monitor state changes. func (n *Node) Connect(config *tls.Config) error { - addr, err := net.ResolveIPAddr("ip4", n.Addr) + host, port, err := net.SplitHostPort(n.Addr) + if err != nil { + return err + } + + addr, err := net.ResolveIPAddr("ip4", host) if err != nil { return err } n.IP = addr.IP.String() - c, err := dockerclient.NewDockerClientTimeout(n.IP+":"+n.Port, config, time.Duration(requestTimeout)) + c, err := dockerclient.NewDockerClientTimeout(n.IP+":"+port, config, time.Duration(requestTimeout)) if err != nil { return err } diff --git a/cluster/node_test.go b/cluster/node_test.go index 4ae358a196..5a38bd1f3b 100644 --- a/cluster/node_test.go +++ b/cluster/node_test.go @@ -26,7 +26,7 @@ var ( ) func TestNodeConnectionFailure(t *testing.T) { - node := NewNode("test", "2375", 0) + node := NewNode("test", 0) assert.False(t, node.IsConnected()) // Always fail. @@ -41,7 +41,7 @@ func TestNodeConnectionFailure(t *testing.T) { } func TestOutdatedNode(t *testing.T) { - node := NewNode("test", "2375", 0) + node := NewNode("test", 0) client := mockclient.NewMockClient() client.On("Info").Return(&dockerclient.Info{}, nil) @@ -52,7 +52,7 @@ func TestOutdatedNode(t *testing.T) { } func TestNodeCpusMemory(t *testing.T) { - node := NewNode("test", "2375", 0) + node := NewNode("test", 0) assert.False(t, node.IsConnected()) client := mockclient.NewMockClient() @@ -72,7 +72,7 @@ func TestNodeCpusMemory(t *testing.T) { } func TestNodeSpecs(t *testing.T) { - node := NewNode("test", "2375", 0) + node := NewNode("test", 0) assert.False(t, node.IsConnected()) client := mockclient.NewMockClient() @@ -97,7 +97,7 @@ func TestNodeSpecs(t *testing.T) { } func TestNodeState(t *testing.T) { - node := NewNode("test", "2375", 0) + node := NewNode("test", 0) assert.False(t, node.IsConnected()) client := mockclient.NewMockClient() @@ -143,7 +143,7 @@ func TestCreateContainer(t *testing.T) { Cmd: []string{"date"}, Tty: false, } - node = NewNode("test", "2375", 0) + node = NewNode("test", 0) client = mockclient.NewMockClient() ) @@ -194,22 +194,21 @@ func TestCreateContainer(t *testing.T) { } func TestUsableMemory(t *testing.T) { - node := NewNode("test", "2375", 0.05) + node := NewNode("test", 0.05) node.Memory = 1024 assert.Equal(t, node.UsableMemory(), 1024+1024*5/100) - node = NewNode("test", "2375", 0) + node = NewNode("test", 0) node.Memory = 1024 assert.Equal(t, node.UsableMemory(), 1024) } func TestUsableCpus(t *testing.T) { - node := NewNode("test", "2375", 0.05) - + node := NewNode("test", 0.05) node.Cpus = 2 assert.Equal(t, node.UsableCpus(), 2+2*5/100) - node = NewNode("test", "2375", 0) + node = NewNode("test", 0) node.Cpus = 2 assert.Equal(t, node.UsableCpus(), 2) } diff --git a/discovery/discovery_test.go b/discovery/discovery_test.go index c75b454150..ace6bc1b2c 100644 --- a/discovery/discovery_test.go +++ b/discovery/discovery_test.go @@ -6,22 +6,32 @@ import ( "github.com/stretchr/testify/assert" ) +func TestNewNode(t *testing.T) { + node, err := NewNode("127.0.0.1:2375") + assert.Equal(t, node.Host, "127.0.0.1") + assert.Equal(t, node.Port, "2375") + assert.NoError(t, err) + + _, err = NewNode("127.0.0.1") + assert.Error(t, err) +} + func TestParse(t *testing.T) { - scheme, uri := parse("127.0.0.1") + scheme, uri := parse("127.0.0.1:2375") assert.Equal(t, scheme, "nodes") - assert.Equal(t, uri, "127.0.0.1") + assert.Equal(t, uri, "127.0.0.1:2375") - scheme, uri = parse("localhost") + scheme, uri = parse("localhost:2375") assert.Equal(t, scheme, "nodes") - assert.Equal(t, uri, "localhost") + assert.Equal(t, uri, "localhost:2375") - scheme, uri = parse("scheme://127.0.0.1") + scheme, uri = parse("scheme://127.0.0.1:2375") assert.Equal(t, scheme, "scheme") - assert.Equal(t, uri, "127.0.0.1") + assert.Equal(t, uri, "127.0.0.1:2375") - scheme, uri = parse("scheme://localhost") + scheme, uri = parse("scheme://localhost:2375") assert.Equal(t, scheme, "scheme") - assert.Equal(t, uri, "localhost") + assert.Equal(t, uri, "localhost:2375") scheme, uri = parse("") assert.Equal(t, scheme, "nodes") diff --git a/discovery/zookeeper/zookeeper.go b/discovery/zookeeper/zookeeper.go index f860d4fa5b..e6f178b430 100644 --- a/discovery/zookeeper/zookeeper.go +++ b/discovery/zookeeper/zookeeper.go @@ -67,7 +67,7 @@ func (s *ZkDiscoveryService) Fetch() ([]*discovery.Node, error) { func (s *ZkDiscoveryService) createNodes(addrs []string) ([]*discovery.Node, error) { nodes := make([]*discovery.Node, 0) if addrs == nil { - return nil, fmt.Errorf("no nodes to discover") + return nodes, nil } for _, addr := range addrs { @@ -88,10 +88,9 @@ func (s *ZkDiscoveryService) Watch(callback discovery.WatchCallback) { return } nodes, err := s.createNodes(addrs) - if err != nil { - return + if err == nil { + callback(nodes) } - callback(nodes) for e := range eventChan { if e.Type == zk.EventNodeChildrenChanged { diff --git a/discovery/zookeeper/zookeeper_test.go b/discovery/zookeeper/zookeeper_test.go index 55fee546f6..38d973ef60 100644 --- a/discovery/zookeeper/zookeeper_test.go +++ b/discovery/zookeeper/zookeeper_test.go @@ -3,6 +3,7 @@ package zookeeper import ( "testing" + "github.com/docker/swarm/discovery" "github.com/stretchr/testify/assert" ) @@ -20,11 +21,16 @@ func TestInitialize(t *testing.T) { func TestCreateNodes(t *testing.T) { service := &ZkDiscoveryService{} - _, err := service.createNodes(nil) - assert.Error(t, err) - nodes, err := service.createNodes([]string{"127.0.0.1:2375", "127.0.0.2:2375"}) + nodes, err := service.createNodes(nil) + assert.Equal(t, nodes, []*discovery.Node{}) assert.NoError(t, err) + + nodes, err = service.createNodes([]string{"127.0.0.1:2375", "127.0.0.2:2375"}) assert.Equal(t, nodes[0].String(), "127.0.0.1:2375") assert.Equal(t, nodes[1].String(), "127.0.0.2:2375") + assert.NoError(t, err) + + _, err = service.createNodes([]string{"127.0.0.1", "127.0.0.2"}) + assert.Error(t, err) } diff --git a/scheduler/filter/affinity_test.go b/scheduler/filter/affinity_test.go index 41597c8d7b..64f54ce7b8 100644 --- a/scheduler/filter/affinity_test.go +++ b/scheduler/filter/affinity_test.go @@ -12,9 +12,9 @@ func TestAffinityFilter(t *testing.T) { var ( f = AffinityFilter{} nodes = []*cluster.Node{ - cluster.NewNode("node-0", "2375", 0), - cluster.NewNode("node-1", "2375", 0), - cluster.NewNode("node-2", "2375", 0), + cluster.NewNode("node-0", 0), + cluster.NewNode("node-1", 0), + cluster.NewNode("node-2", 0), } result []*cluster.Node err error diff --git a/scheduler/filter/constraint_test.go b/scheduler/filter/constraint_test.go index 76c82bc996..016aeeaada 100644 --- a/scheduler/filter/constraint_test.go +++ b/scheduler/filter/constraint_test.go @@ -10,9 +10,9 @@ import ( func testFixtures() (nodes []*cluster.Node) { nodes = []*cluster.Node{ - cluster.NewNode("node-0", "2375", 0), - cluster.NewNode("node-1", "2375", 0), - cluster.NewNode("node-2", "2375", 0), + cluster.NewNode("node-0", 0), + cluster.NewNode("node-1", 0), + cluster.NewNode("node-2", 0), } nodes[0].ID = "node-0-id" nodes[0].Name = "node-0-name" @@ -205,7 +205,7 @@ func TestFilterRegExpCaseInsensitive(t *testing.T) { ) // Prepare node with a strange name - node3 := cluster.NewNode("node-3", "2375", 0) + node3 := cluster.NewNode("node-3", 0) node3.ID = "node-3-id" node3.Name = "node-3-name" node3.Labels = map[string]string{ @@ -249,7 +249,7 @@ func TestFilterWithRelativeComparisons(t *testing.T) { ) // Prepare node with a strange name - node3 := cluster.NewNode("node-3", "2375", 0) + node3 := cluster.NewNode("node-3", 0) node3.ID = "node-3-id" node3.Name = "node-3-name" node3.Labels = map[string]string{ diff --git a/scheduler/filter/port_test.go b/scheduler/filter/port_test.go index 1221ce6f94..48a5ec5e2b 100644 --- a/scheduler/filter/port_test.go +++ b/scheduler/filter/port_test.go @@ -24,9 +24,9 @@ func TestPortFilterNoConflicts(t *testing.T) { var ( p = PortFilter{} nodes = []*cluster.Node{ - cluster.NewNode("node-1", "2375", 0), - cluster.NewNode("node-2", "2375", 0), - cluster.NewNode("node-3", "2375", 0), + cluster.NewNode("node-1", 0), + cluster.NewNode("node-2", 0), + cluster.NewNode("node-3", 0), } result []*cluster.Node err error @@ -70,9 +70,9 @@ func TestPortFilterSimple(t *testing.T) { var ( p = PortFilter{} nodes = []*cluster.Node{ - cluster.NewNode("node-1", "2375", 0), - cluster.NewNode("node-2", "2375", 0), - cluster.NewNode("node-3", "2375", 0), + cluster.NewNode("node-1", 0), + cluster.NewNode("node-2", 0), + cluster.NewNode("node-3", 0), } result []*cluster.Node err error @@ -99,9 +99,9 @@ func TestPortFilterDifferentInterfaces(t *testing.T) { var ( p = PortFilter{} nodes = []*cluster.Node{ - cluster.NewNode("node-1", "2375", 0), - cluster.NewNode("node-2", "2375", 0), - cluster.NewNode("node-3", "2375", 0), + cluster.NewNode("node-1", 0), + cluster.NewNode("node-2", 0), + cluster.NewNode("node-3", 0), } result []*cluster.Node err error diff --git a/scheduler/strategy/binpacking_test.go b/scheduler/strategy/binpacking_test.go index 4b5034b8bd..6a46e443f4 100644 --- a/scheduler/strategy/binpacking_test.go +++ b/scheduler/strategy/binpacking_test.go @@ -10,7 +10,7 @@ import ( ) func createNode(ID string, memory int64, cpus int64) *cluster.Node { - node := cluster.NewNode(ID, "2375", 0.05) + node := cluster.NewNode(ID, 0.05) node.ID = ID node.Memory = memory * 1024 * 1024 * 1024 node.Cpus = cpus