浏览代码

Merge pull request #3727 from vieux/push_job

push job
Victor Vieux 11 年之前
父节点
当前提交
748a009cc4
共有 2 个文件被更改,包括 48 次插入27 次删除
  1. 15 11
      api.go
  2. 33 16
      server.go

+ 15 - 11
api.go

@@ -472,6 +472,10 @@ func postImagesInsert(srv *Server, version float64, w http.ResponseWriter, r *ht
 }
 
 func postImagesPush(srv *Server, version float64, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
+	if vars == nil {
+		return fmt.Errorf("Missing parameter")
+	}
+
 	metaHeaders := map[string][]string{}
 	for k, v := range r.Header {
 		if strings.HasPrefix(k, "X-Meta-") {
@@ -496,23 +500,23 @@ func postImagesPush(srv *Server, version float64, w http.ResponseWriter, r *http
 		if err := json.NewDecoder(r.Body).Decode(authConfig); err != nil {
 			return err
 		}
-
 	}
 
-	if vars == nil {
-		return fmt.Errorf("Missing parameter")
-	}
-	name := vars["name"]
 	if version > 1.0 {
 		w.Header().Set("Content-Type", "application/json")
 	}
-	sf := utils.NewStreamFormatter(version > 1.0)
-	if err := srv.ImagePush(name, w, sf, authConfig, metaHeaders); err != nil {
-		if sf.Used() {
-			w.Write(sf.FormatError(err))
-			return nil
+	job := srv.Eng.Job("push", vars["name"])
+	job.SetenvJson("metaHeaders", metaHeaders)
+	job.SetenvJson("authConfig", authConfig)
+	job.SetenvBool("json", version > 1.0)
+	job.Stdout.Add(utils.NewWriteFlusher(w))
+
+	if err := job.Run(); err != nil {
+		if !job.Stdout.Used() {
+			return err
 		}
-		return err
+		sf := utils.NewStreamFormatter(version > 1.0)
+		w.Write(sf.FormatError(err))
 	}
 	return nil
 }

+ 33 - 16
server.go

@@ -102,6 +102,7 @@ func jobInitApi(job *engine.Job) engine.Status {
 		"image_delete":     srv.ImageDelete,
 		"inspect":          srv.JobInspect,
 		"events":           srv.Events,
+		"push":             srv.ImagePush,
 	} {
 		if err := job.Eng.Register(name, handler); err != nil {
 			job.Error(err)
@@ -1595,44 +1596,60 @@ func (srv *Server) pushImage(r *registry.Registry, out io.Writer, remote, imgID,
 }
 
 // FIXME: Allow to interrupt current push when new push of same image is done.
-func (srv *Server) ImagePush(localName string, out io.Writer, sf *utils.StreamFormatter, authConfig *auth.AuthConfig, metaHeaders map[string][]string) error {
-	if _, err := srv.poolAdd("push", localName); err != nil {
-		return err
+func (srv *Server) ImagePush(job *engine.Job) engine.Status {
+	if n := len(job.Args); n != 1 {
+		job.Errorf("Usage: %s IMAGE", job.Name)
+		return engine.StatusErr
 	}
-	defer srv.poolRemove("push", localName)
+	var (
+		localName   = job.Args[0]
+		sf          = utils.NewStreamFormatter(job.GetenvBool("json"))
+		authConfig  = &auth.AuthConfig{}
+		metaHeaders map[string][]string
+	)
 
+	job.GetenvJson("authConfig", authConfig)
+	job.GetenvJson("metaHeaders", metaHeaders)
+	if _, err := srv.poolAdd("push", localName); err != nil {
+		job.Error(err)
+		return engine.StatusErr
+	}
 	// Resolve the Repository name from fqn to endpoint + name
 	endpoint, remoteName, err := registry.ResolveRepositoryName(localName)
 	if err != nil {
-		return err
+		job.Error(err)
+		return engine.StatusErr
 	}
 
-	out = utils.NewWriteFlusher(out)
 	img, err := srv.runtime.graph.Get(localName)
 	r, err2 := registry.NewRegistry(authConfig, srv.HTTPRequestFactory(metaHeaders), endpoint)
 	if err2 != nil {
-		return err2
+		job.Error(err2)
+		return engine.StatusErr
 	}
 
 	if err != nil {
 		reposLen := len(srv.runtime.repositories.Repositories[localName])
-		out.Write(sf.FormatStatus("", "The push refers to a repository [%s] (len: %d)", localName, reposLen))
+		job.Stdout.Write(sf.FormatStatus("", "The push refers to a repository [%s] (len: %d)", localName, reposLen))
 		// If it fails, try to get the repository
 		if localRepo, exists := srv.runtime.repositories.Repositories[localName]; exists {
-			if err := srv.pushRepository(r, out, localName, remoteName, localRepo, sf); err != nil {
-				return err
+			if err := srv.pushRepository(r, job.Stdout, localName, remoteName, localRepo, sf); err != nil {
+				job.Error(err)
+				return engine.StatusErr
 			}
-			return nil
+			return engine.StatusOK
 		}
-		return err
+		job.Error(err)
+		return engine.StatusErr
 	}
 
 	var token []string
-	out.Write(sf.FormatStatus("", "The push refers to an image: [%s]", localName))
-	if _, err := srv.pushImage(r, out, remoteName, img.ID, endpoint, token, sf); err != nil {
-		return err
+	job.Stdout.Write(sf.FormatStatus("", "The push refers to an image: [%s]", localName))
+	if _, err := srv.pushImage(r, job.Stdout, remoteName, img.ID, endpoint, token, sf); err != nil {
+		job.Error(err)
+		return engine.StatusErr
 	}
-	return nil
+	return engine.StatusOK
 }
 
 func (srv *Server) ImageImport(job *engine.Job) engine.Status {