Browse code

Merge pull request #3175 from vieux/engine-job-stop

Move stop to job

Guillaume J. Charmes authored on 2013/12/14 07:15:58
Showing 5 changed files
... ...
@@ -678,17 +678,12 @@ func postContainersStop(srv *Server, version float64, w http.ResponseWriter, r *
678 678
 	if err := parseForm(r); err != nil {
679 679
 		return err
680 680
 	}
681
-	t, err := strconv.Atoi(r.Form.Get("t"))
682
-	if err != nil || t < 0 {
683
-		t = 10
684
-	}
685
-
686 681
 	if vars == nil {
687 682
 		return fmt.Errorf("Missing parameter")
688 683
 	}
689
-	name := vars["name"]
690
-
691
-	if err := srv.ContainerStop(name, t); err != nil {
684
+	job := srv.Eng.Job("stop", vars["name"])
685
+	job.Setenv("t", r.Form.Get("t"))
686
+	if err := job.Run(); err != nil {
692 687
 		return err
693 688
 	}
694 689
 	w.WriteHeader(http.StatusNoContent)
... ...
@@ -24,7 +24,7 @@ type Job struct {
24 24
 	Eng     *Engine
25 25
 	Name    string
26 26
 	Args    []string
27
-	env	*Env
27
+	env     *Env
28 28
 	Stdout  *Output
29 29
 	Stderr  *Output
30 30
 	Stdin   *Input
... ...
@@ -168,7 +168,7 @@ func Tail(src io.Reader, n int, dst *[]string) {
168 168
 // AddEnv starts a new goroutine which will decode all subsequent data
169 169
 // as a stream of json-encoded objects, and point `dst` to the last
170 170
 // decoded object.
171
-// The result `env` can be queried using the type-neutral Env interface. 
171
+// The result `env` can be queried using the type-neutral Env interface.
172 172
 // It is not safe to query `env` until the Output is closed.
173 173
 func (o *Output) AddEnv() (dst *Env, err error) {
174 174
 	src, err := o.AddPipe()
... ...
@@ -185,9 +185,8 @@ func (o *Output) AddEnv() (dst *Env, err error) {
185 185
 			if err != nil {
186 186
 				return
187 187
 			}
188
-			*dst= *env
188
+			*dst = *env
189 189
 		}
190 190
 	}()
191 191
 	return dst, nil
192 192
 }
193
-
... ...
@@ -129,8 +129,9 @@ func TestCreateRmVolumes(t *testing.T) {
129 129
 		t.Fatal(err)
130 130
 	}
131 131
 
132
-	err = srv.ContainerStop(id, 1)
133
-	if err != nil {
132
+	job = eng.Job("stop", id)
133
+	job.SetenvInt("t", 1)
134
+	if err := job.Run(); err != nil {
134 135
 		t.Fatal(err)
135 136
 	}
136 137
 
... ...
@@ -188,7 +189,9 @@ func TestCreateStartRestartStopStartKillRm(t *testing.T) {
188 188
 		t.Fatal(err)
189 189
 	}
190 190
 
191
-	if err := srv.ContainerStop(id, 15); err != nil {
191
+	job = eng.Job("stop", id)
192
+	job.SetenvInt("t", 15)
193
+	if err := job.Run(); err != nil {
192 194
 		t.Fatal(err)
193 195
 	}
194 196
 
... ...
@@ -79,6 +79,10 @@ func jobInitApi(job *engine.Job) engine.Status {
79 79
 		job.Error(err)
80 80
 		return engine.StatusErr
81 81
 	}
82
+	if err := job.Eng.Register("stop", srv.ContainerStop); err != nil {
83
+		job.Error(err)
84
+		return engine.StatusErr
85
+	}
82 86
 	if err := job.Eng.Register("start", srv.ContainerStart); err != nil {
83 87
 		job.Error(err)
84 88
 		return engine.StatusErr
... ...
@@ -1727,16 +1731,27 @@ func (srv *Server) ContainerStart(job *engine.Job) engine.Status {
1727 1727
 	return engine.StatusOK
1728 1728
 }
1729 1729
 
1730
-func (srv *Server) ContainerStop(name string, t int) error {
1730
+func (srv *Server) ContainerStop(job *engine.Job) engine.Status {
1731
+	if len(job.Args) != 1 {
1732
+		job.Errorf("Usage: %s CONTAINER\n", job.Name)
1733
+		return engine.StatusErr
1734
+	}
1735
+	name := job.Args[0]
1736
+	t := job.GetenvInt("t")
1737
+	if t == -1 {
1738
+		t = 10
1739
+	}
1731 1740
 	if container := srv.runtime.Get(name); container != nil {
1732
-		if err := container.Stop(t); err != nil {
1733
-			return fmt.Errorf("Cannot stop container %s: %s", name, err)
1741
+		if err := container.Stop(int(t)); err != nil {
1742
+			job.Errorf("Cannot stop container %s: %s\n", name, err)
1743
+			return engine.StatusErr
1734 1744
 		}
1735 1745
 		srv.LogEvent("stop", container.ID, srv.runtime.repositories.ImageName(container.Image))
1736 1746
 	} else {
1737
-		return fmt.Errorf("No such container: %s", name)
1747
+		job.Errorf("No such container: %s\n", name)
1748
+		return engine.StatusErr
1738 1749
 	}
1739
-	return nil
1750
+	return engine.StatusOK
1740 1751
 }
1741 1752
 
1742 1753
 func (srv *Server) ContainerWait(job *engine.Job) engine.Status {