浏览代码

Merge pull request #3560 from vieux/copy_job

move copy to a job
Victor Vieux 11 年之前
父节点
当前提交
52ec95f363
共有 2 个文件被更改,包括 26 次插入9 次删除
  1. 3 3
      api.go
  2. 23 6
      server.go

+ 3 - 3
api.go

@@ -1035,7 +1035,6 @@ func postContainersCopy(srv *Server, version float64, w http.ResponseWriter, r *
 	if vars == nil {
 	if vars == nil {
 		return fmt.Errorf("Missing parameter")
 		return fmt.Errorf("Missing parameter")
 	}
 	}
-	name := vars["name"]
 
 
 	copyData := &APICopy{}
 	copyData := &APICopy{}
 	contentType := r.Header.Get("Content-Type")
 	contentType := r.Header.Get("Content-Type")
@@ -1054,9 +1053,10 @@ func postContainersCopy(srv *Server, version float64, w http.ResponseWriter, r *
 		copyData.Resource = copyData.Resource[1:]
 		copyData.Resource = copyData.Resource[1:]
 	}
 	}
 
 
-	if err := srv.ContainerCopy(name, copyData.Resource, w); err != nil {
+	job := srv.Eng.Job("container_copy", vars["name"], copyData.Resource)
+	job.Stdout.Add(w)
+	if err := job.Run(); err != nil {
 		utils.Errorf("%s", err.Error())
 		utils.Errorf("%s", err.Error())
-		return err
 	}
 	}
 	return nil
 	return nil
 }
 }

+ 23 - 6
server.go

@@ -139,6 +139,10 @@ func jobInitApi(job *engine.Job) engine.Status {
 		job.Error(err)
 		job.Error(err)
 		return engine.StatusErr
 		return engine.StatusErr
 	}
 	}
+	if err := job.Eng.Register("container_copy", srv.ContainerCopy); err != nil {
+		job.Error(err)
+		return engine.StatusErr
+	}
 	return engine.StatusOK
 	return engine.StatusOK
 }
 }
 
 
@@ -2058,20 +2062,33 @@ func (srv *Server) ImageInspect(name string) (*Image, error) {
 	return nil, fmt.Errorf("No such image: %s", name)
 	return nil, fmt.Errorf("No such image: %s", name)
 }
 }
 
 
-func (srv *Server) ContainerCopy(name string, resource string, out io.Writer) error {
+func (srv *Server) ContainerCopy(job *engine.Job) engine.Status {
+	if len(job.Args) != 2 {
+		job.Errorf("Usage: %s CONTAINER RESOURCE\n", job.Name)
+		return engine.StatusErr
+	}
+
+	var (
+		name     = job.Args[0]
+		resource = job.Args[1]
+	)
+
 	if container := srv.runtime.Get(name); container != nil {
 	if container := srv.runtime.Get(name); container != nil {
 
 
 		data, err := container.Copy(resource)
 		data, err := container.Copy(resource)
 		if err != nil {
 		if err != nil {
-			return err
+			job.Error(err)
+			return engine.StatusErr
 		}
 		}
 
 
-		if _, err := io.Copy(out, data); err != nil {
-			return err
+		if _, err := io.Copy(job.Stdout, data); err != nil {
+			job.Error(err)
+			return engine.StatusErr
 		}
 		}
-		return nil
+		return engine.StatusOK
 	}
 	}
-	return fmt.Errorf("No such container: %s", name)
+	job.Errorf("No such container: %s", name)
+	return engine.StatusErr
 
 
 }
 }