diff --git a/commands.go b/commands.go index a0a322afab..626c9dd47f 100644 --- a/commands.go +++ b/commands.go @@ -472,19 +472,15 @@ func (srv *Server) CmdPull(stdin io.ReadCloser, stdout io.Writer, args ...string } if srv.runtime.graph.LookupRemoteImage(remote, srv.runtime.authConfig) { - fmt.Fprintf(stdout, "Pulling %s...\n", remote) - if err := srv.runtime.graph.PullImage(remote, srv.runtime.authConfig); err != nil { + if err := srv.runtime.graph.PullImage(stdout, remote, srv.runtime.authConfig); err != nil { return err } - fmt.Fprintf(stdout, "Pulled\n") return nil } // FIXME: Allow pull repo:tag - fmt.Fprintf(stdout, "Pulling %s...\n", remote) if err := srv.runtime.graph.PullRepository(stdout, remote, "", srv.runtime.repositories, srv.runtime.authConfig); err != nil { return err } - fmt.Fprintf(stdout, "Pull completed\n") return nil } diff --git a/registry.go b/registry.go index ea4751bbbe..fd8db708d1 100644 --- a/registry.go +++ b/registry.go @@ -94,36 +94,38 @@ func (graph *Graph) LookupRemoteImage(imgId string, authConfig *auth.AuthConfig) // Retrieve an image from the Registry. // Returns the Image object as well as the layer as an Archive (io.Reader) -func (graph *Graph) getRemoteImage(imgId string, authConfig *auth.AuthConfig) (*Image, Archive, error) { +func (graph *Graph) getRemoteImage(stdout io.Writer, imgId string, authConfig *auth.AuthConfig) (*Image, Archive, error) { client := &http.Client{} + fmt.Fprintf(stdout, "Pulling %s metadata\n", imgId) // Get the Json req, err := http.NewRequest("GET", REGISTRY_ENDPOINT+"/images/"+imgId+"/json", nil) if err != nil { - return nil, nil, fmt.Errorf("Error while getting from the server: %s\n", err) + return nil, nil, fmt.Errorf("Failed to download json: %s", err) } req.SetBasicAuth(authConfig.Username, authConfig.Password) res, err := client.Do(req) - if err != nil || res.StatusCode != 200 { - if res != nil { - return nil, nil, fmt.Errorf("Internal server error: %d trying to get image %s", res.StatusCode, imgId) - } - return nil, nil, err + if err != nil { + return nil, nil, fmt.Errorf("Failed to download json: %s", err) + } + if res.StatusCode != 200 { + return nil, nil, fmt.Errorf("HTTP code %d", res.StatusCode) } defer res.Body.Close() jsonString, err := ioutil.ReadAll(res.Body) if err != nil { - return nil, nil, fmt.Errorf("Error while reading the http response: %s\n", err) + return nil, nil, fmt.Errorf("Failed to download json: %s", err) } img, err := NewImgJson(jsonString) if err != nil { - return nil, nil, fmt.Errorf("Error while parsing the json: %s\n", err) + return nil, nil, fmt.Errorf("Failed to parse json: %s", err) } img.Id = imgId // Get the layer + fmt.Fprintf(stdout, "Pulling %s fs layer\n", imgId) req, err = http.NewRequest("GET", REGISTRY_ENDPOINT+"/images/"+imgId+"/layer", nil) if err != nil { return nil, nil, fmt.Errorf("Error while getting from the server: %s\n", err) @@ -136,7 +138,7 @@ func (graph *Graph) getRemoteImage(imgId string, authConfig *auth.AuthConfig) (* return img, res.Body, nil } -func (graph *Graph) PullImage(imgId string, authConfig *auth.AuthConfig) error { +func (graph *Graph) PullImage(stdout io.Writer, imgId string, authConfig *auth.AuthConfig) error { history, err := graph.getRemoteHistory(imgId, authConfig) if err != nil { return err @@ -145,7 +147,7 @@ func (graph *Graph) PullImage(imgId string, authConfig *auth.AuthConfig) error { // FIXME: Lunch the getRemoteImage() in goroutines for _, j := range history { if !graph.Exists(j.Id) { - img, layer, err := graph.getRemoteImage(j.Id, authConfig) + img, layer, err := graph.getRemoteImage(stdout, j.Id, authConfig) if err != nil { // FIXME: Keep goging in case of error? return err @@ -162,7 +164,7 @@ func (graph *Graph) PullImage(imgId string, authConfig *auth.AuthConfig) error { func (graph *Graph) PullRepository(stdout io.Writer, remote, askedTag string, repositories *TagStore, authConfig *auth.AuthConfig) error { client := &http.Client{} - fmt.Fprintf(stdout, "Pulling repo: %s\n", REGISTRY_ENDPOINT+"/users/"+remote) + fmt.Fprintf(stdout, "Pulling repository %s\n", remote) var repositoryTarget string // If we are asking for 'root' repository, lookup on the Library's registry @@ -178,12 +180,12 @@ func (graph *Graph) PullRepository(stdout io.Writer, remote, askedTag string, re } req.SetBasicAuth(authConfig.Username, authConfig.Password) res, err := client.Do(req) - if err != nil || res.StatusCode != 200 { - if res != nil { - return fmt.Errorf("Internal server error: %d trying to pull %s", res.StatusCode, remote) - } + if err != nil { return err } + if res.StatusCode != 200 { + return fmt.Errorf("HTTP code: %d", res.StatusCode) + } defer res.Body.Close() rawJson, err := ioutil.ReadAll(res.Body) if err != nil { @@ -194,7 +196,8 @@ func (graph *Graph) PullRepository(stdout io.Writer, remote, askedTag string, re return err } for tag, rev := range t { - if err = graph.PullImage(rev, authConfig); err != nil { + fmt.Fprintf(stdout, "Pulling tag %s:%s\n", remote, tag) + if err = graph.PullImage(stdout, rev, authConfig); err != nil { return err } if err = repositories.Set(remote, tag, rev, true); err != nil { @@ -232,10 +235,9 @@ func (graph *Graph) PushImage(stdout io.Writer, imgOrig *Image, authConfig *auth req.SetBasicAuth(authConfig.Username, authConfig.Password) res, err := client.Do(req) if err != nil { - return fmt.Errorf("Failed to upload json: %s", err) + return fmt.Errorf("Failed to upload metadata: %s", err) } if res.StatusCode != 200 { - Debugf("Pushing return status: %d\n", res.StatusCode) switch res.StatusCode { case 204: // Case where the image is already on the Registry