From c8529fde5f6f2e4b62f9c1b3382fd814c11a7639 Mon Sep 17 00:00:00 2001 From: Antonio Murdaca Date: Fri, 10 Apr 2015 22:41:43 +0200 Subject: [PATCH] Remove job from commit Signed-off-by: Antonio Murdaca --- api/server/server.go | 38 ++++++++-------- daemon/commit.go | 43 +++++++++++------- daemon/daemon.go | 1 - integration/server_test.go | 89 +------------------------------------- 4 files changed, 46 insertions(+), 125 deletions(-) diff --git a/api/server/server.go b/api/server/server.go index ffbef8cee9..8a91320922 100644 --- a/api/server/server.go +++ b/api/server/server.go @@ -618,39 +618,37 @@ func postCommit(eng *engine.Engine, version version.Version, w http.ResponseWrit if err := parseForm(r); err != nil { return err } - var ( - config engine.Env - job = eng.Job("commit", r.Form.Get("container")) - stdoutBuffer = bytes.NewBuffer(nil) - ) if err := checkForJson(r); err != nil { return err } - if err := config.Decode(r.Body); err != nil { - logrus.Errorf("%s", err) - } + cont := r.Form.Get("container") + pause := toBool(r.Form.Get("pause")) if r.FormValue("pause") == "" && version.GreaterThanOrEqualTo("1.13") { - job.Setenv("pause", "1") - } else { - job.Setenv("pause", r.FormValue("pause")) + pause = true } - job.Setenv("repo", r.Form.Get("repo")) - job.Setenv("tag", r.Form.Get("tag")) - job.Setenv("author", r.Form.Get("author")) - job.Setenv("comment", r.Form.Get("comment")) - job.SetenvList("changes", r.Form["changes"]) - job.SetenvSubEnv("config", &config) + containerCommitConfig := &daemon.ContainerCommitConfig{ + Pause: pause, + Repo: r.Form.Get("repo"), + Tag: r.Form.Get("tag"), + Author: r.Form.Get("author"), + Comment: r.Form.Get("comment"), + Changes: r.Form["changes"], + Config: r.Body, + } - job.Stdout.Add(stdoutBuffer) - if err := job.Run(); err != nil { + d := getDaemon(eng) + + imgID, err := d.ContainerCommit(cont, containerCommitConfig) + if err != nil { return err } + return writeJSON(w, http.StatusCreated, &types.ContainerCommitResponse{ - ID: engine.Tail(stdoutBuffer, 1), + ID: imgID, }) } diff --git a/daemon/commit.go b/daemon/commit.go index 1daf57a4fe..1e534cf628 100644 --- a/daemon/commit.go +++ b/daemon/commit.go @@ -3,53 +3,64 @@ package daemon import ( "bytes" "encoding/json" - "fmt" + "io" + "github.com/Sirupsen/logrus" "github.com/docker/docker/engine" "github.com/docker/docker/image" "github.com/docker/docker/runconfig" ) -func (daemon *Daemon) ContainerCommit(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] +type ContainerCommitConfig struct { + Pause bool + Repo string + Tag string + Author string + Comment string + Changes []string + Config io.ReadCloser +} +func (daemon *Daemon) ContainerCommit(name string, c *ContainerCommitConfig) (string, error) { container, err := daemon.Get(name) if err != nil { - return err + return "", err } var ( + subenv engine.Env config = container.Config stdoutBuffer = bytes.NewBuffer(nil) newConfig runconfig.Config ) + if err := subenv.Decode(c.Config); err != nil { + logrus.Errorf("%s", err) + } + buildConfigJob := daemon.eng.Job("build_config") buildConfigJob.Stdout.Add(stdoutBuffer) - buildConfigJob.Setenv("changes", job.Getenv("changes")) + buildConfigJob.SetenvList("changes", c.Changes) // FIXME this should be remove when we remove deprecated config param - buildConfigJob.Setenv("config", job.Getenv("config")) + buildConfigJob.SetenvSubEnv("config", &subenv) if err := buildConfigJob.Run(); err != nil { - return err + return "", err } if err := json.NewDecoder(stdoutBuffer).Decode(&newConfig); err != nil { - return err + return "", err } if err := runconfig.Merge(&newConfig, config); err != nil { - return err + return "", err } - img, err := daemon.Commit(container, job.Getenv("repo"), job.Getenv("tag"), job.Getenv("comment"), job.Getenv("author"), job.GetenvBool("pause"), &newConfig) + img, err := daemon.Commit(container, c.Repo, c.Tag, c.Comment, c.Author, c.Pause, &newConfig) if err != nil { - return err + return "", err } - job.Printf("%s\n", img.ID) - return nil + + return img.ID, nil } // Commit creates a new filesystem image from the current state of a container. diff --git a/daemon/daemon.go b/daemon/daemon.go index 86ed71e231..f24d7dc042 100644 --- a/daemon/daemon.go +++ b/daemon/daemon.go @@ -117,7 +117,6 @@ type Daemon struct { // Install installs daemon capabilities to eng. func (daemon *Daemon) Install(eng *engine.Engine) error { for name, method := range map[string]engine.Handler{ - "commit": daemon.ContainerCommit, "container_inspect": daemon.ContainerInspect, "container_stats": daemon.ContainerStats, "create": daemon.ContainerCreate, diff --git a/integration/server_test.go b/integration/server_test.go index 34c56f4a8b..9745d9ce0f 100644 --- a/integration/server_test.go +++ b/integration/server_test.go @@ -1,12 +1,6 @@ package docker -import ( - "bytes" - "testing" - - "github.com/docker/docker/builder" - "github.com/docker/docker/engine" -) +import "testing" func TestCreateNumberHostname(t *testing.T) { eng := NewTestEngine(t) @@ -20,87 +14,6 @@ func TestCreateNumberHostname(t *testing.T) { createTestContainer(eng, config, t) } -func TestCommit(t *testing.T) { - eng := NewTestEngine(t) - b := &builder.BuilderJob{Engine: eng} - b.Install() - defer mkDaemonFromEngine(eng, t).Nuke() - - config, _, _, err := parseRun([]string{unitTestImageID, "/bin/cat"}) - if err != nil { - t.Fatal(err) - } - - id := createTestContainer(eng, config, t) - - job := eng.Job("commit", id) - job.Setenv("repo", "testrepo") - job.Setenv("tag", "testtag") - job.SetenvJson("config", config) - if err := job.Run(); err != nil { - t.Fatal(err) - } -} - -func TestMergeConfigOnCommit(t *testing.T) { - eng := NewTestEngine(t) - b := &builder.BuilderJob{Engine: eng} - b.Install() - runtime := mkDaemonFromEngine(eng, t) - defer runtime.Nuke() - - container1, _, _ := mkContainer(runtime, []string{"-e", "FOO=bar", unitTestImageID, "echo test > /tmp/foo"}, t) - defer runtime.Rm(container1) - - config, _, _, err := parseRun([]string{container1.ID, "cat /tmp/foo"}) - if err != nil { - t.Error(err) - } - - job := eng.Job("commit", container1.ID) - job.Setenv("repo", "testrepo") - job.Setenv("tag", "testtag") - job.SetenvJson("config", config) - var outputBuffer = bytes.NewBuffer(nil) - job.Stdout.Add(outputBuffer) - if err := job.Run(); err != nil { - t.Error(err) - } - - container2, _, _ := mkContainer(runtime, []string{engine.Tail(outputBuffer, 1)}, t) - defer runtime.Rm(container2) - - job = eng.Job("container_inspect", container1.Name) - baseContainer, _ := job.Stdout.AddEnv() - if err := job.Run(); err != nil { - t.Error(err) - } - - job = eng.Job("container_inspect", container2.Name) - commitContainer, _ := job.Stdout.AddEnv() - if err := job.Run(); err != nil { - t.Error(err) - } - - baseConfig := baseContainer.GetSubEnv("Config") - commitConfig := commitContainer.GetSubEnv("Config") - - if commitConfig.Get("Env") != baseConfig.Get("Env") { - t.Fatalf("Env config in committed container should be %v, was %v", - baseConfig.Get("Env"), commitConfig.Get("Env")) - } - - if baseConfig.Get("Cmd") != "[\"echo test \\u003e /tmp/foo\"]" { - t.Fatalf("Cmd in base container should be [\"echo test \\u003e /tmp/foo\"], was %s", - baseConfig.Get("Cmd")) - } - - if commitConfig.Get("Cmd") != "[\"cat /tmp/foo\"]" { - t.Fatalf("Cmd in committed container should be [\"cat /tmp/foo\"], was %s", - commitConfig.Get("Cmd")) - } -} - func TestRunWithTooLowMemoryLimit(t *testing.T) { eng := NewTestEngine(t) defer mkDaemonFromEngine(eng, t).Nuke()