Merge pull request #3108 from alculquicondor/fix/import
Allow to import an image for the default platform only.
This commit is contained in:
		| @@ -64,6 +64,10 @@ If foobar.tar contains an OCI ref named "latest" and anonymous ref "sha256:deadb | |||||||
| 			Name:  "index-name", | 			Name:  "index-name", | ||||||
| 			Usage: "image name to keep index as, by default index is discarded", | 			Usage: "image name to keep index as, by default index is discarded", | ||||||
| 		}, | 		}, | ||||||
|  | 		cli.BoolFlag{ | ||||||
|  | 			Name:  "all-platforms", | ||||||
|  | 			Usage: "imports content for all platforms, false by default", | ||||||
|  | 		}, | ||||||
| 	}, commands.SnapshotterFlags...), | 	}, commands.SnapshotterFlags...), | ||||||
|  |  | ||||||
| 	Action: func(context *cli.Context) error { | 	Action: func(context *cli.Context) error { | ||||||
| @@ -89,6 +93,8 @@ If foobar.tar contains an OCI ref named "latest" and anonymous ref "sha256:deadb | |||||||
| 			opts = append(opts, containerd.WithIndexName(idxName)) | 			opts = append(opts, containerd.WithIndexName(idxName)) | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
|  | 		opts = append(opts, containerd.WithAllPlatforms(context.Bool("all-platforms"))) | ||||||
|  |  | ||||||
| 		client, ctx, cancel, err := commands.NewClient(context) | 		client, ctx, cancel, err := commands.NewClient(context) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			return err | 			return err | ||||||
|   | |||||||
							
								
								
									
										15
									
								
								import.go
									
									
									
									
									
								
							
							
						
						
									
										15
									
								
								import.go
									
									
									
									
									
								
							| @@ -25,6 +25,7 @@ import ( | |||||||
| 	"github.com/containerd/containerd/errdefs" | 	"github.com/containerd/containerd/errdefs" | ||||||
| 	"github.com/containerd/containerd/images" | 	"github.com/containerd/containerd/images" | ||||||
| 	"github.com/containerd/containerd/images/archive" | 	"github.com/containerd/containerd/images/archive" | ||||||
|  | 	"github.com/containerd/containerd/platforms" | ||||||
| 	digest "github.com/opencontainers/go-digest" | 	digest "github.com/opencontainers/go-digest" | ||||||
| 	ocispec "github.com/opencontainers/image-spec/specs-go/v1" | 	ocispec "github.com/opencontainers/image-spec/specs-go/v1" | ||||||
| ) | ) | ||||||
| @@ -33,6 +34,7 @@ type importOpts struct { | |||||||
| 	indexName    string | 	indexName    string | ||||||
| 	imageRefT    func(string) string | 	imageRefT    func(string) string | ||||||
| 	dgstRefT     func(digest.Digest) string | 	dgstRefT     func(digest.Digest) string | ||||||
|  | 	allPlatforms bool | ||||||
| } | } | ||||||
|  |  | ||||||
| // ImportOpt allows the caller to specify import specific options | // ImportOpt allows the caller to specify import specific options | ||||||
| @@ -64,6 +66,14 @@ func WithIndexName(name string) ImportOpt { | |||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
|  | // WithAllPlatforms is used to import content for all platforms. | ||||||
|  | func WithAllPlatforms(allPlatforms bool) ImportOpt { | ||||||
|  | 	return func(c *importOpts) error { | ||||||
|  | 		c.allPlatforms = allPlatforms | ||||||
|  | 		return nil | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
| // Import imports an image from a Tar stream using reader. | // Import imports an image from a Tar stream using reader. | ||||||
| // Caller needs to specify importer. Future version may use oci.v1 as the default. | // Caller needs to specify importer. Future version may use oci.v1 as the default. | ||||||
| // Note that unreferrenced blobs may be imported to the content store as well. | // Note that unreferrenced blobs may be imported to the content store as well. | ||||||
| @@ -98,6 +108,10 @@ func (c *Client) Import(ctx context.Context, reader io.Reader, opts ...ImportOpt | |||||||
| 			Target: index, | 			Target: index, | ||||||
| 		}) | 		}) | ||||||
| 	} | 	} | ||||||
|  | 	var platformMatcher = platforms.All | ||||||
|  | 	if !iopts.allPlatforms { | ||||||
|  | 		platformMatcher = platforms.Default() | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	var handler images.HandlerFunc = func(ctx context.Context, desc ocispec.Descriptor) ([]ocispec.Descriptor, error) { | 	var handler images.HandlerFunc = func(ctx context.Context, desc ocispec.Descriptor) ([]ocispec.Descriptor, error) { | ||||||
| 		// Only save images at top level | 		// Only save images at top level | ||||||
| @@ -141,6 +155,7 @@ func (c *Client) Import(ctx context.Context, reader io.Reader, opts ...ImportOpt | |||||||
| 		return idx.Manifests, nil | 		return idx.Manifests, nil | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | 	handler = images.FilterPlatforms(handler, platformMatcher) | ||||||
| 	handler = images.SetChildrenLabels(cs, handler) | 	handler = images.SetChildrenLabels(cs, handler) | ||||||
| 	if err := images.Walk(ctx, handler, index); err != nil { | 	if err := images.Walk(ctx, handler, index); err != nil { | ||||||
| 		return nil, err | 		return nil, err | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Phil Estes
					Phil Estes