From 3fded74bc73a7824af1388400940207207902273 Mon Sep 17 00:00:00 2001 From: Michael Crosby Date: Tue, 6 Aug 2019 18:15:53 +0000 Subject: [PATCH] Add unpack opts Signed-off-by: Michael Crosby --- diff.go | 7 ++++--- diff/apply/apply.go | 2 +- diff/diff.go | 4 ++-- diff/lcow/lcow.go | 2 +- diff/windows/windows.go | 2 +- image.go | 26 +++++++++++++++++++++++--- 6 files changed, 32 insertions(+), 11 deletions(-) diff --git a/diff.go b/diff.go index 182362941..445df0192 100644 --- a/diff.go +++ b/diff.go @@ -48,13 +48,14 @@ type diffRemote struct { func (r *diffRemote) Apply(ctx context.Context, desc ocispec.Descriptor, mounts []mount.Mount, opts ...diff.ApplyOpt) (ocispec.Descriptor, error) { var config diff.ApplyConfig for _, opt := range opts { - if err := opt(&config); err != nil { + if err := opt(ctx, desc, &config); err != nil { return ocispec.Descriptor{}, err } } req := &diffapi.ApplyRequest{ - Diff: fromDescriptor(desc), - Mounts: fromMounts(mounts), + Diff: fromDescriptor(desc), + Mounts: fromMounts(mounts), + Payloads: config.ProcessorPayloads, } resp, err := r.client.Apply(ctx, req) if err != nil { diff --git a/diff/apply/apply.go b/diff/apply/apply.go index 99a6b802e..50ee057f9 100644 --- a/diff/apply/apply.go +++ b/diff/apply/apply.go @@ -65,7 +65,7 @@ func (s *fsApplier) Apply(ctx context.Context, desc ocispec.Descriptor, mounts [ var config diff.ApplyConfig for _, o := range opts { - if err := o(&config); err != nil { + if err := o(ctx, desc, &config); err != nil { return emptyDesc, errors.Wrap(err, "failed to apply config opt") } } diff --git a/diff/diff.go b/diff/diff.go index bf3c514d2..17aab616e 100644 --- a/diff/diff.go +++ b/diff/diff.go @@ -59,7 +59,7 @@ type ApplyConfig struct { } // ApplyOpt is used to configure an Apply operation -type ApplyOpt func(*ApplyConfig) error +type ApplyOpt func(context.Context, ocispec.Descriptor, *ApplyConfig) error // Applier allows applying diffs between mounts type Applier interface { @@ -100,7 +100,7 @@ func WithLabels(labels map[string]string) Opt { // WithPayloads sets the apply processor payloads to the config func WithPayloads(payloads map[string]*types.Any) ApplyOpt { - return func(c *ApplyConfig) error { + return func(_ context.Context, _ ocispec.Descriptor, c *ApplyConfig) error { c.ProcessorPayloads = payloads return nil } diff --git a/diff/lcow/lcow.go b/diff/lcow/lcow.go index 59b812cfc..05ce3fb21 100644 --- a/diff/lcow/lcow.go +++ b/diff/lcow/lcow.go @@ -108,7 +108,7 @@ func (s windowsLcowDiff) Apply(ctx context.Context, desc ocispec.Descriptor, mou var config diff.ApplyConfig for _, o := range opts { - if err := o(&config); err != nil { + if err := o(ctx, desc, &config); err != nil { return emptyDesc, errors.Wrap(err, "failed to apply config opt") } } diff --git a/diff/windows/windows.go b/diff/windows/windows.go index 4ad3b875e..ce584dc27 100644 --- a/diff/windows/windows.go +++ b/diff/windows/windows.go @@ -100,7 +100,7 @@ func (s windowsDiff) Apply(ctx context.Context, desc ocispec.Descriptor, mounts var config diff.ApplyConfig for _, o := range opts { - if err := o(&config); err != nil { + if err := o(ctx, desc, &config); err != nil { return emptyDesc, errors.Wrap(err, "failed to apply config opt") } } diff --git a/image.go b/image.go index 77c95eaa4..9cfc03a30 100644 --- a/image.go +++ b/image.go @@ -21,10 +21,12 @@ import ( "fmt" "github.com/containerd/containerd/content" + "github.com/containerd/containerd/diff" "github.com/containerd/containerd/errdefs" "github.com/containerd/containerd/images" "github.com/containerd/containerd/platforms" "github.com/containerd/containerd/rootfs" + "github.com/containerd/containerd/snapshots" "github.com/opencontainers/go-digest" "github.com/opencontainers/image-spec/identity" ocispec "github.com/opencontainers/image-spec/specs-go/v1" @@ -40,7 +42,7 @@ type Image interface { // Labels of the image Labels() map[string]string // Unpack unpacks the image's content into a snapshot - Unpack(context.Context, string) error + Unpack(context.Context, string, ...UnpackOpt) error // RootFS returns the unpacked diffids that make up images rootfs. RootFS(ctx context.Context) ([]digest.Digest, error) // Size returns the total size of the image's packed resources. @@ -130,13 +132,31 @@ func (i *image) IsUnpacked(ctx context.Context, snapshotterName string) (bool, e return false, nil } -func (i *image) Unpack(ctx context.Context, snapshotterName string) error { +// UnpackConfig provides configuration for the unpack of an image +type UnpackConfig struct { + // ApplyOpts for applying a diff to a snapshotter + ApplyOpts []diff.ApplyOpt + // SnapshotOpts for configuring a snapshotter + SnapshotOpts []snapshots.Opt +} + +// UnpackOpt provides configuration for unpack +type UnpackOpt func(context.Context, *UnpackConfig) error + +func (i *image) Unpack(ctx context.Context, snapshotterName string, opts ...UnpackOpt) error { ctx, done, err := i.client.WithLease(ctx) if err != nil { return err } defer done(ctx) + var config UnpackConfig + for _, o := range opts { + if err := o(ctx, &config); err != nil { + return err + } + } + layers, err := i.getLayers(ctx, i.platform) if err != nil { return err @@ -158,7 +178,7 @@ func (i *image) Unpack(ctx context.Context, snapshotterName string) error { return err } for _, layer := range layers { - unpacked, err = rootfs.ApplyLayer(ctx, layer, chain, sn, a) + unpacked, err = rootfs.ApplyLayerWithOpts(ctx, layer, chain, sn, a, config.SnapshotOpts, config.ApplyOpts) if err != nil { return err }