Skip to content

Commit

Permalink
Merge pull request #3061 from guillaumerose/reconciliate
Browse files Browse the repository at this point in the history
Add pathspec for repo _layers directory and allow Repository.BlobStore to enumerate over blobs
  • Loading branch information
dmcgowan committed Dec 6, 2019
2 parents dee21c0 + c9c3324 commit f187812
Show file tree
Hide file tree
Showing 4 changed files with 64 additions and 0 deletions.
49 changes: 49 additions & 0 deletions registry/storage/linkedblobstore_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import (
"fmt"
"io"
"reflect"
"sort"
"strconv"
"testing"

Expand All @@ -14,6 +15,54 @@ import (
"github.com/opencontainers/go-digest"
)

func TestLinkedBlobStoreEnumerator(t *testing.T) {
fooRepoName, _ := reference.WithName("nm/foo")
fooEnv := newManifestStoreTestEnv(t, fooRepoName, "thetag")
ctx := context.Background()

var expected []string
for i := 0; i < 2; i++ {
rs, dgst, err := testutil.CreateRandomTarFile()
if err != nil {
t.Fatalf("unexpected error generating test layer file")
}

expected = append(expected, dgst.String())

wr, err := fooEnv.repository.Blobs(fooEnv.ctx).Create(fooEnv.ctx)
if err != nil {
t.Fatalf("unexpected error creating test upload: %v", err)
}

if _, err := io.Copy(wr, rs); err != nil {
t.Fatalf("unexpected error copying to upload: %v", err)
}

if _, err := wr.Commit(fooEnv.ctx, distribution.Descriptor{Digest: dgst}); err != nil {
t.Fatalf("unexpected error finishing upload: %v", err)
}
}

enumerator, ok := fooEnv.repository.Blobs(fooEnv.ctx).(distribution.BlobEnumerator)
if !ok {
t.Fatalf("Blobs is not a BlobEnumerator")
}

var actual []string
if err := enumerator.Enumerate(ctx, func(dgst digest.Digest) error {
actual = append(actual, dgst.String())
return nil
}); err != nil {
t.Fatalf("cannot enumerate on repository: %v", err)
}

sort.Strings(actual)
sort.Strings(expected)
if !reflect.DeepEqual(expected, actual) {
t.Fatalf("unexpected array difference (expected: %v actual: %v)", expected, actual)
}
}

func TestLinkedBlobStoreCreateWithMountFrom(t *testing.T) {
fooRepoName, _ := reference.WithName("nm/foo")
fooEnv := newManifestStoreTestEnv(t, fooRepoName, "thetag")
Expand Down
10 changes: 10 additions & 0 deletions registry/storage/paths.go
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,7 @@ const (
// Blobs:
//
// layerLinkPathSpec: <root>/v2/repositories/<name>/_layers/<algorithm>/<hex digest>/link
// layersPathSpec: <root>/v2/repositories/<name>/_layers
//
// Uploads:
//
Expand Down Expand Up @@ -206,6 +207,8 @@ func pathFor(spec pathSpec) (string, error) {
blobLinkPathComponents := append(repoPrefix, v.name, "_layers")

return path.Join(path.Join(append(blobLinkPathComponents, components...)...), "link"), nil
case layersPathSpec:
return path.Join(append(repoPrefix, v.name, "_layers")...), nil
case blobsPathSpec:
blobsPathPrefix := append(rootPrefix, "blobs")
return path.Join(blobsPathPrefix...), nil
Expand Down Expand Up @@ -335,6 +338,13 @@ type manifestTagIndexEntryLinkPathSpec struct {

func (manifestTagIndexEntryLinkPathSpec) pathSpec() {}

// layersPathSpec contains the path for the layers inside a repo
type layersPathSpec struct {
name string
}

func (layersPathSpec) pathSpec() {}

// blobLinkPathSpec specifies a path for a blob link, which is a file with a
// blob id. The blob link will contain a content addressable blob id reference
// into the blob store. The format of the contents is as follows:
Expand Down
4 changes: 4 additions & 0 deletions registry/storage/paths_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,10 @@ func TestPathMapper(t *testing.T) {
},
expected: "/docker/registry/v2/repositories/foo/bar/_uploads/asdf-asdf-asdf-adsf/startedat",
},
{
spec: layersPathSpec{name: "foo/bar"},
expected: "/docker/registry/v2/repositories/foo/bar/_layers",
},
} {
p, err := pathFor(testcase.spec)
if err != nil {
Expand Down
1 change: 1 addition & 0 deletions registry/storage/registry.go
Original file line number Diff line number Diff line change
Expand Up @@ -330,6 +330,7 @@ func (repo *repository) Blobs(ctx context.Context) distribution.BlobStore {
// TODO(stevvooe): linkPath limits this blob store to only layers.
// This instance cannot be used for manifest checks.
linkPathFns: []linkPathFunc{blobLinkPath},
linkDirectoryPathSpec: layersPathSpec{name: repo.name.Name()},
deleteEnabled: repo.registry.deleteEnabled,
resumableDigestEnabled: repo.resumableDigestEnabled,
}
Expand Down

0 comments on commit f187812

Please sign in to comment.