Skip to content

Commit

Permalink
add label flags to ctr import
Browse files Browse the repository at this point in the history
checking if labels exists in the image
checking import options and assign it, add integration tests

Signed-off-by: roman-kiselenko <roman.kiselenko.dev@gmail.com>
  • Loading branch information
roman-kiselenko committed Dec 21, 2023
1 parent 87bf39a commit e33ffd1
Show file tree
Hide file tree
Showing 3 changed files with 51 additions and 2 deletions.
16 changes: 15 additions & 1 deletion client/import.go
Expand Up @@ -37,6 +37,7 @@ type importOpts struct {
platformMatcher platforms.MatchComparer
compress bool
discardLayers bool
imageLabels map[string]string
}

// ImportOpt allows the caller to specify import specific options
Expand All @@ -51,6 +52,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 @@ -208,7 +217,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 @@ -176,6 +176,8 @@ func TestImport(t *testing.T) {

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

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

provider := client.ContentStore()

checkManifest := func(ctx context.Context, t *testing.T, d ocispec.Descriptor, expManifest *ocispec.Manifest) {
Expand Down Expand Up @@ -284,6 +286,29 @@ func TestImport(t *testing.T) {
checkManifest(ctx, t, 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(t *testing.T, 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

0 comments on commit e33ffd1

Please sign in to comment.