From 3569d080afc721a1eb04ad4a65f1309b53da1238 Mon Sep 17 00:00:00 2001 From: Solomon Hykes Date: Mon, 25 Nov 2013 01:05:59 +0000 Subject: [PATCH] New engine command: 'wait' --- api.go | 14 +++++++++----- integration/server_test.go | 4 ++-- server.go | 20 ++++++++++++++++---- 3 files changed, 27 insertions(+), 11 deletions(-) diff --git a/api.go b/api.go index 0aa9695702..aebcd63533 100644 --- a/api.go +++ b/api.go @@ -710,14 +710,18 @@ func postContainersWait(srv *Server, version float64, w http.ResponseWriter, r * if vars == nil { return fmt.Errorf("Missing parameter") } - name := vars["name"] - - status, err := srv.ContainerWait(name) + job := srv.Eng.Job("wait", vars["name"]) + var statusStr string + job.Stdout.AddString(&statusStr) + if err := job.Run(); err != nil { + return err + } + // Parse a 16-bit encoded integer to map typical unix exit status. + status, err := strconv.ParseInt(statusStr, 10, 16) if err != nil { return err } - - return writeJSON(w, http.StatusOK, &APIWait{StatusCode: status}) + return writeJSON(w, http.StatusOK, &APIWait{StatusCode: int(status)}) } func postContainersResize(srv *Server, version float64, w http.ResponseWriter, r *http.Request, vars map[string]string) error { diff --git a/integration/server_test.go b/integration/server_test.go index 3e85effe8f..2f108c2b78 100644 --- a/integration/server_test.go +++ b/integration/server_test.go @@ -256,7 +256,7 @@ func TestRmi(t *testing.T) { t.Fatal(err) } - if _, err := srv.ContainerWait(containerID); err != nil { + if err := eng.Job("wait", containerID).Run(); err != nil { t.Fatal(err) } @@ -281,7 +281,7 @@ func TestRmi(t *testing.T) { t.Fatal(err) } - if _, err := srv.ContainerWait(containerID); err != nil { + if err := eng.Job("wait", containerID).Run(); err != nil { t.Fatal(err) } diff --git a/server.go b/server.go index 49b25f7098..640b4c44aa 100644 --- a/server.go +++ b/server.go @@ -82,6 +82,10 @@ func jobInitApi(job *engine.Job) engine.Status { job.Error(err) return engine.StatusErr } + if err := job.Eng.Register("wait", srv.ContainerWait); err != nil { + job.Error(err) + return engine.StatusErr + } return engine.StatusOK } @@ -1718,11 +1722,19 @@ func (srv *Server) ContainerStop(name string, t int) error { return nil } -func (srv *Server) ContainerWait(name string) (int, error) { - if container := srv.runtime.Get(name); container != nil { - return container.Wait(), nil +func (srv *Server) ContainerWait(job *engine.Job) engine.Status { + if len(job.Args) != 1 { + job.Errorf("Usage: %s", job.Name) + return engine.StatusErr } - return 0, fmt.Errorf("No such container: %s", name) + name := job.Args[0] + if container := srv.runtime.Get(name); container != nil { + status := container.Wait() + job.Printf("%d\n", status) + return engine.StatusOK + } + job.Errorf("%s: no such container: %s", job.Name, name) + return engine.StatusErr } func (srv *Server) ContainerResize(name string, h, w int) error {