(ctx context.Context, dgst digest.Digest, opts ...remotes.FetchByDigestOpts)
| 360 | } |
| 361 | |
| 362 | func (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 | } |
nothing calls this directly
no test coverage detected