2015-07-29 20:12:01 +02:00
|
|
|
package proxy
|
|
|
|
|
|
|
|
import (
|
2017-08-12 00:31:16 +02:00
|
|
|
"context"
|
2015-07-29 20:12:01 +02:00
|
|
|
"time"
|
|
|
|
|
2020-08-24 13:18:39 +02:00
|
|
|
"github.com/distribution/distribution/v3"
|
|
|
|
dcontext "github.com/distribution/distribution/v3/context"
|
|
|
|
"github.com/distribution/distribution/v3/reference"
|
|
|
|
"github.com/distribution/distribution/v3/registry/proxy/scheduler"
|
2016-12-17 01:28:34 +01:00
|
|
|
"github.com/opencontainers/go-digest"
|
2015-07-29 20:12:01 +02:00
|
|
|
)
|
|
|
|
|
|
|
|
// todo(richardscothern): from cache control header or config
|
2018-08-06 23:34:15 +02:00
|
|
|
const repositoryTTL = 24 * 7 * time.Hour
|
2015-07-29 20:12:01 +02:00
|
|
|
|
|
|
|
type proxyManifestStore struct {
|
|
|
|
ctx context.Context
|
|
|
|
localManifests distribution.ManifestService
|
|
|
|
remoteManifests distribution.ManifestService
|
2015-12-15 23:35:23 +01:00
|
|
|
repositoryName reference.Named
|
2015-07-29 20:12:01 +02:00
|
|
|
scheduler *scheduler.TTLExpirationScheduler
|
2016-02-11 03:07:28 +01:00
|
|
|
authChallenger authChallenger
|
2015-07-29 20:12:01 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
var _ distribution.ManifestService = &proxyManifestStore{}
|
|
|
|
|
2015-08-21 06:50:15 +02:00
|
|
|
func (pms proxyManifestStore) Exists(ctx context.Context, dgst digest.Digest) (bool, error) {
|
|
|
|
exists, err := pms.localManifests.Exists(ctx, dgst)
|
2015-07-29 20:12:01 +02:00
|
|
|
if err != nil {
|
|
|
|
return false, err
|
|
|
|
}
|
|
|
|
if exists {
|
|
|
|
return true, nil
|
|
|
|
}
|
2016-02-11 03:07:28 +01:00
|
|
|
if err := pms.authChallenger.tryEstablishChallenges(ctx); err != nil {
|
|
|
|
return false, err
|
|
|
|
}
|
2015-08-21 06:50:15 +02:00
|
|
|
return pms.remoteManifests.Exists(ctx, dgst)
|
2015-07-29 20:12:01 +02:00
|
|
|
}
|
|
|
|
|
2015-08-21 06:50:15 +02:00
|
|
|
func (pms proxyManifestStore) Get(ctx context.Context, dgst digest.Digest, options ...distribution.ManifestServiceOption) (distribution.Manifest, error) {
|
|
|
|
// At this point `dgst` was either specified explicitly, or returned by the
|
|
|
|
// tagstore with the most recent association.
|
|
|
|
var fromRemote bool
|
|
|
|
manifest, err := pms.localManifests.Get(ctx, dgst, options...)
|
2015-07-29 20:12:01 +02:00
|
|
|
if err != nil {
|
2016-02-11 03:07:28 +01:00
|
|
|
if err := pms.authChallenger.tryEstablishChallenges(ctx); err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
2015-08-21 06:50:15 +02:00
|
|
|
manifest, err = pms.remoteManifests.Get(ctx, dgst, options...)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
fromRemote = true
|
2015-07-29 20:12:01 +02:00
|
|
|
}
|
|
|
|
|
2015-08-21 06:50:15 +02:00
|
|
|
_, payload, err := manifest.Payload()
|
2015-07-29 20:12:01 +02:00
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
2015-08-21 06:50:15 +02:00
|
|
|
proxyMetrics.ManifestPush(uint64(len(payload)))
|
|
|
|
if fromRemote {
|
|
|
|
proxyMetrics.ManifestPull(uint64(len(payload)))
|
2015-07-29 20:12:01 +02:00
|
|
|
|
2015-08-21 06:50:15 +02:00
|
|
|
_, err = pms.localManifests.Put(ctx, manifest)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
2015-07-29 20:12:01 +02:00
|
|
|
|
2016-01-27 01:42:10 +01:00
|
|
|
// Schedule the manifest blob for removal
|
|
|
|
repoBlob, err := reference.WithDigest(pms.repositoryName, dgst)
|
|
|
|
if err != nil {
|
2017-08-12 00:31:16 +02:00
|
|
|
dcontext.GetLogger(ctx).Errorf("Error creating reference: %s", err)
|
2016-01-27 01:42:10 +01:00
|
|
|
return nil, err
|
|
|
|
}
|
2015-07-29 20:12:01 +02:00
|
|
|
|
2016-01-27 01:42:10 +01:00
|
|
|
pms.scheduler.AddManifest(repoBlob, repositoryTTL)
|
2015-08-21 06:50:15 +02:00
|
|
|
// Ensure the manifest blob is cleaned up
|
2016-01-27 01:42:10 +01:00
|
|
|
//pms.scheduler.AddBlob(blobRef, repositoryTTL)
|
|
|
|
|
2015-07-29 20:12:01 +02:00
|
|
|
}
|
|
|
|
|
2015-08-21 06:50:15 +02:00
|
|
|
return manifest, err
|
2015-07-29 20:12:01 +02:00
|
|
|
}
|
|
|
|
|
2015-08-21 06:50:15 +02:00
|
|
|
func (pms proxyManifestStore) Put(ctx context.Context, manifest distribution.Manifest, options ...distribution.ManifestServiceOption) (digest.Digest, error) {
|
|
|
|
var d digest.Digest
|
|
|
|
return d, distribution.ErrUnsupported
|
2015-07-29 20:12:01 +02:00
|
|
|
}
|
|
|
|
|
2015-08-21 06:50:15 +02:00
|
|
|
func (pms proxyManifestStore) Delete(ctx context.Context, dgst digest.Digest) error {
|
2015-08-11 20:00:30 +02:00
|
|
|
return distribution.ErrUnsupported
|
2015-07-29 20:12:01 +02:00
|
|
|
}
|