Change URLBuilder methods to use references for tags and digests
Signed-off-by: Aaron Lehmann <aaron.lehmann@docker.com>master
							parent
							
								
									4441333912
								
							
						
					
					
						commit
						2b20b0167a
					
				|  | @ -6,7 +6,6 @@ import ( | ||||||
| 
 | 
 | ||||||
| 	"github.com/docker/distribution" | 	"github.com/docker/distribution" | ||||||
| 	"github.com/docker/distribution/context" | 	"github.com/docker/distribution/context" | ||||||
| 	"github.com/docker/distribution/digest" |  | ||||||
| 	"github.com/docker/distribution/reference" | 	"github.com/docker/distribution/reference" | ||||||
| 	"github.com/docker/distribution/uuid" | 	"github.com/docker/distribution/uuid" | ||||||
| ) | ) | ||||||
|  | @ -23,8 +22,8 @@ var _ Listener = &bridge{} | ||||||
| 
 | 
 | ||||||
| // URLBuilder defines a subset of url builder to be used by the event listener.
 | // URLBuilder defines a subset of url builder to be used by the event listener.
 | ||||||
| type URLBuilder interface { | type URLBuilder interface { | ||||||
| 	BuildManifestURL(name reference.Named, tag string) (string, error) | 	BuildManifestURL(name reference.Named) (string, error) | ||||||
| 	BuildBlobURL(name reference.Named, dgst digest.Digest) (string, error) | 	BuildBlobURL(ref reference.Canonical) (string, error) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // NewBridge returns a notification listener that writes records to sink,
 | // NewBridge returns a notification listener that writes records to sink,
 | ||||||
|  | @ -115,7 +114,12 @@ func (b *bridge) createManifestEvent(action string, repo reference.Named, sm dis | ||||||
| 	event.Target.Size = desc.Size | 	event.Target.Size = desc.Size | ||||||
| 	event.Target.Digest = desc.Digest | 	event.Target.Digest = desc.Digest | ||||||
| 
 | 
 | ||||||
| 	event.Target.URL, err = b.ub.BuildManifestURL(repo, event.Target.Digest.String()) | 	ref, err := reference.WithDigest(repo, event.Target.Digest) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	event.Target.URL, err = b.ub.BuildManifestURL(ref) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, err | 		return nil, err | ||||||
| 	} | 	} | ||||||
|  | @ -138,8 +142,12 @@ func (b *bridge) createBlobEvent(action string, repo reference.Named, desc distr | ||||||
| 	event.Target.Length = desc.Size | 	event.Target.Length = desc.Size | ||||||
| 	event.Target.Repository = repo.Name() | 	event.Target.Repository = repo.Name() | ||||||
| 
 | 
 | ||||||
| 	var err error | 	ref, err := reference.WithDigest(repo, desc.Digest) | ||||||
| 	event.Target.URL, err = b.ub.BuildBlobURL(repo, desc.Digest) | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	event.Target.URL, err = b.ub.BuildBlobURL(ref) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, err | 		return nil, err | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | @ -100,7 +100,8 @@ func checkCommonManifest(t *testing.T, action string, events ...Event) { | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	repoRef, _ := reference.ParseNamed(repo) | 	repoRef, _ := reference.ParseNamed(repo) | ||||||
| 	u, err := ub.BuildManifestURL(repoRef, dgst.String()) | 	ref, _ := reference.WithDigest(repoRef, dgst) | ||||||
|  | 	u, err := ub.BuildManifestURL(ref) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		t.Fatalf("error building expected url: %v", err) | 		t.Fatalf("error building expected url: %v", err) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | @ -5,7 +5,6 @@ import ( | ||||||
| 	"net/url" | 	"net/url" | ||||||
| 	"strings" | 	"strings" | ||||||
| 
 | 
 | ||||||
| 	"github.com/docker/distribution/digest" |  | ||||||
| 	"github.com/docker/distribution/reference" | 	"github.com/docker/distribution/reference" | ||||||
| 	"github.com/gorilla/mux" | 	"github.com/gorilla/mux" | ||||||
| ) | ) | ||||||
|  | @ -127,10 +126,18 @@ func (ub *URLBuilder) BuildTagsURL(name reference.Named) (string, error) { | ||||||
| 
 | 
 | ||||||
| // BuildManifestURL constructs a url for the manifest identified by name and
 | // BuildManifestURL constructs a url for the manifest identified by name and
 | ||||||
| // reference. The argument reference may be either a tag or digest.
 | // reference. The argument reference may be either a tag or digest.
 | ||||||
| func (ub *URLBuilder) BuildManifestURL(name reference.Named, reference string) (string, error) { | func (ub *URLBuilder) BuildManifestURL(ref reference.Named) (string, error) { | ||||||
| 	route := ub.cloneRoute(RouteNameManifest) | 	route := ub.cloneRoute(RouteNameManifest) | ||||||
| 
 | 
 | ||||||
| 	manifestURL, err := route.URL("name", name.Name(), "reference", reference) | 	tagOrDigest := "" | ||||||
|  | 	switch v := ref.(type) { | ||||||
|  | 	case reference.Tagged: | ||||||
|  | 		tagOrDigest = v.Tag() | ||||||
|  | 	case reference.Digested: | ||||||
|  | 		tagOrDigest = v.Digest().String() | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	manifestURL, err := route.URL("name", ref.Name(), "reference", tagOrDigest) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return "", err | 		return "", err | ||||||
| 	} | 	} | ||||||
|  | @ -139,10 +146,10 @@ func (ub *URLBuilder) BuildManifestURL(name reference.Named, reference string) ( | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // BuildBlobURL constructs the url for the blob identified by name and dgst.
 | // BuildBlobURL constructs the url for the blob identified by name and dgst.
 | ||||||
| func (ub *URLBuilder) BuildBlobURL(name reference.Named, dgst digest.Digest) (string, error) { | func (ub *URLBuilder) BuildBlobURL(ref reference.Canonical) (string, error) { | ||||||
| 	route := ub.cloneRoute(RouteNameBlob) | 	route := ub.cloneRoute(RouteNameBlob) | ||||||
| 
 | 
 | ||||||
| 	layerURL, err := route.URL("name", name.Name(), "digest", dgst.String()) | 	layerURL, err := route.URL("name", ref.Name(), "digest", ref.Digest().String()) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return "", err | 		return "", err | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | @ -33,14 +33,16 @@ func makeURLBuilderTestCases(urlBuilder *URLBuilder) []urlBuilderTestCase { | ||||||
| 			description:  "test manifest url", | 			description:  "test manifest url", | ||||||
| 			expectedPath: "/v2/foo/bar/manifests/tag", | 			expectedPath: "/v2/foo/bar/manifests/tag", | ||||||
| 			build: func() (string, error) { | 			build: func() (string, error) { | ||||||
| 				return urlBuilder.BuildManifestURL(fooBarRef, "tag") | 				ref, _ := reference.WithTag(fooBarRef, "tag") | ||||||
|  | 				return urlBuilder.BuildManifestURL(ref) | ||||||
| 			}, | 			}, | ||||||
| 		}, | 		}, | ||||||
| 		{ | 		{ | ||||||
| 			description:  "build blob url", | 			description:  "build blob url", | ||||||
| 			expectedPath: "/v2/foo/bar/blobs/sha256:3b3692957d439ac1928219a83fac91e7bf96c153725526874673ae1f2023f8d5", | 			expectedPath: "/v2/foo/bar/blobs/sha256:3b3692957d439ac1928219a83fac91e7bf96c153725526874673ae1f2023f8d5", | ||||||
| 			build: func() (string, error) { | 			build: func() (string, error) { | ||||||
| 				return urlBuilder.BuildBlobURL(fooBarRef, "sha256:3b3692957d439ac1928219a83fac91e7bf96c153725526874673ae1f2023f8d5") | 				ref, _ := reference.WithDigest(fooBarRef, "sha256:3b3692957d439ac1928219a83fac91e7bf96c153725526874673ae1f2023f8d5") | ||||||
|  | 				return urlBuilder.BuildBlobURL(ref) | ||||||
| 			}, | 			}, | ||||||
| 		}, | 		}, | ||||||
| 		{ | 		{ | ||||||
|  |  | ||||||
|  | @ -249,7 +249,11 @@ func descriptorFromResponse(response *http.Response) (distribution.Descriptor, e | ||||||
| // to construct a descriptor for the tag.  If the registry doesn't support HEADing
 | // to construct a descriptor for the tag.  If the registry doesn't support HEADing
 | ||||||
| // a manifest, fallback to GET.
 | // a manifest, fallback to GET.
 | ||||||
| func (t *tags) Get(ctx context.Context, tag string) (distribution.Descriptor, error) { | func (t *tags) Get(ctx context.Context, tag string) (distribution.Descriptor, error) { | ||||||
| 	u, err := t.ub.BuildManifestURL(t.name, tag) | 	ref, err := reference.WithTag(t.name, tag) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return distribution.Descriptor{}, err | ||||||
|  | 	} | ||||||
|  | 	u, err := t.ub.BuildManifestURL(ref) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return distribution.Descriptor{}, err | 		return distribution.Descriptor{}, err | ||||||
| 	} | 	} | ||||||
|  | @ -296,7 +300,11 @@ type manifests struct { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (ms *manifests) Exists(ctx context.Context, dgst digest.Digest) (bool, error) { | func (ms *manifests) Exists(ctx context.Context, dgst digest.Digest) (bool, error) { | ||||||
| 	u, err := ms.ub.BuildManifestURL(ms.name, dgst.String()) | 	ref, err := reference.WithDigest(ms.name, dgst) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return false, err | ||||||
|  | 	} | ||||||
|  | 	u, err := ms.ub.BuildManifestURL(ref) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return false, err | 		return false, err | ||||||
| 	} | 	} | ||||||
|  | @ -333,11 +341,19 @@ func (o etagOption) Apply(ms distribution.ManifestService) error { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (ms *manifests) Get(ctx context.Context, dgst digest.Digest, options ...distribution.ManifestServiceOption) (distribution.Manifest, error) { | func (ms *manifests) Get(ctx context.Context, dgst digest.Digest, options ...distribution.ManifestServiceOption) (distribution.Manifest, error) { | ||||||
|  | 	var ( | ||||||
|  | 		digestOrTag string | ||||||
|  | 		ref         reference.Named | ||||||
|  | 		err         error | ||||||
|  | 	) | ||||||
| 
 | 
 | ||||||
| 	var tag string |  | ||||||
| 	for _, option := range options { | 	for _, option := range options { | ||||||
| 		if opt, ok := option.(withTagOption); ok { | 		if opt, ok := option.(withTagOption); ok { | ||||||
| 			tag = opt.tag | 			digestOrTag = opt.tag | ||||||
|  | 			ref, err = reference.WithTag(ms.name, opt.tag) | ||||||
|  | 			if err != nil { | ||||||
|  | 				return nil, err | ||||||
|  | 			} | ||||||
| 		} else { | 		} else { | ||||||
| 			err := option.Apply(ms) | 			err := option.Apply(ms) | ||||||
| 			if err != nil { | 			if err != nil { | ||||||
|  | @ -346,14 +362,15 @@ func (ms *manifests) Get(ctx context.Context, dgst digest.Digest, options ...dis | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	var ref string | 	if digestOrTag == "" { | ||||||
| 	if tag != "" { | 		digestOrTag = dgst.String() | ||||||
| 		ref = tag | 		ref, err = reference.WithDigest(ms.name, dgst) | ||||||
| 	} else { | 		if err != nil { | ||||||
| 		ref = dgst.String() | 			return nil, err | ||||||
|  | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	u, err := ms.ub.BuildManifestURL(ms.name, ref) | 	u, err := ms.ub.BuildManifestURL(ref) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, err | 		return nil, err | ||||||
| 	} | 	} | ||||||
|  | @ -367,8 +384,8 @@ func (ms *manifests) Get(ctx context.Context, dgst digest.Digest, options ...dis | ||||||
| 		req.Header.Add("Accept", t) | 		req.Header.Add("Accept", t) | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if _, ok := ms.etags[ref]; ok { | 	if _, ok := ms.etags[digestOrTag]; ok { | ||||||
| 		req.Header.Set("If-None-Match", ms.etags[ref]) | 		req.Header.Set("If-None-Match", ms.etags[digestOrTag]) | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	resp, err := ms.client.Do(req) | 	resp, err := ms.client.Do(req) | ||||||
|  | @ -412,11 +429,15 @@ func (o withTagOption) Apply(m distribution.ManifestService) error { | ||||||
| // Put puts a manifest.  A tag can be specified using an options parameter which uses some shared state to hold the
 | // Put puts a manifest.  A tag can be specified using an options parameter which uses some shared state to hold the
 | ||||||
| // tag name in order to build the correct upload URL.  This state is written and read under a lock.
 | // tag name in order to build the correct upload URL.  This state is written and read under a lock.
 | ||||||
| func (ms *manifests) Put(ctx context.Context, m distribution.Manifest, options ...distribution.ManifestServiceOption) (digest.Digest, error) { | func (ms *manifests) Put(ctx context.Context, m distribution.Manifest, options ...distribution.ManifestServiceOption) (digest.Digest, error) { | ||||||
| 	var tag string | 	ref := ms.name | ||||||
| 
 | 
 | ||||||
| 	for _, option := range options { | 	for _, option := range options { | ||||||
| 		if opt, ok := option.(withTagOption); ok { | 		if opt, ok := option.(withTagOption); ok { | ||||||
| 			tag = opt.tag | 			var err error | ||||||
|  | 			ref, err = reference.WithTag(ref, opt.tag) | ||||||
|  | 			if err != nil { | ||||||
|  | 				return "", err | ||||||
|  | 			} | ||||||
| 		} else { | 		} else { | ||||||
| 			err := option.Apply(ms) | 			err := option.Apply(ms) | ||||||
| 			if err != nil { | 			if err != nil { | ||||||
|  | @ -425,7 +446,7 @@ func (ms *manifests) Put(ctx context.Context, m distribution.Manifest, options . | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	manifestURL, err := ms.ub.BuildManifestURL(ms.name, tag) | 	manifestURL, err := ms.ub.BuildManifestURL(ref) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return "", err | 		return "", err | ||||||
| 	} | 	} | ||||||
|  | @ -462,7 +483,11 @@ func (ms *manifests) Put(ctx context.Context, m distribution.Manifest, options . | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (ms *manifests) Delete(ctx context.Context, dgst digest.Digest) error { | func (ms *manifests) Delete(ctx context.Context, dgst digest.Digest) error { | ||||||
| 	u, err := ms.ub.BuildManifestURL(ms.name, dgst.String()) | 	ref, err := reference.WithDigest(ms.name, dgst) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	u, err := ms.ub.BuildManifestURL(ref) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return err | 		return err | ||||||
| 	} | 	} | ||||||
|  | @ -527,7 +552,11 @@ func (bs *blobs) Get(ctx context.Context, dgst digest.Digest) ([]byte, error) { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (bs *blobs) Open(ctx context.Context, dgst digest.Digest) (distribution.ReadSeekCloser, error) { | func (bs *blobs) Open(ctx context.Context, dgst digest.Digest) (distribution.ReadSeekCloser, error) { | ||||||
| 	blobURL, err := bs.ub.BuildBlobURL(bs.name, dgst) | 	ref, err := reference.WithDigest(bs.name, dgst) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	blobURL, err := bs.ub.BuildBlobURL(ref) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, err | 		return nil, err | ||||||
| 	} | 	} | ||||||
|  | @ -668,7 +697,11 @@ type blobStatter struct { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (bs *blobStatter) Stat(ctx context.Context, dgst digest.Digest) (distribution.Descriptor, error) { | func (bs *blobStatter) Stat(ctx context.Context, dgst digest.Digest) (distribution.Descriptor, error) { | ||||||
| 	u, err := bs.ub.BuildBlobURL(bs.name, dgst) | 	ref, err := reference.WithDigest(bs.name, dgst) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return distribution.Descriptor{}, err | ||||||
|  | 	} | ||||||
|  | 	u, err := bs.ub.BuildBlobURL(ref) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return distribution.Descriptor{}, err | 		return distribution.Descriptor{}, err | ||||||
| 	} | 	} | ||||||
|  | @ -716,7 +749,11 @@ func buildCatalogValues(maxEntries int, last string) url.Values { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (bs *blobStatter) Clear(ctx context.Context, dgst digest.Digest) error { | func (bs *blobStatter) Clear(ctx context.Context, dgst digest.Digest) error { | ||||||
| 	blobURL, err := bs.ub.BuildBlobURL(bs.name, dgst) | 	ref, err := reference.WithDigest(bs.name, dgst) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	blobURL, err := bs.ub.BuildBlobURL(ref) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return err | 		return err | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | @ -301,7 +301,8 @@ func TestBlobDeleteDisabled(t *testing.T) { | ||||||
| 
 | 
 | ||||||
| 	imageName := args.imageName | 	imageName := args.imageName | ||||||
| 	layerDigest := args.layerDigest | 	layerDigest := args.layerDigest | ||||||
| 	layerURL, err := env.builder.BuildBlobURL(imageName, layerDigest) | 	ref, _ := reference.WithDigest(imageName, layerDigest) | ||||||
|  | 	layerURL, err := env.builder.BuildBlobURL(ref) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		t.Fatalf("error building url: %v", err) | 		t.Fatalf("error building url: %v", err) | ||||||
| 	} | 	} | ||||||
|  | @ -324,7 +325,8 @@ func testBlobAPI(t *testing.T, env *testEnv, args blobArgs) *testEnv { | ||||||
| 
 | 
 | ||||||
| 	// -----------------------------------
 | 	// -----------------------------------
 | ||||||
| 	// Test fetch for non-existent content
 | 	// Test fetch for non-existent content
 | ||||||
| 	layerURL, err := env.builder.BuildBlobURL(imageName, layerDigest) | 	ref, _ := reference.WithDigest(imageName, layerDigest) | ||||||
|  | 	layerURL, err := env.builder.BuildBlobURL(ref) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		t.Fatalf("error building url: %v", err) | 		t.Fatalf("error building url: %v", err) | ||||||
| 	} | 	} | ||||||
|  | @ -534,7 +536,8 @@ func testBlobDelete(t *testing.T, env *testEnv, args blobArgs) { | ||||||
| 	layerFile := args.layerFile | 	layerFile := args.layerFile | ||||||
| 	layerDigest := args.layerDigest | 	layerDigest := args.layerDigest | ||||||
| 
 | 
 | ||||||
| 	layerURL, err := env.builder.BuildBlobURL(imageName, layerDigest) | 	ref, _ := reference.WithDigest(imageName, layerDigest) | ||||||
|  | 	layerURL, err := env.builder.BuildBlobURL(ref) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		t.Fatalf(err.Error()) | 		t.Fatalf(err.Error()) | ||||||
| 	} | 	} | ||||||
|  | @ -617,7 +620,8 @@ func TestDeleteDisabled(t *testing.T) { | ||||||
| 		t.Fatalf("error creating random layer file: %v", err) | 		t.Fatalf("error creating random layer file: %v", err) | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	layerURL, err := env.builder.BuildBlobURL(imageName, layerDigest) | 	ref, _ := reference.WithDigest(imageName, layerDigest) | ||||||
|  | 	layerURL, err := env.builder.BuildBlobURL(ref) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		t.Fatalf("Error building blob URL") | 		t.Fatalf("Error building blob URL") | ||||||
| 	} | 	} | ||||||
|  | @ -642,7 +646,8 @@ func TestDeleteReadOnly(t *testing.T) { | ||||||
| 		t.Fatalf("error creating random layer file: %v", err) | 		t.Fatalf("error creating random layer file: %v", err) | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	layerURL, err := env.builder.BuildBlobURL(imageName, layerDigest) | 	ref, _ := reference.WithDigest(imageName, layerDigest) | ||||||
|  | 	layerURL, err := env.builder.BuildBlobURL(ref) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		t.Fatalf("Error building blob URL") | 		t.Fatalf("Error building blob URL") | ||||||
| 	} | 	} | ||||||
|  | @ -737,7 +742,8 @@ func TestManifestDeleteDisabled(t *testing.T) { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func testManifestDeleteDisabled(t *testing.T, env *testEnv, imageName reference.Named) { | func testManifestDeleteDisabled(t *testing.T, env *testEnv, imageName reference.Named) { | ||||||
| 	manifestURL, err := env.builder.BuildManifestURL(imageName, digest.DigestSha256EmptyTar) | 	ref, _ := reference.WithDigest(imageName, digest.DigestSha256EmptyTar) | ||||||
|  | 	manifestURL, err := env.builder.BuildManifestURL(ref) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		t.Fatalf("unexpected error getting manifest url: %v", err) | 		t.Fatalf("unexpected error getting manifest url: %v", err) | ||||||
| 	} | 	} | ||||||
|  | @ -755,7 +761,8 @@ func testManifestAPISchema1(t *testing.T, env *testEnv, imageName reference.Name | ||||||
| 	tag := "thetag" | 	tag := "thetag" | ||||||
| 	args := manifestArgs{imageName: imageName} | 	args := manifestArgs{imageName: imageName} | ||||||
| 
 | 
 | ||||||
| 	manifestURL, err := env.builder.BuildManifestURL(imageName, tag) | 	tagRef, _ := reference.WithTag(imageName, tag) | ||||||
|  | 	manifestURL, err := env.builder.BuildManifestURL(tagRef) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		t.Fatalf("unexpected error getting manifest url: %v", err) | 		t.Fatalf("unexpected error getting manifest url: %v", err) | ||||||
| 	} | 	} | ||||||
|  | @ -879,7 +886,8 @@ func testManifestAPISchema1(t *testing.T, env *testEnv, imageName reference.Name | ||||||
| 	args.manifest = signedManifest | 	args.manifest = signedManifest | ||||||
| 	args.dgst = dgst | 	args.dgst = dgst | ||||||
| 
 | 
 | ||||||
| 	manifestDigestURL, err := env.builder.BuildManifestURL(imageName, dgst.String()) | 	digestRef, _ := reference.WithDigest(imageName, dgst) | ||||||
|  | 	manifestDigestURL, err := env.builder.BuildManifestURL(digestRef) | ||||||
| 	checkErr(t, err, "building manifest url") | 	checkErr(t, err, "building manifest url") | ||||||
| 
 | 
 | ||||||
| 	resp = putManifest(t, "putting signed manifest no error", manifestURL, "", signedManifest) | 	resp = putManifest(t, "putting signed manifest no error", manifestURL, "", signedManifest) | ||||||
|  | @ -1075,7 +1083,8 @@ func testManifestAPISchema2(t *testing.T, env *testEnv, imageName reference.Name | ||||||
| 		mediaType: schema2.MediaTypeManifest, | 		mediaType: schema2.MediaTypeManifest, | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	manifestURL, err := env.builder.BuildManifestURL(imageName, tag) | 	tagRef, _ := reference.WithTag(imageName, tag) | ||||||
|  | 	manifestURL, err := env.builder.BuildManifestURL(tagRef) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		t.Fatalf("unexpected error getting manifest url: %v", err) | 		t.Fatalf("unexpected error getting manifest url: %v", err) | ||||||
| 	} | 	} | ||||||
|  | @ -1219,7 +1228,8 @@ func testManifestAPISchema2(t *testing.T, env *testEnv, imageName reference.Name | ||||||
| 	args.dgst = dgst | 	args.dgst = dgst | ||||||
| 	args.manifest = deserializedManifest | 	args.manifest = deserializedManifest | ||||||
| 
 | 
 | ||||||
| 	manifestDigestURL, err := env.builder.BuildManifestURL(imageName, dgst.String()) | 	digestRef, _ := reference.WithDigest(imageName, dgst) | ||||||
|  | 	manifestDigestURL, err := env.builder.BuildManifestURL(digestRef) | ||||||
| 	checkErr(t, err, "building manifest url") | 	checkErr(t, err, "building manifest url") | ||||||
| 
 | 
 | ||||||
| 	resp = putManifest(t, "putting manifest no error", manifestURL, schema2.MediaTypeManifest, manifest) | 	resp = putManifest(t, "putting manifest no error", manifestURL, schema2.MediaTypeManifest, manifest) | ||||||
|  | @ -1415,7 +1425,8 @@ func testManifestAPIManifestList(t *testing.T, env *testEnv, args manifestArgs) | ||||||
| 	imageName := args.imageName | 	imageName := args.imageName | ||||||
| 	tag := "manifestlisttag" | 	tag := "manifestlisttag" | ||||||
| 
 | 
 | ||||||
| 	manifestURL, err := env.builder.BuildManifestURL(imageName, tag) | 	tagRef, _ := reference.WithTag(imageName, tag) | ||||||
|  | 	manifestURL, err := env.builder.BuildManifestURL(tagRef) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		t.Fatalf("unexpected error getting manifest url: %v", err) | 		t.Fatalf("unexpected error getting manifest url: %v", err) | ||||||
| 	} | 	} | ||||||
|  | @ -1468,7 +1479,8 @@ func testManifestAPIManifestList(t *testing.T, env *testEnv, args manifestArgs) | ||||||
| 	} | 	} | ||||||
| 	dgst := digest.FromBytes(canonical) | 	dgst := digest.FromBytes(canonical) | ||||||
| 
 | 
 | ||||||
| 	manifestDigestURL, err := env.builder.BuildManifestURL(imageName, dgst.String()) | 	digestRef, _ := reference.WithDigest(imageName, dgst) | ||||||
|  | 	manifestDigestURL, err := env.builder.BuildManifestURL(digestRef) | ||||||
| 	checkErr(t, err, "building manifest url") | 	checkErr(t, err, "building manifest url") | ||||||
| 
 | 
 | ||||||
| 	resp = putManifest(t, "putting manifest list no error", manifestURL, manifestlist.MediaTypeManifestList, deserializedManifestList) | 	resp = putManifest(t, "putting manifest list no error", manifestURL, manifestlist.MediaTypeManifestList, deserializedManifestList) | ||||||
|  | @ -1637,8 +1649,9 @@ func testManifestDelete(t *testing.T, env *testEnv, args manifestArgs) { | ||||||
| 	imageName := args.imageName | 	imageName := args.imageName | ||||||
| 	dgst := args.dgst | 	dgst := args.dgst | ||||||
| 	manifest := args.manifest | 	manifest := args.manifest | ||||||
| 	manifestDigestURL, err := env.builder.BuildManifestURL(imageName, dgst.String()) |  | ||||||
| 
 | 
 | ||||||
|  | 	ref, _ := reference.WithDigest(imageName, dgst) | ||||||
|  | 	manifestDigestURL, err := env.builder.BuildManifestURL(ref) | ||||||
| 	// ---------------
 | 	// ---------------
 | ||||||
| 	// Delete by digest
 | 	// Delete by digest
 | ||||||
| 	resp, err := httpDelete(manifestDigestURL) | 	resp, err := httpDelete(manifestDigestURL) | ||||||
|  | @ -1686,8 +1699,9 @@ func testManifestDelete(t *testing.T, env *testEnv, args manifestArgs) { | ||||||
| 
 | 
 | ||||||
| 	// ---------------
 | 	// ---------------
 | ||||||
| 	// Attempt to delete an unknown manifest
 | 	// Attempt to delete an unknown manifest
 | ||||||
| 	unknownDigest := "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" | 	unknownDigest := digest.Digest("sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa") | ||||||
| 	unknownManifestDigestURL, err := env.builder.BuildManifestURL(imageName, unknownDigest) | 	unknownRef, _ := reference.WithDigest(imageName, unknownDigest) | ||||||
|  | 	unknownManifestDigestURL, err := env.builder.BuildManifestURL(unknownRef) | ||||||
| 	checkErr(t, err, "building unknown manifest url") | 	checkErr(t, err, "building unknown manifest url") | ||||||
| 
 | 
 | ||||||
| 	resp, err = httpDelete(unknownManifestDigestURL) | 	resp, err = httpDelete(unknownManifestDigestURL) | ||||||
|  | @ -1695,11 +1709,12 @@ func testManifestDelete(t *testing.T, env *testEnv, args manifestArgs) { | ||||||
| 	checkResponse(t, "fetching deleted manifest", resp, http.StatusNotFound) | 	checkResponse(t, "fetching deleted manifest", resp, http.StatusNotFound) | ||||||
| 
 | 
 | ||||||
| 	// --------------------
 | 	// --------------------
 | ||||||
| 	// Uupload manifest by tag
 | 	// Upload manifest by tag
 | ||||||
| 	tag := "atag" | 	tag := "atag" | ||||||
| 	manifestTagURL, err := env.builder.BuildManifestURL(imageName, tag) | 	tagRef, _ := reference.WithTag(imageName, tag) | ||||||
| 	resp = putManifest(t, "putting signed manifest by tag", manifestTagURL, args.mediaType, manifest) | 	manifestTagURL, err := env.builder.BuildManifestURL(tagRef) | ||||||
| 	checkResponse(t, "putting signed manifest by tag", resp, http.StatusCreated) | 	resp = putManifest(t, "putting manifest by tag", manifestTagURL, args.mediaType, manifest) | ||||||
|  | 	checkResponse(t, "putting manifest by tag", resp, http.StatusCreated) | ||||||
| 	checkHeaders(t, resp, http.Header{ | 	checkHeaders(t, resp, http.Header{ | ||||||
| 		"Location":              []string{manifestDigestURL}, | 		"Location":              []string{manifestDigestURL}, | ||||||
| 		"Docker-Content-Digest": []string{dgst.String()}, | 		"Docker-Content-Digest": []string{dgst.String()}, | ||||||
|  | @ -1943,7 +1958,8 @@ func pushLayer(t *testing.T, ub *v2.URLBuilder, name reference.Named, dgst diges | ||||||
| 
 | 
 | ||||||
| 	sha256Dgst := digester.Digest() | 	sha256Dgst := digester.Digest() | ||||||
| 
 | 
 | ||||||
| 	expectedLayerURL, err := ub.BuildBlobURL(name, sha256Dgst) | 	ref, _ := reference.WithDigest(name, sha256Dgst) | ||||||
|  | 	expectedLayerURL, err := ub.BuildBlobURL(ref) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		t.Fatalf("error building expected layer url: %v", err) | 		t.Fatalf("error building expected layer url: %v", err) | ||||||
| 	} | 	} | ||||||
|  | @ -1966,7 +1982,8 @@ func finishUpload(t *testing.T, ub *v2.URLBuilder, name reference.Named, uploadU | ||||||
| 
 | 
 | ||||||
| 	checkResponse(t, "putting monolithic chunk", resp, http.StatusCreated) | 	checkResponse(t, "putting monolithic chunk", resp, http.StatusCreated) | ||||||
| 
 | 
 | ||||||
| 	expectedLayerURL, err := ub.BuildBlobURL(name, dgst) | 	ref, _ := reference.WithDigest(name, dgst) | ||||||
|  | 	expectedLayerURL, err := ub.BuildBlobURL(ref) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		t.Fatalf("error building expected layer url: %v", err) | 		t.Fatalf("error building expected layer url: %v", err) | ||||||
| 	} | 	} | ||||||
|  | @ -2189,10 +2206,12 @@ func createRepository(env *testEnv, t *testing.T, imageName string, tag string) | ||||||
| 	dgst := digest.FromBytes(signedManifest.Canonical) | 	dgst := digest.FromBytes(signedManifest.Canonical) | ||||||
| 
 | 
 | ||||||
| 	// Create this repository by tag to ensure the tag mapping is made in the registry
 | 	// Create this repository by tag to ensure the tag mapping is made in the registry
 | ||||||
| 	manifestDigestURL, err := env.builder.BuildManifestURL(imageNameRef, tag) | 	tagRef, _ := reference.WithTag(imageNameRef, tag) | ||||||
|  | 	manifestDigestURL, err := env.builder.BuildManifestURL(tagRef) | ||||||
| 	checkErr(t, err, "building manifest url") | 	checkErr(t, err, "building manifest url") | ||||||
| 
 | 
 | ||||||
| 	location, err := env.builder.BuildManifestURL(imageNameRef, dgst.String()) | 	digestRef, _ := reference.WithDigest(imageNameRef, dgst) | ||||||
|  | 	location, err := env.builder.BuildManifestURL(digestRef) | ||||||
| 	checkErr(t, err, "building location URL") | 	checkErr(t, err, "building location URL") | ||||||
| 
 | 
 | ||||||
| 	resp := putManifest(t, "putting signed manifest", manifestDigestURL, "", signedManifest) | 	resp := putManifest(t, "putting signed manifest", manifestDigestURL, "", signedManifest) | ||||||
|  | @ -2212,7 +2231,8 @@ func TestRegistryAsCacheMutationAPIs(t *testing.T) { | ||||||
| 
 | 
 | ||||||
| 	imageName, _ := reference.ParseNamed("foo/bar") | 	imageName, _ := reference.ParseNamed("foo/bar") | ||||||
| 	tag := "latest" | 	tag := "latest" | ||||||
| 	manifestURL, err := env.builder.BuildManifestURL(imageName, tag) | 	tagRef, _ := reference.WithTag(imageName, tag) | ||||||
|  | 	manifestURL, err := env.builder.BuildManifestURL(tagRef) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		t.Fatalf("unexpected error building base url: %v", err) | 		t.Fatalf("unexpected error building base url: %v", err) | ||||||
| 	} | 	} | ||||||
|  | @ -2255,7 +2275,8 @@ func TestRegistryAsCacheMutationAPIs(t *testing.T) { | ||||||
| 	checkResponse(t, fmt.Sprintf("starting layer push to cache %v", imageName), resp, errcode.ErrorCodeUnsupported.Descriptor().HTTPStatusCode) | 	checkResponse(t, fmt.Sprintf("starting layer push to cache %v", imageName), resp, errcode.ErrorCodeUnsupported.Descriptor().HTTPStatusCode) | ||||||
| 
 | 
 | ||||||
| 	// Blob Delete
 | 	// Blob Delete
 | ||||||
| 	blobURL, err := env.builder.BuildBlobURL(imageName, digest.DigestSha256EmptyTar) | 	ref, _ := reference.WithDigest(imageName, digest.DigestSha256EmptyTar) | ||||||
|  | 	blobURL, err := env.builder.BuildBlobURL(ref) | ||||||
| 	resp, err = httpDelete(blobURL) | 	resp, err = httpDelete(blobURL) | ||||||
| 	checkResponse(t, "deleting blob from cache", resp, errcode.ErrorCodeUnsupported.Descriptor().HTTPStatusCode) | 	checkResponse(t, "deleting blob from cache", resp, errcode.ErrorCodeUnsupported.Descriptor().HTTPStatusCode) | ||||||
| 
 | 
 | ||||||
|  | @ -2316,14 +2337,16 @@ func TestProxyManifestGetByTag(t *testing.T) { | ||||||
| 
 | 
 | ||||||
| 	proxyEnv := newTestEnvWithConfig(t, &proxyConfig) | 	proxyEnv := newTestEnvWithConfig(t, &proxyConfig) | ||||||
| 
 | 
 | ||||||
| 	manifestDigestURL, err := proxyEnv.builder.BuildManifestURL(imageName, dgst.String()) | 	digestRef, _ := reference.WithDigest(imageName, dgst) | ||||||
|  | 	manifestDigestURL, err := proxyEnv.builder.BuildManifestURL(digestRef) | ||||||
| 	checkErr(t, err, "building manifest url") | 	checkErr(t, err, "building manifest url") | ||||||
| 
 | 
 | ||||||
| 	resp, err := http.Get(manifestDigestURL) | 	resp, err := http.Get(manifestDigestURL) | ||||||
| 	checkErr(t, err, "fetching manifest from proxy by digest") | 	checkErr(t, err, "fetching manifest from proxy by digest") | ||||||
| 	defer resp.Body.Close() | 	defer resp.Body.Close() | ||||||
| 
 | 
 | ||||||
| 	manifestTagURL, err := proxyEnv.builder.BuildManifestURL(imageName, tag) | 	tagRef, _ := reference.WithTag(imageName, tag) | ||||||
|  | 	manifestTagURL, err := proxyEnv.builder.BuildManifestURL(tagRef) | ||||||
| 	checkErr(t, err, "building manifest url") | 	checkErr(t, err, "building manifest url") | ||||||
| 
 | 
 | ||||||
| 	resp, err = http.Get(manifestTagURL) | 	resp, err = http.Get(manifestTagURL) | ||||||
|  |  | ||||||
|  | @ -372,7 +372,11 @@ func (buh *blobUploadHandler) createBlobMountOption(fromRepo, mountDigest string | ||||||
| // created blob. A 201 Created is written as well as the canonical URL and
 | // created blob. A 201 Created is written as well as the canonical URL and
 | ||||||
| // blob digest.
 | // blob digest.
 | ||||||
| func (buh *blobUploadHandler) writeBlobCreatedHeaders(w http.ResponseWriter, desc distribution.Descriptor) error { | func (buh *blobUploadHandler) writeBlobCreatedHeaders(w http.ResponseWriter, desc distribution.Descriptor) error { | ||||||
| 	blobURL, err := buh.urlBuilder.BuildBlobURL(buh.Repository.Name(), desc.Digest) | 	ref, err := reference.WithDigest(buh.Repository.Name(), desc.Digest) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	blobURL, err := buh.urlBuilder.BuildBlobURL(ref) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return err | 		return err | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | @ -289,7 +289,13 @@ func (imh *imageManifestHandler) PutImageManifest(w http.ResponseWriter, r *http | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	// Construct a canonical url for the uploaded manifest.
 | 	// Construct a canonical url for the uploaded manifest.
 | ||||||
| 	location, err := imh.urlBuilder.BuildManifestURL(imh.Repository.Name(), imh.Digest.String()) | 	ref, err := reference.WithDigest(imh.Repository.Name(), imh.Digest) | ||||||
|  | 	if err != nil { | ||||||
|  | 		imh.Errors = append(imh.Errors, errcode.ErrorCodeUnknown.WithDetail(err)) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	location, err := imh.urlBuilder.BuildManifestURL(ref) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		// NOTE(stevvooe): Given the behavior above, this absurdly unlikely to
 | 		// NOTE(stevvooe): Given the behavior above, this absurdly unlikely to
 | ||||||
| 		// happen. We'll log the error here but proceed as if it worked. Worst
 | 		// happen. We'll log the error here but proceed as if it worked. Worst
 | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue