Skip to content

Commit f0a9b1f

Browse files
fix(sync): fixed checking updates in remote tags digest
when preserveDigest option in sync is enabled closes: #3129 Signed-off-by: Eusebiu Petu <petu.eusebiu@gmail.com>
1 parent 7291b88 commit f0a9b1f

3 files changed

Lines changed: 284 additions & 224 deletions

File tree

pkg/extensions/sync/remote.go

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,33 @@ func (registry *RemoteRegistry) GetImageReference(repo, reference string) (ref.R
9393
}
9494

9595
func (registry *RemoteRegistry) headManifest(ctx context.Context, imageReference ref.Ref,
96+
) (manifest.Manifest, error) {
97+
/// check what error it gives when not found
98+
man, err := registry.client.ManifestHead(ctx, imageReference)
99+
if err != nil {
100+
/* public registries may return 401 for image not found
101+
they will try to check private registries as a fallback => 401 */
102+
if errors.Is(err, errs.ErrHTTPUnauthorized) {
103+
registry.log.Info().Str("errorType", common.TypeOf(err)).
104+
Str("repository", imageReference.Repository).Str("reference", imageReference.Reference).
105+
Err(err).Msg("failed to get manifest: unauthorized")
106+
107+
return nil, zerr.ErrUnauthorizedAccess
108+
} else if errors.Is(err, errs.ErrNotFound) {
109+
registry.log.Info().Str("errorType", common.TypeOf(err)).
110+
Str("repository", imageReference.Repository).Str("reference", imageReference.Reference).
111+
Err(err).Msg("failed to find manifest")
112+
113+
return nil, zerr.ErrManifestNotFound
114+
}
115+
116+
return nil, err
117+
}
118+
119+
return man, nil
120+
}
121+
122+
func (registry *RemoteRegistry) getManifest(ctx context.Context, imageReference ref.Ref,
96123
) (manifest.Manifest, error) {
97124
/// check what error it gives when not found
98125
man, err := registry.client.ManifestGet(ctx, imageReference)
@@ -134,7 +161,7 @@ func (registry *RemoteRegistry) GetDigest(ctx context.Context, repo, tag string,
134161
return man.GetDescriptor().Digest, err
135162
}
136163

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

149-
man, err := registry.headManifest(ctx, imageReference)
176+
man, err := registry.getManifest(ctx, imageReference)
150177
if err != nil {
151178
return "", "", false, err
152179
}

pkg/extensions/sync/service.go

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -496,16 +496,16 @@ func (service *BaseService) syncRef(ctx context.Context, localRepo string, remot
496496
}
497497

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

503-
var convertedDigest, remoteDigest godigest.Digest
503+
var localDigest, remoteDigest godigest.Digest
504504

505505
var isConverted bool
506506

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

521521
return "", "", false, err
522522
}
523+
524+
// preserve digest is true, so the local digest is same as remote
525+
localDigest = remoteDigest
523526
}
524527

525-
return convertedDigest, remoteDigest, isConverted, nil
528+
return localDigest, remoteDigest, isConverted, nil
526529
}
527530

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

546-
localDigest, remoteDigest, isConverted, err = service.getLocalStoredImageDigest(ctx, remoteRepo, tag)
549+
localDigest, remoteDigest, isConverted, err = service.computeLocalStoredImageDigest(ctx, remoteRepo, tag)
547550
if err != nil {
548551
return err
549552
}

0 commit comments

Comments
 (0)