1
0
Fork 0
mirror of https://github.com/moby/moby.git synced 2022-11-09 12:21:53 -05:00

Merge pull request #3727 from vieux/push_job

push job
This commit is contained in:
Victor Vieux 2014-01-24 15:42:22 -08:00
commit 748a009cc4
2 changed files with 48 additions and 27 deletions

26
api.go
View file

@ -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
}

View file

@ -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 {