From 1f3a1ee5cad463799527d5ab126257e313215712 Mon Sep 17 00:00:00 2001 From: shin- Date: Fri, 24 May 2013 10:37:34 -0700 Subject: [PATCH 01/10] Tentative support for independent registries Upstream-commit: de0a48bd6ff2acfb2ab546a1e718185872eea2c3 Component: engine --- components/engine/registry/registry.go | 5 +- components/engine/server.go | 79 +++++++++++++++++++++----- 2 files changed, 67 insertions(+), 17 deletions(-) diff --git a/components/engine/registry/registry.go b/components/engine/registry/registry.go index c565c29989..5d642b392f 100644 --- a/components/engine/registry/registry.go +++ b/components/engine/registry/registry.go @@ -56,20 +56,19 @@ func (r *Registry) GetRemoteHistory(imgId, registry string, token []string) ([]s } // Check if an image exists in the Registry -func (r *Registry) LookupRemoteImage(imgId, registry string, authConfig *auth.AuthConfig) bool { +func (r *Registry) LookupRemoteImage(imgId, registry string, token []string) bool { rt := &http.Transport{Proxy: http.ProxyFromEnvironment} req, err := http.NewRequest("GET", registry+"/images/"+imgId+"/json", nil) if err != nil { return false } - req.SetBasicAuth(authConfig.Username, authConfig.Password) res, err := rt.RoundTrip(req) if err != nil { return false } res.Body.Close() - return res.StatusCode == 307 + return res.StatusCode == 200 } func (r *Registry) getImagesInRepository(repository string, authConfig *auth.AuthConfig) ([]map[string]string, error) { diff --git a/components/engine/server.go b/components/engine/server.go index cdc01c6b09..615881cf78 100644 --- a/components/engine/server.go +++ b/components/engine/server.go @@ -351,17 +351,32 @@ func (srv *Server) pullImage(r *registry.Registry, out io.Writer, imgId, endpoin return nil } -func (srv *Server) pullRepository(r *registry.Registry, out io.Writer, local, remote, askedTag string, sf *utils.StreamFormatter) error { +func (srv *Server) pullRepository(r *registry.Registry, out io.Writer, local, remote, askedTag, registryEp string, sf *utils.StreamFormatter) error { out.Write(sf.FormatStatus("Pulling repository %s from %s", local, auth.IndexServerAddress())) repoData, err := r.GetRepositoryData(remote) if err != nil { return err } - utils.Debugf("Updating checksums") - // Reload the json file to make sure not to overwrite faster sums - if err := srv.runtime.graph.UpdateChecksums(repoData.ImgList); err != nil { - return err + var repoData *registry.RepositoryData + var err error + if registryEp == "" { + repoData, err = srv.registry.GetRepositoryData(remote) + if err != nil { + return err + } + + utils.Debugf("Updating checksums") + // Reload the json file to make sure not to overwrite faster sums + if err := srv.runtime.graph.UpdateChecksums(repoData.ImgList); err != nil { + return err + } + } else { + repoData = ®istry.RepositoryData{ + Tokens: []string{}, + ImgList: make(map[string]*registry.ImgData), + Endpoints: []string{registryEp}, + } } utils.Debugf("Retrieving the tag list") @@ -369,8 +384,19 @@ func (srv *Server) pullRepository(r *registry.Registry, out io.Writer, local, re if err != nil { return err } + + if registryEp != "" { + for tag, id := range tagsList { + repoData.ImgList[id] = ®istry.ImgData{ + Id: id, + Tag: tag, + Checksum: "", + } + } + } + utils.Debugf("Registering tags") - // If not specific tag have been asked, take all + // If no tag has been specified, pull them all if askedTag == "" { for tag, id := range tagsList { repoData.ImgList[id].Tag = tag @@ -547,7 +573,7 @@ func (srv *Server) getImageList(localRepo map[string]string) ([]*registry.ImgDat return imgList, nil } -func (srv *Server) pushRepository(r *registry.Registry, out io.Writer, name string, localRepo map[string]string, sf *utils.StreamFormatter) error { +func (srv *Server) pushRepository(r *registry.Registry, out io.Writer, name, registryEp string, localRepo map[string]string, sf *utils.StreamFormatter) error { out = utils.NewWriteFlusher(out) out.Write(sf.FormatStatus("Processing checksums")) imgList, err := srv.getImageList(localRepo) @@ -555,16 +581,35 @@ func (srv *Server) pushRepository(r *registry.Registry, out io.Writer, name stri return err } out.Write(sf.FormatStatus("Sending image list")) - srvName := name parts := strings.Split(name, "/") if len(parts) > 2 { srvName = fmt.Sprintf("src/%s", url.QueryEscape(strings.Join(parts, "/"))) } - repoData, err := r.PushImageJSONIndex(srvName, imgList, false, nil) - if err != nil { - return err + var repoData *registry.RepositoryData + if registryEp == "" { + repoData, err = srv.registry.PushImageJsonIndex(name, imgList, false) + if err != nil { + return err + } + } else { + repoData = ®istry.RepositoryData{ + ImgList: make(map[string]*registry.ImgData), + Tokens: []string{}, + Endpoints: []string{registryEp}, + } + tagsList, err := srv.registry.GetRemoteTags(repoData.Endpoints, name, repoData.Tokens) + if err != nil { + return err + } + for tag, id := range tagsList { + repoData.ImgList[id] = ®istry.ImgData{ + Id: id, + Tag: tag, + Checksum: "", + } + } } for _, ep := range repoData.Endpoints { @@ -574,6 +619,9 @@ func (srv *Server) pushRepository(r *registry.Registry, out io.Writer, name stri if _, exists := repoData.ImgList[elem.ID]; exists { out.Write(sf.FormatStatus("Image %s already on registry, skipping", name)) continue + } else if registryEp != "" && srv.registry.LookupRemoteImage(elem.Id, registryEp, repoData.Tokens) { + fmt.Fprintf(out, "Image %s already on registry, skipping\n", name) + continue } if err := srv.pushImage(r, out, name, elem.ID, ep, repoData.Tokens, sf); err != nil { // FIXME: Continue on error? @@ -586,9 +634,12 @@ func (srv *Server) pushRepository(r *registry.Registry, out io.Writer, name stri } } - if _, err := r.PushImageJSONIndex(srvName, imgList, true, repoData.Endpoints); err != nil { - return err + if registryEp == "" { + if _, err := srv.registry.PushImageJsonIndex(name, imgList, true); err != nil { + return err + } } + return nil } @@ -669,7 +720,7 @@ func (srv *Server) ImagePush(name, endpoint string, out io.Writer, sf *utils.Str out.Write(sf.FormatStatus("The push refers to a repository [%s] (len: %d)", name, len(srv.runtime.repositories.Repositories[name]))) // If it fails, try to get the repository if localRepo, exists := srv.runtime.repositories.Repositories[name]; exists { - if err := srv.pushRepository(r, out, name, localRepo, sf); err != nil { + if err := srv.pushRepository(r, out, name, registry, localRepo, sf); err != nil { return err } return nil From 6af1e08d14304523c9c8f5702e9e5eb648e56a5f Mon Sep 17 00:00:00 2001 From: shin- Date: Wed, 29 May 2013 11:24:50 -0700 Subject: [PATCH 02/10] Skip certificate check (don't error out on self-signed certs) Upstream-commit: 1c817913eee7d87badc2a2748447729619d8aaf0 Component: engine --- components/engine/registry/registry.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/components/engine/registry/registry.go b/components/engine/registry/registry.go index 5d642b392f..864f3e8bfe 100644 --- a/components/engine/registry/registry.go +++ b/components/engine/registry/registry.go @@ -2,6 +2,7 @@ package registry import ( "bytes" + "crypto/tls" "encoding/json" "errors" "fmt" @@ -164,6 +165,7 @@ func (r *Registry) GetRemoteTags(registries []string, repository string, token [ if err != nil { return nil, err } + utils.Debugf("Got status code %d from %s", res.StatusCode, endpoint) defer res.Body.Close() From a944a8deb62b3171b20cb0d367e61640992cc25e Mon Sep 17 00:00:00 2001 From: shin- Date: Wed, 29 May 2013 11:25:49 -0700 Subject: [PATCH 03/10] Ignore 'registry not found' when pushing on independent registries Upstream-commit: 2a1f8f6fda55a5fa2132dbad374043e9fbf6d9f6 Component: engine --- components/engine/server.go | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/components/engine/server.go b/components/engine/server.go index 615881cf78..9b62b768c1 100644 --- a/components/engine/server.go +++ b/components/engine/server.go @@ -600,14 +600,15 @@ func (srv *Server) pushRepository(r *registry.Registry, out io.Writer, name, reg Endpoints: []string{registryEp}, } tagsList, err := srv.registry.GetRemoteTags(repoData.Endpoints, name, repoData.Tokens) - if err != nil { + if err != nil && err.Error() != "Repository not found" { return err - } - for tag, id := range tagsList { - repoData.ImgList[id] = ®istry.ImgData{ - Id: id, - Tag: tag, - Checksum: "", + } else if err == nil { + for tag, id := range tagsList { + repoData.ImgList[id] = ®istry.ImgData{ + Id: id, + Tag: tag, + Checksum: "", + } } } } From 3635092ee9df90a4b9480f5fbc3afd02f745cf1c Mon Sep 17 00:00:00 2001 From: shin- Date: Wed, 29 May 2013 11:39:31 -0700 Subject: [PATCH 04/10] Rolled back of previous commit (skip cert verification) Upstream-commit: 50075106b658ab4dc82d5361e4786f7d28cc570a Component: engine --- components/engine/registry/registry.go | 1 - 1 file changed, 1 deletion(-) diff --git a/components/engine/registry/registry.go b/components/engine/registry/registry.go index 864f3e8bfe..30b91cef92 100644 --- a/components/engine/registry/registry.go +++ b/components/engine/registry/registry.go @@ -2,7 +2,6 @@ package registry import ( "bytes" - "crypto/tls" "encoding/json" "errors" "fmt" From 01a345c7fb7d8ac7872ecde2b16082db2cb027f9 Mon Sep 17 00:00:00 2001 From: "Guillaume J. Charmes" Date: Wed, 5 Jun 2013 15:12:50 -0700 Subject: [PATCH 05/10] Remove https prefix from registry Upstream-commit: 57d751c3770194ff867ebace36eb1be7d72d2fe9 Component: engine --- components/engine/registry/registry.go | 8 ++++---- components/engine/server.go | 3 ++- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/components/engine/registry/registry.go b/components/engine/registry/registry.go index 30b91cef92..29a1f29e1f 100644 --- a/components/engine/registry/registry.go +++ b/components/engine/registry/registry.go @@ -154,7 +154,7 @@ func (r *Registry) GetRemoteTags(registries []string, repository string, token [ repository = "library/" + repository } for _, host := range registries { - endpoint := fmt.Sprintf("https://%s/v1/repositories/%s/tags", host, repository) + endpoint := fmt.Sprintf("%s/v1/repositories/%s/tags", host, repository) req, err := r.opaqueRequest("GET", endpoint, nil) if err != nil { return nil, err @@ -249,7 +249,7 @@ func (r *Registry) GetRepositoryData(remote string) (*RepositoryData, error) { // Push a local image to the registry func (r *Registry) PushImageJSONRegistry(imgData *ImgData, jsonRaw []byte, registry string, token []string) error { - registry = "https://" + registry + "/v1" + registry = registry + "/v1" // FIXME: try json with UTF8 req, err := http.NewRequest("PUT", registry+"/images/"+imgData.ID+"/json", strings.NewReader(string(jsonRaw))) if err != nil { @@ -285,7 +285,7 @@ func (r *Registry) PushImageJSONRegistry(imgData *ImgData, jsonRaw []byte, regis } func (r *Registry) PushImageLayerRegistry(imgId string, layer io.Reader, registry string, token []string) error { - registry = "https://" + registry + "/v1" + registry = registry + "/v1" req, err := http.NewRequest("PUT", registry+"/images/"+imgId+"/layer", layer) if err != nil { return err @@ -323,7 +323,7 @@ func (r *Registry) opaqueRequest(method, urlStr string, body io.Reader) (*http.R func (r *Registry) PushRegistryTag(remote, revision, tag, registry string, token []string) error { // "jsonify" the string revision = "\"" + revision + "\"" - registry = "https://" + registry + "/v1" + registry = registry + "/v1" req, err := r.opaqueRequest("PUT", registry+"/repositories/"+remote+"/tags/"+tag, strings.NewReader(revision)) if err != nil { diff --git a/components/engine/server.go b/components/engine/server.go index 9b62b768c1..7f866d626b 100644 --- a/components/engine/server.go +++ b/components/engine/server.go @@ -418,7 +418,7 @@ func (srv *Server) pullRepository(r *registry.Registry, out io.Writer, local, re out.Write(sf.FormatStatus("Pulling image %s (%s) from %s", img.ID, img.Tag, remote)) success := false for _, ep := range repoData.Endpoints { - if err := srv.pullImage(r, out, img.ID, "https://"+ep+"/v1", repoData.Tokens, sf); err != nil { + if err := srv.pullImage(r, out, img.ID, ep+"/v1", repoData.Tokens, sf); err != nil { out.Write(sf.FormatStatus("Error while retrieving image for tag: %s (%s); checking next endpoint", askedTag, err)) continue } @@ -717,6 +717,7 @@ func (srv *Server) ImagePush(name, endpoint string, out io.Writer, sf *utils.Str if err2 != nil { return err2 } + if err != nil { out.Write(sf.FormatStatus("The push refers to a repository [%s] (len: %d)", name, len(srv.runtime.repositories.Repositories[name]))) // If it fails, try to get the repository From d5e7a7e8e9799a17ae73895ca38f9a21d54ffbea Mon Sep 17 00:00:00 2001 From: "Guillaume J. Charmes" Date: Wed, 5 Jun 2013 15:13:01 -0700 Subject: [PATCH 06/10] Reenable writeflusher for pull Upstream-commit: 67ecd2cb822894e4d35adea031e5b79d7ca8e91a Component: engine --- components/engine/server.go | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/components/engine/server.go b/components/engine/server.go index 7f866d626b..457f1c02dc 100644 --- a/components/engine/server.go +++ b/components/engine/server.go @@ -444,6 +444,7 @@ func (srv *Server) pullRepository(r *registry.Registry, out io.Writer, local, re return nil } + func (srv *Server) poolAdd(kind, key string) error { srv.lock.Lock() defer srv.lock.Unlock() @@ -478,7 +479,6 @@ func (srv *Server) poolRemove(kind, key string) error { } return nil } - func (srv *Server) ImagePull(name, tag, endpoint string, out io.Writer, sf *utils.StreamFormatter, authConfig *auth.AuthConfig) error { r, err := registry.NewRegistry(srv.runtime.root, authConfig) if err != nil { @@ -489,21 +489,21 @@ func (srv *Server) ImagePull(name, tag, endpoint string, out io.Writer, sf *util } defer srv.poolRemove("pull", name+":"+tag) - out = utils.NewWriteFlusher(out) - if endpoint != "" { - if err := srv.pullImage(r, out, name, endpoint, nil, sf); err != nil { - return err - } - return nil - } remote := name parts := strings.Split(name, "/") if len(parts) > 2 { remote = fmt.Sprintf("src/%s", url.QueryEscape(strings.Join(parts, "/"))) } - if err := srv.pullRepository(r, out, name, remote, tag, sf); err != nil { - return err + out = utils.NewWriteFlusher(out) + + err := srv.pullRepository(r, out, name, tag, endpoint, sf) + if err != nil && endpoint != "" { + if err := srv.pullImage(r, out, name, endpoint, nil, sf); err != nil { + return err + } + return nil } + return nil } From 4eec06d21726cf0e78a1212e8c0d02caa1a17474 Mon Sep 17 00:00:00 2001 From: shin- Date: Tue, 25 Jun 2013 21:03:42 +0200 Subject: [PATCH 07/10] Several fixes and updates to make this work with latest changes in master Upstream-commit: c3dd6e1926f9359f840a9f7b0be9cfa7fe2cfea2 Component: engine --- components/engine/server.go | 30 ++++++++++++++++-------------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/components/engine/server.go b/components/engine/server.go index 457f1c02dc..9f9dcb7731 100644 --- a/components/engine/server.go +++ b/components/engine/server.go @@ -353,15 +353,11 @@ func (srv *Server) pullImage(r *registry.Registry, out io.Writer, imgId, endpoin func (srv *Server) pullRepository(r *registry.Registry, out io.Writer, local, remote, askedTag, registryEp string, sf *utils.StreamFormatter) error { out.Write(sf.FormatStatus("Pulling repository %s from %s", local, auth.IndexServerAddress())) - repoData, err := r.GetRepositoryData(remote) - if err != nil { - return err - } var repoData *registry.RepositoryData var err error if registryEp == "" { - repoData, err = srv.registry.GetRepositoryData(remote) + repoData, err = r.GetRepositoryData(remote) if err != nil { return err } @@ -382,13 +378,14 @@ func (srv *Server) pullRepository(r *registry.Registry, out io.Writer, local, re utils.Debugf("Retrieving the tag list") tagsList, err := r.GetRemoteTags(repoData.Endpoints, remote, repoData.Tokens) if err != nil { + utils.Debugf("%v", err) return err } if registryEp != "" { for tag, id := range tagsList { repoData.ImgList[id] = ®istry.ImgData{ - Id: id, + ID: id, Tag: tag, Checksum: "", } @@ -418,6 +415,9 @@ func (srv *Server) pullRepository(r *registry.Registry, out io.Writer, local, re out.Write(sf.FormatStatus("Pulling image %s (%s) from %s", img.ID, img.Tag, remote)) success := false for _, ep := range repoData.Endpoints { + if !(strings.HasPrefix(ep, "http://") || strings.HasPrefix(ep, "https://")) { + ep = "https://" + ep + } if err := srv.pullImage(r, out, img.ID, ep+"/v1", repoData.Tokens, sf); err != nil { out.Write(sf.FormatStatus("Error while retrieving image for tag: %s (%s); checking next endpoint", askedTag, err)) continue @@ -495,8 +495,7 @@ func (srv *Server) ImagePull(name, tag, endpoint string, out io.Writer, sf *util remote = fmt.Sprintf("src/%s", url.QueryEscape(strings.Join(parts, "/"))) } out = utils.NewWriteFlusher(out) - - err := srv.pullRepository(r, out, name, tag, endpoint, sf) + err = srv.pullRepository(r, out, name, remote, tag, endpoint, sf) if err != nil && endpoint != "" { if err := srv.pullImage(r, out, name, endpoint, nil, sf); err != nil { return err @@ -589,7 +588,7 @@ func (srv *Server) pushRepository(r *registry.Registry, out io.Writer, name, reg var repoData *registry.RepositoryData if registryEp == "" { - repoData, err = srv.registry.PushImageJsonIndex(name, imgList, false) + repoData, err = r.PushImageJSONIndex(name, imgList, false, nil) if err != nil { return err } @@ -599,13 +598,13 @@ func (srv *Server) pushRepository(r *registry.Registry, out io.Writer, name, reg Tokens: []string{}, Endpoints: []string{registryEp}, } - tagsList, err := srv.registry.GetRemoteTags(repoData.Endpoints, name, repoData.Tokens) + tagsList, err := r.GetRemoteTags(repoData.Endpoints, name, repoData.Tokens) if err != nil && err.Error() != "Repository not found" { return err } else if err == nil { for tag, id := range tagsList { repoData.ImgList[id] = ®istry.ImgData{ - Id: id, + ID: id, Tag: tag, Checksum: "", } @@ -614,13 +613,16 @@ func (srv *Server) pushRepository(r *registry.Registry, out io.Writer, name, reg } for _, ep := range repoData.Endpoints { + if !(strings.HasPrefix(ep, "http://") || strings.HasPrefix(ep, "https://")) { + ep = "https://" + ep + } out.Write(sf.FormatStatus("Pushing repository %s to %s (%d tags)", name, ep, len(localRepo))) // For each image within the repo, push them for _, elem := range imgList { if _, exists := repoData.ImgList[elem.ID]; exists { out.Write(sf.FormatStatus("Image %s already on registry, skipping", name)) continue - } else if registryEp != "" && srv.registry.LookupRemoteImage(elem.Id, registryEp, repoData.Tokens) { + } else if registryEp != "" && r.LookupRemoteImage(elem.ID, registryEp, repoData.Tokens) { fmt.Fprintf(out, "Image %s already on registry, skipping\n", name) continue } @@ -636,7 +638,7 @@ func (srv *Server) pushRepository(r *registry.Registry, out io.Writer, name, reg } if registryEp == "" { - if _, err := srv.registry.PushImageJsonIndex(name, imgList, true); err != nil { + if _, err := r.PushImageJSONIndex(name, imgList, true, repoData.Endpoints); err != nil { return err } } @@ -722,7 +724,7 @@ func (srv *Server) ImagePush(name, endpoint string, out io.Writer, sf *utils.Str out.Write(sf.FormatStatus("The push refers to a repository [%s] (len: %d)", name, len(srv.runtime.repositories.Repositories[name]))) // If it fails, try to get the repository if localRepo, exists := srv.runtime.repositories.Repositories[name]; exists { - if err := srv.pushRepository(r, out, name, registry, localRepo, sf); err != nil { + if err := srv.pushRepository(r, out, name, endpoint, localRepo, sf); err != nil { return err } return nil From 0081ddc5450dc7a209ac0cf348f5e528fcb6c575 Mon Sep 17 00:00:00 2001 From: shin- Date: Thu, 27 Jun 2013 19:17:20 +0200 Subject: [PATCH 08/10] Allow push by ID when using a custom registry Upstream-commit: e095a1572fb8a2ba17ea231abcb3704cf83a96e4 Component: engine --- components/engine/commands.go | 29 ++++++++++++++++++----------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/components/engine/commands.go b/components/engine/commands.go index 6ada02d552..4ef63f4a22 100644 --- a/components/engine/commands.go +++ b/components/engine/commands.go @@ -736,23 +736,30 @@ func (cli *DockerCli) CmdPush(args ...string) error { return err } - if len(strings.SplitN(name, "/", 2)) == 1 { - return fmt.Errorf("Impossible to push a \"root\" repository. Please rename your repository in / (ex: %s/%s)", cli.authConfig.Username, name) + if *registry == "" { + // If we're not using a custom registry, we know the restrictions + // applied to repository names and can warn the user in advance. + // Custom repositories can have different rules, and we must also + // allow pushing by image ID. + if len(strings.SplitN(name, "/", 2)) == 1 { + return fmt.Errorf("Impossible to push a \"root\" repository. Please rename your repository in / (ex: %s/%s)", cli.authConfig.Username, name) + } + + nameParts := strings.SplitN(name, "/", 2) + validNamespace := regexp.MustCompile(`^([a-z0-9_]{4,30})$`) + if !validNamespace.MatchString(nameParts[0]) { + return fmt.Errorf("Invalid namespace name (%s), only [a-z0-9_] are allowed, size between 4 and 30", nameParts[0]) + } + validRepo := regexp.MustCompile(`^([a-zA-Z0-9-_.]+)$`) + if !validRepo.MatchString(nameParts[1]) { + return fmt.Errorf("Invalid repository name (%s), only [a-zA-Z0-9-_.] are allowed", nameParts[1]) + } } buf, err := json.Marshal(cli.authConfig) if err != nil { return err } - nameParts := strings.SplitN(name, "/", 2) - validNamespace := regexp.MustCompile(`^([a-z0-9_]{4,30})$`) - if !validNamespace.MatchString(nameParts[0]) { - return fmt.Errorf("Invalid namespace name (%s), only [a-z0-9_] are allowed, size between 4 and 30", nameParts[0]) - } - validRepo := regexp.MustCompile(`^([a-zA-Z0-9-_.]+)$`) - if !validRepo.MatchString(nameParts[1]) { - return fmt.Errorf("Invalid repository name (%s), only [a-zA-Z0-9-_.] are allowed", nameParts[1]) - } v := url.Values{} v.Set("registry", *registry) From c2894b0393dc0ef790cf292077188994d450ce17 Mon Sep 17 00:00:00 2001 From: shin- Date: Fri, 28 Jun 2013 18:16:19 +0200 Subject: [PATCH 09/10] go fmt pass Upstream-commit: ad2f826a825be2889057a773eff1a2bc605e8e80 Component: engine --- components/engine/server.go | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/components/engine/server.go b/components/engine/server.go index 9f9dcb7731..0e5aa97411 100644 --- a/components/engine/server.go +++ b/components/engine/server.go @@ -369,8 +369,8 @@ func (srv *Server) pullRepository(r *registry.Registry, out io.Writer, local, re } } else { repoData = ®istry.RepositoryData{ - Tokens: []string{}, - ImgList: make(map[string]*registry.ImgData), + Tokens: []string{}, + ImgList: make(map[string]*registry.ImgData), Endpoints: []string{registryEp}, } } @@ -385,8 +385,8 @@ func (srv *Server) pullRepository(r *registry.Registry, out io.Writer, local, re if registryEp != "" { for tag, id := range tagsList { repoData.ImgList[id] = ®istry.ImgData{ - ID: id, - Tag: tag, + ID: id, + Tag: tag, Checksum: "", } } @@ -444,7 +444,6 @@ func (srv *Server) pullRepository(r *registry.Registry, out io.Writer, local, re return nil } - func (srv *Server) poolAdd(kind, key string) error { srv.lock.Lock() defer srv.lock.Unlock() @@ -594,8 +593,8 @@ func (srv *Server) pushRepository(r *registry.Registry, out io.Writer, name, reg } } else { repoData = ®istry.RepositoryData{ - ImgList: make(map[string]*registry.ImgData), - Tokens: []string{}, + ImgList: make(map[string]*registry.ImgData), + Tokens: []string{}, Endpoints: []string{registryEp}, } tagsList, err := r.GetRemoteTags(repoData.Endpoints, name, repoData.Tokens) @@ -604,8 +603,8 @@ func (srv *Server) pushRepository(r *registry.Registry, out io.Writer, name, reg } else if err == nil { for tag, id := range tagsList { repoData.ImgList[id] = ®istry.ImgData{ - ID: id, - Tag: tag, + ID: id, + Tag: tag, Checksum: "", } } From 8c9ba170e13cf0aae97d0b196171706451bacda8 Mon Sep 17 00:00:00 2001 From: shin- Date: Fri, 28 Jun 2013 18:42:37 +0200 Subject: [PATCH 10/10] Fixed issue in registry.GetRemoteTags Upstream-commit: 72befeef24b3fb0c77f56e3ac2bbfdb4744cbd7a Component: engine --- components/engine/registry/registry.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/components/engine/registry/registry.go b/components/engine/registry/registry.go index 29a1f29e1f..456e432198 100644 --- a/components/engine/registry/registry.go +++ b/components/engine/registry/registry.go @@ -155,6 +155,9 @@ func (r *Registry) GetRemoteTags(registries []string, repository string, token [ } for _, host := range registries { endpoint := fmt.Sprintf("%s/v1/repositories/%s/tags", host, repository) + if !(strings.HasPrefix(endpoint, "http://") || strings.HasPrefix(endpoint, "https://")) { + endpoint = "https://" + endpoint + } req, err := r.opaqueRequest("GET", endpoint, nil) if err != nil { return nil, err