diff --git a/docs/storage/registry.go b/docs/storage/registry.go index 1a402f36..8d7ea16e 100644 --- a/docs/storage/registry.go +++ b/docs/storage/registry.go @@ -87,3 +87,9 @@ func (repo *repository) Layers() distribution.LayerService { repository: repo, } } + +func (repo *repository) Signatures() distribution.SignatureService { + return &signatureStore{ + repository: repo, + } +} diff --git a/docs/storage/revisionstore.go b/docs/storage/revisionstore.go index e7122f3e..ac605360 100644 --- a/docs/storage/revisionstore.go +++ b/docs/storage/revisionstore.go @@ -2,7 +2,6 @@ package storage import ( "encoding/json" - "path" "github.com/Sirupsen/logrus" "github.com/docker/distribution" @@ -53,7 +52,7 @@ func (rs *revisionStore) get(revision digest.Digest) (*manifest.SignedManifest, } // Fetch the signatures for the manifest - signatures, err := rs.getSignatures(revision) + signatures, err := rs.Signatures().Get(revision) if err != nil { return nil, err } @@ -104,10 +103,8 @@ func (rs *revisionStore) put(sm *manifest.SignedManifest) (digest.Digest, error) return "", err } - for _, signature := range signatures { - if err := rs.putSignature(revision, signature); err != nil { - return "", err - } + if err := rs.Signatures().Put(revision, signatures...); err != nil { + return "", err } return revision, nil @@ -147,62 +144,3 @@ func (rs *revisionStore) delete(revision digest.Digest) error { return rs.driver.Delete(revisionPath) } - -// getSignatures retrieves all of the signature blobs for the specified -// manifest revision. -func (rs *revisionStore) getSignatures(revision digest.Digest) ([][]byte, error) { - signaturesPath, err := rs.pm.path(manifestSignaturesPathSpec{ - name: rs.Name(), - revision: revision, - }) - - if err != nil { - return nil, err - } - - // Need to append signature digest algorithm to path to get all items. - // Perhaps, this should be in the pathMapper but it feels awkward. This - // can be eliminated by implementing listAll on drivers. - signaturesPath = path.Join(signaturesPath, "sha256") - - signaturePaths, err := rs.driver.List(signaturesPath) - if err != nil { - return nil, err - } - - var signatures [][]byte - for _, sigPath := range signaturePaths { - // Append the link portion - sigPath = path.Join(sigPath, "link") - - // TODO(stevvooe): These fetches should be parallelized for performance. - p, err := rs.blobStore.linked(sigPath) - if err != nil { - return nil, err - } - - signatures = append(signatures, p) - } - - return signatures, nil -} - -// putSignature stores the signature for the provided manifest revision. -func (rs *revisionStore) putSignature(revision digest.Digest, signature []byte) error { - signatureDigest, err := rs.blobStore.put(signature) - if err != nil { - return err - } - - signaturePath, err := rs.pm.path(manifestSignatureLinkPathSpec{ - name: rs.Name(), - revision: revision, - signature: signatureDigest, - }) - - if err != nil { - return err - } - - return rs.blobStore.link(signaturePath, signatureDigest) -} diff --git a/docs/storage/signaturestore.go b/docs/storage/signaturestore.go new file mode 100644 index 00000000..abc52ca6 --- /dev/null +++ b/docs/storage/signaturestore.go @@ -0,0 +1,75 @@ +package storage + +import ( + "path" + + "github.com/docker/distribution" + "github.com/docker/distribution/digest" +) + +type signatureStore struct { + *repository +} + +var _ distribution.SignatureService = &signatureStore{} + +func (s *signatureStore) Get(dgst digest.Digest) ([][]byte, error) { + signaturesPath, err := s.pm.path(manifestSignaturesPathSpec{ + name: s.Name(), + revision: dgst, + }) + + if err != nil { + return nil, err + } + + // Need to append signature digest algorithm to path to get all items. + // Perhaps, this should be in the pathMapper but it feels awkward. This + // can be eliminated by implementing listAll on drivers. + signaturesPath = path.Join(signaturesPath, "sha256") + + signaturePaths, err := s.driver.List(signaturesPath) + if err != nil { + return nil, err + } + + var signatures [][]byte + for _, sigPath := range signaturePaths { + // Append the link portion + sigPath = path.Join(sigPath, "link") + + // TODO(stevvooe): These fetches should be parallelized for performance. + p, err := s.blobStore.linked(sigPath) + if err != nil { + return nil, err + } + + signatures = append(signatures, p) + } + + return signatures, nil +} + +func (s *signatureStore) Put(dgst digest.Digest, signatures ...[]byte) error { + for _, signature := range signatures { + signatureDigest, err := s.blobStore.put(signature) + if err != nil { + return err + } + + signaturePath, err := s.pm.path(manifestSignatureLinkPathSpec{ + name: s.Name(), + revision: dgst, + signature: signatureDigest, + }) + + if err != nil { + return err + } + + if err := s.blobStore.link(signaturePath, signatureDigest); err != nil { + return err + } + } + return nil +}