瀏覽代碼

move inspect to 2 jobs

Docker-DCO-1.1-Signed-off-by: Victor Vieux <victor.vieux@docker.com> (github: vieux)
Victor Vieux 11 年之前
父節點
當前提交
134435a79c
共有 3 個文件被更改,包括 70 次插入21 次删除
  1. 18 17
      api.go
  2. 0 4
      api_params.go
  3. 52 0
      server.go

+ 18 - 17
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 {

+ 0 - 4
api_params.go

@@ -67,10 +67,6 @@ type (
 		Resource string
 		HostPath string
 	}
-	APIContainer struct {
-		*Container
-		HostConfig *HostConfig
-	}
 )
 
 func (api APIContainers) ToLegacy() *APIContainersOld {

+ 52 - 0
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)