MCPcopy
hub / github.com/containerd/containerd / FetchByDigest

Method FetchByDigest

core/remotes/docker/fetcher.go:362–440  ·  view source on GitHub ↗
(ctx context.Context, dgst digest.Digest, opts ...remotes.FetchByDigestOpts)

Source from the content-addressed store, hash-verified

360}
361
362func (r dockerFetcher) FetchByDigest(ctx context.Context, dgst digest.Digest, opts ...remotes.FetchByDigestOpts) (io.ReadCloser, ocispec.Descriptor, error) {
363 var desc ocispec.Descriptor
364 ctx = log.WithLogger(ctx, log.G(ctx).WithField("digest", dgst))
365 var config remotes.FetchByDigestConfig
366 for _, o := range opts {
367 if err := o(ctx, &config); err != nil {
368 return nil, desc, err
369 }
370 }
371
372 hosts := r.filterHosts(HostCapabilityPull)
373 if len(hosts) == 0 {
374 return nil, desc, fmt.Errorf("no pull hosts: %w", errdefs.ErrNotFound)
375 }
376
377 ctx, err := ContextWithRepositoryScope(ctx, r.refspec, false)
378 if err != nil {
379 return nil, desc, err
380 }
381
382 var (
383 getReq *request
384 sz int64
385 firstErr error
386 )
387
388 for i, host := range r.hosts {
389 getReq, sz, err = r.createGetReq(ctx, host, i == len(r.hosts)-1, config.Mediatype, "blobs", dgst.String())
390 if err == nil {
391 break
392 }
393 // Store the error for referencing later
394 if firstErr == nil {
395 firstErr = err
396 }
397 }
398
399 if getReq == nil {
400 // Fall back to the "manifests" endpoint
401 for i, host := range r.hosts {
402 getReq, sz, err = r.createGetReq(ctx, host, i == len(r.hosts)-1, config.Mediatype, "manifests", dgst.String())
403 if err == nil {
404 break
405 }
406 // Store the error for referencing later
407 if firstErr == nil {
408 firstErr = err
409 }
410 }
411 }
412
413 if getReq == nil {
414 if errdefs.IsNotFound(firstErr) {
415 firstErr = fmt.Errorf("could not fetch content %v from remote: %w", dgst, errdefs.ErrNotFound)
416 }
417 if firstErr == nil {
418 firstErr = fmt.Errorf("could not fetch content %v from remote: (unknown)", dgst)
419 }

Callers

nothing calls this directly

Calls 6

createGetReqMethod · 0.95
openMethod · 0.95
newHTTPReadSeekerFunction · 0.85
filterHostsMethod · 0.80
StringMethod · 0.45

Tested by

no test coverage detected