mirror of https://github.com/docker/cli.git
Move ParseDockerDaemonHost to opts/ package.
This function was only being used from a single place opts/opts.go. This change moves it from a incohesive package (parsers) to the single place it is used. Also made a bunch of the helper methods private because they are not used by any external modules. Signed-off-by: Daniel Nephin <dnephin@docker.com>
This commit is contained in:
parent
f599afe64e
commit
7dc7bff9a0
|
@ -0,0 +1,146 @@
|
||||||
|
package opts
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"net"
|
||||||
|
"net/url"
|
||||||
|
"runtime"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
// DefaultHTTPPort Default HTTP Port used if only the protocol is provided to -H flag e.g. docker daemon -H tcp://
|
||||||
|
// TODO Windows. DefaultHTTPPort is only used on Windows if a -H parameter
|
||||||
|
// is not supplied. A better longer term solution would be to use a named
|
||||||
|
// pipe as the default on the Windows daemon.
|
||||||
|
// These are the IANA registered port numbers for use with Docker
|
||||||
|
// see http://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.xhtml?search=docker
|
||||||
|
DefaultHTTPPort = 2375 // Default HTTP Port
|
||||||
|
// DefaultTLSHTTPPort Default HTTP Port used when TLS enabled
|
||||||
|
DefaultTLSHTTPPort = 2376 // Default TLS encrypted HTTP Port
|
||||||
|
// DefaultUnixSocket Path for the unix socket.
|
||||||
|
// Docker daemon by default always listens on the default unix socket
|
||||||
|
DefaultUnixSocket = "/var/run/docker.sock"
|
||||||
|
// DefaultTCPHost constant defines the default host string used by docker on Windows
|
||||||
|
DefaultTCPHost = fmt.Sprintf("tcp://%s:%d", DefaultHTTPHost, DefaultHTTPPort)
|
||||||
|
// DefaultTLSHost constant defines the default host string used by docker for TLS sockets
|
||||||
|
DefaultTLSHost = fmt.Sprintf("tcp://%s:%d", DefaultHTTPHost, DefaultTLSHTTPPort)
|
||||||
|
)
|
||||||
|
|
||||||
|
// ValidateHost validates that the specified string is a valid host and returns it.
|
||||||
|
func ValidateHost(val string) (string, error) {
|
||||||
|
_, err := parseDockerDaemonHost(DefaultTCPHost, DefaultTLSHost, DefaultUnixSocket, "", val)
|
||||||
|
if err != nil {
|
||||||
|
return val, err
|
||||||
|
}
|
||||||
|
// Note: unlike most flag validators, we don't return the mutated value here
|
||||||
|
// we need to know what the user entered later (using ParseHost) to adjust for tls
|
||||||
|
return val, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// ParseHost and set defaults for a Daemon host string
|
||||||
|
func ParseHost(defaultHost, val string) (string, error) {
|
||||||
|
host, err := parseDockerDaemonHost(DefaultTCPHost, DefaultTLSHost, DefaultUnixSocket, defaultHost, val)
|
||||||
|
if err != nil {
|
||||||
|
return val, err
|
||||||
|
}
|
||||||
|
return host, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// parseDockerDaemonHost parses the specified address and returns an address that will be used as the host.
|
||||||
|
// Depending of the address specified, will use the defaultTCPAddr or defaultUnixAddr
|
||||||
|
// defaultUnixAddr must be a absolute file path (no `unix://` prefix)
|
||||||
|
// defaultTCPAddr must be the full `tcp://host:port` form
|
||||||
|
func parseDockerDaemonHost(defaultTCPAddr, defaultTLSHost, defaultUnixAddr, defaultAddr, addr string) (string, error) {
|
||||||
|
addr = strings.TrimSpace(addr)
|
||||||
|
if addr == "" {
|
||||||
|
if defaultAddr == defaultTLSHost {
|
||||||
|
return defaultTLSHost, nil
|
||||||
|
}
|
||||||
|
if runtime.GOOS != "windows" {
|
||||||
|
return fmt.Sprintf("unix://%s", defaultUnixAddr), nil
|
||||||
|
}
|
||||||
|
return defaultTCPAddr, nil
|
||||||
|
}
|
||||||
|
addrParts := strings.Split(addr, "://")
|
||||||
|
if len(addrParts) == 1 {
|
||||||
|
addrParts = []string{"tcp", addrParts[0]}
|
||||||
|
}
|
||||||
|
|
||||||
|
switch addrParts[0] {
|
||||||
|
case "tcp":
|
||||||
|
return parseTCPAddr(addrParts[1], defaultTCPAddr)
|
||||||
|
case "unix":
|
||||||
|
return parseUnixAddr(addrParts[1], defaultUnixAddr)
|
||||||
|
case "fd":
|
||||||
|
return addr, nil
|
||||||
|
default:
|
||||||
|
return "", fmt.Errorf("Invalid bind address format: %s", addr)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// parseUnixAddr parses and validates that the specified address is a valid UNIX
|
||||||
|
// socket address. It returns a formatted UNIX socket address, either using the
|
||||||
|
// address parsed from addr, or the contents of defaultAddr if addr is a blank
|
||||||
|
// string.
|
||||||
|
func parseUnixAddr(addr string, defaultAddr string) (string, error) {
|
||||||
|
addr = strings.TrimPrefix(addr, "unix://")
|
||||||
|
if strings.Contains(addr, "://") {
|
||||||
|
return "", fmt.Errorf("Invalid proto, expected unix: %s", addr)
|
||||||
|
}
|
||||||
|
if addr == "" {
|
||||||
|
addr = defaultAddr
|
||||||
|
}
|
||||||
|
return fmt.Sprintf("unix://%s", addr), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// parseTCPAddr parses and validates that the specified address is a valid TCP
|
||||||
|
// address. It returns a formatted TCP address, either using the address parsed
|
||||||
|
// from tryAddr, or the contents of defaultAddr if tryAddr is a blank string.
|
||||||
|
// tryAddr is expected to have already been Trim()'d
|
||||||
|
// defaultAddr must be in the full `tcp://host:port` form
|
||||||
|
func parseTCPAddr(tryAddr string, defaultAddr string) (string, error) {
|
||||||
|
if tryAddr == "" || tryAddr == "tcp://" {
|
||||||
|
return defaultAddr, nil
|
||||||
|
}
|
||||||
|
addr := strings.TrimPrefix(tryAddr, "tcp://")
|
||||||
|
if strings.Contains(addr, "://") || addr == "" {
|
||||||
|
return "", fmt.Errorf("Invalid proto, expected tcp: %s", tryAddr)
|
||||||
|
}
|
||||||
|
|
||||||
|
defaultAddr = strings.TrimPrefix(defaultAddr, "tcp://")
|
||||||
|
defaultHost, defaultPort, err := net.SplitHostPort(defaultAddr)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
// url.Parse fails for trailing colon on IPv6 brackets on Go 1.5, but
|
||||||
|
// not 1.4. See https://github.com/golang/go/issues/12200 and
|
||||||
|
// https://github.com/golang/go/issues/6530.
|
||||||
|
if strings.HasSuffix(addr, "]:") {
|
||||||
|
addr += defaultPort
|
||||||
|
}
|
||||||
|
|
||||||
|
u, err := url.Parse("tcp://" + addr)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
host, port, err := net.SplitHostPort(u.Host)
|
||||||
|
if err != nil {
|
||||||
|
return "", fmt.Errorf("Invalid bind address format: %s", tryAddr)
|
||||||
|
}
|
||||||
|
|
||||||
|
if host == "" {
|
||||||
|
host = defaultHost
|
||||||
|
}
|
||||||
|
if port == "" {
|
||||||
|
port = defaultPort
|
||||||
|
}
|
||||||
|
p, err := strconv.Atoi(port)
|
||||||
|
if err != nil && p == 0 {
|
||||||
|
return "", fmt.Errorf("Invalid bind address format: %s", tryAddr)
|
||||||
|
}
|
||||||
|
|
||||||
|
return fmt.Sprintf("tcp://%s%s", net.JoinHostPort(host, port), u.Path), nil
|
||||||
|
}
|
|
@ -0,0 +1,164 @@
|
||||||
|
package opts
|
||||||
|
|
||||||
|
import (
|
||||||
|
"runtime"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestParseHost(t *testing.T) {
|
||||||
|
invalid := map[string]string{
|
||||||
|
"anything": "Invalid bind address format: anything",
|
||||||
|
"something with spaces": "Invalid bind address format: something with spaces",
|
||||||
|
"://": "Invalid bind address format: ://",
|
||||||
|
"unknown://": "Invalid bind address format: unknown://",
|
||||||
|
"tcp://:port": "Invalid bind address format: :port",
|
||||||
|
"tcp://invalid": "Invalid bind address format: invalid",
|
||||||
|
"tcp://invalid:port": "Invalid bind address format: invalid:port",
|
||||||
|
}
|
||||||
|
const defaultHTTPHost = "tcp://127.0.0.1:2375"
|
||||||
|
var defaultHOST = "unix:///var/run/docker.sock"
|
||||||
|
|
||||||
|
if runtime.GOOS == "windows" {
|
||||||
|
defaultHOST = defaultHTTPHost
|
||||||
|
}
|
||||||
|
valid := map[string]string{
|
||||||
|
"": defaultHOST,
|
||||||
|
"fd://": "fd://",
|
||||||
|
"fd://something": "fd://something",
|
||||||
|
"tcp://host:": "tcp://host:2375",
|
||||||
|
"tcp://": "tcp://localhost:2375",
|
||||||
|
"tcp://:2375": "tcp://localhost:2375", // default ip address
|
||||||
|
"tcp://:2376": "tcp://localhost:2376", // default ip address
|
||||||
|
"tcp://0.0.0.0:8080": "tcp://0.0.0.0:8080",
|
||||||
|
"tcp://192.168.0.0:12000": "tcp://192.168.0.0:12000",
|
||||||
|
"tcp://192.168:8080": "tcp://192.168:8080",
|
||||||
|
"tcp://0.0.0.0:1234567890": "tcp://0.0.0.0:1234567890", // yeah it's valid :P
|
||||||
|
"tcp://docker.com:2375": "tcp://docker.com:2375",
|
||||||
|
"unix://": "unix:///var/run/docker.sock", // default unix:// value
|
||||||
|
"unix://path/to/socket": "unix://path/to/socket",
|
||||||
|
}
|
||||||
|
|
||||||
|
for value, errorMessage := range invalid {
|
||||||
|
if _, err := ParseHost(defaultHTTPHost, value); err == nil || err.Error() != errorMessage {
|
||||||
|
t.Fatalf("Expected an error for %v with [%v], got [%v]", value, errorMessage, err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for value, expected := range valid {
|
||||||
|
if actual, err := ParseHost(defaultHTTPHost, value); err != nil || actual != expected {
|
||||||
|
t.Fatalf("Expected for %v [%v], got [%v, %v]", value, expected, actual, err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestParseDockerDaemonHost(t *testing.T) {
|
||||||
|
var (
|
||||||
|
defaultHTTPHost = "tcp://localhost:2375"
|
||||||
|
defaultHTTPSHost = "tcp://localhost:2376"
|
||||||
|
defaultUnix = "/var/run/docker.sock"
|
||||||
|
defaultHOST = "unix:///var/run/docker.sock"
|
||||||
|
)
|
||||||
|
if runtime.GOOS == "windows" {
|
||||||
|
defaultHOST = defaultHTTPHost
|
||||||
|
}
|
||||||
|
invalids := map[string]string{
|
||||||
|
"0.0.0.0": "Invalid bind address format: 0.0.0.0",
|
||||||
|
"tcp:a.b.c.d": "Invalid bind address format: tcp:a.b.c.d",
|
||||||
|
"tcp:a.b.c.d/path": "Invalid bind address format: tcp:a.b.c.d/path",
|
||||||
|
"udp://127.0.0.1": "Invalid bind address format: udp://127.0.0.1",
|
||||||
|
"udp://127.0.0.1:2375": "Invalid bind address format: udp://127.0.0.1:2375",
|
||||||
|
"tcp://unix:///run/docker.sock": "Invalid bind address format: unix",
|
||||||
|
"tcp": "Invalid bind address format: tcp",
|
||||||
|
"unix": "Invalid bind address format: unix",
|
||||||
|
"fd": "Invalid bind address format: fd",
|
||||||
|
}
|
||||||
|
valids := map[string]string{
|
||||||
|
"0.0.0.1:": "tcp://0.0.0.1:2375",
|
||||||
|
"0.0.0.1:5555": "tcp://0.0.0.1:5555",
|
||||||
|
"0.0.0.1:5555/path": "tcp://0.0.0.1:5555/path",
|
||||||
|
"[::1]:": "tcp://[::1]:2375",
|
||||||
|
"[::1]:5555/path": "tcp://[::1]:5555/path",
|
||||||
|
"[0:0:0:0:0:0:0:1]:": "tcp://[0:0:0:0:0:0:0:1]:2375",
|
||||||
|
"[0:0:0:0:0:0:0:1]:5555/path": "tcp://[0:0:0:0:0:0:0:1]:5555/path",
|
||||||
|
":6666": "tcp://localhost:6666",
|
||||||
|
":6666/path": "tcp://localhost:6666/path",
|
||||||
|
"": defaultHOST,
|
||||||
|
" ": defaultHOST,
|
||||||
|
" ": defaultHOST,
|
||||||
|
"tcp://": defaultHTTPHost,
|
||||||
|
"tcp://:7777": "tcp://localhost:7777",
|
||||||
|
"tcp://:7777/path": "tcp://localhost:7777/path",
|
||||||
|
" tcp://:7777/path ": "tcp://localhost:7777/path",
|
||||||
|
"unix:///run/docker.sock": "unix:///run/docker.sock",
|
||||||
|
"unix://": "unix:///var/run/docker.sock",
|
||||||
|
"fd://": "fd://",
|
||||||
|
"fd://something": "fd://something",
|
||||||
|
"localhost:": "tcp://localhost:2375",
|
||||||
|
"localhost:5555": "tcp://localhost:5555",
|
||||||
|
"localhost:5555/path": "tcp://localhost:5555/path",
|
||||||
|
}
|
||||||
|
for invalidAddr, expectedError := range invalids {
|
||||||
|
if addr, err := parseDockerDaemonHost(defaultHTTPHost, defaultHTTPSHost, defaultUnix, "", invalidAddr); err == nil || err.Error() != expectedError {
|
||||||
|
t.Errorf("tcp %v address expected error %v return, got %s and addr %v", invalidAddr, expectedError, err, addr)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for validAddr, expectedAddr := range valids {
|
||||||
|
if addr, err := parseDockerDaemonHost(defaultHTTPHost, defaultHTTPSHost, defaultUnix, "", validAddr); err != nil || addr != expectedAddr {
|
||||||
|
t.Errorf("%v -> expected %v, got (%v) addr (%v)", validAddr, expectedAddr, err, addr)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestParseTCP(t *testing.T) {
|
||||||
|
var (
|
||||||
|
defaultHTTPHost = "tcp://127.0.0.1:2376"
|
||||||
|
)
|
||||||
|
invalids := map[string]string{
|
||||||
|
"0.0.0.0": "Invalid bind address format: 0.0.0.0",
|
||||||
|
"tcp:a.b.c.d": "Invalid bind address format: tcp:a.b.c.d",
|
||||||
|
"tcp:a.b.c.d/path": "Invalid bind address format: tcp:a.b.c.d/path",
|
||||||
|
"udp://127.0.0.1": "Invalid proto, expected tcp: udp://127.0.0.1",
|
||||||
|
"udp://127.0.0.1:2375": "Invalid proto, expected tcp: udp://127.0.0.1:2375",
|
||||||
|
}
|
||||||
|
valids := map[string]string{
|
||||||
|
"": defaultHTTPHost,
|
||||||
|
"tcp://": defaultHTTPHost,
|
||||||
|
"0.0.0.1:": "tcp://0.0.0.1:2376",
|
||||||
|
"0.0.0.1:5555": "tcp://0.0.0.1:5555",
|
||||||
|
"0.0.0.1:5555/path": "tcp://0.0.0.1:5555/path",
|
||||||
|
":6666": "tcp://127.0.0.1:6666",
|
||||||
|
":6666/path": "tcp://127.0.0.1:6666/path",
|
||||||
|
"tcp://:7777": "tcp://127.0.0.1:7777",
|
||||||
|
"tcp://:7777/path": "tcp://127.0.0.1:7777/path",
|
||||||
|
"[::1]:": "tcp://[::1]:2376",
|
||||||
|
"[::1]:5555": "tcp://[::1]:5555",
|
||||||
|
"[::1]:5555/path": "tcp://[::1]:5555/path",
|
||||||
|
"[0:0:0:0:0:0:0:1]:": "tcp://[0:0:0:0:0:0:0:1]:2376",
|
||||||
|
"[0:0:0:0:0:0:0:1]:5555": "tcp://[0:0:0:0:0:0:0:1]:5555",
|
||||||
|
"[0:0:0:0:0:0:0:1]:5555/path": "tcp://[0:0:0:0:0:0:0:1]:5555/path",
|
||||||
|
"localhost:": "tcp://localhost:2376",
|
||||||
|
"localhost:5555": "tcp://localhost:5555",
|
||||||
|
"localhost:5555/path": "tcp://localhost:5555/path",
|
||||||
|
}
|
||||||
|
for invalidAddr, expectedError := range invalids {
|
||||||
|
if addr, err := parseTCPAddr(invalidAddr, defaultHTTPHost); err == nil || err.Error() != expectedError {
|
||||||
|
t.Errorf("tcp %v address expected error %v return, got %s and addr %v", invalidAddr, expectedError, err, addr)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for validAddr, expectedAddr := range valids {
|
||||||
|
if addr, err := parseTCPAddr(validAddr, defaultHTTPHost); err != nil || addr != expectedAddr {
|
||||||
|
t.Errorf("%v -> expected %v, got %v and addr %v", validAddr, expectedAddr, err, addr)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestParseInvalidUnixAddrInvalid(t *testing.T) {
|
||||||
|
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" {
|
||||||
|
t.Fatalf("Expected an error, got %v", err)
|
||||||
|
}
|
||||||
|
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" {
|
||||||
|
t.Fatalf("Expected an error, got %v", err)
|
||||||
|
}
|
||||||
|
if v, err := parseUnixAddr("", "/var/run/docker.sock"); err != nil || v != "unix:///var/run/docker.sock" {
|
||||||
|
t.Fatalf("Expected an %v, got %v", v, "unix:///var/run/docker.sock")
|
||||||
|
}
|
||||||
|
}
|
36
opts/opts.go
36
opts/opts.go
|
@ -17,22 +17,6 @@ import (
|
||||||
var (
|
var (
|
||||||
alphaRegexp = regexp.MustCompile(`[a-zA-Z]`)
|
alphaRegexp = regexp.MustCompile(`[a-zA-Z]`)
|
||||||
domainRegexp = regexp.MustCompile(`^(:?(:?[a-zA-Z0-9]|(:?[a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9]))(:?\.(:?[a-zA-Z0-9]|(:?[a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9])))*)\.?\s*$`)
|
domainRegexp = regexp.MustCompile(`^(:?(:?[a-zA-Z0-9]|(:?[a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9]))(:?\.(:?[a-zA-Z0-9]|(:?[a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9])))*)\.?\s*$`)
|
||||||
// DefaultHTTPPort Default HTTP Port used if only the protocol is provided to -H flag e.g. docker daemon -H tcp://
|
|
||||||
// TODO Windows. DefaultHTTPPort is only used on Windows if a -H parameter
|
|
||||||
// is not supplied. A better longer term solution would be to use a named
|
|
||||||
// pipe as the default on the Windows daemon.
|
|
||||||
// These are the IANA registered port numbers for use with Docker
|
|
||||||
// see http://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.xhtml?search=docker
|
|
||||||
DefaultHTTPPort = 2375 // Default HTTP Port
|
|
||||||
// DefaultTLSHTTPPort Default HTTP Port used when TLS enabled
|
|
||||||
DefaultTLSHTTPPort = 2376 // Default TLS encrypted HTTP Port
|
|
||||||
// DefaultUnixSocket Path for the unix socket.
|
|
||||||
// Docker daemon by default always listens on the default unix socket
|
|
||||||
DefaultUnixSocket = "/var/run/docker.sock"
|
|
||||||
// DefaultTCPHost constant defines the default host string used by docker on Windows
|
|
||||||
DefaultTCPHost = fmt.Sprintf("tcp://%s:%d", DefaultHTTPHost, DefaultHTTPPort)
|
|
||||||
// DefaultTLSHost constant defines the default host string used by docker for TLS sockets
|
|
||||||
DefaultTLSHost = fmt.Sprintf("tcp://%s:%d", DefaultHTTPHost, DefaultTLSHTTPPort)
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// ListOpts holds a list of values and a validation function.
|
// ListOpts holds a list of values and a validation function.
|
||||||
|
@ -391,26 +375,6 @@ func ValidateLabel(val string) (string, error) {
|
||||||
return val, nil
|
return val, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// ValidateHost validates that the specified string is a valid host and returns it.
|
|
||||||
func ValidateHost(val string) (string, error) {
|
|
||||||
_, err := parsers.ParseDockerDaemonHost(DefaultTCPHost, DefaultTLSHost, DefaultUnixSocket, "", val)
|
|
||||||
if err != nil {
|
|
||||||
return val, err
|
|
||||||
}
|
|
||||||
// Note: unlike most flag validators, we don't return the mutated value here
|
|
||||||
// we need to know what the user entered later (using ParseHost) to adjust for tls
|
|
||||||
return val, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// ParseHost and set defaults for a Daemon host string
|
|
||||||
func ParseHost(defaultHost, val string) (string, error) {
|
|
||||||
host, err := parsers.ParseDockerDaemonHost(DefaultTCPHost, DefaultTLSHost, DefaultUnixSocket, defaultHost, val)
|
|
||||||
if err != nil {
|
|
||||||
return val, err
|
|
||||||
}
|
|
||||||
return host, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func doesEnvExist(name string) bool {
|
func doesEnvExist(name string) bool {
|
||||||
for _, entry := range os.Environ() {
|
for _, entry := range os.Environ() {
|
||||||
parts := strings.SplitN(entry, "=", 2)
|
parts := strings.SplitN(entry, "=", 2)
|
||||||
|
|
|
@ -3,7 +3,6 @@ package opts
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
"runtime"
|
|
||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
)
|
)
|
||||||
|
@ -372,51 +371,6 @@ func TestValidateLabel(t *testing.T) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestParseHost(t *testing.T) {
|
|
||||||
invalid := map[string]string{
|
|
||||||
"anything": "Invalid bind address format: anything",
|
|
||||||
"something with spaces": "Invalid bind address format: something with spaces",
|
|
||||||
"://": "Invalid bind address format: ://",
|
|
||||||
"unknown://": "Invalid bind address format: unknown://",
|
|
||||||
"tcp://:port": "Invalid bind address format: :port",
|
|
||||||
"tcp://invalid": "Invalid bind address format: invalid",
|
|
||||||
"tcp://invalid:port": "Invalid bind address format: invalid:port",
|
|
||||||
}
|
|
||||||
const defaultHTTPHost = "tcp://127.0.0.1:2375"
|
|
||||||
var defaultHOST = "unix:///var/run/docker.sock"
|
|
||||||
|
|
||||||
if runtime.GOOS == "windows" {
|
|
||||||
defaultHOST = defaultHTTPHost
|
|
||||||
}
|
|
||||||
valid := map[string]string{
|
|
||||||
"": defaultHOST,
|
|
||||||
"fd://": "fd://",
|
|
||||||
"fd://something": "fd://something",
|
|
||||||
"tcp://host:": "tcp://host:2375",
|
|
||||||
"tcp://": "tcp://localhost:2375",
|
|
||||||
"tcp://:2375": "tcp://localhost:2375", // default ip address
|
|
||||||
"tcp://:2376": "tcp://localhost:2376", // default ip address
|
|
||||||
"tcp://0.0.0.0:8080": "tcp://0.0.0.0:8080",
|
|
||||||
"tcp://192.168.0.0:12000": "tcp://192.168.0.0:12000",
|
|
||||||
"tcp://192.168:8080": "tcp://192.168:8080",
|
|
||||||
"tcp://0.0.0.0:1234567890": "tcp://0.0.0.0:1234567890", // yeah it's valid :P
|
|
||||||
"tcp://docker.com:2375": "tcp://docker.com:2375",
|
|
||||||
"unix://": "unix:///var/run/docker.sock", // default unix:// value
|
|
||||||
"unix://path/to/socket": "unix://path/to/socket",
|
|
||||||
}
|
|
||||||
|
|
||||||
for value, errorMessage := range invalid {
|
|
||||||
if _, err := ParseHost(defaultHTTPHost, value); err == nil || err.Error() != errorMessage {
|
|
||||||
t.Fatalf("Expected an error for %v with [%v], got [%v]", value, errorMessage, err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for value, expected := range valid {
|
|
||||||
if actual, err := ParseHost(defaultHTTPHost, value); err != nil || actual != expected {
|
|
||||||
t.Fatalf("Expected for %v [%v], got [%v, %v]", value, expected, actual, err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func logOptsValidator(val string) (string, error) {
|
func logOptsValidator(val string) (string, error) {
|
||||||
allowedKeys := map[string]string{"max-size": "1", "max-file": "2"}
|
allowedKeys := map[string]string{"max-size": "1", "max-file": "2"}
|
||||||
vals := strings.Split(val, "=")
|
vals := strings.Split(val, "=")
|
||||||
|
|
Loading…
Reference in New Issue