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