MCPcopy
hub / github.com/moby/moby / resolveAllReferences

Method resolveAllReferences

daemon/containerd/image.go:272–394  ·  view source on GitHub ↗

resolveAllReferences resolves the reference name or ID to an image and returns all the images with the same target. Returns: 1: *(github.com/containerd/containerd/images).Image An image match from the image store with the provided refOrID 2: [](github.com/containerd/containerd/images).Image L

(ctx context.Context, refOrID string)

Source from the content-addressed store, hash-verified

270// An error looking up refOrID or no images found with matching name or target. Note that the first
271// argument may be nil with a nil error if the second argument is non-empty.
272func (i *ImageService) resolveAllReferences(ctx context.Context, refOrID string) (*c8dimages.Image, []c8dimages.Image, error) {
273 parsed, err := reference.ParseAnyReference(refOrID)
274 if err != nil {
275 return nil, nil, errdefs.InvalidParameter(err)
276 }
277 var dgst digest.Digest
278 var img *c8dimages.Image
279
280 if idWithoutAlgo := checkTruncatedID(refOrID); idWithoutAlgo != "" { // Valid ID.
281 if d, ok := parsed.(reference.Digested); ok {
282 if cimg, err := i.images.Get(ctx, d.String()); err == nil {
283 img = &cimg
284 dgst = d.Digest()
285 if cimg.Target.Digest != dgst {
286 // Ambiguous image reference, use reference name
287 log.G(ctx).WithField("image", refOrID).WithField("target", cimg.Target.Digest).Warn("digest reference points to image with a different digest")
288 dgst = cimg.Target.Digest
289 }
290 } else if !cerrdefs.IsNotFound(err) {
291 return nil, nil, err
292 } else {
293 dgst = d.Digest()
294 }
295 } else {
296 name := reference.TagNameOnly(parsed.(reference.Named)).String()
297 filters := []string{
298 fmt.Sprintf("name==%q", name), // Or it could just look like one.
299 "target.digest~=" + strconv.Quote(fmt.Sprintf(`^sha256:%s[0-9a-fA-F]{%d}$`, regexp.QuoteMeta(idWithoutAlgo), 64-len(idWithoutAlgo))),
300 }
301 imgs, err := i.images.List(ctx, filters...)
302 if err != nil {
303 return nil, nil, err
304 }
305
306 if len(imgs) == 0 {
307 return nil, nil, images.ErrImageDoesNotExist{Ref: parsed}
308 }
309
310 for _, limg := range imgs {
311 if limg.Name == name {
312 copyImg := limg
313 img = &copyImg
314 }
315 if dgst != "" {
316 if limg.Target.Digest != dgst {
317 return nil, nil, errdefs.NotFound(errors.New("ambiguous reference"))
318 }
319 } else {
320 dgst = limg.Target.Digest
321 }
322 }
323
324 // Return immediately if target digest matches already included
325 if img == nil || len(imgs) > 1 {
326 return img, imgs, nil
327 }
328 }
329 } else {

Callers 4

createOrReplaceImageMethod · 0.95
ImageDeleteMethod · 0.95
TestLookupFunction · 0.95
SetParentMethod · 0.80

Implementers 2

ImageServicedaemon/containerd/service.go
ImageServicedaemon/images/service.go

Calls 11

InvalidParameterFunction · 0.92
NotFoundFunction · 0.92
checkTruncatedIDFunction · 0.85
DigestMethod · 0.80
GetMethod · 0.65
StringMethod · 0.65
ListMethod · 0.65
NewMethod · 0.65
ValueMethod · 0.65
InfoMethod · 0.65
IsMethod · 0.45

Tested by 1

TestLookupFunction · 0.76