
Remove rootfs service in place of snapshot service. Adds diff service for extracting and creating diffs. Diff creation is not yet implemented. This service allows pulling or creating images without needing root access to mount. Additionally in the future this will allow containerd to ensure extractions happen safely in a chroot if needed. Signed-off-by: Derek McGowan <derek@mcgstyle.net>
57 lines
1.4 KiB
Go
57 lines
1.4 KiB
Go
package diff
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/containerd/containerd"
|
|
diffapi "github.com/containerd/containerd/api/services/diff"
|
|
"github.com/containerd/containerd/api/types/descriptor"
|
|
mounttypes "github.com/containerd/containerd/api/types/mount"
|
|
"github.com/containerd/containerd/rootfs"
|
|
ocispec "github.com/opencontainers/image-spec/specs-go/v1"
|
|
)
|
|
|
|
// NewApplierFromClient returns a new Applier which communicates
|
|
// over a GRPC connection.
|
|
func NewApplierFromClient(client diffapi.DiffClient) rootfs.Applier {
|
|
return &remoteApplier{
|
|
client: client,
|
|
}
|
|
}
|
|
|
|
type remoteApplier struct {
|
|
client diffapi.DiffClient
|
|
}
|
|
|
|
func (r *remoteApplier) Apply(ctx context.Context, diff ocispec.Descriptor, mounts []containerd.Mount) (ocispec.Descriptor, error) {
|
|
req := &diffapi.ApplyRequest{
|
|
Diff: fromDescriptor(diff),
|
|
Mounts: fromMounts(mounts),
|
|
}
|
|
resp, err := r.client.Apply(ctx, req)
|
|
if err != nil {
|
|
return ocispec.Descriptor{}, err
|
|
}
|
|
return toDescriptor(resp.Applied), nil
|
|
}
|
|
|
|
func fromDescriptor(d ocispec.Descriptor) *descriptor.Descriptor {
|
|
return &descriptor.Descriptor{
|
|
MediaType: d.MediaType,
|
|
Digest: d.Digest,
|
|
Size_: d.Size,
|
|
}
|
|
}
|
|
|
|
func fromMounts(mounts []containerd.Mount) []*mounttypes.Mount {
|
|
apiMounts := make([]*mounttypes.Mount, len(mounts))
|
|
for i, m := range mounts {
|
|
apiMounts[i] = &mounttypes.Mount{
|
|
Type: m.Type,
|
|
Source: m.Source,
|
|
Options: m.Options,
|
|
}
|
|
}
|
|
return apiMounts
|
|
}
|