Browse code

New engine command: 'wait'

Solomon Hykes authored on 2013/11/25 10:05:59
Showing 3 changed files
... ...
@@ -710,14 +710,18 @@ func postContainersWait(srv *Server, version float64, w http.ResponseWriter, r *
710 710
 	if vars == nil {
711 711
 		return fmt.Errorf("Missing parameter")
712 712
 	}
713
-	name := vars["name"]
714
-
715
-	status, err := srv.ContainerWait(name)
713
+	job := srv.Eng.Job("wait", vars["name"])
714
+	var statusStr string
715
+	job.Stdout.AddString(&statusStr)
716
+	if err := job.Run(); err != nil {
717
+		return err
718
+	}
719
+	// Parse a 16-bit encoded integer to map typical unix exit status.
720
+	status, err := strconv.ParseInt(statusStr, 10, 16)
716 721
 	if err != nil {
717 722
 		return err
718 723
 	}
719
-
720
-	return writeJSON(w, http.StatusOK, &APIWait{StatusCode: status})
724
+	return writeJSON(w, http.StatusOK, &APIWait{StatusCode: int(status)})
721 725
 }
722 726
 
723 727
 func postContainersResize(srv *Server, version float64, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
... ...
@@ -256,7 +256,7 @@ func TestRmi(t *testing.T) {
256 256
 		t.Fatal(err)
257 257
 	}
258 258
 
259
-	if _, err := srv.ContainerWait(containerID); err != nil {
259
+	if err := eng.Job("wait", containerID).Run(); err != nil {
260 260
 		t.Fatal(err)
261 261
 	}
262 262
 
... ...
@@ -281,7 +281,7 @@ func TestRmi(t *testing.T) {
281 281
 		t.Fatal(err)
282 282
 	}
283 283
 
284
-	if _, err := srv.ContainerWait(containerID); err != nil {
284
+	if err := eng.Job("wait", containerID).Run(); err != nil {
285 285
 		t.Fatal(err)
286 286
 	}
287 287
 
... ...
@@ -82,6 +82,10 @@ func jobInitApi(job *engine.Job) engine.Status {
82 82
 		job.Error(err)
83 83
 		return engine.StatusErr
84 84
 	}
85
+	if err := job.Eng.Register("wait", srv.ContainerWait); err != nil {
86
+		job.Error(err)
87
+		return engine.StatusErr
88
+	}
85 89
 	return engine.StatusOK
86 90
 }
87 91
 
... ...
@@ -1718,11 +1722,19 @@ func (srv *Server) ContainerStop(name string, t int) error {
1718 1718
 	return nil
1719 1719
 }
1720 1720
 
1721
-func (srv *Server) ContainerWait(name string) (int, error) {
1721
+func (srv *Server) ContainerWait(job *engine.Job) engine.Status {
1722
+	if len(job.Args) != 1 {
1723
+		job.Errorf("Usage: %s", job.Name)
1724
+		return engine.StatusErr
1725
+	}
1726
+	name := job.Args[0]
1722 1727
 	if container := srv.runtime.Get(name); container != nil {
1723
-		return container.Wait(), nil
1728
+		status := container.Wait()
1729
+		job.Printf("%d\n", status)
1730
+		return engine.StatusOK
1724 1731
 	}
1725
-	return 0, fmt.Errorf("No such container: %s", name)
1732
+	job.Errorf("%s: no such container: %s", job.Name, name)
1733
+	return engine.StatusErr
1726 1734
 }
1727 1735
 
1728 1736
 func (srv *Server) ContainerResize(name string, h, w int) error {