MCPcopy Index your code
hub / github.com/regclient/regclient / ImageCheckBase

Method ImageCheckBase

image.go:262–465  ·  view source on GitHub ↗

ImageCheckBase returns nil if the base image is unchanged. A base image mismatch returns an error that wraps errs.ErrMismatch.

(ctx context.Context, r ref.Ref, opts ...ImageOpts)

Source from the content-addressed store, hash-verified

260// ImageCheckBase returns nil if the base image is unchanged.
261// A base image mismatch returns an error that wraps errs.ErrMismatch.
262func (rc *RegClient) ImageCheckBase(ctx context.Context, r ref.Ref, opts ...ImageOpts) error {
263 var opt imageOpt
264 for _, optFn := range opts {
265 optFn(&opt)
266 }
267 var m manifest.Manifest
268 var err error
269
270 // dedup warnings
271 if w := warning.FromContext(ctx); w == nil {
272 ctx = warning.NewContext(ctx, &warning.Warning{Hook: warning.DefaultHook()})
273 }
274 // if the base name is not provided, check image for base annotations
275 if opt.checkBaseRef == "" {
276 m, err = rc.ManifestGet(ctx, r)
277 if err != nil {
278 return err
279 }
280 ma, ok := m.(manifest.Annotator)
281 if !ok {
282 return fmt.Errorf("image does not support annotations, base image must be provided%.0w", errs.ErrMissingAnnotation)
283 }
284 annot, err := ma.GetAnnotations()
285 if err != nil {
286 return err
287 }
288 if baseName, ok := annot[types.AnnotationBaseImageName]; ok {
289 opt.checkBaseRef = baseName
290 } else {
291 return fmt.Errorf("image does not have a base annotation, base image must be provided%.0w", errs.ErrMissingAnnotation)
292 }
293 if baseDig, ok := annot[types.AnnotationBaseImageDigest]; ok {
294 opt.checkBaseDigest = baseDig
295 }
296 }
297 baseR, err := ref.New(opt.checkBaseRef)
298 if err != nil {
299 return err
300 }
301 defer rc.Close(ctx, baseR)
302
303 // if the digest is available, check if that matches the base name
304 if opt.checkBaseDigest != "" {
305 baseMH, err := rc.ManifestHead(ctx, baseR, WithManifestRequireDigest())
306 if err != nil {
307 return err
308 }
309 expectDig, err := digest.Parse(opt.checkBaseDigest)
310 if err != nil {
311 return err
312 }
313 if baseMH.GetDescriptor().Digest == expectDig {
314 rc.slog.Debug("base image digest matches",
315 slog.String("name", baseR.CommonName()),
316 slog.String("digest", baseMH.GetDescriptor().Digest.String()))
317 return nil
318 } else {
319 rc.slog.Debug("base image digest changed",

Callers 2

TestImageCheckBaseFunction · 0.80
runImageCheckBaseMethod · 0.80

Calls 15

ManifestGetMethod · 0.95
CloseMethod · 0.95
ManifestHeadMethod · 0.95
IsListMethod · 0.95
BlobGetOCIConfigMethod · 0.95
FromContextFunction · 0.92
NewContextFunction · 0.92
DefaultHookFunction · 0.92
NewFunction · 0.92
ParseFunction · 0.92
GetPlatformDescFunction · 0.92

Tested by 1

TestImageCheckBaseFunction · 0.64