(ctx context.Context, client *containerd.Client, parsedReference *referenceutil.ImageReference, rawRef string, options types.ImagePullOptions)
| 108 | } |
| 109 | |
| 110 | func PullImageWithTransfer(ctx context.Context, client *containerd.Client, parsedReference *referenceutil.ImageReference, rawRef string, options types.ImagePullOptions) (*EnsuredImage, error) { |
| 111 | store, err := prepareImageStore(ctx, parsedReference, options) |
| 112 | if err != nil { |
| 113 | return nil, err |
| 114 | } |
| 115 | |
| 116 | progressWriter := options.Stderr |
| 117 | if options.ProgressOutputToStdout { |
| 118 | progressWriter = options.Stdout |
| 119 | } |
| 120 | |
| 121 | fetcher, cleanup, err := createOCIRegistry(ctx, parsedReference, options.GOptions, false) |
| 122 | if err != nil { |
| 123 | return nil, err |
| 124 | } |
| 125 | defer cleanup() |
| 126 | |
| 127 | transferErr := doTransfer(ctx, client, fetcher, store, options.Quiet, progressWriter) |
| 128 | |
| 129 | if transferErr != nil && (errors.Is(transferErr, http.ErrSchemeMismatch) || errutil.IsErrConnectionRefused(transferErr) || errutil.IsErrHTTPResponseToHTTPSClient(transferErr) || errutil.IsErrTLSHandshakeFailure(transferErr)) { |
| 130 | if options.GOptions.InsecureRegistry { |
| 131 | log.G(ctx).WithError(transferErr).Warnf("server %q does not seem to support HTTPS, falling back to plain HTTP", parsedReference.Domain) |
| 132 | fetcher, cleanup2, err := createOCIRegistry(ctx, parsedReference, options.GOptions, true) |
| 133 | if err != nil { |
| 134 | return nil, err |
| 135 | } |
| 136 | defer cleanup2() |
| 137 | transferErr = doTransfer(ctx, client, fetcher, store, options.Quiet, progressWriter) |
| 138 | } |
| 139 | } |
| 140 | |
| 141 | if transferErr != nil { |
| 142 | return nil, transferErr |
| 143 | } |
| 144 | |
| 145 | imageStore := client.ImageService() |
| 146 | stored, err := store.Get(ctx, imageStore) |
| 147 | if err != nil { |
| 148 | return nil, err |
| 149 | } |
| 150 | |
| 151 | plMatch := platformutil.NewMatchComparerFromOCISpecPlatformSlice(options.OCISpecPlatform) |
| 152 | containerdImage := containerd.NewImageWithPlatform(client, stored, plMatch) |
| 153 | imgConfig, err := getImageConfig(ctx, containerdImage) |
| 154 | if err != nil { |
| 155 | return nil, err |
| 156 | } |
| 157 | |
| 158 | snapshotter := options.GOptions.Snapshotter |
| 159 | snOpt := getSnapshotterOpts(snapshotter) |
| 160 | |
| 161 | return &EnsuredImage{ |
| 162 | Ref: rawRef, |
| 163 | Image: containerdImage, |
| 164 | ImageConfig: *imgConfig, |
| 165 | Snapshotter: snapshotter, |
| 166 | Remote: snOpt.isRemote(), |
| 167 | }, nil |
no test coverage detected
searching dependent graphs…