From 693fb0fcf1024939f32742bfc352d33d672b94d8 Mon Sep 17 00:00:00 2001 From: Victor Vieux Date: Sat, 24 Jan 2015 01:36:39 +0000 Subject: [PATCH] fix panic with no port Signed-off-by: Victor Vieux --- cluster/node.go | 10 +++++++--- discovery/consul/consul.go | 6 +++++- discovery/discovery.go | 15 ++++++++++----- discovery/etcd/etcd.go | 6 +++++- discovery/file/file.go | 6 +++++- discovery/nodes/nodes.go | 6 +++++- discovery/token/token.go | 6 +++++- discovery/zookeeper/zookeeper.go | 22 ++++++++++++++-------- discovery/zookeeper/zookeeper_test.go | 16 ++++++++++++---- 9 files changed, 68 insertions(+), 25 deletions(-) diff --git a/cluster/node.go b/cluster/node.go index ab77593f6b..4eb3e8fdbf 100644 --- a/cluster/node.go +++ b/cluster/node.go @@ -56,14 +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 { - parts := strings.Split(n.Addr, ":") - addr, err := net.ResolveIPAddr("ip4", parts[0]) + 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+":"+parts[1], config, time.Duration(requestTimeout)) + c, err := dockerclient.NewDockerClientTimeout(n.IP+":"+port, config, time.Duration(requestTimeout)) if err != nil { return err } diff --git a/discovery/consul/consul.go b/discovery/consul/consul.go index 7d45147123..5eb595b871 100644 --- a/discovery/consul/consul.go +++ b/discovery/consul/consul.go @@ -65,7 +65,11 @@ func (s *ConsulDiscoveryService) Fetch() ([]*discovery.Node, error) { if pair.Key == s.prefix { continue } - nodes = append(nodes, discovery.NewNode(string(pair.Value))) + node, err := discovery.NewNode(string(pair.Value)) + if err != nil { + return nil, err + } + nodes = append(nodes, node) } return nodes, nil } diff --git a/discovery/discovery.go b/discovery/discovery.go index 8c02cf2f6e..91e12d30d5 100644 --- a/discovery/discovery.go +++ b/discovery/discovery.go @@ -3,21 +3,26 @@ package discovery import ( "errors" "fmt" + "net" "strings" log "github.com/Sirupsen/logrus" ) type Node struct { - url string + Host string + Port string } -func NewNode(url string) *Node { - return &Node{url: url} +func NewNode(url string) (*Node, error) { + host, port, err := net.SplitHostPort(url) + if err != nil { + return nil, err + } + return &Node{host, port}, nil } - func (n Node) String() string { - return n.url + return fmt.Sprintf("%s:%s", n.Host, n.Port) } type WatchCallback func(nodes []*Node) diff --git a/discovery/etcd/etcd.go b/discovery/etcd/etcd.go index 91641498d1..744162473a 100644 --- a/discovery/etcd/etcd.go +++ b/discovery/etcd/etcd.go @@ -60,7 +60,11 @@ func (s *EtcdDiscoveryService) Fetch() ([]*discovery.Node, error) { var nodes []*discovery.Node for _, n := range resp.Node.Nodes { - nodes = append(nodes, discovery.NewNode(n.Value)) + node, err := discovery.NewNode(n.Value) + if err != nil { + return nil, err + } + nodes = append(nodes, node) } return nodes, nil } diff --git a/discovery/file/file.go b/discovery/file/file.go index 47ed538613..2594ca7b3f 100644 --- a/discovery/file/file.go +++ b/discovery/file/file.go @@ -33,7 +33,11 @@ func (s *FileDiscoveryService) Fetch() ([]*discovery.Node, error) { for _, line := range strings.Split(string(data), "\n") { if line != "" { - nodes = append(nodes, discovery.NewNode(line)) + node, err := discovery.NewNode(line) + if err != nil { + return nil, err + } + nodes = append(nodes, node) } } return nodes, nil diff --git a/discovery/nodes/nodes.go b/discovery/nodes/nodes.go index 9428a1aada..8c32ff8330 100644 --- a/discovery/nodes/nodes.go +++ b/discovery/nodes/nodes.go @@ -16,7 +16,11 @@ func init() { func (s *NodesDiscoveryService) Initialize(uris string, _ int) error { for _, ip := range strings.Split(uris, ",") { - s.nodes = append(s.nodes, discovery.NewNode(ip)) + node, err := discovery.NewNode(ip) + if err != nil { + return err + } + s.nodes = append(s.nodes, node) } return nil diff --git a/discovery/token/token.go b/discovery/token/token.go index 633e8d1d52..4ccea845cb 100644 --- a/discovery/token/token.go +++ b/discovery/token/token.go @@ -56,7 +56,11 @@ func (s *TokenDiscoveryService) Fetch() ([]*discovery.Node, error) { var nodes []*discovery.Node for _, addr := range addrs { - nodes = append(nodes, discovery.NewNode(addr)) + node, err := discovery.NewNode(addr) + if err != nil { + return nil, err + } + nodes = append(nodes, node) } return nodes, nil diff --git a/discovery/zookeeper/zookeeper.go b/discovery/zookeeper/zookeeper.go index 8c990520af..e6f178b430 100644 --- a/discovery/zookeeper/zookeeper.go +++ b/discovery/zookeeper/zookeeper.go @@ -61,19 +61,23 @@ func (s *ZkDiscoveryService) Fetch() ([]*discovery.Node, error) { return nil, err } - return s.createNodes(addrs), nil + return s.createNodes(addrs) } -func (s *ZkDiscoveryService) createNodes(addrs []string) (nodes []*discovery.Node) { - nodes = make([]*discovery.Node, 0) +func (s *ZkDiscoveryService) createNodes(addrs []string) ([]*discovery.Node, error) { + nodes := make([]*discovery.Node, 0) if addrs == nil { - return + return nodes, nil } for _, addr := range addrs { - nodes = append(nodes, discovery.NewNode(addr)) + node, err := discovery.NewNode(addr) + if err != nil { + return nil, err + } + nodes = append(nodes, node) } - return + return nodes, nil } func (s *ZkDiscoveryService) Watch(callback discovery.WatchCallback) { @@ -83,8 +87,10 @@ func (s *ZkDiscoveryService) Watch(callback discovery.WatchCallback) { log.Debugf("[ZK] Watch aborted") return } - nodes := s.createNodes(addrs) - callback(nodes) + nodes, err := s.createNodes(addrs) + if err == nil { + 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 c07a879aaa..38d973ef60 100644 --- a/discovery/zookeeper/zookeeper_test.go +++ b/discovery/zookeeper/zookeeper_test.go @@ -21,8 +21,16 @@ func TestInitialize(t *testing.T) { func TestCreateNodes(t *testing.T) { service := &ZkDiscoveryService{} - assert.Equal(t, service.createNodes(nil), []*discovery.Node{}) - nodes := service.createNodes([]string{"127.0.0.1", "127.0.0.2"}) - assert.Equal(t, nodes[0].String(), "127.0.0.1") - assert.Equal(t, nodes[1].String(), "127.0.0.2") + + 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) }