Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

add label flags to ctr import #9476

Merged
merged 1 commit into from Jan 8, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
16 changes: 15 additions & 1 deletion client/import.go
Expand Up @@ -38,6 +38,7 @@ type importOpts struct {
compress bool
discardLayers bool
skipMissing bool
imageLabels map[string]string
}

// ImportOpt allows the caller to specify import specific options
Expand All @@ -52,6 +53,14 @@ func WithImageRefTranslator(f func(string) string) ImportOpt {
}
}

// WithImageLabels are the image labels to apply to a new image
func WithImageLabels(labels map[string]string) ImportOpt {
return func(c *importOpts) error {
c.imageLabels = labels
return nil
}
}

// WithDigestRef is used to create digest images for each
// manifest in the index.
func WithDigestRef(f func(digest.Digest) string) ImportOpt {
Expand Down Expand Up @@ -223,7 +232,12 @@ func (c *Client) Import(ctx context.Context, reader io.Reader, opts ...ImportOpt
}

for i := range imgs {
img, err := is.Update(ctx, imgs[i], "target")
fieldsPath := []string{"target"}
if iopts.imageLabels != nil {
fieldsPath = append(fieldsPath, "labels")
imgs[i].Labels = iopts.imageLabels
}
img, err := is.Update(ctx, imgs[i], fieldsPath...)
if err != nil {
if !errdefs.IsNotFound(err) {
return nil, err
Expand Down
12 changes: 11 additions & 1 deletion cmd/ctr/commands/images/import.go
Expand Up @@ -98,7 +98,7 @@ If foobar.tar contains an OCI ref named "latest" and anonymous ref "sha256:deadb
Name: "discard-unpacked-layers",
Usage: "Allow the garbage collector to clean layers up from the content store after unpacking, cannot be used with --no-unpack, false by default",
},
}, commands.SnapshotterFlags...),
}, append(commands.SnapshotterFlags, commands.LabelFlag)...),

Action: func(context *cli.Context) error {
var (
Expand All @@ -123,6 +123,11 @@ If foobar.tar contains an OCI ref named "latest" and anonymous ref "sha256:deadb
overwrite = true
}

labels := context.StringSlice("label")
if len(labels) > 0 {
opts = append(opts, image.WithImageLabels(commands.LabelArgs(labels)))
}

if context.Bool("digests") {
opts = append(opts, image.WithDigestRef(prefix, overwrite, !context.Bool("skip-digest-for-named")))
} else {
Expand Down Expand Up @@ -237,6 +242,11 @@ If foobar.tar contains an OCI ref named "latest" and anonymous ref "sha256:deadb
opts = append(opts, containerd.WithDiscardUnpackedLayers())
}

labels := context.StringSlice("label")
if len(labels) > 0 {
opts = append(opts, containerd.WithImageLabels(commands.LabelArgs(labels)))
}

ctx, done, err := client.WithLease(ctx)
if err != nil {
return err
Expand Down
25 changes: 25 additions & 0 deletions integration/client/import_test.go
Expand Up @@ -173,6 +173,8 @@ func TestImport(t *testing.T) {

m1, d3, expManifest := createManifest(c1, [][]byte{b1})

importLabels := map[string]string{"foo": "bar"}

c2, _ := createConfig(runtime.GOOS, runtime.GOARCH, "test2")
m2, d5, _ := createManifest(c2, [][]byte{{1, 2, 3, 4, 5}})

Expand Down Expand Up @@ -315,6 +317,29 @@ func TestImport(t *testing.T) {
checkManifest(ctx, t, client.ContentStore(), imgs[0].Target, expManifest)
},
},
{
Name: "OCI-Labels",
Writer: tartest.TarAll(
tc.Dir(ocispec.ImageBlobsDir, 0o755),
tc.Dir(ocispec.ImageBlobsDir+"/sha256", 0o755),
tc.File(ocispec.ImageBlobsDir+"/sha256/"+d1.Encoded(), b1, 0o644),
tc.File(ocispec.ImageBlobsDir+"/sha256/"+d2.Encoded(), c1, 0o644),
tc.File(ocispec.ImageBlobsDir+"/sha256/"+d3.Encoded(), m1, 0o644),
tc.File(ocispec.ImageIndexFile, createIndex(m1, "latest", "docker.io/lib/img:ok"), 0o644),
tc.File(ocispec.ImageLayoutFile, []byte(`{"imageLayoutVersion":"`+ocispec.ImageLayoutVersion+`"}`), 0o644),
),
Check: func(ctx context.Context, t *testing.T, _ *Client, imgs []images.Image) {
for i := range imgs {
if !reflect.DeepEqual(imgs[i].Labels, importLabels) {
t.Fatalf("DeepEqual on labels failed img.Labels: %+v expected: %+v", imgs[i].Labels, importLabels)
}
}
},
Opts: []ImportOpt{
WithImageLabels(importLabels),
WithImageRefTranslator(archive.AddRefPrefix("localhost:5000/myimage")),
},
},
{
Name: "OCIPrefixName",
Writer: tartest.TarAll(
Expand Down