snapshots: core: Remove dependency on api types

Core should not have a dependency on API types.
This was causing a transative dependency on grpc when importing the core
snapshots package.

Signed-off-by: Brian Goff <cpuguy83@gmail.com>
This commit is contained in:
Brian Goff 2024-10-01 18:04:59 +00:00
parent 11ffba3dc4
commit 64d29ebe5b
5 changed files with 106 additions and 83 deletions

View File

@ -22,6 +22,7 @@ import (
snapshotsapi "github.com/containerd/containerd/api/services/snapshots/v1" snapshotsapi "github.com/containerd/containerd/api/services/snapshots/v1"
"github.com/containerd/containerd/v2/core/mount" "github.com/containerd/containerd/v2/core/mount"
"github.com/containerd/containerd/v2/core/snapshots" "github.com/containerd/containerd/v2/core/snapshots"
"github.com/containerd/containerd/v2/core/snapshots/proxy"
ptypes "github.com/containerd/containerd/v2/pkg/protobuf/types" ptypes "github.com/containerd/containerd/v2/pkg/protobuf/types"
"github.com/containerd/errdefs" "github.com/containerd/errdefs"
) )
@ -103,16 +104,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: 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) { 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 { if err != nil {
return nil, errdefs.ToGRPC(err) 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 { 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 { 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 len(buffer) >= 100 {
if err := sendBlock(buffer); err != nil { if err := sendBlock(buffer); err != nil {

View File

@ -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,
}
}

View File

@ -50,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 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) { 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: snapshots.InfoToProto(info), Info: InfoToProto(info),
UpdateMask: &protobuftypes.FieldMask{ UpdateMask: &protobuftypes.FieldMask{
Paths: fieldpaths, Paths: fieldpaths,
}, },
@ -65,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 snapshots.InfoFromProto(resp.Info), nil return 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) {
@ -76,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 snapshots.UsageFromProto(resp), nil return 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) {
@ -172,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, snapshots.InfoFromProto(info)); err != nil { if err := fn(ctx, InfoFromProto(info)); err != nil {
return err return err
} }
} }

View File

@ -22,9 +22,7 @@ import (
"strings" "strings"
"time" "time"
snapshotsapi "github.com/containerd/containerd/api/services/snapshots/v1"
"github.com/containerd/containerd/v2/core/mount" "github.com/containerd/containerd/v2/core/mount"
"github.com/containerd/containerd/v2/pkg/protobuf"
) )
const ( const (
@ -100,31 +98,6 @@ 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 {
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. // 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 {
@ -141,31 +114,6 @@ 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
@ -185,23 +133,6 @@ 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

View File

@ -22,6 +22,7 @@ import (
snapshotsapi "github.com/containerd/containerd/api/services/snapshots/v1" snapshotsapi "github.com/containerd/containerd/api/services/snapshots/v1"
"github.com/containerd/containerd/v2/core/mount" "github.com/containerd/containerd/v2/core/mount"
"github.com/containerd/containerd/v2/core/snapshots" "github.com/containerd/containerd/v2/core/snapshots"
"github.com/containerd/containerd/v2/core/snapshots/proxy"
ptypes "github.com/containerd/containerd/v2/pkg/protobuf/types" ptypes "github.com/containerd/containerd/v2/pkg/protobuf/types"
"github.com/containerd/containerd/v2/plugins" "github.com/containerd/containerd/v2/plugins"
"github.com/containerd/containerd/v2/plugins/services" "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 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) { 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 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 { if err != nil {
return nil, errdefs.ToGRPC(err) 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 { 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 { 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 len(buffer) >= 100 {
if err := sendBlock(buffer); err != nil { 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 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) { func (s *service) Cleanup(ctx context.Context, cr *snapshotsapi.CleanupRequest) (*ptypes.Empty, error) {