From 5090a5bd4b9472a450d86afe70b74f2aa3c180a0 Mon Sep 17 00:00:00 2001 From: David Sissitka Date: Fri, 20 Sep 2013 04:55:17 -0400 Subject: [PATCH 1/4] Make "docker insert" errors obvious Closes #1130 See also #1942 Upstream-commit: 5957dd909134fc3c3dc3e165b83559feb89d9f5b Component: engine --- components/engine/api.go | 9 +++------ components/engine/commands.go | 5 +---- components/engine/server.go | 20 ++++++++++---------- 3 files changed, 14 insertions(+), 20 deletions(-) diff --git a/components/engine/api.go b/components/engine/api.go index 61252ab9af..8f31ab0282 100644 --- a/components/engine/api.go +++ b/components/engine/api.go @@ -479,15 +479,12 @@ func postImagesInsert(srv *Server, version float64, w http.ResponseWriter, r *ht w.Header().Set("Content-Type", "application/json") } sf := utils.NewStreamFormatter(version > 1.0) - imgID, err := srv.ImageInsert(name, url, path, w, sf) + err := srv.ImageInsert(name, url, path, w, sf) if err != nil { - if sf.Used() { - w.Write(sf.FormatError(err)) - return nil - } + w.Write(sf.FormatError(err)) } - return writeJSON(w, http.StatusOK, &APIID{ID: imgID}) + return nil } func postImagesPush(srv *Server, version float64, w http.ResponseWriter, r *http.Request, vars map[string]string) error { diff --git a/components/engine/commands.go b/components/engine/commands.go index 00be9a60e1..1dc82e3bdc 100644 --- a/components/engine/commands.go +++ b/components/engine/commands.go @@ -130,10 +130,7 @@ func (cli *DockerCli) CmdInsert(args ...string) error { v.Set("url", cmd.Arg(1)) v.Set("path", cmd.Arg(2)) - if err := cli.stream("POST", "/images/"+cmd.Arg(0)+"/insert?"+v.Encode(), nil, cli.out, nil); err != nil { - return err - } - return nil + return cli.stream("POST", "/images/"+cmd.Arg(0)+"/insert?"+v.Encode(), nil, cli.out, nil) } // mkBuildContext returns an archive of an empty context with the contents diff --git a/components/engine/server.go b/components/engine/server.go index 3441029027..eb4e74e0bf 100644 --- a/components/engine/server.go +++ b/components/engine/server.go @@ -198,39 +198,39 @@ func (srv *Server) ImagesSearch(term string) ([]registry.SearchResult, error) { return results.Results, nil } -func (srv *Server) ImageInsert(name, url, path string, out io.Writer, sf *utils.StreamFormatter) (string, error) { +func (srv *Server) ImageInsert(name, url, path string, out io.Writer, sf *utils.StreamFormatter) error { out = utils.NewWriteFlusher(out) img, err := srv.runtime.repositories.LookupImage(name) if err != nil { - return "", err + return err } file, err := utils.Download(url, out) if err != nil { - return "", err + return err } defer file.Body.Close() config, _, _, err := ParseRun([]string{img.ID, "echo", "insert", url, path}, srv.runtime.capabilities) if err != nil { - return "", err + return err } c, _, err := srv.runtime.Create(config, "") if err != nil { - return "", err + return err } - if err := c.Inject(utils.ProgressReader(file.Body, int(file.ContentLength), out, sf.FormatProgress("", "Downloading", "%8v/%v (%v)"), sf, true), path); err != nil { - return "", err + if err := c.Inject(utils.ProgressReader(file.Body, int(file.ContentLength), out, sf.FormatProgress("", "Downloading", "%8v/%v (%v)"), sf, false), path); err != nil { + return err } // FIXME: Handle custom repo, tag comment, author img, err = srv.runtime.Commit(c, "", "", img.Comment, img.Author, nil) if err != nil { - return "", err + return err } - out.Write(sf.FormatStatus("", img.ID)) - return img.ShortID(), nil + out.Write(sf.FormatStatus(utils.TruncateID(img.ID), "Image created")) + return nil } func (srv *Server) ImagesViz(out io.Writer) error { From 807e6a9bd8bce9cf23ddb3e8ec8a6a6e8f5935d4 Mon Sep 17 00:00:00 2001 From: Mark Allen Date: Thu, 7 Nov 2013 23:34:54 -0600 Subject: [PATCH 2/4] Add ImageInsert tests Upstream-commit: bf8e0277bbd1c2df2310bc20ecc4003d1ed7a657 Component: engine --- components/engine/server_test.go | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/components/engine/server_test.go b/components/engine/server_test.go index 4072344f35..3376eebd6e 100644 --- a/components/engine/server_test.go +++ b/components/engine/server_test.go @@ -3,6 +3,7 @@ package docker import ( "github.com/dotcloud/docker/utils" "strings" + "io/ioutil" "testing" "time" ) @@ -521,3 +522,25 @@ func TestImagesFilter(t *testing.T) { t.Fatal("incorrect number of matches returned") } } + +func TestImageInsert(t *testing.T) { + runtime := mkRuntime(t) + defer nuke(runtime) + srv := &Server{runtime: runtime} + sf := utils.NewStreamFormatter(true) + + // bad image name fails + if err := srv.ImageInsert("foo", "https://www.docker.io/static/img/docker-top-logo.png", "/foo", ioutil.Discard, sf); err == nil { + t.Fatal("expected an error and got none") + } + + // bad url fails + if err := srv.ImageInsert(GetTestImage(runtime).ID, "http://bad_host_name_that_will_totally_fail.com/", "/foo", ioutil.Discard, sf); err == nil { + t.Fatal("expected an error and got none") + } + + // success returns nil + if err := srv.ImageInsert(GetTestImage(runtime).ID, "https://www.docker.io/static/img/docker-top-logo.png", "/foo", ioutil.Discard, sf); err != nil { + t.Fatalf("expected no error, but got %v", err) + } +} From 9fcdb45469ac17c2777987db17aa59eb14f9d371 Mon Sep 17 00:00:00 2001 From: Mark Allen Date: Sun, 10 Nov 2013 00:06:55 -0600 Subject: [PATCH 3/4] Edits after code review Return long image ID Return streamformatted error or "raw" error Upstream-commit: 8cc19765b48d1a429b840b731ed5fd5b81fbda3c Component: engine --- components/engine/api.go | 6 +++++- components/engine/server.go | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/components/engine/api.go b/components/engine/api.go index 8f31ab0282..ce46d50129 100644 --- a/components/engine/api.go +++ b/components/engine/api.go @@ -481,7 +481,11 @@ func postImagesInsert(srv *Server, version float64, w http.ResponseWriter, r *ht sf := utils.NewStreamFormatter(version > 1.0) err := srv.ImageInsert(name, url, path, w, sf) if err != nil { - w.Write(sf.FormatError(err)) + if sf.Used() { + w.Write(sf.FormatError(err)) + return nil + } + return err } return nil diff --git a/components/engine/server.go b/components/engine/server.go index eb4e74e0bf..93ca61365a 100644 --- a/components/engine/server.go +++ b/components/engine/server.go @@ -229,7 +229,7 @@ func (srv *Server) ImageInsert(name, url, path string, out io.Writer, sf *utils. if err != nil { return err } - out.Write(sf.FormatStatus(utils.TruncateID(img.ID), "Image created")) + out.Write(sf.FormatStatus(img.ID, "Image created")) return nil } From 29829cd5d2bb659ac2bcff13f3b5ed5c26882e97 Mon Sep 17 00:00:00 2001 From: Mark Allen Date: Mon, 11 Nov 2013 13:26:24 -0600 Subject: [PATCH 4/4] Just return the id; nothing else. Upstream-commit: 62f873aa1f918fe4d303f6168f66d057e6776b18 Component: engine --- components/engine/server.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/engine/server.go b/components/engine/server.go index 93ca61365a..167ec7fc1d 100644 --- a/components/engine/server.go +++ b/components/engine/server.go @@ -229,7 +229,7 @@ func (srv *Server) ImageInsert(name, url, path string, out io.Writer, sf *utils. if err != nil { return err } - out.Write(sf.FormatStatus(img.ID, "Image created")) + out.Write(sf.FormatStatus(img.ID, "")) return nil }