Browse code

Engine: new command 'stop' gracefully stops a container.

Solomon Hykes authored on 2013/11/17 12:00:16
Showing 3 changed files
... ...
@@ -683,17 +683,14 @@ func postContainersStop(srv *Server, version float64, w http.ResponseWriter, r *
683 683
 	if err := parseForm(r); err != nil {
684 684
 		return err
685 685
 	}
686
-	t, err := strconv.Atoi(r.Form.Get("t"))
687
-	if err != nil || t < 0 {
688
-		t = 10
689
-	}
690
-
691 686
 	if vars == nil {
692 687
 		return fmt.Errorf("Missing parameter")
693 688
 	}
694
-	name := vars["name"]
695
-
696
-	if err := srv.ContainerStop(name, t); err != nil {
689
+	job := srv.Eng.Job("stop", vars["name"])
690
+	if t := r.Form.Get("t"); t != "" {
691
+		job.Args = append(job.Args, t)
692
+	}
693
+	if err := job.Run(); err != nil {
697 694
 		return err
698 695
 	}
699 696
 	w.WriteHeader(http.StatusNoContent)
... ...
@@ -128,8 +128,7 @@ func TestCreateRmVolumes(t *testing.T) {
128 128
 		t.Fatal(err)
129 129
 	}
130 130
 
131
-	err = srv.ContainerStop(id, 1)
132
-	if err != nil {
131
+	if err := eng.Job("stop", id, "1").Run(); err != nil {
133 132
 		t.Fatal(err)
134 133
 	}
135 134
 
... ...
@@ -187,7 +186,7 @@ func TestCreateStartRestartStopStartKillRm(t *testing.T) {
187 187
 		t.Fatal(err)
188 188
 	}
189 189
 
190
-	if err := srv.ContainerStop(id, 15); err != nil {
190
+	if err := eng.Job("stop", id, "15").Run(); err != nil {
191 191
 		t.Fatal(err)
192 192
 	}
193 193
 
... ...
@@ -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
... ...
@@ -1713,16 +1717,34 @@ func (srv *Server) ContainerStart(job *engine.Job) engine.Status {
1713 1713
 	return engine.StatusOK
1714 1714
 }
1715 1715
 
1716
-func (srv *Server) ContainerStop(name string, t int) error {
1716
+func (srv *Server) ContainerStop(job *engine.Job) engine.Status {
1717
+	if len(job.Args) < 1 {
1718
+		job.Errorf("Not enough arguments. Usage: %s CONTAINER TIMEOUT\n", job.Name)
1719
+		return engine.StatusErr
1720
+	}
1721
+	name := job.Args[0]
1722
+	var t uint64
1723
+	if len(job.Args) == 2 {
1724
+		var err error
1725
+		t, err = strconv.ParseUint(job.Args[1], 10, 32)
1726
+		if err != nil {
1727
+			job.Errorf("Invalid delay format: %s. Please provide an integer number of seconds.\n", job.Args[1])
1728
+			return engine.StatusErr
1729
+		}
1730
+	} else {
1731
+		t = 10
1732
+	}
1717 1733
 	if container := srv.runtime.Get(name); container != nil {
1718
-		if err := container.Stop(t); err != nil {
1719
-			return fmt.Errorf("Cannot stop container %s: %s", name, err)
1734
+		if err := container.Stop(int(t)); err != nil {
1735
+			job.Errorf("Cannot stop container %s: %s\n", name, err)
1736
+			return engine.StatusErr
1720 1737
 		}
1721 1738
 		srv.LogEvent("stop", container.ID, srv.runtime.repositories.ImageName(container.Image))
1722 1739
 	} else {
1723
-		return fmt.Errorf("No such container: %s", name)
1740
+		job.Errorf("No such container: %s\n", name)
1741
+		return engine.StatusErr
1724 1742
 	}
1725
-	return nil
1743
+	return engine.StatusOK
1726 1744
 }
1727 1745
 
1728 1746
 func (srv *Server) ContainerWait(job *engine.Job) engine.Status {