diff --git a/contrib/snapshotservice/service.go b/contrib/snapshotservice/service.go index af98b912a..6ae66bfdf 100644 --- a/contrib/snapshotservice/service.go +++ b/contrib/snapshotservice/service.go @@ -22,6 +22,7 @@ import ( snapshotsapi "github.com/containerd/containerd/api/services/snapshots/v1" "github.com/containerd/containerd/v2/core/mount" "github.com/containerd/containerd/v2/core/snapshots" + "github.com/containerd/containerd/v2/core/snapshots/proxy" ptypes "github.com/containerd/containerd/v2/pkg/protobuf/types" "github.com/containerd/errdefs" ) @@ -103,16 +104,16 @@ func (s service) Stat(ctx context.Context, sr *snapshotsapi.StatSnapshotRequest) return nil, errdefs.ToGRPC(err) } - return &snapshotsapi.StatSnapshotResponse{Info: snapshots.InfoToProto(info)}, nil + return &snapshotsapi.StatSnapshotResponse{Info: proxy.InfoToProto(info)}, nil } func (s service) Update(ctx context.Context, sr *snapshotsapi.UpdateSnapshotRequest) (*snapshotsapi.UpdateSnapshotResponse, error) { - info, err := s.sn.Update(ctx, snapshots.InfoFromProto(sr.Info), sr.UpdateMask.GetPaths()...) + info, err := s.sn.Update(ctx, proxy.InfoFromProto(sr.Info), sr.UpdateMask.GetPaths()...) if err != nil { return nil, errdefs.ToGRPC(err) } - return &snapshotsapi.UpdateSnapshotResponse{Info: snapshots.InfoToProto(info)}, nil + return &snapshotsapi.UpdateSnapshotResponse{Info: proxy.InfoToProto(info)}, nil } func (s service) List(sr *snapshotsapi.ListSnapshotsRequest, ss snapshotsapi.Snapshots_ListServer) error { @@ -125,7 +126,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, snapshots.InfoToProto(info)) + buffer = append(buffer, proxy.InfoToProto(info)) if len(buffer) >= 100 { if err := sendBlock(buffer); err != nil { diff --git a/core/snapshots/proxy/convert.go b/core/snapshots/proxy/convert.go new file mode 100644 index 000000000..b987be0ab --- /dev/null +++ b/core/snapshots/proxy/convert.go @@ -0,0 +1,90 @@ +/* + Copyright The containerd Authors. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +package proxy + +import ( + snapshotsapi "github.com/containerd/containerd/api/services/snapshots/v1" + "github.com/containerd/containerd/v2/core/snapshots" + "github.com/containerd/containerd/v2/pkg/protobuf" +) + +// KindToProto converts from [Kind] to the protobuf definition [snapshots.Kind]. +func KindToProto(kind snapshots.Kind) snapshotsapi.Kind { + switch kind { + case snapshots.KindActive: + return snapshotsapi.Kind_ACTIVE + case snapshots.KindView: + return snapshotsapi.Kind_VIEW + default: + return snapshotsapi.Kind_COMMITTED + } +} + +// KindFromProto converts from the protobuf definition [snapshots.Kind] to +// [Kind]. +func KindFromProto(kind snapshotsapi.Kind) snapshots.Kind { + switch kind { + case snapshotsapi.Kind_ACTIVE: + return snapshots.KindActive + case snapshotsapi.Kind_VIEW: + return snapshots.KindView + default: + return snapshots.KindCommitted + } +} + +// InfoToProto converts from [Info] to the protobuf definition [snapshots.Info]. +func InfoToProto(info snapshots.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) snapshots.Info { + return snapshots.Info{ + Name: info.Name, + Parent: info.Parent, + Kind: KindFromProto(info.Kind), + Created: protobuf.FromTimestamp(info.CreatedAt), + Updated: protobuf.FromTimestamp(info.UpdatedAt), + Labels: info.Labels, + } +} + +// UsageFromProto converts from the protobuf definition [snapshots.Usage] to +// [Usage]. +func UsageFromProto(resp *snapshotsapi.UsageResponse) snapshots.Usage { + return snapshots.Usage{ + Inodes: resp.Inodes, + Size: resp.Size, + } +} + +// UsageToProto converts from [Usage] to the protobuf definition [snapshots.Usage]. +func UsageToProto(usage snapshots.Usage) *snapshotsapi.UsageResponse { + return &snapshotsapi.UsageResponse{ + Inodes: usage.Inodes, + Size: usage.Size, + } +} diff --git a/core/snapshots/proxy/proxy.go b/core/snapshots/proxy/proxy.go index d37a377c0..f2c1ba3e4 100644 --- a/core/snapshots/proxy/proxy.go +++ b/core/snapshots/proxy/proxy.go @@ -50,14 +50,14 @@ func (p *proxySnapshotter) Stat(ctx context.Context, key string) (snapshots.Info if err != nil { return snapshots.Info{}, errdefs.FromGRPC(err) } - return snapshots.InfoFromProto(resp.Info), nil + return 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: snapshots.InfoToProto(info), + Info: InfoToProto(info), UpdateMask: &protobuftypes.FieldMask{ Paths: fieldpaths, }, @@ -65,7 +65,7 @@ func (p *proxySnapshotter) Update(ctx context.Context, info snapshots.Info, fiel if err != nil { return snapshots.Info{}, errdefs.FromGRPC(err) } - return snapshots.InfoFromProto(resp.Info), nil + return InfoFromProto(resp.Info), nil } func (p *proxySnapshotter) Usage(ctx context.Context, key string) (snapshots.Usage, error) { @@ -76,7 +76,7 @@ func (p *proxySnapshotter) Usage(ctx context.Context, key string) (snapshots.Usa if err != nil { return snapshots.Usage{}, errdefs.FromGRPC(err) } - return snapshots.UsageFromProto(resp), nil + return UsageFromProto(resp), nil } func (p *proxySnapshotter) Mounts(ctx context.Context, key string) ([]mount.Mount, error) { @@ -172,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, snapshots.InfoFromProto(info)); err != nil { + if err := fn(ctx, InfoFromProto(info)); err != nil { return err } } diff --git a/core/snapshots/snapshotter.go b/core/snapshots/snapshotter.go index 09a2bfc57..5c07e9090 100644 --- a/core/snapshots/snapshotter.go +++ b/core/snapshots/snapshotter.go @@ -22,9 +22,7 @@ import ( "strings" "time" - snapshotsapi "github.com/containerd/containerd/api/services/snapshots/v1" "github.com/containerd/containerd/v2/core/mount" - "github.com/containerd/containerd/v2/pkg/protobuf" ) const ( @@ -100,31 +98,6 @@ 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 { - switch kind { - case KindActive: - return snapshotsapi.Kind_ACTIVE - case KindView: - return snapshotsapi.Kind_VIEW - default: - return snapshotsapi.Kind_COMMITTED - } -} - -// KindFromProto converts from the protobuf definition [snapshots.Kind] to -// [Kind]. -func KindFromProto(kind snapshotsapi.Kind) Kind { - switch kind { - case snapshotsapi.Kind_ACTIVE: - return KindActive - case snapshotsapi.Kind_VIEW: - return KindView - default: - return KindCommitted - } -} - // Info provides information about a particular snapshot. // JSON marshalling is supported for interacting with tools like ctr, type Info struct { @@ -141,31 +114,6 @@ 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 @@ -185,23 +133,6 @@ 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 diff --git a/plugins/services/snapshots/service.go b/plugins/services/snapshots/service.go index f2208adb1..2611d81da 100644 --- a/plugins/services/snapshots/service.go +++ b/plugins/services/snapshots/service.go @@ -22,6 +22,7 @@ import ( snapshotsapi "github.com/containerd/containerd/api/services/snapshots/v1" "github.com/containerd/containerd/v2/core/mount" "github.com/containerd/containerd/v2/core/snapshots" + "github.com/containerd/containerd/v2/core/snapshots/proxy" ptypes "github.com/containerd/containerd/v2/pkg/protobuf/types" "github.com/containerd/containerd/v2/plugins" "github.com/containerd/containerd/v2/plugins/services" @@ -175,7 +176,7 @@ func (s *service) Stat(ctx context.Context, sr *snapshotsapi.StatSnapshotRequest return nil, errdefs.ToGRPC(err) } - return &snapshotsapi.StatSnapshotResponse{Info: snapshots.InfoToProto(info)}, nil + return &snapshotsapi.StatSnapshotResponse{Info: proxy.InfoToProto(info)}, nil } func (s *service) Update(ctx context.Context, sr *snapshotsapi.UpdateSnapshotRequest) (*snapshotsapi.UpdateSnapshotResponse, error) { @@ -185,12 +186,12 @@ func (s *service) Update(ctx context.Context, sr *snapshotsapi.UpdateSnapshotReq return nil, err } - info, err := sn.Update(ctx, snapshots.InfoFromProto(sr.Info), sr.UpdateMask.GetPaths()...) + info, err := sn.Update(ctx, proxy.InfoFromProto(sr.Info), sr.UpdateMask.GetPaths()...) if err != nil { return nil, errdefs.ToGRPC(err) } - return &snapshotsapi.UpdateSnapshotResponse{Info: snapshots.InfoToProto(info)}, nil + return &snapshotsapi.UpdateSnapshotResponse{Info: proxy.InfoToProto(info)}, nil } func (s *service) List(sr *snapshotsapi.ListSnapshotsRequest, ss snapshotsapi.Snapshots_ListServer) error { @@ -208,7 +209,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, snapshots.InfoToProto(info)) + buffer = append(buffer, proxy.InfoToProto(info)) if len(buffer) >= 100 { if err := sendBlock(buffer); err != nil { @@ -244,7 +245,7 @@ func (s *service) Usage(ctx context.Context, ur *snapshotsapi.UsageRequest) (*sn return nil, errdefs.ToGRPC(err) } - return snapshots.UsageToProto(usage), nil + return proxy.UsageToProto(usage), nil } func (s *service) Cleanup(ctx context.Context, cr *snapshotsapi.CleanupRequest) (*ptypes.Empty, error) {