Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 29 additions & 2 deletions pkg/extensions/sync/remote.go
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,33 @@ func (registry *RemoteRegistry) GetImageReference(repo, reference string) (ref.R
}

func (registry *RemoteRegistry) headManifest(ctx context.Context, imageReference ref.Ref,
) (manifest.Manifest, error) {
/// check what error it gives when not found
man, err := registry.client.ManifestHead(ctx, imageReference)
if err != nil {
/* public registries may return 401 for image not found
they will try to check private registries as a fallback => 401 */
if errors.Is(err, errs.ErrHTTPUnauthorized) {
registry.log.Info().Str("errorType", common.TypeOf(err)).
Str("repository", imageReference.Repository).Str("reference", imageReference.Reference).
Err(err).Msg("failed to get manifest: unauthorized")

return nil, zerr.ErrUnauthorizedAccess
} else if errors.Is(err, errs.ErrNotFound) {
registry.log.Info().Str("errorType", common.TypeOf(err)).
Str("repository", imageReference.Repository).Str("reference", imageReference.Reference).
Err(err).Msg("failed to find manifest")

return nil, zerr.ErrManifestNotFound
}

return nil, err
}

return man, nil
}

func (registry *RemoteRegistry) getManifest(ctx context.Context, imageReference ref.Ref,
) (manifest.Manifest, error) {
/// check what error it gives when not found
man, err := registry.client.ManifestGet(ctx, imageReference)
Expand Down Expand Up @@ -134,7 +161,7 @@ func (registry *RemoteRegistry) GetDigest(ctx context.Context, repo, tag string,
return man.GetDescriptor().Digest, err
}

// returns OCI remote digest, original remote digaest (unconverted), if it was converted.
// returns OCI remote digest, original remote digest (unconverted), if it was converted.
func (registry *RemoteRegistry) GetOCIDigest(ctx context.Context, repo, tag string,
) (godigest.Digest, godigest.Digest, bool, error) {
var isConverted bool
Expand All @@ -146,7 +173,7 @@ func (registry *RemoteRegistry) GetOCIDigest(ctx context.Context, repo, tag stri
return "", "", false, err
}

man, err := registry.headManifest(ctx, imageReference)
man, err := registry.getManifest(ctx, imageReference)
if err != nil {
return "", "", false, err
}
Expand Down
13 changes: 8 additions & 5 deletions pkg/extensions/sync/service.go
Original file line number Diff line number Diff line change
Expand Up @@ -496,16 +496,16 @@ func (service *BaseService) syncRef(ctx context.Context, localRepo string, remot
}

// get "would be" digest of image after synced.
func (service *BaseService) getLocalStoredImageDigest(ctx context.Context, repo, tag string,
func (service *BaseService) computeLocalStoredImageDigest(ctx context.Context, repo, tag string,
) (godigest.Digest, godigest.Digest, bool, error) {
var err error

var convertedDigest, remoteDigest godigest.Digest
var localDigest, remoteDigest godigest.Digest

var isConverted bool

if !service.config.PreserveDigest {
convertedDigest, remoteDigest, isConverted, err = service.remote.GetOCIDigest(ctx, repo, tag)
localDigest, remoteDigest, isConverted, err = service.remote.GetOCIDigest(ctx, repo, tag)
if err != nil {
service.log.Error().Err(err).Str("repository", repo).Str("reference", tag).
Msg("failed to get upstream image manifest details")
Expand All @@ -520,9 +520,12 @@ func (service *BaseService) getLocalStoredImageDigest(ctx context.Context, repo,

return "", "", false, err
}

// preserve digest is true, so the local digest is same as remote
localDigest = remoteDigest
}

return convertedDigest, remoteDigest, isConverted, nil
return localDigest, remoteDigest, isConverted, nil
}

func (service *BaseService) syncImage(ctx context.Context, localRepo, remoteRepo, tag string,
Expand All @@ -543,7 +546,7 @@ func (service *BaseService) syncImage(ctx context.Context, localRepo, remoteRepo
return err
}

localDigest, remoteDigest, isConverted, err = service.getLocalStoredImageDigest(ctx, remoteRepo, tag)
localDigest, remoteDigest, isConverted, err = service.computeLocalStoredImageDigest(ctx, remoteRepo, tag)
if err != nil {
return err
}
Expand Down
Loading