mirror of
https://github.com/moby/buildkit.git
synced 2026-08-06 07:40:49 +00:00
Update to containerd 1.7.18, which now migrated to the errdefs module. The existing errdefs package is now an alias for the module, and should no longer be used directly. This patch: - updates the containerd dependency: https://github.com/containerd/containerd/compare/v1.7.17...v1.7.18 - replaces uses of the old package in favor of the new module - adds a linter check to prevent accidental re-introduction of the old package - adds a linter check to enforce using an alias, to prevent accidental use of the errdefs package in BuildKit or Moby. - adds a linter check to prevent using the "log" package, which was also migrated to a separate module. There are still some uses of the old package in (indirect) dependencies, which should go away over time. Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
133 lines
3.6 KiB
Go
133 lines
3.6 KiB
Go
package content
|
|
|
|
import (
|
|
"context"
|
|
|
|
api "github.com/containerd/containerd/api/services/content/v1"
|
|
"github.com/containerd/containerd/content"
|
|
"github.com/containerd/containerd/services/content/contentserver"
|
|
cerrdefs "github.com/containerd/errdefs"
|
|
"github.com/moby/buildkit/session"
|
|
digest "github.com/opencontainers/go-digest"
|
|
ocispecs "github.com/opencontainers/image-spec/specs-go/v1"
|
|
"github.com/pkg/errors"
|
|
"google.golang.org/grpc"
|
|
"google.golang.org/grpc/metadata"
|
|
)
|
|
|
|
// GRPCHeaderID is a gRPC header for store ID
|
|
const GRPCHeaderID = "buildkit-attachable-store-id"
|
|
|
|
type attachableContentStore struct {
|
|
stores map[string]content.Store
|
|
}
|
|
|
|
func (cs *attachableContentStore) choose(ctx context.Context) (content.Store, error) {
|
|
md, ok := metadata.FromIncomingContext(ctx)
|
|
if !ok {
|
|
return nil, errors.Wrap(cerrdefs.ErrInvalidArgument, "request lacks metadata")
|
|
}
|
|
|
|
values := md[GRPCHeaderID]
|
|
if len(values) == 0 {
|
|
return nil, errors.Wrapf(cerrdefs.ErrInvalidArgument, "request lacks metadata %q", GRPCHeaderID)
|
|
}
|
|
id := values[0]
|
|
store, ok := cs.stores[id]
|
|
if !ok {
|
|
return nil, errors.Wrapf(cerrdefs.ErrNotFound, "unknown store %s", id)
|
|
}
|
|
return store, nil
|
|
}
|
|
|
|
func (cs *attachableContentStore) Info(ctx context.Context, dgst digest.Digest) (content.Info, error) {
|
|
store, err := cs.choose(ctx)
|
|
if err != nil {
|
|
return content.Info{}, err
|
|
}
|
|
return store.Info(ctx, dgst)
|
|
}
|
|
|
|
func (cs *attachableContentStore) Update(ctx context.Context, info content.Info, fieldpaths ...string) (content.Info, error) {
|
|
store, err := cs.choose(ctx)
|
|
if err != nil {
|
|
return content.Info{}, err
|
|
}
|
|
return store.Update(ctx, info, fieldpaths...)
|
|
}
|
|
|
|
func (cs *attachableContentStore) Walk(ctx context.Context, fn content.WalkFunc, fs ...string) error {
|
|
store, err := cs.choose(ctx)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return store.Walk(ctx, fn, fs...)
|
|
}
|
|
|
|
func (cs *attachableContentStore) Delete(ctx context.Context, dgst digest.Digest) error {
|
|
store, err := cs.choose(ctx)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return store.Delete(ctx, dgst)
|
|
}
|
|
|
|
func (cs *attachableContentStore) ListStatuses(ctx context.Context, fs ...string) ([]content.Status, error) {
|
|
store, err := cs.choose(ctx)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return store.ListStatuses(ctx, fs...)
|
|
}
|
|
|
|
func (cs *attachableContentStore) Status(ctx context.Context, ref string) (content.Status, error) {
|
|
store, err := cs.choose(ctx)
|
|
if err != nil {
|
|
return content.Status{}, err
|
|
}
|
|
return store.Status(ctx, ref)
|
|
}
|
|
|
|
func (cs *attachableContentStore) Abort(ctx context.Context, ref string) error {
|
|
store, err := cs.choose(ctx)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return store.Abort(ctx, ref)
|
|
}
|
|
|
|
func (cs *attachableContentStore) Writer(ctx context.Context, opts ...content.WriterOpt) (content.Writer, error) {
|
|
store, err := cs.choose(ctx)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return store.Writer(ctx, opts...)
|
|
}
|
|
|
|
func (cs *attachableContentStore) ReaderAt(ctx context.Context, desc ocispecs.Descriptor) (content.ReaderAt, error) {
|
|
store, err := cs.choose(ctx)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return store.ReaderAt(ctx, desc)
|
|
}
|
|
|
|
type attachable struct {
|
|
service api.ContentServer
|
|
}
|
|
|
|
// NewAttachable creates session.Attachable from aggregated stores.
|
|
// A key of the store map is an ID string that is used for choosing underlying store.
|
|
func NewAttachable(stores map[string]content.Store) session.Attachable {
|
|
store := &attachableContentStore{stores: stores}
|
|
service := contentserver.New(store)
|
|
a := attachable{
|
|
service: service,
|
|
}
|
|
return &a
|
|
}
|
|
|
|
func (a *attachable) Register(server *grpc.Server) {
|
|
api.RegisterContentServer(server, a.service)
|
|
}
|