Signed-off-by: Sven Dowideit <SvenDowideit@home.org.au>
| ... | ... |
@@ -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" {
|