diff --git a/client.go b/client.go index 6516809a5..3c337db59 100644 --- a/client.go +++ b/client.go @@ -546,6 +546,19 @@ func writeIndex(ctx context.Context, index *ocispec.Index, client *Client, ref s return writeContent(ctx, client.ContentStore(), ocispec.MediaTypeImageIndex, ref, bytes.NewReader(data), content.WithLabels(labels)) } +func decodeIndex(ctx context.Context, store content.Provider, desc ocispec.Descriptor) (*ocispec.Index, error) { + var index ocispec.Index + p, err := content.ReadBlob(ctx, store, desc) + if err != nil { + return nil, err + } + if err := json.Unmarshal(p, &index); err != nil { + return nil, err + } + + return &index, nil +} + // GetLabel gets a label value from namespace store // If there is no default label, an empty string returned with nil error func (c *Client) GetLabel(ctx context.Context, label string) (string, error) { diff --git a/import.go b/import.go index ca55920dc..f80a78712 100644 --- a/import.go +++ b/import.go @@ -18,10 +18,8 @@ package containerd import ( "context" - "encoding/json" "io" - "github.com/containerd/containerd/content" "github.com/containerd/containerd/errdefs" "github.com/containerd/containerd/images" "github.com/containerd/containerd/images/archive" @@ -167,16 +165,11 @@ func (c *Client) Import(ctx context.Context, reader io.Reader, opts ...ImportOpt return images.Children(ctx, cs, desc) } - p, err := content.ReadBlob(ctx, cs, desc) + idx, err := decodeIndex(ctx, cs, desc) if err != nil { return nil, err } - var idx ocispec.Index - if err := json.Unmarshal(p, &idx); err != nil { - return nil, err - } - for _, m := range idx.Manifests { name := imageName(m.Annotations, iopts.imageRefT) if name != "" { diff --git a/task.go b/task.go index 0a29a2c3d..7a502c7fa 100644 --- a/task.go +++ b/task.go @@ -17,9 +17,7 @@ package containerd import ( - "bytes" "context" - "encoding/json" "errors" "fmt" "io" @@ -511,7 +509,7 @@ func (t *task) Checkpoint(ctx context.Context, opts ...CheckpointTaskOpts) (Imag return nil, err } } - desc, err := t.writeIndex(ctx, &index) + desc, err := writeIndex(ctx, &index, t.client, t.id) if err != nil { return nil, err } @@ -662,18 +660,6 @@ func (t *task) checkpointImage(ctx context.Context, index *v1.Index, image strin return nil } -func (t *task) writeIndex(ctx context.Context, index *v1.Index) (d v1.Descriptor, err error) { - labels := map[string]string{} - for i, m := range index.Manifests { - labels[fmt.Sprintf("containerd.io/gc.ref.content.%d", i)] = m.Digest.String() - } - buf := bytes.NewBuffer(nil) - if err := json.NewEncoder(buf).Encode(index); err != nil { - return v1.Descriptor{}, err - } - return writeContent(ctx, t.client.ContentStore(), v1.MediaTypeImageIndex, t.id, buf, content.WithLabels(labels)) -} - func writeContent(ctx context.Context, store content.Ingester, mediaType, ref string, r io.Reader, opts ...content.Opt) (d v1.Descriptor, err error) { writer, err := store.Writer(ctx, content.WithRef(ref)) if err != nil { diff --git a/task_opts.go b/task_opts.go index 442e24bd2..77554cee9 100644 --- a/task_opts.go +++ b/task_opts.go @@ -18,18 +18,15 @@ package containerd import ( "context" - "encoding/json" "errors" "fmt" "syscall" "github.com/containerd/containerd/api/types" - "github.com/containerd/containerd/content" "github.com/containerd/containerd/errdefs" "github.com/containerd/containerd/images" "github.com/containerd/containerd/mount" "github.com/containerd/containerd/runtime/v2/runc/options" - imagespec "github.com/opencontainers/image-spec/specs-go/v1" "github.com/opencontainers/runtime-spec/specs-go" ) @@ -79,19 +76,6 @@ func WithTaskCheckpoint(im Image) NewTaskOpts { } } -func decodeIndex(ctx context.Context, store content.Provider, desc imagespec.Descriptor) (*imagespec.Index, error) { - var index imagespec.Index - p, err := content.ReadBlob(ctx, store, desc) - if err != nil { - return nil, err - } - if err := json.Unmarshal(p, &index); err != nil { - return nil, err - } - - return &index, nil -} - // WithCheckpointName sets the image name for the checkpoint func WithCheckpointName(name string) CheckpointTaskOpts { return func(r *CheckpointTaskInfo) error {