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"
|
||||
|
||||
diffapi "github.com/containerd/containerd/api/services/diff/v1"
|
||||
"github.com/containerd/containerd/api/types"
|
||||
"github.com/containerd/containerd/diff"
|
||||
"github.com/containerd/containerd/errdefs"
|
||||
"github.com/containerd/containerd/mount"
|
||||
"github.com/containerd/containerd/oci"
|
||||
"github.com/containerd/typeurl/v2"
|
||||
"github.com/opencontainers/go-digest"
|
||||
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 (
|
||||
ocidesc ocispec.Descriptor
|
||||
err error
|
||||
desc = toDescriptor(er.Diff)
|
||||
mounts = toMounts(er.Mounts)
|
||||
desc = oci.DescriptorFromProto(er.Diff)
|
||||
mounts = mount.FromProto(er.Mounts)
|
||||
)
|
||||
|
||||
var opts []diff.ApplyOpt
|
||||
@ -68,7 +67,7 @@ func (s *service) Apply(ctx context.Context, er *diffapi.ApplyRequest) (*diffapi
|
||||
}
|
||||
|
||||
return &diffapi.ApplyResponse{
|
||||
Applied: fromDescriptor(ocidesc),
|
||||
Applied: oci.DescriptorToProto(ocidesc),
|
||||
}, nil
|
||||
}
|
||||
|
||||
@ -79,8 +78,8 @@ func (s *service) Diff(ctx context.Context, dr *diffapi.DiffRequest) (*diffapi.D
|
||||
var (
|
||||
ocidesc ocispec.Descriptor
|
||||
err error
|
||||
aMounts = toMounts(dr.Left)
|
||||
bMounts = toMounts(dr.Right)
|
||||
aMounts = mount.FromProto(dr.Left)
|
||||
bMounts = mount.FromProto(dr.Right)
|
||||
)
|
||||
|
||||
var opts []diff.Opt
|
||||
@ -104,37 +103,6 @@ func (s *service) Diff(ctx context.Context, dr *diffapi.DiffRequest) (*diffapi.D
|
||||
}
|
||||
|
||||
return &diffapi.DiffResponse{
|
||||
Diff: fromDescriptor(ocidesc),
|
||||
Diff: oci.DescriptorToProto(ocidesc),
|
||||
}, 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"
|
||||
|
||||
snapshotsapi "github.com/containerd/containerd/api/services/snapshots/v1"
|
||||
"github.com/containerd/containerd/api/types"
|
||||
"github.com/containerd/containerd/errdefs"
|
||||
"github.com/containerd/containerd/mount"
|
||||
"github.com/containerd/containerd/protobuf"
|
||||
ptypes "github.com/containerd/containerd/protobuf/types"
|
||||
"github.com/containerd/containerd/snapshots"
|
||||
)
|
||||
@ -51,7 +49,7 @@ func (s service) Prepare(ctx context.Context, pr *snapshotsapi.PrepareSnapshotRe
|
||||
}
|
||||
|
||||
return &snapshotsapi.PrepareSnapshotResponse{
|
||||
Mounts: fromMounts(mounts),
|
||||
Mounts: mount.ToProto(mounts),
|
||||
}, nil
|
||||
}
|
||||
|
||||
@ -65,7 +63,7 @@ func (s service) View(ctx context.Context, pr *snapshotsapi.ViewSnapshotRequest)
|
||||
return nil, errdefs.ToGRPC(err)
|
||||
}
|
||||
return &snapshotsapi.ViewSnapshotResponse{
|
||||
Mounts: fromMounts(mounts),
|
||||
Mounts: mount.ToProto(mounts),
|
||||
}, nil
|
||||
}
|
||||
|
||||
@ -75,7 +73,7 @@ func (s service) Mounts(ctx context.Context, mr *snapshotsapi.MountsRequest) (*s
|
||||
return nil, errdefs.ToGRPC(err)
|
||||
}
|
||||
return &snapshotsapi.MountsResponse{
|
||||
Mounts: fromMounts(mounts),
|
||||
Mounts: mount.ToProto(mounts),
|
||||
}, nil
|
||||
}
|
||||
|
||||
@ -105,16 +103,16 @@ func (s service) Stat(ctx context.Context, sr *snapshotsapi.StatSnapshotRequest)
|
||||
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) {
|
||||
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 {
|
||||
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 {
|
||||
@ -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 {
|
||||
buffer = append(buffer, fromInfo(info))
|
||||
buffer = append(buffer, snapshots.InfoToProto(info))
|
||||
|
||||
if len(buffer) >= 100 {
|
||||
if err := sendBlock(buffer); err != nil {
|
||||
@ -177,58 +175,3 @@ func (s service) Cleanup(ctx context.Context, cr *snapshotsapi.CleanupRequest) (
|
||||
|
||||
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"
|
||||
|
||||
diffapi "github.com/containerd/containerd/api/services/diff/v1"
|
||||
"github.com/containerd/containerd/api/types"
|
||||
"github.com/containerd/containerd/diff"
|
||||
"github.com/containerd/containerd/errdefs"
|
||||
"github.com/containerd/containerd/mount"
|
||||
"github.com/containerd/containerd/oci"
|
||||
"github.com/containerd/containerd/pkg/epoch"
|
||||
"github.com/containerd/containerd/protobuf"
|
||||
ptypes "github.com/containerd/containerd/protobuf/types"
|
||||
"github.com/opencontainers/go-digest"
|
||||
ocispec "github.com/opencontainers/image-spec/specs-go/v1"
|
||||
|
||||
"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{
|
||||
Diff: fromDescriptor(desc),
|
||||
Mounts: fromMounts(mounts),
|
||||
Diff: oci.DescriptorToProto(desc),
|
||||
Mounts: mount.ToProto(mounts),
|
||||
Payloads: payloads,
|
||||
}
|
||||
resp, err := r.client.Apply(ctx, req)
|
||||
if err != nil {
|
||||
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) {
|
||||
@ -85,8 +84,8 @@ func (r *diffRemote) Compare(ctx context.Context, a, b []mount.Mount, opts ...di
|
||||
sourceDateEpoch = timestamppb.New(*config.SourceDateEpoch)
|
||||
}
|
||||
req := &diffapi.DiffRequest{
|
||||
Left: fromMounts(a),
|
||||
Right: fromMounts(b),
|
||||
Left: mount.ToProto(a),
|
||||
Right: mount.ToProto(b),
|
||||
MediaType: config.MediaType,
|
||||
Ref: config.Reference,
|
||||
Labels: config.Labels,
|
||||
@ -96,39 +95,5 @@ func (r *diffRemote) Compare(ctx context.Context, a, b []mount.Mount, opts ...di
|
||||
if err != nil {
|
||||
return ocispec.Descriptor{}, errdefs.FromGRPC(err)
|
||||
}
|
||||
return toDescriptor(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
|
||||
return oci.DescriptorFromProto(resp.Diff), nil
|
||||
}
|
||||
|
@ -20,6 +20,7 @@ import (
|
||||
"fmt"
|
||||
"strings"
|
||||
|
||||
"github.com/containerd/containerd/api/types"
|
||||
"github.com/containerd/continuity/fs"
|
||||
)
|
||||
|
||||
@ -130,3 +131,33 @@ func readonlyOverlay(opt []string) []string {
|
||||
}
|
||||
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"
|
||||
"runtime"
|
||||
|
||||
"github.com/opencontainers/go-digest"
|
||||
ocispec "github.com/opencontainers/image-spec/specs-go/v1"
|
||||
"github.com/opencontainers/runtime-spec/specs-go"
|
||||
|
||||
"github.com/containerd/containerd/api/types"
|
||||
"github.com/containerd/containerd/containers"
|
||||
"github.com/containerd/containerd/namespaces"
|
||||
"github.com/containerd/containerd/platforms"
|
||||
@ -220,3 +223,25 @@ func populateDefaultDarwinSpec(s *Spec) error {
|
||||
}
|
||||
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
|
||||
}
|
||||
|
||||
var specified []v1.Platform
|
||||
for _, p := range s.Platforms {
|
||||
specified = append(specified, v1.Platform{
|
||||
OS: p.OS,
|
||||
Architecture: p.Architecture,
|
||||
Variant: p.Variant,
|
||||
})
|
||||
}
|
||||
|
||||
specified := platforms.FromProto(s.Platforms)
|
||||
iis.stream = tstreaming.WriteByteStream(ctx, stream)
|
||||
iis.mediaType = s.MediaType
|
||||
iis.platforms = specified
|
||||
|
@ -363,7 +363,7 @@ func (is *Store) MarshalAny(context.Context, streaming.StreamCreator) (typeurl.A
|
||||
Labels: is.imageLabels,
|
||||
ManifestLimit: uint32(is.manifestLimit),
|
||||
AllMetadata: is.allMetadata,
|
||||
Platforms: platformsToProto(is.platforms),
|
||||
Platforms: platforms.ToProto(is.platforms),
|
||||
ExtraReferences: referencesToProto(is.extraReferences),
|
||||
Unpacks: unpackToProto(is.unpacks),
|
||||
}
|
||||
@ -380,37 +380,13 @@ func (is *Store) UnmarshalAny(ctx context.Context, sm streaming.StreamGetter, a
|
||||
is.imageLabels = s.Labels
|
||||
is.manifestLimit = int(s.ManifestLimit)
|
||||
is.allMetadata = s.AllMetadata
|
||||
is.platforms = platformFromProto(s.Platforms)
|
||||
is.platforms = platforms.FromProto(s.Platforms)
|
||||
is.extraReferences = referencesFromProto(s.ExtraReferences)
|
||||
is.unpacks = unpackFromProto(s.Unpacks)
|
||||
|
||||
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 {
|
||||
ir := make([]*transfertypes.ImageReference, len(references))
|
||||
for i := range references {
|
||||
|
@ -116,6 +116,7 @@ import (
|
||||
|
||||
specs "github.com/opencontainers/image-spec/specs-go/v1"
|
||||
|
||||
"github.com/containerd/containerd/api/types"
|
||||
"github.com/containerd/containerd/errdefs"
|
||||
)
|
||||
|
||||
@ -275,3 +276,30 @@ func Normalize(platform specs.Platform) specs.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"
|
||||
|
||||
diffapi "github.com/containerd/containerd/api/services/diff/v1"
|
||||
"github.com/containerd/containerd/api/types"
|
||||
"github.com/containerd/containerd/diff"
|
||||
"github.com/containerd/containerd/errdefs"
|
||||
"github.com/containerd/containerd/mount"
|
||||
"github.com/containerd/containerd/oci"
|
||||
"github.com/containerd/containerd/plugin"
|
||||
"github.com/containerd/containerd/services"
|
||||
"github.com/containerd/typeurl/v2"
|
||||
"github.com/opencontainers/go-digest"
|
||||
ocispec "github.com/opencontainers/image-spec/specs-go/v1"
|
||||
"google.golang.org/grpc"
|
||||
)
|
||||
@ -97,8 +96,8 @@ func (l *local) Apply(ctx context.Context, er *diffapi.ApplyRequest, _ ...grpc.C
|
||||
var (
|
||||
ocidesc ocispec.Descriptor
|
||||
err error
|
||||
desc = toDescriptor(er.Diff)
|
||||
mounts = toMounts(er.Mounts)
|
||||
desc = oci.DescriptorFromProto(er.Diff)
|
||||
mounts = mount.FromProto(er.Mounts)
|
||||
)
|
||||
|
||||
var opts []diff.ApplyOpt
|
||||
@ -122,7 +121,7 @@ func (l *local) Apply(ctx context.Context, er *diffapi.ApplyRequest, _ ...grpc.C
|
||||
}
|
||||
|
||||
return &diffapi.ApplyResponse{
|
||||
Applied: fromDescriptor(ocidesc),
|
||||
Applied: oci.DescriptorToProto(ocidesc),
|
||||
}, nil
|
||||
|
||||
}
|
||||
@ -131,8 +130,8 @@ func (l *local) Diff(ctx context.Context, dr *diffapi.DiffRequest, _ ...grpc.Cal
|
||||
var (
|
||||
ocidesc ocispec.Descriptor
|
||||
err error
|
||||
aMounts = toMounts(dr.Left)
|
||||
bMounts = toMounts(dr.Right)
|
||||
aMounts = mount.FromProto(dr.Left)
|
||||
bMounts = mount.FromProto(dr.Right)
|
||||
)
|
||||
|
||||
var opts []diff.Opt
|
||||
@ -161,37 +160,6 @@ func (l *local) Diff(ctx context.Context, dr *diffapi.DiffRequest, _ ...grpc.Cal
|
||||
}
|
||||
|
||||
return &diffapi.DiffResponse{
|
||||
Diff: fromDescriptor(ocidesc),
|
||||
Diff: oci.DescriptorToProto(ocidesc),
|
||||
}, 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"
|
||||
|
||||
api "github.com/containerd/containerd/api/services/introspection/v1"
|
||||
"github.com/containerd/containerd/api/types"
|
||||
"github.com/containerd/containerd/errdefs"
|
||||
"github.com/containerd/containerd/filters"
|
||||
"github.com/containerd/containerd/platforms"
|
||||
"github.com/containerd/containerd/plugin"
|
||||
ptypes "github.com/containerd/containerd/protobuf/types"
|
||||
"github.com/containerd/containerd/services"
|
||||
@ -189,15 +189,6 @@ func adaptPlugin(o interface{}) filters.Adaptor {
|
||||
func pluginsToPB(plugins []*plugin.Plugin) []*api.Plugin {
|
||||
var pluginsPB []*api.Plugin
|
||||
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
|
||||
for _, r := range p.Registration.Requires {
|
||||
requires = append(requires, r.String())
|
||||
@ -231,7 +222,7 @@ func pluginsToPB(plugins []*plugin.Plugin) []*api.Plugin {
|
||||
Type: p.Registration.Type.String(),
|
||||
ID: p.Registration.ID,
|
||||
Requires: requires,
|
||||
Platforms: platforms,
|
||||
Platforms: platforms.ToProto(p.Meta.Platforms),
|
||||
Capabilities: p.Meta.Capabilities,
|
||||
Exports: p.Meta.Exports,
|
||||
InitErr: initErr,
|
||||
|
@ -21,12 +21,10 @@ import (
|
||||
"errors"
|
||||
|
||||
snapshotsapi "github.com/containerd/containerd/api/services/snapshots/v1"
|
||||
"github.com/containerd/containerd/api/types"
|
||||
"github.com/containerd/containerd/errdefs"
|
||||
"github.com/containerd/containerd/log"
|
||||
"github.com/containerd/containerd/mount"
|
||||
"github.com/containerd/containerd/plugin"
|
||||
"github.com/containerd/containerd/protobuf"
|
||||
ptypes "github.com/containerd/containerd/protobuf/types"
|
||||
"github.com/containerd/containerd/services"
|
||||
"github.com/containerd/containerd/snapshots"
|
||||
@ -102,7 +100,7 @@ func (s *service) Prepare(ctx context.Context, pr *snapshotsapi.PrepareSnapshotR
|
||||
}
|
||||
|
||||
return &snapshotsapi.PrepareSnapshotResponse{
|
||||
Mounts: fromMounts(mounts),
|
||||
Mounts: mount.ToProto(mounts),
|
||||
}, nil
|
||||
}
|
||||
|
||||
@ -121,7 +119,7 @@ func (s *service) View(ctx context.Context, pr *snapshotsapi.ViewSnapshotRequest
|
||||
return nil, errdefs.ToGRPC(err)
|
||||
}
|
||||
return &snapshotsapi.ViewSnapshotResponse{
|
||||
Mounts: fromMounts(mounts),
|
||||
Mounts: mount.ToProto(mounts),
|
||||
}, nil
|
||||
}
|
||||
|
||||
@ -137,7 +135,7 @@ func (s *service) Mounts(ctx context.Context, mr *snapshotsapi.MountsRequest) (*
|
||||
return nil, errdefs.ToGRPC(err)
|
||||
}
|
||||
return &snapshotsapi.MountsResponse{
|
||||
Mounts: fromMounts(mounts),
|
||||
Mounts: mount.ToProto(mounts),
|
||||
}, nil
|
||||
}
|
||||
|
||||
@ -185,7 +183,7 @@ func (s *service) Stat(ctx context.Context, sr *snapshotsapi.StatSnapshotRequest
|
||||
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) {
|
||||
@ -195,12 +193,12 @@ func (s *service) Update(ctx context.Context, sr *snapshotsapi.UpdateSnapshotReq
|
||||
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 {
|
||||
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 {
|
||||
@ -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 {
|
||||
buffer = append(buffer, fromInfo(info))
|
||||
buffer = append(buffer, snapshots.InfoToProto(info))
|
||||
|
||||
if len(buffer) >= 100 {
|
||||
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 fromUsage(usage), nil
|
||||
return snapshots.UsageToProto(usage), nil
|
||||
}
|
||||
|
||||
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
|
||||
}
|
||||
|
||||
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"
|
||||
|
||||
snapshotsapi "github.com/containerd/containerd/api/services/snapshots/v1"
|
||||
"github.com/containerd/containerd/api/types"
|
||||
"github.com/containerd/containerd/errdefs"
|
||||
"github.com/containerd/containerd/mount"
|
||||
"github.com/containerd/containerd/protobuf"
|
||||
protobuftypes "github.com/containerd/containerd/protobuf/types"
|
||||
"github.com/containerd/containerd/snapshots"
|
||||
)
|
||||
@ -52,14 +50,14 @@ func (p *proxySnapshotter) Stat(ctx context.Context, key string) (snapshots.Info
|
||||
if err != nil {
|
||||
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) {
|
||||
resp, err := p.client.Update(ctx,
|
||||
&snapshotsapi.UpdateSnapshotRequest{
|
||||
Snapshotter: p.snapshotterName,
|
||||
Info: fromInfo(info),
|
||||
Info: snapshots.InfoToProto(info),
|
||||
UpdateMask: &protobuftypes.FieldMask{
|
||||
Paths: fieldpaths,
|
||||
},
|
||||
@ -67,7 +65,7 @@ func (p *proxySnapshotter) Update(ctx context.Context, info snapshots.Info, fiel
|
||||
if err != nil {
|
||||
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) {
|
||||
@ -78,7 +76,7 @@ func (p *proxySnapshotter) Usage(ctx context.Context, key string) (snapshots.Usa
|
||||
if err != nil {
|
||||
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) {
|
||||
@ -89,7 +87,7 @@ func (p *proxySnapshotter) Mounts(ctx context.Context, key string) ([]mount.Moun
|
||||
if err != nil {
|
||||
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) {
|
||||
@ -108,7 +106,7 @@ func (p *proxySnapshotter) Prepare(ctx context.Context, key, parent string, opts
|
||||
if err != nil {
|
||||
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) {
|
||||
@ -127,7 +125,7 @@ func (p *proxySnapshotter) View(ctx context.Context, key, parent string, opts ..
|
||||
if err != nil {
|
||||
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 {
|
||||
@ -174,7 +172,7 @@ func (p *proxySnapshotter) Walk(ctx context.Context, fn snapshots.WalkFunc, fs .
|
||||
return nil
|
||||
}
|
||||
for _, info := range resp.Info {
|
||||
if err := fn(ctx, toInfo(info)); err != nil {
|
||||
if err := fn(ctx, snapshots.InfoFromProto(info)); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
@ -191,65 +189,3 @@ func (p *proxySnapshotter) Cleanup(ctx context.Context) error {
|
||||
})
|
||||
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"
|
||||
"time"
|
||||
|
||||
snapshotsapi "github.com/containerd/containerd/api/services/snapshots/v1"
|
||||
"github.com/containerd/containerd/mount"
|
||||
"github.com/containerd/containerd/protobuf"
|
||||
)
|
||||
|
||||
const (
|
||||
@ -98,6 +100,29 @@ func (k *Kind) UnmarshalJSON(b []byte) error {
|
||||
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.
|
||||
// JSON marshalling is supported for interacting with tools like ctr,
|
||||
type Info struct {
|
||||
@ -114,6 +139,31 @@ type Info struct {
|
||||
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.
|
||||
//
|
||||
// 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
|
||||
}
|
||||
|
||||
// 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.
|
||||
type WalkFunc func(context.Context, Info) error
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user