Merge pull request #8757 from dcantah/proto-api-conversions
Add From/ToProto helpers
This commit is contained in:
commit
099d2e7c76
@ -20,12 +20,11 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
|
|
||||||
diffapi "github.com/containerd/containerd/api/services/diff/v1"
|
diffapi "github.com/containerd/containerd/api/services/diff/v1"
|
||||||
"github.com/containerd/containerd/api/types"
|
|
||||||
"github.com/containerd/containerd/diff"
|
"github.com/containerd/containerd/diff"
|
||||||
"github.com/containerd/containerd/errdefs"
|
"github.com/containerd/containerd/errdefs"
|
||||||
"github.com/containerd/containerd/mount"
|
"github.com/containerd/containerd/mount"
|
||||||
|
"github.com/containerd/containerd/oci"
|
||||||
"github.com/containerd/typeurl/v2"
|
"github.com/containerd/typeurl/v2"
|
||||||
"github.com/opencontainers/go-digest"
|
|
||||||
ocispec "github.com/opencontainers/image-spec/specs-go/v1"
|
ocispec "github.com/opencontainers/image-spec/specs-go/v1"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -49,8 +48,8 @@ func (s *service) Apply(ctx context.Context, er *diffapi.ApplyRequest) (*diffapi
|
|||||||
var (
|
var (
|
||||||
ocidesc ocispec.Descriptor
|
ocidesc ocispec.Descriptor
|
||||||
err error
|
err error
|
||||||
desc = toDescriptor(er.Diff)
|
desc = oci.DescriptorFromProto(er.Diff)
|
||||||
mounts = toMounts(er.Mounts)
|
mounts = mount.FromProto(er.Mounts)
|
||||||
)
|
)
|
||||||
|
|
||||||
var opts []diff.ApplyOpt
|
var opts []diff.ApplyOpt
|
||||||
@ -68,7 +67,7 @@ func (s *service) Apply(ctx context.Context, er *diffapi.ApplyRequest) (*diffapi
|
|||||||
}
|
}
|
||||||
|
|
||||||
return &diffapi.ApplyResponse{
|
return &diffapi.ApplyResponse{
|
||||||
Applied: fromDescriptor(ocidesc),
|
Applied: oci.DescriptorToProto(ocidesc),
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -79,8 +78,8 @@ func (s *service) Diff(ctx context.Context, dr *diffapi.DiffRequest) (*diffapi.D
|
|||||||
var (
|
var (
|
||||||
ocidesc ocispec.Descriptor
|
ocidesc ocispec.Descriptor
|
||||||
err error
|
err error
|
||||||
aMounts = toMounts(dr.Left)
|
aMounts = mount.FromProto(dr.Left)
|
||||||
bMounts = toMounts(dr.Right)
|
bMounts = mount.FromProto(dr.Right)
|
||||||
)
|
)
|
||||||
|
|
||||||
var opts []diff.Opt
|
var opts []diff.Opt
|
||||||
@ -104,37 +103,6 @@ func (s *service) Diff(ctx context.Context, dr *diffapi.DiffRequest) (*diffapi.D
|
|||||||
}
|
}
|
||||||
|
|
||||||
return &diffapi.DiffResponse{
|
return &diffapi.DiffResponse{
|
||||||
Diff: fromDescriptor(ocidesc),
|
Diff: oci.DescriptorToProto(ocidesc),
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func toMounts(apim []*types.Mount) []mount.Mount {
|
|
||||||
mounts := make([]mount.Mount, len(apim))
|
|
||||||
for i, m := range apim {
|
|
||||||
mounts[i] = mount.Mount{
|
|
||||||
Type: m.Type,
|
|
||||||
Source: m.Source,
|
|
||||||
Target: m.Target,
|
|
||||||
Options: m.Options,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return mounts
|
|
||||||
}
|
|
||||||
|
|
||||||
func toDescriptor(d *types.Descriptor) ocispec.Descriptor {
|
|
||||||
return ocispec.Descriptor{
|
|
||||||
MediaType: d.MediaType,
|
|
||||||
Digest: digest.Digest(d.Digest),
|
|
||||||
Size: d.Size,
|
|
||||||
Annotations: d.Annotations,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func fromDescriptor(d ocispec.Descriptor) *types.Descriptor {
|
|
||||||
return &types.Descriptor{
|
|
||||||
MediaType: d.MediaType,
|
|
||||||
Digest: d.Digest.String(),
|
|
||||||
Size: d.Size,
|
|
||||||
Annotations: d.Annotations,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
@ -20,10 +20,8 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
|
|
||||||
snapshotsapi "github.com/containerd/containerd/api/services/snapshots/v1"
|
snapshotsapi "github.com/containerd/containerd/api/services/snapshots/v1"
|
||||||
"github.com/containerd/containerd/api/types"
|
|
||||||
"github.com/containerd/containerd/errdefs"
|
"github.com/containerd/containerd/errdefs"
|
||||||
"github.com/containerd/containerd/mount"
|
"github.com/containerd/containerd/mount"
|
||||||
"github.com/containerd/containerd/protobuf"
|
|
||||||
ptypes "github.com/containerd/containerd/protobuf/types"
|
ptypes "github.com/containerd/containerd/protobuf/types"
|
||||||
"github.com/containerd/containerd/snapshots"
|
"github.com/containerd/containerd/snapshots"
|
||||||
)
|
)
|
||||||
@ -51,7 +49,7 @@ func (s service) Prepare(ctx context.Context, pr *snapshotsapi.PrepareSnapshotRe
|
|||||||
}
|
}
|
||||||
|
|
||||||
return &snapshotsapi.PrepareSnapshotResponse{
|
return &snapshotsapi.PrepareSnapshotResponse{
|
||||||
Mounts: fromMounts(mounts),
|
Mounts: mount.ToProto(mounts),
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -65,7 +63,7 @@ func (s service) View(ctx context.Context, pr *snapshotsapi.ViewSnapshotRequest)
|
|||||||
return nil, errdefs.ToGRPC(err)
|
return nil, errdefs.ToGRPC(err)
|
||||||
}
|
}
|
||||||
return &snapshotsapi.ViewSnapshotResponse{
|
return &snapshotsapi.ViewSnapshotResponse{
|
||||||
Mounts: fromMounts(mounts),
|
Mounts: mount.ToProto(mounts),
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -75,7 +73,7 @@ func (s service) Mounts(ctx context.Context, mr *snapshotsapi.MountsRequest) (*s
|
|||||||
return nil, errdefs.ToGRPC(err)
|
return nil, errdefs.ToGRPC(err)
|
||||||
}
|
}
|
||||||
return &snapshotsapi.MountsResponse{
|
return &snapshotsapi.MountsResponse{
|
||||||
Mounts: fromMounts(mounts),
|
Mounts: mount.ToProto(mounts),
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -105,16 +103,16 @@ func (s service) Stat(ctx context.Context, sr *snapshotsapi.StatSnapshotRequest)
|
|||||||
return nil, errdefs.ToGRPC(err)
|
return nil, errdefs.ToGRPC(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return &snapshotsapi.StatSnapshotResponse{Info: fromInfo(info)}, nil
|
return &snapshotsapi.StatSnapshotResponse{Info: snapshots.InfoToProto(info)}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s service) Update(ctx context.Context, sr *snapshotsapi.UpdateSnapshotRequest) (*snapshotsapi.UpdateSnapshotResponse, error) {
|
func (s service) Update(ctx context.Context, sr *snapshotsapi.UpdateSnapshotRequest) (*snapshotsapi.UpdateSnapshotResponse, error) {
|
||||||
info, err := s.sn.Update(ctx, toInfo(sr.Info), sr.UpdateMask.GetPaths()...)
|
info, err := s.sn.Update(ctx, snapshots.InfoFromProto(sr.Info), sr.UpdateMask.GetPaths()...)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, errdefs.ToGRPC(err)
|
return nil, errdefs.ToGRPC(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return &snapshotsapi.UpdateSnapshotResponse{Info: fromInfo(info)}, nil
|
return &snapshotsapi.UpdateSnapshotResponse{Info: snapshots.InfoToProto(info)}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s service) List(sr *snapshotsapi.ListSnapshotsRequest, ss snapshotsapi.Snapshots_ListServer) error {
|
func (s service) List(sr *snapshotsapi.ListSnapshotsRequest, ss snapshotsapi.Snapshots_ListServer) error {
|
||||||
@ -127,7 +125,7 @@ func (s service) List(sr *snapshotsapi.ListSnapshotsRequest, ss snapshotsapi.Sna
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
err := s.sn.Walk(ss.Context(), func(ctx context.Context, info snapshots.Info) error {
|
err := s.sn.Walk(ss.Context(), func(ctx context.Context, info snapshots.Info) error {
|
||||||
buffer = append(buffer, fromInfo(info))
|
buffer = append(buffer, snapshots.InfoToProto(info))
|
||||||
|
|
||||||
if len(buffer) >= 100 {
|
if len(buffer) >= 100 {
|
||||||
if err := sendBlock(buffer); err != nil {
|
if err := sendBlock(buffer); err != nil {
|
||||||
@ -177,58 +175,3 @@ func (s service) Cleanup(ctx context.Context, cr *snapshotsapi.CleanupRequest) (
|
|||||||
|
|
||||||
return empty, nil
|
return empty, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func fromKind(kind snapshots.Kind) snapshotsapi.Kind {
|
|
||||||
if kind == snapshots.KindActive {
|
|
||||||
return snapshotsapi.Kind_ACTIVE
|
|
||||||
}
|
|
||||||
if kind == snapshots.KindView {
|
|
||||||
return snapshotsapi.Kind_VIEW
|
|
||||||
}
|
|
||||||
return snapshotsapi.Kind_COMMITTED
|
|
||||||
}
|
|
||||||
|
|
||||||
func fromInfo(info snapshots.Info) *snapshotsapi.Info {
|
|
||||||
return &snapshotsapi.Info{
|
|
||||||
Name: info.Name,
|
|
||||||
Parent: info.Parent,
|
|
||||||
Kind: fromKind(info.Kind),
|
|
||||||
CreatedAt: protobuf.ToTimestamp(info.Created),
|
|
||||||
UpdatedAt: protobuf.ToTimestamp(info.Updated),
|
|
||||||
Labels: info.Labels,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func fromMounts(mounts []mount.Mount) []*types.Mount {
|
|
||||||
out := make([]*types.Mount, len(mounts))
|
|
||||||
for i, m := range mounts {
|
|
||||||
out[i] = &types.Mount{
|
|
||||||
Type: m.Type,
|
|
||||||
Source: m.Source,
|
|
||||||
Target: m.Target,
|
|
||||||
Options: m.Options,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return out
|
|
||||||
}
|
|
||||||
|
|
||||||
func toInfo(info *snapshotsapi.Info) snapshots.Info {
|
|
||||||
return snapshots.Info{
|
|
||||||
Name: info.Name,
|
|
||||||
Parent: info.Parent,
|
|
||||||
Kind: toKind(info.Kind),
|
|
||||||
Created: protobuf.FromTimestamp(info.CreatedAt),
|
|
||||||
Updated: protobuf.FromTimestamp(info.UpdatedAt),
|
|
||||||
Labels: info.Labels,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func toKind(kind snapshotsapi.Kind) snapshots.Kind {
|
|
||||||
if kind == snapshotsapi.Kind_ACTIVE {
|
|
||||||
return snapshots.KindActive
|
|
||||||
}
|
|
||||||
if kind == snapshotsapi.Kind_VIEW {
|
|
||||||
return snapshots.KindView
|
|
||||||
}
|
|
||||||
return snapshots.KindCommitted
|
|
||||||
}
|
|
||||||
|
@ -20,14 +20,13 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
|
|
||||||
diffapi "github.com/containerd/containerd/api/services/diff/v1"
|
diffapi "github.com/containerd/containerd/api/services/diff/v1"
|
||||||
"github.com/containerd/containerd/api/types"
|
|
||||||
"github.com/containerd/containerd/diff"
|
"github.com/containerd/containerd/diff"
|
||||||
"github.com/containerd/containerd/errdefs"
|
"github.com/containerd/containerd/errdefs"
|
||||||
"github.com/containerd/containerd/mount"
|
"github.com/containerd/containerd/mount"
|
||||||
|
"github.com/containerd/containerd/oci"
|
||||||
"github.com/containerd/containerd/pkg/epoch"
|
"github.com/containerd/containerd/pkg/epoch"
|
||||||
"github.com/containerd/containerd/protobuf"
|
"github.com/containerd/containerd/protobuf"
|
||||||
ptypes "github.com/containerd/containerd/protobuf/types"
|
ptypes "github.com/containerd/containerd/protobuf/types"
|
||||||
"github.com/opencontainers/go-digest"
|
|
||||||
ocispec "github.com/opencontainers/image-spec/specs-go/v1"
|
ocispec "github.com/opencontainers/image-spec/specs-go/v1"
|
||||||
|
|
||||||
"google.golang.org/protobuf/types/known/timestamppb"
|
"google.golang.org/protobuf/types/known/timestamppb"
|
||||||
@ -59,15 +58,15 @@ func (r *diffRemote) Apply(ctx context.Context, desc ocispec.Descriptor, mounts
|
|||||||
}
|
}
|
||||||
|
|
||||||
req := &diffapi.ApplyRequest{
|
req := &diffapi.ApplyRequest{
|
||||||
Diff: fromDescriptor(desc),
|
Diff: oci.DescriptorToProto(desc),
|
||||||
Mounts: fromMounts(mounts),
|
Mounts: mount.ToProto(mounts),
|
||||||
Payloads: payloads,
|
Payloads: payloads,
|
||||||
}
|
}
|
||||||
resp, err := r.client.Apply(ctx, req)
|
resp, err := r.client.Apply(ctx, req)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return ocispec.Descriptor{}, errdefs.FromGRPC(err)
|
return ocispec.Descriptor{}, errdefs.FromGRPC(err)
|
||||||
}
|
}
|
||||||
return toDescriptor(resp.Applied), nil
|
return oci.DescriptorFromProto(resp.Applied), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *diffRemote) Compare(ctx context.Context, a, b []mount.Mount, opts ...diff.Opt) (ocispec.Descriptor, error) {
|
func (r *diffRemote) Compare(ctx context.Context, a, b []mount.Mount, opts ...diff.Opt) (ocispec.Descriptor, error) {
|
||||||
@ -85,8 +84,8 @@ func (r *diffRemote) Compare(ctx context.Context, a, b []mount.Mount, opts ...di
|
|||||||
sourceDateEpoch = timestamppb.New(*config.SourceDateEpoch)
|
sourceDateEpoch = timestamppb.New(*config.SourceDateEpoch)
|
||||||
}
|
}
|
||||||
req := &diffapi.DiffRequest{
|
req := &diffapi.DiffRequest{
|
||||||
Left: fromMounts(a),
|
Left: mount.ToProto(a),
|
||||||
Right: fromMounts(b),
|
Right: mount.ToProto(b),
|
||||||
MediaType: config.MediaType,
|
MediaType: config.MediaType,
|
||||||
Ref: config.Reference,
|
Ref: config.Reference,
|
||||||
Labels: config.Labels,
|
Labels: config.Labels,
|
||||||
@ -96,39 +95,5 @@ func (r *diffRemote) Compare(ctx context.Context, a, b []mount.Mount, opts ...di
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return ocispec.Descriptor{}, errdefs.FromGRPC(err)
|
return ocispec.Descriptor{}, errdefs.FromGRPC(err)
|
||||||
}
|
}
|
||||||
return toDescriptor(resp.Diff), nil
|
return oci.DescriptorFromProto(resp.Diff), nil
|
||||||
}
|
|
||||||
|
|
||||||
func toDescriptor(d *types.Descriptor) ocispec.Descriptor {
|
|
||||||
if d == nil {
|
|
||||||
return ocispec.Descriptor{}
|
|
||||||
}
|
|
||||||
return ocispec.Descriptor{
|
|
||||||
MediaType: d.MediaType,
|
|
||||||
Digest: digest.Digest(d.Digest),
|
|
||||||
Size: d.Size,
|
|
||||||
Annotations: d.Annotations,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func fromDescriptor(d ocispec.Descriptor) *types.Descriptor {
|
|
||||||
return &types.Descriptor{
|
|
||||||
MediaType: d.MediaType,
|
|
||||||
Digest: d.Digest.String(),
|
|
||||||
Size: d.Size,
|
|
||||||
Annotations: d.Annotations,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func fromMounts(mounts []mount.Mount) []*types.Mount {
|
|
||||||
apiMounts := make([]*types.Mount, len(mounts))
|
|
||||||
for i, m := range mounts {
|
|
||||||
apiMounts[i] = &types.Mount{
|
|
||||||
Type: m.Type,
|
|
||||||
Source: m.Source,
|
|
||||||
Target: m.Target,
|
|
||||||
Options: m.Options,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return apiMounts
|
|
||||||
}
|
}
|
||||||
|
@ -20,6 +20,7 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
|
"github.com/containerd/containerd/api/types"
|
||||||
"github.com/containerd/continuity/fs"
|
"github.com/containerd/continuity/fs"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -130,3 +131,33 @@ func readonlyOverlay(opt []string) []string {
|
|||||||
}
|
}
|
||||||
return out
|
return out
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ToProto converts from [Mount] to the containerd
|
||||||
|
// APIs protobuf definition of a Mount.
|
||||||
|
func ToProto(mounts []Mount) []*types.Mount {
|
||||||
|
apiMounts := make([]*types.Mount, len(mounts))
|
||||||
|
for i, m := range mounts {
|
||||||
|
apiMounts[i] = &types.Mount{
|
||||||
|
Type: m.Type,
|
||||||
|
Source: m.Source,
|
||||||
|
Target: m.Target,
|
||||||
|
Options: m.Options,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return apiMounts
|
||||||
|
}
|
||||||
|
|
||||||
|
// FromProto converts from the protobuf definition [types.Mount] to
|
||||||
|
// [Mount].
|
||||||
|
func FromProto(mm []*types.Mount) []Mount {
|
||||||
|
mounts := make([]Mount, len(mm))
|
||||||
|
for i, m := range mm {
|
||||||
|
mounts[i] = Mount{
|
||||||
|
Type: m.Type,
|
||||||
|
Source: m.Source,
|
||||||
|
Target: m.Target,
|
||||||
|
Options: m.Options,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return mounts
|
||||||
|
}
|
||||||
|
25
oci/spec.go
25
oci/spec.go
@ -21,8 +21,11 @@ import (
|
|||||||
"path/filepath"
|
"path/filepath"
|
||||||
"runtime"
|
"runtime"
|
||||||
|
|
||||||
|
"github.com/opencontainers/go-digest"
|
||||||
|
ocispec "github.com/opencontainers/image-spec/specs-go/v1"
|
||||||
"github.com/opencontainers/runtime-spec/specs-go"
|
"github.com/opencontainers/runtime-spec/specs-go"
|
||||||
|
|
||||||
|
"github.com/containerd/containerd/api/types"
|
||||||
"github.com/containerd/containerd/containers"
|
"github.com/containerd/containerd/containers"
|
||||||
"github.com/containerd/containerd/namespaces"
|
"github.com/containerd/containerd/namespaces"
|
||||||
"github.com/containerd/containerd/platforms"
|
"github.com/containerd/containerd/platforms"
|
||||||
@ -220,3 +223,25 @@ func populateDefaultDarwinSpec(s *Spec) error {
|
|||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// DescriptorFromProto converts containerds protobuf [types.Descriptor]
|
||||||
|
// to the OCI image specs [ocispec.Descriptor].
|
||||||
|
func DescriptorFromProto(d *types.Descriptor) ocispec.Descriptor {
|
||||||
|
return ocispec.Descriptor{
|
||||||
|
MediaType: d.MediaType,
|
||||||
|
Digest: digest.Digest(d.Digest),
|
||||||
|
Size: d.Size,
|
||||||
|
Annotations: d.Annotations,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// DescriptorToProto converts the OCI image specs [ocispec.Descriptor]
|
||||||
|
// to containerds protobuf [types.Descriptor].
|
||||||
|
func DescriptorToProto(d ocispec.Descriptor) *types.Descriptor {
|
||||||
|
return &types.Descriptor{
|
||||||
|
MediaType: d.MediaType,
|
||||||
|
Digest: d.Digest.String(),
|
||||||
|
Size: d.Size,
|
||||||
|
Annotations: d.Annotations,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -156,15 +156,7 @@ func (iis *ImageExportStream) UnmarshalAny(ctx context.Context, sm streaming.Str
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
var specified []v1.Platform
|
specified := platforms.FromProto(s.Platforms)
|
||||||
for _, p := range s.Platforms {
|
|
||||||
specified = append(specified, v1.Platform{
|
|
||||||
OS: p.OS,
|
|
||||||
Architecture: p.Architecture,
|
|
||||||
Variant: p.Variant,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
iis.stream = tstreaming.WriteByteStream(ctx, stream)
|
iis.stream = tstreaming.WriteByteStream(ctx, stream)
|
||||||
iis.mediaType = s.MediaType
|
iis.mediaType = s.MediaType
|
||||||
iis.platforms = specified
|
iis.platforms = specified
|
||||||
|
@ -363,7 +363,7 @@ func (is *Store) MarshalAny(context.Context, streaming.StreamCreator) (typeurl.A
|
|||||||
Labels: is.imageLabels,
|
Labels: is.imageLabels,
|
||||||
ManifestLimit: uint32(is.manifestLimit),
|
ManifestLimit: uint32(is.manifestLimit),
|
||||||
AllMetadata: is.allMetadata,
|
AllMetadata: is.allMetadata,
|
||||||
Platforms: platformsToProto(is.platforms),
|
Platforms: platforms.ToProto(is.platforms),
|
||||||
ExtraReferences: referencesToProto(is.extraReferences),
|
ExtraReferences: referencesToProto(is.extraReferences),
|
||||||
Unpacks: unpackToProto(is.unpacks),
|
Unpacks: unpackToProto(is.unpacks),
|
||||||
}
|
}
|
||||||
@ -380,37 +380,13 @@ func (is *Store) UnmarshalAny(ctx context.Context, sm streaming.StreamGetter, a
|
|||||||
is.imageLabels = s.Labels
|
is.imageLabels = s.Labels
|
||||||
is.manifestLimit = int(s.ManifestLimit)
|
is.manifestLimit = int(s.ManifestLimit)
|
||||||
is.allMetadata = s.AllMetadata
|
is.allMetadata = s.AllMetadata
|
||||||
is.platforms = platformFromProto(s.Platforms)
|
is.platforms = platforms.FromProto(s.Platforms)
|
||||||
is.extraReferences = referencesFromProto(s.ExtraReferences)
|
is.extraReferences = referencesFromProto(s.ExtraReferences)
|
||||||
is.unpacks = unpackFromProto(s.Unpacks)
|
is.unpacks = unpackFromProto(s.Unpacks)
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func platformsToProto(platforms []ocispec.Platform) []*types.Platform {
|
|
||||||
ap := make([]*types.Platform, len(platforms))
|
|
||||||
for i := range platforms {
|
|
||||||
p := types.Platform{
|
|
||||||
OS: platforms[i].OS,
|
|
||||||
Architecture: platforms[i].Architecture,
|
|
||||||
Variant: platforms[i].Variant,
|
|
||||||
}
|
|
||||||
|
|
||||||
ap[i] = &p
|
|
||||||
}
|
|
||||||
return ap
|
|
||||||
}
|
|
||||||
|
|
||||||
func platformFromProto(platforms []*types.Platform) []ocispec.Platform {
|
|
||||||
op := make([]ocispec.Platform, len(platforms))
|
|
||||||
for i := range platforms {
|
|
||||||
op[i].OS = platforms[i].OS
|
|
||||||
op[i].Architecture = platforms[i].Architecture
|
|
||||||
op[i].Variant = platforms[i].Variant
|
|
||||||
}
|
|
||||||
return op
|
|
||||||
}
|
|
||||||
|
|
||||||
func referencesToProto(references []Reference) []*transfertypes.ImageReference {
|
func referencesToProto(references []Reference) []*transfertypes.ImageReference {
|
||||||
ir := make([]*transfertypes.ImageReference, len(references))
|
ir := make([]*transfertypes.ImageReference, len(references))
|
||||||
for i := range references {
|
for i := range references {
|
||||||
|
@ -116,6 +116,7 @@ import (
|
|||||||
|
|
||||||
specs "github.com/opencontainers/image-spec/specs-go/v1"
|
specs "github.com/opencontainers/image-spec/specs-go/v1"
|
||||||
|
|
||||||
|
"github.com/containerd/containerd/api/types"
|
||||||
"github.com/containerd/containerd/errdefs"
|
"github.com/containerd/containerd/errdefs"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -275,3 +276,30 @@ func Normalize(platform specs.Platform) specs.Platform {
|
|||||||
|
|
||||||
return platform
|
return platform
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ToProto converts from a slice of [Platform] to a slice of
|
||||||
|
// the protobuf definition [types.Platform].
|
||||||
|
func ToProto(platforms []Platform) []*types.Platform {
|
||||||
|
ap := make([]*types.Platform, len(platforms))
|
||||||
|
for i := range platforms {
|
||||||
|
p := types.Platform{
|
||||||
|
OS: platforms[i].OS,
|
||||||
|
Architecture: platforms[i].Architecture,
|
||||||
|
Variant: platforms[i].Variant,
|
||||||
|
}
|
||||||
|
ap[i] = &p
|
||||||
|
}
|
||||||
|
return ap
|
||||||
|
}
|
||||||
|
|
||||||
|
// FromProto converts a slice of the protobuf definition [types.Platform]
|
||||||
|
// to a slice of [Platform].
|
||||||
|
func FromProto(platforms []*types.Platform) []Platform {
|
||||||
|
op := make([]Platform, len(platforms))
|
||||||
|
for i := range platforms {
|
||||||
|
op[i].OS = platforms[i].OS
|
||||||
|
op[i].Architecture = platforms[i].Architecture
|
||||||
|
op[i].Variant = platforms[i].Variant
|
||||||
|
}
|
||||||
|
return op
|
||||||
|
}
|
||||||
|
@ -21,14 +21,13 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
diffapi "github.com/containerd/containerd/api/services/diff/v1"
|
diffapi "github.com/containerd/containerd/api/services/diff/v1"
|
||||||
"github.com/containerd/containerd/api/types"
|
|
||||||
"github.com/containerd/containerd/diff"
|
"github.com/containerd/containerd/diff"
|
||||||
"github.com/containerd/containerd/errdefs"
|
"github.com/containerd/containerd/errdefs"
|
||||||
"github.com/containerd/containerd/mount"
|
"github.com/containerd/containerd/mount"
|
||||||
|
"github.com/containerd/containerd/oci"
|
||||||
"github.com/containerd/containerd/plugin"
|
"github.com/containerd/containerd/plugin"
|
||||||
"github.com/containerd/containerd/services"
|
"github.com/containerd/containerd/services"
|
||||||
"github.com/containerd/typeurl/v2"
|
"github.com/containerd/typeurl/v2"
|
||||||
"github.com/opencontainers/go-digest"
|
|
||||||
ocispec "github.com/opencontainers/image-spec/specs-go/v1"
|
ocispec "github.com/opencontainers/image-spec/specs-go/v1"
|
||||||
"google.golang.org/grpc"
|
"google.golang.org/grpc"
|
||||||
)
|
)
|
||||||
@ -97,8 +96,8 @@ func (l *local) Apply(ctx context.Context, er *diffapi.ApplyRequest, _ ...grpc.C
|
|||||||
var (
|
var (
|
||||||
ocidesc ocispec.Descriptor
|
ocidesc ocispec.Descriptor
|
||||||
err error
|
err error
|
||||||
desc = toDescriptor(er.Diff)
|
desc = oci.DescriptorFromProto(er.Diff)
|
||||||
mounts = toMounts(er.Mounts)
|
mounts = mount.FromProto(er.Mounts)
|
||||||
)
|
)
|
||||||
|
|
||||||
var opts []diff.ApplyOpt
|
var opts []diff.ApplyOpt
|
||||||
@ -122,7 +121,7 @@ func (l *local) Apply(ctx context.Context, er *diffapi.ApplyRequest, _ ...grpc.C
|
|||||||
}
|
}
|
||||||
|
|
||||||
return &diffapi.ApplyResponse{
|
return &diffapi.ApplyResponse{
|
||||||
Applied: fromDescriptor(ocidesc),
|
Applied: oci.DescriptorToProto(ocidesc),
|
||||||
}, nil
|
}, nil
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -131,8 +130,8 @@ func (l *local) Diff(ctx context.Context, dr *diffapi.DiffRequest, _ ...grpc.Cal
|
|||||||
var (
|
var (
|
||||||
ocidesc ocispec.Descriptor
|
ocidesc ocispec.Descriptor
|
||||||
err error
|
err error
|
||||||
aMounts = toMounts(dr.Left)
|
aMounts = mount.FromProto(dr.Left)
|
||||||
bMounts = toMounts(dr.Right)
|
bMounts = mount.FromProto(dr.Right)
|
||||||
)
|
)
|
||||||
|
|
||||||
var opts []diff.Opt
|
var opts []diff.Opt
|
||||||
@ -161,37 +160,6 @@ func (l *local) Diff(ctx context.Context, dr *diffapi.DiffRequest, _ ...grpc.Cal
|
|||||||
}
|
}
|
||||||
|
|
||||||
return &diffapi.DiffResponse{
|
return &diffapi.DiffResponse{
|
||||||
Diff: fromDescriptor(ocidesc),
|
Diff: oci.DescriptorToProto(ocidesc),
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func toMounts(apim []*types.Mount) []mount.Mount {
|
|
||||||
mounts := make([]mount.Mount, len(apim))
|
|
||||||
for i, m := range apim {
|
|
||||||
mounts[i] = mount.Mount{
|
|
||||||
Type: m.Type,
|
|
||||||
Source: m.Source,
|
|
||||||
Target: m.Target,
|
|
||||||
Options: m.Options,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return mounts
|
|
||||||
}
|
|
||||||
|
|
||||||
func toDescriptor(d *types.Descriptor) ocispec.Descriptor {
|
|
||||||
return ocispec.Descriptor{
|
|
||||||
MediaType: d.MediaType,
|
|
||||||
Digest: digest.Digest(d.Digest),
|
|
||||||
Size: d.Size,
|
|
||||||
Annotations: d.Annotations,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func fromDescriptor(d ocispec.Descriptor) *types.Descriptor {
|
|
||||||
return &types.Descriptor{
|
|
||||||
MediaType: d.MediaType,
|
|
||||||
Digest: d.Digest.String(),
|
|
||||||
Size: d.Size,
|
|
||||||
Annotations: d.Annotations,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
@ -24,9 +24,9 @@ import (
|
|||||||
"sync"
|
"sync"
|
||||||
|
|
||||||
api "github.com/containerd/containerd/api/services/introspection/v1"
|
api "github.com/containerd/containerd/api/services/introspection/v1"
|
||||||
"github.com/containerd/containerd/api/types"
|
|
||||||
"github.com/containerd/containerd/errdefs"
|
"github.com/containerd/containerd/errdefs"
|
||||||
"github.com/containerd/containerd/filters"
|
"github.com/containerd/containerd/filters"
|
||||||
|
"github.com/containerd/containerd/platforms"
|
||||||
"github.com/containerd/containerd/plugin"
|
"github.com/containerd/containerd/plugin"
|
||||||
ptypes "github.com/containerd/containerd/protobuf/types"
|
ptypes "github.com/containerd/containerd/protobuf/types"
|
||||||
"github.com/containerd/containerd/services"
|
"github.com/containerd/containerd/services"
|
||||||
@ -189,15 +189,6 @@ func adaptPlugin(o interface{}) filters.Adaptor {
|
|||||||
func pluginsToPB(plugins []*plugin.Plugin) []*api.Plugin {
|
func pluginsToPB(plugins []*plugin.Plugin) []*api.Plugin {
|
||||||
var pluginsPB []*api.Plugin
|
var pluginsPB []*api.Plugin
|
||||||
for _, p := range plugins {
|
for _, p := range plugins {
|
||||||
var platforms []*types.Platform
|
|
||||||
for _, p := range p.Meta.Platforms {
|
|
||||||
platforms = append(platforms, &types.Platform{
|
|
||||||
OS: p.OS,
|
|
||||||
Architecture: p.Architecture,
|
|
||||||
Variant: p.Variant,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
var requires []string
|
var requires []string
|
||||||
for _, r := range p.Registration.Requires {
|
for _, r := range p.Registration.Requires {
|
||||||
requires = append(requires, r.String())
|
requires = append(requires, r.String())
|
||||||
@ -231,7 +222,7 @@ func pluginsToPB(plugins []*plugin.Plugin) []*api.Plugin {
|
|||||||
Type: p.Registration.Type.String(),
|
Type: p.Registration.Type.String(),
|
||||||
ID: p.Registration.ID,
|
ID: p.Registration.ID,
|
||||||
Requires: requires,
|
Requires: requires,
|
||||||
Platforms: platforms,
|
Platforms: platforms.ToProto(p.Meta.Platforms),
|
||||||
Capabilities: p.Meta.Capabilities,
|
Capabilities: p.Meta.Capabilities,
|
||||||
Exports: p.Meta.Exports,
|
Exports: p.Meta.Exports,
|
||||||
InitErr: initErr,
|
InitErr: initErr,
|
||||||
|
@ -21,12 +21,10 @@ import (
|
|||||||
"errors"
|
"errors"
|
||||||
|
|
||||||
snapshotsapi "github.com/containerd/containerd/api/services/snapshots/v1"
|
snapshotsapi "github.com/containerd/containerd/api/services/snapshots/v1"
|
||||||
"github.com/containerd/containerd/api/types"
|
|
||||||
"github.com/containerd/containerd/errdefs"
|
"github.com/containerd/containerd/errdefs"
|
||||||
"github.com/containerd/containerd/log"
|
"github.com/containerd/containerd/log"
|
||||||
"github.com/containerd/containerd/mount"
|
"github.com/containerd/containerd/mount"
|
||||||
"github.com/containerd/containerd/plugin"
|
"github.com/containerd/containerd/plugin"
|
||||||
"github.com/containerd/containerd/protobuf"
|
|
||||||
ptypes "github.com/containerd/containerd/protobuf/types"
|
ptypes "github.com/containerd/containerd/protobuf/types"
|
||||||
"github.com/containerd/containerd/services"
|
"github.com/containerd/containerd/services"
|
||||||
"github.com/containerd/containerd/snapshots"
|
"github.com/containerd/containerd/snapshots"
|
||||||
@ -102,7 +100,7 @@ func (s *service) Prepare(ctx context.Context, pr *snapshotsapi.PrepareSnapshotR
|
|||||||
}
|
}
|
||||||
|
|
||||||
return &snapshotsapi.PrepareSnapshotResponse{
|
return &snapshotsapi.PrepareSnapshotResponse{
|
||||||
Mounts: fromMounts(mounts),
|
Mounts: mount.ToProto(mounts),
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -121,7 +119,7 @@ func (s *service) View(ctx context.Context, pr *snapshotsapi.ViewSnapshotRequest
|
|||||||
return nil, errdefs.ToGRPC(err)
|
return nil, errdefs.ToGRPC(err)
|
||||||
}
|
}
|
||||||
return &snapshotsapi.ViewSnapshotResponse{
|
return &snapshotsapi.ViewSnapshotResponse{
|
||||||
Mounts: fromMounts(mounts),
|
Mounts: mount.ToProto(mounts),
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -137,7 +135,7 @@ func (s *service) Mounts(ctx context.Context, mr *snapshotsapi.MountsRequest) (*
|
|||||||
return nil, errdefs.ToGRPC(err)
|
return nil, errdefs.ToGRPC(err)
|
||||||
}
|
}
|
||||||
return &snapshotsapi.MountsResponse{
|
return &snapshotsapi.MountsResponse{
|
||||||
Mounts: fromMounts(mounts),
|
Mounts: mount.ToProto(mounts),
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -185,7 +183,7 @@ func (s *service) Stat(ctx context.Context, sr *snapshotsapi.StatSnapshotRequest
|
|||||||
return nil, errdefs.ToGRPC(err)
|
return nil, errdefs.ToGRPC(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return &snapshotsapi.StatSnapshotResponse{Info: fromInfo(info)}, nil
|
return &snapshotsapi.StatSnapshotResponse{Info: snapshots.InfoToProto(info)}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *service) Update(ctx context.Context, sr *snapshotsapi.UpdateSnapshotRequest) (*snapshotsapi.UpdateSnapshotResponse, error) {
|
func (s *service) Update(ctx context.Context, sr *snapshotsapi.UpdateSnapshotRequest) (*snapshotsapi.UpdateSnapshotResponse, error) {
|
||||||
@ -195,12 +193,12 @@ func (s *service) Update(ctx context.Context, sr *snapshotsapi.UpdateSnapshotReq
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
info, err := sn.Update(ctx, toInfo(sr.Info), sr.UpdateMask.GetPaths()...)
|
info, err := sn.Update(ctx, snapshots.InfoFromProto(sr.Info), sr.UpdateMask.GetPaths()...)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, errdefs.ToGRPC(err)
|
return nil, errdefs.ToGRPC(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return &snapshotsapi.UpdateSnapshotResponse{Info: fromInfo(info)}, nil
|
return &snapshotsapi.UpdateSnapshotResponse{Info: snapshots.InfoToProto(info)}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *service) List(sr *snapshotsapi.ListSnapshotsRequest, ss snapshotsapi.Snapshots_ListServer) error {
|
func (s *service) List(sr *snapshotsapi.ListSnapshotsRequest, ss snapshotsapi.Snapshots_ListServer) error {
|
||||||
@ -218,7 +216,7 @@ func (s *service) List(sr *snapshotsapi.ListSnapshotsRequest, ss snapshotsapi.Sn
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
err = sn.Walk(ss.Context(), func(ctx context.Context, info snapshots.Info) error {
|
err = sn.Walk(ss.Context(), func(ctx context.Context, info snapshots.Info) error {
|
||||||
buffer = append(buffer, fromInfo(info))
|
buffer = append(buffer, snapshots.InfoToProto(info))
|
||||||
|
|
||||||
if len(buffer) >= 100 {
|
if len(buffer) >= 100 {
|
||||||
if err := sendBlock(buffer); err != nil {
|
if err := sendBlock(buffer); err != nil {
|
||||||
@ -254,7 +252,7 @@ func (s *service) Usage(ctx context.Context, ur *snapshotsapi.UsageRequest) (*sn
|
|||||||
return nil, errdefs.ToGRPC(err)
|
return nil, errdefs.ToGRPC(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return fromUsage(usage), nil
|
return snapshots.UsageToProto(usage), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *service) Cleanup(ctx context.Context, cr *snapshotsapi.CleanupRequest) (*ptypes.Empty, error) {
|
func (s *service) Cleanup(ctx context.Context, cr *snapshotsapi.CleanupRequest) (*ptypes.Empty, error) {
|
||||||
@ -275,65 +273,3 @@ func (s *service) Cleanup(ctx context.Context, cr *snapshotsapi.CleanupRequest)
|
|||||||
|
|
||||||
return empty, nil
|
return empty, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func fromKind(kind snapshots.Kind) snapshotsapi.Kind {
|
|
||||||
if kind == snapshots.KindActive {
|
|
||||||
return snapshotsapi.Kind_ACTIVE
|
|
||||||
}
|
|
||||||
if kind == snapshots.KindView {
|
|
||||||
return snapshotsapi.Kind_VIEW
|
|
||||||
}
|
|
||||||
return snapshotsapi.Kind_COMMITTED
|
|
||||||
}
|
|
||||||
|
|
||||||
func fromInfo(info snapshots.Info) *snapshotsapi.Info {
|
|
||||||
return &snapshotsapi.Info{
|
|
||||||
Name: info.Name,
|
|
||||||
Parent: info.Parent,
|
|
||||||
Kind: fromKind(info.Kind),
|
|
||||||
CreatedAt: protobuf.ToTimestamp(info.Created),
|
|
||||||
UpdatedAt: protobuf.ToTimestamp(info.Updated),
|
|
||||||
Labels: info.Labels,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func fromUsage(usage snapshots.Usage) *snapshotsapi.UsageResponse {
|
|
||||||
return &snapshotsapi.UsageResponse{
|
|
||||||
Inodes: usage.Inodes,
|
|
||||||
Size: usage.Size,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func fromMounts(mounts []mount.Mount) []*types.Mount {
|
|
||||||
out := make([]*types.Mount, len(mounts))
|
|
||||||
for i, m := range mounts {
|
|
||||||
out[i] = &types.Mount{
|
|
||||||
Type: m.Type,
|
|
||||||
Source: m.Source,
|
|
||||||
Target: m.Target,
|
|
||||||
Options: m.Options,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return out
|
|
||||||
}
|
|
||||||
|
|
||||||
func toInfo(info *snapshotsapi.Info) snapshots.Info {
|
|
||||||
return snapshots.Info{
|
|
||||||
Name: info.Name,
|
|
||||||
Parent: info.Parent,
|
|
||||||
Kind: toKind(info.Kind),
|
|
||||||
Created: protobuf.FromTimestamp(info.CreatedAt),
|
|
||||||
Updated: protobuf.FromTimestamp(info.UpdatedAt),
|
|
||||||
Labels: info.Labels,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func toKind(kind snapshotsapi.Kind) snapshots.Kind {
|
|
||||||
if kind == snapshotsapi.Kind_ACTIVE {
|
|
||||||
return snapshots.KindActive
|
|
||||||
}
|
|
||||||
if kind == snapshotsapi.Kind_VIEW {
|
|
||||||
return snapshots.KindView
|
|
||||||
}
|
|
||||||
return snapshots.KindCommitted
|
|
||||||
}
|
|
||||||
|
@ -21,10 +21,8 @@ import (
|
|||||||
"io"
|
"io"
|
||||||
|
|
||||||
snapshotsapi "github.com/containerd/containerd/api/services/snapshots/v1"
|
snapshotsapi "github.com/containerd/containerd/api/services/snapshots/v1"
|
||||||
"github.com/containerd/containerd/api/types"
|
|
||||||
"github.com/containerd/containerd/errdefs"
|
"github.com/containerd/containerd/errdefs"
|
||||||
"github.com/containerd/containerd/mount"
|
"github.com/containerd/containerd/mount"
|
||||||
"github.com/containerd/containerd/protobuf"
|
|
||||||
protobuftypes "github.com/containerd/containerd/protobuf/types"
|
protobuftypes "github.com/containerd/containerd/protobuf/types"
|
||||||
"github.com/containerd/containerd/snapshots"
|
"github.com/containerd/containerd/snapshots"
|
||||||
)
|
)
|
||||||
@ -52,14 +50,14 @@ func (p *proxySnapshotter) Stat(ctx context.Context, key string) (snapshots.Info
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return snapshots.Info{}, errdefs.FromGRPC(err)
|
return snapshots.Info{}, errdefs.FromGRPC(err)
|
||||||
}
|
}
|
||||||
return toInfo(resp.Info), nil
|
return snapshots.InfoFromProto(resp.Info), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *proxySnapshotter) Update(ctx context.Context, info snapshots.Info, fieldpaths ...string) (snapshots.Info, error) {
|
func (p *proxySnapshotter) Update(ctx context.Context, info snapshots.Info, fieldpaths ...string) (snapshots.Info, error) {
|
||||||
resp, err := p.client.Update(ctx,
|
resp, err := p.client.Update(ctx,
|
||||||
&snapshotsapi.UpdateSnapshotRequest{
|
&snapshotsapi.UpdateSnapshotRequest{
|
||||||
Snapshotter: p.snapshotterName,
|
Snapshotter: p.snapshotterName,
|
||||||
Info: fromInfo(info),
|
Info: snapshots.InfoToProto(info),
|
||||||
UpdateMask: &protobuftypes.FieldMask{
|
UpdateMask: &protobuftypes.FieldMask{
|
||||||
Paths: fieldpaths,
|
Paths: fieldpaths,
|
||||||
},
|
},
|
||||||
@ -67,7 +65,7 @@ func (p *proxySnapshotter) Update(ctx context.Context, info snapshots.Info, fiel
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return snapshots.Info{}, errdefs.FromGRPC(err)
|
return snapshots.Info{}, errdefs.FromGRPC(err)
|
||||||
}
|
}
|
||||||
return toInfo(resp.Info), nil
|
return snapshots.InfoFromProto(resp.Info), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *proxySnapshotter) Usage(ctx context.Context, key string) (snapshots.Usage, error) {
|
func (p *proxySnapshotter) Usage(ctx context.Context, key string) (snapshots.Usage, error) {
|
||||||
@ -78,7 +76,7 @@ func (p *proxySnapshotter) Usage(ctx context.Context, key string) (snapshots.Usa
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return snapshots.Usage{}, errdefs.FromGRPC(err)
|
return snapshots.Usage{}, errdefs.FromGRPC(err)
|
||||||
}
|
}
|
||||||
return toUsage(resp), nil
|
return snapshots.UsageFromProto(resp), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *proxySnapshotter) Mounts(ctx context.Context, key string) ([]mount.Mount, error) {
|
func (p *proxySnapshotter) Mounts(ctx context.Context, key string) ([]mount.Mount, error) {
|
||||||
@ -89,7 +87,7 @@ func (p *proxySnapshotter) Mounts(ctx context.Context, key string) ([]mount.Moun
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, errdefs.FromGRPC(err)
|
return nil, errdefs.FromGRPC(err)
|
||||||
}
|
}
|
||||||
return toMounts(resp.Mounts), nil
|
return mount.FromProto(resp.Mounts), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *proxySnapshotter) Prepare(ctx context.Context, key, parent string, opts ...snapshots.Opt) ([]mount.Mount, error) {
|
func (p *proxySnapshotter) Prepare(ctx context.Context, key, parent string, opts ...snapshots.Opt) ([]mount.Mount, error) {
|
||||||
@ -108,7 +106,7 @@ func (p *proxySnapshotter) Prepare(ctx context.Context, key, parent string, opts
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, errdefs.FromGRPC(err)
|
return nil, errdefs.FromGRPC(err)
|
||||||
}
|
}
|
||||||
return toMounts(resp.Mounts), nil
|
return mount.FromProto(resp.Mounts), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *proxySnapshotter) View(ctx context.Context, key, parent string, opts ...snapshots.Opt) ([]mount.Mount, error) {
|
func (p *proxySnapshotter) View(ctx context.Context, key, parent string, opts ...snapshots.Opt) ([]mount.Mount, error) {
|
||||||
@ -127,7 +125,7 @@ func (p *proxySnapshotter) View(ctx context.Context, key, parent string, opts ..
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, errdefs.FromGRPC(err)
|
return nil, errdefs.FromGRPC(err)
|
||||||
}
|
}
|
||||||
return toMounts(resp.Mounts), nil
|
return mount.FromProto(resp.Mounts), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *proxySnapshotter) Commit(ctx context.Context, name, key string, opts ...snapshots.Opt) error {
|
func (p *proxySnapshotter) Commit(ctx context.Context, name, key string, opts ...snapshots.Opt) error {
|
||||||
@ -174,7 +172,7 @@ func (p *proxySnapshotter) Walk(ctx context.Context, fn snapshots.WalkFunc, fs .
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
for _, info := range resp.Info {
|
for _, info := range resp.Info {
|
||||||
if err := fn(ctx, toInfo(info)); err != nil {
|
if err := fn(ctx, snapshots.InfoFromProto(info)); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -191,65 +189,3 @@ func (p *proxySnapshotter) Cleanup(ctx context.Context) error {
|
|||||||
})
|
})
|
||||||
return errdefs.FromGRPC(err)
|
return errdefs.FromGRPC(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
func toKind(kind snapshotsapi.Kind) snapshots.Kind {
|
|
||||||
if kind == snapshotsapi.Kind_ACTIVE {
|
|
||||||
return snapshots.KindActive
|
|
||||||
}
|
|
||||||
if kind == snapshotsapi.Kind_VIEW {
|
|
||||||
return snapshots.KindView
|
|
||||||
}
|
|
||||||
return snapshots.KindCommitted
|
|
||||||
}
|
|
||||||
|
|
||||||
func toInfo(info *snapshotsapi.Info) snapshots.Info {
|
|
||||||
return snapshots.Info{
|
|
||||||
Name: info.Name,
|
|
||||||
Parent: info.Parent,
|
|
||||||
Kind: toKind(info.Kind),
|
|
||||||
Created: protobuf.FromTimestamp(info.CreatedAt),
|
|
||||||
Updated: protobuf.FromTimestamp(info.UpdatedAt),
|
|
||||||
Labels: info.Labels,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func toUsage(resp *snapshotsapi.UsageResponse) snapshots.Usage {
|
|
||||||
return snapshots.Usage{
|
|
||||||
Inodes: resp.Inodes,
|
|
||||||
Size: resp.Size,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func toMounts(mm []*types.Mount) []mount.Mount {
|
|
||||||
mounts := make([]mount.Mount, len(mm))
|
|
||||||
for i, m := range mm {
|
|
||||||
mounts[i] = mount.Mount{
|
|
||||||
Type: m.Type,
|
|
||||||
Source: m.Source,
|
|
||||||
Target: m.Target,
|
|
||||||
Options: m.Options,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return mounts
|
|
||||||
}
|
|
||||||
|
|
||||||
func fromKind(kind snapshots.Kind) snapshotsapi.Kind {
|
|
||||||
if kind == snapshots.KindActive {
|
|
||||||
return snapshotsapi.Kind_ACTIVE
|
|
||||||
}
|
|
||||||
if kind == snapshots.KindView {
|
|
||||||
return snapshotsapi.Kind_VIEW
|
|
||||||
}
|
|
||||||
return snapshotsapi.Kind_COMMITTED
|
|
||||||
}
|
|
||||||
|
|
||||||
func fromInfo(info snapshots.Info) *snapshotsapi.Info {
|
|
||||||
return &snapshotsapi.Info{
|
|
||||||
Name: info.Name,
|
|
||||||
Parent: info.Parent,
|
|
||||||
Kind: fromKind(info.Kind),
|
|
||||||
CreatedAt: protobuf.ToTimestamp(info.Created),
|
|
||||||
UpdatedAt: protobuf.ToTimestamp(info.Updated),
|
|
||||||
Labels: info.Labels,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
@ -22,7 +22,9 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
snapshotsapi "github.com/containerd/containerd/api/services/snapshots/v1"
|
||||||
"github.com/containerd/containerd/mount"
|
"github.com/containerd/containerd/mount"
|
||||||
|
"github.com/containerd/containerd/protobuf"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
@ -98,6 +100,29 @@ func (k *Kind) UnmarshalJSON(b []byte) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// KindToProto converts from [Kind] to the protobuf definition [snapshots.Kind].
|
||||||
|
func KindToProto(kind Kind) snapshotsapi.Kind {
|
||||||
|
if kind == KindActive {
|
||||||
|
return snapshotsapi.Kind_ACTIVE
|
||||||
|
}
|
||||||
|
if kind == KindView {
|
||||||
|
return snapshotsapi.Kind_VIEW
|
||||||
|
}
|
||||||
|
return snapshotsapi.Kind_COMMITTED
|
||||||
|
}
|
||||||
|
|
||||||
|
// KindFromProto converts from the protobuf definition [snapshots.Kind] to
|
||||||
|
// [Kind].
|
||||||
|
func KindFromProto(kind snapshotsapi.Kind) Kind {
|
||||||
|
if kind == snapshotsapi.Kind_ACTIVE {
|
||||||
|
return KindActive
|
||||||
|
}
|
||||||
|
if kind == snapshotsapi.Kind_VIEW {
|
||||||
|
return KindView
|
||||||
|
}
|
||||||
|
return KindCommitted
|
||||||
|
}
|
||||||
|
|
||||||
// Info provides information about a particular snapshot.
|
// Info provides information about a particular snapshot.
|
||||||
// JSON marshalling is supported for interacting with tools like ctr,
|
// JSON marshalling is supported for interacting with tools like ctr,
|
||||||
type Info struct {
|
type Info struct {
|
||||||
@ -114,6 +139,31 @@ type Info struct {
|
|||||||
Updated time.Time `json:",omitempty"` // Last update time
|
Updated time.Time `json:",omitempty"` // Last update time
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// InfoToProto converts from [Info] to the protobuf definition [snapshots.Info].
|
||||||
|
func InfoToProto(info Info) *snapshotsapi.Info {
|
||||||
|
return &snapshotsapi.Info{
|
||||||
|
Name: info.Name,
|
||||||
|
Parent: info.Parent,
|
||||||
|
Kind: KindToProto(info.Kind),
|
||||||
|
CreatedAt: protobuf.ToTimestamp(info.Created),
|
||||||
|
UpdatedAt: protobuf.ToTimestamp(info.Updated),
|
||||||
|
Labels: info.Labels,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// InfoFromProto converts from the protobuf definition [snapshots.Info] to
|
||||||
|
// [Info].
|
||||||
|
func InfoFromProto(info *snapshotsapi.Info) Info {
|
||||||
|
return Info{
|
||||||
|
Name: info.Name,
|
||||||
|
Parent: info.Parent,
|
||||||
|
Kind: KindFromProto(info.Kind),
|
||||||
|
Created: protobuf.FromTimestamp(info.CreatedAt),
|
||||||
|
Updated: protobuf.FromTimestamp(info.UpdatedAt),
|
||||||
|
Labels: info.Labels,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Usage defines statistics for disk resources consumed by the snapshot.
|
// Usage defines statistics for disk resources consumed by the snapshot.
|
||||||
//
|
//
|
||||||
// These resources only include the resources consumed by the snapshot itself
|
// These resources only include the resources consumed by the snapshot itself
|
||||||
@ -133,6 +183,23 @@ func (u *Usage) Add(other Usage) {
|
|||||||
u.Inodes += other.Inodes
|
u.Inodes += other.Inodes
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// UsageFromProto converts from the protobuf definition [snapshots.Usage] to
|
||||||
|
// [Usage].
|
||||||
|
func UsageFromProto(resp *snapshotsapi.UsageResponse) Usage {
|
||||||
|
return Usage{
|
||||||
|
Inodes: resp.Inodes,
|
||||||
|
Size: resp.Size,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// UsageToProto converts from [Usage] to the protobuf definition [snapshots.Usage].
|
||||||
|
func UsageToProto(usage Usage) *snapshotsapi.UsageResponse {
|
||||||
|
return &snapshotsapi.UsageResponse{
|
||||||
|
Inodes: usage.Inodes,
|
||||||
|
Size: usage.Size,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// WalkFunc defines the callback for a snapshot walk.
|
// WalkFunc defines the callback for a snapshot walk.
|
||||||
type WalkFunc func(context.Context, Info) error
|
type WalkFunc func(context.Context, Info) error
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user