forked from TrueCloudLab/distribution
76 lines
1.6 KiB
Go
76 lines
1.6 KiB
Go
|
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
|
||
|
}
|