@@ -11,20 +11,18 @@ import (
1111 "net"
1212 "net/http"
1313 "net/http/httptest"
14+ "net/url"
1415 "os"
1516 "os/signal"
17+ "strconv"
1618 "strings"
1719 "syscall"
1820 "time"
1921
2022 "github.com/BurntSushi/toml"
21- "github.com/docker/docker/opts "
23+ "github.com/docker/docker/api/types/network "
2224 "github.com/docker/docker/pkg/discovery"
2325 "github.com/docker/docker/pkg/reexec"
24- "github.com/urfave/cli"
25-
26- "github.com/docker/docker/api/types/network"
27- "github.com/docker/docker/pkg/term"
2826 "github.com/docker/libnetwork"
2927 "github.com/docker/libnetwork/api"
3028 "github.com/docker/libnetwork/cluster"
@@ -36,7 +34,9 @@ import (
3634 "github.com/docker/libnetwork/options"
3735 "github.com/docker/libnetwork/types"
3836 "github.com/gorilla/mux"
37+ "github.com/moby/term"
3938 "github.com/sirupsen/logrus"
39+ "github.com/urfave/cli"
4040)
4141
4242const (
@@ -416,7 +416,7 @@ func startTestDriver() error {
416416}
417417
418418func newDnetConnection (val string ) (* dnetConnection , error ) {
419- url , err := opts . ParseHost ( false , false , val )
419+ url , err := parseHost ( val )
420420 if err != nil {
421421 return nil , err
422422 }
@@ -431,6 +431,75 @@ func newDnetConnection(val string) (*dnetConnection, error) {
431431 return & dnetConnection {protoAddrParts [0 ], protoAddrParts [1 ], & NetworkOrchestration {}, make (chan cluster.ConfigEventType , 10 )}, nil
432432}
433433
434+ const (
435+ defaultUnixSocket = "unix:///var/run/docker.sock"
436+ defaultTCPHost = "tcp://localhost:2375"
437+ )
438+
439+ // parseHost and set defaults for a Daemon host string.
440+ func parseHost (val string ) (string , error ) {
441+ host := strings .TrimSpace (val )
442+ if host == "" {
443+ return defaultUnixSocket , nil
444+ }
445+
446+ addrParts := strings .SplitN (host , "://" , 2 )
447+ if len (addrParts ) == 1 && addrParts [0 ] != "" {
448+ addrParts = []string {"tcp" , addrParts [0 ]}
449+ }
450+ if addrParts [0 ] != "tcp" {
451+ return "" , errors .New ("dnet currently only supports tcp transport" )
452+ }
453+
454+ return parseTCPAddr (addrParts [1 ], defaultTCPHost )
455+ }
456+
457+ // parseTCPAddr parses and validates that the specified address is a valid TCP
458+ // address. It returns a formatted TCP address, either using the address parsed
459+ // from tryAddr, or the contents of defaultAddr if tryAddr is a blank string.
460+ // tryAddr is expected to have already been Trim()'d
461+ // defaultAddr must be in the full `tcp://host:port` form
462+ func parseTCPAddr (tryAddr string , defaultAddr string ) (string , error ) {
463+ if tryAddr == "" || tryAddr == "tcp://" {
464+ return defaultAddr , nil
465+ }
466+ addr := strings .TrimPrefix (tryAddr , "tcp://" )
467+ if strings .Contains (addr , "://" ) || addr == "" {
468+ return "" , fmt .Errorf ("Invalid proto, expected tcp: %s" , tryAddr )
469+ }
470+
471+ defaultAddr = strings .TrimPrefix (defaultAddr , "tcp://" )
472+ defaultHost , defaultPort , err := net .SplitHostPort (defaultAddr )
473+ if err != nil {
474+ return "" , err
475+ }
476+ u , err := url .Parse ("tcp://" + addr )
477+ if err != nil {
478+ return "" , err
479+ }
480+ host , port , err := net .SplitHostPort (u .Host )
481+ if err != nil {
482+ // try port addition once
483+ host , port , err = net .SplitHostPort (net .JoinHostPort (u .Host , defaultPort ))
484+ }
485+ if err != nil {
486+ return "" , fmt .Errorf ("Invalid bind address format: %s" , tryAddr )
487+ }
488+
489+ if host == "" {
490+ host = defaultHost
491+ }
492+ if port == "" {
493+ port = defaultPort
494+ }
495+ p , err := strconv .Atoi (port )
496+ if err != nil && p == 0 {
497+ return "" , fmt .Errorf ("Invalid bind address format: %s" , tryAddr )
498+ }
499+
500+ return fmt .Sprintf ("tcp://%s%s" , net .JoinHostPort (host , port ), u .Path ), nil
501+ }
502+
434503func (d * dnetConnection ) httpCall (method , path string , data interface {}, headers map [string ][]string ) (io.ReadCloser , http.Header , int , error ) {
435504 var in io.Reader
436505 in , err := encodeData (data )
0 commit comments