From 5264914e574c20c8fefcd6e5d858f51f341dd9da Mon Sep 17 00:00:00 2001 From: Victor Vieux Date: Tue, 7 Jan 2014 12:39:15 -0800 Subject: [PATCH] Move image_export to a job Docker-DCO-1.0-Signed-off-by: Victor Vieux (github: vieux) --- api.go | 10 ++++++++-- server.go | 42 ++++++++++++++++++++++++++++++------------ 2 files changed, 38 insertions(+), 14 deletions(-) diff --git a/api.go b/api.go index 21e045e03d..c768ef9344 100644 --- a/api.go +++ b/api.go @@ -536,11 +536,17 @@ func postImagesPush(srv *Server, version float64, w http.ResponseWriter, r *http } func getImagesGet(srv *Server, version float64, w http.ResponseWriter, r *http.Request, vars map[string]string) error { - name := vars["name"] + if vars == nil { + return fmt.Errorf("Missing parameter") + } if version > 1.0 { w.Header().Set("Content-Type", "application/x-tar") } - return srv.ImageExport(name, w) + job := srv.Eng.Job("image_export", vars["name"]) + if err := job.Stdout.Add(w); err != nil { + return err + } + return job.Run() } func postImagesLoad(srv *Server, version float64, w http.ResponseWriter, r *http.Request, vars map[string]string) error { diff --git a/server.go b/server.go index f1466e81d3..c1fda6aeb9 100644 --- a/server.go +++ b/server.go @@ -123,6 +123,10 @@ func jobInitApi(job *engine.Job) engine.Status { job.Error(err) return engine.StatusErr } + if err := job.Eng.Register("image_export", srv.ImageExport); err != nil { + job.Error(err) + return engine.StatusErr + } return engine.StatusOK } @@ -251,11 +255,17 @@ func (srv *Server) ContainerExport(job *engine.Job) engine.Status { // uncompressed tar ball. // name is the set of tags to export. // out is the writer where the images are written to. -func (srv *Server) ImageExport(name string, out io.Writer) error { +func (srv *Server) ImageExport(job *engine.Job) engine.Status { + if len(job.Args) != 1 { + job.Errorf("Usage: %s CONTAINER\n", job.Name) + return engine.StatusErr + } + name := job.Args[0] // get image json tempdir, err := ioutil.TempDir("", "docker-export-") if err != nil { - return err + job.Error(err) + return engine.StatusErr } defer os.RemoveAll(tempdir) @@ -263,17 +273,20 @@ func (srv *Server) ImageExport(name string, out io.Writer) error { rootRepo, err := srv.runtime.repositories.Get(name) if err != nil { - return err + job.Error(err) + return engine.StatusErr } if rootRepo != nil { for _, id := range rootRepo { image, err := srv.ImageInspect(id) if err != nil { - return err + job.Error(err) + return engine.StatusErr } if err := srv.exportImage(image, tempdir); err != nil { - return err + job.Error(err) + return engine.StatusErr } } @@ -283,27 +296,32 @@ func (srv *Server) ImageExport(name string, out io.Writer) error { rootRepoJson, _ := json.Marshal(rootRepoMap) if err := ioutil.WriteFile(path.Join(tempdir, "repositories"), rootRepoJson, os.ModeAppend); err != nil { - return err + job.Error(err) + return engine.StatusErr } } else { image, err := srv.ImageInspect(name) if err != nil { - return err + job.Error(err) + return engine.StatusErr } if err := srv.exportImage(image, tempdir); err != nil { - return err + job.Error(err) + return engine.StatusErr } } fs, err := archive.Tar(tempdir, archive.Uncompressed) if err != nil { - return err + job.Error(err) + return engine.StatusErr } - if _, err := io.Copy(out, fs); err != nil { - return err + if _, err := io.Copy(job.Stdout, fs); err != nil { + job.Error(err) + return engine.StatusErr } - return nil + return engine.StatusOK } func (srv *Server) exportImage(image *Image, tempdir string) error {