From 4cbb2084bcd7ec93c669182a82c58b792700ae35 Mon Sep 17 00:00:00 2001 From: Yang Bai Date: Wed, 23 Oct 2013 18:29:35 +0800 Subject: [PATCH 1/2] refactor utils.ParseHost with switch-case, so we can add other proto support easily Upstream-commit: 99f16755661de79cac1ccda78e3e96552f6a4491 Component: engine --- components/engine/utils/utils.go | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/components/engine/utils/utils.go b/components/engine/utils/utils.go index b0327dd40c..17bb0e377b 100644 --- a/components/engine/utils/utils.go +++ b/components/engine/utils/utils.go @@ -819,17 +819,24 @@ func StripComments(input []byte, commentMarker []byte) []byte { } func ParseHost(host string, port int, addr string) string { - if strings.HasPrefix(addr, "unix://") { + var proto string + switch { + case strings.HasPrefix(addr, "unix://"): return addr - } - if strings.HasPrefix(addr, "tcp://") { + case strings.HasPrefix(addr, "tcp://"): + proto = "tcp" addr = strings.TrimPrefix(addr, "tcp://") + default: + if strings.Contains(addr, "://") { + log.Fatal("Invalid bind address proto") + } + proto = "tcp" } + if strings.Contains(addr, ":") { hostParts := strings.Split(addr, ":") if len(hostParts) != 2 { log.Fatal("Invalid bind address format.") - os.Exit(-1) } if hostParts[0] != "" { host = hostParts[0] @@ -840,7 +847,7 @@ func ParseHost(host string, port int, addr string) string { } else { host = addr } - return fmt.Sprintf("tcp://%s:%d", host, port) + return fmt.Sprintf("%s://%s:%d", proto, host, port) } func GetReleaseVersion() string { From 3f6f7d77a83c32fe41d0a4dd17ee6b0c31e663e7 Mon Sep 17 00:00:00 2001 From: Yang Bai Date: Thu, 24 Oct 2013 13:23:02 +0800 Subject: [PATCH 2/2] let utils.ParseHost return err when errors happen Upstream-commit: e81da876df57fb8e0562cc64e7b57dc7eb32284a Component: engine --- components/engine/docker/docker.go | 7 ++++++- components/engine/utils/utils.go | 11 +++++------ components/engine/utils/utils_test.go | 13 ++++++++----- 3 files changed, 19 insertions(+), 12 deletions(-) diff --git a/components/engine/docker/docker.go b/components/engine/docker/docker.go index 750d63c06b..4274fdaf09 100644 --- a/components/engine/docker/docker.go +++ b/components/engine/docker/docker.go @@ -46,7 +46,12 @@ func main() { flHosts = flHosts[1:] //trick to display a nice default value in the usage } for i, flHost := range flHosts { - flHosts[i] = utils.ParseHost(docker.DEFAULTHTTPHOST, docker.DEFAULTHTTPPORT, flHost) + host, err := utils.ParseHost(docker.DEFAULTHTTPHOST, docker.DEFAULTHTTPPORT, flHost) + if err == nil { + flHosts[i] = host + } else { + log.Fatal(err) + } } if *bridgeName != "" { diff --git a/components/engine/utils/utils.go b/components/engine/utils/utils.go index 17bb0e377b..389203b985 100644 --- a/components/engine/utils/utils.go +++ b/components/engine/utils/utils.go @@ -10,7 +10,6 @@ import ( "index/suffixarray" "io" "io/ioutil" - "log" "net/http" "os" "os/exec" @@ -818,17 +817,17 @@ func StripComments(input []byte, commentMarker []byte) []byte { return output } -func ParseHost(host string, port int, addr string) string { +func ParseHost(host string, port int, addr string) (string, error) { var proto string switch { case strings.HasPrefix(addr, "unix://"): - return addr + return addr, nil case strings.HasPrefix(addr, "tcp://"): proto = "tcp" addr = strings.TrimPrefix(addr, "tcp://") default: if strings.Contains(addr, "://") { - log.Fatal("Invalid bind address proto") + return "", fmt.Errorf("Invalid bind address protocol: %s", addr) } proto = "tcp" } @@ -836,7 +835,7 @@ func ParseHost(host string, port int, addr string) string { if strings.Contains(addr, ":") { hostParts := strings.Split(addr, ":") if len(hostParts) != 2 { - log.Fatal("Invalid bind address format.") + return "", fmt.Errorf("Invalid bind address format: %s", addr) } if hostParts[0] != "" { host = hostParts[0] @@ -847,7 +846,7 @@ func ParseHost(host string, port int, addr string) string { } else { host = addr } - return fmt.Sprintf("%s://%s:%d", proto, host, port) + return fmt.Sprintf("%s://%s:%d", proto, host, port), nil } func GetReleaseVersion() string { diff --git a/components/engine/utils/utils_test.go b/components/engine/utils/utils_test.go index 9a55e7f62d..0c775dbb0b 100644 --- a/components/engine/utils/utils_test.go +++ b/components/engine/utils/utils_test.go @@ -266,21 +266,24 @@ func TestHumanSize(t *testing.T) { } func TestParseHost(t *testing.T) { - if addr := ParseHost("127.0.0.1", 4243, "0.0.0.0"); addr != "tcp://0.0.0.0:4243" { + if addr, err := ParseHost("127.0.0.1", 4243, "0.0.0.0"); err != nil || addr != "tcp://0.0.0.0:4243" { t.Errorf("0.0.0.0 -> expected tcp://0.0.0.0:4243, got %s", addr) } - if addr := ParseHost("127.0.0.1", 4243, "0.0.0.1:5555"); addr != "tcp://0.0.0.1:5555" { + if addr, err := ParseHost("127.0.0.1", 4243, "0.0.0.1:5555"); err != nil || addr != "tcp://0.0.0.1:5555" { t.Errorf("0.0.0.1:5555 -> expected tcp://0.0.0.1:5555, got %s", addr) } - if addr := ParseHost("127.0.0.1", 4243, ":6666"); addr != "tcp://127.0.0.1:6666" { + if addr, err := ParseHost("127.0.0.1", 4243, ":6666"); err != nil || addr != "tcp://127.0.0.1:6666" { t.Errorf(":6666 -> expected tcp://127.0.0.1:6666, got %s", addr) } - if addr := ParseHost("127.0.0.1", 4243, "tcp://:7777"); addr != "tcp://127.0.0.1:7777" { + if addr, err := ParseHost("127.0.0.1", 4243, "tcp://:7777"); err != nil || addr != "tcp://127.0.0.1:7777" { t.Errorf("tcp://:7777 -> expected tcp://127.0.0.1:7777, got %s", addr) } - if addr := ParseHost("127.0.0.1", 4243, "unix:///var/run/docker.sock"); addr != "unix:///var/run/docker.sock" { + if addr, err := ParseHost("127.0.0.1", 4243, "unix:///var/run/docker.sock"); err != nil || addr != "unix:///var/run/docker.sock" { t.Errorf("unix:///var/run/docker.sock -> expected unix:///var/run/docker.sock, got %s", addr) } + if addr, err := ParseHost("127.0.0.1", 4243, "udp://127.0.0.1"); err == nil { + t.Errorf("udp protocol address expected error return, but err == nil. Got %s", addr) + } } func TestParseRepositoryTag(t *testing.T) {