diff --git a/api/client.go b/api/client/client.go similarity index 98% rename from api/client.go rename to api/client/client.go index 86858d0b30..29b49464c4 100644 --- a/api/client.go +++ b/api/client/client.go @@ -1,4 +1,4 @@ -package api +package client import ( "bufio" @@ -8,6 +8,7 @@ import ( "encoding/json" "errors" "fmt" + "github.com/dotcloud/docker/api" "github.com/dotcloud/docker/archive" "github.com/dotcloud/docker/dockerversion" "github.com/dotcloud/docker/engine" @@ -81,7 +82,7 @@ func (cli *DockerCli) CmdHelp(args ...string) error { return nil } } - help := fmt.Sprintf("Usage: docker [OPTIONS] COMMAND [arg...]\n -H=[unix://%s]: tcp://host:port to bind/connect to or unix://path/to/socket to use\n\nA self-sufficient runtime for linux containers.\n\nCommands:\n", DEFAULTUNIXSOCKET) + help := fmt.Sprintf("Usage: docker [OPTIONS] COMMAND [arg...]\n -H=[unix://%s]: tcp://host:port to bind/connect to or unix://path/to/socket to use\n\nA self-sufficient runtime for linux containers.\n\nCommands:\n", api.DEFAULTUNIXSOCKET) for _, command := range [][]string{ {"attach", "Attach to a running container"}, {"build", "Build a container from a Dockerfile"}, @@ -610,7 +611,7 @@ func (cli *DockerCli) CmdStart(args ...string) error { return err } - container := &Container{} + container := &api.Container{} err = json.Unmarshal(body, container) if err != nil { return err @@ -797,9 +798,13 @@ func (cli *DockerCli) CmdPort(args ...string) error { return nil } - port := cmd.Arg(1) - proto := "tcp" - parts := strings.SplitN(port, "/", 2) + var ( + port = cmd.Arg(1) + proto = "tcp" + parts = strings.SplitN(port, "/", 2) + container api.Container + ) + if len(parts) == 2 && len(parts[1]) != 0 { port = parts[0] proto = parts[1] @@ -808,13 +813,13 @@ func (cli *DockerCli) CmdPort(args ...string) error { if err != nil { return err } - var out Container - err = json.Unmarshal(body, &out) + + err = json.Unmarshal(body, &container) if err != nil { return err } - if frontends, exists := out.NetworkSettings.Ports[nat.Port(port+"/"+proto)]; exists && frontends != nil { + if frontends, exists := container.NetworkSettings.Ports[nat.Port(port+"/"+proto)]; exists && frontends != nil { for _, frontend := range frontends { fmt.Fprintf(cli.out, "%s:%s\n", frontend.HostIp, frontend.HostPort) } @@ -1425,7 +1430,7 @@ func (cli *DockerCli) CmdPs(args ...string) error { outCommand = utils.Trunc(outCommand, 20) } ports.ReadListFrom([]byte(out.Get("Ports"))) - fmt.Fprintf(w, "%s\t%s\t%s\t%s ago\t%s\t%s\t%s\t", outID, out.Get("Image"), outCommand, utils.HumanDuration(time.Now().UTC().Sub(time.Unix(out.GetInt64("Created"), 0))), out.Get("Status"), displayablePorts(ports), strings.Join(outNames, ",")) + fmt.Fprintf(w, "%s\t%s\t%s\t%s ago\t%s\t%s\t%s\t", outID, out.Get("Image"), outCommand, utils.HumanDuration(time.Now().UTC().Sub(time.Unix(out.GetInt64("Created"), 0))), out.Get("Status"), api.DisplayablePorts(ports), strings.Join(outNames, ",")) if *size { if out.GetInt("SizeRootFs") > 0 { fmt.Fprintf(w, "%s (virtual %s)\n", utils.HumanSize(out.GetInt64("SizeRw")), utils.HumanSize(out.GetInt64("SizeRootFs"))) @@ -1606,7 +1611,7 @@ func (cli *DockerCli) CmdLogs(args ...string) error { return err } - container := &Container{} + container := &api.Container{} err = json.Unmarshal(body, container) if err != nil { return err @@ -1643,7 +1648,7 @@ func (cli *DockerCli) CmdAttach(args ...string) error { return err } - container := &Container{} + container := &api.Container{} err = json.Unmarshal(body, container) if err != nil { return err @@ -2159,7 +2164,7 @@ func (cli *DockerCli) call(method, path string, data interface{}, passAuthInfo b re := regexp.MustCompile("/+") path = re.ReplaceAllString(path, "/") - req, err := http.NewRequest(method, fmt.Sprintf("/v%s%s", APIVERSION, path), params) + req, err := http.NewRequest(method, fmt.Sprintf("/v%s%s", api.APIVERSION, path), params) if err != nil { return nil, -1, err } @@ -2236,7 +2241,7 @@ func (cli *DockerCli) stream(method, path string, in io.Reader, out io.Writer, h re := regexp.MustCompile("/+") path = re.ReplaceAllString(path, "/") - req, err := http.NewRequest(method, fmt.Sprintf("/v%s%s", APIVERSION, path), in) + req, err := http.NewRequest(method, fmt.Sprintf("/v%s%s", api.APIVERSION, path), in) if err != nil { return err } @@ -2281,7 +2286,7 @@ func (cli *DockerCli) stream(method, path string, in io.Reader, out io.Writer, h return fmt.Errorf("Error: %s", bytes.TrimSpace(body)) } - if MatchesContentType(resp.Header.Get("Content-Type"), "application/json") { + if api.MatchesContentType(resp.Header.Get("Content-Type"), "application/json") { return utils.DisplayJSONMessagesStream(resp.Body, out, cli.terminalFd, cli.isTerminal) } if _, err := io.Copy(out, resp.Body); err != nil { @@ -2300,7 +2305,7 @@ func (cli *DockerCli) hijack(method, path string, setRawTerminal bool, in io.Rea re := regexp.MustCompile("/+") path = re.ReplaceAllString(path, "/") - req, err := http.NewRequest(method, fmt.Sprintf("/v%s%s", APIVERSION, path), nil) + req, err := http.NewRequest(method, fmt.Sprintf("/v%s%s", api.APIVERSION, path), nil) if err != nil { return err } @@ -2484,7 +2489,7 @@ func getExitCode(cli *DockerCli, containerId string) (bool, int, error) { } return false, -1, nil } - c := &Container{} + c := &api.Container{} if err := json.Unmarshal(body, c); err != nil { return false, -1, err } diff --git a/api/common.go b/api/common.go index 5e5d2c5767..7273e5c56d 100644 --- a/api/common.go +++ b/api/common.go @@ -23,7 +23,7 @@ func ValidateHost(val string) (string, error) { } //TODO remove, used on < 1.5 in getContainersJSON -func displayablePorts(ports *engine.Table) string { +func DisplayablePorts(ports *engine.Table) string { result := []string{} ports.SetKey("PublicPort") ports.Sort() diff --git a/api/server.go b/api/server/server.go similarity index 98% rename from api/server.go rename to api/server/server.go index 29ea180030..18aefe42cd 100644 --- a/api/server.go +++ b/api/server/server.go @@ -1,4 +1,4 @@ -package api +package server import ( "bufio" @@ -10,14 +10,6 @@ import ( "encoding/json" "expvar" "fmt" - "github.com/dotcloud/docker/engine" - "github.com/dotcloud/docker/pkg/listenbuffer" - "github.com/dotcloud/docker/pkg/systemd" - "github.com/dotcloud/docker/pkg/user" - "github.com/dotcloud/docker/pkg/version" - "github.com/dotcloud/docker/registry" - "github.com/dotcloud/docker/utils" - "github.com/gorilla/mux" "io" "io/ioutil" "log" @@ -28,6 +20,16 @@ import ( "strconv" "strings" "syscall" + + "github.com/dotcloud/docker/api" + "github.com/dotcloud/docker/engine" + "github.com/dotcloud/docker/pkg/listenbuffer" + "github.com/dotcloud/docker/pkg/systemd" + "github.com/dotcloud/docker/pkg/user" + "github.com/dotcloud/docker/pkg/version" + "github.com/dotcloud/docker/registry" + "github.com/dotcloud/docker/utils" + "github.com/gorilla/mux" ) var ( @@ -315,7 +317,7 @@ func getContainersJSON(eng *engine.Engine, version version.Version, w http.Respo for _, out := range outs.Data { ports := engine.NewTable("", 0) ports.ReadListFrom([]byte(out.Get("Ports"))) - out.Set("Ports", displayablePorts(ports)) + out.Set("Ports", api.DisplayablePorts(ports)) } w.Header().Set("Content-Type", "application/json") if _, err = outs.WriteListTo(w); err != nil { @@ -638,7 +640,7 @@ func postContainersStart(eng *engine.Engine, version version.Version, w http.Res job := eng.Job("start", name) // allow a nil body for backwards compatibility if r.Body != nil { - if MatchesContentType(r.Header.Get("Content-Type"), "application/json") { + if api.MatchesContentType(r.Header.Get("Content-Type"), "application/json") { if err := job.DecodeEnv(r.Body); err != nil { return err } @@ -885,7 +887,7 @@ func postContainersCopy(eng *engine.Engine, version version.Version, w http.Resp var copyData engine.Env - if contentType := r.Header.Get("Content-Type"); MatchesContentType(contentType, "application/json") { + if contentType := r.Header.Get("Content-Type"); api.MatchesContentType(contentType, "application/json") { if err := copyData.Decode(r.Body); err != nil { return err } @@ -943,14 +945,14 @@ func makeHttpHandler(eng *engine.Engine, logging bool, localMethod string, local } version := version.Version(mux.Vars(r)["version"]) if version == "" { - version = APIVERSION + version = api.APIVERSION } if enableCors { writeCorsHeaders(w, r) } - if version.GreaterThan(APIVERSION) { - http.Error(w, fmt.Errorf("client and server don't have same version (client : %s, server: %s)", version, APIVERSION).Error(), http.StatusNotFound) + if version.GreaterThan(api.APIVERSION) { + http.Error(w, fmt.Errorf("client and server don't have same version (client : %s, server: %s)", version, api.APIVERSION).Error(), http.StatusNotFound) return } diff --git a/builtins/builtins.go b/builtins/builtins.go index 10ee9b19e6..109bc5b913 100644 --- a/builtins/builtins.go +++ b/builtins/builtins.go @@ -1,7 +1,7 @@ package builtins import ( - "github.com/dotcloud/docker/api" + api "github.com/dotcloud/docker/api/server" "github.com/dotcloud/docker/engine" "github.com/dotcloud/docker/runtime/networkdriver/bridge" "github.com/dotcloud/docker/server" diff --git a/docker/docker.go b/docker/docker.go index e4ce8a0b74..e96c173d30 100644 --- a/docker/docker.go +++ b/docker/docker.go @@ -10,6 +10,7 @@ import ( "strings" "github.com/dotcloud/docker/api" + "github.com/dotcloud/docker/api/client" "github.com/dotcloud/docker/builtins" "github.com/dotcloud/docker/dockerversion" "github.com/dotcloud/docker/engine" @@ -178,7 +179,7 @@ func main() { protoAddrParts := strings.SplitN(flHosts.GetAll()[0], "://", 2) var ( - cli *api.DockerCli + cli *client.DockerCli tlsConfig tls.Config ) tlsConfig.InsecureSkipVerify = true @@ -211,9 +212,9 @@ func main() { } if *flTls || *flTlsVerify { - cli = api.NewDockerCli(os.Stdin, os.Stdout, os.Stderr, protoAddrParts[0], protoAddrParts[1], &tlsConfig) + cli = client.NewDockerCli(os.Stdin, os.Stdout, os.Stderr, protoAddrParts[0], protoAddrParts[1], &tlsConfig) } else { - cli = api.NewDockerCli(os.Stdin, os.Stdout, os.Stderr, protoAddrParts[0], protoAddrParts[1], nil) + cli = client.NewDockerCli(os.Stdin, os.Stdout, os.Stderr, protoAddrParts[0], protoAddrParts[1], nil) } if err := cli.ParseCommands(flag.Args()...); err != nil {