From 50bb26ecb8a7e7202470d754c65707298fe9dd4d Mon Sep 17 00:00:00 2001 From: Victor Vieux Date: Thu, 20 Jun 2013 14:19:50 +0000 Subject: [PATCH 1/4] add ps -s Upstream-commit: bd04d7d475e6497070b3144e6526566b066674cf Component: engine --- components/engine/api.go | 6 +++++- components/engine/commands.go | 21 +++++++++++++++++---- components/engine/server.go | 7 ++++--- 3 files changed, 26 insertions(+), 8 deletions(-) diff --git a/components/engine/api.go b/components/engine/api.go index e870ca7723..4f08b2aae6 100644 --- a/components/engine/api.go +++ b/components/engine/api.go @@ -248,6 +248,10 @@ func getContainersJSON(srv *Server, version float64, w http.ResponseWriter, r *h if err != nil { return err } + size, err := getBoolParam(r.Form.Get("size")) + if err != nil { + return err + } since := r.Form.Get("since") before := r.Form.Get("before") n, err := strconv.Atoi(r.Form.Get("limit")) @@ -255,7 +259,7 @@ func getContainersJSON(srv *Server, version float64, w http.ResponseWriter, r *h n = -1 } - outs := srv.Containers(all, n, since, before) + outs := srv.Containers(all, size, n, since, before) b, err := json.Marshal(outs) if err != nil { return err diff --git a/components/engine/commands.go b/components/engine/commands.go index 05a484ddb1..2f84f357d1 100644 --- a/components/engine/commands.go +++ b/components/engine/commands.go @@ -867,6 +867,7 @@ func (cli *DockerCli) CmdImages(args ...string) error { func (cli *DockerCli) CmdPs(args ...string) error { cmd := Subcmd("ps", "[OPTIONS]", "List containers") quiet := cmd.Bool("q", false, "Only display numeric IDs") + size := cmd.Bool("s", false, "Display sizes") all := cmd.Bool("a", false, "Show all containers. Only running containers are shown by default.") noTrunc := cmd.Bool("notrunc", false, "Don't truncate output") nLatest := cmd.Bool("l", false, "Show only the latest created container, include non-running ones.") @@ -893,6 +894,9 @@ func (cli *DockerCli) CmdPs(args ...string) error { if *before != "" { v.Set("before", *before) } + if *size { + v.Set("size", "1") + } body, _, err := cli.call("GET", "/containers/json?"+v.Encode(), nil) if err != nil { @@ -906,7 +910,12 @@ func (cli *DockerCli) CmdPs(args ...string) error { } w := tabwriter.NewWriter(os.Stdout, 20, 1, 3, ' ', 0) if !*quiet { - fmt.Fprintln(w, "ID\tIMAGE\tCOMMAND\tCREATED\tSTATUS\tPORTS\tSIZE") + fmt.Fprint(w, "ID\tIMAGE\tCOMMAND\tCREATED\tSTATUS\tPORTS") + if *size { + fmt.Fprintln(w, "\tSIZE") + } else { + fmt.Fprint(w, "\n") + } } for _, out := range outs { @@ -916,10 +925,14 @@ func (cli *DockerCli) CmdPs(args ...string) error { } else { fmt.Fprintf(w, "%s\t%s\t%s\t%s ago\t%s\t%s\t", utils.TruncateID(out.ID), out.Image, utils.Trunc(out.Command, 20), utils.HumanDuration(time.Now().Sub(time.Unix(out.Created, 0))), out.Status, out.Ports) } - if out.SizeRootFs > 0 { - fmt.Fprintf(w, "%s (virtual %s)\n", utils.HumanSize(out.SizeRw), utils.HumanSize(out.SizeRootFs)) + if *size { + if out.SizeRootFs > 0 { + fmt.Fprintf(w, "%s (virtual %s)\n", utils.HumanSize(out.SizeRw), utils.HumanSize(out.SizeRootFs)) + } else { + fmt.Fprintf(w, "%s\n", utils.HumanSize(out.SizeRw)) + } } else { - fmt.Fprintf(w, "%s\n", utils.HumanSize(out.SizeRw)) + fmt.Fprint(w, "\n") } } else { if *noTrunc { diff --git a/components/engine/server.go b/components/engine/server.go index e9be3a1668..f70ea755fe 100644 --- a/components/engine/server.go +++ b/components/engine/server.go @@ -251,7 +251,7 @@ func (srv *Server) ContainerChanges(name string) ([]Change, error) { return nil, fmt.Errorf("No such container: %s", name) } -func (srv *Server) Containers(all bool, n int, since, before string) []APIContainers { +func (srv *Server) Containers(all, size bool, n int, since, before string) []APIContainers { var foundBefore bool var displayed int retContainers := []APIContainers{} @@ -285,8 +285,9 @@ func (srv *Server) Containers(all bool, n int, since, before string) []APIContai c.Created = container.Created.Unix() c.Status = container.State.String() c.Ports = container.NetworkSettings.PortMappingHuman() - c.SizeRw, c.SizeRootFs = container.GetSize() - + if size { + c.SizeRw, c.SizeRootFs = container.GetSize() + } retContainers = append(retContainers, c) } return retContainers From 63220aff61ff59b2b4096bab79c14253c61d530e Mon Sep 17 00:00:00 2001 From: Victor Vieux Date: Thu, 20 Jun 2013 14:34:58 +0000 Subject: [PATCH 2/4] use strconv.ParseBool in getBoolParam Upstream-commit: da199846d2813467ab8bae629336f3989f285ce9 Component: engine --- components/engine/api.go | 9 ++++----- components/engine/api_test.go | 24 ++++++++++++++++++++++++ 2 files changed, 28 insertions(+), 5 deletions(-) diff --git a/components/engine/api.go b/components/engine/api.go index 4f08b2aae6..ea26ba2921 100644 --- a/components/engine/api.go +++ b/components/engine/api.go @@ -59,14 +59,13 @@ func writeJSON(w http.ResponseWriter, b []byte) { w.Write(b) } -// FIXME: Use stvconv.ParseBool() instead? func getBoolParam(value string) (bool, error) { - if value == "1" || strings.ToLower(value) == "true" { - return true, nil - } - if value == "" || value == "0" || strings.ToLower(value) == "false" { + if value == "" { return false, nil } + if ret, err := strconv.ParseBool(value); err == nil { + return ret, err + } return false, fmt.Errorf("Bad parameter") } diff --git a/components/engine/api_test.go b/components/engine/api_test.go index 40b31d4961..12ea5ee962 100644 --- a/components/engine/api_test.go +++ b/components/engine/api_test.go @@ -17,6 +17,30 @@ import ( "time" ) +func TestGetBoolParam(t *testing.T) { + if ret, err := getBoolParam("true"); err != nil || !ret { + t.Fatalf("true -> true, nil | got %b %s", ret, err) + } + if ret, err := getBoolParam("True"); err != nil || !ret { + t.Fatalf("True -> true, nil | got %b %s", ret, err) + } + if ret, err := getBoolParam("1"); err != nil || !ret { + t.Fatalf("1 -> true, nil | got %b %s", ret, err) + } + if ret, err := getBoolParam(""); err != nil || ret { + t.Fatalf("\"\" -> false, nil | got %b %s", ret, err) + } + if ret, err := getBoolParam("false"); err != nil || ret { + t.Fatalf("false -> false, nil | got %b %s", ret, err) + } + if ret, err := getBoolParam("0"); err != nil || ret { + t.Fatalf("0 -> false, nil | got %b %s", ret, err) + } + if ret, err := getBoolParam("faux"); err == nil || ret { + t.Fatalf("faux -> false, err | got %b %s", ret, err) + } +} + func TestPostAuth(t *testing.T) { runtime, err := newTestRuntime() if err != nil { From 3574da6a31b165d19e7bc8132d974f6fd766b500 Mon Sep 17 00:00:00 2001 From: Victor Vieux Date: Fri, 21 Jun 2013 09:06:09 +0000 Subject: [PATCH 3/4] inverse if Upstream-commit: 5b3ad0023b95823f15fe72605fa9b2786ce5035b Component: engine --- components/engine/api.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/components/engine/api.go b/components/engine/api.go index ea26ba2921..fa29f6e0f5 100644 --- a/components/engine/api.go +++ b/components/engine/api.go @@ -63,10 +63,11 @@ func getBoolParam(value string) (bool, error) { if value == "" { return false, nil } - if ret, err := strconv.ParseBool(value); err == nil { + if ret, err := strconv.ParseBool(value); err != nil { + return false, fmt.Errorf("Bad parameter") + } else { return ret, err } - return false, fmt.Errorf("Bad parameter") } func getAuth(srv *Server, version float64, w http.ResponseWriter, r *http.Request, vars map[string]string) error { From b45a456a15900a627f38ac7478b738da69bf9022 Mon Sep 17 00:00:00 2001 From: Victor Vieux Date: Fri, 21 Jun 2013 22:55:33 +0000 Subject: [PATCH 4/4] consistent codebase fix Upstream-commit: 1581ed52ba07a869b5902afbb7c7bb01bb1e4a63 Component: engine --- components/engine/api.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/components/engine/api.go b/components/engine/api.go index fa29f6e0f5..3a789920ac 100644 --- a/components/engine/api.go +++ b/components/engine/api.go @@ -63,11 +63,11 @@ func getBoolParam(value string) (bool, error) { if value == "" { return false, nil } - if ret, err := strconv.ParseBool(value); err != nil { + ret, err := strconv.ParseBool(value) + if err != nil { return false, fmt.Errorf("Bad parameter") - } else { - return ret, err } + return ret, nil } func getAuth(srv *Server, version float64, w http.ResponseWriter, r *http.Request, vars map[string]string) error {