| ... | ... |
@@ -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 {
|