fix(sync): syncing OCI artifacts with distribution package fails (#1013)

sync OCI artifacts using REST APIs

Signed-off-by: Petu Eusebiu <peusebiu@cisco.com>
This commit is contained in:
peusebiu
2022-12-09 21:38:00 +02:00
committed by GitHub
parent 37e6c6db0e
commit 024b13efe6
7 changed files with 559 additions and 53 deletions
+19 -7
View File
@@ -16,6 +16,7 @@ import (
"github.com/containers/image/v5/docker/reference"
"github.com/containers/image/v5/signature"
"github.com/containers/image/v5/types"
"github.com/opencontainers/go-digest"
ispec "github.com/opencontainers/image-spec/specs-go/v1"
"gopkg.in/resty.v1"
@@ -300,13 +301,26 @@ func syncRegistry(ctx context.Context, regCfg RegistryConfig,
defer os.RemoveAll(localCachePath)
for _, upstreamImageRef := range repoReference.imageReferences {
upstreamImageDigest, err := docker.GetDigest(ctx, upstreamCtx, upstreamImageRef)
manifestBuf, mediaType, err := getImageRefManifest(ctx, upstreamCtx, upstreamImageRef, log)
if err != nil {
log.Error().Err(err).Msgf("couldn't get upstream image %s manifest", upstreamImageRef.DockerReference())
return err
}
upstreamImageDigest := digest.FromBytes(manifestBuf)
tag := getTagFromRef(upstreamImageRef, log).Tag()
if !isSupportedMediaType(mediaType) {
if mediaType == ispec.MediaTypeArtifactManifest {
err = sig.syncOCIArtifact(localRepo, upstreamRepo, tag, manifestBuf)
if err != nil {
return err
}
}
continue
}
// get upstream signatures
cosignManifest, err := sig.getCosignManifest(upstreamRepo, upstreamImageDigest.String())
if err != nil && !errors.Is(err, zerr.ErrSyncReferrerNotFound) {
@@ -315,7 +329,7 @@ func syncRegistry(ctx context.Context, regCfg RegistryConfig,
return err
}
refs, err := sig.getNotarySignatures(upstreamRepo, upstreamImageDigest.String())
refs, err := sig.getNotaryRefs(upstreamRepo, upstreamImageDigest.String())
if err != nil && !errors.Is(err, zerr.ErrSyncReferrerNotFound) {
log.Error().Err(err).Msgf("couldn't get upstream image %s notary references", upstreamImageRef.DockerReference())
@@ -333,8 +347,6 @@ func syncRegistry(ctx context.Context, regCfg RegistryConfig,
}
}
tag := getTagFromRef(upstreamImageRef, log).Tag()
skipImage, err := canSkipImage(localRepo, tag, upstreamImageDigest, imageStore, log)
if err != nil {
log.Error().Err(err).Msgf("couldn't check if the upstream image %s can be skipped",
@@ -392,7 +404,7 @@ func syncRegistry(ctx context.Context, regCfg RegistryConfig,
return err
}
err = sig.syncNotarySignature(localRepo, upstreamRepo, upstreamImageDigest.String(), refs)
err = sig.syncNotaryRefs(localRepo, upstreamRepo, upstreamImageDigest.String(), refs)
if err != nil {
return err
}