Allow Manifest Service to be configured with function arguments
Signed-off-by: Richard Scothern <richard.scothern@gmail.com>
This commit is contained in:
parent
b318e01f7d
commit
cd31d466e4
7 changed files with 103 additions and 41 deletions
|
@ -11,10 +11,11 @@ import (
|
|||
)
|
||||
|
||||
type manifestStore struct {
|
||||
repository *repository
|
||||
revisionStore *revisionStore
|
||||
tagStore *tagStore
|
||||
ctx context.Context
|
||||
repository *repository
|
||||
revisionStore *revisionStore
|
||||
tagStore *tagStore
|
||||
ctx context.Context
|
||||
skipDependencyVerification bool
|
||||
}
|
||||
|
||||
var _ distribution.ManifestService = &manifestStore{}
|
||||
|
@ -39,10 +40,19 @@ func (ms *manifestStore) Get(dgst digest.Digest) (*manifest.SignedManifest, erro
|
|||
return ms.revisionStore.get(ms.ctx, dgst)
|
||||
}
|
||||
|
||||
// SkipLayerVerification allows a manifest to be Put before it's
|
||||
// layers are on the filesystem
|
||||
func SkipLayerVerification(ms distribution.ManifestService) error {
|
||||
if ms, ok := ms.(*manifestStore); ok {
|
||||
ms.skipDependencyVerification = true
|
||||
return nil
|
||||
}
|
||||
return fmt.Errorf("skip layer verification only valid for manifeststore")
|
||||
}
|
||||
|
||||
func (ms *manifestStore) Put(manifest *manifest.SignedManifest) error {
|
||||
context.GetLogger(ms.ctx).Debug("(*manifestStore).Put")
|
||||
|
||||
// Verify the manifest.
|
||||
if err := ms.verifyManifest(ms.ctx, manifest); err != nil {
|
||||
return err
|
||||
}
|
||||
|
@ -113,18 +123,19 @@ func (ms *manifestStore) verifyManifest(ctx context.Context, mnfst *manifest.Sig
|
|||
}
|
||||
}
|
||||
|
||||
for _, fsLayer := range mnfst.FSLayers {
|
||||
_, err := ms.repository.Blobs(ctx).Stat(ctx, fsLayer.BlobSum)
|
||||
if err != nil {
|
||||
if err != distribution.ErrBlobUnknown {
|
||||
errs = append(errs, err)
|
||||
}
|
||||
if !ms.skipDependencyVerification {
|
||||
for _, fsLayer := range mnfst.FSLayers {
|
||||
_, err := ms.repository.Blobs(ctx).Stat(ctx, fsLayer.BlobSum)
|
||||
if err != nil {
|
||||
if err != distribution.ErrBlobUnknown {
|
||||
errs = append(errs, err)
|
||||
}
|
||||
|
||||
// On error here, we always append unknown blob errors.
|
||||
errs = append(errs, distribution.ErrManifestBlobUnknown{Digest: fsLayer.BlobSum})
|
||||
// On error here, we always append unknown blob errors.
|
||||
errs = append(errs, distribution.ErrManifestBlobUnknown{Digest: fsLayer.BlobSum})
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if len(errs) != 0 {
|
||||
return errs
|
||||
}
|
||||
|
|
|
@ -48,7 +48,11 @@ func newManifestStoreTestEnv(t *testing.T, name, tag string) *manifestStoreTestE
|
|||
|
||||
func TestManifestStorage(t *testing.T) {
|
||||
env := newManifestStoreTestEnv(t, "foo/bar", "thetag")
|
||||
ms := env.repository.Manifests()
|
||||
ctx := context.Background()
|
||||
ms, err := env.repository.Manifests(ctx)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
exists, err := ms.ExistsByTag(env.tag)
|
||||
if err != nil {
|
||||
|
@ -97,14 +101,14 @@ func TestManifestStorage(t *testing.T) {
|
|||
t.Fatalf("unexpected error generating private key: %v", err)
|
||||
}
|
||||
|
||||
sm, err := manifest.Sign(&m, pk)
|
||||
if err != nil {
|
||||
sm, merr := manifest.Sign(&m, pk)
|
||||
if merr != nil {
|
||||
t.Fatalf("error signing manifest: %v", err)
|
||||
}
|
||||
|
||||
err = ms.Put(sm)
|
||||
if err == nil {
|
||||
t.Fatalf("expected errors putting manifest")
|
||||
t.Fatalf("expected errors putting manifest with full verification")
|
||||
}
|
||||
|
||||
switch err := err.(type) {
|
||||
|
|
|
@ -99,15 +99,15 @@ func (repo *repository) Name() string {
|
|||
// Manifests returns an instance of ManifestService. Instantiation is cheap and
|
||||
// may be context sensitive in the future. The instance should be used similar
|
||||
// to a request local.
|
||||
func (repo *repository) Manifests() distribution.ManifestService {
|
||||
return &manifestStore{
|
||||
ctx: repo.ctx,
|
||||
func (repo *repository) Manifests(ctx context.Context, options ...distribution.ManifestServiceOption) (distribution.ManifestService, error) {
|
||||
ms := &manifestStore{
|
||||
ctx: ctx,
|
||||
repository: repo,
|
||||
revisionStore: &revisionStore{
|
||||
ctx: repo.ctx,
|
||||
ctx: ctx,
|
||||
repository: repo,
|
||||
blobStore: &linkedBlobStore{
|
||||
ctx: repo.ctx,
|
||||
ctx: ctx,
|
||||
blobStore: repo.blobStore,
|
||||
repository: repo,
|
||||
statter: &linkedBlobStatter{
|
||||
|
@ -122,11 +122,21 @@ func (repo *repository) Manifests() distribution.ManifestService {
|
|||
},
|
||||
},
|
||||
tagStore: &tagStore{
|
||||
ctx: repo.ctx,
|
||||
ctx: ctx,
|
||||
repository: repo,
|
||||
blobStore: repo.registry.blobStore,
|
||||
},
|
||||
}
|
||||
|
||||
// Apply options
|
||||
for _, option := range options {
|
||||
err := option(ms)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
|
||||
return ms, nil
|
||||
}
|
||||
|
||||
// Blobs returns an instance of the BlobStore. Instantiation is cheap and
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue