fix panic with no port

Signed-off-by: Victor Vieux <vieux@docker.com>
This commit is contained in:
Victor Vieux 2015-01-24 01:36:39 +00:00
parent 02cc59840f
commit 693fb0fcf1
9 changed files with 68 additions and 25 deletions

View File

@ -56,14 +56,18 @@ type Node struct {
// Connect will initialize a connection to the Docker daemon running on the // Connect will initialize a connection to the Docker daemon running on the
// host, gather machine specs (memory, cpu, ...) and monitor state changes. // host, gather machine specs (memory, cpu, ...) and monitor state changes.
func (n *Node) Connect(config *tls.Config) error { func (n *Node) Connect(config *tls.Config) error {
parts := strings.Split(n.Addr, ":") host, port, err := net.SplitHostPort(n.Addr)
addr, err := net.ResolveIPAddr("ip4", parts[0]) if err != nil {
return err
}
addr, err := net.ResolveIPAddr("ip4", host)
if err != nil { if err != nil {
return err return err
} }
n.IP = addr.IP.String() 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 { if err != nil {
return err return err
} }

View File

@ -65,7 +65,11 @@ func (s *ConsulDiscoveryService) Fetch() ([]*discovery.Node, error) {
if pair.Key == s.prefix { if pair.Key == s.prefix {
continue 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 return nodes, nil
} }

View File

@ -3,21 +3,26 @@ package discovery
import ( import (
"errors" "errors"
"fmt" "fmt"
"net"
"strings" "strings"
log "github.com/Sirupsen/logrus" log "github.com/Sirupsen/logrus"
) )
type Node struct { type Node struct {
url string Host string
Port string
} }
func NewNode(url string) *Node { func NewNode(url string) (*Node, error) {
return &Node{url: url} host, port, err := net.SplitHostPort(url)
if err != nil {
return nil, err
}
return &Node{host, port}, nil
} }
func (n Node) String() string { func (n Node) String() string {
return n.url return fmt.Sprintf("%s:%s", n.Host, n.Port)
} }
type WatchCallback func(nodes []*Node) type WatchCallback func(nodes []*Node)

View File

@ -60,7 +60,11 @@ func (s *EtcdDiscoveryService) Fetch() ([]*discovery.Node, error) {
var nodes []*discovery.Node var nodes []*discovery.Node
for _, n := range resp.Node.Nodes { 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 return nodes, nil
} }

View File

@ -33,7 +33,11 @@ func (s *FileDiscoveryService) Fetch() ([]*discovery.Node, error) {
for _, line := range strings.Split(string(data), "\n") { for _, line := range strings.Split(string(data), "\n") {
if line != "" { 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 return nodes, nil

View File

@ -16,7 +16,11 @@ func init() {
func (s *NodesDiscoveryService) Initialize(uris string, _ int) error { func (s *NodesDiscoveryService) Initialize(uris string, _ int) error {
for _, ip := range strings.Split(uris, ",") { 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 return nil

View File

@ -56,7 +56,11 @@ func (s *TokenDiscoveryService) Fetch() ([]*discovery.Node, error) {
var nodes []*discovery.Node var nodes []*discovery.Node
for _, addr := range addrs { 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 return nodes, nil

View File

@ -61,19 +61,23 @@ func (s *ZkDiscoveryService) Fetch() ([]*discovery.Node, error) {
return nil, err return nil, err
} }
return s.createNodes(addrs), nil return s.createNodes(addrs)
} }
func (s *ZkDiscoveryService) createNodes(addrs []string) (nodes []*discovery.Node) { func (s *ZkDiscoveryService) createNodes(addrs []string) ([]*discovery.Node, error) {
nodes = make([]*discovery.Node, 0) nodes := make([]*discovery.Node, 0)
if addrs == nil { if addrs == nil {
return return nodes, nil
} }
for _, addr := range addrs { 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) { func (s *ZkDiscoveryService) Watch(callback discovery.WatchCallback) {
@ -83,8 +87,10 @@ func (s *ZkDiscoveryService) Watch(callback discovery.WatchCallback) {
log.Debugf("[ZK] Watch aborted") log.Debugf("[ZK] Watch aborted")
return return
} }
nodes := s.createNodes(addrs) nodes, err := s.createNodes(addrs)
callback(nodes) if err == nil {
callback(nodes)
}
for e := range eventChan { for e := range eventChan {
if e.Type == zk.EventNodeChildrenChanged { if e.Type == zk.EventNodeChildrenChanged {

View File

@ -21,8 +21,16 @@ func TestInitialize(t *testing.T) {
func TestCreateNodes(t *testing.T) { func TestCreateNodes(t *testing.T) {
service := &ZkDiscoveryService{} service := &ZkDiscoveryService{}
assert.Equal(t, service.createNodes(nil), []*discovery.Node{})
nodes := service.createNodes([]string{"127.0.0.1", "127.0.0.2"}) nodes, err := service.createNodes(nil)
assert.Equal(t, nodes[0].String(), "127.0.0.1") assert.Equal(t, nodes, []*discovery.Node{})
assert.Equal(t, nodes[1].String(), "127.0.0.2") 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)
} }