Browse code

Change ParseTCPAddr to use tcp://127.0.0.0:2375 format as default consistently

Signed-off-by: Sven Dowideit <SvenDowideit@home.org.au>

Sven Dowideit authored on 2015/08/29 12:05:18
Showing 5 changed files
... ...
@@ -2,7 +2,5 @@
2 2
 
3 3
 package opts
4 4
 
5
-import "fmt"
6
-
7 5
 // DefaultHost constant defines the default host string used by docker on Windows
8
-var DefaultHost = fmt.Sprintf("tcp://%s:%d", DefaultHTTPHost, DefaultHTTPPort)
6
+var DefaultHost = DefaultTCPHost
... ...
@@ -25,6 +25,8 @@ var (
25 25
 	// DefaultUnixSocket Path for the unix socket.
26 26
 	// Docker daemon by default always listens on the default unix socket
27 27
 	DefaultUnixSocket = "/var/run/docker.sock"
28
+	// DefaultTCPHost constant defines the default host string used by docker on Windows
29
+	DefaultTCPHost = fmt.Sprintf("tcp://%s:%d", DefaultHTTPHost, DefaultHTTPPort)
28 30
 )
29 31
 
30 32
 // ListOpts holds a list of values and a validation function.
... ...
@@ -333,7 +335,7 @@ func ValidateLabel(val string) (string, error) {
333 333
 
334 334
 // ValidateHost validates that the specified string is a valid host and returns it.
335 335
 func ValidateHost(val string) (string, error) {
336
-	host, err := parsers.ParseHost(DefaultHTTPHost, DefaultUnixSocket, val)
336
+	host, err := parsers.ParseDockerDaemonHost(DefaultTCPHost, DefaultUnixSocket, val)
337 337
 	if err != nil {
338 338
 		return val, err
339 339
 	}
... ...
@@ -441,7 +441,6 @@ func TestValidateHost(t *testing.T) {
441 441
 		"something with spaces": "Invalid bind address format: something with spaces",
442 442
 		"://":                "Invalid bind address format: ://",
443 443
 		"unknown://":         "Invalid bind address format: unknown://",
444
-		"tcp://":             "Invalid proto, expected tcp: ",
445 444
 		"tcp://:port":        "Invalid bind address format: :port",
446 445
 		"tcp://invalid":      "Invalid bind address format: invalid",
447 446
 		"tcp://invalid:port": "Invalid bind address format: invalid:port",
... ...
@@ -449,6 +448,8 @@ func TestValidateHost(t *testing.T) {
449 449
 	valid := map[string]string{
450 450
 		"fd://":                    "fd://",
451 451
 		"fd://something":           "fd://something",
452
+		"tcp://host:":              "tcp://host:2375",
453
+		"tcp://":                   "tcp://127.0.0.1:2375",
452 454
 		"tcp://:2375":              "tcp://127.0.0.1:2375", // default ip address
453 455
 		"tcp://:2376":              "tcp://127.0.0.1:2376", // default ip address
454 456
 		"tcp://0.0.0.0:8080":       "tcp://0.0.0.0:8080",
... ...
@@ -12,17 +12,17 @@ import (
12 12
 	"strings"
13 13
 )
14 14
 
15
-// ParseHost parses the specified address and returns an address that will be used as the host.
15
+// ParseDockerDaemonHost parses the specified address and returns an address that will be used as the host.
16 16
 // Depending of the address specified, will use the defaultTCPAddr or defaultUnixAddr
17
-func ParseHost(defaultTCPAddr, defaultUnixAddr, addr string) (string, error) {
17
+// defaultUnixAddr must be a absolute file path (no `unix://` prefix)
18
+// defaultTCPAddr must be the full `tcp://host:port` form
19
+func ParseDockerDaemonHost(defaultTCPAddr, defaultUnixAddr, addr string) (string, error) {
18 20
 	addr = strings.TrimSpace(addr)
19 21
 	if addr == "" {
20 22
 		if runtime.GOOS != "windows" {
21
-			addr = fmt.Sprintf("unix://%s", defaultUnixAddr)
22
-		} else {
23
-			// Note - defaultTCPAddr already includes tcp:// prefix
24
-			addr = defaultTCPAddr
23
+			return fmt.Sprintf("unix://%s", defaultUnixAddr), nil
25 24
 		}
25
+		return defaultTCPAddr, nil
26 26
 	}
27 27
 	addrParts := strings.Split(addr, "://")
28 28
 	if len(addrParts) == 1 {
... ...
@@ -58,11 +58,16 @@ func ParseUnixAddr(addr string, defaultAddr string) (string, error) {
58 58
 
59 59
 // ParseTCPAddr parses and validates that the specified address is a valid TCP
60 60
 // address. It returns a formatted TCP address, either using the address parsed
61
-// from addr, or the contents of defaultAddr if addr is a blank string.
62
-func ParseTCPAddr(addr string, defaultAddr string) (string, error) {
63
-	addr = strings.TrimPrefix(addr, "tcp://")
61
+// from tryAddr, or the contents of defaultAddr if tryAddr is a blank string.
62
+// tryAddr is expected to have already been Trim()'d
63
+// defaultAddr must be in the full `tcp://host:port` form
64
+func ParseTCPAddr(tryAddr string, defaultAddr string) (string, error) {
65
+	if tryAddr == "" || tryAddr == "tcp://" {
66
+		return defaultAddr, nil
67
+	}
68
+	addr := strings.TrimPrefix(tryAddr, "tcp://")
64 69
 	if strings.Contains(addr, "://") || addr == "" {
65
-		return "", fmt.Errorf("Invalid proto, expected tcp: %s", addr)
70
+		return "", fmt.Errorf("Invalid proto, expected tcp: %s", tryAddr)
66 71
 	}
67 72
 
68 73
 	u, err := url.Parse("tcp://" + addr)
... ...
@@ -71,16 +76,23 @@ func ParseTCPAddr(addr string, defaultAddr string) (string, error) {
71 71
 	}
72 72
 	hostParts := strings.Split(u.Host, ":")
73 73
 	if len(hostParts) != 2 {
74
-		return "", fmt.Errorf("Invalid bind address format: %s", addr)
74
+		return "", fmt.Errorf("Invalid bind address format: %s", tryAddr)
75
+	}
76
+	defaults := strings.Split(defaultAddr, ":")
77
+	if len(defaults) != 3 {
78
+		return "", fmt.Errorf("Invalid defaults address format: %s", defaultAddr)
75 79
 	}
80
+
76 81
 	host := hostParts[0]
77 82
 	if host == "" {
78
-		host = defaultAddr
83
+		host = strings.TrimPrefix(defaults[1], "//")
84
+	}
85
+	if hostParts[1] == "" {
86
+		hostParts[1] = defaults[2]
79 87
 	}
80
-
81 88
 	p, err := strconv.Atoi(hostParts[1])
82 89
 	if err != nil && p == 0 {
83
-		return "", fmt.Errorf("Invalid bind address format: %s", addr)
90
+		return "", fmt.Errorf("Invalid bind address format: %s", tryAddr)
84 91
 	}
85 92
 	return fmt.Sprintf("tcp://%s:%d%s", host, p, u.Path), nil
86 93
 }
... ...
@@ -6,16 +6,17 @@ import (
6 6
 	"testing"
7 7
 )
8 8
 
9
-func TestParseHost(t *testing.T) {
9
+func TestParseDockerDaemonHost(t *testing.T) {
10 10
 	var (
11
-		defaultHTTPHost = "127.0.0.1"
11
+		defaultHTTPHost = "tcp://127.0.0.1:2376"
12 12
 		defaultUnix     = "/var/run/docker.sock"
13 13
 		defaultHOST     = "unix:///var/run/docker.sock"
14 14
 	)
15
+	if runtime.GOOS == "windows" {
16
+		defaultHOST = defaultHTTPHost
17
+	}
15 18
 	invalids := map[string]string{
16 19
 		"0.0.0.0":                       "Invalid bind address format: 0.0.0.0",
17
-		"0.0.0.0:":                      "Invalid bind address format: 0.0.0.0:",
18
-		"tcp://":                        "Invalid proto, expected tcp: ",
19 20
 		"tcp:a.b.c.d":                   "Invalid bind address format: tcp:a.b.c.d",
20 21
 		"tcp:a.b.c.d/path":              "Invalid bind address format: tcp:a.b.c.d/path",
21 22
 		"udp://127.0.0.1":               "Invalid bind address format: udp://127.0.0.1",
... ...
@@ -26,37 +27,30 @@ func TestParseHost(t *testing.T) {
26 26
 		"fd":   "Invalid bind address format: fd",
27 27
 	}
28 28
 	valids := map[string]string{
29
-		"0.0.0.1:5555":      "tcp://0.0.0.1:5555",
30
-		"0.0.0.1:5555/path": "tcp://0.0.0.1:5555/path",
31
-		":6666":             "tcp://127.0.0.1:6666",
32
-		":6666/path":        "tcp://127.0.0.1:6666/path",
33
-		"tcp://:7777":       "tcp://127.0.0.1:7777",
34
-		"tcp://:7777/path":  "tcp://127.0.0.1:7777/path",
35
-		// as there's a TrimSpace in there, we should test for it.
29
+		"0.0.0.1:":                "tcp://0.0.0.1:2376",
30
+		"0.0.0.1:5555":            "tcp://0.0.0.1:5555",
31
+		"0.0.0.1:5555/path":       "tcp://0.0.0.1:5555/path",
32
+		":6666":                   "tcp://127.0.0.1:6666",
33
+		":6666/path":              "tcp://127.0.0.1:6666/path",
34
+		"":                        defaultHOST,
35
+		" ":                       defaultHOST,
36
+		"  ":                      defaultHOST,
37
+		"tcp://":                  defaultHTTPHost,
38
+		"tcp://:7777":             "tcp://127.0.0.1:7777",
39
+		"tcp://:7777/path":        "tcp://127.0.0.1:7777/path",
36 40
 		" tcp://:7777/path ":      "tcp://127.0.0.1:7777/path",
37 41
 		"unix:///run/docker.sock": "unix:///run/docker.sock",
38 42
 		"unix://":                 "unix:///var/run/docker.sock",
39 43
 		"fd://":                   "fd://",
40 44
 		"fd://something":          "fd://something",
41 45
 	}
42
-	if runtime.GOOS == "windows" {
43
-		defaultHOST = "Invalid bind address format: 127.0.0.1"
44
-		// SVEN: an example of the conflicted defaultHTTPHost
45
-		invalids[""] = defaultHOST
46
-		invalids[" "] = defaultHOST
47
-		invalids["  "] = defaultHOST
48
-	} else {
49
-		valids[""] = defaultHOST
50
-		valids[" "] = defaultHOST
51
-		valids["  "] = defaultHOST
52
-	}
53 46
 	for invalidAddr, expectedError := range invalids {
54
-		if addr, err := ParseHost(defaultHTTPHost, defaultUnix, invalidAddr); err == nil || err.Error() != expectedError {
47
+		if addr, err := ParseDockerDaemonHost(defaultHTTPHost, defaultUnix, invalidAddr); err == nil || err.Error() != expectedError {
55 48
 			t.Errorf("tcp %v address expected error %v return, got %s and addr %v", invalidAddr, expectedError, err, addr)
56 49
 		}
57 50
 	}
58 51
 	for validAddr, expectedAddr := range valids {
59
-		if addr, err := ParseHost(defaultHTTPHost, defaultUnix, validAddr); err != nil || addr != expectedAddr {
52
+		if addr, err := ParseDockerDaemonHost(defaultHTTPHost, defaultUnix, validAddr); err != nil || addr != expectedAddr {
60 53
 			t.Errorf("%v -> expected %v, got (%v) addr (%v)", validAddr, expectedAddr, err, addr)
61 54
 		}
62 55
 	}
... ...
@@ -64,20 +58,19 @@ func TestParseHost(t *testing.T) {
64 64
 
65 65
 func TestParseTCP(t *testing.T) {
66 66
 	var (
67
-		//SVEN if this is set to tcp://127.0.0.1, then we end up with results like 'tcp://tcp://127.0.0.1:6666'
68
-		defaultHTTPHost = "127.0.0.1"
67
+		defaultHTTPHost = "tcp://127.0.0.1:2376"
69 68
 	)
70 69
 	invalids := map[string]string{
71 70
 		"0.0.0.0":              "Invalid bind address format: 0.0.0.0",
72
-		"0.0.0.0:":             "Invalid bind address format: 0.0.0.0:",
73
-		"tcp://":               "Invalid proto, expected tcp: ",
74 71
 		"tcp:a.b.c.d":          "Invalid bind address format: tcp:a.b.c.d",
75 72
 		"tcp:a.b.c.d/path":     "Invalid bind address format: tcp:a.b.c.d/path",
76 73
 		"udp://127.0.0.1":      "Invalid proto, expected tcp: udp://127.0.0.1",
77 74
 		"udp://127.0.0.1:2375": "Invalid proto, expected tcp: udp://127.0.0.1:2375",
78
-		"": "Invalid proto, expected tcp: ",
79 75
 	}
80 76
 	valids := map[string]string{
77
+		"":                  defaultHTTPHost,
78
+		"tcp://":            defaultHTTPHost,
79
+		"0.0.0.1:":          "tcp://0.0.0.1:2376",
81 80
 		"0.0.0.1:5555":      "tcp://0.0.0.1:5555",
82 81
 		"0.0.0.1:5555/path": "tcp://0.0.0.1:5555/path",
83 82
 		":6666":             "tcp://127.0.0.1:6666",
... ...
@@ -101,7 +94,7 @@ func TestParseInvalidUnixAddrInvalid(t *testing.T) {
101 101
 	if _, err := ParseUnixAddr("tcp://127.0.0.1", "unix:///var/run/docker.sock"); err == nil || err.Error() != "Invalid proto, expected unix: tcp://127.0.0.1" {
102 102
 		t.Fatalf("Expected an error, got %v", err)
103 103
 	}
104
-	if _, err := ParseUnixAddr("unix://tcp://127.0.0.1", "unix:///var/run/docker.sock"); err == nil || err.Error() != "Invalid proto, expected unix: tcp://127.0.0.1" {
104
+	if _, err := ParseUnixAddr("unix://tcp://127.0.0.1", "/var/run/docker.sock"); err == nil || err.Error() != "Invalid proto, expected unix: tcp://127.0.0.1" {
105 105
 		t.Fatalf("Expected an error, got %v", err)
106 106
 	}
107 107
 	if v, err := ParseUnixAddr("", "/var/run/docker.sock"); err != nil || v != "unix:///var/run/docker.sock" {