mirror of
https://github.com/moby/moby.git
synced 2022-11-09 12:21:53 -05:00
commit
748a009cc4
2 changed files with 48 additions and 27 deletions
26
api.go
26
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
|
||||
}
|
||||
|
|
49
server.go
49
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 {
|
||||
|
|
Loading…
Add table
Reference in a new issue