diff --git a/api/server/server.go b/api/server/server.go index ed7dcfa5fa..b554d7d42b 100644 --- a/api/server/server.go +++ b/api/server/server.go @@ -858,16 +858,25 @@ func deleteContainers(eng *engine.Engine, version version.Version, w http.Respon if vars == nil { return fmt.Errorf("Missing parameter") } - job := eng.Job("rm", vars["name"]) - job.Setenv("forceRemove", r.Form.Get("force")) + name := vars["name"] + if name == "" { + return fmt.Errorf("Container name cannot be empty") + } - job.Setenv("removeVolume", r.Form.Get("v")) - job.Setenv("removeLink", r.Form.Get("link")) - if err := job.Run(); err != nil { + d := getDaemon(eng) + config := &daemon.ContainerRmConfig{ + ForceRemove: toBool(r.Form.Get("force")), + RemoveVolume: toBool(r.Form.Get("v")), + RemoveLink: toBool(r.Form.Get("link")), + } + + if err := d.ContainerRm(name, config); err != nil { return err } + w.WriteHeader(http.StatusNoContent) + return nil } diff --git a/api/server/server_unit_test.go b/api/server/server_unit_test.go index 607afbab46..88dadab6f5 100644 --- a/api/server/server_unit_test.go +++ b/api/server/server_unit_test.go @@ -286,29 +286,6 @@ func TestGetImagesByName(t *testing.T) { } } -func TestDeleteContainers(t *testing.T) { - eng := engine.New() - name := "foo" - var called bool - eng.Register("rm", func(job *engine.Job) error { - called = true - if len(job.Args) == 0 { - t.Fatalf("Job arguments is empty") - } - if job.Args[0] != name { - t.Fatalf("name != '%s': %#v", name, job.Args[0]) - } - return nil - }) - r := serveRequest("DELETE", "/containers/"+name, nil, eng, t) - if !called { - t.Fatalf("handler was not called") - } - if r.Code != http.StatusNoContent { - t.Fatalf("Got status %d, expected %d", r.Code, http.StatusNoContent) - } -} - func serveRequest(method, target string, body io.Reader, eng *engine.Engine, t *testing.T) *httptest.ResponseRecorder { return serveRequestUsingVersion(method, target, api.APIVERSION, body, eng, t) } diff --git a/daemon/daemon.go b/daemon/daemon.go index 44a59eac39..5493d23930 100644 --- a/daemon/daemon.go +++ b/daemon/daemon.go @@ -122,7 +122,6 @@ func (daemon *Daemon) Install(eng *engine.Engine) error { "container_inspect": daemon.ContainerInspect, "container_stats": daemon.ContainerStats, "create": daemon.ContainerCreate, - "rm": daemon.ContainerRm, "export": daemon.ContainerExport, "info": daemon.CmdInfo, "kill": daemon.ContainerKill, diff --git a/daemon/delete.go b/daemon/delete.go index eb93973aa8..d398741d75 100644 --- a/daemon/delete.go +++ b/daemon/delete.go @@ -6,24 +6,19 @@ import ( "path" "github.com/Sirupsen/logrus" - "github.com/docker/docker/engine" ) -func (daemon *Daemon) ContainerRm(job *engine.Job) error { - if len(job.Args) != 1 { - return fmt.Errorf("Not enough arguments. Usage: %s CONTAINER\n", job.Name) - } - name := job.Args[0] - removeVolume := job.GetenvBool("removeVolume") - removeLink := job.GetenvBool("removeLink") - forceRemove := job.GetenvBool("forceRemove") +type ContainerRmConfig struct { + ForceRemove, RemoveVolume, RemoveLink bool +} +func (daemon *Daemon) ContainerRm(name string, config *ContainerRmConfig) error { container, err := daemon.Get(name) if err != nil { return err } - if removeLink { + if config.RemoveLink { name, err := GetFullContainerName(name) if err != nil { return err @@ -55,7 +50,7 @@ func (daemon *Daemon) ContainerRm(job *engine.Job) error { // if stats are currently getting collected. daemon.statsCollector.stopCollection(container) if container.IsRunning() { - if forceRemove { + if config.ForceRemove { if err := container.Kill(); err != nil { return fmt.Errorf("Could not kill running container, cannot remove - %v", err) } @@ -64,7 +59,7 @@ func (daemon *Daemon) ContainerRm(job *engine.Job) error { } } - if forceRemove { + if config.ForceRemove { if err := daemon.ForceRm(container); err != nil { logrus.Errorf("Cannot destroy container %s: %v", name, err) } @@ -74,7 +69,7 @@ func (daemon *Daemon) ContainerRm(job *engine.Job) error { } } container.LogEvent("destroy") - if removeVolume { + if config.RemoveVolume { daemon.DeleteVolumes(container.VolumePaths()) } } diff --git a/integration/server_test.go b/integration/server_test.go index 9cdd3d774b..b2c4dd80a4 100644 --- a/integration/server_test.go +++ b/integration/server_test.go @@ -157,69 +157,6 @@ func TestRestartKillWait(t *testing.T) { }) } -func TestCreateStartRestartStopStartKillRm(t *testing.T) { - eng := NewTestEngine(t) - runtime := mkDaemonFromEngine(eng, t) - defer runtime.Nuke() - - config, hostConfig, _, err := parseRun([]string{"-i", unitTestImageID, "/bin/cat"}) - if err != nil { - t.Fatal(err) - } - - id := createTestContainer(eng, config, t) - containers, err := runtime.Containers(&daemon.ContainersConfig{All: true}) - - if len(containers) != 1 { - t.Errorf("Expected 1 container, %v found", len(containers)) - } - - job := eng.Job("start", id) - if err := job.ImportEnv(hostConfig); err != nil { - t.Fatal(err) - } - if err := job.Run(); err != nil { - t.Fatal(err) - } - - job = eng.Job("restart", id) - job.SetenvInt("t", 2) - if err := job.Run(); err != nil { - t.Fatal(err) - } - - job = eng.Job("stop", id) - job.SetenvInt("t", 2) - if err := job.Run(); err != nil { - t.Fatal(err) - } - - job = eng.Job("start", id) - if err := job.ImportEnv(hostConfig); err != nil { - t.Fatal(err) - } - if err := job.Run(); err != nil { - t.Fatal(err) - } - - if err := eng.Job("kill", id).Run(); err != nil { - t.Fatal(err) - } - - // FIXME: this failed once with a race condition ("Unable to remove filesystem for xxx: directory not empty") - job = eng.Job("rm", id) - job.SetenvBool("removeVolume", true) - if err := job.Run(); err != nil { - t.Fatal(err) - } - - containers, err = runtime.Containers(&daemon.ContainersConfig{All: true}) - - if len(containers) != 0 { - t.Errorf("Expected 0 container, %v found", len(containers)) - } -} - func TestRunWithTooLowMemoryLimit(t *testing.T) { eng := NewTestEngine(t) defer mkDaemonFromEngine(eng, t).Nuke()