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 {
|
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{}
|
metaHeaders := map[string][]string{}
|
||||||
for k, v := range r.Header {
|
for k, v := range r.Header {
|
||||||
if strings.HasPrefix(k, "X-Meta-") {
|
if strings.HasPrefix(k, "X-Meta-") {
|
||||||
|
@ -496,24 +500,24 @@ func postImagesPush(srv *Server, version float64, w http.ResponseWriter, r *http
|
||||||
if err := json.NewDecoder(r.Body).Decode(authConfig); err != nil {
|
if err := json.NewDecoder(r.Body).Decode(authConfig); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if vars == nil {
|
|
||||||
return fmt.Errorf("Missing parameter")
|
|
||||||
}
|
|
||||||
name := vars["name"]
|
|
||||||
if version > 1.0 {
|
if version > 1.0 {
|
||||||
w.Header().Set("Content-Type", "application/json")
|
w.Header().Set("Content-Type", "application/json")
|
||||||
}
|
}
|
||||||
sf := utils.NewStreamFormatter(version > 1.0)
|
job := srv.Eng.Job("push", vars["name"])
|
||||||
if err := srv.ImagePush(name, w, sf, authConfig, metaHeaders); err != nil {
|
job.SetenvJson("metaHeaders", metaHeaders)
|
||||||
if sf.Used() {
|
job.SetenvJson("authConfig", authConfig)
|
||||||
w.Write(sf.FormatError(err))
|
job.SetenvBool("json", version > 1.0)
|
||||||
return nil
|
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
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
49
server.go
49
server.go
|
@ -102,6 +102,7 @@ func jobInitApi(job *engine.Job) engine.Status {
|
||||||
"image_delete": srv.ImageDelete,
|
"image_delete": srv.ImageDelete,
|
||||||
"inspect": srv.JobInspect,
|
"inspect": srv.JobInspect,
|
||||||
"events": srv.Events,
|
"events": srv.Events,
|
||||||
|
"push": srv.ImagePush,
|
||||||
} {
|
} {
|
||||||
if err := job.Eng.Register(name, handler); err != nil {
|
if err := job.Eng.Register(name, handler); err != nil {
|
||||||
job.Error(err)
|
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.
|
// 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 {
|
func (srv *Server) ImagePush(job *engine.Job) engine.Status {
|
||||||
if _, err := srv.poolAdd("push", localName); err != nil {
|
if n := len(job.Args); n != 1 {
|
||||||
return err
|
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
|
// Resolve the Repository name from fqn to endpoint + name
|
||||||
endpoint, remoteName, err := registry.ResolveRepositoryName(localName)
|
endpoint, remoteName, err := registry.ResolveRepositoryName(localName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
job.Error(err)
|
||||||
|
return engine.StatusErr
|
||||||
}
|
}
|
||||||
|
|
||||||
out = utils.NewWriteFlusher(out)
|
|
||||||
img, err := srv.runtime.graph.Get(localName)
|
img, err := srv.runtime.graph.Get(localName)
|
||||||
r, err2 := registry.NewRegistry(authConfig, srv.HTTPRequestFactory(metaHeaders), endpoint)
|
r, err2 := registry.NewRegistry(authConfig, srv.HTTPRequestFactory(metaHeaders), endpoint)
|
||||||
if err2 != nil {
|
if err2 != nil {
|
||||||
return err2
|
job.Error(err2)
|
||||||
|
return engine.StatusErr
|
||||||
}
|
}
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
reposLen := len(srv.runtime.repositories.Repositories[localName])
|
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 it fails, try to get the repository
|
||||||
if localRepo, exists := srv.runtime.repositories.Repositories[localName]; exists {
|
if localRepo, exists := srv.runtime.repositories.Repositories[localName]; exists {
|
||||||
if err := srv.pushRepository(r, out, localName, remoteName, localRepo, sf); err != nil {
|
if err := srv.pushRepository(r, job.Stdout, localName, remoteName, localRepo, sf); err != nil {
|
||||||
return err
|
job.Error(err)
|
||||||
|
return engine.StatusErr
|
||||||
}
|
}
|
||||||
return nil
|
return engine.StatusOK
|
||||||
}
|
}
|
||||||
return err
|
job.Error(err)
|
||||||
|
return engine.StatusErr
|
||||||
}
|
}
|
||||||
|
|
||||||
var token []string
|
var token []string
|
||||||
out.Write(sf.FormatStatus("", "The push refers to an image: [%s]", localName))
|
job.Stdout.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 {
|
if _, err := srv.pushImage(r, job.Stdout, remoteName, img.ID, endpoint, token, sf); err != nil {
|
||||||
return err
|
job.Error(err)
|
||||||
|
return engine.StatusErr
|
||||||
}
|
}
|
||||||
return nil
|
return engine.StatusOK
|
||||||
}
|
}
|
||||||
|
|
||||||
func (srv *Server) ImageImport(job *engine.Job) engine.Status {
|
func (srv *Server) ImageImport(job *engine.Job) engine.Status {
|
||||||
|
|
Loading…
Add table
Reference in a new issue