minor docker client refactoring
This commit is contained in:
parent
7dfc67113d
commit
8436bd0270
2 changed files with 43 additions and 100 deletions
|
@ -44,7 +44,7 @@ func NewHost(address string) *Client {
|
||||||
|
|
||||||
func NewClient(uri, cert, key string) (*Client, error) {
|
func NewClient(uri, cert, key string) (*Client, error) {
|
||||||
var host = GetHost(uri)
|
var host = GetHost(uri)
|
||||||
var proto, addr = GetProtoAddr(host)
|
var proto, addr = SplitProtoAddr(host)
|
||||||
|
|
||||||
var cli = new(Client)
|
var cli = new(Client)
|
||||||
cli.proto = proto
|
cli.proto = proto
|
||||||
|
@ -90,6 +90,48 @@ func NewClient(uri, cert, key string) (*Client, error) {
|
||||||
return cli, nil
|
return cli, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GetHost returns the Docker Host address in order to
|
||||||
|
// connect to the Docker Daemon. It implements a very
|
||||||
|
// simple set of fallthrough logic to determine which
|
||||||
|
// address to use.
|
||||||
|
func GetHost(host string) string {
|
||||||
|
// if a default value was provided this
|
||||||
|
// shoudl be used
|
||||||
|
if len(host) != 0 {
|
||||||
|
return host
|
||||||
|
}
|
||||||
|
// else attempt to use the DOCKER_HOST
|
||||||
|
// environment variable
|
||||||
|
var env = os.Getenv("DOCKER_HOST")
|
||||||
|
if len(env) != 0 {
|
||||||
|
return env
|
||||||
|
}
|
||||||
|
// else check to see if the default unix
|
||||||
|
// socket exists and return
|
||||||
|
_, err := os.Stat(DEFAULTUNIXSOCKET)
|
||||||
|
if err == nil {
|
||||||
|
return fmt.Sprintf("%s://%s", DEFAULTPROTOCOL, DEFAULTUNIXSOCKET)
|
||||||
|
}
|
||||||
|
// else return the standard TCP address
|
||||||
|
return fmt.Sprintf("tcp://0.0.0.0:%d", DEFAULTHTTPPORT)
|
||||||
|
}
|
||||||
|
|
||||||
|
// SplitProtoAddr is a helper function that splits
|
||||||
|
// a host into Protocol and Address.
|
||||||
|
func SplitProtoAddr(host string) (string, string) {
|
||||||
|
var parts = strings.Split(host, "://")
|
||||||
|
var proto, addr string
|
||||||
|
switch {
|
||||||
|
case len(parts) == 2:
|
||||||
|
proto = parts[0]
|
||||||
|
addr = parts[1]
|
||||||
|
default:
|
||||||
|
proto = "tcp"
|
||||||
|
addr = parts[0]
|
||||||
|
}
|
||||||
|
return proto, addr
|
||||||
|
}
|
||||||
|
|
||||||
type Client struct {
|
type Client struct {
|
||||||
tls *tls.Config
|
tls *tls.Config
|
||||||
trans *http.Transport
|
trans *http.Transport
|
||||||
|
@ -122,70 +164,6 @@ var (
|
||||||
ErrBadRequest = errors.New("Bad Request")
|
ErrBadRequest = errors.New("Bad Request")
|
||||||
)
|
)
|
||||||
|
|
||||||
func (c *Client) setHost(defaultUnixSocket string) {
|
|
||||||
c.proto = DEFAULTPROTOCOL
|
|
||||||
c.addr = defaultUnixSocket
|
|
||||||
|
|
||||||
if os.Getenv("DOCKER_HOST") != "" {
|
|
||||||
pieces := strings.Split(os.Getenv("DOCKER_HOST"), "://")
|
|
||||||
if len(pieces) == 2 {
|
|
||||||
c.proto = pieces[0]
|
|
||||||
c.addr = pieces[1]
|
|
||||||
} else if len(pieces) == 1 {
|
|
||||||
c.addr = pieces[0]
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// if the default socket doesn't exist then
|
|
||||||
// we'll try to connect to the default tcp address
|
|
||||||
if _, err := os.Stat(defaultUnixSocket); err != nil {
|
|
||||||
c.proto = "tcp"
|
|
||||||
c.addr = "0.0.0.0:2375"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetHost returns the Docker Host address in order to
|
|
||||||
// connect to the Docker Daemon. It implements a very
|
|
||||||
// simple set of fallthrough logic to determine which
|
|
||||||
// address to use.
|
|
||||||
func GetHost(host string) string {
|
|
||||||
// if a default value was provided this
|
|
||||||
// shoudl be used
|
|
||||||
if len(host) != 0 {
|
|
||||||
return host
|
|
||||||
}
|
|
||||||
// else attempt to use the DOCKER_HOST
|
|
||||||
// environment variable
|
|
||||||
var env = os.Getenv("DOCKER_HOST")
|
|
||||||
if len(env) != 0 {
|
|
||||||
return env
|
|
||||||
}
|
|
||||||
// else check to see if the default unix
|
|
||||||
// socket exists and return
|
|
||||||
_, err := os.Stat(DEFAULTUNIXSOCKET)
|
|
||||||
if err == nil {
|
|
||||||
return fmt.Sprintf("%s://%s", DEFAULTPROTOCOL, DEFAULTUNIXSOCKET)
|
|
||||||
}
|
|
||||||
// else return the standard TCP address
|
|
||||||
return fmt.Sprintf("tcp://0.0.0.0:%d", DEFAULTHTTPPORT)
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetProtoAddr is a helper function that splits
|
|
||||||
// a host into Protocol and Address.
|
|
||||||
func GetProtoAddr(host string) (string, string) {
|
|
||||||
var parts = strings.Split(host, "://")
|
|
||||||
var proto, addr string
|
|
||||||
switch {
|
|
||||||
case len(parts) == 2:
|
|
||||||
proto = parts[0]
|
|
||||||
addr = parts[1]
|
|
||||||
default:
|
|
||||||
proto = "tcp"
|
|
||||||
addr = parts[0]
|
|
||||||
}
|
|
||||||
return proto, addr
|
|
||||||
}
|
|
||||||
|
|
||||||
// helper function used to make HTTP requests to the Docker daemon.
|
// helper function used to make HTTP requests to the Docker daemon.
|
||||||
func (c *Client) do(method, path string, in, out interface{}) error {
|
func (c *Client) do(method, path string, in, out interface{}) error {
|
||||||
// if data input is provided, serialize to JSON
|
// if data input is provided, serialize to JSON
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
package docker
|
package docker
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"io/ioutil"
|
|
||||||
"os"
|
"os"
|
||||||
"testing"
|
"testing"
|
||||||
)
|
)
|
||||||
|
@ -31,37 +30,3 @@ func TestInvalidHostFromEnv(t *testing.T) {
|
||||||
t.Fail()
|
t.Fail()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestSocketHost(t *testing.T) {
|
|
||||||
// create temporary file to represent the docker socket
|
|
||||||
file, err := ioutil.TempFile("", "TestDefaultUnixHost")
|
|
||||||
if err != nil {
|
|
||||||
t.Fail()
|
|
||||||
}
|
|
||||||
file.Close()
|
|
||||||
defer os.Remove(file.Name())
|
|
||||||
|
|
||||||
client := &Client{}
|
|
||||||
client.setHost(file.Name())
|
|
||||||
|
|
||||||
if client.proto != "unix" {
|
|
||||||
t.Fail()
|
|
||||||
}
|
|
||||||
|
|
||||||
if client.addr != file.Name() {
|
|
||||||
t.Fail()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestDefaultTcpHost(t *testing.T) {
|
|
||||||
client := &Client{}
|
|
||||||
client.setHost("/tmp/missing_socket")
|
|
||||||
|
|
||||||
if client.proto != "tcp" {
|
|
||||||
t.Fail()
|
|
||||||
}
|
|
||||||
|
|
||||||
if client.addr != "0.0.0.0:2375" {
|
|
||||||
t.Fail()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
Loading…
Reference in a new issue