From 134435a79c06bd178aa6f687fcabeb2caced485a Mon Sep 17 00:00:00 2001 From: Victor Vieux Date: Wed, 15 Jan 2014 17:09:05 -0800 Subject: [PATCH] move inspect to 2 jobs Docker-DCO-1.1-Signed-off-by: Victor Vieux (github: vieux) --- api.go | 35 +++++++++++++++++----------------- api_params.go | 4 ---- server.go | 52 +++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 70 insertions(+), 21 deletions(-) diff --git a/api.go b/api.go index 698e5b429a..ea685c68dc 100644 --- a/api.go +++ b/api.go @@ -838,41 +838,42 @@ func getContainersByName(srv *Server, version float64, w http.ResponseWriter, r if vars == nil { return fmt.Errorf("Missing parameter") } - name := vars["name"] + var ( + buffer = bytes.NewBuffer(nil) + job = srv.Eng.Job("inspect_container", vars["name"]) + ) - container, err := srv.ContainerInspect(name) - if err != nil { + job.Stdout.Add(buffer) + if err := job.Run(); err != nil { return err } - _, err = srv.ImageInspect(name) - if err == nil { + if err := srv.Eng.Job("inspect_image", vars["name"]).Run(); err == nil { return fmt.Errorf("Conflict between containers and images") } - - container.readHostConfig() - c := APIContainer{container, container.hostConfig} - - return writeJSON(w, http.StatusOK, c) + _, err := io.Copy(w, buffer) + return err } func getImagesByName(srv *Server, version float64, w http.ResponseWriter, r *http.Request, vars map[string]string) error { if vars == nil { return fmt.Errorf("Missing parameter") } - name := vars["name"] + var ( + buffer = bytes.NewBuffer(nil) + job = srv.Eng.Job("inspect_image", vars["name"]) + ) - image, err := srv.ImageInspect(name) - if err != nil { + job.Stdout.Add(buffer) + if err := job.Run(); err != nil { return err } - _, err = srv.ContainerInspect(name) - if err == nil { + if err := srv.Eng.Job("inspect_container", vars["name"]).Run(); err == nil { return fmt.Errorf("Conflict between containers and images") } - - return writeJSON(w, http.StatusOK, image) + _, err := io.Copy(w, buffer) + return err } func postBuild(srv *Server, version float64, w http.ResponseWriter, r *http.Request, vars map[string]string) error { diff --git a/api_params.go b/api_params.go index 92dde2906a..5de1255524 100644 --- a/api_params.go +++ b/api_params.go @@ -67,10 +67,6 @@ type ( Resource string HostPath string } - APIContainer struct { - *Container - HostConfig *HostConfig - } ) func (api APIContainers) ToLegacy() *APIContainersOld { diff --git a/server.go b/server.go index 95b8433676..a52fd20693 100644 --- a/server.go +++ b/server.go @@ -337,6 +337,14 @@ func (srv *Server) ImageExport(job *engine.Job) engine.Status { job.Error(err) return engine.StatusErr } + if err := job.Eng.Register("inspect_image", srv.JobImageInspect); err != nil { + job.Error(err) + return engine.StatusErr + } + if err := job.Eng.Register("inspect_container", srv.JobContainerInspect); err != nil { + job.Error(err) + return engine.StatusErr + } return engine.StatusOK } @@ -2303,6 +2311,31 @@ func (srv *Server) ContainerInspect(name string) (*Container, error) { return nil, fmt.Errorf("No such container: %s", name) } +func (srv *Server) JobContainerInspect(job *engine.Job) engine.Status { + if n := len(job.Args); n != 1 { + job.Errorf("Usage: %s CONTAINER", job.Name) + return engine.StatusErr + } + container, err := srv.ContainerInspect(job.Args[0]) + if err != nil { + job.Error(err) + return engine.StatusErr + } + + type HostConfigPacker struct { + *Container + HostConfig *HostConfig + } + + b, err := json.Marshal(&HostConfigPacker{container, container.hostConfig}) + if err != nil { + job.Error(err) + return engine.StatusErr + } + job.Stdout.Write(b) + return engine.StatusOK +} + func (srv *Server) ImageInspect(name string) (*Image, error) { if image, err := srv.runtime.repositories.LookupImage(name); err == nil && image != nil { return image, nil @@ -2310,6 +2343,25 @@ func (srv *Server) ImageInspect(name string) (*Image, error) { return nil, fmt.Errorf("No such image: %s", name) } +func (srv *Server) JobImageInspect(job *engine.Job) engine.Status { + if n := len(job.Args); n != 1 { + job.Errorf("Usage: %s IMAGE", job.Name) + return engine.StatusErr + } + image, err := srv.ImageInspect(job.Args[0]) + if err != nil { + job.Error(err) + return engine.StatusErr + } + b, err := json.Marshal(image) + if err != nil { + job.Error(err) + return engine.StatusErr + } + job.Stdout.Write(b) + return engine.StatusOK +} + func (srv *Server) ContainerCopy(job *engine.Job) engine.Status { if len(job.Args) != 2 { job.Errorf("Usage: %s CONTAINER RESOURCE\n", job.Name)