feat: replace github.com/pkg/errors to errors
Signed-off-by: haoyun <yun.hao@daocloud.io> Co-authored-by: zounengren <zouyee1989@gmail.com>
This commit is contained in:
@@ -18,8 +18,8 @@ package metadata
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
|
||||
"github.com/pkg/errors"
|
||||
bolt "go.etcd.io/bbolt"
|
||||
)
|
||||
|
||||
@@ -55,7 +55,7 @@ func update(ctx context.Context, db transactor, fn func(*bolt.Tx) error) error {
|
||||
if !ok {
|
||||
return db.Update(fn)
|
||||
} else if !tx.Writable() {
|
||||
return errors.Wrap(bolt.ErrTxNotWritable, "unable to use transaction from context")
|
||||
return fmt.Errorf("unable to use transaction from context: %w", bolt.ErrTxNotWritable)
|
||||
}
|
||||
return fn(tx)
|
||||
}
|
||||
|
||||
@@ -17,11 +17,11 @@
|
||||
package boltutil
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"time"
|
||||
|
||||
"github.com/gogo/protobuf/proto"
|
||||
"github.com/gogo/protobuf/types"
|
||||
"github.com/pkg/errors"
|
||||
bolt "go.etcd.io/bbolt"
|
||||
)
|
||||
|
||||
@@ -99,7 +99,7 @@ func writeMap(bkt *bolt.Bucket, bucketName []byte, labels map[string]string) err
|
||||
}
|
||||
|
||||
if err := lbkt.Put([]byte(k), []byte(v)); err != nil {
|
||||
return errors.Wrapf(err, "failed to set label %q=%q", k, v)
|
||||
return fmt.Errorf("failed to set label %q=%q: %w", k, v, err)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -228,7 +228,7 @@ func ReadAny(bkt *bolt.Bucket, name []byte) (*types.Any, error) {
|
||||
|
||||
out := types.Any{}
|
||||
if err := proto.Unmarshal(bytes, &out); err != nil {
|
||||
return nil, errors.Wrap(err, "failed to unmarshal any")
|
||||
return nil, fmt.Errorf("failed to unmarshal any: %w", err)
|
||||
}
|
||||
|
||||
return &out, nil
|
||||
|
||||
@@ -17,13 +17,13 @@
|
||||
package metadata
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"testing"
|
||||
|
||||
"github.com/containerd/containerd/labels"
|
||||
digest "github.com/opencontainers/go-digest"
|
||||
"github.com/pkg/errors"
|
||||
bolt "go.etcd.io/bbolt"
|
||||
)
|
||||
|
||||
|
||||
@@ -18,6 +18,7 @@ package metadata
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"strings"
|
||||
"sync/atomic"
|
||||
"time"
|
||||
@@ -31,7 +32,6 @@ import (
|
||||
"github.com/containerd/containerd/namespaces"
|
||||
"github.com/gogo/protobuf/proto"
|
||||
"github.com/gogo/protobuf/types"
|
||||
"github.com/pkg/errors"
|
||||
bolt "go.etcd.io/bbolt"
|
||||
)
|
||||
|
||||
@@ -57,11 +57,11 @@ func (s *containerStore) Get(ctx context.Context, id string) (containers.Contain
|
||||
if err := view(ctx, s.db, func(tx *bolt.Tx) error {
|
||||
bkt := getContainerBucket(tx, namespace, id)
|
||||
if bkt == nil {
|
||||
return errors.Wrapf(errdefs.ErrNotFound, "container %q in namespace %q", id, namespace)
|
||||
return fmt.Errorf("container %q in namespace %q: %w", id, namespace, errdefs.ErrNotFound)
|
||||
}
|
||||
|
||||
if err := readContainer(&container, bkt); err != nil {
|
||||
return errors.Wrapf(err, "failed to read container %q", id)
|
||||
return fmt.Errorf("failed to read container %q: %w", id, err)
|
||||
}
|
||||
|
||||
return nil
|
||||
@@ -80,7 +80,7 @@ func (s *containerStore) List(ctx context.Context, fs ...string) ([]containers.C
|
||||
|
||||
filter, err := filters.ParseAll(fs...)
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(errdefs.ErrInvalidArgument, err.Error())
|
||||
return nil, fmt.Errorf("%s: %w", err.Error(), errdefs.ErrInvalidArgument)
|
||||
}
|
||||
|
||||
var m []containers.Container
|
||||
@@ -99,7 +99,7 @@ func (s *containerStore) List(ctx context.Context, fs ...string) ([]containers.C
|
||||
container := containers.Container{ID: string(k)}
|
||||
|
||||
if err := readContainer(&container, cbkt); err != nil {
|
||||
return errors.Wrapf(err, "failed to read container %q", string(k))
|
||||
return fmt.Errorf("failed to read container %q: %w", string(k), err)
|
||||
}
|
||||
|
||||
if filter.Match(adaptContainer(container)) {
|
||||
@@ -121,7 +121,7 @@ func (s *containerStore) Create(ctx context.Context, container containers.Contai
|
||||
}
|
||||
|
||||
if err := validateContainer(&container); err != nil {
|
||||
return containers.Container{}, errors.Wrap(err, "create container failed validation")
|
||||
return containers.Container{}, fmt.Errorf("create container failed validation: %w", err)
|
||||
}
|
||||
|
||||
if err := update(ctx, s.db, func(tx *bolt.Tx) error {
|
||||
@@ -133,7 +133,7 @@ func (s *containerStore) Create(ctx context.Context, container containers.Contai
|
||||
cbkt, err := bkt.CreateBucket([]byte(container.ID))
|
||||
if err != nil {
|
||||
if err == bolt.ErrBucketExists {
|
||||
err = errors.Wrapf(errdefs.ErrAlreadyExists, "container %q", container.ID)
|
||||
err = fmt.Errorf("container %q: %w", container.ID, errdefs.ErrAlreadyExists)
|
||||
}
|
||||
return err
|
||||
}
|
||||
@@ -141,7 +141,7 @@ func (s *containerStore) Create(ctx context.Context, container containers.Contai
|
||||
container.CreatedAt = time.Now().UTC()
|
||||
container.UpdatedAt = container.CreatedAt
|
||||
if err := writeContainer(cbkt, &container); err != nil {
|
||||
return errors.Wrapf(err, "failed to write container %q", container.ID)
|
||||
return fmt.Errorf("failed to write container %q: %w", container.ID, err)
|
||||
}
|
||||
|
||||
return nil
|
||||
@@ -159,23 +159,23 @@ func (s *containerStore) Update(ctx context.Context, container containers.Contai
|
||||
}
|
||||
|
||||
if container.ID == "" {
|
||||
return containers.Container{}, errors.Wrapf(errdefs.ErrInvalidArgument, "must specify a container id")
|
||||
return containers.Container{}, fmt.Errorf("must specify a container id: %w", errdefs.ErrInvalidArgument)
|
||||
}
|
||||
|
||||
var updated containers.Container
|
||||
if err := update(ctx, s.db, func(tx *bolt.Tx) error {
|
||||
bkt := getContainersBucket(tx, namespace)
|
||||
if bkt == nil {
|
||||
return errors.Wrapf(errdefs.ErrNotFound, "cannot update container %q in namespace %q", container.ID, namespace)
|
||||
return fmt.Errorf("cannot update container %q in namespace %q: %w", container.ID, namespace, errdefs.ErrNotFound)
|
||||
}
|
||||
|
||||
cbkt := bkt.Bucket([]byte(container.ID))
|
||||
if cbkt == nil {
|
||||
return errors.Wrapf(errdefs.ErrNotFound, "container %q", container.ID)
|
||||
return fmt.Errorf("container %q: %w", container.ID, errdefs.ErrNotFound)
|
||||
}
|
||||
|
||||
if err := readContainer(&updated, cbkt); err != nil {
|
||||
return errors.Wrapf(err, "failed to read container %q", container.ID)
|
||||
return fmt.Errorf("failed to read container %q: %w", container.ID, err)
|
||||
}
|
||||
createdat := updated.CreatedAt
|
||||
updated.ID = container.ID
|
||||
@@ -188,11 +188,11 @@ func (s *containerStore) Update(ctx context.Context, container containers.Contai
|
||||
// are provided. This allows these fields to become mutable in the
|
||||
// future.
|
||||
if updated.Snapshotter != container.Snapshotter {
|
||||
return errors.Wrapf(errdefs.ErrInvalidArgument, "container.Snapshotter field is immutable")
|
||||
return fmt.Errorf("container.Snapshotter field is immutable: %w", errdefs.ErrInvalidArgument)
|
||||
}
|
||||
|
||||
if updated.Runtime.Name != container.Runtime.Name {
|
||||
return errors.Wrapf(errdefs.ErrInvalidArgument, "container.Runtime.Name field is immutable")
|
||||
return fmt.Errorf("container.Runtime.Name field is immutable: %w", errdefs.ErrInvalidArgument)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -230,18 +230,18 @@ func (s *containerStore) Update(ctx context.Context, container containers.Contai
|
||||
case "snapshotkey":
|
||||
updated.SnapshotKey = container.SnapshotKey
|
||||
default:
|
||||
return errors.Wrapf(errdefs.ErrInvalidArgument, "cannot update %q field on %q", path, container.ID)
|
||||
return fmt.Errorf("cannot update %q field on %q: %w", path, container.ID, errdefs.ErrInvalidArgument)
|
||||
}
|
||||
}
|
||||
|
||||
if err := validateContainer(&updated); err != nil {
|
||||
return errors.Wrap(err, "update failed validation")
|
||||
return fmt.Errorf("update failed validation: %w", err)
|
||||
}
|
||||
|
||||
updated.CreatedAt = createdat
|
||||
updated.UpdatedAt = time.Now().UTC()
|
||||
if err := writeContainer(cbkt, &updated); err != nil {
|
||||
return errors.Wrapf(err, "failed to write container %q", container.ID)
|
||||
return fmt.Errorf("failed to write container %q: %w", container.ID, err)
|
||||
}
|
||||
|
||||
return nil
|
||||
@@ -261,12 +261,12 @@ func (s *containerStore) Delete(ctx context.Context, id string) error {
|
||||
return update(ctx, s.db, func(tx *bolt.Tx) error {
|
||||
bkt := getContainersBucket(tx, namespace)
|
||||
if bkt == nil {
|
||||
return errors.Wrapf(errdefs.ErrNotFound, "cannot delete container %q in namespace %q", id, namespace)
|
||||
return fmt.Errorf("cannot delete container %q in namespace %q: %w", id, namespace, errdefs.ErrNotFound)
|
||||
}
|
||||
|
||||
if err := bkt.DeleteBucket([]byte(id)); err != nil {
|
||||
if err == bolt.ErrBucketNotFound {
|
||||
err = errors.Wrapf(errdefs.ErrNotFound, "container %v", id)
|
||||
err = fmt.Errorf("container %v: %w", id, errdefs.ErrNotFound)
|
||||
}
|
||||
return err
|
||||
}
|
||||
@@ -279,32 +279,32 @@ func (s *containerStore) Delete(ctx context.Context, id string) error {
|
||||
|
||||
func validateContainer(container *containers.Container) error {
|
||||
if err := identifiers.Validate(container.ID); err != nil {
|
||||
return errors.Wrap(err, "container.ID")
|
||||
return fmt.Errorf("container.ID: %w", err)
|
||||
}
|
||||
|
||||
for k := range container.Extensions {
|
||||
if k == "" {
|
||||
return errors.Wrapf(errdefs.ErrInvalidArgument, "container.Extension keys must not be zero-length")
|
||||
return fmt.Errorf("container.Extension keys must not be zero-length: %w", errdefs.ErrInvalidArgument)
|
||||
}
|
||||
}
|
||||
|
||||
// image has no validation
|
||||
for k, v := range container.Labels {
|
||||
if err := labels.Validate(k, v); err != nil {
|
||||
return errors.Wrapf(err, "containers.Labels")
|
||||
return fmt.Errorf("containers.Labels: %w", err)
|
||||
}
|
||||
}
|
||||
|
||||
if container.Runtime.Name == "" {
|
||||
return errors.Wrapf(errdefs.ErrInvalidArgument, "container.Runtime.Name must be set")
|
||||
return fmt.Errorf("container.Runtime.Name must be set: %w", errdefs.ErrInvalidArgument)
|
||||
}
|
||||
|
||||
if container.Spec == nil {
|
||||
return errors.Wrapf(errdefs.ErrInvalidArgument, "container.Spec must be set")
|
||||
return fmt.Errorf("container.Spec must be set: %w", errdefs.ErrInvalidArgument)
|
||||
}
|
||||
|
||||
if container.SnapshotKey != "" && container.Snapshotter == "" {
|
||||
return errors.Wrapf(errdefs.ErrInvalidArgument, "container.Snapshotter must be set if container.SnapshotKey is set")
|
||||
return fmt.Errorf("container.Snapshotter must be set if container.SnapshotKey is set: %w", errdefs.ErrInvalidArgument)
|
||||
}
|
||||
|
||||
return nil
|
||||
|
||||
@@ -18,6 +18,7 @@ package metadata
|
||||
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
"fmt"
|
||||
"os"
|
||||
"path/filepath"
|
||||
@@ -34,7 +35,6 @@ import (
|
||||
"github.com/containerd/typeurl"
|
||||
"github.com/gogo/protobuf/types"
|
||||
specs "github.com/opencontainers/runtime-spec/specs-go"
|
||||
"github.com/pkg/errors"
|
||||
bolt "go.etcd.io/bbolt"
|
||||
)
|
||||
|
||||
@@ -639,7 +639,7 @@ func TestContainersCreateUpdateDelete(t *testing.T) {
|
||||
if testcase.createerr == nil {
|
||||
t.Fatalf("unexpected error: %v", err)
|
||||
} else {
|
||||
t.Fatalf("cause of %v (cause: %v) != %v", err, errors.Cause(err), testcase.createerr)
|
||||
t.Fatalf("cause of %v (cause: %v) != %v", err, errors.Unwrap(err), testcase.createerr)
|
||||
}
|
||||
} else if testcase.createerr != nil {
|
||||
return
|
||||
@@ -661,7 +661,7 @@ func TestContainersCreateUpdateDelete(t *testing.T) {
|
||||
if testcase.cause == nil {
|
||||
t.Fatalf("unexpected error: %v", err)
|
||||
} else {
|
||||
t.Fatalf("cause of %v (cause: %v) != %v", err, errors.Cause(err), testcase.cause)
|
||||
t.Fatalf("cause of %v (cause: %v) != %v", err, errors.Unwrap(err), testcase.cause)
|
||||
}
|
||||
} else if testcase.cause != nil {
|
||||
return
|
||||
|
||||
@@ -19,6 +19,7 @@ package metadata
|
||||
import (
|
||||
"context"
|
||||
"encoding/binary"
|
||||
"fmt"
|
||||
"strings"
|
||||
"sync"
|
||||
"sync/atomic"
|
||||
@@ -33,7 +34,6 @@ import (
|
||||
"github.com/containerd/containerd/namespaces"
|
||||
digest "github.com/opencontainers/go-digest"
|
||||
ocispec "github.com/opencontainers/image-spec/specs-go/v1"
|
||||
"github.com/pkg/errors"
|
||||
bolt "go.etcd.io/bbolt"
|
||||
)
|
||||
|
||||
@@ -81,7 +81,7 @@ func (cs *contentStore) Info(ctx context.Context, dgst digest.Digest) (content.I
|
||||
bkt = getShareableBucket(tx, dgst)
|
||||
}
|
||||
if bkt == nil {
|
||||
return errors.Wrapf(errdefs.ErrNotFound, "content digest %v", dgst)
|
||||
return fmt.Errorf("content digest %v: %w", dgst, errdefs.ErrNotFound)
|
||||
}
|
||||
|
||||
info.Digest = dgst
|
||||
@@ -112,10 +112,10 @@ func (cs *contentStore) Update(ctx context.Context, info content.Info, fieldpath
|
||||
bkt = getShareableBucket(tx, info.Digest)
|
||||
}
|
||||
if bkt == nil {
|
||||
return errors.Wrapf(errdefs.ErrNotFound, "content digest %v", info.Digest)
|
||||
return fmt.Errorf("content digest %v: %w", info.Digest, errdefs.ErrNotFound)
|
||||
}
|
||||
if err := readInfo(&updated, bkt); err != nil {
|
||||
return errors.Wrapf(err, "info %q", info.Digest)
|
||||
return fmt.Errorf("info %q: %w", info.Digest, err)
|
||||
}
|
||||
|
||||
if len(fieldpaths) > 0 {
|
||||
@@ -134,7 +134,7 @@ func (cs *contentStore) Update(ctx context.Context, info content.Info, fieldpath
|
||||
case "labels":
|
||||
updated.Labels = info.Labels
|
||||
default:
|
||||
return errors.Wrapf(errdefs.ErrInvalidArgument, "cannot update %q field on content info %q", path, info.Digest)
|
||||
return fmt.Errorf("cannot update %q field on content info %q: %w", path, info.Digest, errdefs.ErrInvalidArgument)
|
||||
}
|
||||
}
|
||||
} else {
|
||||
@@ -218,7 +218,7 @@ func (cs *contentStore) Delete(ctx context.Context, dgst digest.Digest) error {
|
||||
return update(ctx, cs.db, func(tx *bolt.Tx) error {
|
||||
bkt := getBlobBucket(tx, ns, dgst)
|
||||
if bkt == nil {
|
||||
return errors.Wrapf(errdefs.ErrNotFound, "content digest %v", dgst)
|
||||
return fmt.Errorf("content digest %v: %w", dgst, errdefs.ErrNotFound)
|
||||
}
|
||||
|
||||
if err := getBlobsBucket(tx, ns).DeleteBucket([]byte(dgst.String())); err != nil {
|
||||
@@ -307,7 +307,7 @@ func (cs *contentStore) Status(ctx context.Context, ref string) (content.Status,
|
||||
if err := view(ctx, cs.db, func(tx *bolt.Tx) error {
|
||||
bref = getRef(tx, ns, ref)
|
||||
if bref == "" {
|
||||
return errors.Wrapf(errdefs.ErrNotFound, "reference %v", ref)
|
||||
return fmt.Errorf("reference %v: %w", ref, errdefs.ErrNotFound)
|
||||
}
|
||||
|
||||
return nil
|
||||
@@ -335,15 +335,15 @@ func (cs *contentStore) Abort(ctx context.Context, ref string) error {
|
||||
return update(ctx, cs.db, func(tx *bolt.Tx) error {
|
||||
ibkt := getIngestsBucket(tx, ns)
|
||||
if ibkt == nil {
|
||||
return errors.Wrapf(errdefs.ErrNotFound, "reference %v", ref)
|
||||
return fmt.Errorf("reference %v: %w", ref, errdefs.ErrNotFound)
|
||||
}
|
||||
bkt := ibkt.Bucket([]byte(ref))
|
||||
if bkt == nil {
|
||||
return errors.Wrapf(errdefs.ErrNotFound, "reference %v", ref)
|
||||
return fmt.Errorf("reference %v: %w", ref, errdefs.ErrNotFound)
|
||||
}
|
||||
bref := string(bkt.Get(bucketKeyRef))
|
||||
if bref == "" {
|
||||
return errors.Wrapf(errdefs.ErrNotFound, "reference %v", ref)
|
||||
return fmt.Errorf("reference %v: %w", ref, errdefs.ErrNotFound)
|
||||
}
|
||||
expected := string(bkt.Get(bucketKeyExpected))
|
||||
if err := ibkt.DeleteBucket([]byte(ref)); err != nil {
|
||||
@@ -374,7 +374,7 @@ func (cs *contentStore) Writer(ctx context.Context, opts ...content.WriterOpt) (
|
||||
// TODO(AkihiroSuda): we could create a random string or one calculated based on the context
|
||||
// https://github.com/containerd/containerd/issues/2129#issuecomment-380255019
|
||||
if wOpts.Ref == "" {
|
||||
return nil, errors.Wrap(errdefs.ErrInvalidArgument, "ref must not be empty")
|
||||
return nil, fmt.Errorf("ref must not be empty: %w", errdefs.ErrInvalidArgument)
|
||||
}
|
||||
ns, err := namespaces.NamespaceRequired(ctx)
|
||||
if err != nil {
|
||||
@@ -397,7 +397,7 @@ func (cs *contentStore) Writer(ctx context.Context, opts ...content.WriterOpt) (
|
||||
// Add content to lease to prevent other reference removals
|
||||
// from effecting this object during a provided lease
|
||||
if err := addContentLease(ctx, tx, wOpts.Desc.Digest); err != nil {
|
||||
return errors.Wrap(err, "unable to lease content")
|
||||
return fmt.Errorf("unable to lease content: %w", err)
|
||||
}
|
||||
// Return error outside of transaction to ensure
|
||||
// commit succeeds with the lease.
|
||||
@@ -473,7 +473,7 @@ func (cs *contentStore) Writer(ctx context.Context, opts ...content.WriterOpt) (
|
||||
return nil, err
|
||||
}
|
||||
if exists {
|
||||
return nil, errors.Wrapf(errdefs.ErrAlreadyExists, "content %v", wOpts.Desc.Digest)
|
||||
return nil, fmt.Errorf("content %v: %w", wOpts.Desc.Digest, errdefs.ErrAlreadyExists)
|
||||
}
|
||||
|
||||
return &namespacedWriter{
|
||||
@@ -626,10 +626,10 @@ func (nw *namespacedWriter) commit(ctx context.Context, tx *bolt.Tx, size int64,
|
||||
var actual digest.Digest
|
||||
if nw.w == nil {
|
||||
if size != 0 && size != nw.desc.Size {
|
||||
return "", errors.Wrapf(errdefs.ErrFailedPrecondition, "%q failed size validation: %v != %v", nw.ref, nw.desc.Size, size)
|
||||
return "", fmt.Errorf("%q failed size validation: %v != %v: %w", nw.ref, nw.desc.Size, size, errdefs.ErrFailedPrecondition)
|
||||
}
|
||||
if expected != "" && expected != nw.desc.Digest {
|
||||
return "", errors.Wrapf(errdefs.ErrFailedPrecondition, "%q unexpected digest", nw.ref)
|
||||
return "", fmt.Errorf("%q unexpected digest: %w", nw.ref, errdefs.ErrFailedPrecondition)
|
||||
}
|
||||
size = nw.desc.Size
|
||||
actual = nw.desc.Digest
|
||||
@@ -641,7 +641,7 @@ func (nw *namespacedWriter) commit(ctx context.Context, tx *bolt.Tx, size int64,
|
||||
}
|
||||
if size != 0 && size != status.Offset {
|
||||
nw.w.Close()
|
||||
return "", errors.Wrapf(errdefs.ErrFailedPrecondition, "%q failed size validation: %v != %v", nw.ref, status.Offset, size)
|
||||
return "", fmt.Errorf("%q failed size validation: %v != %v: %w", nw.ref, status.Offset, size, errdefs.ErrFailedPrecondition)
|
||||
}
|
||||
size = status.Offset
|
||||
|
||||
@@ -654,7 +654,7 @@ func (nw *namespacedWriter) commit(ctx context.Context, tx *bolt.Tx, size int64,
|
||||
bkt, err := createBlobBucket(tx, nw.namespace, actual)
|
||||
if err != nil {
|
||||
if err == bolt.ErrBucketExists {
|
||||
return actual, errors.Wrapf(errdefs.ErrAlreadyExists, "content %v", actual)
|
||||
return actual, fmt.Errorf("content %v: %w", actual, errdefs.ErrAlreadyExists)
|
||||
}
|
||||
return "", err
|
||||
}
|
||||
@@ -711,7 +711,7 @@ func (cs *contentStore) checkAccess(ctx context.Context, dgst digest.Digest) err
|
||||
bkt = getShareableBucket(tx, dgst)
|
||||
}
|
||||
if bkt == nil {
|
||||
return errors.Wrapf(errdefs.ErrNotFound, "content digest %v", dgst)
|
||||
return fmt.Errorf("content digest %v: %w", dgst, errdefs.ErrNotFound)
|
||||
}
|
||||
return nil
|
||||
})
|
||||
@@ -720,7 +720,7 @@ func (cs *contentStore) checkAccess(ctx context.Context, dgst digest.Digest) err
|
||||
func validateInfo(info *content.Info) error {
|
||||
for k, v := range info.Labels {
|
||||
if err := labels.Validate(k, v); err != nil {
|
||||
return errors.Wrapf(err, "info.Labels")
|
||||
return fmt.Errorf("info.Labels: %w", err)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -751,7 +751,7 @@ func writeInfo(info *content.Info, bkt *bolt.Bucket) error {
|
||||
}
|
||||
|
||||
if err := boltutil.WriteLabels(bkt, info.Labels); err != nil {
|
||||
return errors.Wrapf(err, "writing labels for info %v", info.Digest)
|
||||
return fmt.Errorf("writing labels for info %v: %w", info.Digest, err)
|
||||
}
|
||||
|
||||
// Write size
|
||||
|
||||
@@ -19,6 +19,7 @@ package metadata
|
||||
import (
|
||||
"bytes"
|
||||
"context"
|
||||
"errors"
|
||||
"fmt"
|
||||
"path/filepath"
|
||||
"sync/atomic"
|
||||
@@ -32,7 +33,6 @@ import (
|
||||
"github.com/containerd/containerd/namespaces"
|
||||
digest "github.com/opencontainers/go-digest"
|
||||
ocispec "github.com/opencontainers/image-spec/specs-go/v1"
|
||||
"github.com/pkg/errors"
|
||||
bolt "go.etcd.io/bbolt"
|
||||
)
|
||||
|
||||
@@ -190,11 +190,11 @@ func checkContentLeased(ctx context.Context, db *DB, dgst digest.Digest) error {
|
||||
return db.View(func(tx *bolt.Tx) error {
|
||||
bkt := getBucket(tx, bucketKeyVersion, []byte(ns), bucketKeyObjectLeases, []byte(lease), bucketKeyObjectContent)
|
||||
if bkt == nil {
|
||||
return errors.Wrapf(errdefs.ErrNotFound, "bucket not found %s", lease)
|
||||
return fmt.Errorf("bucket not found %s: %w", lease, errdefs.ErrNotFound)
|
||||
}
|
||||
v := bkt.Get([]byte(dgst.String()))
|
||||
if v == nil {
|
||||
return errors.Wrap(errdefs.ErrNotFound, "object not leased")
|
||||
return fmt.Errorf("object not leased: %w", errdefs.ErrNotFound)
|
||||
}
|
||||
|
||||
return nil
|
||||
@@ -214,11 +214,11 @@ func checkIngestLeased(ctx context.Context, db *DB, ref string) error {
|
||||
return db.View(func(tx *bolt.Tx) error {
|
||||
bkt := getBucket(tx, bucketKeyVersion, []byte(ns), bucketKeyObjectLeases, []byte(lease), bucketKeyObjectIngests)
|
||||
if bkt == nil {
|
||||
return errors.Wrapf(errdefs.ErrNotFound, "bucket not found %s", lease)
|
||||
return fmt.Errorf("bucket not found %s: %w", lease, errdefs.ErrNotFound)
|
||||
}
|
||||
v := bkt.Get([]byte(ref))
|
||||
if v == nil {
|
||||
return errors.Wrap(errdefs.ErrNotFound, "object not leased")
|
||||
return fmt.Errorf("object not leased: %w", errdefs.ErrNotFound)
|
||||
}
|
||||
|
||||
return nil
|
||||
|
||||
@@ -19,6 +19,8 @@ package metadata
|
||||
import (
|
||||
"context"
|
||||
"encoding/binary"
|
||||
"errors"
|
||||
"fmt"
|
||||
"strings"
|
||||
"sync"
|
||||
"sync/atomic"
|
||||
@@ -28,7 +30,6 @@ import (
|
||||
"github.com/containerd/containerd/gc"
|
||||
"github.com/containerd/containerd/log"
|
||||
"github.com/containerd/containerd/snapshots"
|
||||
"github.com/pkg/errors"
|
||||
bolt "go.etcd.io/bbolt"
|
||||
)
|
||||
|
||||
@@ -181,7 +182,7 @@ func (m *DB) Init(ctx context.Context) error {
|
||||
for _, m := range updates {
|
||||
t0 := time.Now()
|
||||
if err := m.migrate(tx); err != nil {
|
||||
return errors.Wrapf(err, "failed to migrate to %s.%d", m.schema, m.version)
|
||||
return fmt.Errorf("failed to migrate to %s.%d: %w", m.schema, m.version, err)
|
||||
}
|
||||
log.G(ctx).WithField("d", time.Since(t0)).Debugf("finished database migration to %s.%d", m.schema, m.version)
|
||||
}
|
||||
@@ -307,7 +308,7 @@ func (m *DB) GarbageCollect(ctx context.Context) (gc.Stats, error) {
|
||||
}
|
||||
|
||||
if err := scanAll(ctx, tx, rm); err != nil {
|
||||
return errors.Wrap(err, "failed to scan and remove")
|
||||
return fmt.Errorf("failed to scan and remove: %w", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
|
||||
@@ -19,6 +19,7 @@ package metadata
|
||||
import (
|
||||
"context"
|
||||
"encoding/binary"
|
||||
"errors"
|
||||
"fmt"
|
||||
"io"
|
||||
"math/rand"
|
||||
@@ -43,7 +44,6 @@ import (
|
||||
"github.com/gogo/protobuf/types"
|
||||
digest "github.com/opencontainers/go-digest"
|
||||
ocispec "github.com/opencontainers/image-spec/specs-go/v1"
|
||||
"github.com/pkg/errors"
|
||||
bolt "go.etcd.io/bbolt"
|
||||
)
|
||||
|
||||
@@ -208,7 +208,7 @@ func TestMigrations(t *testing.T) {
|
||||
check: func(tx *bolt.Tx) error {
|
||||
bkt := getSnapshotterBucket(tx, "testing", "testing")
|
||||
if bkt == nil {
|
||||
return errors.Wrap(errdefs.ErrNotFound, "snapshots bucket not found")
|
||||
return fmt.Errorf("snapshots bucket not found: %w", errdefs.ErrNotFound)
|
||||
}
|
||||
snapshots := []struct {
|
||||
key string
|
||||
@@ -235,7 +235,7 @@ func TestMigrations(t *testing.T) {
|
||||
for _, s := range snapshots {
|
||||
sbkt := bkt.Bucket([]byte(s.key))
|
||||
if sbkt == nil {
|
||||
return errors.Wrap(errdefs.ErrNotFound, "key does not exist")
|
||||
return fmt.Errorf("key does not exist: %w", errdefs.ErrNotFound)
|
||||
}
|
||||
|
||||
cbkt := sbkt.Bucket(bucketKeyChildren)
|
||||
@@ -245,12 +245,12 @@ func TestMigrations(t *testing.T) {
|
||||
}
|
||||
|
||||
if cn != len(s.children) {
|
||||
return errors.Errorf("unexpected number of children %d, expected %d", cn, len(s.children))
|
||||
return fmt.Errorf("unexpected number of children %d, expected %d", cn, len(s.children))
|
||||
}
|
||||
|
||||
for _, ch := range s.children {
|
||||
if v := cbkt.Get([]byte(ch)); v == nil {
|
||||
return errors.Errorf("missing child record for %s", ch)
|
||||
return fmt.Errorf("missing child record for %s", ch)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -277,18 +277,18 @@ func TestMigrations(t *testing.T) {
|
||||
check: func(tx *bolt.Tx) error {
|
||||
bkt := getIngestsBucket(tx, "testing")
|
||||
if bkt == nil {
|
||||
return errors.Wrap(errdefs.ErrNotFound, "ingests bucket not found")
|
||||
return fmt.Errorf("ingests bucket not found: %w", errdefs.ErrNotFound)
|
||||
}
|
||||
|
||||
for _, s := range testRefs {
|
||||
sbkt := bkt.Bucket([]byte(s.ref))
|
||||
if sbkt == nil {
|
||||
return errors.Wrap(errdefs.ErrNotFound, "ref does not exist")
|
||||
return fmt.Errorf("ref does not exist: %w", errdefs.ErrNotFound)
|
||||
}
|
||||
|
||||
bref := string(sbkt.Get(bucketKeyRef))
|
||||
if bref != s.bref {
|
||||
return errors.Errorf("unexpected reference key %q, expected %q", bref, s.bref)
|
||||
return fmt.Errorf("unexpected reference key %q, expected %q", bref, s.bref)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -345,11 +345,11 @@ func readDBVersion(db *bolt.DB, schema []byte) (int, error) {
|
||||
if err := db.View(func(tx *bolt.Tx) error {
|
||||
bkt := tx.Bucket(schema)
|
||||
if bkt == nil {
|
||||
return errors.Wrap(errdefs.ErrNotFound, "no version bucket")
|
||||
return fmt.Errorf("no version bucket: %w", errdefs.ErrNotFound)
|
||||
}
|
||||
vb := bkt.Get(bucketKeyDBVersion)
|
||||
if vb == nil {
|
||||
return errors.Wrap(errdefs.ErrNotFound, "no version value")
|
||||
return fmt.Errorf("no version value: %w", errdefs.ErrNotFound)
|
||||
}
|
||||
v, _ := binary.Varint(vb)
|
||||
version = int(v)
|
||||
@@ -588,13 +588,13 @@ func create(obj object, tx *bolt.Tx, db *DB, cs content.Store, sn snapshots.Snap
|
||||
content.WithRef("test-ref"),
|
||||
content.WithDescriptor(ocispec.Descriptor{Size: int64(len(v.data)), Digest: expected}))
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "failed to create writer")
|
||||
return nil, fmt.Errorf("failed to create writer: %w", err)
|
||||
}
|
||||
if _, err := w.Write(v.data); err != nil {
|
||||
return nil, errors.Wrap(err, "write blob failed")
|
||||
return nil, fmt.Errorf("write blob failed: %w", err)
|
||||
}
|
||||
if err := w.Commit(ctx, int64(len(v.data)), expected, content.WithLabels(obj.labels)); err != nil {
|
||||
return nil, errors.Wrap(err, "failed to commit blob")
|
||||
return nil, fmt.Errorf("failed to commit blob: %w", err)
|
||||
}
|
||||
if !obj.removed {
|
||||
node = &gc.Node{
|
||||
@@ -635,7 +635,7 @@ func create(obj object, tx *bolt.Tx, db *DB, cs content.Store, sn snapshots.Snap
|
||||
|
||||
_, err := NewImageStore(db).Create(ctx, image)
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "failed to create image")
|
||||
return nil, fmt.Errorf("failed to create image: %w", err)
|
||||
}
|
||||
case testContainer:
|
||||
container := containers.Container{
|
||||
|
||||
@@ -25,7 +25,6 @@ import (
|
||||
|
||||
"github.com/containerd/containerd/gc"
|
||||
"github.com/containerd/containerd/log"
|
||||
"github.com/pkg/errors"
|
||||
bolt "go.etcd.io/bbolt"
|
||||
)
|
||||
|
||||
@@ -290,7 +289,7 @@ func references(ctx context.Context, tx *bolt.Tx, node gc.Node, fn func(gc.Node)
|
||||
case ResourceSnapshot, resourceSnapshotFlat:
|
||||
parts := strings.SplitN(node.Key, "/", 2)
|
||||
if len(parts) != 2 {
|
||||
return errors.Errorf("invalid snapshot gc key %s", node.Key)
|
||||
return fmt.Errorf("invalid snapshot gc key %s", node.Key)
|
||||
}
|
||||
ss := parts[0]
|
||||
name := parts[1]
|
||||
@@ -435,7 +434,7 @@ func remove(ctx context.Context, tx *bolt.Tx, node gc.Node) error {
|
||||
if sbkt != nil {
|
||||
parts := strings.SplitN(node.Key, "/", 2)
|
||||
if len(parts) != 2 {
|
||||
return errors.Errorf("invalid snapshot gc key %s", node.Key)
|
||||
return fmt.Errorf("invalid snapshot gc key %s", node.Key)
|
||||
}
|
||||
ssbkt := sbkt.Bucket([]byte(parts[0]))
|
||||
if ssbkt != nil {
|
||||
|
||||
@@ -19,6 +19,7 @@ package metadata
|
||||
import (
|
||||
"context"
|
||||
"encoding/binary"
|
||||
"errors"
|
||||
"fmt"
|
||||
"strings"
|
||||
"sync/atomic"
|
||||
@@ -32,7 +33,6 @@ import (
|
||||
"github.com/containerd/containerd/namespaces"
|
||||
digest "github.com/opencontainers/go-digest"
|
||||
ocispec "github.com/opencontainers/image-spec/specs-go/v1"
|
||||
"github.com/pkg/errors"
|
||||
bolt "go.etcd.io/bbolt"
|
||||
)
|
||||
|
||||
@@ -78,17 +78,17 @@ func (s *imageStore) Get(ctx context.Context, name string) (images.Image, error)
|
||||
}
|
||||
}
|
||||
if bkt == nil {
|
||||
return errors.Wrapf(errdefs.ErrNotFound, "image %q", name)
|
||||
return fmt.Errorf("image %q: %w", name, errdefs.ErrNotFound)
|
||||
}
|
||||
|
||||
ibkt := bkt.Bucket([]byte(name))
|
||||
if ibkt == nil {
|
||||
return errors.Wrapf(errdefs.ErrNotFound, "image %q", name)
|
||||
return fmt.Errorf("image %q: %w", name, errdefs.ErrNotFound)
|
||||
}
|
||||
|
||||
image.Name = name
|
||||
if err := readImage(&image, ibkt); err != nil {
|
||||
return errors.Wrapf(err, "image %q", name)
|
||||
return fmt.Errorf("image %q: %w", name, err)
|
||||
}
|
||||
|
||||
return nil
|
||||
@@ -107,7 +107,7 @@ func (s *imageStore) List(ctx context.Context, fs ...string) ([]images.Image, er
|
||||
|
||||
filter, err := filters.ParseAll(fs...)
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(errdefs.ErrInvalidArgument, err.Error())
|
||||
return nil, fmt.Errorf("%s: %w", err.Error(), errdefs.ErrInvalidArgument)
|
||||
}
|
||||
|
||||
var m []images.Image
|
||||
@@ -163,7 +163,7 @@ func (s *imageStore) Create(ctx context.Context, image images.Image) (images.Ima
|
||||
return err
|
||||
}
|
||||
|
||||
return errors.Wrapf(errdefs.ErrAlreadyExists, "image %q", image.Name)
|
||||
return fmt.Errorf("image %q: %w", image.Name, errdefs.ErrAlreadyExists)
|
||||
}
|
||||
|
||||
image.CreatedAt = time.Now().UTC()
|
||||
@@ -183,7 +183,7 @@ func (s *imageStore) Update(ctx context.Context, image images.Image, fieldpaths
|
||||
}
|
||||
|
||||
if image.Name == "" {
|
||||
return images.Image{}, errors.Wrapf(errdefs.ErrInvalidArgument, "image name is required for update")
|
||||
return images.Image{}, fmt.Errorf("image name is required for update: %w", errdefs.ErrInvalidArgument)
|
||||
}
|
||||
|
||||
var updated images.Image
|
||||
@@ -196,11 +196,11 @@ func (s *imageStore) Update(ctx context.Context, image images.Image, fieldpaths
|
||||
|
||||
ibkt := bkt.Bucket([]byte(image.Name))
|
||||
if ibkt == nil {
|
||||
return errors.Wrapf(errdefs.ErrNotFound, "image %q", image.Name)
|
||||
return fmt.Errorf("image %q: %w", image.Name, errdefs.ErrNotFound)
|
||||
}
|
||||
|
||||
if err := readImage(&updated, ibkt); err != nil {
|
||||
return errors.Wrapf(err, "image %q", image.Name)
|
||||
return fmt.Errorf("image %q: %w", image.Name, err)
|
||||
}
|
||||
createdat := updated.CreatedAt
|
||||
updated.Name = image.Name
|
||||
@@ -238,7 +238,7 @@ func (s *imageStore) Update(ctx context.Context, image images.Image, fieldpaths
|
||||
case "annotations":
|
||||
updated.Target.Annotations = image.Target.Annotations
|
||||
default:
|
||||
return errors.Wrapf(errdefs.ErrInvalidArgument, "cannot update %q field on image %q", path, image.Name)
|
||||
return fmt.Errorf("cannot update %q field on image %q: %w", path, image.Name, errdefs.ErrInvalidArgument)
|
||||
}
|
||||
}
|
||||
} else {
|
||||
@@ -269,12 +269,12 @@ func (s *imageStore) Delete(ctx context.Context, name string, opts ...images.Del
|
||||
return update(ctx, s.db, func(tx *bolt.Tx) error {
|
||||
bkt := getImagesBucket(tx, namespace)
|
||||
if bkt == nil {
|
||||
return errors.Wrapf(errdefs.ErrNotFound, "image %q", name)
|
||||
return fmt.Errorf("image %q: %w", name, errdefs.ErrNotFound)
|
||||
}
|
||||
|
||||
if err = bkt.DeleteBucket([]byte(name)); err != nil {
|
||||
if err == bolt.ErrBucketNotFound {
|
||||
err = errors.Wrapf(errdefs.ErrNotFound, "image %q", name)
|
||||
err = fmt.Errorf("image %q: %w", name, errdefs.ErrNotFound)
|
||||
}
|
||||
return err
|
||||
}
|
||||
@@ -287,12 +287,12 @@ func (s *imageStore) Delete(ctx context.Context, name string, opts ...images.Del
|
||||
|
||||
func validateImage(image *images.Image) error {
|
||||
if image.Name == "" {
|
||||
return errors.Wrapf(errdefs.ErrInvalidArgument, "image name must not be empty")
|
||||
return fmt.Errorf("image name must not be empty: %w", errdefs.ErrInvalidArgument)
|
||||
}
|
||||
|
||||
for k, v := range image.Labels {
|
||||
if err := labels.Validate(k, v); err != nil {
|
||||
return errors.Wrapf(err, "image.Labels")
|
||||
return fmt.Errorf("image.Labels: %w", err)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -303,15 +303,15 @@ func validateTarget(target *ocispec.Descriptor) error {
|
||||
// NOTE(stevvooe): Only validate fields we actually store.
|
||||
|
||||
if err := target.Digest.Validate(); err != nil {
|
||||
return errors.Wrapf(errdefs.ErrInvalidArgument, "Target.Digest %q invalid: %v", target.Digest, err)
|
||||
return fmt.Errorf("Target.Digest %q invalid: %v: %w", target.Digest, err, errdefs.ErrInvalidArgument)
|
||||
}
|
||||
|
||||
if target.Size <= 0 {
|
||||
return errors.Wrapf(errdefs.ErrInvalidArgument, "Target.Size must be greater than zero")
|
||||
return fmt.Errorf("Target.Size must be greater than zero: %w", errdefs.ErrInvalidArgument)
|
||||
}
|
||||
|
||||
if target.MediaType == "" {
|
||||
return errors.Wrapf(errdefs.ErrInvalidArgument, "Target.MediaType must be set")
|
||||
return fmt.Errorf("Target.MediaType must be set: %w", errdefs.ErrInvalidArgument)
|
||||
}
|
||||
|
||||
return nil
|
||||
@@ -363,11 +363,11 @@ func writeImage(bkt *bolt.Bucket, image *images.Image) error {
|
||||
}
|
||||
|
||||
if err := boltutil.WriteLabels(bkt, image.Labels); err != nil {
|
||||
return errors.Wrapf(err, "writing labels for image %v", image.Name)
|
||||
return fmt.Errorf("writing labels for image %v: %w", image.Name, err)
|
||||
}
|
||||
|
||||
if err := boltutil.WriteAnnotations(bkt, image.Target.Annotations); err != nil {
|
||||
return errors.Wrapf(err, "writing Annotations for image %v", image.Name)
|
||||
return fmt.Errorf("writing Annotations for image %v: %w", image.Name, err)
|
||||
}
|
||||
|
||||
// write the target bucket
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
package metadata
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"reflect"
|
||||
"testing"
|
||||
@@ -27,7 +28,6 @@ import (
|
||||
"github.com/containerd/containerd/images"
|
||||
digest "github.com/opencontainers/go-digest"
|
||||
ocispec "github.com/opencontainers/image-spec/specs-go/v1"
|
||||
"github.com/pkg/errors"
|
||||
)
|
||||
|
||||
func TestImagesList(t *testing.T) {
|
||||
@@ -500,7 +500,7 @@ func TestImagesCreateUpdateDelete(t *testing.T) {
|
||||
if testcase.createerr == nil {
|
||||
t.Fatalf("unexpected error: %v", err)
|
||||
} else {
|
||||
t.Fatalf("cause of %v (cause: %v) != %v", err, errors.Cause(err), testcase.createerr)
|
||||
t.Fatalf("cause of %v (cause: %v) != %v", err, errors.Unwrap(err), testcase.createerr)
|
||||
}
|
||||
} else if testcase.createerr != nil {
|
||||
return
|
||||
@@ -522,7 +522,7 @@ func TestImagesCreateUpdateDelete(t *testing.T) {
|
||||
if testcase.cause == nil {
|
||||
t.Fatalf("unexpected error: %v", err)
|
||||
} else {
|
||||
t.Fatalf("cause of %v (cause: %v) != %v", err, errors.Cause(err), testcase.cause)
|
||||
t.Fatalf("cause of %v (cause: %v) != %v", err, errors.Unwrap(err), testcase.cause)
|
||||
}
|
||||
} else if testcase.cause != nil {
|
||||
return
|
||||
|
||||
@@ -18,6 +18,7 @@ package metadata
|
||||
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
"fmt"
|
||||
"strings"
|
||||
"sync/atomic"
|
||||
@@ -29,7 +30,6 @@ import (
|
||||
"github.com/containerd/containerd/metadata/boltutil"
|
||||
"github.com/containerd/containerd/namespaces"
|
||||
digest "github.com/opencontainers/go-digest"
|
||||
"github.com/pkg/errors"
|
||||
bolt "go.etcd.io/bbolt"
|
||||
)
|
||||
|
||||
@@ -75,7 +75,7 @@ func (lm *leaseManager) Create(ctx context.Context, opts ...leases.Opt) (leases.
|
||||
if err == bolt.ErrBucketExists {
|
||||
err = errdefs.ErrAlreadyExists
|
||||
}
|
||||
return errors.Wrapf(err, "lease %q", l.ID)
|
||||
return fmt.Errorf("lease %q: %w", l.ID, err)
|
||||
}
|
||||
|
||||
t := time.Now().UTC()
|
||||
@@ -111,11 +111,11 @@ func (lm *leaseManager) Delete(ctx context.Context, lease leases.Lease, _ ...lea
|
||||
return update(ctx, lm.db, func(tx *bolt.Tx) error {
|
||||
topbkt := getBucket(tx, bucketKeyVersion, []byte(namespace), bucketKeyObjectLeases)
|
||||
if topbkt == nil {
|
||||
return errors.Wrapf(errdefs.ErrNotFound, "lease %q", lease.ID)
|
||||
return fmt.Errorf("lease %q: %w", lease.ID, errdefs.ErrNotFound)
|
||||
}
|
||||
if err := topbkt.DeleteBucket([]byte(lease.ID)); err != nil {
|
||||
if err == bolt.ErrBucketNotFound {
|
||||
err = errors.Wrapf(errdefs.ErrNotFound, "lease %q", lease.ID)
|
||||
err = fmt.Errorf("lease %q: %w", lease.ID, errdefs.ErrNotFound)
|
||||
}
|
||||
return err
|
||||
}
|
||||
@@ -135,7 +135,7 @@ func (lm *leaseManager) List(ctx context.Context, fs ...string) ([]leases.Lease,
|
||||
|
||||
filter, err := filters.ParseAll(fs...)
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(errdefs.ErrInvalidArgument, err.Error())
|
||||
return nil, fmt.Errorf("%s: %w", err.Error(), errdefs.ErrInvalidArgument)
|
||||
}
|
||||
|
||||
var ll []leases.Lease
|
||||
@@ -192,7 +192,7 @@ func (lm *leaseManager) AddResource(ctx context.Context, lease leases.Lease, r l
|
||||
return update(ctx, lm.db, func(tx *bolt.Tx) error {
|
||||
topbkt := getBucket(tx, bucketKeyVersion, []byte(namespace), bucketKeyObjectLeases, []byte(lease.ID))
|
||||
if topbkt == nil {
|
||||
return errors.Wrapf(errdefs.ErrNotFound, "lease %q", lease.ID)
|
||||
return fmt.Errorf("lease %q: %w", lease.ID, errdefs.ErrNotFound)
|
||||
}
|
||||
|
||||
keys, ref, err := parseLeaseResource(r)
|
||||
@@ -221,7 +221,7 @@ func (lm *leaseManager) DeleteResource(ctx context.Context, lease leases.Lease,
|
||||
return update(ctx, lm.db, func(tx *bolt.Tx) error {
|
||||
topbkt := getBucket(tx, bucketKeyVersion, []byte(namespace), bucketKeyObjectLeases, []byte(lease.ID))
|
||||
if topbkt == nil {
|
||||
return errors.Wrapf(errdefs.ErrNotFound, "lease %q", lease.ID)
|
||||
return fmt.Errorf("lease %q: %w", lease.ID, errdefs.ErrNotFound)
|
||||
}
|
||||
|
||||
keys, ref, err := parseLeaseResource(r)
|
||||
@@ -262,7 +262,7 @@ func (lm *leaseManager) ListResources(ctx context.Context, lease leases.Lease) (
|
||||
|
||||
topbkt := getBucket(tx, bucketKeyVersion, []byte(namespace), bucketKeyObjectLeases, []byte(lease.ID))
|
||||
if topbkt == nil {
|
||||
return errors.Wrapf(errdefs.ErrNotFound, "lease %q", lease.ID)
|
||||
return fmt.Errorf("lease %q: %w", lease.ID, errdefs.ErrNotFound)
|
||||
}
|
||||
|
||||
// content resources
|
||||
@@ -333,7 +333,7 @@ func addSnapshotLease(ctx context.Context, tx *bolt.Tx, snapshotter, key string)
|
||||
|
||||
bkt := getBucket(tx, bucketKeyVersion, []byte(namespace), bucketKeyObjectLeases, []byte(lid))
|
||||
if bkt == nil {
|
||||
return errors.Wrap(errdefs.ErrNotFound, "lease does not exist")
|
||||
return fmt.Errorf("lease does not exist: %w", errdefs.ErrNotFound)
|
||||
}
|
||||
|
||||
bkt, err := bkt.CreateBucketIfNotExists(bucketKeyObjectSnapshots)
|
||||
@@ -382,7 +382,7 @@ func addContentLease(ctx context.Context, tx *bolt.Tx, dgst digest.Digest) error
|
||||
|
||||
bkt := getBucket(tx, bucketKeyVersion, []byte(namespace), bucketKeyObjectLeases, []byte(lid))
|
||||
if bkt == nil {
|
||||
return errors.Wrap(errdefs.ErrNotFound, "lease does not exist")
|
||||
return fmt.Errorf("lease does not exist: %w", errdefs.ErrNotFound)
|
||||
}
|
||||
|
||||
bkt, err := bkt.CreateBucketIfNotExists(bucketKeyObjectContent)
|
||||
@@ -426,7 +426,7 @@ func addIngestLease(ctx context.Context, tx *bolt.Tx, ref string) (bool, error)
|
||||
|
||||
bkt := getBucket(tx, bucketKeyVersion, []byte(namespace), bucketKeyObjectLeases, []byte(lid))
|
||||
if bkt == nil {
|
||||
return false, errors.Wrap(errdefs.ErrNotFound, "lease does not exist")
|
||||
return false, fmt.Errorf("lease does not exist: %w", errdefs.ErrNotFound)
|
||||
}
|
||||
|
||||
bkt, err := bkt.CreateBucketIfNotExists(bucketKeyObjectIngests)
|
||||
@@ -473,22 +473,22 @@ func parseLeaseResource(r leases.Resource) ([]string, string, error) {
|
||||
string(bucketKeyObjectIngests):
|
||||
|
||||
if len(keys) != 1 {
|
||||
return nil, "", errors.Wrapf(errdefs.ErrInvalidArgument, "invalid resource type %s", typ)
|
||||
return nil, "", fmt.Errorf("invalid resource type %s: %w", typ, errdefs.ErrInvalidArgument)
|
||||
}
|
||||
|
||||
if k == string(bucketKeyObjectContent) {
|
||||
dgst, err := digest.Parse(ref)
|
||||
if err != nil {
|
||||
return nil, "", errors.Wrapf(errdefs.ErrInvalidArgument, "invalid content resource id %s: %v", ref, err)
|
||||
return nil, "", fmt.Errorf("invalid content resource id %s: %v: %w", ref, err, errdefs.ErrInvalidArgument)
|
||||
}
|
||||
ref = dgst.String()
|
||||
}
|
||||
case string(bucketKeyObjectSnapshots):
|
||||
if len(keys) != 2 {
|
||||
return nil, "", errors.Wrapf(errdefs.ErrInvalidArgument, "invalid snapshot resource type %s", typ)
|
||||
return nil, "", fmt.Errorf("invalid snapshot resource type %s: %w", typ, errdefs.ErrInvalidArgument)
|
||||
}
|
||||
default:
|
||||
return nil, "", errors.Wrapf(errdefs.ErrNotImplemented, "resource type %s not supported yet", typ)
|
||||
return nil, "", fmt.Errorf("resource type %s not supported yet: %w", typ, errdefs.ErrNotImplemented)
|
||||
}
|
||||
|
||||
return keys, ref, nil
|
||||
|
||||
@@ -18,11 +18,12 @@ package metadata
|
||||
|
||||
import (
|
||||
_ "crypto/sha256"
|
||||
"errors"
|
||||
"fmt"
|
||||
"testing"
|
||||
|
||||
"github.com/containerd/containerd/errdefs"
|
||||
"github.com/containerd/containerd/leases"
|
||||
"github.com/pkg/errors"
|
||||
bolt "go.etcd.io/bbolt"
|
||||
)
|
||||
|
||||
@@ -365,7 +366,7 @@ func TestLeaseResource(t *testing.T) {
|
||||
if err := db.Update(func(tx *bolt.Tx) error {
|
||||
err0 := lm.AddResource(WithTransactionContext(ctx, tx), tc.lease, tc.resource)
|
||||
if !errors.Is(err0, tc.err) {
|
||||
return errors.Errorf("expect error (%v), but got (%v)", tc.err, err0)
|
||||
return fmt.Errorf("expect error (%v), but got (%v)", tc.err, err0)
|
||||
}
|
||||
|
||||
if err0 == nil {
|
||||
|
||||
@@ -25,7 +25,6 @@ import (
|
||||
"github.com/containerd/containerd/identifiers"
|
||||
l "github.com/containerd/containerd/labels"
|
||||
"github.com/containerd/containerd/namespaces"
|
||||
"github.com/pkg/errors"
|
||||
bolt "go.etcd.io/bbolt"
|
||||
)
|
||||
|
||||
@@ -50,7 +49,7 @@ func (s *namespaceStore) Create(ctx context.Context, namespace string, labels ma
|
||||
|
||||
for k, v := range labels {
|
||||
if err := l.Validate(k, v); err != nil {
|
||||
return errors.Wrapf(err, "namespace.Labels")
|
||||
return fmt.Errorf("namespace.Labels: %w", err)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -58,7 +57,7 @@ func (s *namespaceStore) Create(ctx context.Context, namespace string, labels ma
|
||||
bkt, err := topbkt.CreateBucket([]byte(namespace))
|
||||
if err != nil {
|
||||
if err == bolt.ErrBucketExists {
|
||||
return errors.Wrapf(errdefs.ErrAlreadyExists, "namespace %q", namespace)
|
||||
return fmt.Errorf("namespace %q: %w", namespace, errdefs.ErrAlreadyExists)
|
||||
}
|
||||
|
||||
return err
|
||||
@@ -98,7 +97,7 @@ func (s *namespaceStore) Labels(ctx context.Context, namespace string) (map[stri
|
||||
|
||||
func (s *namespaceStore) SetLabel(ctx context.Context, namespace, key, value string) error {
|
||||
if err := l.Validate(key, value); err != nil {
|
||||
return errors.Wrapf(err, "namespace.Labels")
|
||||
return fmt.Errorf("namespace.Labels: %w", err)
|
||||
}
|
||||
|
||||
return withNamespacesLabelsBucket(s.tx, namespace, func(bkt *bolt.Bucket) error {
|
||||
@@ -148,16 +147,16 @@ func (s *namespaceStore) Delete(ctx context.Context, namespace string, opts ...n
|
||||
}
|
||||
|
||||
if len(types) > 0 {
|
||||
return errors.Wrapf(
|
||||
errdefs.ErrFailedPrecondition,
|
||||
"namespace %q must be empty, but it still has %s",
|
||||
return fmt.Errorf(
|
||||
"namespace %q must be empty, but it still has %s: %w",
|
||||
namespace, strings.Join(types, ", "),
|
||||
errdefs.ErrFailedPrecondition,
|
||||
)
|
||||
}
|
||||
|
||||
if err := bkt.DeleteBucket([]byte(namespace)); err != nil {
|
||||
if err == bolt.ErrBucketNotFound {
|
||||
return errors.Wrapf(errdefs.ErrNotFound, "namespace %q", namespace)
|
||||
return fmt.Errorf("namespace %q: %w", namespace, errdefs.ErrNotFound)
|
||||
}
|
||||
|
||||
return err
|
||||
|
||||
@@ -32,7 +32,6 @@ import (
|
||||
"github.com/containerd/containerd/mount"
|
||||
"github.com/containerd/containerd/namespaces"
|
||||
"github.com/containerd/containerd/snapshots"
|
||||
"github.com/pkg/errors"
|
||||
bolt "go.etcd.io/bbolt"
|
||||
)
|
||||
|
||||
@@ -88,7 +87,7 @@ func (s *snapshotter) resolveKey(ctx context.Context, key string) (string, error
|
||||
if err := view(ctx, s.db, func(tx *bolt.Tx) error {
|
||||
id = getKey(tx, ns, s.name, key)
|
||||
if id == "" {
|
||||
return errors.Wrapf(errdefs.ErrNotFound, "snapshot %v does not exist", key)
|
||||
return fmt.Errorf("snapshot %v does not exist: %w", key, errdefs.ErrNotFound)
|
||||
}
|
||||
return nil
|
||||
}); err != nil {
|
||||
@@ -113,18 +112,18 @@ func (s *snapshotter) Stat(ctx context.Context, key string) (snapshots.Info, err
|
||||
if err := view(ctx, s.db, func(tx *bolt.Tx) error {
|
||||
bkt := getSnapshotterBucket(tx, ns, s.name)
|
||||
if bkt == nil {
|
||||
return errors.Wrapf(errdefs.ErrNotFound, "snapshot %v does not exist", key)
|
||||
return fmt.Errorf("snapshot %v does not exist: %w", key, errdefs.ErrNotFound)
|
||||
}
|
||||
sbkt := bkt.Bucket([]byte(key))
|
||||
if sbkt == nil {
|
||||
return errors.Wrapf(errdefs.ErrNotFound, "snapshot %v does not exist", key)
|
||||
return fmt.Errorf("snapshot %v does not exist: %w", key, errdefs.ErrNotFound)
|
||||
}
|
||||
local.Labels, err = boltutil.ReadLabels(sbkt)
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "failed to read labels")
|
||||
return fmt.Errorf("failed to read labels: %w", err)
|
||||
}
|
||||
if err := boltutil.ReadTimestamps(sbkt, &local.Created, &local.Updated); err != nil {
|
||||
return errors.Wrap(err, "failed to read timestamps")
|
||||
return fmt.Errorf("failed to read timestamps: %w", err)
|
||||
}
|
||||
bkey = string(sbkt.Get(bucketKeyName))
|
||||
local.Parent = string(sbkt.Get(bucketKeyParent))
|
||||
@@ -152,7 +151,7 @@ func (s *snapshotter) Update(ctx context.Context, info snapshots.Info, fieldpath
|
||||
}
|
||||
|
||||
if info.Name == "" {
|
||||
return snapshots.Info{}, errors.Wrap(errdefs.ErrInvalidArgument, "")
|
||||
return snapshots.Info{}, errdefs.ErrInvalidArgument
|
||||
}
|
||||
|
||||
var (
|
||||
@@ -165,19 +164,19 @@ func (s *snapshotter) Update(ctx context.Context, info snapshots.Info, fieldpath
|
||||
if err := update(ctx, s.db, func(tx *bolt.Tx) error {
|
||||
bkt := getSnapshotterBucket(tx, ns, s.name)
|
||||
if bkt == nil {
|
||||
return errors.Wrapf(errdefs.ErrNotFound, "snapshot %v does not exist", info.Name)
|
||||
return fmt.Errorf("snapshot %v does not exist: %w", info.Name, errdefs.ErrNotFound)
|
||||
}
|
||||
sbkt := bkt.Bucket([]byte(info.Name))
|
||||
if sbkt == nil {
|
||||
return errors.Wrapf(errdefs.ErrNotFound, "snapshot %v does not exist", info.Name)
|
||||
return fmt.Errorf("snapshot %v does not exist: %w", info.Name, errdefs.ErrNotFound)
|
||||
}
|
||||
|
||||
local.Labels, err = boltutil.ReadLabels(sbkt)
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "failed to read labels")
|
||||
return fmt.Errorf("failed to read labels: %w", err)
|
||||
}
|
||||
if err := boltutil.ReadTimestamps(sbkt, &local.Created, &local.Updated); err != nil {
|
||||
return errors.Wrap(err, "failed to read timestamps")
|
||||
return fmt.Errorf("failed to read timestamps: %w", err)
|
||||
}
|
||||
|
||||
// Handle field updates
|
||||
@@ -197,7 +196,7 @@ func (s *snapshotter) Update(ctx context.Context, info snapshots.Info, fieldpath
|
||||
case "labels":
|
||||
local.Labels = info.Labels
|
||||
default:
|
||||
return errors.Wrapf(errdefs.ErrInvalidArgument, "cannot update %q field on snapshot %q", path, info.Name)
|
||||
return fmt.Errorf("cannot update %q field on snapshot %q: %w", path, info.Name, errdefs.ErrInvalidArgument)
|
||||
}
|
||||
}
|
||||
} else {
|
||||
@@ -209,10 +208,10 @@ func (s *snapshotter) Update(ctx context.Context, info snapshots.Info, fieldpath
|
||||
local.Updated = time.Now().UTC()
|
||||
|
||||
if err := boltutil.WriteTimestamps(sbkt, local.Created, local.Updated); err != nil {
|
||||
return errors.Wrap(err, "failed to read timestamps")
|
||||
return fmt.Errorf("failed to read timestamps: %w", err)
|
||||
}
|
||||
if err := boltutil.WriteLabels(sbkt, local.Labels); err != nil {
|
||||
return errors.Wrap(err, "failed to read labels")
|
||||
return fmt.Errorf("failed to read labels: %w", err)
|
||||
}
|
||||
bkey = string(sbkt.Get(bucketKeyName))
|
||||
local.Parent = string(sbkt.Get(bucketKeyParent))
|
||||
@@ -319,18 +318,18 @@ func (s *snapshotter) createSnapshot(ctx context.Context, key, parent string, re
|
||||
// Check if target exists, if so, return already exists
|
||||
if target != "" {
|
||||
if tbkt := bkt.Bucket([]byte(target)); tbkt != nil {
|
||||
return errors.Wrapf(errdefs.ErrAlreadyExists, "target snapshot %q", target)
|
||||
return fmt.Errorf("target snapshot %q: %w", target, errdefs.ErrAlreadyExists)
|
||||
}
|
||||
}
|
||||
|
||||
if bbkt := bkt.Bucket([]byte(key)); bbkt != nil {
|
||||
return errors.Wrapf(errdefs.ErrAlreadyExists, "snapshot %q", key)
|
||||
return fmt.Errorf("snapshot %q: %w", key, errdefs.ErrAlreadyExists)
|
||||
}
|
||||
|
||||
if parent != "" {
|
||||
pbkt := bkt.Bucket([]byte(parent))
|
||||
if pbkt == nil {
|
||||
return errors.Wrapf(errdefs.ErrNotFound, "parent snapshot %v does not exist", parent)
|
||||
return fmt.Errorf("parent snapshot %v does not exist: %w", parent, errdefs.ErrNotFound)
|
||||
}
|
||||
bparent = string(pbkt.Get(bucketKeyName))
|
||||
}
|
||||
@@ -378,11 +377,11 @@ func (s *snapshotter) createSnapshot(ctx context.Context, key, parent string, re
|
||||
return nil
|
||||
|
||||
}, filter); err != nil {
|
||||
return nil, errors.Wrap(err, "failed walking backend snapshots")
|
||||
return nil, fmt.Errorf("failed walking backend snapshots: %w", err)
|
||||
}
|
||||
|
||||
if tinfo == nil {
|
||||
return nil, errors.Wrapf(errdefs.ErrNotFound, "target snapshot %q in backend", target)
|
||||
return nil, fmt.Errorf("target snapshot %q in backend: %w", target, errdefs.ErrNotFound)
|
||||
}
|
||||
|
||||
key = target
|
||||
@@ -401,12 +400,12 @@ func (s *snapshotter) createSnapshot(ctx context.Context, key, parent string, re
|
||||
}
|
||||
|
||||
// Propagate this error after the final update
|
||||
rerr = errors.Wrapf(errdefs.ErrAlreadyExists, "target snapshot %q from snapshotter", target)
|
||||
rerr = fmt.Errorf("target snapshot %q from snapshotter: %w", target, errdefs.ErrAlreadyExists)
|
||||
} else {
|
||||
// This condition is unexpected as the key provided is expected
|
||||
// to be new and unique, return as unknown response from backend
|
||||
// to avoid confusing callers handling already exists.
|
||||
return nil, errors.Wrapf(errdefs.ErrUnknown, "unexpected error from snapshotter: %v", err)
|
||||
return nil, fmt.Errorf("unexpected error from snapshotter: %v: %w", err, errdefs.ErrUnknown)
|
||||
}
|
||||
} else if err != nil {
|
||||
return nil, err
|
||||
@@ -420,7 +419,7 @@ func (s *snapshotter) createSnapshot(ctx context.Context, key, parent string, re
|
||||
if txerr := update(ctx, s.db, func(tx *bolt.Tx) error {
|
||||
bkt := getSnapshotterBucket(tx, ns, s.name)
|
||||
if bkt == nil {
|
||||
return errors.Wrapf(errdefs.ErrNotFound, "can not find snapshotter %q", s.name)
|
||||
return fmt.Errorf("can not find snapshotter %q: %w", s.name, errdefs.ErrNotFound)
|
||||
}
|
||||
|
||||
if err := addSnapshotLease(ctx, tx, s.name, key); err != nil {
|
||||
@@ -433,7 +432,7 @@ func (s *snapshotter) createSnapshot(ctx context.Context, key, parent string, re
|
||||
return err
|
||||
}
|
||||
if rerr == nil {
|
||||
rerr = errors.Wrapf(errdefs.ErrAlreadyExists, "snapshot %q", key)
|
||||
rerr = fmt.Errorf("snapshot %q: %w", key, errdefs.ErrAlreadyExists)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
@@ -441,7 +440,7 @@ func (s *snapshotter) createSnapshot(ctx context.Context, key, parent string, re
|
||||
if parent != "" {
|
||||
pbkt := bkt.Bucket([]byte(parent))
|
||||
if pbkt == nil {
|
||||
return errors.Wrapf(errdefs.ErrNotFound, "parent snapshot %v does not exist", parent)
|
||||
return fmt.Errorf("parent snapshot %v does not exist: %w", parent, errdefs.ErrNotFound)
|
||||
}
|
||||
|
||||
// Ensure the backend's parent matches the metadata store's parent
|
||||
@@ -451,7 +450,7 @@ func (s *snapshotter) createSnapshot(ctx context.Context, key, parent string, re
|
||||
// uniqueness of the reference relationships, the metadata store
|
||||
// can only error out to prevent inconsistent data.
|
||||
if bparent != string(pbkt.Get(bucketKeyName)) {
|
||||
return errors.Wrapf(errdefs.ErrInvalidArgument, "mismatched parent %s from target %s", parent, target)
|
||||
return fmt.Errorf("mismatched parent %s from target %s: %w", parent, target, errdefs.ErrInvalidArgument)
|
||||
}
|
||||
|
||||
cbkt, err := pbkt.CreateBucketIfNotExists(bucketKeyChildren)
|
||||
@@ -516,14 +515,14 @@ func (s *snapshotter) Commit(ctx context.Context, name, key string, opts ...snap
|
||||
if err := update(ctx, s.db, func(tx *bolt.Tx) error {
|
||||
bkt := getSnapshotterBucket(tx, ns, s.name)
|
||||
if bkt == nil {
|
||||
return errors.Wrapf(errdefs.ErrNotFound,
|
||||
"can not find snapshotter %q", s.name)
|
||||
return fmt.Errorf("can not find snapshotter %q: %w",
|
||||
s.name, errdefs.ErrNotFound)
|
||||
}
|
||||
|
||||
bbkt, err := bkt.CreateBucket([]byte(name))
|
||||
if err != nil {
|
||||
if err == bolt.ErrBucketExists {
|
||||
err = errors.Wrapf(errdefs.ErrAlreadyExists, "snapshot %q", name)
|
||||
err = fmt.Errorf("snapshot %q: %w", name, errdefs.ErrAlreadyExists)
|
||||
}
|
||||
return err
|
||||
}
|
||||
@@ -533,7 +532,7 @@ func (s *snapshotter) Commit(ctx context.Context, name, key string, opts ...snap
|
||||
|
||||
obkt := bkt.Bucket([]byte(key))
|
||||
if obkt == nil {
|
||||
return errors.Wrapf(errdefs.ErrNotFound, "snapshot %v does not exist", key)
|
||||
return fmt.Errorf("snapshot %v does not exist: %w", key, errdefs.ErrNotFound)
|
||||
}
|
||||
|
||||
bkey := string(obkt.Get(bucketKeyName))
|
||||
@@ -553,7 +552,7 @@ func (s *snapshotter) Commit(ctx context.Context, name, key string, opts ...snap
|
||||
if len(parent) > 0 {
|
||||
pbkt := bkt.Bucket(parent)
|
||||
if pbkt == nil {
|
||||
return errors.Wrapf(errdefs.ErrNotFound, "parent snapshot %v does not exist", string(parent))
|
||||
return fmt.Errorf("parent snapshot %v does not exist: %w", string(parent), errdefs.ErrNotFound)
|
||||
}
|
||||
|
||||
cbkt, err := pbkt.CreateBucketIfNotExists(bucketKeyChildren)
|
||||
@@ -639,13 +638,13 @@ func (s *snapshotter) Remove(ctx context.Context, key string) error {
|
||||
sbkt = bkt.Bucket([]byte(key))
|
||||
}
|
||||
if sbkt == nil {
|
||||
return errors.Wrapf(errdefs.ErrNotFound, "snapshot %v does not exist", key)
|
||||
return fmt.Errorf("snapshot %v does not exist: %w", key, errdefs.ErrNotFound)
|
||||
}
|
||||
|
||||
cbkt := sbkt.Bucket(bucketKeyChildren)
|
||||
if cbkt != nil {
|
||||
if child, _ := cbkt.Cursor().First(); child != nil {
|
||||
return errors.Wrap(errdefs.ErrFailedPrecondition, "cannot remove snapshot with child")
|
||||
return fmt.Errorf("cannot remove snapshot with child: %w", errdefs.ErrFailedPrecondition)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -653,12 +652,12 @@ func (s *snapshotter) Remove(ctx context.Context, key string) error {
|
||||
if len(parent) > 0 {
|
||||
pbkt := bkt.Bucket(parent)
|
||||
if pbkt == nil {
|
||||
return errors.Wrapf(errdefs.ErrNotFound, "parent snapshot %v does not exist", string(parent))
|
||||
return fmt.Errorf("parent snapshot %v does not exist: %w", string(parent), errdefs.ErrNotFound)
|
||||
}
|
||||
cbkt := pbkt.Bucket(bucketKeyChildren)
|
||||
if cbkt != nil {
|
||||
if err := cbkt.Delete([]byte(key)); err != nil {
|
||||
return errors.Wrap(err, "failed to remove child link")
|
||||
return fmt.Errorf("failed to remove child link: %w", err)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -784,7 +783,7 @@ func (s *snapshotter) Walk(ctx context.Context, fn snapshots.WalkFunc, fs ...str
|
||||
func validateSnapshot(info *snapshots.Info) error {
|
||||
for k, v := range info.Labels {
|
||||
if err := labels.Validate(k, v); err != nil {
|
||||
return errors.Wrapf(err, "info.Labels")
|
||||
return fmt.Errorf("info.Labels: %w", err)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -18,6 +18,7 @@ package metadata
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"reflect"
|
||||
@@ -34,7 +35,6 @@ import (
|
||||
"github.com/containerd/containerd/snapshots"
|
||||
"github.com/containerd/containerd/snapshots/native"
|
||||
"github.com/containerd/containerd/snapshots/testsuite"
|
||||
"github.com/pkg/errors"
|
||||
bolt "go.etcd.io/bbolt"
|
||||
)
|
||||
|
||||
@@ -319,7 +319,7 @@ func (s *tmpSnapshotter) create(ctx context.Context, key, parent string, kind sn
|
||||
if target != "" {
|
||||
for _, name := range s.targets[target] {
|
||||
if s.snapshots[name].Parent == parent {
|
||||
return nil, errors.Wrap(errdefs.ErrAlreadyExists, "found target")
|
||||
return nil, fmt.Errorf("found target: %w", errdefs.ErrAlreadyExists)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -355,7 +355,7 @@ func (s *tmpSnapshotter) Commit(ctx context.Context, name, key string, opts ...s
|
||||
base.Kind = snapshots.KindCommitted
|
||||
|
||||
if _, ok := s.snapshots[name]; ok {
|
||||
return errors.Wrap(errdefs.ErrAlreadyExists, "found name")
|
||||
return fmt.Errorf("found name: %w", errdefs.ErrAlreadyExists)
|
||||
}
|
||||
|
||||
src, ok := s.snapshots[key]
|
||||
|
||||
Reference in New Issue
Block a user