2016-09-05 22:44:19 -04:00
|
|
|
package registry
|
|
|
|
|
|
|
|
import (
|
2017-03-01 18:39:18 -05:00
|
|
|
"net/url"
|
2016-09-20 21:16:34 -04:00
|
|
|
"strings"
|
|
|
|
|
2016-09-05 22:44:19 -04:00
|
|
|
"github.com/docker/distribution/manifest/schema1"
|
|
|
|
"github.com/docker/distribution/manifest/schema2"
|
|
|
|
)
|
|
|
|
|
|
|
|
// Manifest returns the manifest for a specific repository:tag.
|
|
|
|
func (r *Registry) Manifest(repository, ref string) (interface{}, error) {
|
2017-03-01 18:39:18 -05:00
|
|
|
uri := r.url("/v2/%s/manifests/%s", repository, url.PathEscape(ref))
|
|
|
|
r.Logf("registry.manifests uri=%s repository=%s ref=%s", uri, repository, ref)
|
2016-09-05 22:44:19 -04:00
|
|
|
|
|
|
|
var m schema2.Manifest
|
2017-03-01 18:39:18 -05:00
|
|
|
h, err := r.getJSON(uri, &m, true)
|
2016-09-20 21:16:34 -04:00
|
|
|
if err != nil {
|
2016-09-05 22:44:19 -04:00
|
|
|
return m, err
|
|
|
|
}
|
|
|
|
|
2016-09-20 21:16:34 -04:00
|
|
|
if !strings.Contains(ref, ":") {
|
|
|
|
// we got a tag, get the manifest for the ref
|
2016-12-20 00:13:34 -05:00
|
|
|
r.Logf("ref: %s", h.Get("Docker-Content-Digest"))
|
2016-09-20 21:16:34 -04:00
|
|
|
}
|
|
|
|
|
2016-09-05 22:44:19 -04:00
|
|
|
if m.Versioned.SchemaVersion == 1 {
|
2017-02-12 21:45:47 -05:00
|
|
|
return r.ManifestV1(repository, ref)
|
2016-09-05 22:44:19 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
return m, nil
|
|
|
|
}
|
|
|
|
|
2017-02-12 21:45:47 -05:00
|
|
|
// ManifestV1 gets the registry v1 manifest.
|
|
|
|
func (r *Registry) ManifestV1(repository, ref string) (schema1.SignedManifest, error) {
|
2017-03-01 18:39:18 -05:00
|
|
|
uri := r.url("/v2/%s/manifests/%s", repository, url.PathEscape(ref))
|
|
|
|
r.Logf("registry.manifests uri=%s repository=%s ref=%s", uri, repository, ref)
|
2016-09-05 22:44:19 -04:00
|
|
|
|
|
|
|
var m schema1.SignedManifest
|
2017-03-01 18:39:18 -05:00
|
|
|
if _, err := r.getJSON(uri, &m, false); err != nil {
|
2016-09-05 22:44:19 -04:00
|
|
|
return m, err
|
|
|
|
}
|
|
|
|
|
|
|
|
return m, nil
|
|
|
|
}
|