From bbe46b8c43fc2febe316775bc2d4b9d697bbf05c Mon Sep 17 00:00:00 2001 From: haoyun Date: Fri, 7 Jan 2022 10:19:31 +0800 Subject: [PATCH] feat: replace github.com/pkg/errors to errors Signed-off-by: haoyun Co-authored-by: zounengren --- archive/tar.go | 37 +++++---- archive/tar_linux_test.go | 21 +++-- archive/tar_test.go | 82 +++++++++---------- archive/tar_unix.go | 17 ++-- archive/tar_windows.go | 4 +- archive/time_unix.go | 5 +- cio/io_unix.go | 8 +- cio/io_windows.go | 7 +- client.go | 21 +++-- cmd/containerd-shim/main_unix.go | 9 +- cmd/containerd/command/main.go | 19 ++--- cmd/containerd/command/publish.go | 8 +- cmd/containerd/command/service_windows.go | 7 +- cmd/ctr/commands/containers/checkpoint.go | 4 +- cmd/ctr/commands/containers/containers.go | 13 ++- cmd/ctr/commands/containers/restore.go | 3 +- cmd/ctr/commands/content/content.go | 2 +- cmd/ctr/commands/images/convert.go | 4 +- cmd/ctr/commands/images/export.go | 5 +- cmd/ctr/commands/images/images.go | 12 +-- cmd/ctr/commands/images/mount.go | 5 +- cmd/ctr/commands/images/pull.go | 5 +- cmd/ctr/commands/images/push.go | 11 +-- cmd/ctr/commands/images/unmount.go | 5 +- cmd/ctr/commands/leases/leases.go | 3 +- cmd/ctr/commands/namespaces/namespaces.go | 4 +- cmd/ctr/commands/oci/oci.go | 5 +- cmd/ctr/commands/pprof/pprof.go | 3 +- cmd/ctr/commands/resolver.go | 14 ++-- cmd/ctr/commands/run/run.go | 2 +- cmd/ctr/commands/run/run_unix.go | 10 +-- cmd/ctr/commands/run/run_windows.go | 2 +- cmd/ctr/commands/shim/shim.go | 2 +- cmd/ctr/commands/snapshots/snapshots.go | 4 +- cmd/ctr/commands/tasks/checkpoint.go | 2 +- cmd/ctr/commands/tasks/kill.go | 3 +- cmd/ctr/commands/tasks/ps.go | 2 +- cmd/ctr/commands/tasks/start.go | 3 +- cmd/ctr/commands/tasks/tasks_unix.go | 2 +- cmd/ctr/commands/tasks/tasks_windows.go | 2 +- container.go | 12 +-- container_checkpoint_opts.go | 2 +- container_opts.go | 10 +-- container_restore_opts.go | 7 +- content/helpers.go | 27 +++--- content/local/locks.go | 6 +- content/local/readerat.go | 7 +- content/local/store.go | 59 +++++++------ content/local/writer.go | 17 ++-- content/proxy/content_writer.go | 12 +-- content/testsuite/testsuite.go | 54 +++++++----- contrib/apparmor/apparmor.go | 4 +- contrib/apparmor/apparmor_unsupported.go | 2 +- contrib/apparmor/template.go | 5 +- diff/apply/apply.go | 8 +- diff/apply/apply_linux.go | 12 +-- diff/lcow/lcow.go | 20 ++--- diff/stream.go | 2 +- diff/stream_unix.go | 2 +- diff/stream_windows.go | 2 +- diff/walking/differ.go | 20 ++--- diff/windows/windows.go | 43 +++++----- errdefs/errors.go | 5 +- errdefs/grpc.go | 10 +-- errdefs/grpc_test.go | 13 ++- events/exchange/exchange.go | 24 +++--- events/exchange/exchange_test.go | 2 +- filters/parser.go | 9 +- filters/quote.go | 3 +- gc/scheduler/scheduler.go | 4 +- go.mod | 1 - identifiers/validate.go | 8 +- image.go | 4 +- images/archive/exporter.go | 20 ++--- images/archive/importer.go | 38 ++++----- images/archive/reference.go | 6 +- images/handlers.go | 4 +- images/image.go | 21 +++-- images/mediatypes.go | 4 +- install.go | 5 +- integration/client/container_test.go | 17 ++-- integration/client/content_test.go | 3 +- integration/client/daemon_test.go | 9 +- integration/client/go.mod | 1 - integration/container_stats_test.go | 4 +- integration/containerd_image_test.go | 10 +-- integration/imagefs_info_test.go | 4 +- integration/main_test.go | 34 ++++---- integration/shim_dial_unix_test.go | 2 +- labels/validate.go | 5 +- metadata/bolt.go | 4 +- metadata/boltutil/helpers.go | 6 +- metadata/buckets_test.go | 2 +- metadata/containers.go | 50 +++++------ metadata/containers_test.go | 6 +- metadata/content.go | 40 ++++----- metadata/content_test.go | 10 +-- metadata/db.go | 7 +- metadata/db_test.go | 28 +++---- metadata/gc.go | 5 +- metadata/images.go | 38 ++++----- metadata/images_test.go | 6 +- metadata/leases.go | 30 +++---- metadata/leases_test.go | 5 +- metadata/namespaces.go | 15 ++-- metadata/snapshot.go | 69 ++++++++-------- metadata/snapshot_test.go | 6 +- mount/fmountat_linux.go | 10 +-- mount/fmountat_linux_test.go | 4 +- mount/lookup_unix.go | 6 +- mount/losetup_linux.go | 16 ++-- mount/mount_freebsd.go | 9 +- mount/mount_linux.go | 19 +++-- mount/mount_unix.go | 2 +- mount/mount_windows.go | 19 +++-- mount/temp.go | 15 ++-- namespaces/context.go | 6 +- oci/spec_opts.go | 6 +- oci/spec_opts_nonlinux.go | 2 +- oci/spec_opts_windows.go | 2 +- oci/utils_unix.go | 5 +- pkg/cap/cap_linux.go | 5 +- pkg/cri/config/config.go | 19 +++-- pkg/cri/cri.go | 23 +++--- pkg/cri/io/helpers_windows.go | 6 +- pkg/cri/opts/container.go | 13 +-- pkg/cri/opts/spec.go | 3 +- pkg/cri/opts/spec_linux.go | 22 ++--- pkg/cri/opts/spec_windows.go | 8 +- pkg/cri/server/cni_conf_syncer.go | 8 +- pkg/cri/server/container_attach.go | 12 +-- pkg/cri/server/container_create.go | 47 +++++------ pkg/cri/server/container_create_linux.go | 27 +++--- pkg/cri/server/container_create_linux_test.go | 2 +- pkg/cri/server/container_exec.go | 7 +- pkg/cri/server/container_execsync.go | 26 +++--- pkg/cri/server/container_log_reopen.go | 6 +- pkg/cri/server/container_remove.go | 24 +++--- pkg/cri/server/container_start.go | 35 ++++---- pkg/cri/server/container_stats.go | 11 +-- pkg/cri/server/container_stats_list.go | 11 +-- pkg/cri/server/container_stats_list_linux.go | 28 +++---- pkg/cri/server/container_stats_list_other.go | 5 +- .../server/container_stats_list_windows.go | 6 +- pkg/cri/server/container_status.go | 18 ++-- pkg/cri/server/container_stop.go | 22 ++--- pkg/cri/server/container_update_resources.go | 20 ++--- .../container_update_resources_linux.go | 7 +- .../container_update_resources_other.go | 7 +- .../container_update_resources_windows.go | 7 +- pkg/cri/server/events.go | 34 ++++---- pkg/cri/server/helpers.go | 15 ++-- pkg/cri/server/helpers_linux.go | 7 +- pkg/cri/server/image_pull.go | 49 ++++++----- pkg/cri/server/image_remove.go | 9 +- pkg/cri/server/image_status.go | 6 +- pkg/cri/server/restart.go | 60 +++++++------- pkg/cri/server/sandbox_portforward.go | 6 +- pkg/cri/server/sandbox_portforward_linux.go | 9 +- pkg/cri/server/sandbox_portforward_other.go | 4 +- pkg/cri/server/sandbox_portforward_windows.go | 11 ++- pkg/cri/server/sandbox_remove.go | 24 +++--- pkg/cri/server/sandbox_run.go | 57 ++++++------- pkg/cri/server/sandbox_run_linux.go | 33 ++++---- pkg/cri/server/sandbox_run_windows.go | 4 +- pkg/cri/server/sandbox_stats.go | 9 +- pkg/cri/server/sandbox_stats_linux.go | 20 ++--- pkg/cri/server/sandbox_stats_list.go | 7 +- pkg/cri/server/sandbox_stats_other.go | 7 +- pkg/cri/server/sandbox_stats_windows.go | 7 +- pkg/cri/server/sandbox_status.go | 26 +++--- pkg/cri/server/sandbox_stop.go | 29 +++---- pkg/cri/server/service.go | 27 +++--- pkg/cri/server/service_linux.go | 7 +- pkg/cri/server/service_windows.go | 5 +- pkg/cri/server/snapshots.go | 4 +- pkg/cri/server/streaming.go | 27 +++--- pkg/cri/server/update_runtime_config.go | 12 +-- pkg/cri/server/update_runtime_config_test.go | 2 +- pkg/cri/store/container/metadata.go | 4 +- pkg/cri/store/container/status.go | 15 ++-- pkg/cri/store/image/fake_image.go | 4 +- pkg/cri/store/image/image.go | 16 ++-- pkg/cri/store/sandbox/metadata.go | 4 +- pkg/cri/util/deep_copy.go | 8 +- pkg/dialer/dialer.go | 5 +- pkg/netns/netns_linux.go | 25 +++--- pkg/netns/netns_other.go | 2 +- pkg/oom/v1/v1.go | 4 +- pkg/oom/v2/v2.go | 4 +- pkg/process/deleted_state.go | 7 +- pkg/process/exec.go | 21 +++-- pkg/process/exec_state.go | 9 +- pkg/process/init.go | 23 +++--- pkg/process/init_state.go | 25 +++--- pkg/process/io.go | 33 ++++---- pkg/process/utils.go | 9 +- pkg/registrar/registrar.go | 9 +- pkg/ttrpcutil/client.go | 5 +- platforms/cpuinfo.go | 6 +- platforms/platforms.go | 10 +-- plugin/context.go | 10 +-- plugin/plugin.go | 5 +- process.go | 4 +- pull.go | 15 ++-- remotes/docker/auth/fetch.go | 17 ++-- remotes/docker/authorizer.go | 14 ++-- remotes/docker/config/hosts.go | 33 ++++---- remotes/docker/converter.go | 9 +- remotes/docker/fetcher.go | 20 ++--- remotes/docker/fetcher_test.go | 5 +- remotes/docker/httpreadseeker.go | 14 ++-- remotes/docker/pusher.go | 31 +++---- remotes/docker/registry.go | 3 +- remotes/docker/resolver.go | 25 +++--- remotes/docker/resolver_test.go | 8 +- remotes/docker/schema1/converter.go | 29 ++++--- remotes/docker/status.go | 4 +- remotes/handlers.go | 10 +-- rootfs/apply.go | 13 ++- rootfs/init.go | 2 +- runtime/restart/monitor/change.go | 4 +- runtime/restart/monitor/monitor.go | 11 ++- runtime/task_list.go | 5 +- runtime/v1/linux/bundle.go | 3 +- runtime/v1/linux/process.go | 2 +- runtime/v1/linux/runtime.go | 6 +- runtime/v1/linux/task.go | 9 +- runtime/v1/shim/client/client.go | 26 +++--- runtime/v1/shim/client/client_linux.go | 6 +- runtime/v1/shim/service.go | 11 ++- runtime/v1/shim/service_linux.go | 19 +++-- runtime/v1/shim/service_unix.go | 14 ++-- runtime/v2/binary.go | 8 +- runtime/v2/bundle.go | 9 +- runtime/v2/logging/logging_windows.go | 8 +- runtime/v2/manager.go | 11 ++- runtime/v2/process.go | 2 +- runtime/v2/runc/container.go | 12 +-- runtime/v2/runc/manager/manager_linux.go | 22 ++--- runtime/v2/runc/platform.go | 19 +++-- runtime/v2/runc/task/service.go | 6 +- runtime/v2/runc/v1/service.go | 16 ++-- runtime/v2/shim.go | 6 +- runtime/v2/shim/shim.go | 8 +- runtime/v2/shim/shim_unix.go | 4 +- runtime/v2/shim/shim_windows.go | 2 +- runtime/v2/shim/util.go | 2 +- runtime/v2/shim/util_unix.go | 7 +- runtime/v2/shim/util_windows.go | 10 +-- runtime/v2/shim_unix.go | 2 +- runtime/v2/shim_windows.go | 4 +- runtime/v2/shim_windows_test.go | 3 +- services/containers/service.go | 2 +- .../content/contentserver/contentserver.go | 4 +- services/content/service.go | 3 +- services/diff/local.go | 8 +- services/diff/service.go | 2 +- services/events/service.go | 6 +- services/images/service.go | 2 +- services/introspection/service.go | 2 +- services/leases/service.go | 5 +- services/namespaces/service.go | 2 +- services/opt/service.go | 5 +- services/server/config/config.go | 18 ++-- services/server/server.go | 15 ++-- services/snapshots/service.go | 2 +- services/tasks/local.go | 7 +- services/tasks/local_unix.go | 3 +- services/tasks/rdt_linux.go | 5 +- services/tasks/service.go | 2 +- snapshots/benchsuite/benchmark_test.go | 5 +- snapshots/btrfs/btrfs.go | 13 ++- snapshots/btrfs/btrfs_test.go | 11 +-- snapshots/devmapper/config.go | 7 +- snapshots/devmapper/dmsetup/dmsetup.go | 16 ++-- snapshots/devmapper/metadata.go | 22 ++--- snapshots/devmapper/metadata_test.go | 2 +- snapshots/devmapper/plugin/plugin.go | 3 +- snapshots/devmapper/pool_device.go | 48 +++++------ snapshots/devmapper/snapshotter.go | 12 +-- snapshots/lcow/lcow.go | 33 ++++---- snapshots/native/native.go | 28 +++---- snapshots/overlay/overlay.go | 25 +++--- snapshots/overlay/overlayutils/check.go | 3 +- snapshots/storage/bolt.go | 70 ++++++++-------- snapshots/storage/metastore.go | 6 +- snapshots/storage/metastore_test.go | 26 +++--- snapshots/testsuite/helpers.go | 57 +++++++------ snapshots/windows/windows.go | 50 +++++------ sys/filesys_windows.go | 10 +-- sys/reaper/reaper_unix.go | 5 +- sys/socket_unix.go | 4 +- task.go | 8 +- task_opts.go | 2 +- task_opts_unix.go | 2 +- tracing/plugin/otlp.go | 10 +-- unpacker.go | 22 ++--- vendor/modules.txt | 1 - 299 files changed, 1896 insertions(+), 1874 deletions(-) diff --git a/archive/tar.go b/archive/tar.go index fbc061c45..62341d5e1 100644 --- a/archive/tar.go +++ b/archive/tar.go @@ -19,6 +19,8 @@ package archive import ( "archive/tar" "context" + "errors" + "fmt" "io" "os" "path/filepath" @@ -30,7 +32,6 @@ import ( "github.com/containerd/containerd/log" "github.com/containerd/continuity/fs" - "github.com/pkg/errors" ) var bufPool = &sync.Pool{ @@ -76,7 +77,7 @@ func WriteDiff(ctx context.Context, w io.Writer, a, b string, opts ...WriteDiffO var options WriteDiffOptions for _, opt := range opts { if err := opt(&options); err != nil { - return errors.Wrap(err, "failed to apply option") + return fmt.Errorf("failed to apply option: %w", err) } } if options.writeDiffFunc == nil { @@ -97,7 +98,7 @@ func writeDiffNaive(ctx context.Context, w io.Writer, a, b string, _ WriteDiffOp cw := NewChangeWriter(w, b) err := fs.Changes(ctx, a, b, cw.HandleChange) if err != nil { - return errors.Wrap(err, "failed to create diff tar stream") + return fmt.Errorf("failed to create diff tar stream: %w", err) } return cw.Close() } @@ -128,7 +129,7 @@ func Apply(ctx context.Context, root string, r io.Reader, opts ...ApplyOpt) (int var options ApplyOptions for _, opt := range opts { if err := opt(&options); err != nil { - return 0, errors.Wrap(err, "failed to apply option") + return 0, fmt.Errorf("failed to apply option: %w", err) } } if options.Filter == nil { @@ -236,7 +237,7 @@ func applyNaive(ctx context.Context, root string, r io.Reader, options ApplyOpti ppath, base := filepath.Split(hdr.Name) ppath, err = fs.RootPath(root, ppath) if err != nil { - return 0, errors.Wrap(err, "failed to get root path") + return 0, fmt.Errorf("failed to get root path: %w", err) } // Join to root before joining to parent path to ensure relative links are @@ -266,7 +267,7 @@ func applyNaive(ctx context.Context, root string, r io.Reader, options ApplyOpti } writeFile, err := convertWhiteout(hdr, path) if err != nil { - return 0, errors.Wrapf(err, "failed to convert whiteout file %q", hdr.Name) + return 0, fmt.Errorf("failed to convert whiteout file %q: %w", hdr.Name, err) } if !writeFile { continue @@ -373,7 +374,7 @@ func createTarFile(ctx context.Context, path, extractDir string, hdr *tar.Header return nil default: - return errors.Errorf("unhandled tar header type %d\n", hdr.Typeflag) + return fmt.Errorf("unhandled tar header type %d", hdr.Typeflag) } // Lchown is not supported on Windows. @@ -520,7 +521,7 @@ func (cw *ChangeWriter) HandleChange(k fs.ChangeKind, p string, f os.FileInfo, e return err } if err := cw.tw.WriteHeader(hdr); err != nil { - return errors.Wrap(err, "failed to write whiteout header") + return fmt.Errorf("failed to write whiteout header: %w", err) } } else { var ( @@ -555,12 +556,12 @@ func (cw *ChangeWriter) HandleChange(k fs.ChangeKind, p string, f os.FileInfo, e if strings.HasPrefix(name, string(filepath.Separator)) { name, err = filepath.Rel(string(filepath.Separator), name) if err != nil { - return errors.Wrap(err, "failed to make path relative") + return fmt.Errorf("failed to make path relative: %w", err) } } name, err = tarName(name) if err != nil { - return errors.Wrap(err, "cannot canonicalize path") + return fmt.Errorf("cannot canonicalize path: %w", err) } // suffix with '/' for directories if f.IsDir() && !strings.HasSuffix(name, "/") { @@ -569,7 +570,7 @@ func (cw *ChangeWriter) HandleChange(k fs.ChangeKind, p string, f os.FileInfo, e hdr.Name = name if err := setHeaderForSpecialDevice(hdr, name, f); err != nil { - return errors.Wrap(err, "failed to set device headers") + return fmt.Errorf("failed to set device headers: %w", err) } // additionalLinks stores file names which must be linked to @@ -597,7 +598,7 @@ func (cw *ChangeWriter) HandleChange(k fs.ChangeKind, p string, f os.FileInfo, e } if capability, err := getxattr(source, "security.capability"); err != nil { - return errors.Wrap(err, "failed to get capabilities xattr") + return fmt.Errorf("failed to get capabilities xattr: %w", err) } else if len(capability) > 0 { if hdr.PAXRecords == nil { hdr.PAXRecords = map[string]string{} @@ -609,19 +610,19 @@ func (cw *ChangeWriter) HandleChange(k fs.ChangeKind, p string, f os.FileInfo, e return err } if err := cw.tw.WriteHeader(hdr); err != nil { - return errors.Wrap(err, "failed to write file header") + return fmt.Errorf("failed to write file header: %w", err) } if hdr.Typeflag == tar.TypeReg && hdr.Size > 0 { file, err := open(source) if err != nil { - return errors.Wrapf(err, "failed to open path: %v", source) + return fmt.Errorf("failed to open path: %v: %w", source, err) } defer file.Close() n, err := copyBuffered(context.TODO(), cw.tw, file) if err != nil { - return errors.Wrap(err, "failed to copy") + return fmt.Errorf("failed to copy: %w", err) } if n != hdr.Size { return errors.New("short write copying file") @@ -640,7 +641,7 @@ func (cw *ChangeWriter) HandleChange(k fs.ChangeKind, p string, f os.FileInfo, e return err } if err := cw.tw.WriteHeader(hdr); err != nil { - return errors.Wrap(err, "failed to write file header") + return fmt.Errorf("failed to write file header: %w", err) } } } @@ -651,7 +652,7 @@ func (cw *ChangeWriter) HandleChange(k fs.ChangeKind, p string, f os.FileInfo, e // Close closes this writer. func (cw *ChangeWriter) Close() error { if err := cw.tw.Close(); err != nil { - return errors.Wrap(err, "failed to close tar writer") + return fmt.Errorf("failed to close tar writer: %w", err) } return nil } @@ -764,7 +765,7 @@ func validateWhiteout(path string) error { dir += string(filepath.Separator) } if !strings.HasPrefix(originalPath, dir) { - return errors.Wrapf(errInvalidArchive, "invalid whiteout name: %v", base) + return fmt.Errorf("invalid whiteout name: %v: %w", base, errInvalidArchive) } } return nil diff --git a/archive/tar_linux_test.go b/archive/tar_linux_test.go index a75fefe9c..9a4397de5 100644 --- a/archive/tar_linux_test.go +++ b/archive/tar_linux_test.go @@ -31,7 +31,6 @@ import ( "github.com/containerd/containerd/snapshots/overlay/overlayutils" "github.com/containerd/continuity/fs" "github.com/containerd/continuity/fs/fstest" - "github.com/pkg/errors" ) func TestOverlayApply(t *testing.T) { @@ -72,7 +71,7 @@ func TestOverlayApplyNoParents(t *testing.T) { cw.addedDirs = nil err := fs.Changes(ctx, a, b, cw.HandleChange) if err != nil { - return errors.Wrap(err, "failed to create diff tar stream") + return fmt.Errorf("failed to create diff tar stream: %w", err) } return cw.Close() }, @@ -97,7 +96,7 @@ type contextKey struct{} func (d overlayDiffApplier) TestContext(ctx context.Context) (context.Context, func(), error) { merged, err := os.MkdirTemp(d.tmp, "merged") if err != nil { - return ctx, nil, errors.Wrap(err, "failed to make merged dir") + return ctx, nil, fmt.Errorf("failed to make merged dir: %w", err) } oc := &overlayContext{ @@ -118,7 +117,7 @@ func (d overlayDiffApplier) Apply(ctx context.Context, a fstest.Applier) (string applyCopy, err := os.MkdirTemp(d.tmp, "apply-copy-") if err != nil { - return "", nil, errors.Wrap(err, "failed to create temp dir") + return "", nil, fmt.Errorf("failed to create temp dir: %w", err) } defer os.RemoveAll(applyCopy) @@ -128,33 +127,33 @@ func (d overlayDiffApplier) Apply(ctx context.Context, a fstest.Applier) (string } if err = fs.CopyDir(applyCopy, base); err != nil { - return "", nil, errors.Wrap(err, "failed to copy base") + return "", nil, fmt.Errorf("failed to copy base: %w", err) } if err := a.Apply(applyCopy); err != nil { - return "", nil, errors.Wrap(err, "failed to apply changes to copy of base") + return "", nil, fmt.Errorf("failed to apply changes to copy of base: %w", err) } buf := bytes.NewBuffer(nil) if err := d.diff(ctx, buf, base, applyCopy); err != nil { - return "", nil, errors.Wrap(err, "failed to create diff") + return "", nil, fmt.Errorf("failed to create diff: %w", err) } if oc.mounted { if err := mount.Unmount(oc.merged, 0); err != nil { - return "", nil, errors.Wrap(err, "failed to unmount") + return "", nil, fmt.Errorf("failed to unmount: %w", err) } oc.mounted = false } next, err := os.MkdirTemp(d.tmp, "lower-") if err != nil { - return "", nil, errors.Wrap(err, "failed to create temp dir") + return "", nil, fmt.Errorf("failed to create temp dir: %w", err) } if _, err = Apply(ctx, next, buf, WithConvertWhiteout(OverlayConvertWhiteout), WithParents(oc.lowers)); err != nil { - return "", nil, errors.Wrap(err, "failed to apply tar stream") + return "", nil, fmt.Errorf("failed to apply tar stream: %w", err) } oc.lowers = append([]string{next}, oc.lowers...) @@ -172,7 +171,7 @@ func (d overlayDiffApplier) Apply(ctx context.Context, a fstest.Applier) (string } if err := m.Mount(oc.merged); err != nil { - return "", nil, errors.Wrapf(err, "failed to mount: %v", m) + return "", nil, fmt.Errorf("failed to mount: %v: %w", m, err) } oc.mounted = true diff --git a/archive/tar_test.go b/archive/tar_test.go index faee38daf..f18b1ce4f 100644 --- a/archive/tar_test.go +++ b/archive/tar_test.go @@ -23,6 +23,7 @@ import ( "archive/tar" "bytes" "context" + "errors" "fmt" "io" "os" @@ -36,7 +37,6 @@ import ( "github.com/containerd/containerd/pkg/testutil" "github.com/containerd/continuity/fs" "github.com/containerd/continuity/fs/fstest" - "github.com/pkg/errors" exec "golang.org/x/sys/execabs" ) @@ -235,10 +235,10 @@ func TestBreakouts(t *testing.T) { unbrokenCheck := func(root string) error { b, err := os.ReadFile(filepath.Join(root, "etc", "unbroken")) if err != nil { - return errors.Wrap(err, "failed to read unbroken") + return fmt.Errorf("failed to read unbroken: %w", err) } if string(b) != expected { - return errors.Errorf("/etc/unbroken: unexpected value %s, expected %s", b, expected) + return fmt.Errorf("/etc/unbroken: unexpected value %s, expected %s", b, expected) } return nil } @@ -257,7 +257,7 @@ func TestBreakouts(t *testing.T) { } if got := fi.Mode() & os.ModeSymlink; got != os.ModeSymlink { - return errors.Errorf("%s should be symlink", fi.Name()) + return fmt.Errorf("%s should be symlink", fi.Name()) } return nil } @@ -285,7 +285,7 @@ func TestBreakouts(t *testing.T) { } if t1 != t2 { - return errors.Wrapf(errFileDiff, "%#v and %#v", t1, t2) + return fmt.Errorf("%#v and %#v: %w", t1, t2, errFileDiff) } return nil } @@ -310,7 +310,7 @@ func TestBreakouts(t *testing.T) { return err } if !os.SameFile(s1, s2) { - return errors.Wrapf(errFileDiff, "%#v and %#v", s1, s2) + return fmt.Errorf("%#v and %#v: %w", s1, s2, errFileDiff) } return nil } @@ -335,7 +335,7 @@ func TestBreakouts(t *testing.T) { return err } if !bytes.Equal(b, content) { - return errors.Errorf("content differs: expected %v, got %v", content, b) + return fmt.Errorf("content differs: expected %v, got %v", content, b) } return nil } @@ -422,7 +422,7 @@ func TestBreakouts(t *testing.T) { validator: func(root string) error { b, err := os.ReadFile(filepath.Join(root, "etc", "emptied")) if err != nil { - return errors.Wrap(err, "failed to read unbroken") + return fmt.Errorf("failed to read unbroken: %w", err) } if len(b) > 0 { return errors.New("/etc/emptied: non-empty") @@ -774,7 +774,7 @@ func TestBreakouts(t *testing.T) { return err } if perm := fi.Mode() & os.ModePerm; perm != 0400 { - return errors.Errorf("%s perm changed from 0400 to %04o", p, perm) + return fmt.Errorf("%s perm changed from 0400 to %04o", p, perm) } return nil }, @@ -800,7 +800,7 @@ func TestApplyTar(t *testing.T) { return err } if _, err := os.Stat(p); err != nil { - return errors.Wrapf(err, "failure checking existence for %v", d) + return fmt.Errorf("failure checking existence for %v: %w", d, err) } } return nil @@ -844,23 +844,23 @@ func TestApplyTar(t *testing.T) { func testApply(a fstest.Applier) error { td, err := os.MkdirTemp("", "test-apply-") if err != nil { - return errors.Wrap(err, "failed to create temp dir") + return fmt.Errorf("failed to create temp dir: %w", err) } defer os.RemoveAll(td) dest, err := os.MkdirTemp("", "test-apply-dest-") if err != nil { - return errors.Wrap(err, "failed to create temp dir") + return fmt.Errorf("failed to create temp dir: %w", err) } defer os.RemoveAll(dest) if err := a.Apply(td); err != nil { - return errors.Wrap(err, "failed to apply filesystem changes") + return fmt.Errorf("failed to apply filesystem changes: %w", err) } tarArgs := []string{"c", "-C", td} names, err := readDirNames(td) if err != nil { - return errors.Wrap(err, "failed to read directory names") + return fmt.Errorf("failed to read directory names: %w", err) } tarArgs = append(tarArgs, names...) @@ -868,15 +868,15 @@ func testApply(a fstest.Applier) error { arch, err := cmd.StdoutPipe() if err != nil { - return errors.Wrap(err, "failed to create stdout pipe") + return fmt.Errorf("failed to create stdout pipe: %w", err) } if err := cmd.Start(); err != nil { - return errors.Wrap(err, "failed to start command") + return fmt.Errorf("failed to start command: %w", err) } if _, err := Apply(context.Background(), dest, arch); err != nil { - return errors.Wrap(err, "failed to apply tar stream") + return fmt.Errorf("failed to apply tar stream: %w", err) } return fstest.CheckDirectoryEqual(td, dest) @@ -885,17 +885,17 @@ func testApply(a fstest.Applier) error { func testBaseDiff(a fstest.Applier) error { td, err := os.MkdirTemp("", "test-base-diff-") if err != nil { - return errors.Wrap(err, "failed to create temp dir") + return fmt.Errorf("failed to create temp dir: %w", err) } defer os.RemoveAll(td) dest, err := os.MkdirTemp("", "test-base-diff-dest-") if err != nil { - return errors.Wrap(err, "failed to create temp dir") + return fmt.Errorf("failed to create temp dir: %w", err) } defer os.RemoveAll(dest) if err := a.Apply(td); err != nil { - return errors.Wrap(err, "failed to apply filesystem changes") + return fmt.Errorf("failed to apply filesystem changes: %w", err) } arch := Diff(context.Background(), "", td) @@ -903,7 +903,7 @@ func testBaseDiff(a fstest.Applier) error { cmd := exec.Command(tarCmd, "x", "-C", dest) cmd.Stdin = arch if err := cmd.Run(); err != nil { - return errors.Wrap(err, "tar command failed") + return fmt.Errorf("tar command failed: %w", err) } return fstest.CheckDirectoryEqual(td, dest) @@ -912,18 +912,18 @@ func testBaseDiff(a fstest.Applier) error { func testDiffApply(appliers ...fstest.Applier) error { td, err := os.MkdirTemp("", "test-diff-apply-") if err != nil { - return errors.Wrap(err, "failed to create temp dir") + return fmt.Errorf("failed to create temp dir: %w", err) } defer os.RemoveAll(td) dest, err := os.MkdirTemp("", "test-diff-apply-dest-") if err != nil { - return errors.Wrap(err, "failed to create temp dir") + return fmt.Errorf("failed to create temp dir: %w", err) } defer os.RemoveAll(dest) for _, a := range appliers { if err := a.Apply(td); err != nil { - return errors.Wrap(err, "failed to apply filesystem changes") + return fmt.Errorf("failed to apply filesystem changes: %w", err) } } @@ -931,18 +931,18 @@ func testDiffApply(appliers ...fstest.Applier) error { if len(appliers) > 1 { for _, a := range appliers[:len(appliers)-1] { if err := a.Apply(dest); err != nil { - return errors.Wrap(err, "failed to apply base filesystem changes") + return fmt.Errorf("failed to apply base filesystem changes: %w", err) } } } diffBytes, err := io.ReadAll(Diff(context.Background(), dest, td)) if err != nil { - return errors.Wrap(err, "failed to create diff") + return fmt.Errorf("failed to create diff: %w", err) } if _, err := Apply(context.Background(), dest, bytes.NewReader(diffBytes)); err != nil { - return errors.Wrap(err, "failed to apply tar stream") + return fmt.Errorf("failed to apply tar stream: %w", err) } return fstest.CheckDirectoryEqual(td, dest) @@ -1194,10 +1194,10 @@ func dirEntry(name string, mode int) tarEntryValidator { return errors.New("not directory type") } if hdr.Name != name { - return errors.Errorf("wrong name %q, expected %q", hdr.Name, name) + return fmt.Errorf("wrong name %q, expected %q", hdr.Name, name) } if hdr.Mode != int64(mode) { - return errors.Errorf("wrong mode %o, expected %o", hdr.Mode, mode) + return fmt.Errorf("wrong mode %o, expected %o", hdr.Mode, mode) } return nil } @@ -1209,10 +1209,10 @@ func fileEntry(name string, expected []byte, mode int) tarEntryValidator { return errors.New("not file type") } if hdr.Name != name { - return errors.Errorf("wrong name %q, expected %q", hdr.Name, name) + return fmt.Errorf("wrong name %q, expected %q", hdr.Name, name) } if hdr.Mode != int64(mode) { - return errors.Errorf("wrong mode %o, expected %o", hdr.Mode, mode) + return fmt.Errorf("wrong mode %o, expected %o", hdr.Mode, mode) } if !bytes.Equal(b, expected) { return errors.New("different file content") @@ -1227,10 +1227,10 @@ func linkEntry(name, link string) tarEntryValidator { return errors.New("not link type") } if hdr.Name != name { - return errors.Errorf("wrong name %q, expected %q", hdr.Name, name) + return fmt.Errorf("wrong name %q, expected %q", hdr.Name, name) } if hdr.Linkname != link { - return errors.Errorf("wrong link %q, expected %q", hdr.Linkname, link) + return fmt.Errorf("wrong link %q, expected %q", hdr.Linkname, link) } return nil } @@ -1243,10 +1243,10 @@ func whiteoutEntry(name string) tarEntryValidator { return func(hdr *tar.Header, b []byte) error { if hdr.Typeflag != tar.TypeReg { - return errors.Errorf("not file type: %q", hdr.Typeflag) + return fmt.Errorf("not file type: %q", hdr.Typeflag) } if hdr.Name != whiteOut { - return errors.Errorf("wrong name %q, expected whiteout %q", hdr.Name, name) + return fmt.Errorf("wrong name %q, expected whiteout %q", hdr.Name, name) } return nil } @@ -1309,7 +1309,7 @@ type diffApplier struct{} func (d diffApplier) TestContext(ctx context.Context) (context.Context, func(), error) { base, err := os.MkdirTemp("", "test-diff-apply-") if err != nil { - return ctx, nil, errors.Wrap(err, "failed to create temp dir") + return ctx, nil, fmt.Errorf("failed to create temp dir: %w", err) } return context.WithValue(ctx, d, base), func() { os.RemoveAll(base) @@ -1321,23 +1321,23 @@ func (d diffApplier) Apply(ctx context.Context, a fstest.Applier) (string, func( applyCopy, err := os.MkdirTemp("", "test-diffapply-apply-copy-") if err != nil { - return "", nil, errors.Wrap(err, "failed to create temp dir") + return "", nil, fmt.Errorf("failed to create temp dir: %w", err) } defer os.RemoveAll(applyCopy) if err = fs.CopyDir(applyCopy, base); err != nil { - return "", nil, errors.Wrap(err, "failed to copy base") + return "", nil, fmt.Errorf("failed to copy base: %w", err) } if err := a.Apply(applyCopy); err != nil { - return "", nil, errors.Wrap(err, "failed to apply changes to copy of base") + return "", nil, fmt.Errorf("failed to apply changes to copy of base: %w", err) } diffBytes, err := io.ReadAll(Diff(ctx, base, applyCopy)) if err != nil { - return "", nil, errors.Wrap(err, "failed to create diff") + return "", nil, fmt.Errorf("failed to create diff: %w", err) } if _, err = Apply(ctx, base, bytes.NewReader(diffBytes)); err != nil { - return "", nil, errors.Wrap(err, "failed to apply tar stream") + return "", nil, fmt.Errorf("failed to apply tar stream: %w", err) } return base, nil, nil diff --git a/archive/tar_unix.go b/archive/tar_unix.go index c5ddf596f..2f3a3a392 100644 --- a/archive/tar_unix.go +++ b/archive/tar_unix.go @@ -21,6 +21,8 @@ package archive import ( "archive/tar" + "errors" + "fmt" "os" "runtime" "strings" @@ -29,7 +31,6 @@ import ( "github.com/containerd/containerd/pkg/userns" "github.com/containerd/continuity/fs" "github.com/containerd/continuity/sysx" - "github.com/pkg/errors" "golang.org/x/sys/unix" ) @@ -139,7 +140,7 @@ func getxattr(path, attr string) ([]byte, error) { func setxattr(path, key, value string) error { // Do not set trusted attributes if strings.HasPrefix(key, "trusted.") { - return errors.Wrap(unix.ENOTSUP, "admin attributes from archive not supported") + return fmt.Errorf("admin attributes from archive not supported: %w", unix.ENOTSUP) } return unix.Lsetxattr(path, key, []byte(value), 0) } @@ -159,12 +160,12 @@ func copyDirInfo(fi os.FileInfo, path string) error { } } if err != nil { - return errors.Wrapf(err, "failed to chown %s", path) + return fmt.Errorf("failed to chown %s: %w", path, err) } } if err := os.Chmod(path, fi.Mode()); err != nil { - return errors.Wrapf(err, "failed to chmod %s", path) + return fmt.Errorf("failed to chmod %s: %w", path, err) } timespec := []unix.Timespec{ @@ -172,7 +173,7 @@ func copyDirInfo(fi os.FileInfo, path string) error { unix.NsecToTimespec(syscall.TimespecToNsec(fs.StatMtime(st))), } if err := unix.UtimesNanoAt(unix.AT_FDCWD, path, timespec, unix.AT_SYMLINK_NOFOLLOW); err != nil { - return errors.Wrapf(err, "failed to utime %s", path) + return fmt.Errorf("failed to utime %s: %w", path, err) } return nil @@ -184,7 +185,7 @@ func copyUpXAttrs(dst, src string) error { if err == unix.ENOTSUP || err == sysx.ENODATA { return nil } - return errors.Wrapf(err, "failed to list xattrs on %s", src) + return fmt.Errorf("failed to list xattrs on %s: %w", src, err) } for _, xattr := range xattrKeys { // Do not copy up trusted attributes @@ -196,10 +197,10 @@ func copyUpXAttrs(dst, src string) error { if err == unix.ENOTSUP || err == sysx.ENODATA { continue } - return errors.Wrapf(err, "failed to get xattr %q on %s", xattr, src) + return fmt.Errorf("failed to get xattr %q on %s: %w", xattr, src, err) } if err := lsetxattrCreate(dst, xattr, data); err != nil { - return errors.Wrapf(err, "failed to set xattr %q on %s", xattr, dst) + return fmt.Errorf("failed to set xattr %q on %s: %w", xattr, dst, err) } } diff --git a/archive/tar_windows.go b/archive/tar_windows.go index c38154caa..4b71c1e30 100644 --- a/archive/tar_windows.go +++ b/archive/tar_windows.go @@ -18,12 +18,12 @@ package archive import ( "archive/tar" + "errors" "fmt" "os" "strings" "github.com/containerd/containerd/sys" - "github.com/pkg/errors" ) // tarName returns platform-specific filepath @@ -112,7 +112,7 @@ func setxattr(path, key, value string) error { func copyDirInfo(fi os.FileInfo, path string) error { if err := os.Chmod(path, fi.Mode()); err != nil { - return errors.Wrapf(err, "failed to chmod %s", path) + return fmt.Errorf("failed to chmod %s: %w", path, err) } return nil } diff --git a/archive/time_unix.go b/archive/time_unix.go index 53e77aa9f..043e37453 100644 --- a/archive/time_unix.go +++ b/archive/time_unix.go @@ -20,11 +20,10 @@ package archive import ( + "fmt" "time" "golang.org/x/sys/unix" - - "github.com/pkg/errors" ) func chtimes(path string, atime, mtime time.Time) error { @@ -33,7 +32,7 @@ func chtimes(path string, atime, mtime time.Time) error { utimes[1] = unix.NsecToTimespec(mtime.UnixNano()) if err := unix.UtimesNanoAt(unix.AT_FDCWD, path, utimes[0:], unix.AT_SYMLINK_NOFOLLOW); err != nil { - return errors.Wrapf(err, "failed call to UtimesNanoAt for %s", path) + return fmt.Errorf("failed call to UtimesNanoAt for %s: %w", path, err) } return nil diff --git a/cio/io_unix.go b/cio/io_unix.go index 99281c9d1..5606cc88a 100644 --- a/cio/io_unix.go +++ b/cio/io_unix.go @@ -21,6 +21,7 @@ package cio import ( "context" + "fmt" "io" "os" "path/filepath" @@ -28,7 +29,6 @@ import ( "syscall" "github.com/containerd/fifo" - "github.com/pkg/errors" ) // NewFIFOSetInDir returns a new FIFOSet with paths in a temporary directory under root @@ -112,7 +112,7 @@ func openFifos(ctx context.Context, fifos *FIFOSet) (f pipes, retErr error) { if fifos.Stdin != "" { if f.Stdin, retErr = fifo.OpenFifo(ctx, fifos.Stdin, syscall.O_WRONLY|syscall.O_CREAT|syscall.O_NONBLOCK, 0700); retErr != nil { - return f, errors.Wrapf(retErr, "failed to open stdin fifo") + return f, fmt.Errorf("failed to open stdin fifo: %w", retErr) } defer func() { if retErr != nil && f.Stdin != nil { @@ -122,7 +122,7 @@ func openFifos(ctx context.Context, fifos *FIFOSet) (f pipes, retErr error) { } if fifos.Stdout != "" { if f.Stdout, retErr = fifo.OpenFifo(ctx, fifos.Stdout, syscall.O_RDONLY|syscall.O_CREAT|syscall.O_NONBLOCK, 0700); retErr != nil { - return f, errors.Wrapf(retErr, "failed to open stdout fifo") + return f, fmt.Errorf("failed to open stdout fifo: %w", retErr) } defer func() { if retErr != nil && f.Stdout != nil { @@ -132,7 +132,7 @@ func openFifos(ctx context.Context, fifos *FIFOSet) (f pipes, retErr error) { } if !fifos.Terminal && fifos.Stderr != "" { if f.Stderr, retErr = fifo.OpenFifo(ctx, fifos.Stderr, syscall.O_RDONLY|syscall.O_CREAT|syscall.O_NONBLOCK, 0700); retErr != nil { - return f, errors.Wrapf(retErr, "failed to open stderr fifo") + return f, fmt.Errorf("failed to open stderr fifo: %w", retErr) } } return f, nil diff --git a/cio/io_windows.go b/cio/io_windows.go index ded475788..f3d736a6d 100644 --- a/cio/io_windows.go +++ b/cio/io_windows.go @@ -23,7 +23,6 @@ import ( winio "github.com/Microsoft/go-winio" "github.com/containerd/containerd/log" - "github.com/pkg/errors" ) const pipeRoot = `\\.\pipe` @@ -54,7 +53,7 @@ func copyIO(fifos *FIFOSet, ioset *Streams) (_ *cio, retErr error) { if fifos.Stdin != "" { l, err := winio.ListenPipe(fifos.Stdin, nil) if err != nil { - return nil, errors.Wrapf(err, "failed to create stdin pipe %s", fifos.Stdin) + return nil, fmt.Errorf("failed to create stdin pipe %s: %w", fifos.Stdin, err) } cios.closers = append(cios.closers, l) @@ -77,7 +76,7 @@ func copyIO(fifos *FIFOSet, ioset *Streams) (_ *cio, retErr error) { if fifos.Stdout != "" { l, err := winio.ListenPipe(fifos.Stdout, nil) if err != nil { - return nil, errors.Wrapf(err, "failed to create stdout pipe %s", fifos.Stdout) + return nil, fmt.Errorf("failed to create stdout pipe %s: %w", fifos.Stdout, err) } cios.closers = append(cios.closers, l) @@ -100,7 +99,7 @@ func copyIO(fifos *FIFOSet, ioset *Streams) (_ *cio, retErr error) { if fifos.Stderr != "" { l, err := winio.ListenPipe(fifos.Stderr, nil) if err != nil { - return nil, errors.Wrapf(err, "failed to create stderr pipe %s", fifos.Stderr) + return nil, fmt.Errorf("failed to create stderr pipe %s: %w", fifos.Stderr, err) } cios.closers = append(cios.closers, l) diff --git a/client.go b/client.go index c6e47d2a2..14c140664 100644 --- a/client.go +++ b/client.go @@ -61,7 +61,6 @@ import ( ptypes "github.com/gogo/protobuf/types" ocispec "github.com/opencontainers/image-spec/specs-go/v1" specs "github.com/opencontainers/runtime-spec/specs-go" - "github.com/pkg/errors" "go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc" "golang.org/x/sync/semaphore" "google.golang.org/grpc" @@ -152,7 +151,7 @@ func New(address string, opts ...ClientOpt) (*Client, error) { defer cancel() conn, err := grpc.DialContext(ctx, dialer.DialAddress(address), gopts...) if err != nil { - return nil, errors.Wrapf(err, "failed to dial %q", address) + return nil, fmt.Errorf("failed to dial %q: %w", address, err) } return conn, nil } @@ -163,7 +162,7 @@ func New(address string, opts ...ClientOpt) (*Client, error) { c.conn, c.connector = conn, connector } if copts.services == nil && c.conn == nil { - return nil, errors.Wrap(errdefs.ErrUnavailable, "no grpc connection or services is available") + return nil, fmt.Errorf("no grpc connection or services is available: %w", errdefs.ErrUnavailable) } // check namespace labels for default runtime @@ -223,7 +222,7 @@ type Client struct { // Reconnect re-establishes the GRPC connection to the containerd daemon func (c *Client) Reconnect() error { if c.connector == nil { - return errors.Wrap(errdefs.ErrUnavailable, "unable to reconnect to containerd, no connector available") + return fmt.Errorf("unable to reconnect to containerd, no connector available: %w", errdefs.ErrUnavailable) } c.connMu.Lock() defer c.connMu.Unlock() @@ -251,7 +250,7 @@ func (c *Client) IsServing(ctx context.Context) (bool, error) { c.connMu.Lock() if c.conn == nil { c.connMu.Unlock() - return false, errors.Wrap(errdefs.ErrUnavailable, "no grpc connection available") + return false, fmt.Errorf("no grpc connection available: %w", errdefs.ErrUnavailable) } c.connMu.Unlock() r, err := c.HealthService().Check(ctx, &grpc_health_v1.HealthCheckRequest{}, grpc.WaitForReady(true)) @@ -393,7 +392,7 @@ func (c *Client) Fetch(ctx context.Context, ref string, opts ...RemoteOpt) (imag } if fetchCtx.Unpack { - return images.Image{}, errors.Wrap(errdefs.ErrNotImplemented, "unpack on fetch not supported, try pull") + return images.Image{}, fmt.Errorf("unpack on fetch not supported, try pull: %w", errdefs.ErrNotImplemented) } if fetchCtx.PlatformMatcher == nil { @@ -404,7 +403,7 @@ func (c *Client) Fetch(ctx context.Context, ref string, opts ...RemoteOpt) (imag for _, s := range fetchCtx.Platforms { p, err := platforms.Parse(s) if err != nil { - return images.Image{}, errors.Wrapf(err, "invalid platform %s", s) + return images.Image{}, fmt.Errorf("invalid platform %s: %w", s, err) } ps = append(ps, p) } @@ -440,7 +439,7 @@ func (c *Client) Push(ctx context.Context, ref string, desc ocispec.Descriptor, for _, platform := range pushCtx.Platforms { p, err := platforms.Parse(platform) if err != nil { - return errors.Wrapf(err, "invalid platform %s", platform) + return fmt.Errorf("invalid platform %s: %w", platform, err) } ps = append(ps, p) } @@ -723,7 +722,7 @@ func (c *Client) Version(ctx context.Context) (Version, error) { c.connMu.Lock() if c.conn == nil { c.connMu.Unlock() - return Version{}, errors.Wrap(errdefs.ErrUnavailable, "no grpc connection available") + return Version{}, fmt.Errorf("no grpc connection available: %w", errdefs.ErrUnavailable) } c.connMu.Unlock() response, err := c.VersionService().Version(ctx, &ptypes.Empty{}) @@ -746,7 +745,7 @@ func (c *Client) Server(ctx context.Context) (ServerInfo, error) { c.connMu.Lock() if c.conn == nil { c.connMu.Unlock() - return ServerInfo{}, errors.Wrap(errdefs.ErrUnavailable, "no grpc connection available") + return ServerInfo{}, fmt.Errorf("no grpc connection available: %w", errdefs.ErrUnavailable) } c.connMu.Unlock() @@ -784,7 +783,7 @@ func (c *Client) getSnapshotter(ctx context.Context, name string) (snapshots.Sna s := c.SnapshotService(name) if s == nil { - return nil, errors.Wrapf(errdefs.ErrNotFound, "snapshotter %s was not found", name) + return nil, fmt.Errorf("snapshotter %s was not found: %w", name, errdefs.ErrNotFound) } return s, nil diff --git a/cmd/containerd-shim/main_unix.go b/cmd/containerd-shim/main_unix.go index e1d3eb13f..024611bf3 100644 --- a/cmd/containerd-shim/main_unix.go +++ b/cmd/containerd-shim/main_unix.go @@ -45,7 +45,6 @@ import ( "github.com/containerd/ttrpc" "github.com/containerd/typeurl" ptypes "github.com/gogo/protobuf/types" - "github.com/pkg/errors" "github.com/sirupsen/logrus" exec "golang.org/x/sys/execabs" "golang.org/x/sys/unix" @@ -154,7 +153,7 @@ func executeShim() error { } server, err := newServer() if err != nil { - return errors.Wrap(err, "failed creating server") + return fmt.Errorf("failed creating server: %w", err) } sv, err := shim.NewService( shim.Config{ @@ -212,7 +211,7 @@ func serve(ctx context.Context, server *ttrpc.Server, path string) error { p = abstractSocketPrefix + p } if len(p) > socketPathLimit { - return errors.Errorf("%q: unix socket path too long (> %d)", p, socketPathLimit) + return fmt.Errorf("%q: unix socket path too long (> %d)", p, socketPathLimit) } l, err = net.Listen("unix", p) } @@ -310,10 +309,10 @@ func (l *remoteEventsPublisher) Publish(ctx context.Context, topic string, event } status, err := reaper.Default.WaitTimeout(cmd, c, 30*time.Second) if err != nil { - return errors.Wrapf(err, "failed to publish event: %s", b.String()) + return fmt.Errorf("failed to publish event: %s: %w", b.String(), err) } if status != 0 { - return errors.Errorf("failed to publish event: %s", b.String()) + return fmt.Errorf("failed to publish event: %s", b.String()) } return nil } diff --git a/cmd/containerd/command/main.go b/cmd/containerd/command/main.go index e6c81443c..f549e08a3 100644 --- a/cmd/containerd/command/main.go +++ b/cmd/containerd/command/main.go @@ -37,7 +37,6 @@ import ( "github.com/containerd/containerd/sys" "github.com/containerd/containerd/tracing" "github.com/containerd/containerd/version" - "github.com/pkg/errors" "github.com/sirupsen/logrus" "github.com/urfave/cli" "google.golang.org/grpc/grpclog" @@ -155,7 +154,7 @@ can be used and modified as necessary as a custom configuration.` // cleanup temp mounts if err := mount.SetTempMountLocation(filepath.Join(config.Root, "tmpmounts")); err != nil { - return errors.Wrap(err, "creating temp mount location") + return fmt.Errorf("creating temp mount location: %w", err) } // unmount all temp mounts on boot for the server warnings, err := mount.CleanupTempMounts(0) @@ -167,7 +166,7 @@ can be used and modified as necessary as a custom configuration.` } if config.GRPC.Address == "" { - return errors.Wrap(errdefs.ErrInvalidArgument, "grpc address cannot be empty") + return fmt.Errorf("grpc address cannot be empty: %w", errdefs.ErrInvalidArgument) } if config.TTRPC.Address == "" { // If TTRPC was not explicitly configured, use defaults based on GRPC. @@ -235,11 +234,11 @@ can be used and modified as necessary as a custom configuration.` var l net.Listener if isLocalAddress(config.Debug.Address) { if l, err = sys.GetLocalListener(config.Debug.Address, config.Debug.UID, config.Debug.GID); err != nil { - return errors.Wrapf(err, "failed to get listener for debug endpoint") + return fmt.Errorf("failed to get listener for debug endpoint: %w", err) } } else { if l, err = net.Listen("tcp", config.Debug.Address); err != nil { - return errors.Wrapf(err, "failed to get listener for debug endpoint") + return fmt.Errorf("failed to get listener for debug endpoint: %w", err) } } serve(ctx, l, server.ServeDebug) @@ -247,28 +246,28 @@ can be used and modified as necessary as a custom configuration.` if config.Metrics.Address != "" { l, err := net.Listen("tcp", config.Metrics.Address) if err != nil { - return errors.Wrapf(err, "failed to get listener for metrics endpoint") + return fmt.Errorf("failed to get listener for metrics endpoint: %w", err) } serve(ctx, l, server.ServeMetrics) } // setup the ttrpc endpoint tl, err := sys.GetLocalListener(config.TTRPC.Address, config.TTRPC.UID, config.TTRPC.GID) if err != nil { - return errors.Wrapf(err, "failed to get listener for main ttrpc endpoint") + return fmt.Errorf("failed to get listener for main ttrpc endpoint: %w", err) } serve(ctx, tl, server.ServeTTRPC) if config.GRPC.TCPAddress != "" { l, err := net.Listen("tcp", config.GRPC.TCPAddress) if err != nil { - return errors.Wrapf(err, "failed to get listener for TCP grpc endpoint") + return fmt.Errorf("failed to get listener for TCP grpc endpoint: %w", err) } serve(ctx, l, server.ServeTCP) } // setup the main grpc endpoint l, err := sys.GetLocalListener(config.GRPC.Address, config.GRPC.UID, config.GRPC.GID) if err != nil { - return errors.Wrapf(err, "failed to get listener for main endpoint") + return fmt.Errorf("failed to get listener for main endpoint: %w", err) } serve(ctx, l, server.ServeGRPC) @@ -364,7 +363,7 @@ func setLogFormat(config *srvconfig.Config) error { TimestampFormat: log.RFC3339NanoFixed, }) default: - return errors.Errorf("unknown log format: %s", f) + return fmt.Errorf("unknown log format: %s", f) } return nil diff --git a/cmd/containerd/command/publish.go b/cmd/containerd/command/publish.go index efe0ad7c8..b18f19f7e 100644 --- a/cmd/containerd/command/publish.go +++ b/cmd/containerd/command/publish.go @@ -18,6 +18,7 @@ package command import ( gocontext "context" + "fmt" "io" "net" "os" @@ -28,7 +29,6 @@ import ( "github.com/containerd/containerd/namespaces" "github.com/containerd/containerd/pkg/dialer" "github.com/gogo/protobuf/types" - "github.com/pkg/errors" "github.com/urfave/cli" "google.golang.org/grpc" "google.golang.org/grpc/backoff" @@ -52,7 +52,7 @@ var publishCommand = cli.Command{ ctx := namespaces.WithNamespace(gocontext.Background(), context.String("namespace")) topic := context.String("topic") if topic == "" { - return errors.Wrap(errdefs.ErrInvalidArgument, "topic required to publish event") + return fmt.Errorf("topic required to publish event: %w", errdefs.ErrInvalidArgument) } payload, err := getEventPayload(os.Stdin) if err != nil { @@ -87,7 +87,7 @@ func getEventPayload(r io.Reader) (*types.Any, error) { func connectEvents(address string) (eventsapi.EventsClient, error) { conn, err := connect(address, dialer.ContextDialer) if err != nil { - return nil, errors.Wrapf(err, "failed to dial %q", address) + return nil, fmt.Errorf("failed to dial %q: %w", address, err) } return eventsapi.NewEventsClient(conn), nil } @@ -109,7 +109,7 @@ func connect(address string, d func(gocontext.Context, string) (net.Conn, error) defer cancel() conn, err := grpc.DialContext(ctx, dialer.DialAddress(address), gopts...) if err != nil { - return nil, errors.Wrapf(err, "failed to dial %q", address) + return nil, fmt.Errorf("failed to dial %q: %w", address, err) } return conn, nil } diff --git a/cmd/containerd/command/service_windows.go b/cmd/containerd/command/service_windows.go index 2e5384eaa..6b9be5f17 100644 --- a/cmd/containerd/command/service_windows.go +++ b/cmd/containerd/command/service_windows.go @@ -27,7 +27,6 @@ import ( "github.com/containerd/containerd/errdefs" "github.com/containerd/containerd/services/server" - "github.com/pkg/errors" "github.com/sirupsen/logrus" "github.com/urfave/cli" exec "golang.org/x/sys/execabs" @@ -218,7 +217,7 @@ func registerUnregisterService(root string) (bool, error) { if unregisterServiceFlag { if registerServiceFlag { - return true, errors.Wrap(errdefs.ErrInvalidArgument, "--register-service and --unregister-service cannot be used together") + return true, fmt.Errorf("--register-service and --unregister-service cannot be used together: %w", errdefs.ErrInvalidArgument) } return true, unregisterService() } @@ -242,7 +241,7 @@ func registerUnregisterService(root string) (bool, error) { // and we want to make sure stderr goes to the panic file. r, _, err := allocConsole.Call() if r == 0 && err != nil { - return true, fmt.Errorf("error allocating conhost: %s", err) + return true, fmt.Errorf("error allocating conhost: %w", err) } if err := initPanicFile(filepath.Join(root, "panic.log")); err != nil { @@ -253,7 +252,7 @@ func registerUnregisterService(root string) (bool, error) { if logFileFlag != "" { f, err := os.OpenFile(logFileFlag, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644) if err != nil { - return true, errors.Wrapf(err, "open log file %q", logFileFlag) + return true, fmt.Errorf("open log file %q: %w", logFileFlag, err) } logOutput = f } diff --git a/cmd/ctr/commands/containers/checkpoint.go b/cmd/ctr/commands/containers/checkpoint.go index 53bf70b3c..62804f486 100644 --- a/cmd/ctr/commands/containers/checkpoint.go +++ b/cmd/ctr/commands/containers/checkpoint.go @@ -17,12 +17,12 @@ package containers import ( + "errors" "fmt" "github.com/containerd/containerd" "github.com/containerd/containerd/cmd/ctr/commands" "github.com/containerd/containerd/errdefs" - "github.com/pkg/errors" "github.com/urfave/cli" ) @@ -88,7 +88,7 @@ var checkpointCommand = cli.Command{ } defer func() { if err := task.Resume(ctx); err != nil { - fmt.Println(errors.Wrap(err, "error resuming task")) + fmt.Println(fmt.Errorf("error resuming task: %w", err)) } }() } diff --git a/cmd/ctr/commands/containers/containers.go b/cmd/ctr/commands/containers/containers.go index de503c38a..1f218b5cd 100644 --- a/cmd/ctr/commands/containers/containers.go +++ b/cmd/ctr/commands/containers/containers.go @@ -31,7 +31,6 @@ import ( "github.com/containerd/containerd/errdefs" "github.com/containerd/containerd/log" "github.com/containerd/typeurl" - "github.com/pkg/errors" "github.com/urfave/cli" ) @@ -66,17 +65,17 @@ var createCommand = cli.Command{ if config { id = context.Args().First() if context.NArg() > 1 { - return errors.Wrap(errdefs.ErrInvalidArgument, "with spec config file, only container id should be provided") + return fmt.Errorf("with spec config file, only container id should be provided: %w", errdefs.ErrInvalidArgument) } } else { id = context.Args().Get(1) ref = context.Args().First() if ref == "" { - return errors.Wrap(errdefs.ErrInvalidArgument, "image ref must be provided") + return fmt.Errorf("image ref must be provided: %w", errdefs.ErrInvalidArgument) } } if id == "" { - return errors.Wrap(errdefs.ErrInvalidArgument, "container id must be provided") + return fmt.Errorf("container id must be provided: %w", errdefs.ErrInvalidArgument) } client, ctx, cancel, err := commands.NewClient(context) if err != nil { @@ -169,7 +168,7 @@ var deleteCommand = cli.Command{ } if context.NArg() == 0 { - return errors.Wrap(errdefs.ErrInvalidArgument, "must specify at least one container to delete") + return fmt.Errorf("must specify at least one container to delete: %w", errdefs.ErrInvalidArgument) } for _, arg := range context.Args() { if err := deleteContainer(ctx, client, arg, deleteOpts...); err != nil { @@ -215,7 +214,7 @@ var setLabelsCommand = cli.Command{ Action: func(context *cli.Context) error { containerID, labels := commands.ObjectWithLabelArgs(context) if containerID == "" { - return errors.Wrap(errdefs.ErrInvalidArgument, "container id must be provided") + return fmt.Errorf("container id must be provided: %w", errdefs.ErrInvalidArgument) } client, ctx, cancel, err := commands.NewClient(context) if err != nil { @@ -257,7 +256,7 @@ var infoCommand = cli.Command{ Action: func(context *cli.Context) error { id := context.Args().First() if id == "" { - return errors.Wrap(errdefs.ErrInvalidArgument, "container id must be provided") + return fmt.Errorf("container id must be provided: %w", errdefs.ErrInvalidArgument) } client, ctx, cancel, err := commands.NewClient(context) if err != nil { diff --git a/cmd/ctr/commands/containers/restore.go b/cmd/ctr/commands/containers/restore.go index 85337b34d..2847340c9 100644 --- a/cmd/ctr/commands/containers/restore.go +++ b/cmd/ctr/commands/containers/restore.go @@ -17,11 +17,12 @@ package containers import ( + "errors" + "github.com/containerd/containerd" "github.com/containerd/containerd/cio" "github.com/containerd/containerd/cmd/ctr/commands" "github.com/containerd/containerd/errdefs" - "github.com/pkg/errors" "github.com/urfave/cli" ) diff --git a/cmd/ctr/commands/content/content.go b/cmd/ctr/commands/content/content.go index 9ff52ec6c..f0458ddd5 100644 --- a/cmd/ctr/commands/content/content.go +++ b/cmd/ctr/commands/content/content.go @@ -17,6 +17,7 @@ package content import ( + "errors" "fmt" "io" "os" @@ -31,7 +32,6 @@ import ( units "github.com/docker/go-units" digest "github.com/opencontainers/go-digest" ocispec "github.com/opencontainers/image-spec/specs-go/v1" - "github.com/pkg/errors" "github.com/urfave/cli" exec "golang.org/x/sys/execabs" ) diff --git a/cmd/ctr/commands/images/convert.go b/cmd/ctr/commands/images/convert.go index 3baec0b9f..e2bcd0d1d 100644 --- a/cmd/ctr/commands/images/convert.go +++ b/cmd/ctr/commands/images/convert.go @@ -17,6 +17,7 @@ package images import ( + "errors" "fmt" "github.com/containerd/containerd/cmd/ctr/commands" @@ -24,7 +25,6 @@ import ( "github.com/containerd/containerd/images/converter/uncompress" "github.com/containerd/containerd/platforms" ocispec "github.com/opencontainers/image-spec/specs-go/v1" - "github.com/pkg/errors" "github.com/urfave/cli" ) @@ -74,7 +74,7 @@ When '--all-platforms' is given all images in a manifest list must be available. for _, ps := range pss { p, err := platforms.Parse(ps) if err != nil { - return errors.Wrapf(err, "invalid platform %q", ps) + return fmt.Errorf("invalid platform %q: %w", ps, err) } all = append(all, p) } diff --git a/cmd/ctr/commands/images/export.go b/cmd/ctr/commands/images/export.go index 41d8893b6..0a1394cb0 100644 --- a/cmd/ctr/commands/images/export.go +++ b/cmd/ctr/commands/images/export.go @@ -17,6 +17,8 @@ package images import ( + "errors" + "fmt" "io" "os" @@ -24,7 +26,6 @@ import ( "github.com/containerd/containerd/images/archive" "github.com/containerd/containerd/platforms" ocispec "github.com/opencontainers/image-spec/specs-go/v1" - "github.com/pkg/errors" "github.com/urfave/cli" ) @@ -73,7 +74,7 @@ When '--all-platforms' is given all images in a manifest list must be available. for _, ps := range pss { p, err := platforms.Parse(ps) if err != nil { - return errors.Wrapf(err, "invalid platform %q", ps) + return fmt.Errorf("invalid platform %q: %w", ps, err) } all = append(all, p) } diff --git a/cmd/ctr/commands/images/images.go b/cmd/ctr/commands/images/images.go index 077afd8f8..a7eeacb54 100644 --- a/cmd/ctr/commands/images/images.go +++ b/cmd/ctr/commands/images/images.go @@ -17,6 +17,7 @@ package images import ( + "errors" "fmt" "os" "sort" @@ -29,7 +30,6 @@ import ( "github.com/containerd/containerd/log" "github.com/containerd/containerd/pkg/progress" "github.com/containerd/containerd/platforms" - "github.com/pkg/errors" "github.com/urfave/cli" ) @@ -82,7 +82,7 @@ var listCommand = cli.Command{ ) imageList, err := imageStore.List(ctx, filters...) if err != nil { - return errors.Wrap(err, "failed to list images") + return fmt.Errorf("failed to list images: %w", err) } if quiet { for _, image := range imageList { @@ -224,7 +224,7 @@ var checkCommand = cli.Command{ args := []string(context.Args()) imageList, err := client.ListImages(ctx, args...) if err != nil { - return errors.Wrap(err, "failed listing images") + return fmt.Errorf("failed listing images: %w", err) } if len(imageList) == 0 { log.G(ctx).Debugf("no images found") @@ -248,7 +248,7 @@ var checkCommand = cli.Command{ available, required, present, missing, err := images.Check(ctx, contentStore, image.Target(), platforms.Default()) if err != nil { if exitErr == nil { - exitErr = errors.Wrapf(err, "unable to check %v", image.Name()) + exitErr = fmt.Errorf("unable to check %v: %w", image.Name(), err) } log.G(ctx).WithError(err).Errorf("unable to check %v", image.Name()) status = "error" @@ -284,7 +284,7 @@ var checkCommand = cli.Command{ unpacked, err := image.IsUnpacked(ctx, context.String("snapshotter")) if err != nil { if exitErr == nil { - exitErr = errors.Wrapf(err, "unable to check unpack for %v", image.Name()) + exitErr = fmt.Errorf("unable to check unpack for %v: %w", image.Name(), err) } log.G(ctx).WithError(err).Errorf("unable to check unpack for %v", image.Name()) } @@ -340,7 +340,7 @@ var removeCommand = cli.Command{ if err := imageStore.Delete(ctx, target, opts...); err != nil { if !errdefs.IsNotFound(err) { if exitErr == nil { - exitErr = errors.Wrapf(err, "unable to delete %v", target) + exitErr = fmt.Errorf("unable to delete %v: %w", target, err) } log.G(ctx).WithError(err).Errorf("unable to delete %v", target) continue diff --git a/cmd/ctr/commands/images/mount.go b/cmd/ctr/commands/images/mount.go index c0e03dc23..a907ad596 100644 --- a/cmd/ctr/commands/images/mount.go +++ b/cmd/ctr/commands/images/mount.go @@ -27,7 +27,6 @@ import ( "github.com/containerd/containerd/mount" "github.com/containerd/containerd/platforms" "github.com/opencontainers/image-spec/identity" - "github.com/pkg/errors" "github.com/urfave/cli" ) @@ -93,7 +92,7 @@ When you are done, use the unmount command. ps := context.String("platform") p, err := platforms.Parse(ps) if err != nil { - return errors.Wrapf(err, "unable to parse platform %s", ps) + return fmt.Errorf("unable to parse platform %s: %w", ps, err) } img, err := client.ImageService().Get(ctx, ref) @@ -103,7 +102,7 @@ When you are done, use the unmount command. i := containerd.NewImageWithPlatform(client, img, platforms.Only(p)) if err := i.Unpack(ctx, snapshotter); err != nil { - return errors.Wrap(err, "error unpacking image") + return fmt.Errorf("error unpacking image: %w", err) } diffIDs, err := i.RootFS(ctx) diff --git a/cmd/ctr/commands/images/pull.go b/cmd/ctr/commands/images/pull.go index 7a5db210f..c46dcd402 100644 --- a/cmd/ctr/commands/images/pull.go +++ b/cmd/ctr/commands/images/pull.go @@ -28,7 +28,6 @@ import ( "github.com/containerd/containerd/platforms" "github.com/opencontainers/image-spec/identity" ocispec "github.com/opencontainers/image-spec/specs-go/v1" - "github.com/pkg/errors" "github.com/urfave/cli" ) @@ -106,13 +105,13 @@ command. As part of this process, we do the following: if context.Bool("all-platforms") { p, err = images.Platforms(ctx, client.ContentStore(), img.Target) if err != nil { - return errors.Wrap(err, "unable to resolve image platforms") + return fmt.Errorf("unable to resolve image platforms: %w", err) } } else { for _, s := range context.StringSlice("platform") { ps, err := platforms.Parse(s) if err != nil { - return errors.Wrapf(err, "unable to parse platform %s", s) + return fmt.Errorf("unable to parse platform %s: %w", s, err) } p = append(p, ps) } diff --git a/cmd/ctr/commands/images/push.go b/cmd/ctr/commands/images/push.go index da9e8968b..634a1650c 100644 --- a/cmd/ctr/commands/images/push.go +++ b/cmd/ctr/commands/images/push.go @@ -18,6 +18,8 @@ package images import ( gocontext "context" + "errors" + "fmt" "net/http/httptrace" "os" "sync" @@ -35,7 +37,6 @@ import ( "github.com/containerd/containerd/remotes/docker" digest "github.com/opencontainers/go-digest" ocispec "github.com/opencontainers/image-spec/specs-go/v1" - "github.com/pkg/errors" "github.com/urfave/cli" "golang.org/x/sync/errgroup" ) @@ -88,7 +89,7 @@ var pushCommand = cli.Command{ if manifest := context.String("manifest"); manifest != "" { desc.Digest, err = digest.Parse(manifest) if err != nil { - return errors.Wrap(err, "invalid manifest digest") + return fmt.Errorf("invalid manifest digest: %w", err) } desc.MediaType = context.String("manifest-type") } else { @@ -97,14 +98,14 @@ var pushCommand = cli.Command{ } img, err := client.ImageService().Get(ctx, local) if err != nil { - return errors.Wrap(err, "unable to resolve image to manifest") + return fmt.Errorf("unable to resolve image to manifest: %w", err) } desc = img.Target if pss := context.StringSlice("platform"); len(pss) == 1 { p, err := platforms.Parse(pss[0]) if err != nil { - return errors.Wrapf(err, "invalid platform %q", pss[0]) + return fmt.Errorf("invalid platform %q: %w", pss[0], err) } cs := client.ContentStore() @@ -113,7 +114,7 @@ var pushCommand = cli.Command{ for _, manifest := range manifests { if manifest.Platform != nil && matcher.Match(*manifest.Platform) { if _, err := images.Children(ctx, cs, manifest); err != nil { - return errors.Wrap(err, "no matching manifest") + return fmt.Errorf("no matching manifest: %w", err) } desc = manifest break diff --git a/cmd/ctr/commands/images/unmount.go b/cmd/ctr/commands/images/unmount.go index 3f54f63b4..f98570d84 100644 --- a/cmd/ctr/commands/images/unmount.go +++ b/cmd/ctr/commands/images/unmount.go @@ -23,7 +23,6 @@ import ( "github.com/containerd/containerd/errdefs" "github.com/containerd/containerd/leases" "github.com/containerd/containerd/mount" - "github.com/pkg/errors" "github.com/urfave/cli" ) @@ -60,10 +59,10 @@ var unmountCommand = cli.Command{ snapshotter := context.String("snapshotter") s := client.SnapshotService(snapshotter) if err := client.LeasesService().Delete(ctx, leases.Lease{ID: target}); err != nil && !errdefs.IsNotFound(err) { - return errors.Wrap(err, "error deleting lease") + return fmt.Errorf("error deleting lease: %w", err) } if err := s.Remove(ctx, target); err != nil && !errdefs.IsNotFound(err) { - return errors.Wrap(err, "error removing snapshot") + return fmt.Errorf("error removing snapshot: %w", err) } } diff --git a/cmd/ctr/commands/leases/leases.go b/cmd/ctr/commands/leases/leases.go index d0b107dbf..1e87058e6 100644 --- a/cmd/ctr/commands/leases/leases.go +++ b/cmd/ctr/commands/leases/leases.go @@ -26,7 +26,6 @@ import ( "github.com/containerd/containerd/cmd/ctr/commands" "github.com/containerd/containerd/leases" - "github.com/pkg/errors" "github.com/urfave/cli" ) @@ -69,7 +68,7 @@ var listCommand = cli.Command{ leaseList, err := ls.List(ctx, filters...) if err != nil { - return errors.Wrap(err, "failed to list leases") + return fmt.Errorf("failed to list leases: %w", err) } if quiet { for _, l := range leaseList { diff --git a/cmd/ctr/commands/namespaces/namespaces.go b/cmd/ctr/commands/namespaces/namespaces.go index af80e953a..ddab3f58a 100644 --- a/cmd/ctr/commands/namespaces/namespaces.go +++ b/cmd/ctr/commands/namespaces/namespaces.go @@ -17,6 +17,7 @@ package namespaces import ( + "errors" "fmt" "os" "sort" @@ -26,7 +27,6 @@ import ( "github.com/containerd/containerd/cmd/ctr/commands" "github.com/containerd/containerd/errdefs" "github.com/containerd/containerd/log" - "github.com/pkg/errors" "github.com/urfave/cli" ) @@ -167,7 +167,7 @@ var removeCommand = cli.Command{ if err := namespaces.Delete(ctx, target, opts...); err != nil { if !errdefs.IsNotFound(err) { if exitErr == nil { - exitErr = errors.Wrapf(err, "unable to delete %v", target) + exitErr = fmt.Errorf("unable to delete %v: %w", target, err) } log.G(ctx).WithError(err).Errorf("unable to delete %v", target) continue diff --git a/cmd/ctr/commands/oci/oci.go b/cmd/ctr/commands/oci/oci.go index d27d02664..cbd64fee3 100644 --- a/cmd/ctr/commands/oci/oci.go +++ b/cmd/ctr/commands/oci/oci.go @@ -17,7 +17,8 @@ package oci import ( - "github.com/pkg/errors" + "fmt" + "github.com/urfave/cli" "github.com/containerd/containerd/cmd/ctr/commands" @@ -43,7 +44,7 @@ var defaultSpecCommand = cli.Command{ spec, err := oci.GenerateSpec(ctx, nil, &containers.Container{}) if err != nil { - return errors.Wrap(err, "failed to generate spec") + return fmt.Errorf("failed to generate spec: %w", err) } commands.PrintAsJSON(spec) diff --git a/cmd/ctr/commands/pprof/pprof.go b/cmd/ctr/commands/pprof/pprof.go index acaf2f908..1eafcf29a 100644 --- a/cmd/ctr/commands/pprof/pprof.go +++ b/cmd/ctr/commands/pprof/pprof.go @@ -24,7 +24,6 @@ import ( "time" "github.com/containerd/containerd/defaults" - "github.com/pkg/errors" "github.com/urfave/cli" ) @@ -183,7 +182,7 @@ func httpGetRequest(client *http.Client, request string) (io.ReadCloser, error) return nil, err } if resp.StatusCode != 200 { - return nil, errors.Errorf("http get failed with status: %s", resp.Status) + return nil, fmt.Errorf("http get failed with status: %s", resp.Status) } return resp.Body, nil } diff --git a/cmd/ctr/commands/resolver.go b/cmd/ctr/commands/resolver.go index 95c6ed609..729d51455 100644 --- a/cmd/ctr/commands/resolver.go +++ b/cmd/ctr/commands/resolver.go @@ -21,6 +21,7 @@ import ( gocontext "context" "crypto/tls" "crypto/x509" + "errors" "fmt" "io" "net/http" @@ -34,7 +35,6 @@ import ( "github.com/containerd/containerd/remotes" "github.com/containerd/containerd/remotes/docker" "github.com/containerd/containerd/remotes/docker/config" - "github.com/pkg/errors" "github.com/urfave/cli" ) @@ -46,12 +46,12 @@ func passwordPrompt() (string, error) { defer c.Reset() if err := c.DisableEcho(); err != nil { - return "", errors.Wrap(err, "failed to disable echo") + return "", fmt.Errorf("failed to disable echo: %w", err) } line, _, err := bufio.NewReader(c).ReadLine() if err != nil { - return "", errors.Wrap(err, "failed to read line") + return "", fmt.Errorf("failed to read line: %w", err) } return string(line), nil } @@ -126,7 +126,7 @@ func resolverDefaultTLS(clicontext *cli.Context) (*tls.Config, error) { if tlsRootPath := clicontext.String("tlscacert"); tlsRootPath != "" { tlsRootData, err := os.ReadFile(tlsRootPath) if err != nil { - return nil, errors.Wrapf(err, "failed to read %q", tlsRootPath) + return nil, fmt.Errorf("failed to read %q: %w", tlsRootPath, err) } config.RootCAs = x509.NewCertPool() @@ -143,7 +143,7 @@ func resolverDefaultTLS(clicontext *cli.Context) (*tls.Config, error) { } keyPair, err := tls.LoadX509KeyPair(tlsCertPath, tlsKeyPath) if err != nil { - return nil, errors.Wrapf(err, "failed to load TLS client credentials (cert=%q, key=%q)", tlsCertPath, tlsKeyPath) + return nil, fmt.Errorf("failed to load TLS client credentials (cert=%q, key=%q): %w", tlsCertPath, tlsKeyPath, err) } config.Certificates = []tls.Certificate{keyPair} } @@ -161,7 +161,7 @@ type DebugTransport struct { func (t DebugTransport) RoundTrip(req *http.Request) (*http.Response, error) { in, err := httputil.DumpRequest(req, true) if err != nil { - return nil, errors.Wrap(err, "failed to dump request") + return nil, fmt.Errorf("failed to dump request: %w", err) } if _, err := t.writer.Write(in); err != nil { @@ -175,7 +175,7 @@ func (t DebugTransport) RoundTrip(req *http.Request) (*http.Response, error) { out, err := httputil.DumpResponse(resp, true) if err != nil { - return nil, errors.Wrap(err, "failed to dump response") + return nil, fmt.Errorf("failed to dump response: %w", err) } if _, err := t.writer.Write(out); err != nil { diff --git a/cmd/ctr/commands/run/run.go b/cmd/ctr/commands/run/run.go index 2a5174f79..bf0ebfe5c 100644 --- a/cmd/ctr/commands/run/run.go +++ b/cmd/ctr/commands/run/run.go @@ -20,6 +20,7 @@ import ( "context" gocontext "context" "encoding/csv" + "errors" "fmt" "strings" @@ -34,7 +35,6 @@ import ( "github.com/containerd/containerd/oci" gocni "github.com/containerd/go-cni" specs "github.com/opencontainers/runtime-spec/specs-go" - "github.com/pkg/errors" "github.com/sirupsen/logrus" "github.com/urfave/cli" ) diff --git a/cmd/ctr/commands/run/run_unix.go b/cmd/ctr/commands/run/run_unix.go index 7641ba61b..69283e111 100644 --- a/cmd/ctr/commands/run/run_unix.go +++ b/cmd/ctr/commands/run/run_unix.go @@ -21,6 +21,7 @@ package run import ( gocontext "context" + "errors" "fmt" "os" "path/filepath" @@ -39,7 +40,6 @@ import ( "github.com/containerd/containerd/runtime/v2/runc/options" "github.com/containerd/containerd/snapshots" "github.com/opencontainers/runtime-spec/specs-go" - "github.com/pkg/errors" "github.com/sirupsen/logrus" "github.com/urfave/cli" ) @@ -204,7 +204,7 @@ func NewContainer(ctx gocontext.Context, client *containerd.Client, context *cli if context.Bool("net-host") { hostname, err := os.Hostname() if err != nil { - return nil, errors.Wrap(err, "get hostname") + return nil, fmt.Errorf("get hostname: %w", err) } opts = append(opts, oci.WithHostNamespace(specs.NetworkNamespace), @@ -417,15 +417,15 @@ func parseIDMapping(mapping string) (specs.LinuxIDMapping, error) { } cID, err := strconv.ParseUint(parts[0], 0, 32) if err != nil { - return specs.LinuxIDMapping{}, errors.Wrapf(err, "invalid container id for user namespace remapping") + return specs.LinuxIDMapping{}, fmt.Errorf("invalid container id for user namespace remapping: %w", err) } hID, err := strconv.ParseUint(parts[1], 0, 32) if err != nil { - return specs.LinuxIDMapping{}, errors.Wrapf(err, "invalid host id for user namespace remapping") + return specs.LinuxIDMapping{}, fmt.Errorf("invalid host id for user namespace remapping: %w", err) } size, err := strconv.ParseUint(parts[2], 0, 32) if err != nil { - return specs.LinuxIDMapping{}, errors.Wrapf(err, "invalid size for user namespace remapping") + return specs.LinuxIDMapping{}, fmt.Errorf("invalid size for user namespace remapping: %w", err) } return specs.LinuxIDMapping{ ContainerID: uint32(cID), diff --git a/cmd/ctr/commands/run/run_windows.go b/cmd/ctr/commands/run/run_windows.go index e12d218d8..a2d85d75e 100644 --- a/cmd/ctr/commands/run/run_windows.go +++ b/cmd/ctr/commands/run/run_windows.go @@ -18,6 +18,7 @@ package run import ( gocontext "context" + "errors" "github.com/Microsoft/hcsshim/cmd/containerd-shim-runhcs-v1/options" "github.com/containerd/console" @@ -26,7 +27,6 @@ import ( "github.com/containerd/containerd/oci" "github.com/containerd/containerd/pkg/netns" specs "github.com/opencontainers/runtime-spec/specs-go" - "github.com/pkg/errors" "github.com/sirupsen/logrus" "github.com/urfave/cli" ) diff --git a/cmd/ctr/commands/shim/shim.go b/cmd/ctr/commands/shim/shim.go index 20871d7de..36d75e338 100644 --- a/cmd/ctr/commands/shim/shim.go +++ b/cmd/ctr/commands/shim/shim.go @@ -21,6 +21,7 @@ package shim import ( gocontext "context" + "errors" "fmt" "net" "os" @@ -36,7 +37,6 @@ import ( "github.com/containerd/typeurl" ptypes "github.com/gogo/protobuf/types" "github.com/opencontainers/runtime-spec/specs-go" - "github.com/pkg/errors" "github.com/sirupsen/logrus" "github.com/urfave/cli" ) diff --git a/cmd/ctr/commands/snapshots/snapshots.go b/cmd/ctr/commands/snapshots/snapshots.go index a1ef3c1ec..d8a668691 100644 --- a/cmd/ctr/commands/snapshots/snapshots.go +++ b/cmd/ctr/commands/snapshots/snapshots.go @@ -18,6 +18,7 @@ package snapshots import ( gocontext "context" + "errors" "fmt" "io" "os" @@ -35,7 +36,6 @@ import ( "github.com/containerd/containerd/snapshots" digest "github.com/opencontainers/go-digest" ocispec "github.com/opencontainers/image-spec/specs-go/v1" - "github.com/pkg/errors" "github.com/urfave/cli" ) @@ -262,7 +262,7 @@ var removeCommand = cli.Command{ for _, key := range context.Args() { err = snapshotter.Remove(ctx, key) if err != nil { - return errors.Wrapf(err, "failed to remove %q", key) + return fmt.Errorf("failed to remove %q: %w", key, err) } } diff --git a/cmd/ctr/commands/tasks/checkpoint.go b/cmd/ctr/commands/tasks/checkpoint.go index e6d1b73bf..3271aa1cf 100644 --- a/cmd/ctr/commands/tasks/checkpoint.go +++ b/cmd/ctr/commands/tasks/checkpoint.go @@ -17,6 +17,7 @@ package tasks import ( + "errors" "fmt" "github.com/containerd/containerd" @@ -24,7 +25,6 @@ import ( "github.com/containerd/containerd/plugin" "github.com/containerd/containerd/runtime/linux/runctypes" "github.com/containerd/containerd/runtime/v2/runc/options" - "github.com/pkg/errors" "github.com/urfave/cli" ) diff --git a/cmd/ctr/commands/tasks/kill.go b/cmd/ctr/commands/tasks/kill.go index 08137507b..3aef2c9f7 100644 --- a/cmd/ctr/commands/tasks/kill.go +++ b/cmd/ctr/commands/tasks/kill.go @@ -17,10 +17,11 @@ package tasks import ( + "errors" + "github.com/containerd/containerd" "github.com/containerd/containerd/cmd/ctr/commands" "github.com/moby/sys/signal" - "github.com/pkg/errors" "github.com/urfave/cli" ) diff --git a/cmd/ctr/commands/tasks/ps.go b/cmd/ctr/commands/tasks/ps.go index 0442a1e92..cb444b3da 100644 --- a/cmd/ctr/commands/tasks/ps.go +++ b/cmd/ctr/commands/tasks/ps.go @@ -17,13 +17,13 @@ package tasks import ( + "errors" "fmt" "os" "text/tabwriter" "github.com/containerd/containerd/cmd/ctr/commands" "github.com/containerd/typeurl" - "github.com/pkg/errors" "github.com/urfave/cli" ) diff --git a/cmd/ctr/commands/tasks/start.go b/cmd/ctr/commands/tasks/start.go index de55767ee..4639c287c 100644 --- a/cmd/ctr/commands/tasks/start.go +++ b/cmd/ctr/commands/tasks/start.go @@ -17,11 +17,12 @@ package tasks import ( + "errors" + "github.com/containerd/console" "github.com/containerd/containerd" "github.com/containerd/containerd/cio" "github.com/containerd/containerd/cmd/ctr/commands" - "github.com/pkg/errors" "github.com/sirupsen/logrus" "github.com/urfave/cli" ) diff --git a/cmd/ctr/commands/tasks/tasks_unix.go b/cmd/ctr/commands/tasks/tasks_unix.go index 748ba2892..0e5311a53 100644 --- a/cmd/ctr/commands/tasks/tasks_unix.go +++ b/cmd/ctr/commands/tasks/tasks_unix.go @@ -21,6 +21,7 @@ package tasks import ( gocontext "context" + "errors" "net/url" "os" "os/signal" @@ -29,7 +30,6 @@ import ( "github.com/containerd/containerd" "github.com/containerd/containerd/cio" "github.com/containerd/containerd/log" - "github.com/pkg/errors" "github.com/urfave/cli" "golang.org/x/sys/unix" ) diff --git a/cmd/ctr/commands/tasks/tasks_windows.go b/cmd/ctr/commands/tasks/tasks_windows.go index 8905c5b86..0d5e19b37 100644 --- a/cmd/ctr/commands/tasks/tasks_windows.go +++ b/cmd/ctr/commands/tasks/tasks_windows.go @@ -18,6 +18,7 @@ package tasks import ( gocontext "context" + "errors" "net/url" "time" @@ -25,7 +26,6 @@ import ( "github.com/containerd/containerd" "github.com/containerd/containerd/cio" "github.com/containerd/containerd/log" - "github.com/pkg/errors" "github.com/urfave/cli" ) diff --git a/container.go b/container.go index d5da55e51..7d8d674c8 100644 --- a/container.go +++ b/container.go @@ -19,6 +19,7 @@ package containerd import ( "context" "encoding/json" + "fmt" "os" "path/filepath" "strings" @@ -38,7 +39,6 @@ import ( ver "github.com/opencontainers/image-spec/specs-go" ocispec "github.com/opencontainers/image-spec/specs-go/v1" "github.com/opencontainers/selinux/go-selinux/label" - "github.com/pkg/errors" ) const ( @@ -173,7 +173,7 @@ func (c *container) Spec(ctx context.Context) (*oci.Spec, error) { // an error is returned if the container has running tasks func (c *container) Delete(ctx context.Context, opts ...DeleteOpts) error { if _, err := c.loadTask(ctx, nil); err == nil { - return errors.Wrapf(errdefs.ErrFailedPrecondition, "cannot delete running task %v", c.id) + return fmt.Errorf("cannot delete running task %v: %w", c.id, errdefs.ErrFailedPrecondition) } r, err := c.get(ctx) if err != nil { @@ -198,11 +198,11 @@ func (c *container) Image(ctx context.Context) (Image, error) { return nil, err } if r.Image == "" { - return nil, errors.Wrap(errdefs.ErrNotFound, "container not created from an image") + return nil, fmt.Errorf("container not created from an image: %w", errdefs.ErrNotFound) } i, err := c.client.ImageService().Get(ctx, r.Image) if err != nil { - return nil, errors.Wrapf(err, "failed to get image %s for container", r.Image) + return nil, fmt.Errorf("failed to get image %s for container: %w", r.Image, err) } return NewImage(c.client, i), nil } @@ -232,7 +232,7 @@ func (c *container) NewTask(ctx context.Context, ioCreate cio.Creator, opts ...N } if r.SnapshotKey != "" { if r.Snapshotter == "" { - return nil, errors.Wrapf(errdefs.ErrInvalidArgument, "unable to resolve rootfs mounts without snapshotter on container") + return nil, fmt.Errorf("unable to resolve rootfs mounts without snapshotter on container: %w", errdefs.ErrInvalidArgument) } // get the rootfs from the snapshotter and add it to the request @@ -391,7 +391,7 @@ func (c *container) loadTask(ctx context.Context, ioAttach cio.Attach) (Task, er if err != nil { err = errdefs.FromGRPC(err) if errdefs.IsNotFound(err) { - return nil, errors.Wrapf(err, "no running task found") + return nil, fmt.Errorf("no running task found: %w", err) } return nil, err } diff --git a/container_checkpoint_opts.go b/container_checkpoint_opts.go index 510863681..a64ef618b 100644 --- a/container_checkpoint_opts.go +++ b/container_checkpoint_opts.go @@ -19,6 +19,7 @@ package containerd import ( "bytes" "context" + "errors" "fmt" "runtime" @@ -31,7 +32,6 @@ import ( "github.com/containerd/containerd/runtime/v2/runc/options" "github.com/containerd/typeurl" imagespec "github.com/opencontainers/image-spec/specs-go/v1" - "github.com/pkg/errors" ) var ( diff --git a/container_opts.go b/container_opts.go index 024d6e10b..4d630ea6c 100644 --- a/container_opts.go +++ b/container_opts.go @@ -19,6 +19,7 @@ package containerd import ( "context" "encoding/json" + "errors" "fmt" "github.com/containerd/containerd/containers" @@ -31,7 +32,6 @@ import ( "github.com/gogo/protobuf/types" "github.com/opencontainers/image-spec/identity" v1 "github.com/opencontainers/image-spec/specs-go/v1" - "github.com/pkg/errors" ) // DeleteOpts allows the caller to set options for the deletion of a container @@ -227,7 +227,7 @@ func WithNewSnapshot(id string, i Image, opts ...snapshots.Opt) NewContainerOpts func WithSnapshotCleanup(ctx context.Context, client *Client, c containers.Container) error { if c.SnapshotKey != "" { if c.Snapshotter == "" { - return errors.Wrapf(errdefs.ErrInvalidArgument, "container.Snapshotter must be set to cleanup rootfs snapshot") + return fmt.Errorf("container.Snapshotter must be set to cleanup rootfs snapshot: %w", errdefs.ErrInvalidArgument) } s, err := client.getSnapshotter(ctx, c.Snapshotter) if err != nil { @@ -276,15 +276,15 @@ func WithNewSnapshotView(id string, i Image, opts ...snapshots.Opt) NewContainer func WithContainerExtension(name string, extension interface{}) NewContainerOpts { return func(ctx context.Context, client *Client, c *containers.Container) error { if name == "" { - return errors.Wrapf(errdefs.ErrInvalidArgument, "extension key must not be zero-length") + return fmt.Errorf("extension key must not be zero-length: %w", errdefs.ErrInvalidArgument) } any, err := typeurl.MarshalAny(extension) if err != nil { if errors.Is(err, typeurl.ErrNotFound) { - return errors.Wrapf(err, "extension %q is not registered with the typeurl package, see `typeurl.Register`", name) + return fmt.Errorf("extension %q is not registered with the typeurl package, see `typeurl.Register`: %w", name, err) } - return errors.Wrap(err, "error marshalling extension") + return fmt.Errorf("error marshalling extension: %w", err) } if c.Extensions == nil { diff --git a/container_restore_opts.go b/container_restore_opts.go index 8150d8e69..bdc8650cd 100644 --- a/container_restore_opts.go +++ b/container_restore_opts.go @@ -18,6 +18,8 @@ package containerd import ( "context" + "errors" + "fmt" "github.com/containerd/containerd/containers" "github.com/containerd/containerd/content" @@ -26,7 +28,6 @@ import ( ptypes "github.com/gogo/protobuf/types" "github.com/opencontainers/image-spec/identity" imagespec "github.com/opencontainers/image-spec/specs-go/v1" - "github.com/pkg/errors" ) var ( @@ -92,7 +93,7 @@ func WithRestoreRuntime(ctx context.Context, id string, client *Client, checkpoi store := client.ContentStore() data, err := content.ReadBlob(ctx, store, *m) if err != nil { - return errors.Wrap(err, "unable to read checkpoint runtime") + return fmt.Errorf("unable to read checkpoint runtime: %w", err) } if err := proto.Unmarshal(data, &options); err != nil { return err @@ -117,7 +118,7 @@ func WithRestoreSpec(ctx context.Context, id string, client *Client, checkpoint store := client.ContentStore() data, err := content.ReadBlob(ctx, store, *m) if err != nil { - return errors.Wrap(err, "unable to read checkpoint config") + return fmt.Errorf("unable to read checkpoint config: %w", err) } var any ptypes.Any if err := proto.Unmarshal(data, &any); err != nil { diff --git a/content/helpers.go b/content/helpers.go index 0596d2a83..fb078d46e 100644 --- a/content/helpers.go +++ b/content/helpers.go @@ -18,6 +18,8 @@ package content import ( "context" + "errors" + "fmt" "io" "math/rand" "sync" @@ -26,7 +28,6 @@ import ( "github.com/containerd/containerd/errdefs" "github.com/opencontainers/go-digest" ocispec "github.com/opencontainers/image-spec/specs-go/v1" - "github.com/pkg/errors" ) var bufPool = sync.Pool{ @@ -76,7 +77,7 @@ func WriteBlob(ctx context.Context, cs Ingester, ref string, r io.Reader, desc o cw, err := OpenWriter(ctx, cs, WithRef(ref), WithDescriptor(desc)) if err != nil { if !errdefs.IsAlreadyExists(err) { - return errors.Wrap(err, "failed to open writer") + return fmt.Errorf("failed to open writer: %w", err) } return nil // all ready present @@ -133,28 +134,28 @@ func OpenWriter(ctx context.Context, cs Ingester, opts ...WriterOpt) (Writer, er func Copy(ctx context.Context, cw Writer, r io.Reader, size int64, expected digest.Digest, opts ...Opt) error { ws, err := cw.Status() if err != nil { - return errors.Wrap(err, "failed to get status") + return fmt.Errorf("failed to get status: %w", err) } if ws.Offset > 0 { r, err = seekReader(r, ws.Offset, size) if err != nil { - return errors.Wrapf(err, "unable to resume write to %v", ws.Ref) + return fmt.Errorf("unable to resume write to %v: %w", ws.Ref, err) } } copied, err := copyWithBuffer(cw, r) if err != nil { - return errors.Wrap(err, "failed to copy") + return fmt.Errorf("failed to copy: %w", err) } if size != 0 && copied < size-ws.Offset { // Short writes would return its own error, this indicates a read failure - return errors.Wrapf(io.ErrUnexpectedEOF, "failed to read expected number of bytes") + return fmt.Errorf("failed to read expected number of bytes: %w", io.ErrUnexpectedEOF) } if err := cw.Commit(ctx, size, expected, opts...); err != nil { if !errdefs.IsAlreadyExists(err) { - return errors.Wrapf(err, "failed commit on ref %q", ws.Ref) + return fmt.Errorf("failed commit on ref %q: %w", ws.Ref, err) } } @@ -171,11 +172,11 @@ func CopyReaderAt(cw Writer, ra ReaderAt, n int64) error { copied, err := copyWithBuffer(cw, io.NewSectionReader(ra, ws.Offset, n)) if err != nil { - return errors.Wrap(err, "failed to copy") + return fmt.Errorf("failed to copy: %w", err) } if copied < n { // Short writes would return its own error, this indicates a read failure - return errors.Wrap(io.ErrUnexpectedEOF, "failed to read expected number of bytes") + return fmt.Errorf("failed to read expected number of bytes: %w", io.ErrUnexpectedEOF) } return nil } @@ -189,13 +190,13 @@ func CopyReaderAt(cw Writer, ra ReaderAt, n int64) error { func CopyReader(cw Writer, r io.Reader) (int64, error) { ws, err := cw.Status() if err != nil { - return 0, errors.Wrap(err, "failed to get status") + return 0, fmt.Errorf("failed to get status: %w", err) } if ws.Offset > 0 { r, err = seekReader(r, ws.Offset, 0) if err != nil { - return 0, errors.Wrapf(err, "unable to resume write to %v", ws.Ref) + return 0, fmt.Errorf("unable to resume write to %v: %w", ws.Ref, err) } } @@ -211,7 +212,7 @@ func seekReader(r io.Reader, offset, size int64) (io.Reader, error) { if ok { nn, err := seeker.Seek(offset, io.SeekStart) if nn != offset { - return nil, errors.Wrapf(err, "failed to seek to offset %v", offset) + return nil, fmt.Errorf("failed to seek to offset %v: %w", offset, err) } if err != nil { @@ -231,7 +232,7 @@ func seekReader(r io.Reader, offset, size int64) (io.Reader, error) { // well then, let's just discard up to the offset n, err := copyWithBuffer(io.Discard, io.LimitReader(r, offset)) if err != nil { - return nil, errors.Wrap(err, "failed to discard to offset") + return nil, fmt.Errorf("failed to discard to offset: %w", err) } if n != offset { return nil, errors.New("unable to discard to offset") diff --git a/content/local/locks.go b/content/local/locks.go index 077b6241e..1e59f39b3 100644 --- a/content/local/locks.go +++ b/content/local/locks.go @@ -17,11 +17,11 @@ package local import ( + "fmt" "sync" "time" "github.com/containerd/containerd/errdefs" - "github.com/pkg/errors" ) // Handles locking references @@ -44,9 +44,9 @@ func tryLock(ref string) error { // Returning the duration may help developers distinguish dead locks (long duration) from // lock contentions (short duration). now := time.Now() - return errors.Wrapf( + return fmt.Errorf( + "ref %s locked for %s (since %s): %w", ref, now.Sub(v.since), v.since, errdefs.ErrUnavailable, - "ref %s locked for %s (since %s)", ref, now.Sub(v.since), v.since, ) } diff --git a/content/local/readerat.go b/content/local/readerat.go index 5d3ae0390..a83c171bb 100644 --- a/content/local/readerat.go +++ b/content/local/readerat.go @@ -17,10 +17,9 @@ package local import ( + "fmt" "os" - "github.com/pkg/errors" - "github.com/containerd/containerd/content" "github.com/containerd/containerd/errdefs" ) @@ -40,7 +39,7 @@ func OpenReader(p string) (content.ReaderAt, error) { return nil, err } - return nil, errors.Wrap(errdefs.ErrNotFound, "blob not found") + return nil, fmt.Errorf("blob not found: %w", errdefs.ErrNotFound) } fp, err := os.Open(p) @@ -49,7 +48,7 @@ func OpenReader(p string) (content.ReaderAt, error) { return nil, err } - return nil, errors.Wrap(errdefs.ErrNotFound, "blob not found") + return nil, fmt.Errorf("blob not found: %w", errdefs.ErrNotFound) } return sizeReaderAt{size: fi.Size(), fp: fp}, nil diff --git a/content/local/store.go b/content/local/store.go index c105f926e..457bbcd0e 100644 --- a/content/local/store.go +++ b/content/local/store.go @@ -36,7 +36,6 @@ import ( digest "github.com/opencontainers/go-digest" ocispec "github.com/opencontainers/image-spec/specs-go/v1" - "github.com/pkg/errors" ) var bufPool = sync.Pool{ @@ -93,13 +92,13 @@ func NewLabeledStore(root string, ls LabelStore) (content.Store, error) { func (s *store) Info(ctx context.Context, dgst digest.Digest) (content.Info, error) { p, err := s.blobPath(dgst) if err != nil { - return content.Info{}, errors.Wrapf(err, "calculating blob info path") + return content.Info{}, fmt.Errorf("calculating blob info path: %w", err) } fi, err := os.Stat(p) if err != nil { if os.IsNotExist(err) { - err = errors.Wrapf(errdefs.ErrNotFound, "content %v", dgst) + err = fmt.Errorf("content %v: %w", dgst, errdefs.ErrNotFound) } return content.Info{}, err @@ -128,12 +127,12 @@ func (s *store) info(dgst digest.Digest, fi os.FileInfo, labels map[string]strin func (s *store) ReaderAt(ctx context.Context, desc ocispec.Descriptor) (content.ReaderAt, error) { p, err := s.blobPath(desc.Digest) if err != nil { - return nil, errors.Wrapf(err, "calculating blob path for ReaderAt") + return nil, fmt.Errorf("calculating blob path for ReaderAt: %w", err) } reader, err := OpenReader(p) if err != nil { - return nil, errors.Wrapf(err, "blob %s expected at %s", desc.Digest, p) + return nil, fmt.Errorf("blob %s expected at %s: %w", desc.Digest, p, err) } return reader, nil @@ -146,7 +145,7 @@ func (s *store) ReaderAt(ctx context.Context, desc ocispec.Descriptor) (content. func (s *store) Delete(ctx context.Context, dgst digest.Digest) error { bp, err := s.blobPath(dgst) if err != nil { - return errors.Wrapf(err, "calculating blob path for delete") + return fmt.Errorf("calculating blob path for delete: %w", err) } if err := os.RemoveAll(bp); err != nil { @@ -154,7 +153,7 @@ func (s *store) Delete(ctx context.Context, dgst digest.Digest) error { return err } - return errors.Wrapf(errdefs.ErrNotFound, "content %v", dgst) + return fmt.Errorf("content %v: %w", dgst, errdefs.ErrNotFound) } return nil @@ -162,18 +161,18 @@ func (s *store) Delete(ctx context.Context, dgst digest.Digest) error { func (s *store) Update(ctx context.Context, info content.Info, fieldpaths ...string) (content.Info, error) { if s.ls == nil { - return content.Info{}, errors.Wrapf(errdefs.ErrFailedPrecondition, "update not supported on immutable content store") + return content.Info{}, fmt.Errorf("update not supported on immutable content store: %w", errdefs.ErrFailedPrecondition) } p, err := s.blobPath(info.Digest) if err != nil { - return content.Info{}, errors.Wrapf(err, "calculating blob path for update") + return content.Info{}, fmt.Errorf("calculating blob path for update: %w", err) } fi, err := os.Stat(p) if err != nil { if os.IsNotExist(err) { - err = errors.Wrapf(errdefs.ErrNotFound, "content %v", info.Digest) + err = fmt.Errorf("content %v: %w", info.Digest, errdefs.ErrNotFound) } return content.Info{}, err @@ -200,7 +199,7 @@ func (s *store) Update(ctx context.Context, info content.Info, fieldpaths ...str all = true labels = info.Labels default: - return content.Info{}, errors.Wrapf(errdefs.ErrInvalidArgument, "cannot update %q field on content info %q", path, info.Digest) + return content.Info{}, fmt.Errorf("cannot update %q field on content info %q: %w", path, info.Digest, errdefs.ErrInvalidArgument) } } } else { @@ -377,7 +376,7 @@ func (s *store) status(ingestPath string) (content.Status, error) { fi, err := os.Stat(dp) if err != nil { if os.IsNotExist(err) { - err = errors.Wrap(errdefs.ErrNotFound, err.Error()) + err = fmt.Errorf("%s: %w", err.Error(), errdefs.ErrNotFound) } return content.Status{}, err } @@ -385,19 +384,19 @@ func (s *store) status(ingestPath string) (content.Status, error) { ref, err := readFileString(filepath.Join(ingestPath, "ref")) if err != nil { if os.IsNotExist(err) { - err = errors.Wrap(errdefs.ErrNotFound, err.Error()) + err = fmt.Errorf("%s: %w", err.Error(), errdefs.ErrNotFound) } return content.Status{}, err } startedAt, err := readFileTimestamp(filepath.Join(ingestPath, "startedat")) if err != nil { - return content.Status{}, errors.Wrapf(err, "could not read startedat") + return content.Status{}, fmt.Errorf("could not read startedat: %w", err) } updatedAt, err := readFileTimestamp(filepath.Join(ingestPath, "updatedat")) if err != nil { - return content.Status{}, errors.Wrapf(err, "could not read updatedat") + return content.Status{}, fmt.Errorf("could not read updatedat: %w", err) } // because we don't write updatedat on every write, the mod time may @@ -460,7 +459,7 @@ func (s *store) Writer(ctx context.Context, opts ...content.WriterOpt) (content. // 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) } var lockErr error for count := uint64(0); count < 10; count++ { @@ -494,16 +493,16 @@ func (s *store) resumeStatus(ref string, total int64, digester digest.Digester) path, _, data := s.ingestPaths(ref) status, err := s.status(path) if err != nil { - return status, errors.Wrap(err, "failed reading status of resume write") + return status, fmt.Errorf("failed reading status of resume write: %w", err) } if ref != status.Ref { // NOTE(stevvooe): This is fairly catastrophic. Either we have some // layout corruption or a hash collision for the ref key. - return status, errors.Errorf("ref key does not match: %v != %v", ref, status.Ref) + return status, fmt.Errorf("ref key does not match: %v != %v", ref, status.Ref) } if total > 0 && status.Total > 0 && total != status.Total { - return status, errors.Errorf("provided total differs from status: %v != %v", total, status.Total) + return status, fmt.Errorf("provided total differs from status: %v != %v", total, status.Total) } // TODO(stevvooe): slow slow slow!!, send to goroutine or use resumable hashes @@ -527,10 +526,10 @@ func (s *store) writer(ctx context.Context, ref string, total int64, expected di if expected != "" { p, err := s.blobPath(expected) if err != nil { - return nil, errors.Wrap(err, "calculating expected blob path for writer") + return nil, fmt.Errorf("calculating expected blob path for writer: %w", err) } if _, err := os.Stat(p); err == nil { - return nil, errors.Wrapf(errdefs.ErrAlreadyExists, "content %v", expected) + return nil, fmt.Errorf("content %v: %w", expected, errdefs.ErrAlreadyExists) } } @@ -588,12 +587,12 @@ func (s *store) writer(ctx context.Context, ref string, total int64, expected di fp, err := os.OpenFile(data, os.O_WRONLY|os.O_CREATE, 0666) if err != nil { - return nil, errors.Wrap(err, "failed to open data file") + return nil, fmt.Errorf("failed to open data file: %w", err) } if _, err := fp.Seek(offset, io.SeekStart); err != nil { fp.Close() - return nil, errors.Wrap(err, "could not seek to current write offset") + return nil, fmt.Errorf("could not seek to current write offset: %w", err) } return &writer{ @@ -615,7 +614,7 @@ func (s *store) Abort(ctx context.Context, ref string) error { root := s.ingestRoot(ref) if err := os.RemoveAll(root); err != nil { if os.IsNotExist(err) { - return errors.Wrapf(errdefs.ErrNotFound, "ingest ref %q", ref) + return fmt.Errorf("ingest ref %q: %w", ref, errdefs.ErrNotFound) } return err @@ -626,7 +625,7 @@ func (s *store) Abort(ctx context.Context, ref string) error { func (s *store) blobPath(dgst digest.Digest) (string, error) { if err := dgst.Validate(); err != nil { - return "", errors.Wrapf(errdefs.ErrInvalidArgument, "cannot calculate blob path from invalid digest: %v", err) + return "", fmt.Errorf("cannot calculate blob path from invalid digest: %v: %w", err, errdefs.ErrInvalidArgument) } return filepath.Join(s.root, "blobs", dgst.Algorithm().String(), dgst.Hex()), nil @@ -665,14 +664,14 @@ func readFileTimestamp(p string) (time.Time, error) { b, err := os.ReadFile(p) if err != nil { if os.IsNotExist(err) { - err = errors.Wrap(errdefs.ErrNotFound, err.Error()) + err = fmt.Errorf("%s: %w", err.Error(), errdefs.ErrNotFound) } return time.Time{}, err } var t time.Time if err := t.UnmarshalText(b); err != nil { - return time.Time{}, errors.Wrapf(err, "could not parse timestamp file %v", p) + return time.Time{}, fmt.Errorf("could not parse timestamp file %v: %w", p, err) } return t, nil @@ -690,16 +689,16 @@ func writeToCompletion(path string, data []byte, mode os.FileMode) error { tmp := fmt.Sprintf("%s.tmp", path) f, err := os.OpenFile(tmp, os.O_RDWR|os.O_CREATE|os.O_TRUNC|os.O_SYNC, mode) if err != nil { - return errors.Wrap(err, "create tmp file") + return fmt.Errorf("create tmp file: %w", err) } _, err = f.Write(data) f.Close() if err != nil { - return errors.Wrap(err, "write tmp file") + return fmt.Errorf("write tmp file: %w", err) } err = os.Rename(tmp, path) if err != nil { - return errors.Wrap(err, "rename tmp file") + return fmt.Errorf("rename tmp file: %w", err) } return nil } diff --git a/content/local/writer.go b/content/local/writer.go index a61394ea2..2f5f8dcf4 100644 --- a/content/local/writer.go +++ b/content/local/writer.go @@ -18,6 +18,8 @@ package local import ( "context" + "errors" + "fmt" "io" "os" "path/filepath" @@ -28,7 +30,6 @@ import ( "github.com/containerd/containerd/errdefs" "github.com/containerd/containerd/log" "github.com/opencontainers/go-digest" - "github.com/pkg/errors" ) // writer represents a write transaction against the blob store. @@ -88,30 +89,30 @@ func (w *writer) Commit(ctx context.Context, size int64, expected digest.Digest, w.fp = nil if fp == nil { - return errors.Wrap(errdefs.ErrFailedPrecondition, "cannot commit on closed writer") + return fmt.Errorf("cannot commit on closed writer: %w", errdefs.ErrFailedPrecondition) } if err := fp.Sync(); err != nil { fp.Close() - return errors.Wrap(err, "sync failed") + return fmt.Errorf("sync failed: %w", err) } fi, err := fp.Stat() closeErr := fp.Close() if err != nil { - return errors.Wrap(err, "stat on ingest file failed") + return fmt.Errorf("stat on ingest file failed: %w", err) } if closeErr != nil { - return errors.Wrap(err, "failed to close ingest file") + return fmt.Errorf("failed to close ingest file: %w", err) } if size > 0 && size != fi.Size() { - return errors.Wrapf(errdefs.ErrFailedPrecondition, "unexpected commit size %d, expected %d", fi.Size(), size) + return fmt.Errorf("unexpected commit size %d, expected %d: %w", fi.Size(), size, errdefs.ErrFailedPrecondition) } dgst := w.digester.Digest() if expected != "" && expected != dgst { - return errors.Wrapf(errdefs.ErrFailedPrecondition, "unexpected commit digest %s, expected %s", dgst, expected) + return fmt.Errorf("unexpected commit digest %s, expected %s: %w", dgst, expected, errdefs.ErrFailedPrecondition) } var ( @@ -129,7 +130,7 @@ func (w *writer) Commit(ctx context.Context, size int64, expected digest.Digest, if err := os.RemoveAll(w.path); err != nil { log.G(ctx).WithField("ref", w.ref).WithField("path", w.path).Error("failed to remove ingest directory") } - return errors.Wrapf(errdefs.ErrAlreadyExists, "content %v", dgst) + return fmt.Errorf("content %v: %w", dgst, errdefs.ErrAlreadyExists) } if err := os.Rename(ingest, target); err != nil { diff --git a/content/proxy/content_writer.go b/content/proxy/content_writer.go index 842333598..ffc0f50ea 100644 --- a/content/proxy/content_writer.go +++ b/content/proxy/content_writer.go @@ -18,13 +18,13 @@ package proxy import ( "context" + "fmt" "io" contentapi "github.com/containerd/containerd/api/services/content/v1" "github.com/containerd/containerd/content" "github.com/containerd/containerd/errdefs" digest "github.com/opencontainers/go-digest" - "github.com/pkg/errors" ) type remoteWriter struct { @@ -57,7 +57,7 @@ func (rw *remoteWriter) Status() (content.Status, error) { Action: contentapi.WriteActionStat, }) if err != nil { - return content.Status{}, errors.Wrap(errdefs.FromGRPC(err), "error getting writer status") + return content.Status{}, fmt.Errorf("error getting writer status: %w", errdefs.FromGRPC(err)) } return content.Status{ @@ -82,7 +82,7 @@ func (rw *remoteWriter) Write(p []byte) (n int, err error) { Data: p, }) if err != nil { - return 0, errors.Wrap(errdefs.FromGRPC(err), "failed to send write") + return 0, fmt.Errorf("failed to send write: %w", errdefs.FromGRPC(err)) } n = int(resp.Offset - offset) @@ -119,15 +119,15 @@ func (rw *remoteWriter) Commit(ctx context.Context, size int64, expected digest. Labels: base.Labels, }) if err != nil { - return errors.Wrap(errdefs.FromGRPC(err), "commit failed") + return fmt.Errorf("commit failed: %w", errdefs.FromGRPC(err)) } if size != 0 && resp.Offset != size { - return errors.Errorf("unexpected size: %v != %v", resp.Offset, size) + return fmt.Errorf("unexpected size: %v != %v", resp.Offset, size) } if expected != "" && resp.Digest != expected { - return errors.Errorf("unexpected digest: %v != %v", resp.Digest, expected) + return fmt.Errorf("unexpected digest: %v != %v", resp.Digest, expected) } rw.digest = resp.Digest diff --git a/content/testsuite/testsuite.go b/content/testsuite/testsuite.go index 0ec0b2e62..c02498f4e 100644 --- a/content/testsuite/testsuite.go +++ b/content/testsuite/testsuite.go @@ -34,7 +34,6 @@ import ( "github.com/containerd/containerd/pkg/testutil" digest "github.com/opencontainers/go-digest" ocispec "github.com/opencontainers/image-spec/specs-go/v1" - "github.com/pkg/errors" "gotest.tools/v3/assert" ) @@ -712,35 +711,47 @@ func checkResume(rf func(context.Context, content.Writer, []byte, int64, int64, func resumeTruncate(ctx context.Context, w content.Writer, b []byte, written, size int64, dgst digest.Digest) error { if err := w.Truncate(0); err != nil { - return errors.Wrap(err, "truncate failed") + return fmt.Errorf("truncate failed: %w", err) } if _, err := io.CopyBuffer(w, bytes.NewReader(b), make([]byte, 1024)); err != nil { - return errors.Wrap(err, "write failed") + return fmt.Errorf("write failed: %w", err) } - - return errors.Wrap(w.Commit(ctx, size, dgst), "commit failed") + if err := w.Commit(ctx, size, dgst); err != nil { + return fmt.Errorf("commit failed: %w", err) + } + return nil } func resumeDiscard(ctx context.Context, w content.Writer, b []byte, written, size int64, dgst digest.Digest) error { if _, err := io.CopyBuffer(w, bytes.NewReader(b[written:]), make([]byte, 1024)); err != nil { - return errors.Wrap(err, "write failed") + return fmt.Errorf("write failed: %w", err) } - return errors.Wrap(w.Commit(ctx, size, dgst), "commit failed") + if err := w.Commit(ctx, size, dgst); err != nil { + return fmt.Errorf("commit failed: %w", err) + + } + return nil } func resumeCopy(ctx context.Context, w content.Writer, b []byte, _, size int64, dgst digest.Digest) error { r := struct { io.Reader }{bytes.NewReader(b)} - return errors.Wrap(content.Copy(ctx, w, r, size, dgst), "copy failed") + if err := content.Copy(ctx, w, r, size, dgst); err != nil { + return fmt.Errorf("copy failed: %w", err) + } + return nil } func resumeCopySeeker(ctx context.Context, w content.Writer, b []byte, _, size int64, dgst digest.Digest) error { r := struct { io.ReadSeeker }{bytes.NewReader(b)} - return errors.Wrap(content.Copy(ctx, w, r, size, dgst), "copy failed") + if err := content.Copy(ctx, w, r, size, dgst); err != nil { + return fmt.Errorf("copy failed: %w", err) + } + return nil } func resumeCopyReaderAt(ctx context.Context, w content.Writer, b []byte, _, size int64, dgst digest.Digest) error { @@ -751,7 +762,10 @@ func resumeCopyReaderAt(ctx context.Context, w content.Writer, b []byte, _, size r := struct { readerAt }{bytes.NewReader(b)} - return errors.Wrap(content.Copy(ctx, w, r, size, dgst), "copy failed") + if err := content.Copy(ctx, w, r, size, dgst); err != nil { + return fmt.Errorf("copy failed: %w", err) + } + return nil } // checkSmallBlob tests reading a blob which is smaller than the read size. @@ -1018,35 +1032,35 @@ func checkNewlyCreated(t *testing.T, w content.Writer, preStart, postStart, preU func checkInfo(ctx context.Context, cs content.Store, d digest.Digest, expected content.Info, c1, c2, u1, u2 time.Time) error { info, err := cs.Info(ctx, d) if err != nil { - return errors.Wrap(err, "failed to get info") + return fmt.Errorf("failed to get info: %w", err) } if info.Digest != d { - return errors.Errorf("unexpected info digest %s, expected %s", info.Digest, d) + return fmt.Errorf("unexpected info digest %s, expected %s", info.Digest, d) } if info.Size != expected.Size { - return errors.Errorf("unexpected info size %d, expected %d", info.Size, expected.Size) + return fmt.Errorf("unexpected info size %d, expected %d", info.Size, expected.Size) } if info.CreatedAt.After(c2) || info.CreatedAt.Before(c1) { - return errors.Errorf("unexpected created at time %s, expected between %s and %s", info.CreatedAt, c1, c2) + return fmt.Errorf("unexpected created at time %s, expected between %s and %s", info.CreatedAt, c1, c2) } // FIXME: broken on windows: unexpected updated at time 2017-11-14 13:43:22.178013 -0800 PST, // expected between 2017-11-14 13:43:22.1790195 -0800 PST m=+1.022137300 and // 2017-11-14 13:43:22.1790195 -0800 PST m=+1.022137300 if runtime.GOOS != "windows" && (info.UpdatedAt.After(u2) || info.UpdatedAt.Before(u1)) { - return errors.Errorf("unexpected updated at time %s, expected between %s and %s", info.UpdatedAt, u1, u2) + return fmt.Errorf("unexpected updated at time %s, expected between %s and %s", info.UpdatedAt, u1, u2) } if len(info.Labels) != len(expected.Labels) { - return errors.Errorf("mismatched number of labels\ngot:\n%#v\nexpected:\n%#v", info.Labels, expected.Labels) + return fmt.Errorf("mismatched number of labels\ngot:\n%#v\nexpected:\n%#v", info.Labels, expected.Labels) } for k, v := range expected.Labels { actual := info.Labels[k] if v != actual { - return errors.Errorf("unexpected value for label %q: %q, expected %q", k, actual, v) + return fmt.Errorf("unexpected value for label %q: %q, expected %q", k, actual, v) } } @@ -1059,16 +1073,16 @@ func checkContent(ctx context.Context, cs content.Store, d digest.Digest, expect b, err := content.ReadBlob(ctx, cs, ocispec.Descriptor{Digest: d}) if err != nil { - return errors.Wrap(err, "failed to read blob") + return fmt.Errorf("failed to read blob: %w", err) } if int64(len(b)) != expected.Size { - return errors.Errorf("wrong blob size %d, expected %d", len(b), expected.Size) + return fmt.Errorf("wrong blob size %d, expected %d", len(b), expected.Size) } actual := digest.FromBytes(b) if actual != d { - return errors.Errorf("wrong digest %s, expected %s", actual, d) + return fmt.Errorf("wrong digest %s, expected %s", actual, d) } return nil diff --git a/contrib/apparmor/apparmor.go b/contrib/apparmor/apparmor.go index 343043980..be6a49a39 100644 --- a/contrib/apparmor/apparmor.go +++ b/contrib/apparmor/apparmor.go @@ -22,12 +22,12 @@ package apparmor import ( "bytes" "context" + "fmt" "os" "github.com/containerd/containerd/containers" "github.com/containerd/containerd/oci" specs "github.com/opencontainers/runtime-spec/specs-go" - "github.com/pkg/errors" ) // WithProfile sets the provided apparmor profile to the spec @@ -76,7 +76,7 @@ func LoadDefaultProfile(name string) error { return err } if err := load(path); err != nil { - return errors.Wrapf(err, "load apparmor profile %s", path) + return fmt.Errorf("load apparmor profile %s: %w", path, err) } return nil } diff --git a/contrib/apparmor/apparmor_unsupported.go b/contrib/apparmor/apparmor_unsupported.go index 239ca5e38..ac00fd178 100644 --- a/contrib/apparmor/apparmor_unsupported.go +++ b/contrib/apparmor/apparmor_unsupported.go @@ -21,11 +21,11 @@ package apparmor import ( "context" + "errors" "github.com/containerd/containerd/containers" "github.com/containerd/containerd/oci" specs "github.com/opencontainers/runtime-spec/specs-go" - "github.com/pkg/errors" ) // WithProfile sets the provided apparmor profile to the spec diff --git a/contrib/apparmor/template.go b/contrib/apparmor/template.go index 89bf7786c..df3f72e78 100644 --- a/contrib/apparmor/template.go +++ b/contrib/apparmor/template.go @@ -31,7 +31,6 @@ import ( "strings" "text/template" - "github.com/pkg/errors" exec "golang.org/x/sys/execabs" ) @@ -125,7 +124,7 @@ func loadData(name string) (*data, error) { } ver, err := getVersion() if err != nil { - return nil, errors.Wrap(err, "get apparmor_parser version") + return nil, fmt.Errorf("get apparmor_parser version: %w", err) } p.Version = ver @@ -152,7 +151,7 @@ func generate(p *data, o io.Writer) error { func load(path string) error { out, err := aaParser("-Kr", path) if err != nil { - return errors.Errorf("%s: %s", err, out) + return fmt.Errorf("%s: %s", err, out) } return nil } diff --git a/diff/apply/apply.go b/diff/apply/apply.go index 937d02ce8..d4b34238c 100644 --- a/diff/apply/apply.go +++ b/diff/apply/apply.go @@ -18,6 +18,7 @@ package apply import ( "context" + "fmt" "io" "time" @@ -27,7 +28,6 @@ import ( "github.com/containerd/containerd/mount" digest "github.com/opencontainers/go-digest" ocispec "github.com/opencontainers/image-spec/specs-go/v1" - "github.com/pkg/errors" "github.com/sirupsen/logrus" ) @@ -64,13 +64,13 @@ func (s *fsApplier) Apply(ctx context.Context, desc ocispec.Descriptor, mounts [ var config diff.ApplyConfig for _, o := range opts { if err := o(ctx, desc, &config); err != nil { - return emptyDesc, errors.Wrap(err, "failed to apply config opt") + return emptyDesc, fmt.Errorf("failed to apply config opt: %w", err) } } ra, err := s.store.ReaderAt(ctx, desc) if err != nil { - return emptyDesc, errors.Wrap(err, "failed to get reader from content store") + return emptyDesc, fmt.Errorf("failed to get reader from content store: %w", err) } defer ra.Close() @@ -79,7 +79,7 @@ func (s *fsApplier) Apply(ctx context.Context, desc ocispec.Descriptor, mounts [ processors = append(processors, processor) for { if processor, err = diff.GetProcessor(ctx, processor, config.ProcessorPayloads); err != nil { - return emptyDesc, errors.Wrapf(err, "failed to get stream processor for %s", desc.MediaType) + return emptyDesc, fmt.Errorf("failed to get stream processor for %s: %w", desc.MediaType, err) } processors = append(processors, processor) if processor.MediaType() == ocispec.MediaTypeImageLayer { diff --git a/diff/apply/apply_linux.go b/diff/apply/apply_linux.go index 7f805b5f6..55602db62 100644 --- a/diff/apply/apply_linux.go +++ b/diff/apply/apply_linux.go @@ -18,6 +18,7 @@ package apply import ( "context" + "fmt" "io" "strings" @@ -25,7 +26,6 @@ import ( "github.com/containerd/containerd/errdefs" "github.com/containerd/containerd/mount" "github.com/containerd/containerd/pkg/userns" - "github.com/pkg/errors" ) func apply(ctx context.Context, mounts []mount.Mount, r io.Reader) error { @@ -86,7 +86,7 @@ func getOverlayPath(options []string) (upper string, lower []string, err error) } } if upper == "" { - return "", nil, errors.Wrap(errdefs.ErrInvalidArgument, "upperdir not found") + return "", nil, fmt.Errorf("upperdir not found: %w", errdefs.ErrInvalidArgument) } return @@ -111,22 +111,22 @@ func getAufsPath(options []string) (upper string, lower []string, err error) { for _, b := range strings.Split(o, sep) { if strings.HasSuffix(b, rwSuffix) { if upper != "" { - return "", nil, errors.Wrap(errdefs.ErrInvalidArgument, "multiple rw branch found") + return "", nil, fmt.Errorf("multiple rw branch found: %w", errdefs.ErrInvalidArgument) } upper = strings.TrimSuffix(b, rwSuffix) } else if strings.HasSuffix(b, roSuffix) { if upper == "" { - return "", nil, errors.Wrap(errdefs.ErrInvalidArgument, "rw branch be first") + return "", nil, fmt.Errorf("rw branch be first: %w", errdefs.ErrInvalidArgument) } lower = append(lower, strings.TrimSuffix(b, roSuffix)) } else { - return "", nil, errors.Wrap(errdefs.ErrInvalidArgument, "unhandled aufs suffix") + return "", nil, fmt.Errorf("unhandled aufs suffix: %w", errdefs.ErrInvalidArgument) } } } if upper == "" { - return "", nil, errors.Wrap(errdefs.ErrInvalidArgument, "rw branch not found") + return "", nil, fmt.Errorf("rw branch not found: %w", errdefs.ErrInvalidArgument) } return } diff --git a/diff/lcow/lcow.go b/diff/lcow/lcow.go index c72efa89e..3fa19fe6f 100644 --- a/diff/lcow/lcow.go +++ b/diff/lcow/lcow.go @@ -21,6 +21,7 @@ package lcow import ( "context" + "fmt" "io" "os" "path" @@ -38,7 +39,6 @@ import ( "github.com/containerd/containerd/plugin" digest "github.com/opencontainers/go-digest" ocispec "github.com/opencontainers/image-spec/specs-go/v1" - "github.com/pkg/errors" "github.com/sirupsen/logrus" ) @@ -111,7 +111,7 @@ func (s windowsLcowDiff) Apply(ctx context.Context, desc ocispec.Descriptor, mou var config diff.ApplyConfig for _, o := range opts { if err := o(ctx, desc, &config); err != nil { - return emptyDesc, errors.Wrap(err, "failed to apply config opt") + return emptyDesc, fmt.Errorf("failed to apply config opt: %w", err) } } @@ -122,14 +122,14 @@ func (s windowsLcowDiff) Apply(ctx context.Context, desc ocispec.Descriptor, mou ra, err := s.store.ReaderAt(ctx, desc) if err != nil { - return emptyDesc, errors.Wrap(err, "failed to get reader from content store") + return emptyDesc, fmt.Errorf("failed to get reader from content store: %w", err) } defer ra.Close() processor := diff.NewProcessorChain(desc.MediaType, content.NewReader(ra)) for { if processor, err = diff.GetProcessor(ctx, processor, config.ProcessorPayloads); err != nil { - return emptyDesc, errors.Wrapf(err, "failed to get stream processor for %s", desc.MediaType) + return emptyDesc, fmt.Errorf("failed to get stream processor for %s: %w", desc.MediaType, err) } if processor.MediaType() == ocispec.MediaTypeImageLayer { break @@ -157,11 +157,11 @@ func (s windowsLcowDiff) Apply(ctx context.Context, desc ocispec.Descriptor, mou err = tar2ext4.Convert(rc, outFile, tar2ext4.ConvertWhiteout, tar2ext4.AppendVhdFooter, tar2ext4.MaximumDiskSize(maxLcowVhdSizeGB)) if err != nil { - return emptyDesc, errors.Wrapf(err, "failed to convert tar2ext4 vhd") + return emptyDesc, fmt.Errorf("failed to convert tar2ext4 vhd: %w", err) } err = outFile.Sync() if err != nil { - return emptyDesc, errors.Wrapf(err, "failed to sync tar2ext4 vhd to disk") + return emptyDesc, fmt.Errorf("failed to sync tar2ext4 vhd to disk: %w", err) } outFile.Close() @@ -172,7 +172,7 @@ func (s windowsLcowDiff) Apply(ctx context.Context, desc ocispec.Descriptor, mou err = security.GrantVmGroupAccess(layerPath) if err != nil { - return emptyDesc, errors.Wrapf(err, "failed GrantVmGroupAccess on layer vhd: %v", layerPath) + return emptyDesc, fmt.Errorf("failed GrantVmGroupAccess on layer vhd: %v: %w", layerPath, err) } return ocispec.Descriptor{ @@ -185,7 +185,7 @@ func (s windowsLcowDiff) Apply(ctx context.Context, desc ocispec.Descriptor, mou // Compare creates a diff between the given mounts and uploads the result // to the content store. func (s windowsLcowDiff) Compare(ctx context.Context, lower, upper []mount.Mount, opts ...diff.Opt) (d ocispec.Descriptor, err error) { - return emptyDesc, errors.Wrap(errdefs.ErrNotImplemented, "windowsLcowDiff does not implement Compare method") + return emptyDesc, fmt.Errorf("windowsLcowDiff does not implement Compare method: %w", errdefs.ErrNotImplemented) } type readCounter struct { @@ -201,11 +201,11 @@ func (rc *readCounter) Read(p []byte) (n int, err error) { func mountsToLayerAndParents(mounts []mount.Mount) (string, []string, error) { if len(mounts) != 1 { - return "", nil, errors.Wrap(errdefs.ErrInvalidArgument, "number of mounts should always be 1 for Windows lcow-layers") + return "", nil, fmt.Errorf("number of mounts should always be 1 for Windows lcow-layers: %w", errdefs.ErrInvalidArgument) } mnt := mounts[0] if mnt.Type != "lcow-layer" { - return "", nil, errors.Wrap(errdefs.ErrInvalidArgument, "mount layer type must be lcow-layer") + return "", nil, fmt.Errorf("mount layer type must be lcow-layer: %w", errdefs.ErrInvalidArgument) } parentLayerPaths, err := mnt.GetParentPaths() diff --git a/diff/stream.go b/diff/stream.go index 655f9ce83..44e35fcc8 100644 --- a/diff/stream.go +++ b/diff/stream.go @@ -18,6 +18,7 @@ package diff import ( "context" + "errors" "io" "os" @@ -25,7 +26,6 @@ import ( "github.com/containerd/containerd/images" "github.com/gogo/protobuf/types" ocispec "github.com/opencontainers/image-spec/specs-go/v1" - "github.com/pkg/errors" ) var ( diff --git a/diff/stream_unix.go b/diff/stream_unix.go index fd8adc223..6622c331e 100644 --- a/diff/stream_unix.go +++ b/diff/stream_unix.go @@ -22,6 +22,7 @@ package diff import ( "bytes" "context" + "errors" "fmt" "io" "os" @@ -29,7 +30,6 @@ import ( "github.com/gogo/protobuf/proto" "github.com/gogo/protobuf/types" - "github.com/pkg/errors" exec "golang.org/x/sys/execabs" ) diff --git a/diff/stream_windows.go b/diff/stream_windows.go index 3058bd251..c0bf03b94 100644 --- a/diff/stream_windows.go +++ b/diff/stream_windows.go @@ -19,6 +19,7 @@ package diff import ( "bytes" "context" + "errors" "fmt" "io" "os" @@ -28,7 +29,6 @@ import ( winio "github.com/Microsoft/go-winio" "github.com/gogo/protobuf/proto" "github.com/gogo/protobuf/types" - "github.com/pkg/errors" "github.com/sirupsen/logrus" exec "golang.org/x/sys/execabs" ) diff --git a/diff/walking/differ.go b/diff/walking/differ.go index c5d142bbd..a24c72273 100644 --- a/diff/walking/differ.go +++ b/diff/walking/differ.go @@ -19,6 +19,7 @@ package walking import ( "context" "encoding/base64" + "errors" "fmt" "io" "math/rand" @@ -33,7 +34,6 @@ import ( "github.com/containerd/containerd/mount" digest "github.com/opencontainers/go-digest" ocispec "github.com/opencontainers/image-spec/specs-go/v1" - "github.com/pkg/errors" ) type walkingDiff struct { @@ -81,7 +81,7 @@ func (s *walkingDiff) Compare(ctx context.Context, lower, upper []mount.Mount, o case ocispec.MediaTypeImageLayerGzip: isCompressed = true default: - return emptyDesc, errors.Wrapf(errdefs.ErrNotImplemented, "unsupported diff media type: %v", config.MediaType) + return emptyDesc, fmt.Errorf("unsupported diff media type: %v: %w", config.MediaType, errdefs.ErrNotImplemented) } } @@ -100,7 +100,7 @@ func (s *walkingDiff) Compare(ctx context.Context, lower, upper []mount.Mount, o MediaType: config.MediaType, // most contentstore implementations just ignore this })) if err != nil { - return errors.Wrap(err, "failed to open writer") + return fmt.Errorf("failed to open writer: %w", err) } // errOpen is set when an error occurs while the content writer has not been @@ -128,18 +128,18 @@ func (s *walkingDiff) Compare(ctx context.Context, lower, upper []mount.Mount, o if config.Compressor != nil { compressed, errOpen = config.Compressor(cw, config.MediaType) if errOpen != nil { - return errors.Wrap(errOpen, "failed to get compressed stream") + return fmt.Errorf("failed to get compressed stream: %w", errOpen) } } else { compressed, errOpen = compression.CompressStream(cw, compression.Gzip) if errOpen != nil { - return errors.Wrap(errOpen, "failed to get compressed stream") + return fmt.Errorf("failed to get compressed stream: %w", errOpen) } } errOpen = archive.WriteDiff(ctx, io.MultiWriter(compressed, dgstr.Hash()), lowerRoot, upperRoot) compressed.Close() if errOpen != nil { - return errors.Wrap(errOpen, "failed to write compressed diff") + return fmt.Errorf("failed to write compressed diff: %w", errOpen) } if config.Labels == nil { @@ -148,7 +148,7 @@ func (s *walkingDiff) Compare(ctx context.Context, lower, upper []mount.Mount, o config.Labels[uncompressed] = dgstr.Digest().String() } else { if errOpen = archive.WriteDiff(ctx, cw, lowerRoot, upperRoot); errOpen != nil { - return errors.Wrap(errOpen, "failed to write diff") + return fmt.Errorf("failed to write diff: %w", errOpen) } } @@ -160,14 +160,14 @@ func (s *walkingDiff) Compare(ctx context.Context, lower, upper []mount.Mount, o dgst := cw.Digest() if errOpen = cw.Commit(ctx, 0, dgst, commitopts...); errOpen != nil { if !errdefs.IsAlreadyExists(errOpen) { - return errors.Wrap(errOpen, "failed to commit") + return fmt.Errorf("failed to commit: %w", errOpen) } errOpen = nil } info, err := s.store.Info(ctx, dgst) if err != nil { - return errors.Wrap(err, "failed to get info from content store") + return fmt.Errorf("failed to get info from content store: %w", err) } if info.Labels == nil { info.Labels = make(map[string]string) @@ -176,7 +176,7 @@ func (s *walkingDiff) Compare(ctx context.Context, lower, upper []mount.Mount, o if _, ok := info.Labels[uncompressed]; !ok { info.Labels[uncompressed] = config.Labels[uncompressed] if _, err := s.store.Update(ctx, info, "labels."+uncompressed); err != nil { - return errors.Wrap(err, "error setting uncompressed label") + return fmt.Errorf("error setting uncompressed label: %w", err) } } diff --git a/diff/windows/windows.go b/diff/windows/windows.go index 032163b64..97afb5a5f 100644 --- a/diff/windows/windows.go +++ b/diff/windows/windows.go @@ -40,7 +40,6 @@ import ( "github.com/containerd/containerd/plugin" digest "github.com/opencontainers/go-digest" ocispec "github.com/opencontainers/image-spec/specs-go/v1" - "github.com/pkg/errors" "github.com/sirupsen/logrus" ) @@ -106,20 +105,20 @@ func (s windowsDiff) Apply(ctx context.Context, desc ocispec.Descriptor, mounts var config diff.ApplyConfig for _, o := range opts { if err := o(ctx, desc, &config); err != nil { - return emptyDesc, errors.Wrap(err, "failed to apply config opt") + return emptyDesc, fmt.Errorf("failed to apply config opt: %w", err) } } ra, err := s.store.ReaderAt(ctx, desc) if err != nil { - return emptyDesc, errors.Wrap(err, "failed to get reader from content store") + return emptyDesc, fmt.Errorf("failed to get reader from content store: %w", err) } defer ra.Close() processor := diff.NewProcessorChain(desc.MediaType, content.NewReader(ra)) for { if processor, err = diff.GetProcessor(ctx, processor, config.ProcessorPayloads); err != nil { - return emptyDesc, errors.Wrapf(err, "failed to get stream processor for %s", desc.MediaType) + return emptyDesc, fmt.Errorf("failed to get stream processor for %s: %w", desc.MediaType, err) } if processor.MediaType() == ocispec.MediaTypeImageLayer { break @@ -188,7 +187,7 @@ func (s windowsDiff) Compare(ctx context.Context, lower, upper []mount.Mount, op case ocispec.MediaTypeImageLayerGzip: isCompressed = true default: - return emptyDesc, errors.Wrapf(errdefs.ErrNotImplemented, "unsupported diff media type: %v", config.MediaType) + return emptyDesc, fmt.Errorf("unsupported diff media type: %v: %w", config.MediaType, errdefs.ErrNotImplemented) } newReference := false @@ -202,7 +201,7 @@ func (s windowsDiff) Compare(ctx context.Context, lower, upper []mount.Mount, op })) if err != nil { - return emptyDesc, errors.Wrap(err, "failed to open writer") + return emptyDesc, fmt.Errorf("failed to open writer: %w", err) } defer func() { @@ -235,12 +234,12 @@ func (s windowsDiff) Compare(ctx context.Context, lower, upper []mount.Mount, op var compressed io.WriteCloser compressed, err = compression.CompressStream(cw, compression.Gzip) if err != nil { - return emptyDesc, errors.Wrap(err, "failed to get compressed stream") + return emptyDesc, fmt.Errorf("failed to get compressed stream: %w", err) } err = archive.WriteDiff(ctx, io.MultiWriter(compressed, dgstr.Hash()), "", layers[0], archive.AsWindowsContainerLayerPair(), archive.WithParentLayers(layers[1:])) compressed.Close() if err != nil { - return emptyDesc, errors.Wrap(err, "failed to write compressed diff") + return emptyDesc, fmt.Errorf("failed to write compressed diff: %w", err) } if config.Labels == nil { @@ -249,7 +248,7 @@ func (s windowsDiff) Compare(ctx context.Context, lower, upper []mount.Mount, op config.Labels[uncompressed] = dgstr.Digest().String() } else { if err = archive.WriteDiff(ctx, cw, "", layers[0], archive.AsWindowsContainerLayerPair(), archive.WithParentLayers(layers[1:])); err != nil { - return emptyDesc, errors.Wrap(err, "failed to write diff") + return emptyDesc, fmt.Errorf("failed to write diff: %w", err) } } @@ -261,13 +260,13 @@ func (s windowsDiff) Compare(ctx context.Context, lower, upper []mount.Mount, op dgst := cw.Digest() if err := cw.Commit(ctx, 0, dgst, commitopts...); err != nil { if !errdefs.IsAlreadyExists(err) { - return emptyDesc, errors.Wrap(err, "failed to commit") + return emptyDesc, fmt.Errorf("failed to commit: %w", err) } } info, err := s.store.Info(ctx, dgst) if err != nil { - return emptyDesc, errors.Wrap(err, "failed to get info from content store") + return emptyDesc, fmt.Errorf("failed to get info from content store: %w", err) } if info.Labels == nil { info.Labels = make(map[string]string) @@ -276,7 +275,7 @@ func (s windowsDiff) Compare(ctx context.Context, lower, upper []mount.Mount, op if _, ok := info.Labels[uncompressed]; !ok { info.Labels[uncompressed] = config.Labels[uncompressed] if _, err := s.store.Update(ctx, info, "labels."+uncompressed); err != nil { - return emptyDesc, errors.Wrap(err, "error setting uncompressed label") + return emptyDesc, fmt.Errorf("error setting uncompressed label: %w", err) } } @@ -309,14 +308,14 @@ func (rc *readCounter) Read(p []byte) (n int, err error) { func mountsToLayerAndParents(mounts []mount.Mount) (string, []string, error) { if len(mounts) != 1 { - return "", nil, errors.Wrap(errdefs.ErrInvalidArgument, "number of mounts should always be 1 for Windows layers") + return "", nil, fmt.Errorf("number of mounts should always be 1 for Windows layers: %w", errdefs.ErrInvalidArgument) } mnt := mounts[0] if mnt.Type != "windows-layer" { // This is a special case error. When this is received the diff service // will attempt the next differ in the chain which for Windows is the // lcow differ that we want. - return "", nil, errors.Wrapf(errdefs.ErrNotImplemented, "windowsDiff does not support layer type %s", mnt.Type) + return "", nil, fmt.Errorf("windowsDiff does not support layer type %s: %w", mnt.Type, errdefs.ErrNotImplemented) } parentLayerPaths, err := mnt.GetParentPaths() @@ -335,39 +334,39 @@ func mountPairToLayerStack(lower, upper []mount.Mount) ([]string, error) { // May return an ErrNotImplemented, which will fall back to LCOW upperLayer, upperParentLayerPaths, err := mountsToLayerAndParents(upper) if err != nil { - return nil, errors.Wrapf(err, "Upper mount invalid") + return nil, fmt.Errorf("Upper mount invalid: %w", err) } // Trivial case, diff-against-nothing if len(lower) == 0 { if len(upperParentLayerPaths) != 0 { - return nil, errors.Wrap(errdefs.ErrInvalidArgument, "windowsDiff cannot diff a layer with parents against a null layer") + return nil, fmt.Errorf("windowsDiff cannot diff a layer with parents against a null layer: %w", errdefs.ErrInvalidArgument) } return []string{upperLayer}, nil } if len(upperParentLayerPaths) < 1 { - return nil, errors.Wrap(errdefs.ErrInvalidArgument, "windowsDiff cannot diff a layer with no parents against another layer") + return nil, fmt.Errorf("windowsDiff cannot diff a layer with no parents against another layer: %w", errdefs.ErrInvalidArgument) } lowerLayer, lowerParentLayerPaths, err := mountsToLayerAndParents(lower) if errdefs.IsNotImplemented(err) { // Upper was a windows-layer, lower is not. We can't handle that. - return nil, errors.Wrap(errdefs.ErrInvalidArgument, "windowsDiff cannot diff a windows-layer against a non-windows-layer") + return nil, fmt.Errorf("windowsDiff cannot diff a windows-layer against a non-windows-layer: %w", errdefs.ErrInvalidArgument) } else if err != nil { - return nil, errors.Wrapf(err, "Lower mount invalid") + return nil, fmt.Errorf("Lower mount invalid: %w", err) } if upperParentLayerPaths[0] != lowerLayer { - return nil, errors.Wrap(errdefs.ErrInvalidArgument, "windowsDiff cannot diff a layer against a layer other than its own parent") + return nil, fmt.Errorf("windowsDiff cannot diff a layer against a layer other than its own parent: %w", errdefs.ErrInvalidArgument) } if len(upperParentLayerPaths) != len(lowerParentLayerPaths)+1 { - return nil, errors.Wrap(errdefs.ErrInvalidArgument, "windowsDiff cannot diff a layer against a layer with different parents") + return nil, fmt.Errorf("windowsDiff cannot diff a layer against a layer with different parents: %w", errdefs.ErrInvalidArgument) } for i, upperParent := range upperParentLayerPaths[1:] { if upperParent != lowerParentLayerPaths[i] { - return nil, errors.Wrap(errdefs.ErrInvalidArgument, "windowsDiff cannot diff a layer against a layer with different parents") + return nil, fmt.Errorf("windowsDiff cannot diff a layer against a layer with different parents: %w", errdefs.ErrInvalidArgument) } } diff --git a/errdefs/errors.go b/errdefs/errors.go index 05a35228c..876225597 100644 --- a/errdefs/errors.go +++ b/errdefs/errors.go @@ -17,7 +17,7 @@ // Package errdefs defines the common errors used throughout containerd // packages. // -// Use with errors.Wrap and error.Wrapf to add context to an error. +// Use with fmt.Errorf to add context to an error. // // To detect an error class, use the IsXXX functions to tell whether an error // is of a certain type. @@ -28,8 +28,7 @@ package errdefs import ( "context" - - "github.com/pkg/errors" + "errors" ) // Definitions of common error types used throughout containerd. All containerd diff --git a/errdefs/grpc.go b/errdefs/grpc.go index 209f63bd0..7a9b33e05 100644 --- a/errdefs/grpc.go +++ b/errdefs/grpc.go @@ -18,9 +18,9 @@ package errdefs import ( "context" + "fmt" "strings" - "github.com/pkg/errors" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" ) @@ -68,9 +68,9 @@ func ToGRPC(err error) error { // ToGRPCf maps the error to grpc error codes, assembling the formatting string // and combining it with the target error string. // -// This is equivalent to errors.ToGRPC(errors.Wrapf(err, format, args...)) +// This is equivalent to errdefs.ToGRPC(fmt.Errorf("%s: %w", fmt.Sprintf(format, args...), err)) func ToGRPCf(err error, format string, args ...interface{}) error { - return ToGRPC(errors.Wrapf(err, format, args...)) + return ToGRPC(fmt.Errorf("%s: %w", fmt.Sprintf(format, args...), err)) } // FromGRPC returns the underlying error from a grpc service based on the grpc error code @@ -104,9 +104,9 @@ func FromGRPC(err error) error { msg := rebaseMessage(cls, err) if msg != "" { - err = errors.Wrap(cls, msg) + err = fmt.Errorf("%s: %w", msg, cls) } else { - err = errors.WithStack(cls) + err = cls } return err diff --git a/errdefs/grpc_test.go b/errdefs/grpc_test.go index 982cebdf9..30da69f9d 100644 --- a/errdefs/grpc_test.go +++ b/errdefs/grpc_test.go @@ -18,12 +18,12 @@ package errdefs import ( "context" + "errors" + "fmt" "testing" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" - - "github.com/pkg/errors" ) func TestGRPCRoundTrip(t *testing.T) { @@ -43,7 +43,7 @@ func TestGRPCRoundTrip(t *testing.T) { cause: ErrNotFound, }, { - input: errors.Wrapf(ErrFailedPrecondition, "test test test"), + input: fmt.Errorf("test test test: %w", ErrFailedPrecondition), cause: ErrFailedPrecondition, str: "test test test: failed precondition", }, @@ -63,7 +63,7 @@ func TestGRPCRoundTrip(t *testing.T) { str: "context canceled", }, { - input: errors.Wrapf(context.Canceled, "this is a test cancel"), + input: fmt.Errorf("this is a test cancel: %w", context.Canceled), cause: context.Canceled, str: "this is a test cancel: context canceled", }, @@ -73,7 +73,7 @@ func TestGRPCRoundTrip(t *testing.T) { str: "context deadline exceeded", }, { - input: errors.Wrapf(context.DeadlineExceeded, "this is a test deadline exceeded"), + input: fmt.Errorf("this is a test deadline exceeded: %w", context.DeadlineExceeded), cause: context.DeadlineExceeded, str: "this is a test deadline exceeded: context deadline exceeded", }, @@ -85,9 +85,6 @@ func TestGRPCRoundTrip(t *testing.T) { ferr := FromGRPC(gerr) t.Logf("recovered: %v", ferr) - if errors.Cause(ferr) != testcase.cause { - t.Fatalf("unexpected cause: %v != %v", errors.Cause(ferr), testcase.cause) - } if !errors.Is(ferr, testcase.cause) { t.Fatalf("unexpected cause: !errors.Is(%v, %v)", ferr, testcase.cause) } diff --git a/events/exchange/exchange.go b/events/exchange/exchange.go index eb27bf29b..a1f385d7a 100644 --- a/events/exchange/exchange.go +++ b/events/exchange/exchange.go @@ -18,6 +18,7 @@ package exchange import ( "context" + "fmt" "strings" "time" @@ -30,7 +31,6 @@ import ( "github.com/containerd/typeurl" goevents "github.com/docker/go-events" "github.com/gogo/protobuf/types" - "github.com/pkg/errors" "github.com/sirupsen/logrus" ) @@ -88,10 +88,10 @@ func (e *Exchange) Publish(ctx context.Context, topic string, event events.Event namespace, err = namespaces.NamespaceRequired(ctx) if err != nil { - return errors.Wrapf(err, "failed publishing event") + return fmt.Errorf("failed publishing event: %w", err) } if err := validateTopic(topic); err != nil { - return errors.Wrapf(err, "envelope topic %q", topic) + return fmt.Errorf("envelope topic %q: %w", topic, err) } encoded, err = typeurl.MarshalAny(event) @@ -150,7 +150,7 @@ func (e *Exchange) Subscribe(ctx context.Context, fs ...string) (ch <-chan *even if len(fs) > 0 { filter, err := filters.ParseAll(fs...) if err != nil { - errq <- errors.Wrapf(err, "failed parsing subscription filters") + errq <- fmt.Errorf("failed parsing subscription filters: %w", err) closeAll() return } @@ -175,7 +175,7 @@ func (e *Exchange) Subscribe(ctx context.Context, fs ...string) (ch <-chan *even // TODO(stevvooe): For the most part, we are well protected // from this condition. Both Forward and Publish protect // from this. - err = errors.Errorf("invalid envelope encountered %#v; please file a bug", ev) + err = fmt.Errorf("invalid envelope encountered %#v; please file a bug", ev) break } @@ -203,21 +203,21 @@ func (e *Exchange) Subscribe(ctx context.Context, fs ...string) (ch <-chan *even func validateTopic(topic string) error { if topic == "" { - return errors.Wrap(errdefs.ErrInvalidArgument, "must not be empty") + return fmt.Errorf("must not be empty: %w", errdefs.ErrInvalidArgument) } if topic[0] != '/' { - return errors.Wrapf(errdefs.ErrInvalidArgument, "must start with '/'") + return fmt.Errorf("must start with '/': %w", errdefs.ErrInvalidArgument) } if len(topic) == 1 { - return errors.Wrapf(errdefs.ErrInvalidArgument, "must have at least one component") + return fmt.Errorf("must have at least one component: %w", errdefs.ErrInvalidArgument) } components := strings.Split(topic[1:], "/") for _, component := range components { if err := identifiers.Validate(component); err != nil { - return errors.Wrapf(err, "failed validation on component %q", component) + return fmt.Errorf("failed validation on component %q: %w", component, err) } } @@ -226,15 +226,15 @@ func validateTopic(topic string) error { func validateEnvelope(envelope *events.Envelope) error { if err := identifiers.Validate(envelope.Namespace); err != nil { - return errors.Wrapf(err, "event envelope has invalid namespace") + return fmt.Errorf("event envelope has invalid namespace: %w", err) } if err := validateTopic(envelope.Topic); err != nil { - return errors.Wrapf(err, "envelope topic %q", envelope.Topic) + return fmt.Errorf("envelope topic %q: %w", envelope.Topic, err) } if envelope.Timestamp.IsZero() { - return errors.Wrapf(errdefs.ErrInvalidArgument, "timestamp must be set on forwarded event") + return fmt.Errorf("timestamp must be set on forwarded event: %w", errdefs.ErrInvalidArgument) } return nil diff --git a/events/exchange/exchange_test.go b/events/exchange/exchange_test.go index 97d287950..8f87cbba2 100644 --- a/events/exchange/exchange_test.go +++ b/events/exchange/exchange_test.go @@ -18,6 +18,7 @@ package exchange import ( "context" + "errors" "reflect" "testing" "time" @@ -27,7 +28,6 @@ import ( "github.com/containerd/containerd/events" "github.com/containerd/containerd/namespaces" "github.com/containerd/typeurl" - "github.com/pkg/errors" ) func TestExchangeBasic(t *testing.T) { diff --git a/filters/parser.go b/filters/parser.go index 0825d668c..49182d7b7 100644 --- a/filters/parser.go +++ b/filters/parser.go @@ -21,7 +21,6 @@ import ( "io" "github.com/containerd/containerd/errdefs" - "github.com/pkg/errors" ) /* @@ -71,7 +70,7 @@ func ParseAll(ss ...string) (Filter, error) { for _, s := range ss { f, err := Parse(s) if err != nil { - return nil, errors.Wrap(errdefs.ErrInvalidArgument, err.Error()) + return nil, fmt.Errorf("%s: %w", err.Error(), errdefs.ErrInvalidArgument) } fs = append(fs, f) @@ -90,7 +89,7 @@ func (p *parser) parse() (Filter, error) { ss, err := p.selectors() if err != nil { - return nil, errors.Wrap(err, "filters") + return nil, fmt.Errorf("filters: %w", err) } return ss, nil @@ -284,9 +283,9 @@ func (pe parseError) Error() string { } func (p *parser) mkerr(pos int, format string, args ...interface{}) error { - return errors.Wrap(parseError{ + return fmt.Errorf("parse error: %w", parseError{ input: p.input, pos: pos, msg: fmt.Sprintf(format, args...), - }, "parse error") + }) } diff --git a/filters/quote.go b/filters/quote.go index 2d64e23a3..b76aab9b4 100644 --- a/filters/quote.go +++ b/filters/quote.go @@ -17,9 +17,8 @@ package filters import ( + "errors" "unicode/utf8" - - "github.com/pkg/errors" ) // NOTE(stevvooe): Most of this code in this file is copied from the stdlib diff --git a/gc/scheduler/scheduler.go b/gc/scheduler/scheduler.go index f5890fb74..f6999249d 100644 --- a/gc/scheduler/scheduler.go +++ b/gc/scheduler/scheduler.go @@ -18,6 +18,7 @@ package scheduler import ( "context" + "errors" "fmt" "sync" "time" @@ -25,7 +26,6 @@ import ( "github.com/containerd/containerd/gc" "github.com/containerd/containerd/log" "github.com/containerd/containerd/plugin" - "github.com/pkg/errors" ) // config configures the garbage collection policies. @@ -117,7 +117,7 @@ func init() { mdCollector, ok := md.(collector) if !ok { - return nil, errors.Errorf("%s %T must implement collector", plugin.MetadataPlugin, md) + return nil, fmt.Errorf("%s %T must implement collector", plugin.MetadataPlugin, md) } m := newScheduler(mdCollector, ic.Config.(*config)) diff --git a/go.mod b/go.mod index 1b37056f7..4015f1b07 100644 --- a/go.mod +++ b/go.mod @@ -49,7 +49,6 @@ require ( github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417 github.com/opencontainers/selinux v1.8.2 github.com/pelletier/go-toml v1.9.3 - github.com/pkg/errors v0.9.1 github.com/prometheus/client_golang v1.11.0 github.com/satori/go.uuid v1.2.0 // indirect github.com/sirupsen/logrus v1.8.1 diff --git a/identifiers/validate.go b/identifiers/validate.go index f52317b49..cbd3a52ba 100644 --- a/identifiers/validate.go +++ b/identifiers/validate.go @@ -25,10 +25,10 @@ package identifiers import ( + "fmt" "regexp" "github.com/containerd/containerd/errdefs" - "github.com/pkg/errors" ) const ( @@ -51,15 +51,15 @@ var ( // In general identifiers that pass this validation should be safe for use as filesystem path components. func Validate(s string) error { if len(s) == 0 { - return errors.Wrapf(errdefs.ErrInvalidArgument, "identifier must not be empty") + return fmt.Errorf("identifier must not be empty: %w", errdefs.ErrInvalidArgument) } if len(s) > maxLength { - return errors.Wrapf(errdefs.ErrInvalidArgument, "identifier %q greater than maximum length (%d characters)", s, maxLength) + return fmt.Errorf("identifier %q greater than maximum length (%d characters): %w", s, maxLength, errdefs.ErrInvalidArgument) } if !identifierRe.MatchString(s) { - return errors.Wrapf(errdefs.ErrInvalidArgument, "identifier %q must match %v", s, identifierRe) + return fmt.Errorf("identifier %q must match %v: %w", s, identifierRe, errdefs.ErrInvalidArgument) } return nil } diff --git a/image.go b/image.go index 5c5cdf57a..216b3adb1 100644 --- a/image.go +++ b/image.go @@ -19,6 +19,7 @@ package containerd import ( "context" "encoding/json" + "errors" "fmt" "strings" "sync/atomic" @@ -33,7 +34,6 @@ import ( "github.com/opencontainers/go-digest" "github.com/opencontainers/image-spec/identity" ocispec "github.com/opencontainers/image-spec/specs-go/v1" - "github.com/pkg/errors" "golang.org/x/sync/semaphore" ) @@ -399,7 +399,7 @@ func (i *image) getLayers(ctx context.Context, platform platforms.MatchComparer, cs := i.ContentStore() diffIDs, err := i.i.RootFS(ctx, cs, platform) if err != nil { - return nil, errors.Wrap(err, "failed to resolve rootfs") + return nil, fmt.Errorf("failed to resolve rootfs: %w", err) } if len(diffIDs) != len(manifest.Layers) { return nil, errors.New("mismatched image rootfs and manifest layers") diff --git a/images/archive/exporter.go b/images/archive/exporter.go index 7801b2552..549474644 100644 --- a/images/archive/exporter.go +++ b/images/archive/exporter.go @@ -20,6 +20,7 @@ import ( "archive/tar" "context" "encoding/json" + "fmt" "io" "path" "sort" @@ -31,7 +32,6 @@ import ( digest "github.com/opencontainers/go-digest" ocispecs "github.com/opencontainers/image-spec/specs-go" ocispec "github.com/opencontainers/image-spec/specs-go/v1" - "github.com/pkg/errors" ) type exportOptions struct { @@ -230,7 +230,7 @@ func Export(ctx context.Context, store content.Provider, writer io.Writer, opts manifest: manifests[0], } } else if eo.platform != nil { - return errors.Wrap(errdefs.ErrNotFound, "no manifest found for platform") + return fmt.Errorf("no manifest found for platform: %w", errdefs.ErrNotFound) } } resolvedIndex[desc.Digest] = d @@ -243,14 +243,14 @@ func Export(ctx context.Context, store content.Provider, writer io.Writer, opts } default: - return errors.Wrap(errdefs.ErrInvalidArgument, "only manifests may be exported") + return fmt.Errorf("only manifests may be exported: %w", errdefs.ErrInvalidArgument) } } if len(dManifests) > 0 { tr, err := manifestsRecord(ctx, store, dManifests) if err != nil { - return errors.Wrap(err, "unable to create manifests file") + return fmt.Errorf("unable to create manifests file: %w", err) } records = append(records, tr) @@ -316,7 +316,7 @@ func blobRecord(cs content.Provider, desc ocispec.Descriptor, opts *blobRecordOp CopyTo: func(ctx context.Context, w io.Writer) (int64, error) { r, err := cs.ReaderAt(ctx, desc) if err != nil { - return 0, errors.Wrap(err, "failed to get reader") + return 0, fmt.Errorf("failed to get reader: %w", err) } defer r.Close() @@ -325,10 +325,10 @@ func blobRecord(cs content.Provider, desc ocispec.Descriptor, opts *blobRecordOp n, err := io.Copy(io.MultiWriter(w, dgstr.Hash()), content.NewReader(r)) if err != nil { - return 0, errors.Wrap(err, "failed to copy to tar") + return 0, fmt.Errorf("failed to copy to tar: %w", err) } if dgstr.Digest() != desc.Digest { - return 0, errors.Errorf("unexpected digest %s copied", dgstr.Digest()) + return 0, fmt.Errorf("unexpected digest %s copied", dgstr.Digest()) } return n, nil }, @@ -424,7 +424,7 @@ func manifestsRecord(ctx context.Context, store content.Provider, manifests map[ return tarRecord{}, err } if err := manifest.Config.Digest.Validate(); err != nil { - return tarRecord{}, errors.Wrapf(err, "invalid manifest %q", m.manifest.Digest) + return tarRecord{}, fmt.Errorf("invalid manifest %q: %w", m.manifest.Digest, err) } dgst := manifest.Config.Digest @@ -491,10 +491,10 @@ func writeTar(ctx context.Context, tw *tar.Writer, recordsWithEmpty []tarRecord) return err } if n != record.Header.Size { - return errors.Errorf("unexpected copy size for %s", record.Header.Name) + return fmt.Errorf("unexpected copy size for %s", record.Header.Name) } } else if record.Header.Size > 0 { - return errors.Errorf("no content to write to record with non-zero size for %s", record.Header.Name) + return fmt.Errorf("no content to write to record with non-zero size for %s", record.Header.Name) } } return nil diff --git a/images/archive/importer.go b/images/archive/importer.go index 82d96c9cf..8afdd68f2 100644 --- a/images/archive/importer.go +++ b/images/archive/importer.go @@ -22,6 +22,7 @@ import ( "bytes" "context" "encoding/json" + "errors" "fmt" "io" "path" @@ -35,7 +36,6 @@ import ( digest "github.com/opencontainers/go-digest" specs "github.com/opencontainers/image-spec/specs-go" ocispec "github.com/opencontainers/image-spec/specs-go/v1" - "github.com/pkg/errors" ) type importOpts struct { @@ -104,16 +104,16 @@ func ImportIndex(ctx context.Context, store content.Store, reader io.Reader, opt hdrName := path.Clean(hdr.Name) if hdrName == ocispec.ImageLayoutFile { if err = onUntarJSON(tr, &ociLayout); err != nil { - return ocispec.Descriptor{}, errors.Wrapf(err, "untar oci layout %q", hdr.Name) + return ocispec.Descriptor{}, fmt.Errorf("untar oci layout %q: %w", hdr.Name, err) } } else if hdrName == "manifest.json" { if err = onUntarJSON(tr, &mfsts); err != nil { - return ocispec.Descriptor{}, errors.Wrapf(err, "untar manifest %q", hdr.Name) + return ocispec.Descriptor{}, fmt.Errorf("untar manifest %q: %w", hdr.Name, err) } } else { dgst, err := onUntarBlob(ctx, tr, store, hdr.Size, "tar-"+hdrName) if err != nil { - return ocispec.Descriptor{}, errors.Wrapf(err, "failed to ingest %q", hdr.Name) + return ocispec.Descriptor{}, fmt.Errorf("failed to ingest %q: %w", hdr.Name, err) } blobs[hdrName] = ocispec.Descriptor{ @@ -128,12 +128,12 @@ func ImportIndex(ctx context.Context, store content.Store, reader io.Reader, opt // as Docker v1.1 or v1.2. if ociLayout.Version != "" { if ociLayout.Version != ocispec.ImageLayoutVersion { - return ocispec.Descriptor{}, errors.Errorf("unsupported OCI version %s", ociLayout.Version) + return ocispec.Descriptor{}, fmt.Errorf("unsupported OCI version %s", ociLayout.Version) } idx, ok := blobs["index.json"] if !ok { - return ocispec.Descriptor{}, errors.Errorf("missing index.json in OCI layout %s", ocispec.ImageLayoutVersion) + return ocispec.Descriptor{}, fmt.Errorf("missing index.json in OCI layout %s", ocispec.ImageLayoutVersion) } idx.MediaType = ocispec.MediaTypeImageIndex @@ -147,7 +147,7 @@ func ImportIndex(ctx context.Context, store content.Store, reader io.Reader, opt for name, linkname := range symlinks { desc, ok := blobs[linkname] if !ok { - return ocispec.Descriptor{}, errors.Errorf("no target for symlink layer from %q to %q", name, linkname) + return ocispec.Descriptor{}, fmt.Errorf("no target for symlink layer from %q to %q", name, linkname) } blobs[name] = desc } @@ -160,13 +160,13 @@ func ImportIndex(ctx context.Context, store content.Store, reader io.Reader, opt for _, mfst := range mfsts { config, ok := blobs[mfst.Config] if !ok { - return ocispec.Descriptor{}, errors.Errorf("image config %q not found", mfst.Config) + return ocispec.Descriptor{}, fmt.Errorf("image config %q not found", mfst.Config) } config.MediaType = images.MediaTypeDockerSchema2Config layers, err := resolveLayers(ctx, store, mfst.Layers, blobs, iopts.compress) if err != nil { - return ocispec.Descriptor{}, errors.Wrap(err, "failed to resolve layers") + return ocispec.Descriptor{}, fmt.Errorf("failed to resolve layers: %w", err) } manifest := struct { @@ -183,12 +183,12 @@ func ImportIndex(ctx context.Context, store content.Store, reader io.Reader, opt desc, err := writeManifest(ctx, store, manifest, manifest.MediaType) if err != nil { - return ocispec.Descriptor{}, errors.Wrap(err, "write docker manifest") + return ocispec.Descriptor{}, fmt.Errorf("write docker manifest: %w", err) } imgPlatforms, err := images.Platforms(ctx, store, desc) if err != nil { - return ocispec.Descriptor{}, errors.Wrap(err, "unable to resolve platform") + return ocispec.Descriptor{}, fmt.Errorf("unable to resolve platform: %w", err) } if len(imgPlatforms) > 0 { // Only one platform can be resolved from non-index manifest, @@ -257,7 +257,7 @@ func resolveLayers(ctx context.Context, store content.Store, layerFiles []string for i, f := range layerFiles { desc, ok := blobs[f] if !ok { - return nil, errors.Errorf("layer %q not found", f) + return nil, fmt.Errorf("layer %q not found", f) } layers[i] = desc descs[desc.Digest] = &layers[i] @@ -277,7 +277,7 @@ func resolveLayers(ctx context.Context, store content.Store, layerFiles []string return nil }, filters...) if err != nil { - return nil, errors.Wrap(err, "failure checking for compressed blobs") + return nil, fmt.Errorf("failure checking for compressed blobs: %w", err) } for i, desc := range layers { @@ -287,12 +287,12 @@ func resolveLayers(ctx context.Context, store content.Store, layerFiles []string // Open blob, resolve media type ra, err := store.ReaderAt(ctx, desc) if err != nil { - return nil, errors.Wrapf(err, "failed to open %q (%s)", layerFiles[i], desc.Digest) + return nil, fmt.Errorf("failed to open %q (%s): %w", layerFiles[i], desc.Digest, err) } s, err := compression.DecompressStream(content.NewReader(ra)) if err != nil { ra.Close() - return nil, errors.Wrapf(err, "failed to detect compression for %q", layerFiles[i]) + return nil, fmt.Errorf("failed to detect compression for %q: %w", layerFiles[i], err) } if s.GetCompression() == compression.Uncompressed { if compress { @@ -322,7 +322,7 @@ func resolveLayers(ctx context.Context, store content.Store, layerFiles []string func compressBlob(ctx context.Context, cs content.Store, r io.Reader, ref string, opts ...content.Opt) (desc ocispec.Descriptor, err error) { w, err := content.OpenWriter(ctx, cs, content.WithRef(ref)) if err != nil { - return ocispec.Descriptor{}, errors.Wrap(err, "failed to open writer") + return ocispec.Descriptor{}, fmt.Errorf("failed to open writer: %w", err) } defer func() { @@ -332,7 +332,7 @@ func compressBlob(ctx context.Context, cs content.Store, r io.Reader, ref string } }() if err := w.Truncate(0); err != nil { - return ocispec.Descriptor{}, errors.Wrap(err, "failed to truncate writer") + return ocispec.Descriptor{}, fmt.Errorf("failed to truncate writer: %w", err) } cw, err := compression.CompressStream(w, compression.Gzip) @@ -349,7 +349,7 @@ func compressBlob(ctx context.Context, cs content.Store, r io.Reader, ref string cst, err := w.Status() if err != nil { - return ocispec.Descriptor{}, errors.Wrap(err, "failed to get writer status") + return ocispec.Descriptor{}, fmt.Errorf("failed to get writer status: %w", err) } desc.Digest = w.Digest() @@ -357,7 +357,7 @@ func compressBlob(ctx context.Context, cs content.Store, r io.Reader, ref string if err := w.Commit(ctx, desc.Size, desc.Digest, opts...); err != nil { if !errdefs.IsAlreadyExists(err) { - return ocispec.Descriptor{}, errors.Wrap(err, "failed to commit") + return ocispec.Descriptor{}, fmt.Errorf("failed to commit: %w", err) } } diff --git a/images/archive/reference.go b/images/archive/reference.go index ce9fe98f9..ba19b111f 100644 --- a/images/archive/reference.go +++ b/images/archive/reference.go @@ -17,12 +17,12 @@ package archive import ( + "fmt" "strings" "github.com/containerd/containerd/reference" distref "github.com/containerd/containerd/reference/docker" "github.com/opencontainers/go-digest" - "github.com/pkg/errors" ) // FilterRefPrefix restricts references to having the given image @@ -72,7 +72,7 @@ func normalizeReference(ref string) (string, error) { // TODO: Replace this function to not depend on reference package normalized, err := distref.ParseDockerRef(ref) if err != nil { - return "", errors.Wrapf(err, "normalize image ref %q", ref) + return "", fmt.Errorf("normalize image ref %q: %w", ref, err) } return normalized.String(), nil @@ -81,7 +81,7 @@ func normalizeReference(ref string) (string, error) { func familiarizeReference(ref string) (string, error) { named, err := distref.ParseNormalizedNamed(ref) if err != nil { - return "", errors.Wrapf(err, "failed to parse %q", ref) + return "", fmt.Errorf("failed to parse %q: %w", ref, err) } named = distref.TagNameOnly(named) diff --git a/images/handlers.go b/images/handlers.go index c30d82eff..077d88e78 100644 --- a/images/handlers.go +++ b/images/handlers.go @@ -18,6 +18,7 @@ package images import ( "context" + "errors" "fmt" "sort" @@ -25,7 +26,6 @@ import ( "github.com/containerd/containerd/errdefs" "github.com/containerd/containerd/platforms" ocispec "github.com/opencontainers/image-spec/specs-go/v1" - "github.com/pkg/errors" "golang.org/x/sync/errgroup" "golang.org/x/sync/semaphore" ) @@ -308,7 +308,7 @@ func LimitManifests(f HandlerFunc, m platforms.MatchComparer, n int) HandlerFunc if n > 0 { if len(children) == 0 { - return children, errors.Wrap(errdefs.ErrNotFound, "no match for platform in manifest") + return children, fmt.Errorf("no match for platform in manifest: %w", errdefs.ErrNotFound) } if len(children) > n { children = children[:n] diff --git a/images/image.go b/images/image.go index 2e5cd61c9..d45afe482 100644 --- a/images/image.go +++ b/images/image.go @@ -29,7 +29,6 @@ import ( "github.com/containerd/containerd/platforms" digest "github.com/opencontainers/go-digest" ocispec "github.com/opencontainers/image-spec/specs-go/v1" - "github.com/pkg/errors" ) // Image provides the model for how containerd views container images. @@ -115,7 +114,7 @@ func (image *Image) Size(ctx context.Context, provider content.Provider, platfor var size int64 return size, Walk(ctx, Handlers(HandlerFunc(func(ctx context.Context, desc ocispec.Descriptor) ([]ocispec.Descriptor, error) { if desc.Size < 0 { - return nil, errors.Errorf("invalid size %v in %v (%v)", desc.Size, desc.Digest, desc.MediaType) + return nil, fmt.Errorf("invalid size %v in %v (%v)", desc.Size, desc.Digest, desc.MediaType) } size += desc.Size return nil, nil @@ -156,7 +155,7 @@ func Manifest(ctx context.Context, provider content.Provider, image ocispec.Desc } if err := validateMediaType(p, desc.MediaType); err != nil { - return nil, errors.Wrapf(err, "manifest: invalid desc %s", desc.Digest) + return nil, fmt.Errorf("manifest: invalid desc %s: %w", desc.Digest, err) } var manifest ocispec.Manifest @@ -200,7 +199,7 @@ func Manifest(ctx context.Context, provider content.Provider, image ocispec.Desc } if err := validateMediaType(p, desc.MediaType); err != nil { - return nil, errors.Wrapf(err, "manifest: invalid desc %s", desc.Digest) + return nil, fmt.Errorf("manifest: invalid desc %s: %w", desc.Digest, err) } var idx ocispec.Index @@ -236,15 +235,15 @@ func Manifest(ctx context.Context, provider content.Provider, image ocispec.Desc } return descs, nil } - return nil, errors.Wrapf(errdefs.ErrNotFound, "unexpected media type %v for %v", desc.MediaType, desc.Digest) + return nil, fmt.Errorf("unexpected media type %v for %v: %w", desc.MediaType, desc.Digest, errdefs.ErrNotFound) }), image); err != nil { return ocispec.Manifest{}, err } if len(m) == 0 { - err := errors.Wrapf(errdefs.ErrNotFound, "manifest %v", image.Digest) + err := fmt.Errorf("manifest %v: %w", image.Digest, errdefs.ErrNotFound) if wasIndex { - err = errors.Wrapf(errdefs.ErrNotFound, "no match for platform in manifest %v", image.Digest) + err = fmt.Errorf("no match for platform in manifest %v: %w", image.Digest, errdefs.ErrNotFound) } return ocispec.Manifest{}, err } @@ -309,7 +308,7 @@ func Check(ctx context.Context, provider content.Provider, image ocispec.Descrip return false, []ocispec.Descriptor{image}, nil, []ocispec.Descriptor{image}, nil } - return false, nil, nil, nil, errors.Wrapf(err, "failed to check image %v", image.Digest) + return false, nil, nil, nil, fmt.Errorf("failed to check image %v: %w", image.Digest, err) } // TODO(stevvooe): It is possible that referenced conponents could have @@ -324,7 +323,7 @@ func Check(ctx context.Context, provider content.Provider, image ocispec.Descrip missing = append(missing, desc) continue } else { - return false, nil, nil, nil, errors.Wrapf(err, "failed to check image %v", desc.Digest) + return false, nil, nil, nil, fmt.Errorf("failed to check image %v: %w", desc.Digest, err) } } ra.Close() @@ -346,7 +345,7 @@ func Children(ctx context.Context, provider content.Provider, desc ocispec.Descr } if err := validateMediaType(p, desc.MediaType); err != nil { - return nil, errors.Wrapf(err, "children: invalid desc %s", desc.Digest) + return nil, fmt.Errorf("children: invalid desc %s: %w", desc.Digest, err) } // TODO(stevvooe): We just assume oci manifest, for now. There may be @@ -365,7 +364,7 @@ func Children(ctx context.Context, provider content.Provider, desc ocispec.Descr } if err := validateMediaType(p, desc.MediaType); err != nil { - return nil, errors.Wrapf(err, "children: invalid desc %s", desc.Digest) + return nil, fmt.Errorf("children: invalid desc %s: %w", desc.Digest, err) } var index ocispec.Index diff --git a/images/mediatypes.go b/images/mediatypes.go index 785d71291..671e160e1 100644 --- a/images/mediatypes.go +++ b/images/mediatypes.go @@ -18,12 +18,12 @@ package images import ( "context" + "fmt" "sort" "strings" "github.com/containerd/containerd/errdefs" ocispec "github.com/opencontainers/image-spec/specs-go/v1" - "github.com/pkg/errors" ) // mediatype definitions for image components handled in containerd. @@ -87,7 +87,7 @@ func DiffCompression(ctx context.Context, mediaType string) (string, error) { } return "", nil default: - return "", errors.Wrapf(errdefs.ErrNotImplemented, "unrecognised mediatype %s", mediaType) + return "", fmt.Errorf("unrecognised mediatype %s: %w", mediaType, errdefs.ErrNotImplemented) } } diff --git a/install.go b/install.go index 274f42c2a..16cff08d2 100644 --- a/install.go +++ b/install.go @@ -19,6 +19,8 @@ package containerd import ( "archive/tar" "context" + "errors" + "fmt" "os" "path/filepath" "runtime" @@ -28,7 +30,6 @@ import ( "github.com/containerd/containerd/archive/compression" "github.com/containerd/containerd/content" "github.com/containerd/containerd/images" - "github.com/pkg/errors" ) // Install a binary image into the opt service @@ -82,7 +83,7 @@ func (c *Client) Install(ctx context.Context, image Image, opts ...InstallOpts) } if result && !config.Replace { if _, err := os.Lstat(filepath.Join(path, hdr.Name)); err == nil { - return false, errors.Errorf("cannot replace %s in %s", hdr.Name, path) + return false, fmt.Errorf("cannot replace %s in %s", hdr.Name, path) } } return result, nil diff --git a/integration/client/container_test.go b/integration/client/container_test.go index b01a84c21..c8aae1eb1 100644 --- a/integration/client/container_test.go +++ b/integration/client/container_test.go @@ -46,7 +46,6 @@ import ( "github.com/containerd/typeurl" gogotypes "github.com/gogo/protobuf/types" specs "github.com/opencontainers/runtime-spec/specs-go" - "github.com/pkg/errors" exec "golang.org/x/sys/execabs" ) @@ -1903,7 +1902,7 @@ func TestRegressionIssue4769(t *testing.T) { select { case et := <-statusC: if got := et.ExitCode(); got != 0 { - t.Fatal(errors.Errorf("expect zero exit status, but got %v", got)) + t.Fatal(fmt.Errorf("expect zero exit status, but got %v", got)) } case <-time.After(timeout): t.Fatal(fmt.Errorf("failed to get exit event in time")) @@ -1913,21 +1912,21 @@ func TestRegressionIssue4769(t *testing.T) { select { case et := <-eventStream: if et.Event == nil { - t.Fatal(errors.Errorf("unexpected empty event: %+v", et)) + t.Fatal(fmt.Errorf("unexpected empty event: %+v", et)) } v, err := typeurl.UnmarshalAny(et.Event) if err != nil { - t.Fatal(errors.Wrap(err, "failed to unmarshal event")) + t.Fatal(fmt.Errorf("failed to unmarshal event: %w", err)) } if e, ok := v.(*apievents.TaskExit); !ok { - t.Fatal(errors.Errorf("unexpected event type: %+v", v)) + t.Fatal(fmt.Errorf("unexpected event type: %+v", v)) } else if e.ExitStatus != 0 { - t.Fatal(errors.Errorf("expect zero exit status, but got %v", e.ExitStatus)) + t.Fatal(fmt.Errorf("expect zero exit status, but got %v", e.ExitStatus)) } case err := <-errC: - t.Fatal(errors.Wrap(err, "unexpected error from event service")) + t.Fatal(fmt.Errorf("unexpected error from event service: %w", err)) case <-time.After(timeout): t.Fatal(fmt.Errorf("failed to get exit event in time")) @@ -1940,9 +1939,9 @@ func TestRegressionIssue4769(t *testing.T) { // check duplicate event should not show up select { case event := <-eventStream: - t.Fatal(errors.Errorf("unexpected exit event: %+v", event)) + t.Fatal(fmt.Errorf("unexpected exit event: %+v", event)) case err := <-errC: - t.Fatal(errors.Wrap(err, "unexpected error from event service")) + t.Fatal(fmt.Errorf("unexpected error from event service: %w", err)) case <-time.After(timeout): } } diff --git a/integration/client/content_test.go b/integration/client/content_test.go index c4aa1c03f..6ad760e47 100644 --- a/integration/client/content_test.go +++ b/integration/client/content_test.go @@ -27,7 +27,6 @@ import ( "github.com/containerd/containerd/content/testsuite" "github.com/containerd/containerd/errdefs" "github.com/containerd/containerd/namespaces" - "github.com/pkg/errors" ) func newContentStore(ctx context.Context, root string) (context.Context, content.Store, func() error, error) { @@ -59,7 +58,7 @@ func newContentStore(ctx context.Context, root string) (context.Context, content } for _, st := range statuses { if err := cs.Abort(ctx, st.Ref); err != nil && !errdefs.IsNotFound(err) { - return errors.Wrapf(err, "failed to abort %s", st.Ref) + return fmt.Errorf("failed to abort %s: %w", st.Ref, err) } } err = cs.Walk(ctx, func(info content.Info) error { diff --git a/integration/client/daemon_test.go b/integration/client/daemon_test.go index a7d67be5f..8b7e22fc7 100644 --- a/integration/client/daemon_test.go +++ b/integration/client/daemon_test.go @@ -18,13 +18,14 @@ package client import ( "context" + "errors" + "fmt" "io" "runtime" "sync" "syscall" . "github.com/containerd/containerd" - "github.com/pkg/errors" exec "golang.org/x/sys/execabs" ) @@ -46,7 +47,7 @@ func (d *daemon) start(name, address string, args []string, stdout, stderr io.Wr cmd.Stderr = stderr if err := cmd.Start(); err != nil { cmd.Wait() - return errors.Wrap(err, "failed to start daemon") + return fmt.Errorf("failed to start daemon: %w", err) } d.addr = address d.cmd = cmd @@ -117,7 +118,7 @@ func (d *daemon) Restart(stopCb func()) error { } var err error if err = d.cmd.Process.Signal(signal); err != nil { - return errors.Wrap(err, "failed to signal daemon") + return fmt.Errorf("failed to signal daemon: %w", err) } d.cmd.Wait() @@ -131,7 +132,7 @@ func (d *daemon) Restart(stopCb func()) error { cmd.Stderr = d.cmd.Stderr if err := cmd.Start(); err != nil { cmd.Wait() - return errors.Wrap(err, "failed to start new daemon instance") + return fmt.Errorf("failed to start new daemon instance: %w", err) } d.cmd = cmd diff --git a/integration/client/go.mod b/integration/client/go.mod index 9cee7e421..2e7491d4b 100644 --- a/integration/client/go.mod +++ b/integration/client/go.mod @@ -16,7 +16,6 @@ require ( github.com/opencontainers/go-digest v1.0.0 github.com/opencontainers/image-spec v1.0.2-0.20211117181255-693428a734f5 github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417 - github.com/pkg/errors v0.9.1 github.com/sirupsen/logrus v1.8.1 golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e gotest.tools/v3 v3.0.3 diff --git a/integration/container_stats_test.go b/integration/container_stats_test.go index 309f5c14c..2380aa404 100644 --- a/integration/container_stats_test.go +++ b/integration/container_stats_test.go @@ -17,12 +17,12 @@ package integration import ( + "errors" "fmt" goruntime "runtime" "testing" "time" - "github.com/pkg/errors" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" runtime "k8s.io/cri-api/pkg/apis/runtime/v1" @@ -372,7 +372,7 @@ func TestContainerListStatsWithIdSandboxIdFilter(t *testing.T) { return false, err } if len(stats) != 1 { - return false, errors.Errorf("expected only one stat, but got %v", stats) + return false, fmt.Errorf("expected only one stat, but got %v", stats) } if stats[0].GetWritableLayer().GetUsedBytes().GetValue() != 0 { return true, nil diff --git a/integration/containerd_image_test.go b/integration/containerd_image_test.go index 2b19242e8..c5b0daa95 100644 --- a/integration/containerd_image_test.go +++ b/integration/containerd_image_test.go @@ -17,17 +17,17 @@ package integration import ( + "errors" + "fmt" "testing" "time" - "golang.org/x/net/context" - "github.com/containerd/containerd" "github.com/containerd/containerd/errdefs" "github.com/containerd/containerd/namespaces" - "github.com/pkg/errors" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + "golang.org/x/net/context" runtime "k8s.io/cri-api/pkg/apis/runtime/v1" ) @@ -77,10 +77,10 @@ func TestContainerdImage(t *testing.T) { } if len(img.RepoTags) != 1 { // RepoTags must have been populated correctly. - return false, errors.Errorf("unexpected repotags: %+v", img.RepoTags) + return false, fmt.Errorf("unexpected repotags: %+v", img.RepoTags) } if img.RepoTags[0] != testImage { - return false, errors.Errorf("unexpected repotag %q", img.RepoTags[0]) + return false, fmt.Errorf("unexpected repotag %q", img.RepoTags[0]) } return true, nil } diff --git a/integration/imagefs_info_test.go b/integration/imagefs_info_test.go index 7ae36c552..ea83a2247 100644 --- a/integration/imagefs_info_test.go +++ b/integration/imagefs_info_test.go @@ -17,11 +17,11 @@ package integration import ( + "fmt" "os" "testing" "time" - "github.com/pkg/errors" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" runtime "k8s.io/cri-api/pkg/apis/runtime/v1" @@ -47,7 +47,7 @@ func TestImageFSInfo(t *testing.T) { return false, nil } if len(stats) >= 2 { - return false, errors.Errorf("unexpected stats length: %d", len(stats)) + return false, fmt.Errorf("unexpected stats length: %d", len(stats)) } info = stats[0] if info.GetTimestamp() != 0 && diff --git a/integration/main_test.go b/integration/main_test.go index 28b9fe68b..1bef00d40 100644 --- a/integration/main_test.go +++ b/integration/main_test.go @@ -19,6 +19,7 @@ package integration import ( "context" "encoding/json" + "errors" "flag" "fmt" "os" @@ -37,7 +38,6 @@ import ( "github.com/containerd/containerd/pkg/cri/constants" "github.com/containerd/containerd/pkg/cri/server" "github.com/containerd/containerd/pkg/cri/util" - "github.com/pkg/errors" "github.com/sirupsen/logrus" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -78,29 +78,29 @@ func ConnectDaemons() error { var err error runtimeService, err = remote.NewRuntimeService(*criEndpoint, timeout) if err != nil { - return errors.Wrap(err, "failed to create runtime service") + return fmt.Errorf("failed to create runtime service: %w", err) } imageService, err = remote.NewImageService(*criEndpoint, timeout) if err != nil { - return errors.Wrap(err, "failed to create image service") + return fmt.Errorf("failed to create image service: %w", err) } // Since CRI grpc client doesn't have `WithBlock` specified, we // need to check whether it is actually connected. // TODO(#6069) Use grpc options to block on connect and remove for this list containers request. _, err = runtimeService.ListContainers(&runtime.ContainerFilter{}) if err != nil { - return errors.Wrap(err, "failed to list containers") + return fmt.Errorf("failed to list containers: %w", err) } _, err = imageService.ListImages(&runtime.ImageFilter{}) if err != nil { - return errors.Wrap(err, "failed to list images") + return fmt.Errorf("failed to list images: %w", err) } // containerdEndpoint is the same with criEndpoint now containerdEndpoint = strings.TrimPrefix(*criEndpoint, "unix://") containerdEndpoint = strings.TrimPrefix(containerdEndpoint, "npipe:") containerdClient, err = containerd.New(containerdEndpoint, containerd.WithDefaultNamespace(k8sNamespace)) if err != nil { - return errors.Wrap(err, "failed to connect containerd") + return fmt.Errorf("failed to connect containerd: %w", err) } return nil } @@ -371,7 +371,7 @@ func KillProcess(name string) error { output, err := exec.Command(command[0], command[1:]...).CombinedOutput() if err != nil { - return errors.Errorf("failed to kill %q - error: %v, output: %q", name, err, output) + return fmt.Errorf("failed to kill %q - error: %v, output: %q", name, err, output) } return nil } @@ -380,7 +380,7 @@ func KillProcess(name string) error { func KillPid(pid int) error { //nolint:unused output, err := exec.Command("kill", strconv.Itoa(pid)).CombinedOutput() if err != nil { - return errors.Errorf("failed to kill %d - error: %v, output: %q", pid, err, output) + return fmt.Errorf("failed to kill %d - error: %v, output: %q", pid, err, output) } return nil } @@ -391,7 +391,7 @@ func PidOf(name string) (int, error) { output := strings.TrimSpace(string(b)) if err != nil { if len(output) != 0 { - return 0, errors.Errorf("failed to run pidof %q - error: %v, output: %q", name, err, output) + return 0, fmt.Errorf("failed to run pidof %q - error: %v, output: %q", name, err, output) } return 0, nil } @@ -402,7 +402,7 @@ func PidOf(name string) (int, error) { func RawRuntimeClient() (runtime.RuntimeServiceClient, error) { addr, dialer, err := dialer.GetAddressAndDialer(*criEndpoint) if err != nil { - return nil, errors.Wrap(err, "failed to get dialer") + return nil, fmt.Errorf("failed to get dialer: %w", err) } ctx, cancel := context.WithTimeout(context.Background(), timeout) defer cancel() @@ -411,7 +411,7 @@ func RawRuntimeClient() (runtime.RuntimeServiceClient, error) { grpc.WithContextDialer(dialer), ) if err != nil { - return nil, errors.Wrap(err, "failed to connect cri endpoint") + return nil, fmt.Errorf("failed to connect cri endpoint: %w", err) } return runtime.NewRuntimeServiceClient(conn), nil } @@ -420,15 +420,15 @@ func RawRuntimeClient() (runtime.RuntimeServiceClient, error) { func CRIConfig() (*criconfig.Config, error) { client, err := RawRuntimeClient() if err != nil { - return nil, errors.Wrap(err, "failed to get raw runtime client") + return nil, fmt.Errorf("failed to get raw runtime client: %w", err) } resp, err := client.Status(context.Background(), &runtime.StatusRequest{Verbose: true}) if err != nil { - return nil, errors.Wrap(err, "failed to get status") + return nil, fmt.Errorf("failed to get status: %w", err) } config := &criconfig.Config{} if err := json.Unmarshal([]byte(resp.Info["config"]), config); err != nil { - return nil, errors.Wrap(err, "failed to unmarshal config") + return nil, fmt.Errorf("failed to unmarshal config: %w", err) } return config, nil } @@ -437,19 +437,19 @@ func CRIConfig() (*criconfig.Config, error) { func SandboxInfo(id string) (*runtime.PodSandboxStatus, *server.SandboxInfo, error) { //nolint:unused client, err := RawRuntimeClient() if err != nil { - return nil, nil, errors.Wrap(err, "failed to get raw runtime client") + return nil, nil, fmt.Errorf("failed to get raw runtime client: %w", err) } resp, err := client.PodSandboxStatus(context.Background(), &runtime.PodSandboxStatusRequest{ PodSandboxId: id, Verbose: true, }) if err != nil { - return nil, nil, errors.Wrap(err, "failed to get sandbox status") + return nil, nil, fmt.Errorf("failed to get sandbox status: %w", err) } status := resp.GetStatus() var info server.SandboxInfo if err := json.Unmarshal([]byte(resp.GetInfo()["info"]), &info); err != nil { - return nil, nil, errors.Wrap(err, "failed to unmarshal sandbox info") + return nil, nil, fmt.Errorf("failed to unmarshal sandbox info: %w", err) } return status, &info, nil } diff --git a/integration/shim_dial_unix_test.go b/integration/shim_dial_unix_test.go index ddf611a81..7308bf021 100644 --- a/integration/shim_dial_unix_test.go +++ b/integration/shim_dial_unix_test.go @@ -21,6 +21,7 @@ package integration import ( "context" + "errors" "net" "os" "path/filepath" @@ -33,7 +34,6 @@ import ( v1shimcli "github.com/containerd/containerd/runtime/v1/shim/client" v2shimcli "github.com/containerd/containerd/runtime/v2/shim" "github.com/containerd/ttrpc" - "github.com/pkg/errors" ) const abstractSocketPrefix = "\x00" diff --git a/labels/validate.go b/labels/validate.go index 0de461663..1fd527adb 100644 --- a/labels/validate.go +++ b/labels/validate.go @@ -17,8 +17,9 @@ package labels import ( + "fmt" + "github.com/containerd/containerd/errdefs" - "github.com/pkg/errors" ) const ( @@ -31,7 +32,7 @@ func Validate(k, v string) error { if len(k) > 10 { k = k[:10] } - return errors.Wrapf(errdefs.ErrInvalidArgument, "label key and value greater than maximum size (%d bytes), key: %s", maxSize, k) + return fmt.Errorf("label key and value greater than maximum size (%d bytes), key: %s: %w", maxSize, k, errdefs.ErrInvalidArgument) } return nil } diff --git a/metadata/bolt.go b/metadata/bolt.go index 6ea460866..9edfab565 100644 --- a/metadata/bolt.go +++ b/metadata/bolt.go @@ -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) } diff --git a/metadata/boltutil/helpers.go b/metadata/boltutil/helpers.go index 6995917c9..4722a5226 100644 --- a/metadata/boltutil/helpers.go +++ b/metadata/boltutil/helpers.go @@ -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 diff --git a/metadata/buckets_test.go b/metadata/buckets_test.go index b5a73d0d0..991900e18 100644 --- a/metadata/buckets_test.go +++ b/metadata/buckets_test.go @@ -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" ) diff --git a/metadata/containers.go b/metadata/containers.go index 26e86d858..97002e588 100644 --- a/metadata/containers.go +++ b/metadata/containers.go @@ -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 diff --git a/metadata/containers_test.go b/metadata/containers_test.go index f207e569e..c0192a458 100644 --- a/metadata/containers_test.go +++ b/metadata/containers_test.go @@ -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 diff --git a/metadata/content.go b/metadata/content.go index f534bff18..c717d9892 100644 --- a/metadata/content.go +++ b/metadata/content.go @@ -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 diff --git a/metadata/content_test.go b/metadata/content_test.go index a97ec4f2e..061095c0f 100644 --- a/metadata/content_test.go +++ b/metadata/content_test.go @@ -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 diff --git a/metadata/db.go b/metadata/db.go index 40d045f05..c5a2f2eb4 100644 --- a/metadata/db.go +++ b/metadata/db.go @@ -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 diff --git a/metadata/db_test.go b/metadata/db_test.go index 5b59399a9..d66408bdd 100644 --- a/metadata/db_test.go +++ b/metadata/db_test.go @@ -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{ diff --git a/metadata/gc.go b/metadata/gc.go index afe16c922..b526d995d 100644 --- a/metadata/gc.go +++ b/metadata/gc.go @@ -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 { diff --git a/metadata/images.go b/metadata/images.go index 46553c0c8..de44c7284 100644 --- a/metadata/images.go +++ b/metadata/images.go @@ -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 diff --git a/metadata/images_test.go b/metadata/images_test.go index 6d8758816..7d556b000 100644 --- a/metadata/images_test.go +++ b/metadata/images_test.go @@ -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 diff --git a/metadata/leases.go b/metadata/leases.go index c559fca85..03fa75af3 100644 --- a/metadata/leases.go +++ b/metadata/leases.go @@ -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 diff --git a/metadata/leases_test.go b/metadata/leases_test.go index 383c842b2..be120ce77 100644 --- a/metadata/leases_test.go +++ b/metadata/leases_test.go @@ -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 { diff --git a/metadata/namespaces.go b/metadata/namespaces.go index 540fb8359..84eb83f27 100644 --- a/metadata/namespaces.go +++ b/metadata/namespaces.go @@ -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 diff --git a/metadata/snapshot.go b/metadata/snapshot.go index 389aeda45..0c267060d 100644 --- a/metadata/snapshot.go +++ b/metadata/snapshot.go @@ -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) } } diff --git a/metadata/snapshot_test.go b/metadata/snapshot_test.go index 93c3c9d72..9cfb205e7 100644 --- a/metadata/snapshot_test.go +++ b/metadata/snapshot_test.go @@ -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] diff --git a/mount/fmountat_linux.go b/mount/fmountat_linux.go index 705b95ede..850a92acf 100644 --- a/mount/fmountat_linux.go +++ b/mount/fmountat_linux.go @@ -17,12 +17,12 @@ package mount import ( + "fmt" "runtime" "syscall" "unsafe" "github.com/containerd/containerd/log" - "github.com/pkg/errors" "golang.org/x/sys/unix" ) @@ -62,7 +62,7 @@ func fMountat(dirfd uintptr, source, target, fstype string, flags uintptr, data var pipefds [2]int if err := syscall.Pipe2(pipefds[:], syscall.O_CLOEXEC); err != nil { - return errors.Wrap(err, "failed to open pipe") + return fmt.Errorf("failed to open pipe: %w", err) } defer func() { @@ -82,7 +82,7 @@ func fMountat(dirfd uintptr, source, target, fstype string, flags uintptr, data ) if errno != 0 { - return errors.Wrap(errno, "failed to fork thread") + return fmt.Errorf("failed to fork thread: %w", errno) } defer func() { @@ -101,11 +101,11 @@ func fMountat(dirfd uintptr, source, target, fstype string, flags uintptr, data uintptr(unsafe.Pointer(&status)), unsafe.Sizeof(status)) if errno != 0 { - return errors.Wrap(errno, "failed to read pipe") + return fmt.Errorf("failed to read pipe: %w", errno) } if status != 0 { - return errors.Wrap(status, "failed to mount") + return fmt.Errorf("failed to mount: %w", status) } return nil diff --git a/mount/fmountat_linux_test.go b/mount/fmountat_linux_test.go index a74c16173..026effe6b 100644 --- a/mount/fmountat_linux_test.go +++ b/mount/fmountat_linux_test.go @@ -17,6 +17,7 @@ package mount import ( + "errors" "os" "path/filepath" "syscall" @@ -24,7 +25,6 @@ import ( "time" "github.com/containerd/continuity/fs/fstest" - "github.com/pkg/errors" "golang.org/x/sys/unix" ) @@ -125,7 +125,7 @@ func testFMountatWithFileFd(t *testing.T, root string) { err = fMountat(f.Fd(), filepath.Join(root, "empty"), filepath.Join(root, "work"), "", 0, "") if !errors.Is(err, expectedErr) { - t.Fatalf("expected error %v, but got %v", expectedErr, errors.Cause(err)) + t.Fatalf("expected error %v, but got %v", expectedErr, errors.Unwrap(err)) } } diff --git a/mount/lookup_unix.go b/mount/lookup_unix.go index 7a4683e95..44881750b 100644 --- a/mount/lookup_unix.go +++ b/mount/lookup_unix.go @@ -20,10 +20,10 @@ package mount import ( + "fmt" "path/filepath" "github.com/moby/sys/mountinfo" - "github.com/pkg/errors" ) // Lookup returns the mount info corresponds to the path. @@ -32,10 +32,10 @@ func Lookup(dir string) (Info, error) { m, err := mountinfo.GetMounts(mountinfo.ParentsFilter(dir)) if err != nil { - return Info{}, errors.Wrapf(err, "failed to find the mount info for %q", dir) + return Info{}, fmt.Errorf("failed to find the mount info for %q: %w", dir, err) } if len(m) == 0 { - return Info{}, errors.Errorf("failed to find the mount info for %q", dir) + return Info{}, fmt.Errorf("failed to find the mount info for %q", dir) } // find the longest matching mount point diff --git a/mount/losetup_linux.go b/mount/losetup_linux.go index e99e962f1..9a6801790 100644 --- a/mount/losetup_linux.go +++ b/mount/losetup_linux.go @@ -17,6 +17,7 @@ package mount import ( + "errors" "fmt" "math/rand" "os" @@ -25,7 +26,6 @@ import ( "time" "unsafe" - "github.com/pkg/errors" "golang.org/x/sys/unix" ) @@ -59,12 +59,12 @@ func ioctl(fd, req, args uintptr) (uintptr, uintptr, error) { func getFreeLoopDev() (uint32, error) { ctrl, err := os.OpenFile(loopControlPath, os.O_RDWR, 0) if err != nil { - return 0, errors.Errorf("could not open %v: %v", loopControlPath, err) + return 0, fmt.Errorf("could not open %v: %v", loopControlPath, err) } defer ctrl.Close() num, _, err := ioctl(ctrl.Fd(), unix.LOOP_CTL_GET_FREE, 0) if err != nil { - return 0, errors.Wrap(err, "could not get free loop device") + return 0, fmt.Errorf("could not get free loop device: %w", err) } return uint32(num), nil } @@ -81,13 +81,13 @@ func setupLoopDev(backingFile, loopDev string, param LoopParams) (_ *os.File, re back, err := os.OpenFile(backingFile, flags, 0) if err != nil { - return nil, errors.Wrapf(err, "could not open backing file: %s", backingFile) + return nil, fmt.Errorf("could not open backing file: %s: %w", backingFile, err) } defer back.Close() loop, err := os.OpenFile(loopDev, flags, 0) if err != nil { - return nil, errors.Wrapf(err, "could not open loop device: %s", loopDev) + return nil, fmt.Errorf("could not open loop device: %s: %w", loopDev, err) } defer func() { if retErr != nil { @@ -97,7 +97,7 @@ func setupLoopDev(backingFile, loopDev string, param LoopParams) (_ *os.File, re // 2. Set FD if _, _, err = ioctl(loop.Fd(), unix.LOOP_SET_FD, back.Fd()); err != nil { - return nil, errors.Wrapf(err, "could not set loop fd for device: %s", loopDev) + return nil, fmt.Errorf("could not set loop fd for device: %s: %w", loopDev, err) } // 3. Set Info @@ -131,7 +131,7 @@ func setupLoopDev(backingFile, loopDev string, param LoopParams) (_ *os.File, re } _, _, _ = ioctl(loop.Fd(), unix.LOOP_CLR_FD, 0) - return nil, errors.Errorf("failed to set loop device info: %v", err) + return nil, fmt.Errorf("failed to set loop device info: %v", err) } // setupLoop looks for (and possibly creates) a free loop device, and @@ -200,7 +200,7 @@ func AttachLoopDevice(backingFile string) (string, error) { func DetachLoopDevice(devices ...string) error { for _, dev := range devices { if err := removeLoop(dev); err != nil { - return errors.Wrapf(err, "failed to remove loop device: %s", dev) + return fmt.Errorf("failed to remove loop device: %s: %w", dev, err) } } diff --git a/mount/mount_freebsd.go b/mount/mount_freebsd.go index c7c48568e..3711383c6 100644 --- a/mount/mount_freebsd.go +++ b/mount/mount_freebsd.go @@ -17,10 +17,11 @@ package mount import ( + "errors" + "fmt" "os" "time" - "github.com/pkg/errors" exec "golang.org/x/sys/execabs" "golang.org/x/sys/unix" ) @@ -64,7 +65,7 @@ func (m *Mount) mountWithHelper(target string) error { return nil } if !errors.Is(err, unix.ECHILD) { - return errors.Wrapf(err, "mount [%v] failed: %q", args, string(out)) + return fmt.Errorf("mount [%v] failed: %q: %w", args, string(out), err) } // We got ECHILD, we are not sure whether the mount was successful. // If the mount ID has changed, we are sure we got some new mount, but still not sure it is fully completed. @@ -77,7 +78,7 @@ func (m *Mount) mountWithHelper(target string) error { _ = unmount(target, 0) } } - return errors.Errorf("mount [%v] failed with ECHILD (retired %d times)", args, retriesOnECHILD) + return fmt.Errorf("mount [%v] failed with ECHILD (retired %d times)", args, retriesOnECHILD) } // Unmount the provided mount path with the flags @@ -101,7 +102,7 @@ func unmount(target string, flags int) error { } return nil } - return errors.Wrapf(unix.EBUSY, "failed to unmount target %s", target) + return fmt.Errorf("failed to unmount target %s: %w", target, unix.EBUSY) } // UnmountAll repeatedly unmounts the given mount point until there diff --git a/mount/mount_linux.go b/mount/mount_linux.go index 42a53dbf6..a69f65c2d 100644 --- a/mount/mount_linux.go +++ b/mount/mount_linux.go @@ -17,13 +17,13 @@ package mount import ( + "errors" "fmt" "os" "path" "strings" "time" - "github.com/pkg/errors" exec "golang.org/x/sys/execabs" "golang.org/x/sys/unix" ) @@ -163,7 +163,7 @@ func unmount(target string, flags int) error { } return nil } - return errors.Wrapf(unix.EBUSY, "failed to unmount target %s", target) + return fmt.Errorf("failed to unmount target %s: %w", target, unix.EBUSY) } // UnmountAll repeatedly unmounts the given mount point until there @@ -365,19 +365,22 @@ func mountAt(chdir string, source, target, fstype string, flags uintptr, data st f, err := os.Open(chdir) if err != nil { - return errors.Wrap(err, "failed to mountat") + return fmt.Errorf("failed to mountat: %w", err) } defer f.Close() fs, err := f.Stat() if err != nil { - return errors.Wrap(err, "failed to mountat") + return fmt.Errorf("failed to mountat: %w", err) } if !fs.IsDir() { - return errors.Wrap(errors.Errorf("%s is not dir", chdir), "failed to mountat") + return fmt.Errorf("failed to mountat: %s is not dir", chdir) } - return errors.Wrap(fMountat(f.Fd(), source, target, fstype, flags, data), "failed to mountat") + if err := fMountat(f.Fd(), source, target, fstype, flags, data); err != nil { + return fmt.Errorf("failed to mountat: %w", err) + } + return nil } func (m *Mount) mountWithHelper(helperBinary, typePrefix, target string) error { @@ -406,7 +409,7 @@ func (m *Mount) mountWithHelper(helperBinary, typePrefix, target string) error { return nil } if !errors.Is(err, unix.ECHILD) { - return errors.Wrapf(err, "mount helper [%s %v] failed: %q", helperBinary, args, string(out)) + return fmt.Errorf("mount helper [%s %v] failed: %q: %w", helperBinary, args, string(out), err) } // We got ECHILD, we are not sure whether the mount was successful. // If the mount ID has changed, we are sure we got some new mount, but still not sure it is fully completed. @@ -419,5 +422,5 @@ func (m *Mount) mountWithHelper(helperBinary, typePrefix, target string) error { _ = unmount(target, 0) } } - return errors.Errorf("mount helper [%s %v] failed with ECHILD (retired %d times)", helperBinary, args, retriesOnECHILD) + return fmt.Errorf("mount helper [%s %v] failed with ECHILD (retired %d times)", helperBinary, args, retriesOnECHILD) } diff --git a/mount/mount_unix.go b/mount/mount_unix.go index 0e5306073..795bb4bfe 100644 --- a/mount/mount_unix.go +++ b/mount/mount_unix.go @@ -19,7 +19,7 @@ package mount -import "github.com/pkg/errors" +import "errors" var ( // ErrNotImplementOnUnix is returned for methods that are not implemented diff --git a/mount/mount_windows.go b/mount/mount_windows.go index 57e589f03..87fed8268 100644 --- a/mount/mount_windows.go +++ b/mount/mount_windows.go @@ -18,12 +18,13 @@ package mount import ( "encoding/json" + "errors" + "fmt" "os" "path/filepath" "strings" "github.com/Microsoft/hcsshim" - "github.com/pkg/errors" ) var ( @@ -34,7 +35,7 @@ var ( // Mount to the provided target func (m *Mount) Mount(target string) error { if m.Type != "windows-layer" { - return errors.Errorf("invalid windows mount type: '%s'", m.Type) + return fmt.Errorf("invalid windows mount type: '%s'", m.Type) } home, layerID := filepath.Split(m.Source) @@ -49,22 +50,22 @@ func (m *Mount) Mount(target string) error { } if err = hcsshim.ActivateLayer(di, layerID); err != nil { - return errors.Wrapf(err, "failed to activate layer %s", m.Source) + return fmt.Errorf("failed to activate layer %s: %w", m.Source, err) } if err = hcsshim.PrepareLayer(di, layerID, parentLayerPaths); err != nil { - return errors.Wrapf(err, "failed to prepare layer %s", m.Source) + return fmt.Errorf("failed to prepare layer %s: %w", m.Source, err) } // We can link the layer mount path to the given target. It is an UNC path, and it needs // a trailing backslash. mountPath, err := hcsshim.GetLayerMountPath(di, layerID) if err != nil { - return errors.Wrapf(err, "failed to get layer mount path for %s", m.Source) + return fmt.Errorf("failed to get layer mount path for %s: %w", m.Source, err) } mountPath = mountPath + `\` if err = os.Symlink(mountPath, target); err != nil { - return errors.Wrapf(err, "failed to link mount to taget %s", target) + return fmt.Errorf("failed to link mount to taget %s: %w", target, err) } return nil } @@ -80,7 +81,7 @@ func (m *Mount) GetParentPaths() ([]string, error) { if strings.HasPrefix(option, ParentLayerPathsFlag) { err := json.Unmarshal([]byte(option[len(ParentLayerPathsFlag):]), &parentLayerPaths) if err != nil { - return nil, errors.Wrap(err, "failed to unmarshal parent layer paths from mount") + return nil, fmt.Errorf("failed to unmarshal parent layer paths from mount: %w", err) } } } @@ -97,10 +98,10 @@ func Unmount(mount string, flags int) error { ) if err := hcsshim.UnprepareLayer(di, layerID); err != nil { - return errors.Wrapf(err, "failed to unprepare layer %s", mount) + return fmt.Errorf("failed to unprepare layer %s: %w", mount, err) } if err := hcsshim.DeactivateLayer(di, layerID); err != nil { - return errors.Wrapf(err, "failed to deactivate layer %s", mount) + return fmt.Errorf("failed to deactivate layer %s: %w", mount, err) } return nil diff --git a/mount/temp.go b/mount/temp.go index e304d4c33..5ea82c8ec 100644 --- a/mount/temp.go +++ b/mount/temp.go @@ -18,10 +18,10 @@ package mount import ( "context" + "fmt" "os" "github.com/containerd/containerd/log" - "github.com/pkg/errors" ) var tempMountLocation = getTempDir() @@ -32,7 +32,7 @@ var tempMountLocation = getTempDir() func WithTempMount(ctx context.Context, mounts []Mount, f func(root string) error) (err error) { root, uerr := os.MkdirTemp(tempMountLocation, "containerd-mount") if uerr != nil { - return errors.Wrapf(uerr, "failed to create temp dir") + return fmt.Errorf("failed to create temp dir: %w", err) } // We use Remove here instead of RemoveAll. // The RemoveAll will delete the temp dir and all children it contains. @@ -50,18 +50,21 @@ func WithTempMount(ctx context.Context, mounts []Mount, f func(root string) erro // We should do defer first, if not we will not do Unmount when only a part of Mounts are failed. defer func() { if uerr = UnmountAll(root, 0); uerr != nil { - uerr = errors.Wrapf(uerr, "failed to unmount %s", root) + uerr = fmt.Errorf("failed to unmount %s: %w", root, uerr) if err == nil { err = uerr } else { - err = errors.Wrap(err, uerr.Error()) + err = fmt.Errorf("%s: %w", uerr.Error(), err) } } }() if uerr = All(mounts, root); uerr != nil { - return errors.Wrapf(uerr, "failed to mount %s", root) + return fmt.Errorf("failed to mount %s: %w", root, uerr) } - return errors.Wrapf(f(root), "mount callback failed on %s", root) + if err := f(root); err != nil { + return fmt.Errorf("mount callback failed on %s: %w", root, err) + } + return nil } func getTempDir() string { diff --git a/namespaces/context.go b/namespaces/context.go index b53c9012c..e5e23fe43 100644 --- a/namespaces/context.go +++ b/namespaces/context.go @@ -18,11 +18,11 @@ package namespaces import ( "context" + "fmt" "os" "github.com/containerd/containerd/errdefs" "github.com/containerd/containerd/identifiers" - "github.com/pkg/errors" ) const ( @@ -69,10 +69,10 @@ func Namespace(ctx context.Context) (string, bool) { func NamespaceRequired(ctx context.Context) (string, error) { namespace, ok := Namespace(ctx) if !ok || namespace == "" { - return "", errors.Wrapf(errdefs.ErrFailedPrecondition, "namespace is required") + return "", fmt.Errorf("namespace is required: %w", errdefs.ErrFailedPrecondition) } if err := identifiers.Validate(namespace); err != nil { - return "", errors.Wrap(err, "namespace validation") + return "", fmt.Errorf("namespace validation: %w", err) } return namespace, nil } diff --git a/oci/spec_opts.go b/oci/spec_opts.go index b89b83c16..51eb6e00f 100644 --- a/oci/spec_opts.go +++ b/oci/spec_opts.go @@ -20,6 +20,7 @@ import ( "bufio" "context" "encoding/json" + "errors" "fmt" "os" "path/filepath" @@ -37,7 +38,6 @@ import ( v1 "github.com/opencontainers/image-spec/specs-go/v1" "github.com/opencontainers/runc/libcontainer/user" "github.com/opencontainers/runtime-spec/specs-go" - "github.com/pkg/errors" ) // SpecOpts sets spec specific information to a newly generated OCI spec @@ -138,7 +138,7 @@ func WithSpecFromBytes(p []byte) SpecOpts { return func(_ context.Context, _ Client, _ *containers.Container, s *Spec) error { *s = Spec{} // make sure spec is cleared. if err := json.Unmarshal(p, s); err != nil { - return errors.Wrapf(err, "decoding spec config file failed, current supported OCI runtime-spec : v%s", specs.Version) + return fmt.Errorf("decoding spec config file failed, current supported OCI runtime-spec : v%s: %w", specs.Version, err) } return nil } @@ -149,7 +149,7 @@ func WithSpecFromFile(filename string) SpecOpts { return func(ctx context.Context, c Client, container *containers.Container, s *Spec) error { p, err := os.ReadFile(filename) if err != nil { - return errors.Wrap(err, "cannot load spec config file") + return fmt.Errorf("cannot load spec config file: %w", err) } return WithSpecFromBytes(p)(ctx, c, container, s) } diff --git a/oci/spec_opts_nonlinux.go b/oci/spec_opts_nonlinux.go index b241e384f..c990fc634 100644 --- a/oci/spec_opts_nonlinux.go +++ b/oci/spec_opts_nonlinux.go @@ -21,9 +21,9 @@ package oci import ( "context" + "errors" "github.com/containerd/containerd/containers" - "github.com/pkg/errors" ) // WithAllCurrentCapabilities propagates the effective capabilities of the caller process to the container process. diff --git a/oci/spec_opts_windows.go b/oci/spec_opts_windows.go index 5c386b9d4..5502257a4 100644 --- a/oci/spec_opts_windows.go +++ b/oci/spec_opts_windows.go @@ -18,10 +18,10 @@ package oci import ( "context" + "errors" "github.com/containerd/containerd/containers" specs "github.com/opencontainers/runtime-spec/specs-go" - "github.com/pkg/errors" ) // WithWindowsCPUCount sets the `Windows.Resources.CPU.Count` section to the diff --git a/oci/utils_unix.go b/oci/utils_unix.go index f43d894c3..db75b0bad 100644 --- a/oci/utils_unix.go +++ b/oci/utils_unix.go @@ -20,12 +20,13 @@ package oci import ( + "errors" + "fmt" "os" "path/filepath" "github.com/containerd/containerd/pkg/userns" specs "github.com/opencontainers/runtime-spec/specs-go" - "github.com/pkg/errors" "golang.org/x/sys/unix" ) @@ -47,7 +48,7 @@ func HostDevices() ([]specs.LinuxDevice, error) { func getDevices(path, containerPath string) ([]specs.LinuxDevice, error) { stat, err := os.Stat(path) if err != nil { - return nil, errors.Wrap(err, "error stating device path") + return nil, fmt.Errorf("error stating device path: %w", err) } if !stat.IsDir() { diff --git a/pkg/cap/cap_linux.go b/pkg/cap/cap_linux.go index 9c37fba16..26212573d 100644 --- a/pkg/cap/cap_linux.go +++ b/pkg/cap/cap_linux.go @@ -19,12 +19,11 @@ package cap import ( "bufio" + "fmt" "io" "os" "strconv" "strings" - - "github.com/pkg/errors" ) // FromNumber returns a cap string like "CAP_SYS_ADMIN" @@ -91,7 +90,7 @@ func ParseProcPIDStatus(r io.Reader) (map[Type]uint64, error) { case "CapInh", "CapPrm", "CapEff", "CapBnd", "CapAmb": ui64, err := strconv.ParseUint(v, 16, 64) if err != nil { - return nil, errors.Errorf("failed to parse line %q", line) + return nil, fmt.Errorf("failed to parse line %q", line) } switch k { case "CapInh": diff --git a/pkg/cri/config/config.go b/pkg/cri/config/config.go index 54fb4b16d..9a986efb7 100644 --- a/pkg/cri/config/config.go +++ b/pkg/cri/config/config.go @@ -18,12 +18,13 @@ package config import ( "context" + "errors" + "fmt" "net/url" "time" "github.com/containerd/containerd/log" "github.com/containerd/containerd/plugin" - "github.com/pkg/errors" ) // Runtime struct to contain the type(ID), engine, and root variables for a default runtime @@ -346,7 +347,7 @@ func ValidatePluginConfig(ctx context.Context, c *PluginConfig) error { if c.ContainerdConfig.UntrustedWorkloadRuntime.Type != "" { log.G(ctx).Warning("`untrusted_workload_runtime` is deprecated, please use `untrusted` runtime in `runtimes` instead") if _, ok := c.ContainerdConfig.Runtimes[RuntimeUntrusted]; ok { - return errors.Errorf("conflicting definitions: configuration includes both `untrusted_workload_runtime` and `runtimes[%q]`", RuntimeUntrusted) + return fmt.Errorf("conflicting definitions: configuration includes both `untrusted_workload_runtime` and `runtimes[%q]`", RuntimeUntrusted) } c.ContainerdConfig.Runtimes[RuntimeUntrusted] = c.ContainerdConfig.UntrustedWorkloadRuntime } @@ -363,19 +364,19 @@ func ValidatePluginConfig(ctx context.Context, c *PluginConfig) error { return errors.New("`default_runtime_name` is empty") } if _, ok := c.ContainerdConfig.Runtimes[c.ContainerdConfig.DefaultRuntimeName]; !ok { - return errors.Errorf("no corresponding runtime configured in `containerd.runtimes` for `containerd` `default_runtime_name = \"%s\"", c.ContainerdConfig.DefaultRuntimeName) + return fmt.Errorf("no corresponding runtime configured in `containerd.runtimes` for `containerd` `default_runtime_name = \"%s\"", c.ContainerdConfig.DefaultRuntimeName) } // Validation for deprecated runtime options. if c.SystemdCgroup { if c.ContainerdConfig.Runtimes[c.ContainerdConfig.DefaultRuntimeName].Type != plugin.RuntimeLinuxV1 { - return errors.Errorf("`systemd_cgroup` only works for runtime %s", plugin.RuntimeLinuxV1) + return fmt.Errorf("`systemd_cgroup` only works for runtime %s", plugin.RuntimeLinuxV1) } log.G(ctx).Warning("`systemd_cgroup` is deprecated, please use runtime `options` instead") } if c.NoPivot { if c.ContainerdConfig.Runtimes[c.ContainerdConfig.DefaultRuntimeName].Type != plugin.RuntimeLinuxV1 { - return errors.Errorf("`no_pivot` only works for runtime %s", plugin.RuntimeLinuxV1) + return fmt.Errorf("`no_pivot` only works for runtime %s", plugin.RuntimeLinuxV1) } // NoPivot can't be deprecated yet, because there is no alternative config option // for `io.containerd.runtime.v1.linux`. @@ -383,13 +384,13 @@ func ValidatePluginConfig(ctx context.Context, c *PluginConfig) error { for _, r := range c.ContainerdConfig.Runtimes { if r.Engine != "" { if r.Type != plugin.RuntimeLinuxV1 { - return errors.Errorf("`runtime_engine` only works for runtime %s", plugin.RuntimeLinuxV1) + return fmt.Errorf("`runtime_engine` only works for runtime %s", plugin.RuntimeLinuxV1) } log.G(ctx).Warning("`runtime_engine` is deprecated, please use runtime `options` instead") } if r.Root != "" { if r.Type != plugin.RuntimeLinuxV1 { - return errors.Errorf("`runtime_root` only works for runtime %s", plugin.RuntimeLinuxV1) + return fmt.Errorf("`runtime_root` only works for runtime %s", plugin.RuntimeLinuxV1) } log.G(ctx).Warning("`runtime_root` is deprecated, please use runtime `options` instead") } @@ -425,7 +426,7 @@ func ValidatePluginConfig(ctx context.Context, c *PluginConfig) error { auth := auth u, err := url.Parse(endpoint) if err != nil { - return errors.Wrapf(err, "failed to parse registry url %q from `registry.auths`", endpoint) + return fmt.Errorf("failed to parse registry url %q from `registry.auths`: %w", endpoint, err) } if u.Scheme != "" { // Do not include the scheme in the new registry config. @@ -441,7 +442,7 @@ func ValidatePluginConfig(ctx context.Context, c *PluginConfig) error { // Validation for stream_idle_timeout if c.StreamIdleTimeout != "" { if _, err := time.ParseDuration(c.StreamIdleTimeout); err != nil { - return errors.Wrap(err, "invalid stream idle timeout") + return fmt.Errorf("invalid stream idle timeout: %w", err) } } return nil diff --git a/pkg/cri/cri.go b/pkg/cri/cri.go index d798e8732..7182716b6 100644 --- a/pkg/cri/cri.go +++ b/pkg/cri/cri.go @@ -18,6 +18,7 @@ package cri import ( "flag" + "fmt" "path/filepath" "github.com/containerd/containerd" @@ -35,7 +36,6 @@ import ( "github.com/containerd/containerd/services" "github.com/containerd/containerd/snapshots" imagespec "github.com/opencontainers/image-spec/specs-go/v1" - "github.com/pkg/errors" "github.com/sirupsen/logrus" "k8s.io/klog/v2" @@ -44,7 +44,6 @@ import ( "github.com/containerd/containerd/pkg/cri/server" ) -// TODO(random-liu): Use github.com/pkg/errors for our errors. // Register CRI service plugin func init() { config := criconfig.DefaultConfig() @@ -66,7 +65,7 @@ func initCRIService(ic *plugin.InitContext) (interface{}, error) { ctx := ic.Context pluginConfig := ic.Config.(*criconfig.PluginConfig) if err := criconfig.ValidatePluginConfig(ctx, pluginConfig); err != nil { - return nil, errors.Wrap(err, "invalid plugin config") + return nil, fmt.Errorf("invalid plugin config: %w", err) } c := criconfig.Config{ @@ -79,12 +78,12 @@ func initCRIService(ic *plugin.InitContext) (interface{}, error) { log.G(ctx).Infof("Start cri plugin with config %+v", c) if err := setGLogLevel(); err != nil { - return nil, errors.Wrap(err, "failed to set glog level") + return nil, fmt.Errorf("failed to set glog level: %w", err) } servicesOpts, err := getServicesOpts(ic) if err != nil { - return nil, errors.Wrap(err, "failed to get services") + return nil, fmt.Errorf("failed to get services: %w", err) } log.G(ctx).Info("Connect containerd service") @@ -95,12 +94,12 @@ func initCRIService(ic *plugin.InitContext) (interface{}, error) { containerd.WithServices(servicesOpts...), ) if err != nil { - return nil, errors.Wrap(err, "failed to create containerd client") + return nil, fmt.Errorf("failed to create containerd client: %w", err) } s, err := server.NewCRIService(c, client) if err != nil { - return nil, errors.Wrap(err, "failed to create CRI service") + return nil, fmt.Errorf("failed to create CRI service: %w", err) } go func() { @@ -116,12 +115,12 @@ func initCRIService(ic *plugin.InitContext) (interface{}, error) { func getServicesOpts(ic *plugin.InitContext) ([]containerd.ServicesOpt, error) { plugins, err := ic.GetByType(plugin.ServicePlugin) if err != nil { - return nil, errors.Wrap(err, "failed to get service plugin") + return nil, fmt.Errorf("failed to get service plugin: %w", err) } ep, err := ic.Get(plugin.EventPlugin) if err != nil { - return nil, errors.Wrap(err, "failed to get event plugin") + return nil, fmt.Errorf("failed to get event plugin: %w", err) } opts := []containerd.ServicesOpt{ @@ -158,14 +157,14 @@ func getServicesOpts(ic *plugin.InitContext) ([]containerd.ServicesOpt, error) { } { p := plugins[s] if p == nil { - return nil, errors.Errorf("service %q not found", s) + return nil, fmt.Errorf("service %q not found", s) } i, err := p.Instance() if err != nil { - return nil, errors.Wrapf(err, "failed to get instance of service %q", s) + return nil, fmt.Errorf("failed to get instance of service %q: %w", s, err) } if i == nil { - return nil, errors.Errorf("instance of service %q not found", s) + return nil, fmt.Errorf("instance of service %q not found", s) } opts = append(opts, fn(i)) } diff --git a/pkg/cri/io/helpers_windows.go b/pkg/cri/io/helpers_windows.go index 1dbb1aa61..b6c9c1202 100644 --- a/pkg/cri/io/helpers_windows.go +++ b/pkg/cri/io/helpers_windows.go @@ -17,13 +17,13 @@ package io import ( + "fmt" "io" "net" "os" "sync" winio "github.com/Microsoft/go-winio" - "github.com/pkg/errors" "golang.org/x/net/context" ) @@ -60,7 +60,7 @@ func openPipe(ctx context.Context, fn string, flag int, perm os.FileMode) (io.Re func (p *pipe) Write(b []byte) (int, error) { p.conWg.Wait() if p.conErr != nil { - return 0, errors.Wrap(p.conErr, "connection error") + return 0, fmt.Errorf("connection error: %w", p.conErr) } return p.con.Write(b) } @@ -68,7 +68,7 @@ func (p *pipe) Write(b []byte) (int, error) { func (p *pipe) Read(b []byte) (int, error) { p.conWg.Wait() if p.conErr != nil { - return 0, errors.Wrap(p.conErr, "connection error") + return 0, fmt.Errorf("connection error: %w", p.conErr) } return p.con.Read(b) } diff --git a/pkg/cri/opts/container.go b/pkg/cri/opts/container.go index f619bc311..b3e358b2e 100644 --- a/pkg/cri/opts/container.go +++ b/pkg/cri/opts/container.go @@ -18,6 +18,8 @@ package opts import ( "context" + "errors" + "fmt" "os" "path/filepath" goruntime "runtime" @@ -30,7 +32,6 @@ import ( "github.com/containerd/containerd/mount" "github.com/containerd/containerd/snapshots" "github.com/containerd/continuity/fs" - "github.com/pkg/errors" ) // WithNewSnapshot wraps `containerd.WithNewSnapshot` so that if creating the @@ -44,7 +45,7 @@ func WithNewSnapshot(id string, i containerd.Image, opts ...snapshots.Opt) conta } if err := i.Unpack(ctx, c.Snapshotter); err != nil { - return errors.Wrap(err, "error unpacking image") + return fmt.Errorf("error unpacking image: %w", err) } return f(ctx, client, c) } @@ -102,7 +103,7 @@ func WithVolumes(volumeMounts map[string]string) containerd.NewContainerOpts { } else { mountPaths = append(mountPaths, root) if err := mount.All(mounts, root); err != nil { - return errors.Wrap(err, "failed to mount") + return fmt.Errorf("failed to mount: %w", err) } defer unmounter(root) } @@ -117,10 +118,10 @@ func WithVolumes(volumeMounts map[string]string) containerd.NewContainerOpts { // Skip copying directory if it does not exist. continue } - return errors.Wrap(err, "stat volume in rootfs") + return fmt.Errorf("stat volume in rootfs: %w", err) } if err := copyExistingContents(src, host); err != nil { - return errors.Wrap(err, "taking runtime copy of volume") + return fmt.Errorf("taking runtime copy of volume: %w", err) } } } @@ -136,7 +137,7 @@ func copyExistingContents(source, destination string) error { return err } if len(dstList) != 0 { - return errors.Errorf("volume at %q is not initially empty", destination) + return fmt.Errorf("volume at %q is not initially empty", destination) } return fs.CopyDir(destination, source, fs.WithXAttrExclude("security.selinux")) } diff --git a/pkg/cri/opts/spec.go b/pkg/cri/opts/spec.go index 17d1c08e4..df10fbf50 100644 --- a/pkg/cri/opts/spec.go +++ b/pkg/cri/opts/spec.go @@ -18,16 +18,15 @@ package opts import ( "context" + "errors" "os" "path/filepath" "strings" "github.com/containerd/containerd/containers" "github.com/containerd/containerd/oci" - imagespec "github.com/opencontainers/image-spec/specs-go/v1" runtimespec "github.com/opencontainers/runtime-spec/specs-go" - "github.com/pkg/errors" runtime "k8s.io/cri-api/pkg/apis/runtime/v1" ) diff --git a/pkg/cri/opts/spec_linux.go b/pkg/cri/opts/spec_linux.go index 7babd23d9..9306d42b6 100644 --- a/pkg/cri/opts/spec_linux.go +++ b/pkg/cri/opts/spec_linux.go @@ -18,6 +18,7 @@ package opts import ( "context" + "errors" "fmt" "os" "path/filepath" @@ -33,7 +34,6 @@ import ( "github.com/containerd/containerd/oci" runtimespec "github.com/opencontainers/runtime-spec/specs-go" "github.com/opencontainers/selinux/go-selinux/label" - "github.com/pkg/errors" "github.com/sirupsen/logrus" "golang.org/x/sys/unix" runtime "k8s.io/cri-api/pkg/apis/runtime/v1" @@ -159,17 +159,17 @@ func WithMounts(osi osinterface.OS, config *runtime.ContainerConfig, extra []*ru // TODO(random-liu): Add CRI validation test for this case. if _, err := osi.Stat(src); err != nil { if !os.IsNotExist(err) { - return errors.Wrapf(err, "failed to stat %q", src) + return fmt.Errorf("failed to stat %q: %w", src, err) } if err := osi.MkdirAll(src, 0755); err != nil { - return errors.Wrapf(err, "failed to mkdir %q", src) + return fmt.Errorf("failed to mkdir %q: %w", src, err) } } // TODO(random-liu): Add cri-containerd integration test or cri validation test // for this. src, err := osi.ResolveSymbolicLink(src) if err != nil { - return errors.Wrapf(err, "failed to resolve symlink %q", src) + return fmt.Errorf("failed to resolve symlink %q: %w", src, err) } if s.Linux == nil { s.Linux = &runtimespec.Linux{} @@ -210,7 +210,7 @@ func WithMounts(osi osinterface.OS, config *runtime.ContainerConfig, extra []*ru if mount.GetSelinuxRelabel() { if err := label.Relabel(src, mountLabel, false); err != nil && err != unix.ENOTSUP { - return errors.Wrapf(err, "relabel %q with %q failed", src, mountLabel) + return fmt.Errorf("relabel %q with %q failed: %w", src, mountLabel, err) } } s.Mounts = append(s.Mounts, runtimespec.Mount{ @@ -239,7 +239,7 @@ func ensureShared(path string, lookupMount func(string) (mount.Info, error)) err } } - return errors.Errorf("path %q is mounted on %q but it is not a shared mount", path, mountInfo.Mountpoint) + return fmt.Errorf("path %q is mounted on %q but it is not a shared mount", path, mountInfo.Mountpoint) } // ensure mount point on which path is mounted, is either shared or slave. @@ -257,7 +257,7 @@ func ensureSharedOrSlave(path string, lookupMount func(string) (mount.Info, erro return nil } } - return errors.Errorf("path %q is mounted on %q but it is not a shared or slave mount", path, mountInfo.Mountpoint) + return fmt.Errorf("path %q is mounted on %q but it is not a shared or slave mount", path, mountInfo.Mountpoint) } // getDeviceUserGroupID() is used to find the right uid/gid @@ -514,7 +514,7 @@ var ( func cgroupv1HasHugetlb() (bool, error) { _cgroupv1HasHugetlbOnce.Do(func() { if _, err := os.ReadDir("/sys/fs/cgroup/hugetlb"); err != nil { - _cgroupv1HasHugetlbErr = errors.Wrap(err, "readdir /sys/fs/cgroup/hugetlb") + _cgroupv1HasHugetlbErr = fmt.Errorf("readdir /sys/fs/cgroup/hugetlb: %w", err) _cgroupv1HasHugetlb = false } else { _cgroupv1HasHugetlbErr = nil @@ -530,7 +530,7 @@ func cgroupv2HasHugetlb() (bool, error) { _cgroupv2HasHugetlbOnce.Do(func() { controllers, err := os.ReadFile("/sys/fs/cgroup/cgroup.controllers") if err != nil { - _cgroupv2HasHugetlbErr = errors.Wrap(err, "read /sys/fs/cgroup/cgroup.controllers") + _cgroupv2HasHugetlbErr = fmt.Errorf("read /sys/fs/cgroup/cgroup.controllers: %w", err) return } _cgroupv2HasHugetlb = strings.Contains(string(controllers), "hugetlb") @@ -678,12 +678,12 @@ func nullOpt(_ context.Context, _ oci.Client, _ *containers.Container, _ *runtim func getCurrentOOMScoreAdj() (int, error) { b, err := os.ReadFile("/proc/self/oom_score_adj") if err != nil { - return 0, errors.Wrap(err, "could not get the daemon oom_score_adj") + return 0, fmt.Errorf("could not get the daemon oom_score_adj: %w", err) } s := strings.TrimSpace(string(b)) i, err := strconv.Atoi(s) if err != nil { - return 0, errors.Wrap(err, "could not get the daemon oom_score_adj") + return 0, fmt.Errorf("could not get the daemon oom_score_adj: %w", err) } return i, nil } diff --git a/pkg/cri/opts/spec_windows.go b/pkg/cri/opts/spec_windows.go index 213095eee..c534c180c 100644 --- a/pkg/cri/opts/spec_windows.go +++ b/pkg/cri/opts/spec_windows.go @@ -18,6 +18,7 @@ package opts import ( "context" + "fmt" "os" "path/filepath" "sort" @@ -26,7 +27,6 @@ import ( "github.com/containerd/containerd/containers" "github.com/containerd/containerd/oci" runtimespec "github.com/opencontainers/runtime-spec/specs-go" - "github.com/pkg/errors" runtime "k8s.io/cri-api/pkg/apis/runtime/v1" osinterface "github.com/containerd/containerd/pkg/os" @@ -124,16 +124,16 @@ func WithWindowsMounts(osi osinterface.OS, config *runtime.ContainerConfig, extr // the behavior with the Linux implementation, but it doesn't // align with Docker's behavior on Windows. if !os.IsNotExist(err) { - return errors.Wrapf(err, "failed to stat %q", src) + return fmt.Errorf("failed to stat %q: %w", src, err) } if err := osi.MkdirAll(src, 0755); err != nil { - return errors.Wrapf(err, "failed to mkdir %q", src) + return fmt.Errorf("failed to mkdir %q: %w", src, err) } } var err error src, err = osi.ResolveSymbolicLink(src) if err != nil { - return errors.Wrapf(err, "failed to resolve symlink %q", src) + return fmt.Errorf("failed to resolve symlink %q: %w", src, err) } // hcsshim requires clean path, especially '/' -> '\'. Additionally, // for the destination, absolute paths should have the C: prefix. diff --git a/pkg/cri/server/cni_conf_syncer.go b/pkg/cri/server/cni_conf_syncer.go index 401cb34a3..2d3940056 100644 --- a/pkg/cri/server/cni_conf_syncer.go +++ b/pkg/cri/server/cni_conf_syncer.go @@ -17,12 +17,12 @@ package server import ( + "fmt" "os" "sync" cni "github.com/containerd/go-cni" "github.com/fsnotify/fsnotify" - "github.com/pkg/errors" "github.com/sirupsen/logrus" ) @@ -43,15 +43,15 @@ type cniNetConfSyncer struct { func newCNINetConfSyncer(confDir string, netPlugin cni.CNI, loadOpts []cni.Opt) (*cniNetConfSyncer, error) { watcher, err := fsnotify.NewWatcher() if err != nil { - return nil, errors.Wrap(err, "failed to create fsnotify watcher") + return nil, fmt.Errorf("failed to create fsnotify watcher: %w", err) } if err := os.MkdirAll(confDir, 0700); err != nil { - return nil, errors.Wrapf(err, "failed to create cni conf dir=%s for watch", confDir) + return nil, fmt.Errorf("failed to create cni conf dir=%s for watch: %w", confDir, err) } if err := watcher.Add(confDir); err != nil { - return nil, errors.Wrapf(err, "failed to watch cni conf dir %s", confDir) + return nil, fmt.Errorf("failed to watch cni conf dir %s: %w", confDir, err) } syncer := &cniNetConfSyncer{ diff --git a/pkg/cri/server/container_attach.go b/pkg/cri/server/container_attach.go index f5ba0fcf7..a95215051 100644 --- a/pkg/cri/server/container_attach.go +++ b/pkg/cri/server/container_attach.go @@ -17,11 +17,11 @@ package server import ( + "fmt" "io" "github.com/containerd/containerd" "github.com/containerd/containerd/log" - "github.com/pkg/errors" "golang.org/x/net/context" "k8s.io/client-go/tools/remotecommand" runtime "k8s.io/cri-api/pkg/apis/runtime/v1" @@ -33,11 +33,11 @@ import ( func (c *criService) Attach(ctx context.Context, r *runtime.AttachRequest) (*runtime.AttachResponse, error) { cntr, err := c.containerStore.Get(r.GetContainerId()) if err != nil { - return nil, errors.Wrap(err, "failed to find container in store") + return nil, fmt.Errorf("failed to find container in store: %w", err) } state := cntr.Status.Get().State() if state != runtime.ContainerState_CONTAINER_RUNNING { - return nil, errors.Errorf("container is in %s state", criContainerStateToString(state)) + return nil, fmt.Errorf("container is in %s state", criContainerStateToString(state)) } return c.streamServer.GetAttach(r) } @@ -49,18 +49,18 @@ func (c *criService) attachContainer(ctx context.Context, id string, stdin io.Re // Get container from our container store. cntr, err := c.containerStore.Get(id) if err != nil { - return errors.Wrapf(err, "failed to find container %q in store", id) + return fmt.Errorf("failed to find container %q in store: %w", id, err) } id = cntr.ID state := cntr.Status.Get().State() if state != runtime.ContainerState_CONTAINER_RUNNING { - return errors.Errorf("container is in %s state", criContainerStateToString(state)) + return fmt.Errorf("container is in %s state", criContainerStateToString(state)) } task, err := cntr.Container.Task(ctx, nil) if err != nil { - return errors.Wrap(err, "failed to load task") + return fmt.Errorf("failed to load task: %w", err) } handleResizing(ctx, resize, func(size remotecommand.TerminalSize) { if err := task.Resize(ctx, uint32(size.Width), uint32(size.Height)); err != nil { diff --git a/pkg/cri/server/container_create.go b/pkg/cri/server/container_create.go index 39ac33a9e..abfdb937a 100644 --- a/pkg/cri/server/container_create.go +++ b/pkg/cri/server/container_create.go @@ -17,6 +17,8 @@ package server import ( + "errors" + "fmt" "path/filepath" "time" @@ -30,7 +32,6 @@ import ( imagespec "github.com/opencontainers/image-spec/specs-go/v1" runtimespec "github.com/opencontainers/runtime-spec/specs-go" selinux "github.com/opencontainers/selinux/go-selinux" - "github.com/pkg/errors" "golang.org/x/net/context" runtime "k8s.io/cri-api/pkg/apis/runtime/v1" @@ -53,12 +54,12 @@ func (c *criService) CreateContainer(ctx context.Context, r *runtime.CreateConta sandboxConfig := r.GetSandboxConfig() sandbox, err := c.sandboxStore.Get(r.GetPodSandboxId()) if err != nil { - return nil, errors.Wrapf(err, "failed to find sandbox id %q", r.GetPodSandboxId()) + return nil, fmt.Errorf("failed to find sandbox id %q: %w", r.GetPodSandboxId(), err) } sandboxID := sandbox.ID s, err := sandbox.Container.Task(ctx, nil) if err != nil { - return nil, errors.Wrap(err, "failed to get sandbox container task") + return nil, fmt.Errorf("failed to get sandbox container task: %w", err) } sandboxPid := s.Pid() @@ -74,7 +75,7 @@ func (c *criService) CreateContainer(ctx context.Context, r *runtime.CreateConta name := makeContainerName(metadata, sandboxConfig.GetMetadata()) log.G(ctx).Debugf("Generated id %q for container %q", id, name) if err = c.containerNameIndex.Reserve(name, id); err != nil { - return nil, errors.Wrapf(err, "failed to reserve container name %q", name) + return nil, fmt.Errorf("failed to reserve container name %q: %w", name, err) } defer func() { // Release the name if the function returns with an error. @@ -95,25 +96,25 @@ func (c *criService) CreateContainer(ctx context.Context, r *runtime.CreateConta // been pulled before creating the container, so do not ensure the image. image, err := c.localResolve(config.GetImage().GetImage()) if err != nil { - return nil, errors.Wrapf(err, "failed to resolve image %q", config.GetImage().GetImage()) + return nil, fmt.Errorf("failed to resolve image %q: %w", config.GetImage().GetImage(), err) } containerdImage, err := c.toContainerdImage(ctx, image) if err != nil { - return nil, errors.Wrapf(err, "failed to get image from containerd %q", image.ID) + return nil, fmt.Errorf("failed to get image from containerd %q: %w", image.ID, err) } start := time.Now() // Run container using the same runtime with sandbox. sandboxInfo, err := sandbox.Container.Info(ctx) if err != nil { - return nil, errors.Wrapf(err, "failed to get sandbox %q info", sandboxID) + return nil, fmt.Errorf("failed to get sandbox %q info: %w", sandboxID, err) } // Create container root directory. containerRootDir := c.getContainerRootDir(id) if err = c.os.MkdirAll(containerRootDir, 0755); err != nil { - return nil, errors.Wrapf(err, "failed to create container root directory %q", - containerRootDir) + return nil, fmt.Errorf("failed to create container root directory %q: %w", + containerRootDir, err) } defer func() { if retErr != nil { @@ -126,8 +127,8 @@ func (c *criService) CreateContainer(ctx context.Context, r *runtime.CreateConta }() volatileContainerRootDir := c.getVolatileContainerRootDir(id) if err = c.os.MkdirAll(volatileContainerRootDir, 0755); err != nil { - return nil, errors.Wrapf(err, "failed to create volatile container root directory %q", - volatileContainerRootDir) + return nil, fmt.Errorf("failed to create volatile container root directory %q: %w", + volatileContainerRootDir, err) } defer func() { if retErr != nil { @@ -152,14 +153,14 @@ func (c *criService) CreateContainer(ctx context.Context, r *runtime.CreateConta ociRuntime, err := c.getSandboxRuntime(sandboxConfig, sandbox.Metadata.RuntimeHandler) if err != nil { - return nil, errors.Wrap(err, "failed to get sandbox runtime") + return nil, fmt.Errorf("failed to get sandbox runtime: %w", err) } log.G(ctx).Debugf("Use OCI runtime %+v for sandbox %q and container %q", ociRuntime, sandboxID, id) spec, err := c.containerSpec(id, sandboxID, sandboxPid, sandbox.NetNSPath, containerName, containerdImage.Name(), config, sandboxConfig, &image.ImageSpec.Config, append(mounts, volumeMounts...), ociRuntime) if err != nil { - return nil, errors.Wrapf(err, "failed to generate container %q spec", id) + return nil, fmt.Errorf("failed to generate container %q spec: %w", id, err) } meta.ProcessLabel = spec.Process.SelinuxLabel @@ -216,7 +217,7 @@ func (c *criService) CreateContainer(ctx context.Context, r *runtime.CreateConta containerIO, err := cio.NewContainerIO(id, cio.WithNewFIFOs(volatileContainerRootDir, config.GetTty(), config.GetStdin())) if err != nil { - return nil, errors.Wrap(err, "failed to create container io") + return nil, fmt.Errorf("failed to create container io: %w", err) } defer func() { if retErr != nil { @@ -228,14 +229,14 @@ func (c *criService) CreateContainer(ctx context.Context, r *runtime.CreateConta specOpts, err := c.containerSpecOpts(config, &image.ImageSpec.Config) if err != nil { - return nil, errors.Wrap(err, "failed to get container spec opts") + return nil, fmt.Errorf("failed to get container spec opts: %w", err) } containerLabels := buildLabels(config.Labels, image.ImageSpec.Config.Labels, containerKindContainer) runtimeOptions, err := getRuntimeOptions(sandboxInfo) if err != nil { - return nil, errors.Wrap(err, "failed to get runtime options") + return nil, fmt.Errorf("failed to get runtime options: %w", err) } opts = append(opts, containerd.WithSpec(spec, specOpts...), @@ -244,7 +245,7 @@ func (c *criService) CreateContainer(ctx context.Context, r *runtime.CreateConta containerd.WithContainerExtension(containerMetadataExtension, &meta)) var cntr containerd.Container if cntr, err = c.client.NewContainer(ctx, id, opts...); err != nil { - return nil, errors.Wrap(err, "failed to create containerd container") + return nil, fmt.Errorf("failed to create containerd container: %w", err) } defer func() { if retErr != nil { @@ -263,7 +264,7 @@ func (c *criService) CreateContainer(ctx context.Context, r *runtime.CreateConta containerstore.WithContainerIO(containerIO), ) if err != nil { - return nil, errors.Wrapf(err, "failed to create internal container object for %q", id) + return nil, fmt.Errorf("failed to create internal container object for %q: %w", id, err) } defer func() { if retErr != nil { @@ -276,7 +277,7 @@ func (c *criService) CreateContainer(ctx context.Context, r *runtime.CreateConta // Add container into container store. if err := c.containerStore.Add(container); err != nil { - return nil, errors.Wrapf(err, "failed to add container %q into store", id) + return nil, fmt.Errorf("failed to add container %q into store: %w", id, err) } containerCreateTimer.WithValues(ociRuntime.Type).UpdateSince(start) @@ -321,19 +322,19 @@ func (c *criService) runtimeSpec(id string, baseSpecFile string, opts ...oci.Spe if baseSpecFile != "" { baseSpec, ok := c.baseOCISpecs[baseSpecFile] if !ok { - return nil, errors.Errorf("can't find base OCI spec %q", baseSpecFile) + return nil, fmt.Errorf("can't find base OCI spec %q", baseSpecFile) } spec := oci.Spec{} if err := util.DeepCopy(&spec, &baseSpec); err != nil { - return nil, errors.Wrap(err, "failed to clone OCI spec") + return nil, fmt.Errorf("failed to clone OCI spec: %w", err) } // Fix up cgroups path applyOpts := append([]oci.SpecOpts{oci.WithNamespacedCgroup()}, opts...) if err := oci.ApplyOpts(ctx, nil, container, &spec, applyOpts...); err != nil { - return nil, errors.Wrap(err, "failed to apply OCI options") + return nil, fmt.Errorf("failed to apply OCI options: %w", err) } return &spec, nil @@ -341,7 +342,7 @@ func (c *criService) runtimeSpec(id string, baseSpecFile string, opts ...oci.Spe spec, err := oci.GenerateSpec(ctx, nil, container, opts...) if err != nil { - return nil, errors.Wrap(err, "failed to generate spec") + return nil, fmt.Errorf("failed to generate spec: %w", err) } return spec, nil diff --git a/pkg/cri/server/container_create_linux.go b/pkg/cri/server/container_create_linux.go index 359f2ada9..8fb41e210 100644 --- a/pkg/cri/server/container_create_linux.go +++ b/pkg/cri/server/container_create_linux.go @@ -18,6 +18,8 @@ package server import ( "bufio" + "errors" + "fmt" "io" "os" "strconv" @@ -31,7 +33,6 @@ import ( runtimespec "github.com/opencontainers/runtime-spec/specs-go" selinux "github.com/opencontainers/selinux/go-selinux" "github.com/opencontainers/selinux/go-selinux/label" - "github.com/pkg/errors" runtime "k8s.io/cri-api/pkg/apis/runtime/v1" "github.com/containerd/containerd/pkg/cri/annotations" @@ -187,7 +188,7 @@ func (c *criService) containerSpec( processLabel, mountLabel, err := label.InitLabels(labelOptions) if err != nil { - return nil, errors.Wrapf(err, "failed to init selinux options %+v", securityContext.GetSelinuxOptions()) + return nil, fmt.Errorf("failed to init selinux options %+v: %w", securityContext.GetSelinuxOptions(), err) } defer func() { if retErr != nil { @@ -262,7 +263,7 @@ func (c *criService) containerSpec( // Get RDT class rdtClass, err := c.rdtClassFromAnnotations(config.GetMetadata().GetName(), config.Annotations, sandboxConfig.Annotations) if err != nil { - return nil, errors.Wrap(err, "failed to set RDT class") + return nil, fmt.Errorf("failed to set RDT class: %w", err) } if rdtClass != "" { specOpts = append(specOpts, oci.WithRdt(rdtClass, "", "")) @@ -286,7 +287,7 @@ func (c *criService) containerSpec( if nsOpts.GetPid() == runtime.NamespaceMode_TARGET { targetContainer, err := c.validateTargetContainer(sandboxID, nsOpts.TargetId) if err != nil { - return nil, errors.Wrapf(err, "invalid target container") + return nil, fmt.Errorf("invalid target container: %w", err) } status := targetContainer.Status.Get() @@ -328,7 +329,7 @@ func (c *criService) containerSpecOpts(config *runtime.ContainerConfig, imageCon securityContext.GetRunAsUser(), securityContext.GetRunAsGroup()) if err != nil { - return nil, errors.Wrap(err, "failed to generate user string") + return nil, fmt.Errorf("failed to generate user string: %w", err) } if userstr == "" { // Lastly, since no user override was passed via CRI try to set via OCI @@ -352,7 +353,7 @@ func (c *criService) containerSpecOpts(config *runtime.ContainerConfig, imageCon if asp == nil { asp, err = generateApparmorSecurityProfile(securityContext.GetApparmorProfile()) //nolint:staticcheck // Deprecated but we don't want to remove yet if err != nil { - return nil, errors.Wrap(err, "failed to generate apparmor spec opts") + return nil, fmt.Errorf("failed to generate apparmor spec opts: %w", err) } } apparmorSpecOpts, err := generateApparmorSpecOpts( @@ -360,7 +361,7 @@ func (c *criService) containerSpecOpts(config *runtime.ContainerConfig, imageCon securityContext.GetPrivileged(), c.apparmorEnabled()) if err != nil { - return nil, errors.Wrap(err, "failed to generate apparmor spec opts") + return nil, fmt.Errorf("failed to generate apparmor spec opts: %w", err) } if apparmorSpecOpts != nil { specOpts = append(specOpts, apparmorSpecOpts) @@ -372,7 +373,7 @@ func (c *criService) containerSpecOpts(config *runtime.ContainerConfig, imageCon securityContext.GetSeccompProfilePath(), //nolint:staticcheck // Deprecated but we don't want to remove yet c.config.UnsetSeccompProfile) if err != nil { - return nil, errors.Wrap(err, "failed to generate seccomp spec opts") + return nil, fmt.Errorf("failed to generate seccomp spec opts: %w", err) } } seccompSpecOpts, err := c.generateSeccompSpecOpts( @@ -380,7 +381,7 @@ func (c *criService) containerSpecOpts(config *runtime.ContainerConfig, imageCon securityContext.GetPrivileged(), c.seccompEnabled()) if err != nil { - return nil, errors.Wrap(err, "failed to generate seccomp spec opts") + return nil, fmt.Errorf("failed to generate seccomp spec opts: %w", err) } if seccompSpecOpts != nil { specOpts = append(specOpts, seccompSpecOpts) @@ -417,7 +418,7 @@ func generateSecurityProfile(profilePath string) (*runtime.SecurityProfile, erro default: // Require and Trim default profile name prefix if !strings.HasPrefix(profilePath, profileNamePrefix) { - return nil, errors.Errorf("invalid profile %q", profilePath) + return nil, fmt.Errorf("invalid profile %q", profilePath) } return &runtime.SecurityProfile{ ProfileType: runtime.SecurityProfile_Localhost, @@ -503,9 +504,9 @@ func generateApparmorSpecOpts(sp *runtime.SecurityProfile, privileged, apparmorE appArmorProfile := strings.TrimPrefix(sp.LocalhostRef, profileNamePrefix) if profileExists, err := appArmorProfileExists(appArmorProfile); !profileExists { if err != nil { - return nil, errors.Wrap(err, "failed to generate apparmor spec opts") + return nil, fmt.Errorf("failed to generate apparmor spec opts: %w", err) } - return nil, errors.Errorf("apparmor profile not found %s", appArmorProfile) + return nil, fmt.Errorf("apparmor profile not found %s", appArmorProfile) } return apparmor.WithProfile(appArmorProfile), nil default: @@ -568,7 +569,7 @@ func generateUserString(username string, uid, gid *runtime.Int64Value) (string, } if userstr == "" { if groupstr != "" { - return "", errors.Errorf("user group %q is specified without user", groupstr) + return "", fmt.Errorf("user group %q is specified without user", groupstr) } return "", nil } diff --git a/pkg/cri/server/container_create_linux_test.go b/pkg/cri/server/container_create_linux_test.go index d41f3b686..95f2aa6de 100644 --- a/pkg/cri/server/container_create_linux_test.go +++ b/pkg/cri/server/container_create_linux_test.go @@ -18,6 +18,7 @@ package server import ( "context" + "errors" "fmt" "os" "path/filepath" @@ -33,7 +34,6 @@ import ( imagespec "github.com/opencontainers/image-spec/specs-go/v1" runtimespec "github.com/opencontainers/runtime-spec/specs-go" "github.com/opencontainers/selinux/go-selinux" - "github.com/pkg/errors" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" runtime "k8s.io/cri-api/pkg/apis/runtime/v1" diff --git a/pkg/cri/server/container_exec.go b/pkg/cri/server/container_exec.go index e870ffa42..0a27792ec 100644 --- a/pkg/cri/server/container_exec.go +++ b/pkg/cri/server/container_exec.go @@ -17,7 +17,8 @@ package server import ( - "github.com/pkg/errors" + "fmt" + "golang.org/x/net/context" runtime "k8s.io/cri-api/pkg/apis/runtime/v1" ) @@ -26,11 +27,11 @@ import ( func (c *criService) Exec(ctx context.Context, r *runtime.ExecRequest) (*runtime.ExecResponse, error) { cntr, err := c.containerStore.Get(r.GetContainerId()) if err != nil { - return nil, errors.Wrapf(err, "failed to find container %q in store", r.GetContainerId()) + return nil, fmt.Errorf("failed to find container %q in store: %w", r.GetContainerId(), err) } state := cntr.Status.Get().State() if state != runtime.ContainerState_CONTAINER_RUNNING { - return nil, errors.Errorf("container is in %s state", criContainerStateToString(state)) + return nil, fmt.Errorf("container is in %s state", criContainerStateToString(state)) } return c.streamServer.GetExec(r) } diff --git a/pkg/cri/server/container_execsync.go b/pkg/cri/server/container_execsync.go index 3b1c58c46..9be392f9c 100644 --- a/pkg/cri/server/container_execsync.go +++ b/pkg/cri/server/container_execsync.go @@ -18,6 +18,7 @@ package server import ( "bytes" + "fmt" "io" "syscall" "time" @@ -27,7 +28,6 @@ import ( "github.com/containerd/containerd/errdefs" "github.com/containerd/containerd/log" "github.com/containerd/containerd/oci" - "github.com/pkg/errors" "golang.org/x/net/context" "k8s.io/client-go/tools/remotecommand" runtime "k8s.io/cri-api/pkg/apis/runtime/v1" @@ -49,7 +49,7 @@ func (c *criService) ExecSync(ctx context.Context, r *runtime.ExecSyncRequest) ( timeout: time.Duration(r.GetTimeout()) * time.Second, }) if err != nil { - return nil, errors.Wrap(err, "failed to exec in container") + return nil, fmt.Errorf("failed to exec in container: %w", err) } return &runtime.ExecSyncResponse{ @@ -79,18 +79,18 @@ func (c *criService) execInternal(ctx context.Context, container containerd.Cont spec, err := container.Spec(ctx) if err != nil { - return nil, errors.Wrap(err, "failed to get container spec") + return nil, fmt.Errorf("failed to get container spec: %w", err) } task, err := container.Task(ctx, nil) if err != nil { - return nil, errors.Wrap(err, "failed to load task") + return nil, fmt.Errorf("failed to load task: %w", err) } pspec := spec.Process pspec.Terminal = opts.tty if opts.tty { if err := oci.WithEnv([]string{"TERM=xterm"})(ctx, nil, nil, spec); err != nil { - return nil, errors.Wrap(err, "add TERM env var to spec") + return nil, fmt.Errorf("add TERM env var to spec: %w", err) } } @@ -114,7 +114,7 @@ func (c *criService) execInternal(ctx context.Context, container containerd.Cont }, ) if err != nil { - return nil, errors.Wrapf(err, "failed to create exec %q", execID) + return nil, fmt.Errorf("failed to create exec %q: %w", execID, err) } defer func() { deferCtx, deferCancel := ctrdutil.DeferContext() @@ -126,10 +126,10 @@ func (c *criService) execInternal(ctx context.Context, container containerd.Cont exitCh, err := process.Wait(ctx) if err != nil { - return nil, errors.Wrapf(err, "failed to wait for process %q", execID) + return nil, fmt.Errorf("failed to wait for process %q: %w", execID, err) } if err := process.Start(ctx); err != nil { - return nil, errors.Wrapf(err, "failed to start exec %q", execID) + return nil, fmt.Errorf("failed to start exec %q: %w", execID, err) } handleResizing(ctx, opts.resize, func(size remotecommand.TerminalSize) { @@ -160,7 +160,7 @@ func (c *criService) execInternal(ctx context.Context, container containerd.Cont case <-execCtx.Done(): // Ignore the not found error because the process may exit itself before killing. if err := process.Kill(ctx, syscall.SIGKILL); err != nil && !errdefs.IsNotFound(err) { - return nil, errors.Wrapf(err, "failed to kill exec %q", execID) + return nil, fmt.Errorf("failed to kill exec %q: %w", execID, err) } // Wait for the process to be killed. exitRes := <-exitCh @@ -168,12 +168,12 @@ func (c *criService) execInternal(ctx context.Context, container containerd.Cont execID, exitRes.ExitCode(), exitRes.Error()) <-attachDone log.G(ctx).Debugf("Stream pipe for exec process %q done", execID) - return nil, errors.Wrapf(execCtx.Err(), "timeout %v exceeded", opts.timeout) + return nil, fmt.Errorf("timeout %v exceeded: %w", opts.timeout, execCtx.Err()) case exitRes := <-exitCh: code, _, err := exitRes.Result() log.G(ctx).Debugf("Exec process %q exits with exit code %d and error %v", execID, code, err) if err != nil { - return nil, errors.Wrapf(err, "failed while waiting for exec %q", execID) + return nil, fmt.Errorf("failed while waiting for exec %q: %w", execID, err) } <-attachDone log.G(ctx).Debugf("Stream pipe for exec process %q done", execID) @@ -198,13 +198,13 @@ func (c *criService) execInContainer(ctx context.Context, id string, opts execOp cntr, err := c.containerStore.Get(id) if err != nil { - return nil, errors.Wrapf(err, "failed to find container %q in store", id) + return nil, fmt.Errorf("failed to find container %q in store: %w", id, err) } id = cntr.ID state := cntr.Status.Get().State() if state != runtime.ContainerState_CONTAINER_RUNNING { - return nil, errors.Errorf("container is in %s state", criContainerStateToString(state)) + return nil, fmt.Errorf("container is in %s state", criContainerStateToString(state)) } return c.execInternal(ctx, cntr.Container, id, opts) diff --git a/pkg/cri/server/container_log_reopen.go b/pkg/cri/server/container_log_reopen.go index d7f7403cc..292d92d37 100644 --- a/pkg/cri/server/container_log_reopen.go +++ b/pkg/cri/server/container_log_reopen.go @@ -17,7 +17,9 @@ package server import ( - "github.com/pkg/errors" + "errors" + "fmt" + "golang.org/x/net/context" runtime "k8s.io/cri-api/pkg/apis/runtime/v1" @@ -28,7 +30,7 @@ import ( func (c *criService) ReopenContainerLog(ctx context.Context, r *runtime.ReopenContainerLogRequest) (*runtime.ReopenContainerLogResponse, error) { container, err := c.containerStore.Get(r.GetContainerId()) if err != nil { - return nil, errors.Wrapf(err, "an error occurred when try to find container %q", r.GetContainerId()) + return nil, fmt.Errorf("an error occurred when try to find container %q: %w", r.GetContainerId(), err) } if container.Status.Get().State() != runtime.ContainerState_CONTAINER_RUNNING { diff --git a/pkg/cri/server/container_remove.go b/pkg/cri/server/container_remove.go index f9d38ab44..86a52550a 100644 --- a/pkg/cri/server/container_remove.go +++ b/pkg/cri/server/container_remove.go @@ -17,14 +17,14 @@ package server import ( + "errors" + "fmt" "time" "github.com/containerd/containerd" "github.com/containerd/containerd/errdefs" "github.com/containerd/containerd/log" containerstore "github.com/containerd/containerd/pkg/cri/store/container" - - "github.com/pkg/errors" "github.com/sirupsen/logrus" "golang.org/x/net/context" runtime "k8s.io/cri-api/pkg/apis/runtime/v1" @@ -36,7 +36,7 @@ func (c *criService) RemoveContainer(ctx context.Context, r *runtime.RemoveConta container, err := c.containerStore.Get(r.GetContainerId()) if err != nil { if !errdefs.IsNotFound(err) { - return nil, errors.Wrapf(err, "an error occurred when try to find container %q", r.GetContainerId()) + return nil, fmt.Errorf("an error occurred when try to find container %q: %w", r.GetContainerId(), err) } // Do not return error if container metadata doesn't exist. log.G(ctx).Tracef("RemoveContainer called for container %q that does not exist", r.GetContainerId()) @@ -45,7 +45,7 @@ func (c *criService) RemoveContainer(ctx context.Context, r *runtime.RemoveConta id := container.ID i, err := container.Container.Info(ctx) if err != nil { - return nil, errors.Wrap(err, "get container info") + return nil, fmt.Errorf("get container info: %w", err) } // Forcibly stop the containers if they are in running or unknown state @@ -54,7 +54,7 @@ func (c *criService) RemoveContainer(ctx context.Context, r *runtime.RemoveConta state == runtime.ContainerState_CONTAINER_UNKNOWN { logrus.Infof("Forcibly stopping container %q", id) if err := c.stopContainer(ctx, container, 0); err != nil { - return nil, errors.Wrapf(err, "failed to forcibly stop container %q", id) + return nil, fmt.Errorf("failed to forcibly stop container %q: %w", id, err) } } @@ -62,7 +62,7 @@ func (c *criService) RemoveContainer(ctx context.Context, r *runtime.RemoveConta // Set removing state to prevent other start/remove operations against this container // while it's being removed. if err := setContainerRemoving(container); err != nil { - return nil, errors.Wrapf(err, "failed to set removing state for container %q", id) + return nil, fmt.Errorf("failed to set removing state for container %q: %w", id, err) } defer func() { if retErr != nil { @@ -81,25 +81,25 @@ func (c *criService) RemoveContainer(ctx context.Context, r *runtime.RemoveConta // Delete containerd container. if err := container.Container.Delete(ctx, containerd.WithSnapshotCleanup); err != nil { if !errdefs.IsNotFound(err) { - return nil, errors.Wrapf(err, "failed to delete containerd container %q", id) + return nil, fmt.Errorf("failed to delete containerd container %q: %w", id, err) } log.G(ctx).Tracef("Remove called for containerd container %q that does not exist", id) } // Delete container checkpoint. if err := container.Delete(); err != nil { - return nil, errors.Wrapf(err, "failed to delete container checkpoint for %q", id) + return nil, fmt.Errorf("failed to delete container checkpoint for %q: %w", id, err) } containerRootDir := c.getContainerRootDir(id) if err := ensureRemoveAll(ctx, containerRootDir); err != nil { - return nil, errors.Wrapf(err, "failed to remove container root directory %q", - containerRootDir) + return nil, fmt.Errorf("failed to remove container root directory %q: %w", + containerRootDir, err) } volatileContainerRootDir := c.getVolatileContainerRootDir(id) if err := ensureRemoveAll(ctx, volatileContainerRootDir); err != nil { - return nil, errors.Wrapf(err, "failed to remove volatile container root directory %q", - volatileContainerRootDir) + return nil, fmt.Errorf("failed to remove volatile container root directory %q: %w", + volatileContainerRootDir, err) } c.containerStore.Delete(id) diff --git a/pkg/cri/server/container_start.go b/pkg/cri/server/container_start.go index be5532a64..35ec64b50 100644 --- a/pkg/cri/server/container_start.go +++ b/pkg/cri/server/container_start.go @@ -17,6 +17,8 @@ package server import ( + "errors" + "fmt" "io" "time" @@ -26,7 +28,6 @@ import ( "github.com/containerd/containerd/log" "github.com/containerd/nri" v1 "github.com/containerd/nri/types/v1" - "github.com/pkg/errors" "github.com/sirupsen/logrus" "golang.org/x/net/context" runtime "k8s.io/cri-api/pkg/apis/runtime/v1" @@ -43,12 +44,12 @@ func (c *criService) StartContainer(ctx context.Context, r *runtime.StartContain start := time.Now() cntr, err := c.containerStore.Get(r.GetContainerId()) if err != nil { - return nil, errors.Wrapf(err, "an error occurred when try to find container %q", r.GetContainerId()) + return nil, fmt.Errorf("an error occurred when try to find container %q: %w", r.GetContainerId(), err) } info, err := cntr.Container.Info(ctx) if err != nil { - return nil, errors.Wrap(err, "get container info") + return nil, fmt.Errorf("get container info: %w", err) } id := cntr.ID @@ -59,7 +60,7 @@ func (c *criService) StartContainer(ctx context.Context, r *runtime.StartContain // Set starting state to prevent other start/remove operations against this container // while it's being started. if err := setContainerStarting(cntr); err != nil { - return nil, errors.Wrapf(err, "failed to set starting state for container %q", id) + return nil, fmt.Errorf("failed to set starting state for container %q: %w", id, err) } defer func() { if retErr != nil { @@ -83,11 +84,11 @@ func (c *criService) StartContainer(ctx context.Context, r *runtime.StartContain // Get sandbox config from sandbox store. sandbox, err := c.sandboxStore.Get(meta.SandboxID) if err != nil { - return nil, errors.Wrapf(err, "sandbox %q not found", meta.SandboxID) + return nil, fmt.Errorf("sandbox %q not found: %w", meta.SandboxID, err) } sandboxID := meta.SandboxID if sandbox.Status.Get().State != sandboxstore.StateReady { - return nil, errors.Errorf("sandbox container %q is not running", sandboxID) + return nil, fmt.Errorf("sandbox container %q is not running", sandboxID) } // Recheck target container validity in Linux namespace options. @@ -96,7 +97,7 @@ func (c *criService) StartContainer(ctx context.Context, r *runtime.StartContain if nsOpts.GetPid() == runtime.NamespaceMode_TARGET { _, err := c.validateTargetContainer(sandboxID, nsOpts.TargetId) if err != nil { - return nil, errors.Wrap(err, "invalid target container") + return nil, fmt.Errorf("invalid target container: %w", err) } } } @@ -104,7 +105,7 @@ func (c *criService) StartContainer(ctx context.Context, r *runtime.StartContain ioCreation := func(id string) (_ containerdio.IO, err error) { stdoutWC, stderrWC, err := c.createContainerLoggers(meta.LogPath, config.GetTty()) if err != nil { - return nil, errors.Wrap(err, "failed to create container loggers") + return nil, fmt.Errorf("failed to create container loggers: %w", err) } cntr.IO.AddOutput("log", stdoutWC, stderrWC) cntr.IO.Pipe() @@ -113,12 +114,12 @@ func (c *criService) StartContainer(ctx context.Context, r *runtime.StartContain ctrInfo, err := container.Info(ctx) if err != nil { - return nil, errors.Wrap(err, "failed to get container info") + return nil, fmt.Errorf("failed to get container info: %w", err) } ociRuntime, err := c.getSandboxRuntime(sandbox.Config, sandbox.Metadata.RuntimeHandler) if err != nil { - return nil, errors.Wrap(err, "failed to get sandbox runtime") + return nil, fmt.Errorf("failed to get sandbox runtime: %w", err) } taskOpts := c.taskOpts(ctrInfo.Runtime.Name) @@ -127,7 +128,7 @@ func (c *criService) StartContainer(ctx context.Context, r *runtime.StartContain } task, err := container.NewTask(ctx, ioCreation, taskOpts...) if err != nil { - return nil, errors.Wrap(err, "failed to create containerd task") + return nil, fmt.Errorf("failed to create containerd task: %w", err) } defer func() { if retErr != nil { @@ -143,7 +144,7 @@ func (c *criService) StartContainer(ctx context.Context, r *runtime.StartContain // wait is a long running background request, no timeout needed. exitCh, err := task.Wait(ctrdutil.NamespacedContext()) if err != nil { - return nil, errors.Wrap(err, "failed to wait for containerd task") + return nil, fmt.Errorf("failed to wait for containerd task: %w", err) } nric, err := nri.New() if err != nil { @@ -155,13 +156,13 @@ func (c *criService) StartContainer(ctx context.Context, r *runtime.StartContain Labels: sandbox.Config.Labels, } if _, err := nric.InvokeWithSandbox(ctx, task, v1.Create, nriSB); err != nil { - return nil, errors.Wrap(err, "nri invoke") + return nil, fmt.Errorf("nri invoke: %w", err) } } // Start containerd task. if err := task.Start(ctx); err != nil { - return nil, errors.Wrapf(err, "failed to start containerd task %q", id) + return nil, fmt.Errorf("failed to start containerd task %q: %w", id, err) } // Update container start timestamp. @@ -170,7 +171,7 @@ func (c *criService) StartContainer(ctx context.Context, r *runtime.StartContain status.StartedAt = time.Now().UnixNano() return status, nil }); err != nil { - return nil, errors.Wrapf(err, "failed to update container %q state", id) + return nil, fmt.Errorf("failed to update container %q state: %w", id, err) } // It handles the TaskExit event and update container state after this. @@ -187,7 +188,7 @@ func setContainerStarting(container containerstore.Container) error { return container.Status.Update(func(status containerstore.Status) (containerstore.Status, error) { // Return error if container is not in created state. if status.State() != runtime.ContainerState_CONTAINER_CREATED { - return status, errors.Errorf("container is in %s state", criContainerStateToString(status.State())) + return status, fmt.Errorf("container is in %s state", criContainerStateToString(status.State())) } // Do not start the container when there is a removal in progress. if status.Removing { @@ -216,7 +217,7 @@ func (c *criService) createContainerLoggers(logPath string, tty bool) (stdout io // Only generate container log when log path is specified. f, err := openLogFile(logPath) if err != nil { - return nil, nil, errors.Wrap(err, "failed to create and open log file") + return nil, nil, fmt.Errorf("failed to create and open log file: %w", err) } defer func() { if err != nil { diff --git a/pkg/cri/server/container_stats.go b/pkg/cri/server/container_stats.go index da45b61aa..c2a829635 100644 --- a/pkg/cri/server/container_stats.go +++ b/pkg/cri/server/container_stats.go @@ -17,8 +17,9 @@ package server import ( + "fmt" + tasks "github.com/containerd/containerd/api/services/tasks/v1" - "github.com/pkg/errors" "golang.org/x/net/context" runtime "k8s.io/cri-api/pkg/apis/runtime/v1" ) @@ -28,20 +29,20 @@ import ( func (c *criService) ContainerStats(ctx context.Context, in *runtime.ContainerStatsRequest) (*runtime.ContainerStatsResponse, error) { cntr, err := c.containerStore.Get(in.GetContainerId()) if err != nil { - return nil, errors.Wrap(err, "failed to find container") + return nil, fmt.Errorf("failed to find container: %w", err) } request := &tasks.MetricsRequest{Filters: []string{"id==" + cntr.ID}} resp, err := c.client.TaskService().Metrics(ctx, request) if err != nil { - return nil, errors.Wrap(err, "failed to fetch metrics for task") + return nil, fmt.Errorf("failed to fetch metrics for task: %w", err) } if len(resp.Metrics) != 1 { - return nil, errors.Errorf("unexpected metrics response: %+v", resp.Metrics) + return nil, fmt.Errorf("unexpected metrics response: %+v", resp.Metrics) } cs, err := c.containerMetrics(cntr.Metadata, resp.Metrics[0]) if err != nil { - return nil, errors.Wrap(err, "failed to decode container metrics") + return nil, fmt.Errorf("failed to decode container metrics: %w", err) } return &runtime.ContainerStatsResponse{Stats: cs}, nil } diff --git a/pkg/cri/server/container_stats_list.go b/pkg/cri/server/container_stats_list.go index 6248f5552..bc796fb98 100644 --- a/pkg/cri/server/container_stats_list.go +++ b/pkg/cri/server/container_stats_list.go @@ -17,9 +17,10 @@ package server import ( + "fmt" + tasks "github.com/containerd/containerd/api/services/tasks/v1" "github.com/containerd/containerd/api/types" - "github.com/pkg/errors" "golang.org/x/net/context" runtime "k8s.io/cri-api/pkg/apis/runtime/v1" @@ -33,15 +34,15 @@ func (c *criService) ListContainerStats( ) (*runtime.ListContainerStatsResponse, error) { request, containers, err := c.buildTaskMetricsRequest(in) if err != nil { - return nil, errors.Wrap(err, "failed to build metrics request") + return nil, fmt.Errorf("failed to build metrics request: %w", err) } resp, err := c.client.TaskService().Metrics(ctx, &request) if err != nil { - return nil, errors.Wrap(err, "failed to fetch metrics for tasks") + return nil, fmt.Errorf("failed to fetch metrics for tasks: %w", err) } criStats, err := c.toCRIContainerStats(resp.Metrics, containers) if err != nil { - return nil, errors.Wrap(err, "failed to convert to cri containerd stats format") + return nil, fmt.Errorf("failed to convert to cri containerd stats format: %w", err) } return criStats, nil } @@ -58,7 +59,7 @@ func (c *criService) toCRIContainerStats( for _, cntr := range containers { cs, err := c.containerMetrics(cntr.Metadata, statsMap[cntr.ID]) if err != nil { - return nil, errors.Wrapf(err, "failed to decode container metrics for %q", cntr.ID) + return nil, fmt.Errorf("failed to decode container metrics for %q: %w", cntr.ID, err) } containerStats.Stats = append(containerStats.Stats, cs) } diff --git a/pkg/cri/server/container_stats_list_linux.go b/pkg/cri/server/container_stats_list_linux.go index bac0de339..77372d176 100644 --- a/pkg/cri/server/container_stats_list_linux.go +++ b/pkg/cri/server/container_stats_list_linux.go @@ -17,13 +17,13 @@ package server import ( + "fmt" "time" "github.com/containerd/containerd/api/types" v1 "github.com/containerd/containerd/metrics/types/v1" v2 "github.com/containerd/containerd/metrics/types/v2" "github.com/containerd/typeurl" - "github.com/pkg/errors" runtime "k8s.io/cri-api/pkg/apis/runtime/v1" containerstore "github.com/containerd/containerd/pkg/cri/store/container" @@ -61,18 +61,18 @@ func (c *criService) containerMetrics( if stats != nil { s, err := typeurl.UnmarshalAny(stats.Data) if err != nil { - return nil, errors.Wrap(err, "failed to extract container metrics") + return nil, fmt.Errorf("failed to extract container metrics: %w", err) } cpuStats, err := c.cpuContainerStats(meta.ID, false /* isSandbox */, s, stats.Timestamp) if err != nil { - return nil, errors.Wrap(err, "failed to obtain cpu stats") + return nil, fmt.Errorf("failed to obtain cpu stats: %w", err) } cs.Cpu = cpuStats memoryStats, err := c.memoryContainerStats(meta.ID, s, stats.Timestamp) if err != nil { - return nil, errors.Wrap(err, "failed to obtain memory stats") + return nil, fmt.Errorf("failed to obtain memory stats: %w", err) } cs.Memory = memoryStats } @@ -86,13 +86,13 @@ func (c *criService) getUsageNanoCores(containerID string, isSandbox bool, curre if isSandbox { sandbox, err := c.sandboxStore.Get(containerID) if err != nil { - return 0, errors.Wrapf(err, "failed to get sandbox container: %s", containerID) + return 0, fmt.Errorf("failed to get sandbox container: %s: %w", containerID, err) } oldStats = sandbox.Stats } else { container, err := c.containerStore.Get(containerID) if err != nil { - return 0, errors.Wrapf(err, "failed to get container ID: %s", containerID) + return 0, fmt.Errorf("failed to get container ID: %s: %w", containerID, err) } oldStats = container.Stats } @@ -105,12 +105,12 @@ func (c *criService) getUsageNanoCores(containerID string, isSandbox bool, curre if isSandbox { err := c.sandboxStore.UpdateContainerStats(containerID, newStats) if err != nil { - return 0, errors.Wrapf(err, "failed to update sandbox stats container ID: %s", containerID) + return 0, fmt.Errorf("failed to update sandbox stats container ID: %s: %w", containerID, err) } } else { err := c.containerStore.UpdateContainerStats(containerID, newStats) if err != nil { - return 0, errors.Wrapf(err, "failed to update container stats ID: %s", containerID) + return 0, fmt.Errorf("failed to update container stats ID: %s: %w", containerID, err) } } return 0, nil @@ -133,13 +133,13 @@ func (c *criService) getUsageNanoCores(containerID string, isSandbox bool, curre if isSandbox { err := c.sandboxStore.UpdateContainerStats(containerID, newStats) if err != nil { - return 0, errors.Wrapf(err, "failed to update sandbox container stats: %s", containerID) + return 0, fmt.Errorf("failed to update sandbox container stats: %s: %w", containerID, err) } } else { err := c.containerStore.UpdateContainerStats(containerID, newStats) if err != nil { - return 0, errors.Wrapf(err, "failed to update container stats ID: %s", containerID) + return 0, fmt.Errorf("failed to update container stats ID: %s: %w", containerID, err) } } @@ -204,7 +204,7 @@ func (c *criService) cpuContainerStats(ID string, isSandbox bool, stats interfac usageNanoCores, err := c.getUsageNanoCores(ID, isSandbox, metrics.CPU.Usage.Total, timestamp) if err != nil { - return nil, errors.Wrapf(err, "failed to get usage nano cores, containerID: %s", ID) + return nil, fmt.Errorf("failed to get usage nano cores, containerID: %s: %w", ID, err) } return &runtime.CpuUsage{ @@ -220,7 +220,7 @@ func (c *criService) cpuContainerStats(ID string, isSandbox bool, stats interfac usageNanoCores, err := c.getUsageNanoCores(ID, isSandbox, usageCoreNanoSeconds, timestamp) if err != nil { - return nil, errors.Wrapf(err, "failed to get usage nano cores, containerID: %s", ID) + return nil, fmt.Errorf("failed to get usage nano cores, containerID: %s: %w", ID, err) } return &runtime.CpuUsage{ @@ -230,7 +230,7 @@ func (c *criService) cpuContainerStats(ID string, isSandbox bool, stats interfac }, nil } default: - return nil, errors.Errorf("unexpected metrics type: %v", metrics) + return nil, fmt.Errorf("unexpected metrics type: %v", metrics) } return nil, nil } @@ -272,7 +272,7 @@ func (c *criService) memoryContainerStats(ID string, stats interface{}, timestam }, nil } default: - return nil, errors.Errorf("unexpected metrics type: %v", metrics) + return nil, fmt.Errorf("unexpected metrics type: %v", metrics) } return nil, nil } diff --git a/pkg/cri/server/container_stats_list_other.go b/pkg/cri/server/container_stats_list_other.go index b86926128..bed0b6b6a 100644 --- a/pkg/cri/server/container_stats_list_other.go +++ b/pkg/cri/server/container_stats_list_other.go @@ -20,9 +20,10 @@ package server import ( + "fmt" + "github.com/containerd/containerd/api/types" "github.com/containerd/containerd/errdefs" - "github.com/pkg/errors" runtime "k8s.io/cri-api/pkg/apis/runtime/v1" containerstore "github.com/containerd/containerd/pkg/cri/store/container" @@ -33,5 +34,5 @@ func (c *criService) containerMetrics( stats *types.Metric, ) (*runtime.ContainerStats, error) { var cs runtime.ContainerStats - return &cs, errors.Wrap(errdefs.ErrNotImplemented, "container metrics") + return &cs, fmt.Errorf("container metrics: %w", errdefs.ErrNotImplemented) } diff --git a/pkg/cri/server/container_stats_list_windows.go b/pkg/cri/server/container_stats_list_windows.go index cd1d76e50..e2ec1918b 100644 --- a/pkg/cri/server/container_stats_list_windows.go +++ b/pkg/cri/server/container_stats_list_windows.go @@ -17,10 +17,12 @@ package server import ( + "errors" + "fmt" + wstats "github.com/Microsoft/hcsshim/cmd/containerd-shim-runhcs-v1/stats" "github.com/containerd/containerd/api/types" "github.com/containerd/typeurl" - "github.com/pkg/errors" runtime "k8s.io/cri-api/pkg/apis/runtime/v1" containerstore "github.com/containerd/containerd/pkg/cri/store/container" @@ -57,7 +59,7 @@ func (c *criService) containerMetrics( if stats != nil { s, err := typeurl.UnmarshalAny(stats.Data) if err != nil { - return nil, errors.Wrap(err, "failed to extract container metrics") + return nil, fmt.Errorf("failed to extract container metrics: %w", err) } wstats := s.(*wstats.Statistics).GetWindows() if wstats == nil { diff --git a/pkg/cri/server/container_status.go b/pkg/cri/server/container_status.go index 88c3fa6bb..9779a090f 100644 --- a/pkg/cri/server/container_status.go +++ b/pkg/cri/server/container_status.go @@ -18,12 +18,12 @@ package server import ( "encoding/json" + "fmt" "github.com/containerd/containerd/errdefs" containerstore "github.com/containerd/containerd/pkg/cri/store/container" runtimespec "github.com/opencontainers/runtime-spec/specs-go" - "github.com/pkg/errors" "golang.org/x/net/context" runtime "k8s.io/cri-api/pkg/apis/runtime/v1" ) @@ -32,7 +32,7 @@ import ( func (c *criService) ContainerStatus(ctx context.Context, r *runtime.ContainerStatusRequest) (*runtime.ContainerStatusResponse, error) { container, err := c.containerStore.Get(r.GetContainerId()) if err != nil { - return nil, errors.Wrapf(err, "an error occurred when try to find container %q", r.GetContainerId()) + return nil, fmt.Errorf("an error occurred when try to find container %q: %w", r.GetContainerId(), err) } // TODO(random-liu): Clean up the following logic in CRI. @@ -45,7 +45,7 @@ func (c *criService) ContainerStatus(ctx context.Context, r *runtime.ContainerSt image, err := c.imageStore.Get(imageRef) if err != nil { if !errdefs.IsNotFound(err) { - return nil, errors.Wrapf(err, "failed to get image %q", imageRef) + return nil, fmt.Errorf("failed to get image %q: %w", imageRef, err) } } else { repoTags, repoDigests := parseImageReferences(image.References) @@ -64,14 +64,14 @@ func (c *criService) ContainerStatus(ctx context.Context, r *runtime.ContainerSt // CRI doesn't allow CreatedAt == 0. info, err := container.Container.Info(ctx) if err != nil { - return nil, errors.Wrapf(err, "failed to get CreatedAt in %q state", status.State) + return nil, fmt.Errorf("failed to get CreatedAt in %q state: %w", status.State, err) } status.CreatedAt = info.CreatedAt.UnixNano() } info, err := toCRIContainerInfo(ctx, container, r.GetVerbose()) if err != nil { - return nil, errors.Wrap(err, "failed to get verbose container info") + return nil, fmt.Errorf("failed to get verbose container info: %w", err) } return &runtime.ContainerStatusResponse{ @@ -156,26 +156,26 @@ func toCRIContainerInfo(ctx context.Context, container containerstore.Container, var err error ci.RuntimeSpec, err = container.Container.Spec(ctx) if err != nil { - return nil, errors.Wrap(err, "failed to get container runtime spec") + return nil, fmt.Errorf("failed to get container runtime spec: %w", err) } ctrInfo, err := container.Container.Info(ctx) if err != nil { - return nil, errors.Wrap(err, "failed to get container info") + return nil, fmt.Errorf("failed to get container info: %w", err) } ci.SnapshotKey = ctrInfo.SnapshotKey ci.Snapshotter = ctrInfo.Snapshotter runtimeOptions, err := getRuntimeOptions(ctrInfo) if err != nil { - return nil, errors.Wrap(err, "failed to get runtime options") + return nil, fmt.Errorf("failed to get runtime options: %w", err) } ci.RuntimeType = ctrInfo.Runtime.Name ci.RuntimeOptions = runtimeOptions infoBytes, err := json.Marshal(ci) if err != nil { - return nil, errors.Wrapf(err, "failed to marshal info %v", ci) + return nil, fmt.Errorf("failed to marshal info %v: %w", ci, err) } return map[string]string{ "info": string(infoBytes), diff --git a/pkg/cri/server/container_stop.go b/pkg/cri/server/container_stop.go index 88460f606..80854fe8b 100644 --- a/pkg/cri/server/container_stop.go +++ b/pkg/cri/server/container_stop.go @@ -17,6 +17,7 @@ package server import ( + "fmt" "sync/atomic" "syscall" "time" @@ -28,7 +29,6 @@ import ( ctrdutil "github.com/containerd/containerd/pkg/cri/util" "github.com/moby/sys/signal" - "github.com/pkg/errors" "golang.org/x/net/context" runtime "k8s.io/cri-api/pkg/apis/runtime/v1" ) @@ -39,7 +39,7 @@ func (c *criService) StopContainer(ctx context.Context, r *runtime.StopContainer // Get container config from container store. container, err := c.containerStore.Get(r.GetContainerId()) if err != nil { - return nil, errors.Wrapf(err, "an error occurred when try to find container %q", r.GetContainerId()) + return nil, fmt.Errorf("an error occurred when try to find container %q: %w", r.GetContainerId(), err) } if err := c.stopContainer(ctx, container, time.Duration(r.GetTimeout())*time.Second); err != nil { @@ -48,7 +48,7 @@ func (c *criService) StopContainer(ctx context.Context, r *runtime.StopContainer i, err := container.Container.Info(ctx) if err != nil { - return nil, errors.Wrap(err, "get container info") + return nil, fmt.Errorf("get container info: %w", err) } containerStopTimer.WithValues(i.Runtime.Name).UpdateSince(start) @@ -73,7 +73,7 @@ func (c *criService) stopContainer(ctx context.Context, container containerstore task, err := container.Container.Task(ctx, nil) if err != nil { if !errdefs.IsNotFound(err) { - return errors.Wrapf(err, "failed to get task for container %q", id) + return fmt.Errorf("failed to get task for container %q: %w", id, err) } // Don't return for unknown state, some cleanup needs to be done. if state == runtime.ContainerState_CONTAINER_UNKNOWN { @@ -90,7 +90,7 @@ func (c *criService) stopContainer(ctx context.Context, container containerstore exitCh, err := task.Wait(waitCtx) if err != nil { if !errdefs.IsNotFound(err) { - return errors.Wrapf(err, "failed to wait for task for %q", id) + return fmt.Errorf("failed to wait for task for %q: %w", id, err) } return cleanupUnknownContainer(ctx, id, container) } @@ -124,7 +124,7 @@ func (c *criService) stopContainer(ctx context.Context, container containerstore image, err := c.imageStore.Get(container.ImageRef) if err != nil { if !errdefs.IsNotFound(err) { - return errors.Wrapf(err, "failed to get image %q", container.ImageRef) + return fmt.Errorf("failed to get image %q: %w", container.ImageRef, err) } log.G(ctx).Warningf("Image %q not found, stop container with signal %q", container.ImageRef, stopSignal) } else { @@ -135,7 +135,7 @@ func (c *criService) stopContainer(ctx context.Context, container containerstore } sig, err := signal.ParseSignal(stopSignal) if err != nil { - return errors.Wrapf(err, "failed to parse stop signal %q", stopSignal) + return fmt.Errorf("failed to parse stop signal %q: %w", stopSignal, err) } var sswt bool @@ -149,7 +149,7 @@ func (c *criService) stopContainer(ctx context.Context, container containerstore if sswt { log.G(ctx).Infof("Stop container %q with signal %v", id, sig) if err = task.Kill(ctx, sig); err != nil && !errdefs.IsNotFound(err) { - return errors.Wrapf(err, "failed to stop container %q", id) + return fmt.Errorf("failed to stop container %q: %w", id, err) } } else { log.G(ctx).Infof("Skipping the sending of signal %v to container %q because a prior stop with timeout>0 request already sent the signal", sig, id) @@ -172,13 +172,13 @@ func (c *criService) stopContainer(ctx context.Context, container containerstore log.G(ctx).Infof("Kill container %q", id) if err = task.Kill(ctx, syscall.SIGKILL); err != nil && !errdefs.IsNotFound(err) { - return errors.Wrapf(err, "failed to kill container %q", id) + return fmt.Errorf("failed to kill container %q: %w", id, err) } // Wait for a fixed timeout until container stop is observed by event monitor. err = c.waitContainerStop(ctx, container) if err != nil { - return errors.Wrapf(err, "an error occurs during waiting for container %q to be killed", id) + return fmt.Errorf("an error occurs during waiting for container %q to be killed: %w", id, err) } return nil } @@ -188,7 +188,7 @@ func (c *criService) stopContainer(ctx context.Context, container containerstore func (c *criService) waitContainerStop(ctx context.Context, container containerstore.Container) error { select { case <-ctx.Done(): - return errors.Wrapf(ctx.Err(), "wait container %q", container.ID) + return fmt.Errorf("wait container %q: %w", container.ID, ctx.Err()) case <-container.Stopped(): return nil } diff --git a/pkg/cri/server/container_update_resources.go b/pkg/cri/server/container_update_resources.go index e2b2b6d5b..e5f6466a1 100644 --- a/pkg/cri/server/container_update_resources.go +++ b/pkg/cri/server/container_update_resources.go @@ -21,6 +21,7 @@ package server import ( gocontext "context" + "fmt" "github.com/containerd/containerd" "github.com/containerd/containerd/containers" @@ -28,7 +29,6 @@ import ( "github.com/containerd/containerd/log" "github.com/containerd/typeurl" runtimespec "github.com/opencontainers/runtime-spec/specs-go" - "github.com/pkg/errors" "golang.org/x/net/context" runtime "k8s.io/cri-api/pkg/apis/runtime/v1" @@ -40,7 +40,7 @@ import ( func (c *criService) UpdateContainerResources(ctx context.Context, r *runtime.UpdateContainerResourcesRequest) (retRes *runtime.UpdateContainerResourcesResponse, retErr error) { container, err := c.containerStore.Get(r.GetContainerId()) if err != nil { - return nil, errors.Wrap(err, "failed to find container") + return nil, fmt.Errorf("failed to find container: %w", err) } // Update resources in status update transaction, so that: // 1) There won't be race condition with container start. @@ -48,7 +48,7 @@ func (c *criService) UpdateContainerResources(ctx context.Context, r *runtime.Up if err := container.Status.Update(func(status containerstore.Status) (containerstore.Status, error) { return status, c.updateContainerResources(ctx, container, r, status) }); err != nil { - return nil, errors.Wrap(err, "failed to update resources") + return nil, fmt.Errorf("failed to update resources: %w", err) } return &runtime.UpdateContainerResourcesResponse{}, nil } @@ -60,7 +60,7 @@ func (c *criService) updateContainerResources(ctx context.Context, id := cntr.ID // Do not update the container when there is a removal in progress. if status.Removing { - return errors.Errorf("container %q is in removing state", id) + return fmt.Errorf("container %q is in removing state", id) } // Update container spec. If the container is not started yet, updating @@ -69,11 +69,11 @@ func (c *criService) updateContainerResources(ctx context.Context, // the spec will become our source of truth for resource limits. oldSpec, err := cntr.Container.Spec(ctx) if err != nil { - return errors.Wrap(err, "failed to get container spec") + return fmt.Errorf("failed to get container spec: %w", err) } newSpec, err := updateOCIResource(ctx, oldSpec, r, c.config) if err != nil { - return errors.Wrap(err, "failed to update resource in spec") + return fmt.Errorf("failed to update resource in spec: %w", err) } if err := updateContainerSpec(ctx, cntr.Container, newSpec); err != nil { @@ -102,7 +102,7 @@ func (c *criService) updateContainerResources(ctx context.Context, // Task exited already. return nil } - return errors.Wrap(err, "failed to get task") + return fmt.Errorf("failed to get task: %w", err) } // newSpec.Linux / newSpec.Windows won't be nil if err := task.Update(ctx, containerd.WithResources(getResources(newSpec))); err != nil { @@ -110,7 +110,7 @@ func (c *criService) updateContainerResources(ctx context.Context, // Task exited already. return nil } - return errors.Wrap(err, "failed to update resources") + return fmt.Errorf("failed to update resources: %w", err) } return nil } @@ -119,13 +119,13 @@ func (c *criService) updateContainerResources(ctx context.Context, func updateContainerSpec(ctx context.Context, cntr containerd.Container, spec *runtimespec.Spec) error { any, err := typeurl.MarshalAny(spec) if err != nil { - return errors.Wrapf(err, "failed to marshal spec %+v", spec) + return fmt.Errorf("failed to marshal spec %+v: %w", spec, err) } if err := cntr.Update(ctx, func(ctx gocontext.Context, client *containerd.Client, c *containers.Container) error { c.Spec = any return nil }); err != nil { - return errors.Wrap(err, "failed to update container spec") + return fmt.Errorf("failed to update container spec: %w", err) } return nil } diff --git a/pkg/cri/server/container_update_resources_linux.go b/pkg/cri/server/container_update_resources_linux.go index ebe78780c..a30d194e6 100644 --- a/pkg/cri/server/container_update_resources_linux.go +++ b/pkg/cri/server/container_update_resources_linux.go @@ -17,8 +17,9 @@ package server import ( + "fmt" + runtimespec "github.com/opencontainers/runtime-spec/specs-go" - "github.com/pkg/errors" "golang.org/x/net/context" runtime "k8s.io/cri-api/pkg/apis/runtime/v1" @@ -34,13 +35,13 @@ func updateOCIResource(ctx context.Context, spec *runtimespec.Spec, r *runtime.U // Copy to make sure old spec is not changed. var cloned runtimespec.Spec if err := util.DeepCopy(&cloned, spec); err != nil { - return nil, errors.Wrap(err, "failed to deep copy") + return nil, fmt.Errorf("failed to deep copy: %w", err) } if cloned.Linux == nil { cloned.Linux = &runtimespec.Linux{} } if err := opts.WithResources(r.GetLinux(), config.TolerateMissingHugetlbController, config.DisableHugetlbController)(ctx, nil, nil, &cloned); err != nil { - return nil, errors.Wrap(err, "unable to set linux container resources") + return nil, fmt.Errorf("unable to set linux container resources: %w", err) } return &cloned, nil } diff --git a/pkg/cri/server/container_update_resources_other.go b/pkg/cri/server/container_update_resources_other.go index b8142de23..76000e1f6 100644 --- a/pkg/cri/server/container_update_resources_other.go +++ b/pkg/cri/server/container_update_resources_other.go @@ -20,7 +20,8 @@ package server import ( - "github.com/pkg/errors" + "fmt" + "golang.org/x/net/context" runtime "k8s.io/cri-api/pkg/apis/runtime/v1" @@ -31,7 +32,7 @@ import ( func (c *criService) UpdateContainerResources(ctx context.Context, r *runtime.UpdateContainerResourcesRequest) (retRes *runtime.UpdateContainerResourcesResponse, retErr error) { container, err := c.containerStore.Get(r.GetContainerId()) if err != nil { - return nil, errors.Wrap(err, "failed to find container") + return nil, fmt.Errorf("failed to find container: %w", err) } // Update resources in status update transaction, so that: // 1) There won't be race condition with container start. @@ -39,7 +40,7 @@ func (c *criService) UpdateContainerResources(ctx context.Context, r *runtime.Up if err := container.Status.Update(func(status containerstore.Status) (containerstore.Status, error) { return status, nil }); err != nil { - return nil, errors.Wrap(err, "failed to update resources") + return nil, fmt.Errorf("failed to update resources: %w", err) } return &runtime.UpdateContainerResourcesResponse{}, nil } diff --git a/pkg/cri/server/container_update_resources_windows.go b/pkg/cri/server/container_update_resources_windows.go index fa0fdc183..74ce4b3e4 100644 --- a/pkg/cri/server/container_update_resources_windows.go +++ b/pkg/cri/server/container_update_resources_windows.go @@ -17,8 +17,9 @@ package server import ( + "fmt" + runtimespec "github.com/opencontainers/runtime-spec/specs-go" - "github.com/pkg/errors" "golang.org/x/net/context" runtime "k8s.io/cri-api/pkg/apis/runtime/v1" @@ -34,13 +35,13 @@ func updateOCIResource(ctx context.Context, spec *runtimespec.Spec, r *runtime.U // Copy to make sure old spec is not changed. var cloned runtimespec.Spec if err := util.DeepCopy(&cloned, spec); err != nil { - return nil, errors.Wrap(err, "failed to deep copy") + return nil, fmt.Errorf("failed to deep copy: %w", err) } if cloned.Windows == nil { cloned.Windows = &runtimespec.Windows{} } if err := opts.WithWindowsResources(r.GetWindows())(ctx, nil, nil, &cloned); err != nil { - return nil, errors.Wrap(err, "unable to set windows container resources") + return nil, fmt.Errorf("unable to set windows container resources: %w", err) } return &cloned, nil } diff --git a/pkg/cri/server/events.go b/pkg/cri/server/events.go index 0b834e12e..b98dd1fd3 100644 --- a/pkg/cri/server/events.go +++ b/pkg/cri/server/events.go @@ -17,6 +17,8 @@ package server import ( + "errors" + "fmt" "sync" "time" @@ -30,9 +32,7 @@ import ( sandboxstore "github.com/containerd/containerd/pkg/cri/store/sandbox" ctrdutil "github.com/containerd/containerd/pkg/cri/util" "github.com/containerd/typeurl" - gogotypes "github.com/gogo/protobuf/types" - "github.com/pkg/errors" "github.com/sirupsen/logrus" "golang.org/x/net/context" "k8s.io/utils/clock" @@ -141,7 +141,7 @@ func (em *eventMonitor) startSandboxExitMonitor(ctx context.Context, id string, } return nil } else if !errdefs.IsNotFound(err) { - return errors.Wrapf(err, "failed to get sandbox %s", e.ID) + return fmt.Errorf("failed to get sandbox %s: %w", e.ID, err) } return nil }() @@ -192,7 +192,7 @@ func (em *eventMonitor) startContainerExitMonitor(ctx context.Context, id string } return nil } else if !errdefs.IsNotFound(err) { - return errors.Wrapf(err, "failed to get container %s", e.ID) + return fmt.Errorf("failed to get container %s: %w", e.ID, err) } return nil }() @@ -211,7 +211,7 @@ func convertEvent(e *gogotypes.Any) (string, interface{}, error) { id := "" evt, err := typeurl.UnmarshalAny(e) if err != nil { - return "", nil, errors.Wrap(err, "failed to unmarshalany") + return "", nil, fmt.Errorf("failed to unmarshalany: %w", err) } switch e := evt.(type) { @@ -314,20 +314,20 @@ func (em *eventMonitor) handleEvent(any interface{}) error { cntr, err := em.c.containerStore.Get(e.ID) if err == nil { if err := handleContainerExit(ctx, e, cntr); err != nil { - return errors.Wrap(err, "failed to handle container TaskExit event") + return fmt.Errorf("failed to handle container TaskExit event: %w", err) } return nil } else if !errdefs.IsNotFound(err) { - return errors.Wrap(err, "can't find container for TaskExit event") + return fmt.Errorf("can't find container for TaskExit event: %w", err) } sb, err := em.c.sandboxStore.Get(e.ID) if err == nil { if err := handleSandboxExit(ctx, e, sb); err != nil { - return errors.Wrap(err, "failed to handle sandbox TaskExit event") + return fmt.Errorf("failed to handle sandbox TaskExit event: %w", err) } return nil } else if !errdefs.IsNotFound(err) { - return errors.Wrap(err, "can't find sandbox for TaskExit event") + return fmt.Errorf("can't find sandbox for TaskExit event: %w", err) } return nil case *eventtypes.TaskOOM: @@ -336,7 +336,7 @@ func (em *eventMonitor) handleEvent(any interface{}) error { cntr, err := em.c.containerStore.Get(e.ContainerID) if err != nil { if !errdefs.IsNotFound(err) { - return errors.Wrap(err, "can't find container for TaskOOM event") + return fmt.Errorf("can't find container for TaskOOM event: %w", err) } return nil } @@ -345,7 +345,7 @@ func (em *eventMonitor) handleEvent(any interface{}) error { return status, nil }) if err != nil { - return errors.Wrap(err, "failed to update container status for TaskOOM event") + return fmt.Errorf("failed to update container status for TaskOOM event: %w", err) } case *eventtypes.ImageCreate: logrus.Infof("ImageCreate event %+v", e) @@ -380,13 +380,13 @@ func handleContainerExit(ctx context.Context, e *eventtypes.TaskExit, cntr conta ) if err != nil { if !errdefs.IsNotFound(err) { - return errors.Wrapf(err, "failed to load task for container") + return fmt.Errorf("failed to load task for container: %w", err) } } else { // TODO(random-liu): [P1] This may block the loop, we may want to spawn a worker if _, err = task.Delete(ctx, WithNRISandboxDelete(cntr.SandboxID), containerd.WithProcessKill); err != nil { if !errdefs.IsNotFound(err) { - return errors.Wrap(err, "failed to stop container") + return fmt.Errorf("failed to stop container: %w", err) } // Move on to make sure container status is updated. } @@ -407,7 +407,7 @@ func handleContainerExit(ctx context.Context, e *eventtypes.TaskExit, cntr conta return status, nil }) if err != nil { - return errors.Wrap(err, "failed to update container state") + return fmt.Errorf("failed to update container state: %w", err) } // Using channel to propagate the information of container stop cntr.Stop() @@ -420,13 +420,13 @@ func handleSandboxExit(ctx context.Context, e *eventtypes.TaskExit, sb sandboxst task, err := sb.Container.Task(ctx, nil) if err != nil { if !errdefs.IsNotFound(err) { - return errors.Wrap(err, "failed to load task for sandbox") + return fmt.Errorf("failed to load task for sandbox: %w", err) } } else { // TODO(random-liu): [P1] This may block the loop, we may want to spawn a worker if _, err = task.Delete(ctx, WithNRISandboxDelete(sb.ID), containerd.WithProcessKill); err != nil { if !errdefs.IsNotFound(err) { - return errors.Wrap(err, "failed to stop sandbox") + return fmt.Errorf("failed to stop sandbox: %w", err) } // Move on to make sure container status is updated. } @@ -437,7 +437,7 @@ func handleSandboxExit(ctx context.Context, e *eventtypes.TaskExit, sb sandboxst return status, nil }) if err != nil { - return errors.Wrap(err, "failed to update sandbox state") + return fmt.Errorf("failed to update sandbox state: %w", err) } // Using channel to propagate the information of sandbox stop sb.Stop() diff --git a/pkg/cri/server/helpers.go b/pkg/cri/server/helpers.go index b2feb13f3..abc66e389 100644 --- a/pkg/cri/server/helpers.go +++ b/pkg/cri/server/helpers.go @@ -42,7 +42,6 @@ import ( runhcsoptions "github.com/Microsoft/hcsshim/cmd/containerd-shim-runhcs-v1/options" imagedigest "github.com/opencontainers/go-digest" "github.com/pelletier/go-toml" - "github.com/pkg/errors" "golang.org/x/net/context" runtime "k8s.io/cri-api/pkg/apis/runtime/v1" ) @@ -196,7 +195,7 @@ func (c *criService) localResolve(refOrID string) (imagestore.Image, error) { func (c *criService) toContainerdImage(ctx context.Context, image imagestore.Image) (containerd.Image, error) { // image should always have at least one reference. if len(image.References) == 0 { - return nil, errors.Errorf("invalid image with no reference %q", image.ID) + return nil, fmt.Errorf("invalid image with no reference %q", image.ID) } return c.client.GetImage(ctx, image.References[0]) } @@ -225,7 +224,7 @@ func getUserFromImage(user string) (*int64, string) { func (c *criService) ensureImageExists(ctx context.Context, ref string, config *runtime.PodSandboxConfig) (*imagestore.Image, error) { image, err := c.localResolve(ref) if err != nil && !errdefs.IsNotFound(err) { - return nil, errors.Wrapf(err, "failed to get image %q", ref) + return nil, fmt.Errorf("failed to get image %q: %w", ref, err) } if err == nil { return &image, nil @@ -233,13 +232,13 @@ func (c *criService) ensureImageExists(ctx context.Context, ref string, config * // Pull image to ensure the image exists resp, err := c.PullImage(ctx, &runtime.PullImageRequest{Image: &runtime.ImageSpec{Image: ref}, SandboxConfig: config}) if err != nil { - return nil, errors.Wrapf(err, "failed to pull image %q", ref) + return nil, fmt.Errorf("failed to pull image %q: %w", ref, err) } imageID := resp.GetImageRef() newImage, err := c.imageStore.Get(imageID) if err != nil { // It's still possible that someone removed the image right after it is pulled. - return nil, errors.Wrapf(err, "failed to get image %q after pulling", imageID) + return nil, fmt.Errorf("failed to get image %q after pulling: %w", imageID, err) } return &newImage, nil } @@ -251,18 +250,18 @@ func (c *criService) ensureImageExists(ctx context.Context, ref string, config * func (c *criService) validateTargetContainer(sandboxID, targetContainerID string) (containerstore.Container, error) { targetContainer, err := c.containerStore.Get(targetContainerID) if err != nil { - return containerstore.Container{}, errors.Wrapf(err, "container %q does not exist", targetContainerID) + return containerstore.Container{}, fmt.Errorf("container %q does not exist: %w", targetContainerID, err) } targetSandboxID := targetContainer.Metadata.SandboxID if targetSandboxID != sandboxID { return containerstore.Container{}, - errors.Errorf("container %q (sandbox %s) does not belong to sandbox %s", targetContainerID, targetSandboxID, sandboxID) + fmt.Errorf("container %q (sandbox %s) does not belong to sandbox %s", targetContainerID, targetSandboxID, sandboxID) } status := targetContainer.Status.Get() if state := status.State(); state != runtime.ContainerState_CONTAINER_RUNNING { - return containerstore.Container{}, errors.Errorf("container %q is not running - in state %s", targetContainerID, state) + return containerstore.Container{}, fmt.Errorf("container %q is not running - in state %s", targetContainerID, state) } return targetContainer, nil diff --git a/pkg/cri/server/helpers_linux.go b/pkg/cri/server/helpers_linux.go index bc415e871..42b2d99a1 100644 --- a/pkg/cri/server/helpers_linux.go +++ b/pkg/cri/server/helpers_linux.go @@ -36,7 +36,6 @@ import ( "github.com/moby/sys/mountinfo" "github.com/opencontainers/runtime-spec/specs-go" "github.com/opencontainers/selinux/go-selinux/label" - "github.com/pkg/errors" "golang.org/x/sys/unix" runtime "k8s.io/cri-api/pkg/apis/runtime/v1" ) @@ -131,7 +130,7 @@ func checkSelinuxLevel(level string) error { matched, err := regexp.MatchString(`^s\d(-s\d)??(:c\d{1,4}(\.c\d{1,4})?(,c\d{1,4}(\.c\d{1,4})?)*)?$`, level) if err != nil { - return errors.Wrapf(err, "the format of 'level' %q is not correct", level) + return fmt.Errorf("the format of 'level' %q is not correct: %w", level, err) } if !matched { return fmt.Errorf("the format of 'level' %q is not correct", level) @@ -241,7 +240,7 @@ func ensureRemoveAll(ctx context.Context, dir string) error { return err } if e := mount.Unmount(pe.Path, unix.MNT_DETACH); e != nil { - return errors.Wrapf(e, "error while removing %s", dir) + return fmt.Errorf("error while removing %s: %w", dir, e) } if exitOnErr[pe.Path] == maxRetry { @@ -271,7 +270,7 @@ func modifyProcessLabel(runtimeType string, spec *specs.Spec) error { } l, err := seutil.ChangeToKVM(spec.Process.SelinuxLabel) if err != nil { - return errors.Wrap(err, "failed to get selinux kvm label") + return fmt.Errorf("failed to get selinux kvm label: %w", err) } spec.Process.SelinuxLabel = l return nil diff --git a/pkg/cri/server/image_pull.go b/pkg/cri/server/image_pull.go index 0372c3102..9d3e76d88 100644 --- a/pkg/cri/server/image_pull.go +++ b/pkg/cri/server/image_pull.go @@ -40,7 +40,6 @@ import ( "github.com/containerd/imgcrypt" "github.com/containerd/imgcrypt/images/encryption" imagespec "github.com/opencontainers/image-spec/specs-go/v1" - "github.com/pkg/errors" "golang.org/x/net/context" runtime "k8s.io/cri-api/pkg/apis/runtime/v1" @@ -93,7 +92,7 @@ func (c *criService) PullImage(ctx context.Context, r *runtime.PullImageRequest) imageRef := r.GetImage().GetImage() namedRef, err := distribution.ParseDockerRef(imageRef) if err != nil { - return nil, errors.Wrapf(err, "failed to parse image reference %q", imageRef) + return nil, fmt.Errorf("failed to parse image reference %q: %w", imageRef, err) } ref := namedRef.String() if ref != imageRef { @@ -138,12 +137,12 @@ func (c *criService) PullImage(ctx context.Context, r *runtime.PullImageRequest) image, err := c.client.Pull(ctx, ref, pullOpts...) if err != nil { - return nil, errors.Wrapf(err, "failed to pull and unpack image %q", ref) + return nil, fmt.Errorf("failed to pull and unpack image %q: %w", ref, err) } configDesc, err := image.Config(ctx) if err != nil { - return nil, errors.Wrap(err, "get image config descriptor") + return nil, fmt.Errorf("get image config descriptor: %w", err) } imageID := configDesc.Digest.String() @@ -153,13 +152,13 @@ func (c *criService) PullImage(ctx context.Context, r *runtime.PullImageRequest) continue } if err := c.createImageReference(ctx, r, image.Target()); err != nil { - return nil, errors.Wrapf(err, "failed to create image reference %q", r) + return nil, fmt.Errorf("failed to create image reference %q: %w", r, err) } // Update image store to reflect the newest state in containerd. // No need to use `updateImage`, because the image reference must // have been managed by the cri plugin. if err := c.imageStore.Update(ctx, r); err != nil { - return nil, errors.Wrapf(err, "failed to update image store %q", r) + return nil, fmt.Errorf("failed to update image store %q: %w", r, err) } } @@ -182,7 +181,7 @@ func ParseAuth(auth *runtime.AuthConfig, host string) (string, string, error) { // Do not return the auth info when server address doesn't match. u, err := url.Parse(auth.ServerAddress) if err != nil { - return "", "", errors.Wrap(err, "parse server address") + return "", "", fmt.Errorf("parse server address: %w", err) } if host != u.Host { return "", "", nil @@ -203,7 +202,7 @@ func ParseAuth(auth *runtime.AuthConfig, host string) (string, string, error) { } fields := strings.SplitN(string(decoded), ":", 2) if len(fields) != 2 { - return "", "", errors.Errorf("invalid decoded auth: %q", decoded) + return "", "", fmt.Errorf("invalid decoded auth: %q", decoded) } user, passwd := fields[0], fields[1] return user, strings.Trim(passwd, "\x00"), nil @@ -243,31 +242,31 @@ func (c *criService) createImageReference(ctx context.Context, name string, desc func (c *criService) updateImage(ctx context.Context, r string) error { img, err := c.client.GetImage(ctx, r) if err != nil && !errdefs.IsNotFound(err) { - return errors.Wrap(err, "get image by reference") + return fmt.Errorf("get image by reference: %w", err) } if err == nil && img.Labels()[imageLabelKey] != imageLabelValue { // Make sure the image has the image id as its unique // identifier that references the image in its lifetime. configDesc, err := img.Config(ctx) if err != nil { - return errors.Wrap(err, "get image id") + return fmt.Errorf("get image id: %w", err) } id := configDesc.Digest.String() if err := c.createImageReference(ctx, id, img.Target()); err != nil { - return errors.Wrapf(err, "create image id reference %q", id) + return fmt.Errorf("create image id reference %q: %w", id, err) } if err := c.imageStore.Update(ctx, id); err != nil { - return errors.Wrapf(err, "update image store for %q", id) + return fmt.Errorf("update image store for %q: %w", id, err) } // The image id is ready, add the label to mark the image as managed. if err := c.createImageReference(ctx, r, img.Target()); err != nil { - return errors.Wrap(err, "create managed label") + return fmt.Errorf("create managed label: %w", err) } } // If the image is not found, we should continue updating the cache, // so that the image can be removed from the cache. if err := c.imageStore.Update(ctx, r); err != nil { - return errors.Wrapf(err, "update image store for %q", r) + return fmt.Errorf("update image store for %q: %w", r, err) } return nil } @@ -280,15 +279,15 @@ func (c *criService) getTLSConfig(registryTLSConfig criconfig.TLSConfig) (*tls.C err error ) if registryTLSConfig.CertFile != "" && registryTLSConfig.KeyFile == "" { - return nil, errors.Errorf("cert file %q was specified, but no corresponding key file was specified", registryTLSConfig.CertFile) + return nil, fmt.Errorf("cert file %q was specified, but no corresponding key file was specified", registryTLSConfig.CertFile) } if registryTLSConfig.CertFile == "" && registryTLSConfig.KeyFile != "" { - return nil, errors.Errorf("key file %q was specified, but no corresponding cert file was specified", registryTLSConfig.KeyFile) + return nil, fmt.Errorf("key file %q was specified, but no corresponding cert file was specified", registryTLSConfig.KeyFile) } if registryTLSConfig.CertFile != "" && registryTLSConfig.KeyFile != "" { cert, err = tls.LoadX509KeyPair(registryTLSConfig.CertFile, registryTLSConfig.KeyFile) if err != nil { - return nil, errors.Wrap(err, "failed to load cert file") + return nil, fmt.Errorf("failed to load cert file: %w", err) } if len(cert.Certificate) != 0 { tlsConfig.Certificates = []tls.Certificate{cert} @@ -299,11 +298,11 @@ func (c *criService) getTLSConfig(registryTLSConfig criconfig.TLSConfig) (*tls.C if registryTLSConfig.CAFile != "" { caCertPool, err := x509.SystemCertPool() if err != nil { - return nil, errors.Wrap(err, "failed to get system cert pool") + return nil, fmt.Errorf("failed to get system cert pool: %w", err) } caCert, err := os.ReadFile(registryTLSConfig.CAFile) if err != nil { - return nil, errors.Wrap(err, "failed to load CA file") + return nil, fmt.Errorf("failed to load CA file: %w", err) } caCertPool.AppendCertsFromPEM(caCert) tlsConfig.RootCAs = caCertPool @@ -354,12 +353,12 @@ func (c *criService) registryHosts(ctx context.Context, auth *runtime.AuthConfig endpoints, err := c.registryEndpoints(host) if err != nil { - return nil, errors.Wrap(err, "get registry endpoints") + return nil, fmt.Errorf("get registry endpoints: %w", err) } for _, e := range endpoints { u, err := url.Parse(e) if err != nil { - return nil, errors.Wrapf(err, "parse registry endpoint %q from mirrors", e) + return nil, fmt.Errorf("parse registry endpoint %q from mirrors: %w", e, err) } var ( @@ -371,7 +370,7 @@ func (c *criService) registryHosts(ctx context.Context, auth *runtime.AuthConfig if config.TLS != nil { transport.TLSClientConfig, err = c.getTLSConfig(*config.TLS) if err != nil { - return nil, errors.Wrapf(err, "get TLSConfig for registry %q", e) + return nil, fmt.Errorf("get TLSConfig for registry %q: %w", e, err) } } else if isLocalHost(host) && u.Scheme == "http" { // Skipping TLS verification for localhost @@ -457,19 +456,19 @@ func (c *criService) registryEndpoints(host string) ([]string, error) { } defaultHost, err := docker.DefaultHost(host) if err != nil { - return nil, errors.Wrap(err, "get default host") + return nil, fmt.Errorf("get default host: %w", err) } for i := range endpoints { en, err := addDefaultScheme(endpoints[i]) if err != nil { - return nil, errors.Wrap(err, "parse endpoint url") + return nil, fmt.Errorf("parse endpoint url: %w", err) } endpoints[i] = en } for _, e := range endpoints { u, err := url.Parse(e) if err != nil { - return nil, errors.Wrap(err, "parse endpoint url") + return nil, fmt.Errorf("parse endpoint url: %w", err) } if u.Host == host { // Do not add default if the endpoint already exists. diff --git a/pkg/cri/server/image_remove.go b/pkg/cri/server/image_remove.go index 90619b1b6..8821661b2 100644 --- a/pkg/cri/server/image_remove.go +++ b/pkg/cri/server/image_remove.go @@ -17,10 +17,11 @@ package server import ( + "fmt" + "github.com/containerd/containerd/errdefs" "github.com/containerd/containerd/images" - "github.com/pkg/errors" "golang.org/x/net/context" runtime "k8s.io/cri-api/pkg/apis/runtime/v1" ) @@ -38,7 +39,7 @@ func (c *criService) RemoveImage(ctx context.Context, r *runtime.RemoveImageRequ // return empty without error when image not found. return &runtime.RemoveImageResponse{}, nil } - return nil, errors.Wrapf(err, "can not resolve %q locally", r.GetImage().GetImage()) + return nil, fmt.Errorf("can not resolve %q locally: %w", r.GetImage().GetImage(), err) } // Remove all image references. @@ -54,11 +55,11 @@ func (c *criService) RemoveImage(ctx context.Context, r *runtime.RemoveImageRequ if err == nil || errdefs.IsNotFound(err) { // Update image store to reflect the newest state in containerd. if err := c.imageStore.Update(ctx, ref); err != nil { - return nil, errors.Wrapf(err, "failed to update image reference %q for %q", ref, image.ID) + return nil, fmt.Errorf("failed to update image reference %q for %q: %w", ref, image.ID, err) } continue } - return nil, errors.Wrapf(err, "failed to delete image reference %q for %q", ref, image.ID) + return nil, fmt.Errorf("failed to delete image reference %q for %q: %w", ref, image.ID, err) } return &runtime.RemoveImageResponse{}, nil } diff --git a/pkg/cri/server/image_status.go b/pkg/cri/server/image_status.go index f94ef4dc0..5d28837f0 100644 --- a/pkg/cri/server/image_status.go +++ b/pkg/cri/server/image_status.go @@ -18,13 +18,13 @@ package server import ( "encoding/json" + "fmt" "github.com/containerd/containerd/errdefs" "github.com/containerd/containerd/log" imagestore "github.com/containerd/containerd/pkg/cri/store/image" imagespec "github.com/opencontainers/image-spec/specs-go/v1" - "github.com/pkg/errors" "golang.org/x/net/context" runtime "k8s.io/cri-api/pkg/apis/runtime/v1" ) @@ -39,7 +39,7 @@ func (c *criService) ImageStatus(ctx context.Context, r *runtime.ImageStatusRequ // return empty without error when image not found. return &runtime.ImageStatusResponse{}, nil } - return nil, errors.Wrapf(err, "can not resolve %q locally", r.GetImage().GetImage()) + return nil, fmt.Errorf("can not resolve %q locally: %w", r.GetImage().GetImage(), err) } // TODO(random-liu): [P0] Make sure corresponding snapshot exists. What if snapshot // doesn't exist? @@ -47,7 +47,7 @@ func (c *criService) ImageStatus(ctx context.Context, r *runtime.ImageStatusRequ runtimeImage := toCRIImage(image) info, err := c.toCRIImageInfo(ctx, &image, r.GetVerbose()) if err != nil { - return nil, errors.Wrap(err, "failed to generate image info") + return nil, fmt.Errorf("failed to generate image info: %w", err) } return &runtime.ImageStatusResponse{ diff --git a/pkg/cri/server/restart.go b/pkg/cri/server/restart.go index ffcb5cd1d..f5f3e5083 100644 --- a/pkg/cri/server/restart.go +++ b/pkg/cri/server/restart.go @@ -17,6 +17,7 @@ package server import ( + "fmt" "os" "path/filepath" goruntime "runtime" @@ -29,7 +30,6 @@ import ( "github.com/containerd/containerd/log" "github.com/containerd/containerd/platforms" "github.com/containerd/typeurl" - "github.com/pkg/errors" "golang.org/x/net/context" runtime "k8s.io/cri-api/pkg/apis/runtime/v1" @@ -54,7 +54,7 @@ func (c *criService) recover(ctx context.Context) error { // Recover all sandboxes. sandboxes, err := c.client.Containers(ctx, filterLabel(containerKindLabel, containerKindSandbox)) if err != nil { - return errors.Wrap(err, "failed to list sandbox containers") + return fmt.Errorf("failed to list sandbox containers: %w", err) } for _, sandbox := range sandboxes { sb, err := c.loadSandbox(ctx, sandbox) @@ -64,17 +64,17 @@ func (c *criService) recover(ctx context.Context) error { } log.G(ctx).Debugf("Loaded sandbox %+v", sb) if err := c.sandboxStore.Add(sb); err != nil { - return errors.Wrapf(err, "failed to add sandbox %q to store", sandbox.ID()) + return fmt.Errorf("failed to add sandbox %q to store: %w", sandbox.ID(), err) } if err := c.sandboxNameIndex.Reserve(sb.Name, sb.ID); err != nil { - return errors.Wrapf(err, "failed to reserve sandbox name %q", sb.Name) + return fmt.Errorf("failed to reserve sandbox name %q: %w", sb.Name, err) } } // Recover all containers. containers, err := c.client.Containers(ctx, filterLabel(containerKindLabel, containerKindContainer)) if err != nil { - return errors.Wrap(err, "failed to list containers") + return fmt.Errorf("failed to list containers: %w", err) } for _, container := range containers { cntr, err := c.loadContainer(ctx, container) @@ -84,17 +84,17 @@ func (c *criService) recover(ctx context.Context) error { } log.G(ctx).Debugf("Loaded container %+v", cntr) if err := c.containerStore.Add(cntr); err != nil { - return errors.Wrapf(err, "failed to add container %q to store", container.ID()) + return fmt.Errorf("failed to add container %q to store: %w", container.ID(), err) } if err := c.containerNameIndex.Reserve(cntr.Name, cntr.ID); err != nil { - return errors.Wrapf(err, "failed to reserve container name %q", cntr.Name) + return fmt.Errorf("failed to reserve container name %q: %w", cntr.Name, err) } } // Recover all images. cImages, err := c.client.ListImages(ctx) if err != nil { - return errors.Wrap(err, "failed to list images") + return fmt.Errorf("failed to list images: %w", err) } c.loadImages(ctx, cImages) @@ -130,7 +130,7 @@ func (c *criService) recover(ctx context.Context) error { }, } { if err := cleanupOrphanedIDDirs(ctx, cleanup.cntrs, cleanup.base); err != nil { - return errors.Wrap(err, cleanup.errMsg) + return fmt.Errorf("%s: %w", cleanup.errMsg, err) } } return nil @@ -160,15 +160,15 @@ func (c *criService) loadContainer(ctx context.Context, cntr containerd.Containe // Load container metadata. exts, err := cntr.Extensions(ctx) if err != nil { - return container, errors.Wrap(err, "failed to get container extensions") + return container, fmt.Errorf("failed to get container extensions: %w", err) } ext, ok := exts[containerMetadataExtension] if !ok { - return container, errors.Errorf("metadata extension %q not found", containerMetadataExtension) + return container, fmt.Errorf("metadata extension %q not found", containerMetadataExtension) } data, err := typeurl.UnmarshalAny(&ext) if err != nil { - return container, errors.Wrapf(err, "failed to unmarshal metadata extension %q", ext) + return container, fmt.Errorf("failed to unmarshal metadata extension %q: %w", ext, err) } meta := data.(*containerstore.Metadata) @@ -208,7 +208,7 @@ func (c *criService) loadContainer(ctx context.Context, cntr containerd.Containe return containerIO, nil }) if err != nil && !errdefs.IsNotFound(err) { - return errors.Wrap(err, "failed to load task") + return fmt.Errorf("failed to load task: %w", err) } var s containerd.Status var notFound bool @@ -221,7 +221,7 @@ func (c *criService) loadContainer(ctx context.Context, cntr containerd.Containe if err != nil { // It's still possible that task is deleted during this window. if !errdefs.IsNotFound(err) { - return errors.Wrap(err, "failed to get task status") + return fmt.Errorf("failed to get task status: %w", err) } notFound = true } @@ -238,7 +238,7 @@ func (c *criService) loadContainer(ctx context.Context, cntr containerd.Containe cio.WithNewFIFOs(volatileContainerDir, meta.Config.GetTty(), meta.Config.GetStdin()), ) if err != nil { - return errors.Wrap(err, "failed to create container io") + return fmt.Errorf("failed to create container io: %w", err) } case runtime.ContainerState_CONTAINER_RUNNING: // Container was in running state, but its task has been deleted, @@ -257,17 +257,17 @@ func (c *criService) loadContainer(ctx context.Context, cntr containerd.Containe // gets restarted during container start. // Container must be in `CREATED` state. if _, err := t.Delete(ctx, containerd.WithProcessKill); err != nil && !errdefs.IsNotFound(err) { - return errors.Wrap(err, "failed to delete task") + return fmt.Errorf("failed to delete task: %w", err) } if status.State() != runtime.ContainerState_CONTAINER_CREATED { - return errors.Errorf("unexpected container state for created task: %q", status.State()) + return fmt.Errorf("unexpected container state for created task: %q", status.State()) } case containerd.Running: // Task is running. Container must be in `RUNNING` state, based on our assumption that // "task should not be started when containerd is down". switch status.State() { case runtime.ContainerState_CONTAINER_EXITED: - return errors.Errorf("unexpected container state for running task: %q", status.State()) + return fmt.Errorf("unexpected container state for running task: %q", status.State()) case runtime.ContainerState_CONTAINER_RUNNING: default: // This may happen if containerd gets restarted after task is started, but @@ -280,7 +280,7 @@ func (c *criService) loadContainer(ctx context.Context, cntr containerd.Containe exitCh, err := t.Wait(ctrdutil.NamespacedContext()) if err != nil { if !errdefs.IsNotFound(err) { - return errors.Wrap(err, "failed to wait for task") + return fmt.Errorf("failed to wait for task: %w", err) } // Container was in running state, but its task has been deleted, // set unknown exited state. @@ -294,12 +294,12 @@ func (c *criService) loadContainer(ctx context.Context, cntr containerd.Containe case containerd.Stopped: // Task is stopped. Updata status and delete the task. if _, err := t.Delete(ctx, containerd.WithProcessKill); err != nil && !errdefs.IsNotFound(err) { - return errors.Wrap(err, "failed to delete task") + return fmt.Errorf("failed to delete task: %w", err) } status.FinishedAt = s.ExitTime.UnixNano() status.ExitCode = int32(s.ExitStatus) default: - return errors.Errorf("unexpected task status %q", s.Status) + return fmt.Errorf("unexpected task status %q", s.Status) } } return nil @@ -329,15 +329,15 @@ func (c *criService) loadSandbox(ctx context.Context, cntr containerd.Container) // Load sandbox metadata. exts, err := cntr.Extensions(ctx) if err != nil { - return sandbox, errors.Wrap(err, "failed to get sandbox container extensions") + return sandbox, fmt.Errorf("failed to get sandbox container extensions: %w", err) } ext, ok := exts[sandboxMetadataExtension] if !ok { - return sandbox, errors.Errorf("metadata extension %q not found", sandboxMetadataExtension) + return sandbox, fmt.Errorf("metadata extension %q not found", sandboxMetadataExtension) } data, err := typeurl.UnmarshalAny(&ext) if err != nil { - return sandbox, errors.Wrapf(err, "failed to unmarshal metadata extension %q", ext) + return sandbox, fmt.Errorf("failed to unmarshal metadata extension %q: %w", ext, err) } meta := data.(*sandboxstore.Metadata) @@ -346,14 +346,14 @@ func (c *criService) loadSandbox(ctx context.Context, cntr containerd.Container) // Load sandbox created timestamp. info, err := cntr.Info(ctx) if err != nil { - return status, errors.Wrap(err, "failed to get sandbox container info") + return status, fmt.Errorf("failed to get sandbox container info: %w", err) } status.CreatedAt = info.CreatedAt // Load sandbox state. t, err := cntr.Task(ctx, nil) if err != nil && !errdefs.IsNotFound(err) { - return status, errors.Wrap(err, "failed to load task") + return status, fmt.Errorf("failed to load task: %w", err) } var taskStatus containerd.Status var notFound bool @@ -366,7 +366,7 @@ func (c *criService) loadSandbox(ctx context.Context, cntr containerd.Container) if err != nil { // It's still possible that task is deleted during this window. if !errdefs.IsNotFound(err) { - return status, errors.Wrap(err, "failed to get task status") + return status, fmt.Errorf("failed to get task status: %w", err) } notFound = true } @@ -381,7 +381,7 @@ func (c *criService) loadSandbox(ctx context.Context, cntr containerd.Container) exitCh, err := t.Wait(ctrdutil.NamespacedContext()) if err != nil { if !errdefs.IsNotFound(err) { - return status, errors.Wrap(err, "failed to wait for task") + return status, fmt.Errorf("failed to wait for task: %w", err) } status.State = sandboxstore.StateNotReady } else { @@ -393,7 +393,7 @@ func (c *criService) loadSandbox(ctx context.Context, cntr containerd.Container) } else { // Task is not running. Delete the task and set sandbox state as NOTREADY. if _, err := t.Delete(ctx, containerd.WithProcessKill); err != nil && !errdefs.IsNotFound(err) { - return status, errors.Wrap(err, "failed to delete task") + return status, fmt.Errorf("failed to delete task: %w", err) } status.State = sandboxstore.StateNotReady } @@ -459,7 +459,7 @@ func cleanupOrphanedIDDirs(ctx context.Context, cntrs []containerd.Container, ba // Cleanup orphaned id directories. dirs, err := os.ReadDir(base) if err != nil && !os.IsNotExist(err) { - return errors.Wrap(err, "failed to read base directory") + return fmt.Errorf("failed to read base directory: %w", err) } idsMap := make(map[string]containerd.Container) for _, cntr := range cntrs { diff --git a/pkg/cri/server/sandbox_portforward.go b/pkg/cri/server/sandbox_portforward.go index 91e863f41..29ffb58c9 100644 --- a/pkg/cri/server/sandbox_portforward.go +++ b/pkg/cri/server/sandbox_portforward.go @@ -17,7 +17,9 @@ package server import ( - "github.com/pkg/errors" + "errors" + "fmt" + "golang.org/x/net/context" runtime "k8s.io/cri-api/pkg/apis/runtime/v1" @@ -28,7 +30,7 @@ import ( func (c *criService) PortForward(ctx context.Context, r *runtime.PortForwardRequest) (retRes *runtime.PortForwardResponse, retErr error) { sandbox, err := c.sandboxStore.Get(r.GetPodSandboxId()) if err != nil { - return nil, errors.Wrapf(err, "failed to find sandbox %q", r.GetPodSandboxId()) + return nil, fmt.Errorf("failed to find sandbox %q: %w", r.GetPodSandboxId(), err) } if sandbox.Status.Get().State != sandboxstore.StateReady { return nil, errors.New("sandbox container is not running") diff --git a/pkg/cri/server/sandbox_portforward_linux.go b/pkg/cri/server/sandbox_portforward_linux.go index 86b015673..9f54daeac 100644 --- a/pkg/cri/server/sandbox_portforward_linux.go +++ b/pkg/cri/server/sandbox_portforward_linux.go @@ -24,7 +24,6 @@ import ( "github.com/containerd/containerd/log" "github.com/containernetworking/plugins/pkg/ns" - "github.com/pkg/errors" "golang.org/x/net/context" runtime "k8s.io/cri-api/pkg/apis/runtime/v1" @@ -35,7 +34,7 @@ import ( func (c *criService) portForward(ctx context.Context, id string, port int32, stream io.ReadWriteCloser) error { s, err := c.sandboxStore.Get(id) if err != nil { - return errors.Wrapf(err, "failed to find sandbox %q in store", id) + return fmt.Errorf("failed to find sandbox %q in store: %w", id, err) } var netNSDo func(func(ns.NetNS) error) error @@ -45,9 +44,9 @@ func (c *criService) portForward(ctx context.Context, id string, port int32, str hostNet := securityContext.GetNamespaceOptions().GetNetwork() == runtime.NamespaceMode_NODE if !hostNet { if closed, err := s.NetNS.Closed(); err != nil { - return errors.Wrapf(err, "failed to check netwok namespace closed for sandbox %q", id) + return fmt.Errorf("failed to check netwok namespace closed for sandbox %q: %w", id, err) } else if closed { - return errors.Errorf("network namespace for sandbox %q is closed", id) + return fmt.Errorf("network namespace for sandbox %q is closed", id) } netNSDo = s.NetNS.Do netNSPath = s.NetNS.GetPath() @@ -130,7 +129,7 @@ func (c *criService) portForward(ctx context.Context, id string, port int32, str }) if err != nil { - return errors.Wrapf(err, "failed to execute portforward in network namespace %q", netNSPath) + return fmt.Errorf("failed to execute portforward in network namespace %q: %w", netNSPath, err) } log.G(ctx).Infof("Finish port forwarding for %q port %d", id, port) diff --git a/pkg/cri/server/sandbox_portforward_other.go b/pkg/cri/server/sandbox_portforward_other.go index e449d607a..aa113405c 100644 --- a/pkg/cri/server/sandbox_portforward_other.go +++ b/pkg/cri/server/sandbox_portforward_other.go @@ -20,15 +20,15 @@ package server import ( + "fmt" "io" "github.com/containerd/containerd/errdefs" - "github.com/pkg/errors" "golang.org/x/net/context" ) // portForward uses netns to enter the sandbox namespace, and forwards a stream inside the // the namespace to a specific port. It keeps forwarding until it exits or client disconnect. func (c *criService) portForward(ctx context.Context, id string, port int32, stream io.ReadWriteCloser) error { - return errors.Wrap(errdefs.ErrNotImplemented, "port forward") + return fmt.Errorf("port forward: %w", errdefs.ErrNotImplemented) } diff --git a/pkg/cri/server/sandbox_portforward_windows.go b/pkg/cri/server/sandbox_portforward_windows.go index 3bcd36ee5..d5bf77660 100644 --- a/pkg/cri/server/sandbox_portforward_windows.go +++ b/pkg/cri/server/sandbox_portforward_windows.go @@ -21,7 +21,6 @@ import ( "fmt" "io" - "github.com/pkg/errors" "golang.org/x/net/context" "k8s.io/utils/exec" @@ -38,7 +37,7 @@ func (c *criService) portForward(ctx context.Context, id string, port int32, str cmd := []string{"wincat.exe", "127.0.0.1", fmt.Sprint(port)} err := c.execInSandbox(ctx, id, cmd, stream, stdout, stderr) if err != nil { - return errors.Wrapf(err, "failed to execute port forward in sandbox: %s", stderrBuffer.String()) + return fmt.Errorf("failed to execute port forward in sandbox: %s: %w", stderrBuffer.String(), err) } return nil } @@ -47,13 +46,13 @@ func (c *criService) execInSandbox(ctx context.Context, sandboxID string, cmd [] // Get sandbox from our sandbox store. sb, err := c.sandboxStore.Get(sandboxID) if err != nil { - return errors.Wrapf(err, "failed to find sandbox %q in store", sandboxID) + return fmt.Errorf("failed to find sandbox %q in store: %w", sandboxID, err) } // Check the sandbox state state := sb.Status.Get().State if state != sandboxstore.StateReady { - return errors.Errorf("sandbox is in %s state", fmt.Sprint(state)) + return fmt.Errorf("sandbox is in %s state", fmt.Sprint(state)) } opts := execOptions{ @@ -66,13 +65,13 @@ func (c *criService) execInSandbox(ctx context.Context, sandboxID string, cmd [] } exitCode, err := c.execInternal(ctx, sb.Container, sandboxID, opts) if err != nil { - return errors.Wrap(err, "failed to exec in sandbox") + return fmt.Errorf("failed to exec in sandbox: %w", err) } if *exitCode == 0 { return nil } return &exec.CodeExitError{ - Err: errors.Errorf("error executing command %v, exit code %d", cmd, *exitCode), + Err: fmt.Errorf("error executing command %v, exit code %d", cmd, *exitCode), Code: int(*exitCode), } } diff --git a/pkg/cri/server/sandbox_remove.go b/pkg/cri/server/sandbox_remove.go index 0d4a1344e..4f5a4f78a 100644 --- a/pkg/cri/server/sandbox_remove.go +++ b/pkg/cri/server/sandbox_remove.go @@ -17,13 +17,13 @@ package server import ( + "fmt" "time" "github.com/containerd/containerd" "github.com/containerd/containerd/errdefs" "github.com/containerd/containerd/log" - "github.com/pkg/errors" "github.com/sirupsen/logrus" "golang.org/x/net/context" runtime "k8s.io/cri-api/pkg/apis/runtime/v1" @@ -36,8 +36,8 @@ func (c *criService) RemovePodSandbox(ctx context.Context, r *runtime.RemovePodS sandbox, err := c.sandboxStore.Get(r.GetPodSandboxId()) if err != nil { if !errdefs.IsNotFound(err) { - return nil, errors.Wrapf(err, "an error occurred when try to find sandbox %q", - r.GetPodSandboxId()) + return nil, fmt.Errorf("an error occurred when try to find sandbox %q: %w", + r.GetPodSandboxId(), err) } // Do not return error if the id doesn't exist. log.G(ctx).Tracef("RemovePodSandbox called for sandbox %q that does not exist", @@ -52,16 +52,16 @@ func (c *criService) RemovePodSandbox(ctx context.Context, r *runtime.RemovePodS // This can happen if the task process associated with the Pod died or it was killed. logrus.Infof("Forcibly stopping sandbox %q", id) if err := c.stopPodSandbox(ctx, sandbox); err != nil { - return nil, errors.Wrapf(err, "failed to forcibly stop sandbox %q", id) + return nil, fmt.Errorf("failed to forcibly stop sandbox %q: %w", id, err) } // Return error if sandbox network namespace is not closed yet. if sandbox.NetNS != nil { nsPath := sandbox.NetNS.GetPath() if closed, err := sandbox.NetNS.Closed(); err != nil { - return nil, errors.Wrapf(err, "failed to check sandbox network namespace %q closed", nsPath) + return nil, fmt.Errorf("failed to check sandbox network namespace %q closed: %w", nsPath, err) } else if !closed { - return nil, errors.Errorf("sandbox network namespace %q is not fully closed", nsPath) + return nil, fmt.Errorf("sandbox network namespace %q is not fully closed", nsPath) } } @@ -77,26 +77,26 @@ func (c *criService) RemovePodSandbox(ctx context.Context, r *runtime.RemovePodS } _, err = c.RemoveContainer(ctx, &runtime.RemoveContainerRequest{ContainerId: cntr.ID}) if err != nil { - return nil, errors.Wrapf(err, "failed to remove container %q", cntr.ID) + return nil, fmt.Errorf("failed to remove container %q: %w", cntr.ID, err) } } // Cleanup the sandbox root directories. sandboxRootDir := c.getSandboxRootDir(id) if err := ensureRemoveAll(ctx, sandboxRootDir); err != nil { - return nil, errors.Wrapf(err, "failed to remove sandbox root directory %q", - sandboxRootDir) + return nil, fmt.Errorf("failed to remove sandbox root directory %q: %w", + sandboxRootDir, err) } volatileSandboxRootDir := c.getVolatileSandboxRootDir(id) if err := ensureRemoveAll(ctx, volatileSandboxRootDir); err != nil { - return nil, errors.Wrapf(err, "failed to remove volatile sandbox root directory %q", - volatileSandboxRootDir) + return nil, fmt.Errorf("failed to remove volatile sandbox root directory %q: %w", + volatileSandboxRootDir, err) } // Delete sandbox container. if err := sandbox.Container.Delete(ctx, containerd.WithSnapshotCleanup); err != nil { if !errdefs.IsNotFound(err) { - return nil, errors.Wrapf(err, "failed to delete sandbox container %q", id) + return nil, fmt.Errorf("failed to delete sandbox container %q: %w", id, err) } log.G(ctx).Tracef("Remove called for sandbox container %q that does not exist", id) } diff --git a/pkg/cri/server/sandbox_run.go b/pkg/cri/server/sandbox_run.go index 891578ce5..646df510a 100644 --- a/pkg/cri/server/sandbox_run.go +++ b/pkg/cri/server/sandbox_run.go @@ -18,6 +18,8 @@ package server import ( "encoding/json" + "errors" + "fmt" "math" "path/filepath" goruntime "runtime" @@ -34,7 +36,6 @@ import ( v1 "github.com/containerd/nri/types/v1" "github.com/containerd/typeurl" "github.com/davecgh/go-spew/spew" - "github.com/pkg/errors" "github.com/sirupsen/logrus" "golang.org/x/net/context" runtime "k8s.io/cri-api/pkg/apis/runtime/v1" @@ -72,7 +73,7 @@ func (c *criService) RunPodSandbox(ctx context.Context, r *runtime.RunPodSandbox // Reserve the sandbox name to avoid concurrent `RunPodSandbox` request starting the // same sandbox. if err := c.sandboxNameIndex.Reserve(name, id); err != nil { - return nil, errors.Wrapf(err, "failed to reserve sandbox name %q", name) + return nil, fmt.Errorf("failed to reserve sandbox name %q: %w", name, err) } defer func() { // Release the name if the function returns with an error. @@ -97,16 +98,16 @@ func (c *criService) RunPodSandbox(ctx context.Context, r *runtime.RunPodSandbox // Ensure sandbox container image snapshot. image, err := c.ensureImageExists(ctx, c.config.SandboxImage, config) if err != nil { - return nil, errors.Wrapf(err, "failed to get sandbox image %q", c.config.SandboxImage) + return nil, fmt.Errorf("failed to get sandbox image %q: %w", c.config.SandboxImage, err) } containerdImage, err := c.toContainerdImage(ctx, *image) if err != nil { - return nil, errors.Wrapf(err, "failed to get image from containerd %q", image.ID) + return nil, fmt.Errorf("failed to get image from containerd %q: %w", image.ID, err) } ociRuntime, err := c.getSandboxRuntime(config, r.GetRuntimeHandler()) if err != nil { - return nil, errors.Wrap(err, "failed to get sandbox runtime") + return nil, fmt.Errorf("failed to get sandbox runtime: %w", err) } log.G(ctx).WithField("podsandboxid", id).Debugf("use OCI runtime %+v", ociRuntime) @@ -135,7 +136,7 @@ func (c *criService) RunPodSandbox(ctx context.Context, r *runtime.RunPodSandbox } sandbox.NetNS, err = netns.NewNetNS(netnsMountDir) if err != nil { - return nil, errors.Wrapf(err, "failed to create network namespace for sandbox %q", id) + return nil, fmt.Errorf("failed to create network namespace for sandbox %q: %w", id, err) } sandbox.NetNSPath = sandbox.NetNS.GetPath() defer func() { @@ -163,7 +164,7 @@ func (c *criService) RunPodSandbox(ctx context.Context, r *runtime.RunPodSandbox // calls to network namespace of the pod to query the IP of the veth interface on every // SandboxStatus request. if err := c.setupPodNetwork(ctx, &sandbox); err != nil { - return nil, errors.Wrapf(err, "failed to setup network for sandbox %q", id) + return nil, fmt.Errorf("failed to setup network for sandbox %q: %w", id, err) } sandboxCreateNetworkTimer.UpdateSince(netStart) } @@ -175,7 +176,7 @@ func (c *criService) RunPodSandbox(ctx context.Context, r *runtime.RunPodSandbox // it safely. spec, err := c.sandboxContainerSpec(id, config, &image.ImageSpec.Config, sandbox.NetNSPath, ociRuntime.PodAnnotations) if err != nil { - return nil, errors.Wrap(err, "failed to generate sandbox container spec") + return nil, fmt.Errorf("failed to generate sandbox container spec: %w", err) } log.G(ctx).WithField("podsandboxid", id).Debugf("sandbox container spec: %#+v", spew.NewFormatter(spec)) sandbox.ProcessLabel = spec.Process.SelinuxLabel @@ -199,14 +200,14 @@ func (c *criService) RunPodSandbox(ctx context.Context, r *runtime.RunPodSandbox // Generate spec options that will be applied to the spec later. specOpts, err := c.sandboxContainerSpecOpts(config, &image.ImageSpec.Config) if err != nil { - return nil, errors.Wrap(err, "failed to generate sanbdox container spec options") + return nil, fmt.Errorf("failed to generate sanbdox container spec options: %w", err) } sandboxLabels := buildLabels(config.Labels, image.ImageSpec.Config.Labels, containerKindSandbox) runtimeOpts, err := generateRuntimeOptions(ociRuntime, c.config) if err != nil { - return nil, errors.Wrap(err, "failed to generate runtime options") + return nil, fmt.Errorf("failed to generate runtime options: %w", err) } snapshotterOpt := snapshots.WithLabels(snapshots.FilterInheritedLabels(config.Annotations)) opts := []containerd.NewContainerOpts{ @@ -219,7 +220,7 @@ func (c *criService) RunPodSandbox(ctx context.Context, r *runtime.RunPodSandbox container, err := c.client.NewContainer(ctx, id, opts...) if err != nil { - return nil, errors.Wrap(err, "failed to create containerd container") + return nil, fmt.Errorf("failed to create containerd container: %w", err) } defer func() { if retErr != nil { @@ -234,8 +235,8 @@ func (c *criService) RunPodSandbox(ctx context.Context, r *runtime.RunPodSandbox // Create sandbox container root directories. sandboxRootDir := c.getSandboxRootDir(id) if err := c.os.MkdirAll(sandboxRootDir, 0755); err != nil { - return nil, errors.Wrapf(err, "failed to create sandbox root directory %q", - sandboxRootDir) + return nil, fmt.Errorf("failed to create sandbox root directory %q: %w", + sandboxRootDir, err) } defer func() { if retErr != nil { @@ -248,8 +249,8 @@ func (c *criService) RunPodSandbox(ctx context.Context, r *runtime.RunPodSandbox }() volatileSandboxRootDir := c.getVolatileSandboxRootDir(id) if err := c.os.MkdirAll(volatileSandboxRootDir, 0755); err != nil { - return nil, errors.Wrapf(err, "failed to create volatile sandbox root directory %q", - volatileSandboxRootDir) + return nil, fmt.Errorf("failed to create volatile sandbox root directory %q: %w", + volatileSandboxRootDir, err) } defer func() { if retErr != nil { @@ -263,7 +264,7 @@ func (c *criService) RunPodSandbox(ctx context.Context, r *runtime.RunPodSandbox // Setup files required for the sandbox. if err = c.setupSandboxFiles(id, config); err != nil { - return nil, errors.Wrapf(err, "failed to setup sandbox files") + return nil, fmt.Errorf("failed to setup sandbox files: %w", err) } defer func() { if retErr != nil { @@ -277,7 +278,7 @@ func (c *criService) RunPodSandbox(ctx context.Context, r *runtime.RunPodSandbox // Update sandbox created timestamp. info, err := container.Info(ctx) if err != nil { - return nil, errors.Wrap(err, "failed to get sandbox container info") + return nil, fmt.Errorf("failed to get sandbox container info: %w", err) } // Create sandbox task in containerd. @@ -291,7 +292,7 @@ func (c *criService) RunPodSandbox(ctx context.Context, r *runtime.RunPodSandbox // We don't need stdio for sandbox container. task, err := container.NewTask(ctx, containerdio.NullIO, taskOpts...) if err != nil { - return nil, errors.Wrap(err, "failed to create containerd task") + return nil, fmt.Errorf("failed to create containerd task: %w", err) } defer func() { if retErr != nil { @@ -307,12 +308,12 @@ func (c *criService) RunPodSandbox(ctx context.Context, r *runtime.RunPodSandbox // wait is a long running background request, no timeout needed. exitCh, err := task.Wait(ctrdutil.NamespacedContext()) if err != nil { - return nil, errors.Wrap(err, "failed to wait for sandbox container task") + return nil, fmt.Errorf("failed to wait for sandbox container task: %w", err) } nric, err := nri.New() if err != nil { - return nil, errors.Wrap(err, "unable to create nri client") + return nil, fmt.Errorf("unable to create nri client: %w", err) } if nric != nil { nriSB := &nri.Sandbox{ @@ -320,12 +321,12 @@ func (c *criService) RunPodSandbox(ctx context.Context, r *runtime.RunPodSandbox Labels: config.Labels, } if _, err := nric.InvokeWithSandbox(ctx, task, v1.Create, nriSB); err != nil { - return nil, errors.Wrap(err, "nri invoke") + return nil, fmt.Errorf("nri invoke: %w", err) } } if err := task.Start(ctx); err != nil { - return nil, errors.Wrapf(err, "failed to start sandbox container task %q", id) + return nil, fmt.Errorf("failed to start sandbox container task %q: %w", id, err) } if err := sandbox.Status.Update(func(status sandboxstore.Status) (sandboxstore.Status, error) { @@ -335,14 +336,14 @@ func (c *criService) RunPodSandbox(ctx context.Context, r *runtime.RunPodSandbox status.CreatedAt = info.CreatedAt return status, nil }); err != nil { - return nil, errors.Wrap(err, "failed to update sandbox status") + return nil, fmt.Errorf("failed to update sandbox status: %w", err) } // Add sandbox into sandbox store in INIT state. sandbox.Container = container if err := c.sandboxStore.Add(sandbox); err != nil { - return nil, errors.Wrapf(err, "failed to add sandbox %+v into store", sandbox) + return nil, fmt.Errorf("failed to add sandbox %+v into store: %w", sandbox, err) } // start the monitor after adding sandbox into the store, this ensures @@ -386,7 +387,7 @@ func (c *criService) setupPodNetwork(ctx context.Context, sandbox *sandboxstore. opts, err := cniNamespaceOpts(id, config) if err != nil { - return errors.Wrap(err, "get cni namespace options") + return fmt.Errorf("get cni namespace options: %w", err) } log.G(ctx).WithField("podsandboxid", id).Debugf("begin cni setup") result, err := netPlugin.Setup(ctx, id, path, opts...) @@ -400,7 +401,7 @@ func (c *criService) setupPodNetwork(ctx context.Context, sandbox *sandboxstore. sandbox.CNIResult = result return nil } - return errors.Errorf("failed to find network info for sandbox %q", id) + return fmt.Errorf("failed to find network info for sandbox %q", id) } // cniNamespaceOpts get CNI namespace options from sandbox config. @@ -448,7 +449,7 @@ func toCNILabels(id string, config *runtime.PodSandboxConfig) map[string]string func toCNIBandWidth(annotations map[string]string) (*cni.BandWidth, error) { ingress, egress, err := bandwidth.ExtractPodBandwidthResources(annotations) if err != nil { - return nil, errors.Wrap(err, "reading pod bandwidth annotations") + return nil, fmt.Errorf("reading pod bandwidth annotations: %w", err) } if ingress == nil && egress == nil { @@ -590,7 +591,7 @@ func (c *criService) getSandboxRuntime(config *runtime.PodSandboxConfig, runtime handler, ok := c.config.ContainerdConfig.Runtimes[runtimeHandler] if !ok { - return criconfig.Runtime{}, errors.Errorf("no runtime for %q is configured", runtimeHandler) + return criconfig.Runtime{}, fmt.Errorf("no runtime for %q is configured", runtimeHandler) } return handler, nil } diff --git a/pkg/cri/server/sandbox_run_linux.go b/pkg/cri/server/sandbox_run_linux.go index 4a82f1a9a..c4485e2fa 100644 --- a/pkg/cri/server/sandbox_run_linux.go +++ b/pkg/cri/server/sandbox_run_linux.go @@ -28,7 +28,6 @@ import ( imagespec "github.com/opencontainers/image-spec/specs-go/v1" runtimespec "github.com/opencontainers/runtime-spec/specs-go" selinux "github.com/opencontainers/selinux/go-selinux" - "github.com/pkg/errors" "golang.org/x/sys/unix" runtime "k8s.io/cri-api/pkg/apis/runtime/v1" @@ -56,7 +55,7 @@ func (c *criService) sandboxContainerSpec(id string, config *runtime.PodSandboxC if len(imageConfig.Entrypoint) == 0 && len(imageConfig.Cmd) == 0 { // Pause image must have entrypoint or cmd. - return nil, errors.Errorf("invalid empty entrypoint and cmd in image config %+v", imageConfig) + return nil, fmt.Errorf("invalid empty entrypoint and cmd in image config %+v", imageConfig) } specOpts = append(specOpts, oci.WithProcessArgs(append(imageConfig.Entrypoint, imageConfig.Cmd...)...)) @@ -120,7 +119,7 @@ func (c *criService) sandboxContainerSpec(id string, config *runtime.PodSandboxC processLabel, mountLabel, err := initLabelsFromOpt(securityContext.GetSelinuxOptions()) if err != nil { - return nil, errors.Wrapf(err, "failed to init selinux options %+v", securityContext.GetSelinuxOptions()) + return nil, fmt.Errorf("failed to init selinux options %+v: %w", securityContext.GetSelinuxOptions(), err) } defer func() { if retErr != nil { @@ -197,7 +196,7 @@ func (c *criService) sandboxContainerSpecOpts(config *runtime.PodSandboxConfig, securityContext.GetSeccompProfilePath(), //nolint:staticcheck // Deprecated but we don't want to remove yet c.config.UnsetSeccompProfile) if err != nil { - return nil, errors.Wrap(err, "failed to generate seccomp spec opts") + return nil, fmt.Errorf("failed to generate seccomp spec opts: %w", err) } } seccompSpecOpts, err := c.generateSeccompSpecOpts( @@ -205,7 +204,7 @@ func (c *criService) sandboxContainerSpecOpts(config *runtime.PodSandboxConfig, securityContext.GetPrivileged(), c.seccompEnabled()) if err != nil { - return nil, errors.Wrap(err, "failed to generate seccomp spec opts") + return nil, fmt.Errorf("failed to generate seccomp spec opts: %w", err) } if seccompSpecOpts != nil { specOpts = append(specOpts, seccompSpecOpts) @@ -217,7 +216,7 @@ func (c *criService) sandboxContainerSpecOpts(config *runtime.PodSandboxConfig, securityContext.GetRunAsGroup(), ) if err != nil { - return nil, errors.Wrap(err, "failed to generate user string") + return nil, fmt.Errorf("failed to generate user string: %w", err) } if userstr == "" { // Lastly, since no user override was passed via CRI try to set via OCI @@ -239,17 +238,17 @@ func (c *criService) setupSandboxFiles(id string, config *runtime.PodSandboxConf var err error hostname, err = c.os.Hostname() if err != nil { - return errors.Wrap(err, "failed to get hostname") + return fmt.Errorf("failed to get hostname: %w", err) } } if err := c.os.WriteFile(sandboxEtcHostname, []byte(hostname+"\n"), 0644); err != nil { - return errors.Wrapf(err, "failed to write hostname to %q", sandboxEtcHostname) + return fmt.Errorf("failed to write hostname to %q: %w", sandboxEtcHostname, err) } // TODO(random-liu): Consider whether we should maintain /etc/hosts and /etc/resolv.conf in kubelet. sandboxEtcHosts := c.getSandboxHosts(id) if err := c.os.CopyFile(etcHosts, sandboxEtcHosts, 0644); err != nil { - return errors.Wrapf(err, "failed to generate sandbox hosts file %q", sandboxEtcHosts) + return fmt.Errorf("failed to generate sandbox hosts file %q: %w", sandboxEtcHosts, err) } // Set DNS options. Maintain a resolv.conf for the sandbox. @@ -258,7 +257,7 @@ func (c *criService) setupSandboxFiles(id string, config *runtime.PodSandboxConf if dnsConfig := config.GetDnsConfig(); dnsConfig != nil { resolvContent, err = parseDNSOptions(dnsConfig.Servers, dnsConfig.Searches, dnsConfig.Options) if err != nil { - return errors.Wrapf(err, "failed to parse sandbox DNSConfig %+v", dnsConfig) + return fmt.Errorf("failed to parse sandbox DNSConfig %+v: %w", dnsConfig, err) } } resolvPath := c.getResolvPath(id) @@ -266,28 +265,28 @@ func (c *criService) setupSandboxFiles(id string, config *runtime.PodSandboxConf // copy host's resolv.conf to resolvPath err = c.os.CopyFile(resolvConfPath, resolvPath, 0644) if err != nil { - return errors.Wrapf(err, "failed to copy host's resolv.conf to %q", resolvPath) + return fmt.Errorf("failed to copy host's resolv.conf to %q: %w", resolvPath, err) } } else { err = c.os.WriteFile(resolvPath, []byte(resolvContent), 0644) if err != nil { - return errors.Wrapf(err, "failed to write resolv content to %q", resolvPath) + return fmt.Errorf("failed to write resolv content to %q: %w", resolvPath, err) } } // Setup sandbox /dev/shm. if config.GetLinux().GetSecurityContext().GetNamespaceOptions().GetIpc() == runtime.NamespaceMode_NODE { if _, err := c.os.Stat(devShm); err != nil { - return errors.Wrapf(err, "host %q is not available for host ipc", devShm) + return fmt.Errorf("host %q is not available for host ipc: %w", devShm, err) } } else { sandboxDevShm := c.getSandboxDevShm(id) if err := c.os.MkdirAll(sandboxDevShm, 0700); err != nil { - return errors.Wrap(err, "failed to create sandbox shm") + return fmt.Errorf("failed to create sandbox shm: %w", err) } shmproperty := fmt.Sprintf("mode=1777,size=%d", defaultShmSize) if err := c.os.(osinterface.UNIX).Mount("shm", sandboxDevShm, "tmpfs", uintptr(unix.MS_NOEXEC|unix.MS_NOSUID|unix.MS_NODEV), shmproperty); err != nil { - return errors.Wrap(err, "failed to mount sandbox shm") + return fmt.Errorf("failed to mount sandbox shm: %w", err) } } @@ -320,10 +319,10 @@ func (c *criService) cleanupSandboxFiles(id string, config *runtime.PodSandboxCo if config.GetLinux().GetSecurityContext().GetNamespaceOptions().GetIpc() != runtime.NamespaceMode_NODE { path, err := c.os.FollowSymlinkInScope(c.getSandboxDevShm(id), "/") if err != nil { - return errors.Wrap(err, "failed to follow symlink") + return fmt.Errorf("failed to follow symlink: %w", err) } if err := c.os.(osinterface.UNIX).Unmount(path); err != nil && !os.IsNotExist(err) { - return errors.Wrapf(err, "failed to unmount %q", path) + return fmt.Errorf("failed to unmount %q: %w", path, err) } } return nil diff --git a/pkg/cri/server/sandbox_run_windows.go b/pkg/cri/server/sandbox_run_windows.go index 29d70953f..a2e0530ea 100644 --- a/pkg/cri/server/sandbox_run_windows.go +++ b/pkg/cri/server/sandbox_run_windows.go @@ -17,13 +17,13 @@ package server import ( + "fmt" "strconv" "github.com/containerd/containerd" "github.com/containerd/containerd/oci" imagespec "github.com/opencontainers/image-spec/specs-go/v1" runtimespec "github.com/opencontainers/runtime-spec/specs-go" - "github.com/pkg/errors" runtime "k8s.io/cri-api/pkg/apis/runtime/v1" "github.com/containerd/containerd/pkg/cri/annotations" @@ -43,7 +43,7 @@ func (c *criService) sandboxContainerSpec(id string, config *runtime.PodSandboxC if len(imageConfig.Entrypoint) == 0 && len(imageConfig.Cmd) == 0 { // Pause image must have entrypoint or cmd. - return nil, errors.Errorf("invalid empty entrypoint and cmd in image config %+v", imageConfig) + return nil, fmt.Errorf("invalid empty entrypoint and cmd in image config %+v", imageConfig) } specOpts = append(specOpts, oci.WithProcessArgs(append(imageConfig.Entrypoint, imageConfig.Cmd...)...)) diff --git a/pkg/cri/server/sandbox_stats.go b/pkg/cri/server/sandbox_stats.go index f3402c939..8b4738836 100644 --- a/pkg/cri/server/sandbox_stats.go +++ b/pkg/cri/server/sandbox_stats.go @@ -17,7 +17,8 @@ package server import ( - "github.com/pkg/errors" + "fmt" + "golang.org/x/net/context" runtime "k8s.io/cri-api/pkg/apis/runtime/v1" ) @@ -29,18 +30,18 @@ func (c *criService) PodSandboxStats( sandbox, err := c.sandboxStore.Get(r.GetPodSandboxId()) if err != nil { - return nil, errors.Wrapf(err, "an error occurred when trying to find sandbox %s", r.GetPodSandboxId()) + return nil, fmt.Errorf("an error occurred when trying to find sandbox %s: %w", r.GetPodSandboxId(), err) } metrics, err := metricsForSandbox(sandbox) if err != nil { - return nil, errors.Wrapf(err, "failed getting metrics for sandbox %s", r.GetPodSandboxId()) + return nil, fmt.Errorf("failed getting metrics for sandbox %s: %w", r.GetPodSandboxId(), err) } podSandboxStats, err := c.podSandboxStats(ctx, sandbox, metrics) if err != nil { - return nil, errors.Wrapf(err, "failed to decode pod sandbox metrics %s", r.GetPodSandboxId()) + return nil, fmt.Errorf("failed to decode pod sandbox metrics %s: %w", r.GetPodSandboxId(), err) } return &runtime.PodSandboxStatsResponse{Stats: podSandboxStats}, nil diff --git a/pkg/cri/server/sandbox_stats_linux.go b/pkg/cri/server/sandbox_stats_linux.go index ad4feb59d..bd06cb5a1 100644 --- a/pkg/cri/server/sandbox_stats_linux.go +++ b/pkg/cri/server/sandbox_stats_linux.go @@ -17,10 +17,10 @@ package server import ( + "fmt" "time" "github.com/containernetworking/plugins/pkg/ns" - "github.com/pkg/errors" "golang.org/x/net/context" runtime "k8s.io/cri-api/pkg/apis/runtime/v1" @@ -41,7 +41,7 @@ func (c *criService) podSandboxStats( meta := sandbox.Metadata if sandbox.Status.Get().State != sandboxstore.StateReady { - return nil, errors.Errorf("failed to get pod sandbox stats since sandbox container %q is not in ready state", meta.ID) + return nil, fmt.Errorf("failed to get pod sandbox stats since sandbox container %q is not in ready state", meta.ID) } var podSandboxStats runtime.PodSandboxStats @@ -59,13 +59,13 @@ func (c *criService) podSandboxStats( cpuStats, err := c.cpuContainerStats(meta.ID, true /* isSandbox */, stats, timestamp) if err != nil { - return nil, errors.Wrap(err, "failed to obtain cpu stats") + return nil, fmt.Errorf("failed to obtain cpu stats: %w", err) } podSandboxStats.Linux.Cpu = cpuStats memoryStats, err := c.memoryContainerStats(meta.ID, stats, timestamp) if err != nil { - return nil, errors.Wrap(err, "failed to obtain memory stats") + return nil, fmt.Errorf("failed to obtain memory stats: %w", err) } podSandboxStats.Linux.Memory = memoryStats @@ -113,7 +113,7 @@ func (c *criService) podSandboxStats( listContainerStatsRequest := &runtime.ListContainerStatsRequest{Filter: &runtime.ContainerStatsFilter{PodSandboxId: meta.ID}} resp, err := c.ListContainerStats(ctx, listContainerStatsRequest) if err != nil { - return nil, errors.Wrap(err, "failed to obtain container stats during podSandboxStats call") + return nil, fmt.Errorf("failed to obtain container stats during podSandboxStats call: %w", err) } podSandboxStats.Linux.Containers = resp.GetStats() } @@ -146,29 +146,29 @@ func metricsForSandbox(sandbox sandboxstore.Sandbox) (interface{}, error) { cgroupPath := sandbox.Config.GetLinux().GetCgroupParent() if cgroupPath == "" { - return nil, errors.Errorf("failed to get cgroup metrics for sandbox %v because cgroupPath is empty", sandbox.ID) + return nil, fmt.Errorf("failed to get cgroup metrics for sandbox %v because cgroupPath is empty", sandbox.ID) } var statsx interface{} if cgroups.Mode() == cgroups.Unified { cg, err := cgroupsv2.LoadManager("/sys/fs/cgroup", cgroupPath) if err != nil { - return nil, errors.Wrapf(err, "failed to load sandbox cgroup: %v", cgroupPath) + return nil, fmt.Errorf("failed to load sandbox cgroup: %v: %w", cgroupPath, err) } stats, err := cg.Stat() if err != nil { - return nil, errors.Wrapf(err, "failed to get stats for cgroup: %v", cgroupPath) + return nil, fmt.Errorf("failed to get stats for cgroup: %v: %w", cgroupPath, err) } statsx = stats } else { control, err := cgroups.Load(cgroups.V1, cgroups.StaticPath(cgroupPath)) if err != nil { - return nil, errors.Wrapf(err, "failed to load sandbox cgroup: %v", cgroupPath) + return nil, fmt.Errorf("failed to load sandbox cgroup %v: %w", cgroupPath, err) } stats, err := control.Stat(cgroups.IgnoreNotExist) if err != nil { - return nil, errors.Wrapf(err, "failed to get stats for cgroup %v", cgroupPath) + return nil, fmt.Errorf("failed to get stats for cgroup %v: %w", cgroupPath, err) } statsx = stats } diff --git a/pkg/cri/server/sandbox_stats_list.go b/pkg/cri/server/sandbox_stats_list.go index cefcc43ee..01ded0e3c 100644 --- a/pkg/cri/server/sandbox_stats_list.go +++ b/pkg/cri/server/sandbox_stats_list.go @@ -17,8 +17,9 @@ package server import ( + "fmt" + sandboxstore "github.com/containerd/containerd/pkg/cri/store/sandbox" - "github.com/pkg/errors" "golang.org/x/net/context" runtime "k8s.io/cri-api/pkg/apis/runtime/v1" ) @@ -35,12 +36,12 @@ func (c *criService) ListPodSandboxStats( metrics, err := metricsForSandbox(sandbox) if err != nil { - return nil, errors.Wrapf(err, "failed to obtain metrics for sandbox %q", sandbox.ID) + return nil, fmt.Errorf("failed to obtain metrics for sandbox %q: %w", sandbox.ID, err) } sandboxStats, err := c.podSandboxStats(ctx, sandbox, metrics) if err != nil { - return nil, errors.Wrapf(err, "failed to decode sandbox container metrics for sandbox %q", sandbox.ID) + return nil, fmt.Errorf("failed to decode sandbox container metrics for sandbox %q: %w", sandbox.ID, err) } podSandboxStats.Stats = append(podSandboxStats.Stats, sandboxStats) } diff --git a/pkg/cri/server/sandbox_stats_other.go b/pkg/cri/server/sandbox_stats_other.go index 88c94d182..f21391eac 100644 --- a/pkg/cri/server/sandbox_stats_other.go +++ b/pkg/cri/server/sandbox_stats_other.go @@ -20,18 +20,19 @@ package server import ( + "fmt" + "golang.org/x/net/context" runtime "k8s.io/cri-api/pkg/apis/runtime/v1" "github.com/containerd/containerd/errdefs" sandboxstore "github.com/containerd/containerd/pkg/cri/store/sandbox" - "github.com/pkg/errors" ) func (c *criService) podSandboxStats(ctx context.Context, sandbox sandboxstore.Sandbox, stats interface{}) (*runtime.PodSandboxStats, error) { - return nil, errors.Wrap(errdefs.ErrNotImplemented, "pod sandbox stats not implemented") + return nil, fmt.Errorf("pod sandbox stats not implemented: %w", errdefs.ErrNotImplemented) } func metricsForSandbox(sandbox sandboxstore.Sandbox) (interface{}, error) { - return nil, errors.Wrap(errdefs.ErrNotImplemented, "metrics for sandbox not implemented") + return nil, fmt.Errorf("metrics for sandbox not implemented: %w", errdefs.ErrNotImplemented) } diff --git a/pkg/cri/server/sandbox_stats_windows.go b/pkg/cri/server/sandbox_stats_windows.go index 3798a5e1b..d4b237337 100644 --- a/pkg/cri/server/sandbox_stats_windows.go +++ b/pkg/cri/server/sandbox_stats_windows.go @@ -17,18 +17,19 @@ package server import ( + "fmt" + "golang.org/x/net/context" runtime "k8s.io/cri-api/pkg/apis/runtime/v1" "github.com/containerd/containerd/errdefs" sandboxstore "github.com/containerd/containerd/pkg/cri/store/sandbox" - "github.com/pkg/errors" ) func (c *criService) podSandboxStats(ctx context.Context, sandbox sandboxstore.Sandbox, stats interface{}) (*runtime.PodSandboxStats, error) { - return nil, errors.Wrap(errdefs.ErrNotImplemented, "pod sandbox stats not implemented on windows") + return nil, fmt.Errorf("pod sandbox stats not implemented on windows: %w", errdefs.ErrNotImplemented) } func metricsForSandbox(sandbox sandboxstore.Sandbox) (interface{}, error) { - return nil, errors.Wrap(errdefs.ErrNotImplemented, "metrics for sandbox not implemented on windows") + return nil, fmt.Errorf("metrics for sandbox not implemented on windows: %w", errdefs.ErrNotImplemented) } diff --git a/pkg/cri/server/sandbox_status.go b/pkg/cri/server/sandbox_status.go index e21e96e3f..609b559a8 100644 --- a/pkg/cri/server/sandbox_status.go +++ b/pkg/cri/server/sandbox_status.go @@ -18,13 +18,13 @@ package server import ( "encoding/json" + "fmt" goruntime "runtime" "github.com/containerd/containerd" "github.com/containerd/containerd/errdefs" cni "github.com/containerd/go-cni" runtimespec "github.com/opencontainers/runtime-spec/specs-go" - "github.com/pkg/errors" "golang.org/x/net/context" runtime "k8s.io/cri-api/pkg/apis/runtime/v1" @@ -35,19 +35,19 @@ import ( func (c *criService) PodSandboxStatus(ctx context.Context, r *runtime.PodSandboxStatusRequest) (*runtime.PodSandboxStatusResponse, error) { sandbox, err := c.sandboxStore.Get(r.GetPodSandboxId()) if err != nil { - return nil, errors.Wrap(err, "an error occurred when try to find sandbox") + return nil, fmt.Errorf("an error occurred when try to find sandbox: %w", err) } ip, additionalIPs, err := c.getIPs(sandbox) if err != nil { - return nil, errors.Wrap(err, "failed to get sandbox ip") + return nil, fmt.Errorf("failed to get sandbox ip: %w", err) } status := toCRISandboxStatus(sandbox.Metadata, sandbox.Status.Get(), ip, additionalIPs) if status.GetCreatedAt() == 0 { // CRI doesn't allow CreatedAt == 0. info, err := sandbox.Container.Info(ctx) if err != nil { - return nil, errors.Wrapf(err, "failed to get CreatedAt for sandbox container in %q state", status.State) + return nil, fmt.Errorf("failed to get CreatedAt for sandbox container in %q state: %w", status.State, err) } status.CreatedAt = info.CreatedAt.UnixNano() } @@ -58,7 +58,7 @@ func (c *criService) PodSandboxStatus(ctx context.Context, r *runtime.PodSandbox // Generate verbose information. info, err := toCRISandboxInfo(ctx, sandbox) if err != nil { - return nil, errors.Wrap(err, "failed to get verbose sandbox container info") + return nil, fmt.Errorf("failed to get verbose sandbox container info: %w", err) } return &runtime.PodSandboxStatusResponse{ @@ -81,7 +81,7 @@ func (c *criService) getIPs(sandbox sandboxstore.Sandbox) (string, []string, err } if closed, err := sandbox.NetNS.Closed(); err != nil { - return "", nil, errors.Wrap(err, "check network namespace closed") + return "", nil, fmt.Errorf("check network namespace closed: %w", err) } else if closed { return "", nil, nil } @@ -150,14 +150,14 @@ func toCRISandboxInfo(ctx context.Context, sandbox sandboxstore.Sandbox) (map[st container := sandbox.Container task, err := container.Task(ctx, nil) if err != nil && !errdefs.IsNotFound(err) { - return nil, errors.Wrap(err, "failed to get sandbox container task") + return nil, fmt.Errorf("failed to get sandbox container task: %w", err) } var processStatus containerd.ProcessStatus if task != nil { taskStatus, err := task.Status(ctx) if err != nil { - return nil, errors.Wrap(err, "failed to get task status") + return nil, fmt.Errorf("failed to get task status: %w", err) } processStatus = taskStatus.Status @@ -181,20 +181,20 @@ func toCRISandboxInfo(ctx context.Context, sandbox sandboxstore.Sandbox) (map[st // Add network closed information if sandbox is not using host network. closed, err := sandbox.NetNS.Closed() if err != nil { - return nil, errors.Wrap(err, "failed to check network namespace closed") + return nil, fmt.Errorf("failed to check network namespace closed: %w", err) } si.NetNSClosed = closed } spec, err := container.Spec(ctx) if err != nil { - return nil, errors.Wrap(err, "failed to get sandbox container runtime spec") + return nil, fmt.Errorf("failed to get sandbox container runtime spec: %w", err) } si.RuntimeSpec = spec ctrInfo, err := container.Info(ctx) if err != nil { - return nil, errors.Wrap(err, "failed to get sandbox container info") + return nil, fmt.Errorf("failed to get sandbox container info: %w", err) } // Do not use config.SandboxImage because the configuration might // be changed during restart. It may not reflect the actual image @@ -205,14 +205,14 @@ func toCRISandboxInfo(ctx context.Context, sandbox sandboxstore.Sandbox) (map[st runtimeOptions, err := getRuntimeOptions(ctrInfo) if err != nil { - return nil, errors.Wrap(err, "failed to get runtime options") + return nil, fmt.Errorf("failed to get runtime options: %w", err) } si.RuntimeType = ctrInfo.Runtime.Name si.RuntimeOptions = runtimeOptions infoBytes, err := json.Marshal(si) if err != nil { - return nil, errors.Wrapf(err, "failed to marshal info %v", si) + return nil, fmt.Errorf("failed to marshal info %v: %w", si, err) } return map[string]string{ "info": string(infoBytes), diff --git a/pkg/cri/server/sandbox_stop.go b/pkg/cri/server/sandbox_stop.go index c64398e97..a32316310 100644 --- a/pkg/cri/server/sandbox_stop.go +++ b/pkg/cri/server/sandbox_stop.go @@ -17,13 +17,14 @@ package server import ( + "errors" + "fmt" "syscall" "time" eventtypes "github.com/containerd/containerd/api/events" "github.com/containerd/containerd/errdefs" "github.com/containerd/containerd/log" - "github.com/pkg/errors" "golang.org/x/net/context" runtime "k8s.io/cri-api/pkg/apis/runtime/v1" @@ -36,8 +37,8 @@ import ( func (c *criService) StopPodSandbox(ctx context.Context, r *runtime.StopPodSandboxRequest) (*runtime.StopPodSandboxResponse, error) { sandbox, err := c.sandboxStore.Get(r.GetPodSandboxId()) if err != nil { - return nil, errors.Wrapf(err, "an error occurred when try to find sandbox %q", - r.GetPodSandboxId()) + return nil, fmt.Errorf("an error occurred when try to find sandbox %q: %w", + r.GetPodSandboxId(), err) } if err := c.stopPodSandbox(ctx, sandbox); err != nil { @@ -63,19 +64,19 @@ func (c *criService) stopPodSandbox(ctx context.Context, sandbox sandboxstore.Sa // Forcibly stop the container. Do not use `StopContainer`, because it introduces a race // if a container is removed after list. if err := c.stopContainer(ctx, container, 0); err != nil { - return errors.Wrapf(err, "failed to stop container %q", container.ID) + return fmt.Errorf("failed to stop container %q: %w", container.ID, err) } } if err := c.cleanupSandboxFiles(id, sandbox.Config); err != nil { - return errors.Wrap(err, "failed to cleanup sandbox files") + return fmt.Errorf("failed to cleanup sandbox files: %w", err) } // Only stop sandbox container when it's running or unknown. state := sandbox.Status.Get().State if state == sandboxstore.StateReady || state == sandboxstore.StateUnknown { if err := c.stopSandboxContainer(ctx, sandbox); err != nil { - return errors.Wrapf(err, "failed to stop sandbox container %q in %q state", id, state) + return fmt.Errorf("failed to stop sandbox container %q in %q state: %w", id, state, err) } } sandboxRuntimeStopTimer.WithValues(sandbox.RuntimeHandler).UpdateSince(stop) @@ -86,15 +87,15 @@ func (c *criService) stopPodSandbox(ctx context.Context, sandbox sandboxstore.Sa // Use empty netns path if netns is not available. This is defined in: // https://github.com/containernetworking/cni/blob/v0.7.0-alpha1/SPEC.md if closed, err := sandbox.NetNS.Closed(); err != nil { - return errors.Wrap(err, "failed to check network namespace closed") + return fmt.Errorf("failed to check network namespace closed: %w", err) } else if closed { sandbox.NetNSPath = "" } if err := c.teardownPodNetwork(ctx, sandbox); err != nil { - return errors.Wrapf(err, "failed to destroy network for sandbox %q", id) + return fmt.Errorf("failed to destroy network for sandbox %q: %w", id, err) } if err := sandbox.NetNS.Remove(); err != nil { - return errors.Wrapf(err, "failed to remove network namespace for sandbox %q", id) + return fmt.Errorf("failed to remove network namespace for sandbox %q: %w", id, err) } sandboxDeleteNetwork.UpdateSince(netStop) } @@ -114,7 +115,7 @@ func (c *criService) stopSandboxContainer(ctx context.Context, sandbox sandboxst task, err := container.Task(ctx, nil) if err != nil { if !errdefs.IsNotFound(err) { - return errors.Wrap(err, "failed to get sandbox container") + return fmt.Errorf("failed to get sandbox container: %w", err) } // Don't return for unknown state, some cleanup needs to be done. if state == sandboxstore.StateUnknown { @@ -132,7 +133,7 @@ func (c *criService) stopSandboxContainer(ctx context.Context, sandbox sandboxst exitCh, err := task.Wait(waitCtx) if err != nil { if !errdefs.IsNotFound(err) { - return errors.Wrap(err, "failed to wait for task") + return fmt.Errorf("failed to wait for task: %w", err) } return cleanupUnknownSandbox(ctx, id, sandbox) } @@ -150,7 +151,7 @@ func (c *criService) stopSandboxContainer(ctx context.Context, sandbox sandboxst // Kill the sandbox container. if err = task.Kill(ctx, syscall.SIGKILL); err != nil && !errdefs.IsNotFound(err) { - return errors.Wrap(err, "failed to kill sandbox container") + return fmt.Errorf("failed to kill sandbox container: %w", err) } return c.waitSandboxStop(ctx, sandbox) @@ -161,7 +162,7 @@ func (c *criService) stopSandboxContainer(ctx context.Context, sandbox sandboxst func (c *criService) waitSandboxStop(ctx context.Context, sandbox sandboxstore.Sandbox) error { select { case <-ctx.Done(): - return errors.Wrapf(ctx.Err(), "wait sandbox container %q", sandbox.ID) + return fmt.Errorf("wait sandbox container %q: %w", sandbox.ID, ctx.Err()) case <-sandbox.Stopped(): return nil } @@ -181,7 +182,7 @@ func (c *criService) teardownPodNetwork(ctx context.Context, sandbox sandboxstor ) opts, err := cniNamespaceOpts(id, config) if err != nil { - return errors.Wrap(err, "get cni namespace options") + return fmt.Errorf("get cni namespace options: %w", err) } return netPlugin.Remove(ctx, id, path, opts...) diff --git a/pkg/cri/server/service.go b/pkg/cri/server/service.go index 9de20c11e..b15164fea 100644 --- a/pkg/cri/server/service.go +++ b/pkg/cri/server/service.go @@ -31,7 +31,6 @@ import ( "github.com/containerd/containerd/pkg/cri/streaming" "github.com/containerd/containerd/plugin" cni "github.com/containerd/go-cni" - "github.com/pkg/errors" "github.com/sirupsen/logrus" "google.golang.org/grpc" runtime "k8s.io/cri-api/pkg/apis/runtime/v1" @@ -135,20 +134,20 @@ func NewCRIService(config criconfig.Config, client *containerd.Client) (CRIServi } if client.SnapshotService(c.config.ContainerdConfig.Snapshotter) == nil { - return nil, errors.Errorf("failed to find snapshotter %q", c.config.ContainerdConfig.Snapshotter) + return nil, fmt.Errorf("failed to find snapshotter %q", c.config.ContainerdConfig.Snapshotter) } c.imageFSPath = imageFSPath(config.ContainerdRootDir, config.ContainerdConfig.Snapshotter) logrus.Infof("Get image filesystem path %q", c.imageFSPath) if err := c.initPlatform(); err != nil { - return nil, errors.Wrap(err, "initialize platform") + return nil, fmt.Errorf("initialize platform: %w", err) } // prepare streaming server c.streamServer, err = newStreamServer(c, config.StreamServerAddress, config.StreamServerPort, config.StreamIdleTimeout) if err != nil { - return nil, errors.Wrap(err, "failed to create stream server") + return nil, fmt.Errorf("failed to create stream server: %w", err) } c.eventMonitor = newEventMonitor(c) @@ -164,7 +163,7 @@ func NewCRIService(config criconfig.Config, client *containerd.Client) (CRIServi if path != "" { m, err := newCNINetConfSyncer(path, i, c.cniLoadOptions()) if err != nil { - return nil, errors.Wrapf(err, "failed to create cni conf monitor for %s", name) + return nil, fmt.Errorf("failed to create cni conf monitor for %s: %w", name, err) } c.cniNetConfMonitor[name] = m } @@ -201,7 +200,7 @@ func (c *criService) Run() error { logrus.Infof("Start recovering state") if err := c.recover(ctrdutil.NamespacedContext()); err != nil { - return errors.Wrap(err, "failed to recover state") + return fmt.Errorf("failed to recover state: %w", err) } // Start event handler. @@ -255,7 +254,7 @@ func (c *criService) Run() error { case cniNetConfMonitorErr = <-cniNetConfMonitorErrCh: } if err := c.Close(); err != nil { - return errors.Wrap(err, "failed to stop cri service") + return fmt.Errorf("failed to stop cri service: %w", err) } // If the error is set above, err from channel must be nil here, because // the channel is supposed to be closed. Or else, we wait and set it. @@ -282,13 +281,13 @@ func (c *criService) Run() error { logrus.Errorf("Stream server is not stopped in %q", streamServerStopTimeout) } if eventMonitorErr != nil { - return errors.Wrap(eventMonitorErr, "event monitor error") + return fmt.Errorf("event monitor error: %w", eventMonitorErr) } if streamServerErr != nil { - return errors.Wrap(streamServerErr, "stream server error") + return fmt.Errorf("stream server error: %w", streamServerErr) } if cniNetConfMonitorErr != nil { - return errors.Wrap(cniNetConfMonitorErr, "cni network conf monitor error") + return fmt.Errorf("cni network conf monitor error: %w", cniNetConfMonitorErr) } return nil } @@ -304,7 +303,7 @@ func (c *criService) Close() error { } c.eventMonitor.stop() if err := c.streamServer.Stop(); err != nil { - return errors.Wrap(err, "failed to stop stream server") + return fmt.Errorf("failed to stop stream server: %w", err) } return nil } @@ -328,13 +327,13 @@ func imageFSPath(rootDir, snapshotter string) string { func loadOCISpec(filename string) (*oci.Spec, error) { file, err := os.Open(filename) if err != nil { - return nil, errors.Wrapf(err, "failed to open base OCI spec: %s", filename) + return nil, fmt.Errorf("failed to open base OCI spec: %s: %w", filename, err) } defer file.Close() spec := oci.Spec{} if err := json.NewDecoder(file).Decode(&spec); err != nil { - return nil, errors.Wrap(err, "failed to parse base OCI spec file") + return nil, fmt.Errorf("failed to parse base OCI spec file: %w", err) } return &spec, nil @@ -354,7 +353,7 @@ func loadBaseOCISpecs(config *criconfig.Config) (map[string]*oci.Spec, error) { spec, err := loadOCISpec(cfg.BaseRuntimeSpec) if err != nil { - return nil, errors.Wrapf(err, "failed to load base OCI spec from file: %s", cfg.BaseRuntimeSpec) + return nil, fmt.Errorf("failed to load base OCI spec from file: %s: %w", cfg.BaseRuntimeSpec, err) } specs[cfg.BaseRuntimeSpec] = spec diff --git a/pkg/cri/server/service_linux.go b/pkg/cri/server/service_linux.go index c41aa2c06..020e37397 100644 --- a/pkg/cri/server/service_linux.go +++ b/pkg/cri/server/service_linux.go @@ -17,11 +17,12 @@ package server import ( + "fmt" + "github.com/containerd/containerd/pkg/cap" "github.com/containerd/containerd/pkg/userns" cni "github.com/containerd/go-cni" "github.com/opencontainers/selinux/go-selinux" - "github.com/pkg/errors" "github.com/sirupsen/logrus" ) @@ -74,7 +75,7 @@ func (c *criService) initPlatform() (err error) { cni.WithPluginMaxConfNum(max), cni.WithPluginDir([]string{c.config.NetworkPluginBinDir})) if err != nil { - return errors.Wrap(err, "failed to initialize cni") + return fmt.Errorf("failed to initialize cni: %w", err) } c.netPlugin[name] = i } @@ -82,7 +83,7 @@ func (c *criService) initPlatform() (err error) { if c.allCaps == nil { c.allCaps, err = cap.Current() if err != nil { - return errors.Wrap(err, "failed to get caps") + return fmt.Errorf("failed to get caps: %w", err) } } diff --git a/pkg/cri/server/service_windows.go b/pkg/cri/server/service_windows.go index f335297e7..2d660c16f 100644 --- a/pkg/cri/server/service_windows.go +++ b/pkg/cri/server/service_windows.go @@ -17,8 +17,9 @@ package server import ( + "fmt" + cni "github.com/containerd/go-cni" - "github.com/pkg/errors" ) // windowsNetworkAttachCount is the minimum number of networks the PodSandbox @@ -54,7 +55,7 @@ func (c *criService) initPlatform() error { cni.WithPluginMaxConfNum(max), cni.WithPluginDir([]string{c.config.NetworkPluginBinDir})) if err != nil { - return errors.Wrap(err, "failed to initialize cni") + return fmt.Errorf("failed to initialize cni: %w", err) } c.netPlugin[name] = i } diff --git a/pkg/cri/server/snapshots.go b/pkg/cri/server/snapshots.go index 10dd41b03..ed672752f 100644 --- a/pkg/cri/server/snapshots.go +++ b/pkg/cri/server/snapshots.go @@ -18,11 +18,11 @@ package server import ( "context" + "fmt" "time" "github.com/containerd/containerd/errdefs" snapshot "github.com/containerd/containerd/snapshots" - "github.com/pkg/errors" "github.com/sirupsen/logrus" snapshotstore "github.com/containerd/containerd/pkg/cri/store/snapshot" @@ -80,7 +80,7 @@ func (s *snapshotsSyncer) sync() error { snapshots = append(snapshots, info) return nil }); err != nil { - return errors.Wrap(err, "walk all snapshots failed") + return fmt.Errorf("walk all snapshots failed: %w", err) } for _, info := range snapshots { sn, err := s.store.Get(info.Name) diff --git a/pkg/cri/server/streaming.go b/pkg/cri/server/streaming.go index d195d8d99..6c9cd4b3e 100644 --- a/pkg/cri/server/streaming.go +++ b/pkg/cri/server/streaming.go @@ -19,13 +19,14 @@ package server import ( "context" "crypto/tls" + "errors" + "fmt" "io" "math" "net" "os" "time" - "github.com/pkg/errors" k8snet "k8s.io/apimachinery/pkg/util/net" "k8s.io/apimachinery/pkg/util/runtime" "k8s.io/client-go/tools/remotecommand" @@ -70,7 +71,7 @@ func newStreamServer(c *criService, addr, port, streamIdleTimeout string) (strea if addr == "" { a, err := k8snet.ResolveBindAddress(nil) if err != nil { - return nil, errors.Wrap(err, "failed to get stream server address") + return nil, fmt.Errorf("failed to get stream server address: %w", err) } addr = a.String() } @@ -79,20 +80,20 @@ func newStreamServer(c *criService, addr, port, streamIdleTimeout string) (strea var err error config.StreamIdleTimeout, err = time.ParseDuration(streamIdleTimeout) if err != nil { - return nil, errors.Wrap(err, "invalid stream idle timeout") + return nil, fmt.Errorf("invalid stream idle timeout: %w", err) } } config.Addr = net.JoinHostPort(addr, port) run := newStreamRuntime(c) tlsMode, err := getStreamListenerMode(c) if err != nil { - return nil, errors.Wrapf(err, "invalid stream server configuration") + return nil, fmt.Errorf("invalid stream server configuration: %w", err) } switch tlsMode { case x509KeyPairTLS: tlsCert, err := tls.LoadX509KeyPair(c.config.X509KeyPairStreaming.TLSCertFile, c.config.X509KeyPairStreaming.TLSKeyFile) if err != nil { - return nil, errors.Wrap(err, "failed to load x509 key pair for stream server") + return nil, fmt.Errorf("failed to load x509 key pair for stream server: %w", err) } config.TLSConfig = &tls.Config{ Certificates: []tls.Certificate{tlsCert}, @@ -101,7 +102,7 @@ func newStreamServer(c *criService, addr, port, streamIdleTimeout string) (strea case selfSignTLS: tlsCert, err := newTLSCert() if err != nil { - return nil, errors.Wrap(err, "failed to generate tls certificate for stream server") + return nil, fmt.Errorf("failed to generate tls certificate for stream server: %w", err) } config.TLSConfig = &tls.Config{ Certificates: []tls.Certificate{tlsCert}, @@ -136,13 +137,13 @@ func (s *streamRuntime) Exec(containerID string, cmd []string, stdin io.Reader, resize: resize, }) if err != nil { - return errors.Wrap(err, "failed to exec in container") + return fmt.Errorf("failed to exec in container: %w", err) } if *exitCode == 0 { return nil } return &exec.CodeExitError{ - Err: errors.Errorf("error executing command %v, exit code %d", cmd, *exitCode), + Err: fmt.Errorf("error executing command %v, exit code %d", cmd, *exitCode), Code: int(*exitCode), } } @@ -154,7 +155,7 @@ func (s *streamRuntime) Attach(containerID string, in io.Reader, out, err io.Wri func (s *streamRuntime) PortForward(podSandboxID string, port int32, stream io.ReadWriteCloser) error { if port <= 0 || port > math.MaxUint16 { - return errors.Errorf("invalid port %d", port) + return fmt.Errorf("invalid port %d", port) } ctx := ctrdutil.NamespacedContext() return s.c.portForward(ctx, podSandboxID, port, stream) @@ -197,12 +198,12 @@ func newTLSCert() (tls.Certificate, error) { hostName, err := os.Hostname() if err != nil { - return fail(errors.Wrap(err, "failed to get hostname")) + return fail(fmt.Errorf("failed to get hostname: %w", err)) } addrs, err := net.InterfaceAddrs() if err != nil { - return fail(errors.Wrap(err, "failed to get host IP addresses")) + return fail(fmt.Errorf("failed to get host IP addresses: %w", err)) } var alternateIPs []net.IP @@ -226,13 +227,13 @@ func newTLSCert() (tls.Certificate, error) { // Generate a self signed certificate key (CA is self) certPem, keyPem, err := k8scert.GenerateSelfSignedCertKey(hostName, alternateIPs, alternateDNS) if err != nil { - return fail(errors.Wrap(err, "certificate key could not be created")) + return fail(fmt.Errorf("certificate key could not be created: %w", err)) } // Load the tls certificate tlsCert, err := tls.X509KeyPair(certPem, keyPem) if err != nil { - return fail(errors.Wrap(err, "certificate could not be loaded")) + return fail(fmt.Errorf("certificate could not be loaded: %w", err)) } return tlsCert, nil diff --git a/pkg/cri/server/update_runtime_config.go b/pkg/cri/server/update_runtime_config.go index ae4d1114e..3cf0b5529 100644 --- a/pkg/cri/server/update_runtime_config.go +++ b/pkg/cri/server/update_runtime_config.go @@ -17,6 +17,7 @@ package server import ( + "fmt" "net" "os" "path/filepath" @@ -24,7 +25,6 @@ import ( "text/template" "github.com/containerd/containerd/log" - "github.com/pkg/errors" "golang.org/x/net/context" runtime "k8s.io/cri-api/pkg/apis/runtime/v1" ) @@ -61,7 +61,7 @@ func (c *criService) UpdateRuntimeConfig(ctx context.Context, r *runtime.UpdateR } routes, err := getRoutes(cidrs) if err != nil { - return nil, errors.Wrap(err, "get routes") + return nil, fmt.Errorf("get routes: %w", err) } confTemplate := c.config.NetworkPluginConfTemplate @@ -85,15 +85,15 @@ func (c *criService) UpdateRuntimeConfig(ctx context.Context, r *runtime.UpdateR // generate cni config file from the template with updated pod cidr. t, err := template.ParseFiles(confTemplate) if err != nil { - return nil, errors.Wrapf(err, "failed to parse cni config template %q", confTemplate) + return nil, fmt.Errorf("failed to parse cni config template %q: %w", confTemplate, err) } if err := os.MkdirAll(c.config.NetworkPluginConfDir, 0755); err != nil { - return nil, errors.Wrapf(err, "failed to create cni config directory: %q", c.config.NetworkPluginConfDir) + return nil, fmt.Errorf("failed to create cni config directory: %q: %w", c.config.NetworkPluginConfDir, err) } confFile := filepath.Join(c.config.NetworkPluginConfDir, cniConfigFileName) f, err := os.OpenFile(confFile, os.O_WRONLY|os.O_CREATE, 0644) if err != nil { - return nil, errors.Wrapf(err, "failed to open cni config file %q", confFile) + return nil, fmt.Errorf("failed to open cni config file %q: %w", confFile, err) } defer f.Close() if err := t.Execute(f, cniConfigTemplate{ @@ -101,7 +101,7 @@ func (c *criService) UpdateRuntimeConfig(ctx context.Context, r *runtime.UpdateR PodCIDRRanges: cidrs, Routes: routes, }); err != nil { - return nil, errors.Wrapf(err, "failed to generate cni config file %q", confFile) + return nil, fmt.Errorf("failed to generate cni config file %q: %w", confFile, err) } return &runtime.UpdateRuntimeConfigResponse{}, nil } diff --git a/pkg/cri/server/update_runtime_config_test.go b/pkg/cri/server/update_runtime_config_test.go index 267946ba3..852926685 100644 --- a/pkg/cri/server/update_runtime_config_test.go +++ b/pkg/cri/server/update_runtime_config_test.go @@ -17,11 +17,11 @@ package server import ( + "errors" "os" "path/filepath" "testing" - "github.com/pkg/errors" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "golang.org/x/net/context" diff --git a/pkg/cri/store/container/metadata.go b/pkg/cri/store/container/metadata.go index 629f71623..f21914a20 100644 --- a/pkg/cri/store/container/metadata.go +++ b/pkg/cri/store/container/metadata.go @@ -18,8 +18,8 @@ package container import ( "encoding/json" + "fmt" - "github.com/pkg/errors" runtime "k8s.io/cri-api/pkg/apis/runtime/v1" ) @@ -85,5 +85,5 @@ func (c *Metadata) UnmarshalJSON(data []byte) error { *c = Metadata(versioned.Metadata) return nil } - return errors.Errorf("unsupported version: %q", versioned.Version) + return fmt.Errorf("unsupported version: %q", versioned.Version) } diff --git a/pkg/cri/store/container/status.go b/pkg/cri/store/container/status.go index ed9d574f4..d810963df 100644 --- a/pkg/cri/store/container/status.go +++ b/pkg/cri/store/container/status.go @@ -18,12 +18,13 @@ package container import ( "encoding/json" + "errors" + "fmt" "os" "path/filepath" "sync" "github.com/containerd/continuity" - "github.com/pkg/errors" runtime "k8s.io/cri-api/pkg/apis/runtime/v1" ) @@ -165,11 +166,11 @@ type StatusStorage interface { func StoreStatus(root, id string, status Status) (StatusStorage, error) { data, err := status.encode() if err != nil { - return nil, errors.Wrap(err, "failed to encode status") + return nil, fmt.Errorf("failed to encode status: %w", err) } path := filepath.Join(root, "status") if err := continuity.AtomicWriteFile(path, data, 0600); err != nil { - return nil, errors.Wrapf(err, "failed to checkpoint status to %q", path) + return nil, fmt.Errorf("failed to checkpoint status to %q: %w", path, err) } return &statusStorage{ path: path, @@ -183,11 +184,11 @@ func LoadStatus(root, id string) (Status, error) { path := filepath.Join(root, "status") data, err := os.ReadFile(path) if err != nil { - return Status{}, errors.Wrapf(err, "failed to read status from %q", path) + return Status{}, fmt.Errorf("failed to read status from %q: %w", path, err) } var status Status if err := status.decode(data); err != nil { - return Status{}, errors.Wrapf(err, "failed to decode status %q", data) + return Status{}, fmt.Errorf("failed to decode status %q: %w", data, err) } return status, nil } @@ -215,10 +216,10 @@ func (s *statusStorage) UpdateSync(u UpdateFunc) error { } data, err := newStatus.encode() if err != nil { - return errors.Wrap(err, "failed to encode status") + return fmt.Errorf("failed to encode status: %w", err) } if err := continuity.AtomicWriteFile(s.path, data, 0600); err != nil { - return errors.Wrapf(err, "failed to checkpoint status to %q", s.path) + return fmt.Errorf("failed to checkpoint status to %q: %w", s.path, err) } s.status = newStatus return nil diff --git a/pkg/cri/store/image/fake_image.go b/pkg/cri/store/image/fake_image.go index e1d6b7cd4..4b4636004 100644 --- a/pkg/cri/store/image/fake_image.go +++ b/pkg/cri/store/image/fake_image.go @@ -16,7 +16,7 @@ package image -import "github.com/pkg/errors" +import "fmt" // NewFakeStore returns an image store with predefined images. // Update is not allowed for this fake store. @@ -27,7 +27,7 @@ func NewFakeStore(images []Image) (*Store, error) { s.refCache[ref] = i.ID } if err := s.store.add(i); err != nil { - return nil, errors.Wrapf(err, "add image %+v", i) + return nil, fmt.Errorf("add image %+v: %w", i, err) } } return s, nil diff --git a/pkg/cri/store/image/image.go b/pkg/cri/store/image/image.go index 7dcd0706d..f9c057086 100644 --- a/pkg/cri/store/image/image.go +++ b/pkg/cri/store/image/image.go @@ -19,6 +19,7 @@ package image import ( "context" "encoding/json" + "fmt" "sync" "github.com/containerd/containerd" @@ -30,7 +31,6 @@ import ( "github.com/opencontainers/go-digest/digestset" imageidentity "github.com/opencontainers/image-spec/identity" imagespec "github.com/opencontainers/image-spec/specs-go/v1" - "github.com/pkg/errors" ) // Image contains all resources associated with the image. All fields @@ -77,13 +77,13 @@ func (s *Store) Update(ctx context.Context, ref string) error { defer s.lock.Unlock() i, err := s.client.GetImage(ctx, ref) if err != nil && !errdefs.IsNotFound(err) { - return errors.Wrap(err, "get image from containerd") + return fmt.Errorf("get image from containerd: %w", err) } var img *Image if err == nil { img, err = getImage(ctx, i) if err != nil { - return errors.Wrap(err, "get image info from containerd") + return fmt.Errorf("get image info from containerd: %w", err) } } return s.update(ref, img) @@ -119,28 +119,28 @@ func getImage(ctx context.Context, i containerd.Image) (*Image, error) { // Get image information. diffIDs, err := i.RootFS(ctx) if err != nil { - return nil, errors.Wrap(err, "get image diffIDs") + return nil, fmt.Errorf("get image diffIDs: %w", err) } chainID := imageidentity.ChainID(diffIDs) size, err := i.Size(ctx) if err != nil { - return nil, errors.Wrap(err, "get image compressed resource size") + return nil, fmt.Errorf("get image compressed resource size: %w", err) } desc, err := i.Config(ctx) if err != nil { - return nil, errors.Wrap(err, "get image config descriptor") + return nil, fmt.Errorf("get image config descriptor: %w", err) } id := desc.Digest.String() rb, err := content.ReadBlob(ctx, i.ContentStore(), desc) if err != nil { - return nil, errors.Wrap(err, "read image config from content store") + return nil, fmt.Errorf("read image config from content store: %w", err) } var ociimage imagespec.Image if err := json.Unmarshal(rb, &ociimage); err != nil { - return nil, errors.Wrapf(err, "unmarshal image config %s", rb) + return nil, fmt.Errorf("unmarshal image config %s: %w", rb, err) } return &Image{ diff --git a/pkg/cri/store/sandbox/metadata.go b/pkg/cri/store/sandbox/metadata.go index 1df4e3dee..80e39c68c 100644 --- a/pkg/cri/store/sandbox/metadata.go +++ b/pkg/cri/store/sandbox/metadata.go @@ -18,9 +18,9 @@ package sandbox import ( "encoding/json" + "fmt" cni "github.com/containerd/go-cni" - "github.com/pkg/errors" runtime "k8s.io/cri-api/pkg/apis/runtime/v1" ) @@ -85,5 +85,5 @@ func (c *Metadata) UnmarshalJSON(data []byte) error { *c = Metadata(versioned.Metadata) return nil } - return errors.Errorf("unsupported version: %q", versioned.Version) + return fmt.Errorf("unsupported version: %q", versioned.Version) } diff --git a/pkg/cri/util/deep_copy.go b/pkg/cri/util/deep_copy.go index d0e0bf37e..cf027eaf8 100644 --- a/pkg/cri/util/deep_copy.go +++ b/pkg/cri/util/deep_copy.go @@ -18,8 +18,8 @@ package util import ( "encoding/json" - - "github.com/pkg/errors" + "errors" + "fmt" ) // DeepCopy makes a deep copy from src into dst. @@ -32,11 +32,11 @@ func DeepCopy(dst interface{}, src interface{}) error { } bytes, err := json.Marshal(src) if err != nil { - return errors.Wrap(err, "unable to marshal src") + return fmt.Errorf("unable to marshal src: %w", err) } err = json.Unmarshal(bytes, dst) if err != nil { - return errors.Wrap(err, "unable to unmarshal into dst") + return fmt.Errorf("unable to unmarshal into dst: %w", err) } return nil } diff --git a/pkg/dialer/dialer.go b/pkg/dialer/dialer.go index aa604baab..74c303b94 100644 --- a/pkg/dialer/dialer.go +++ b/pkg/dialer/dialer.go @@ -18,10 +18,9 @@ package dialer import ( "context" + "fmt" "net" "time" - - "github.com/pkg/errors" ) type dialResult struct { @@ -74,6 +73,6 @@ func timeoutDialer(address string, timeout time.Duration) (net.Conn, error) { dr.c.Close() } }() - return nil, errors.Errorf("dial %s: timeout", address) + return nil, fmt.Errorf("dial %s: timeout", address) } } diff --git a/pkg/netns/netns_linux.go b/pkg/netns/netns_linux.go index d58f8ab92..71e9a3b63 100644 --- a/pkg/netns/netns_linux.go +++ b/pkg/netns/netns_linux.go @@ -42,7 +42,6 @@ import ( "github.com/containerd/containerd/mount" cnins "github.com/containernetworking/plugins/pkg/ns" "github.com/moby/sys/symlink" - "github.com/pkg/errors" "golang.org/x/sys/unix" ) @@ -54,7 +53,7 @@ import ( func newNS(baseDir string) (nsPath string, err error) { b := make([]byte, 16) if _, err := rand.Reader.Read(b); err != nil { - return "", errors.Wrap(err, "failed to generate random netns name") + return "", fmt.Errorf("failed to generate random netns name: %w", err) } // Create the directory for mounting network namespaces @@ -113,13 +112,13 @@ func newNS(baseDir string) (nsPath string, err error) { // are no threads in the ns. err = unix.Mount(getCurrentThreadNetNSPath(), nsPath, "none", unix.MS_BIND, "") if err != nil { - err = errors.Wrapf(err, "failed to bind mount ns at %s", nsPath) + err = fmt.Errorf("failed to bind mount ns at %s: %w", nsPath, err) } })() wg.Wait() if err != nil { - return "", errors.Wrap(err, "failed to create namespace") + return "", fmt.Errorf("failed to create namespace: %w", err) } return nsPath, nil @@ -131,17 +130,17 @@ func unmountNS(path string) error { if os.IsNotExist(err) { return nil } - return errors.Wrap(err, "failed to stat netns") + return fmt.Errorf("failed to stat netns: %w", err) } path, err := symlink.FollowSymlinkInScope(path, "/") if err != nil { - return errors.Wrap(err, "failed to follow symlink") + return fmt.Errorf("failed to follow symlink: %w", err) } if err := mount.Unmount(path, unix.MNT_DETACH); err != nil && !os.IsNotExist(err) { - return errors.Wrap(err, "failed to umount netns") + return fmt.Errorf("failed to umount netns: %w", err) } if err := os.RemoveAll(path); err != nil { - return errors.Wrap(err, "failed to remove netns") + return fmt.Errorf("failed to remove netns: %w", err) } return nil } @@ -163,7 +162,7 @@ type NetNS struct { func NewNetNS(baseDir string) (*NetNS, error) { path, err := newNS(baseDir) if err != nil { - return nil, errors.Wrap(err, "failed to setup netns") + return nil, fmt.Errorf("failed to setup netns: %w", err) } return &NetNS{path: path}, nil } @@ -190,14 +189,14 @@ func (n *NetNS) Closed() (bool, error) { if _, ok := err.(cnins.NSPathNotNSErr); ok { // The network namespace is not mounted, remove it. if err := os.RemoveAll(n.path); err != nil { - return false, errors.Wrap(err, "remove netns") + return false, fmt.Errorf("remove netns: %w", err) } return true, nil } - return false, errors.Wrap(err, "get netns fd") + return false, fmt.Errorf("get netns fd: %w", err) } if err := ns.Close(); err != nil { - return false, errors.Wrap(err, "close netns fd") + return false, fmt.Errorf("close netns fd: %w", err) } return false, nil } @@ -211,7 +210,7 @@ func (n *NetNS) GetPath() string { func (n *NetNS) Do(f func(cnins.NetNS) error) error { ns, err := cnins.GetNS(n.path) if err != nil { - return errors.Wrap(err, "get netns fd") + return fmt.Errorf("get netns fd: %w", err) } defer ns.Close() // nolint: errcheck return ns.Do(f) diff --git a/pkg/netns/netns_other.go b/pkg/netns/netns_other.go index 01bad803c..ec8124ceb 100644 --- a/pkg/netns/netns_other.go +++ b/pkg/netns/netns_other.go @@ -20,7 +20,7 @@ package netns import ( - "github.com/pkg/errors" + "errors" ) var errNotImplementedOnUnix = errors.New("not implemented on unix") diff --git a/pkg/oom/v1/v1.go b/pkg/oom/v1/v1.go index f133efb87..1e8e670e1 100644 --- a/pkg/oom/v1/v1.go +++ b/pkg/oom/v1/v1.go @@ -21,6 +21,7 @@ package v1 import ( "context" + "fmt" "sync" "github.com/containerd/cgroups" @@ -28,7 +29,6 @@ import ( "github.com/containerd/containerd/pkg/oom" "github.com/containerd/containerd/runtime" "github.com/containerd/containerd/runtime/v2/shim" - "github.com/pkg/errors" "github.com/sirupsen/logrus" "golang.org/x/sys/unix" ) @@ -93,7 +93,7 @@ func (e *epoller) Run(ctx context.Context) { func (e *epoller) Add(id string, cgx interface{}) error { cg, ok := cgx.(cgroups.Cgroup) if !ok { - return errors.Errorf("expected cgroups.Cgroup, got: %T", cgx) + return fmt.Errorf("expected cgroups.Cgroup, got: %T", cgx) } e.mu.Lock() defer e.mu.Unlock() diff --git a/pkg/oom/v2/v2.go b/pkg/oom/v2/v2.go index 479300f21..198dc3b1f 100644 --- a/pkg/oom/v2/v2.go +++ b/pkg/oom/v2/v2.go @@ -21,13 +21,13 @@ package v2 import ( "context" + "fmt" cgroupsv2 "github.com/containerd/cgroups/v2" eventstypes "github.com/containerd/containerd/api/events" "github.com/containerd/containerd/pkg/oom" "github.com/containerd/containerd/runtime" "github.com/containerd/containerd/runtime/v2/shim" - "github.com/pkg/errors" "github.com/sirupsen/logrus" ) @@ -89,7 +89,7 @@ func (w *watcher) Run(ctx context.Context) { func (w *watcher) Add(id string, cgx interface{}) error { cg, ok := cgx.(*cgroupsv2.Manager) if !ok { - return errors.Errorf("expected *cgroupsv2.Manager, got: %T", cgx) + return fmt.Errorf("expected *cgroupsv2.Manager, got: %T", cgx) } // FIXME: cgroupsv2.Manager does not support closing eventCh routine currently. // The routine shuts down when an error happens, mostly when the cgroup is deleted. diff --git a/pkg/process/deleted_state.go b/pkg/process/deleted_state.go index 320b46026..4e62b300d 100644 --- a/pkg/process/deleted_state.go +++ b/pkg/process/deleted_state.go @@ -21,11 +21,12 @@ package process import ( "context" + "errors" + "fmt" "github.com/containerd/console" "github.com/containerd/containerd/errdefs" google_protobuf "github.com/gogo/protobuf/types" - "github.com/pkg/errors" ) type deletedState struct { @@ -56,11 +57,11 @@ func (s *deletedState) Start(ctx context.Context) error { } func (s *deletedState) Delete(ctx context.Context) error { - return errors.Wrap(errdefs.ErrNotFound, "cannot delete a deleted process") + return fmt.Errorf("cannot delete a deleted process: %w", errdefs.ErrNotFound) } func (s *deletedState) Kill(ctx context.Context, sig uint32, all bool) error { - return errors.Wrap(errdefs.ErrNotFound, "cannot kill a deleted process") + return fmt.Errorf("cannot kill a deleted process: %w", errdefs.ErrNotFound) } func (s *deletedState) SetExited(status int) { diff --git a/pkg/process/exec.go b/pkg/process/exec.go index db0b3f8c8..dcd7592e8 100644 --- a/pkg/process/exec.go +++ b/pkg/process/exec.go @@ -37,7 +37,6 @@ import ( "github.com/containerd/fifo" runc "github.com/containerd/go-runc" specs "github.com/opencontainers/runtime-spec/specs-go" - "github.com/pkg/errors" ) type execProcess struct { @@ -146,12 +145,12 @@ func (e *execProcess) kill(ctx context.Context, sig uint32, _ bool) error { pid := e.pid.get() switch { case pid == 0: - return errors.Wrap(errdefs.ErrFailedPrecondition, "process not created") + return fmt.Errorf("process not created: %w", errdefs.ErrFailedPrecondition) case !e.exited.IsZero(): - return errors.Wrapf(errdefs.ErrNotFound, "process already finished") + return fmt.Errorf("process already finished: %w", errdefs.ErrNotFound) default: if err := unix.Kill(pid, syscall.Signal(sig)); err != nil { - return errors.Wrapf(checkKillError(err), "exec kill error") + return fmt.Errorf("exec kill error: %w", checkKillError(err)) } } return nil @@ -187,12 +186,12 @@ func (e *execProcess) start(ctx context.Context) (err error) { ) if e.stdio.Terminal { if socket, err = runc.NewTempConsoleSocket(); err != nil { - return errors.Wrap(err, "failed to create runc console socket") + return fmt.Errorf("failed to create runc console socket: %w", err) } defer socket.Close() } else { if pio, err = createIO(ctx, e.id, e.parent.IoUID, e.parent.IoGID, e.stdio); err != nil { - return errors.Wrap(err, "failed to create init process I/O") + return fmt.Errorf("failed to create init process I/O: %w", err) } e.io = pio } @@ -220,19 +219,19 @@ func (e *execProcess) start(ctx context.Context) (err error) { if socket != nil { console, err := socket.ReceiveMaster() if err != nil { - return errors.Wrap(err, "failed to retrieve console master") + return fmt.Errorf("failed to retrieve console master: %w", err) } if e.console, err = e.parent.Platform.CopyConsole(ctx, console, e.id, e.stdio.Stdin, e.stdio.Stdout, e.stdio.Stderr, &e.wg); err != nil { - return errors.Wrap(err, "failed to start console copy") + return fmt.Errorf("failed to start console copy: %w", err) } } else { if err := pio.Copy(ctx, &e.wg); err != nil { - return errors.Wrap(err, "failed to start io pipe copy") + return fmt.Errorf("failed to start io pipe copy: %w", err) } } pid, err := pidFile.Read() if err != nil { - return errors.Wrap(err, "failed to retrieve OCI runtime exec pid") + return fmt.Errorf("failed to retrieve OCI runtime exec pi: %wd", err) } e.pid.pid = pid return nil @@ -241,7 +240,7 @@ func (e *execProcess) start(ctx context.Context) (err error) { func (e *execProcess) openStdin(path string) error { sc, err := fifo.OpenFifo(context.Background(), path, syscall.O_WRONLY|syscall.O_NONBLOCK, 0) if err != nil { - return errors.Wrapf(err, "failed to open stdin fifo %s", path) + return fmt.Errorf("failed to open stdin fifo %s: %w", path, err) } e.stdin = sc e.closers = append(e.closers, sc) diff --git a/pkg/process/exec_state.go b/pkg/process/exec_state.go index 6d1e7535a..4c3dd8fba 100644 --- a/pkg/process/exec_state.go +++ b/pkg/process/exec_state.go @@ -21,9 +21,10 @@ package process import ( "context" + "errors" + "fmt" "github.com/containerd/console" - "github.com/pkg/errors" ) type execState interface { @@ -48,7 +49,7 @@ func (s *execCreatedState) transition(name string) error { case "deleted": s.p.execState = &deletedState{} default: - return errors.Errorf("invalid state transition %q to %q", stateName(s), name) + return fmt.Errorf("invalid state transition %q to %q", stateName(s), name) } return nil } @@ -97,7 +98,7 @@ func (s *execRunningState) transition(name string) error { case "stopped": s.p.execState = &execStoppedState{p: s.p} default: - return errors.Errorf("invalid state transition %q to %q", stateName(s), name) + return fmt.Errorf("invalid state transition %q to %q", stateName(s), name) } return nil } @@ -139,7 +140,7 @@ func (s *execStoppedState) transition(name string) error { case "deleted": s.p.execState = &deletedState{} default: - return errors.Errorf("invalid state transition %q to %q", stateName(s), name) + return fmt.Errorf("invalid state transition %q to %q", stateName(s), name) } return nil } diff --git a/pkg/process/init.go b/pkg/process/init.go index bb6edde39..26aebdcb5 100644 --- a/pkg/process/init.go +++ b/pkg/process/init.go @@ -38,7 +38,6 @@ import ( runc "github.com/containerd/go-runc" google_protobuf "github.com/gogo/protobuf/types" specs "github.com/opencontainers/runtime-spec/specs-go" - "github.com/pkg/errors" "golang.org/x/sys/unix" ) @@ -120,12 +119,12 @@ func (p *Init) Create(ctx context.Context, r *CreateConfig) error { if r.Terminal { if socket, err = runc.NewTempConsoleSocket(); err != nil { - return errors.Wrap(err, "failed to create OCI runtime console socket") + return fmt.Errorf("failed to create OCI runtime console socket: %w", err) } defer socket.Close() } else { if pio, err = createIO(ctx, p.id, p.IoUID, p.IoGID, p.stdio); err != nil { - return errors.Wrap(err, "failed to create init process I/O") + return fmt.Errorf("failed to create init process I/O: %w", err) } p.io = pio } @@ -156,21 +155,21 @@ func (p *Init) Create(ctx context.Context, r *CreateConfig) error { if socket != nil { console, err := socket.ReceiveMaster() if err != nil { - return errors.Wrap(err, "failed to retrieve console master") + return fmt.Errorf("failed to retrieve console master: %w", err) } console, err = p.Platform.CopyConsole(ctx, console, p.id, r.Stdin, r.Stdout, r.Stderr, &p.wg) if err != nil { - return errors.Wrap(err, "failed to start console copy") + return fmt.Errorf("failed to start console copy: %w", err) } p.console = console } else { if err := pio.Copy(ctx, &p.wg); err != nil { - return errors.Wrap(err, "failed to start io pipe copy") + return fmt.Errorf("failed to start io pipe copy: %w", err) } } pid, err := pidFile.Read() if err != nil { - return errors.Wrap(err, "failed to retrieve OCI runtime container pid") + return fmt.Errorf("failed to retrieve OCI runtime container pid: %w", err) } p.pid = pid return nil @@ -179,7 +178,7 @@ func (p *Init) Create(ctx context.Context, r *CreateConfig) error { func (p *Init) openStdin(path string) error { sc, err := fifo.OpenFifo(context.Background(), path, unix.O_WRONLY|unix.O_NONBLOCK, 0) if err != nil { - return errors.Wrapf(err, "failed to open stdin fifo %s", path) + return fmt.Errorf("failed to open stdin fifo %s: %w", path, err) } p.stdin = sc p.closers = append(p.closers, sc) @@ -313,7 +312,7 @@ func (p *Init) delete(ctx context.Context) error { if err2 := mount.UnmountAll(p.Rootfs, 0); err2 != nil { log.G(ctx).WithError(err2).Warn("failed to cleanup rootfs mount") if err == nil { - err = errors.Wrap(err2, "failed rootfs umount") + err = fmt.Errorf("failed rootfs umount: %w", err2) } } return err @@ -482,11 +481,11 @@ func (p *Init) runtimeError(rErr error, msg string) error { rMsg, err := getLastRuntimeError(p.runtime) switch { case err != nil: - return errors.Wrapf(rErr, "%s: %s (%s)", msg, "unable to retrieve OCI runtime error", err.Error()) + return fmt.Errorf("%s: %s (%s): %w", msg, "unable to retrieve OCI runtime error", err.Error(), rErr) case rMsg == "": - return errors.Wrap(rErr, msg) + return fmt.Errorf("%s: %w", msg, rErr) default: - return errors.Errorf("%s: %s", msg, rMsg) + return fmt.Errorf("%s: %s", msg, rMsg) } } diff --git a/pkg/process/init_state.go b/pkg/process/init_state.go index 8ea95bc61..76c91492e 100644 --- a/pkg/process/init_state.go +++ b/pkg/process/init_state.go @@ -21,10 +21,11 @@ package process import ( "context" + "errors" + "fmt" runc "github.com/containerd/go-runc" google_protobuf "github.com/gogo/protobuf/types" - "github.com/pkg/errors" "github.com/sirupsen/logrus" ) @@ -54,7 +55,7 @@ func (s *createdState) transition(name string) error { case "deleted": s.p.initState = &deletedState{} default: - return errors.Errorf("invalid state transition %q to %q", stateName(s), name) + return fmt.Errorf("invalid state transition %q to %q", stateName(s), name) } return nil } @@ -123,7 +124,7 @@ func (s *createdCheckpointState) transition(name string) error { case "deleted": s.p.initState = &deletedState{} default: - return errors.Errorf("invalid state transition %q to %q", stateName(s), name) + return fmt.Errorf("invalid state transition %q to %q", stateName(s), name) } return nil } @@ -154,7 +155,7 @@ func (s *createdCheckpointState) Start(ctx context.Context) error { ) if sio.Terminal { if socket, err = runc.NewTempConsoleSocket(); err != nil { - return errors.Wrap(err, "failed to create OCI runtime console socket") + return fmt.Errorf("failed to create OCI runtime console socket: %w", err) } defer socket.Close() s.opts.ConsoleSocket = socket @@ -165,27 +166,27 @@ func (s *createdCheckpointState) Start(ctx context.Context) error { } if sio.Stdin != "" { if err := p.openStdin(sio.Stdin); err != nil { - return errors.Wrapf(err, "failed to open stdin fifo %s", sio.Stdin) + return fmt.Errorf("failed to open stdin fifo %s: %w", sio.Stdin, err) } } if socket != nil { console, err := socket.ReceiveMaster() if err != nil { - return errors.Wrap(err, "failed to retrieve console master") + return fmt.Errorf("failed to retrieve console master: %w", err) } console, err = p.Platform.CopyConsole(ctx, console, p.id, sio.Stdin, sio.Stdout, sio.Stderr, &p.wg) if err != nil { - return errors.Wrap(err, "failed to start console copy") + return fmt.Errorf("failed to start console copy: %w", err) } p.console = console } else { if err := p.io.Copy(ctx, &p.wg); err != nil { - return errors.Wrap(err, "failed to start io pipe copy") + return fmt.Errorf("failed to start io pipe copy: %w", err) } } pid, err := runc.ReadPidFile(s.opts.PidFile) if err != nil { - return errors.Wrap(err, "failed to retrieve OCI runtime container pid") + return fmt.Errorf("failed to retrieve OCI runtime container pid: %w", err) } p.pid = pid return s.transition("running") @@ -229,7 +230,7 @@ func (s *runningState) transition(name string) error { case "paused": s.p.initState = &pausedState{p: s.p} default: - return errors.Errorf("invalid state transition %q to %q", stateName(s), name) + return fmt.Errorf("invalid state transition %q to %q", stateName(s), name) } return nil } @@ -300,7 +301,7 @@ func (s *pausedState) transition(name string) error { case "stopped": s.p.initState = &stoppedState{p: s.p} default: - return errors.Errorf("invalid state transition %q to %q", stateName(s), name) + return fmt.Errorf("invalid state transition %q to %q", stateName(s), name) } return nil } @@ -366,7 +367,7 @@ func (s *stoppedState) transition(name string) error { case "deleted": s.p.initState = &deletedState{} default: - return errors.Errorf("invalid state transition %q to %q", stateName(s), name) + return fmt.Errorf("invalid state transition %q to %q", stateName(s), name) } return nil } diff --git a/pkg/process/io.go b/pkg/process/io.go index 59c82d3d9..ed9b1da18 100644 --- a/pkg/process/io.go +++ b/pkg/process/io.go @@ -37,7 +37,6 @@ import ( "github.com/containerd/fifo" runc "github.com/containerd/go-runc" "github.com/hashicorp/go-multierror" - "github.com/pkg/errors" exec "golang.org/x/sys/execabs" ) @@ -77,7 +76,7 @@ func (p *processIO) Copy(ctx context.Context, wg *sync.WaitGroup) error { } var cwg sync.WaitGroup if err := copyPipes(ctx, p.IO(), p.stdio.Stdin, p.stdio.Stdout, p.stdio.Stderr, wg, &cwg); err != nil { - return errors.Wrap(err, "unable to copy pipes") + return fmt.Errorf("unable to copy pipes: %w", err) } cwg.Wait() return nil @@ -97,7 +96,7 @@ func createIO(ctx context.Context, id string, ioUID, ioGID int, stdio stdio.Stdi } u, err := url.Parse(stdio.Stdout) if err != nil { - return nil, errors.Wrap(err, "unable to parse stdout uri") + return nil, fmt.Errorf("unable to parse stdout uri: %w", err) } if u.Scheme == "" { u.Scheme = "fifo" @@ -125,7 +124,7 @@ func createIO(ctx context.Context, id string, ioUID, ioGID int, stdio stdio.Stdi pio.copy = true pio.io, err = runc.NewPipeIO(ioUID, ioGID, withConditionalIO(stdio)) default: - return nil, errors.Errorf("unknown STDIO scheme %s", u.Scheme) + return nil, fmt.Errorf("unknown STDIO scheme %s", u.Scheme) } if err != nil { return nil, err @@ -189,10 +188,10 @@ func copyPipes(ctx context.Context, rio runc.IO, stdin, stdout, stderr string, w ) if ok { if fw, err = fifo.OpenFifo(ctx, i.name, syscall.O_WRONLY, 0); err != nil { - return errors.Wrapf(err, "containerd-shim: opening w/o fifo %q failed", i.name) + return fmt.Errorf("containerd-shim: opening w/o fifo %q failed: %w", i.name, err) } if fr, err = fifo.OpenFifo(ctx, i.name, syscall.O_RDONLY, 0); err != nil { - return errors.Wrapf(err, "containerd-shim: opening r/o fifo %q failed", i.name) + return fmt.Errorf("containerd-shim: opening r/o fifo %q failed: %w", i.name, err) } } else { if sameFile != nil { @@ -201,7 +200,7 @@ func copyPipes(ctx context.Context, rio runc.IO, stdin, stdout, stderr string, w continue } if fw, err = os.OpenFile(i.name, syscall.O_WRONLY|syscall.O_APPEND, 0); err != nil { - return errors.Wrapf(err, "containerd-shim: opening file %q failed", i.name) + return fmt.Errorf("containerd-shim: opening file %q failed: %w", i.name, err) } if stdout == stderr { sameFile = &countingWriteCloser{ @@ -266,13 +265,13 @@ func NewBinaryIO(ctx context.Context, id string, uri *url.URL) (_ runc.IO, err e out, err := newPipe() if err != nil { - return nil, errors.Wrap(err, "failed to create stdout pipes") + return nil, fmt.Errorf("failed to create stdout pipes: %w", err) } closers = append(closers, out.Close) serr, err := newPipe() if err != nil { - return nil, errors.Wrap(err, "failed to create stderr pipes") + return nil, fmt.Errorf("failed to create stderr pipes: %w", err) } closers = append(closers, serr.Close) @@ -287,19 +286,19 @@ func NewBinaryIO(ctx context.Context, id string, uri *url.URL) (_ runc.IO, err e // don't need to register this with the reaper or wait when // running inside a shim if err := cmd.Start(); err != nil { - return nil, errors.Wrap(err, "failed to start binary process") + return nil, fmt.Errorf("failed to start binary process: %w", err) } closers = append(closers, func() error { return cmd.Process.Kill() }) // close our side of the pipe after start if err := w.Close(); err != nil { - return nil, errors.Wrap(err, "failed to close write pipe after start") + return nil, fmt.Errorf("failed to close write pipe after start: %w", err) } // wait for the logging binary to be ready b := make([]byte, 1) if _, err := r.Read(b); err != nil && err != io.EOF { - return nil, errors.Wrap(err, "failed to read from logging binary") + return nil, fmt.Errorf("failed to read from logging binary: %w", err) } return &binaryIO{ @@ -357,12 +356,12 @@ func (b *binaryIO) cancel() error { // Send SIGTERM first, so logger process has a chance to flush and exit properly if err := b.cmd.Process.Signal(syscall.SIGTERM); err != nil { - result := multierror.Append(errors.Wrap(err, "failed to send SIGTERM")) + result := multierror.Append(fmt.Errorf("failed to send SIGTERM: %w", err)) log.L.WithError(err).Warn("failed to send SIGTERM signal, killing logging shim") if err := b.cmd.Process.Kill(); err != nil { - result = multierror.Append(result, errors.Wrap(err, "failed to kill process after faulty SIGTERM")) + result = multierror.Append(result, fmt.Errorf("failed to kill process after faulty SIGTERM: %w", err)) } return result.ErrorOrNil() @@ -381,7 +380,7 @@ func (b *binaryIO) cancel() error { err := b.cmd.Process.Kill() if err != nil { - return errors.Wrap(err, "failed to kill shim logger process") + return fmt.Errorf("failed to kill shim logger process: %w", err) } return nil @@ -429,11 +428,11 @@ func (p *pipe) Close() error { var result *multierror.Error if err := p.w.Close(); err != nil { - result = multierror.Append(result, errors.Wrap(err, "failed to close write pipe")) + result = multierror.Append(result, fmt.Errorf("failed to close write pipe: %w", err)) } if err := p.r.Close(); err != nil { - result = multierror.Append(result, errors.Wrap(err, "failed to close read pipe")) + result = multierror.Append(result, fmt.Errorf("failed to close read pipe: %w", err)) } return multierror.Prefix(result.ErrorOrNil(), "pipe:") diff --git a/pkg/process/utils.go b/pkg/process/utils.go index b99bf547b..afada02b7 100644 --- a/pkg/process/utils.go +++ b/pkg/process/utils.go @@ -33,7 +33,6 @@ import ( "github.com/containerd/containerd/errdefs" runc "github.com/containerd/go-runc" - "github.com/pkg/errors" "golang.org/x/sys/unix" ) @@ -137,11 +136,11 @@ func checkKillError(err error) error { strings.Contains(err.Error(), "container not running") || strings.Contains(strings.ToLower(err.Error()), "no such process") || err == unix.ESRCH { - return errors.Wrapf(errdefs.ErrNotFound, "process already finished") + return fmt.Errorf("process already finished: %w", errdefs.ErrNotFound) } else if strings.Contains(err.Error(), "does not exist") { - return errors.Wrapf(errdefs.ErrNotFound, "no such container") + return fmt.Errorf("no such container: %w", errdefs.ErrNotFound) } - return errors.Wrapf(err, "unknown error after kill") + return fmt.Errorf("unknown error after kill: %w", err) } func newPidFile(bundle string) *pidFile { @@ -199,5 +198,5 @@ func stateName(v interface{}) string { case *stoppedState: return "stopped" } - panic(errors.Errorf("invalid state %v", v)) + panic(fmt.Errorf("invalid state %v", v)) } diff --git a/pkg/registrar/registrar.go b/pkg/registrar/registrar.go index b83e7ce85..d365a5730 100644 --- a/pkg/registrar/registrar.go +++ b/pkg/registrar/registrar.go @@ -17,9 +17,8 @@ package registrar import ( + "fmt" "sync" - - "github.com/pkg/errors" ) // Registrar stores one-to-one name<->key mappings. @@ -50,19 +49,19 @@ func (r *Registrar) Reserve(name, key string) error { defer r.lock.Unlock() if name == "" || key == "" { - return errors.Errorf("invalid name %q or key %q", name, key) + return fmt.Errorf("invalid name %q or key %q", name, key) } if k, exists := r.nameToKey[name]; exists { if k != key { - return errors.Errorf("name %q is reserved for %q", name, k) + return fmt.Errorf("name %q is reserved for %q", name, k) } return nil } if n, exists := r.keyToName[key]; exists { if n != name { - return errors.Errorf("key %q is reserved for %q", key, n) + return fmt.Errorf("key %q is reserved for %q", key, n) } return nil } diff --git a/pkg/ttrpcutil/client.go b/pkg/ttrpcutil/client.go index 8b4d925d2..f05ab7aa9 100644 --- a/pkg/ttrpcutil/client.go +++ b/pkg/ttrpcutil/client.go @@ -17,13 +17,14 @@ package ttrpcutil import ( + "errors" + "fmt" "sync" "time" v1 "github.com/containerd/containerd/api/services/ttrpc/events/v1" "github.com/containerd/containerd/pkg/dialer" "github.com/containerd/ttrpc" - "github.com/pkg/errors" ) const ttrpcDialTimeout = 5 * time.Second @@ -43,7 +44,7 @@ func NewClient(address string, opts ...ttrpc.ClientOpts) (*Client, error) { connector := func() (*ttrpc.Client, error) { conn, err := dialer.Dialer(address, ttrpcDialTimeout) if err != nil { - return nil, errors.Wrap(err, "failed to connect") + return nil, fmt.Errorf("failed to connect: %w", err) } client := ttrpc.NewClient(conn, opts...) diff --git a/platforms/cpuinfo.go b/platforms/cpuinfo.go index 4a7177e31..046e0356d 100644 --- a/platforms/cpuinfo.go +++ b/platforms/cpuinfo.go @@ -18,6 +18,7 @@ package platforms import ( "bufio" + "fmt" "os" "runtime" "strings" @@ -25,7 +26,6 @@ import ( "github.com/containerd/containerd/errdefs" "github.com/containerd/containerd/log" - "github.com/pkg/errors" ) // Present the ARM instruction set architecture, eg: v7, v8 @@ -48,7 +48,7 @@ func cpuVariant() string { // by ourselves. We can just parse these information from /proc/cpuinfo func getCPUInfo(pattern string) (info string, err error) { if !isLinuxOS(runtime.GOOS) { - return "", errors.Wrapf(errdefs.ErrNotImplemented, "getCPUInfo for OS %s", runtime.GOOS) + return "", fmt.Errorf("getCPUInfo for OS %s: %w", runtime.GOOS, errdefs.ErrNotImplemented) } cpuinfo, err := os.Open("/proc/cpuinfo") @@ -75,7 +75,7 @@ func getCPUInfo(pattern string) (info string, err error) { return "", err } - return "", errors.Wrapf(errdefs.ErrNotFound, "getCPUInfo for pattern: %s", pattern) + return "", fmt.Errorf("getCPUInfo for pattern: %s: %w", pattern, errdefs.ErrNotFound) } func getCPUVariant() string { diff --git a/platforms/platforms.go b/platforms/platforms.go index 2c1b58ec5..18216522d 100644 --- a/platforms/platforms.go +++ b/platforms/platforms.go @@ -107,6 +107,7 @@ package platforms import ( + "fmt" "path" "regexp" "runtime" @@ -115,7 +116,6 @@ import ( "github.com/containerd/containerd/errdefs" specs "github.com/opencontainers/image-spec/specs-go/v1" - "github.com/pkg/errors" ) var ( @@ -167,14 +167,14 @@ func (m *matcher) String() string { func Parse(specifier string) (specs.Platform, error) { if strings.Contains(specifier, "*") { // TODO(stevvooe): need to work out exact wildcard handling - return specs.Platform{}, errors.Wrapf(errdefs.ErrInvalidArgument, "%q: wildcards not yet supported", specifier) + return specs.Platform{}, fmt.Errorf("%q: wildcards not yet supported: %w", specifier, errdefs.ErrInvalidArgument) } parts := strings.Split(specifier, "/") for _, part := range parts { if !specifierRe.MatchString(part) { - return specs.Platform{}, errors.Wrapf(errdefs.ErrInvalidArgument, "%q is an invalid component of %q: platform specifier component must match %q", part, specifier, specifierRe.String()) + return specs.Platform{}, fmt.Errorf("%q is an invalid component of %q: platform specifier component must match %q: %w", part, specifier, specifierRe.String(), errdefs.ErrInvalidArgument) } } @@ -206,7 +206,7 @@ func Parse(specifier string) (specs.Platform, error) { return p, nil } - return specs.Platform{}, errors.Wrapf(errdefs.ErrInvalidArgument, "%q: unknown operating system or architecture", specifier) + return specs.Platform{}, fmt.Errorf("%q: unknown operating system or architecture: %w", specifier, errdefs.ErrInvalidArgument) case 2: // In this case, we treat as a regular os/arch pair. We don't care // about whether or not we know of the platform. @@ -228,7 +228,7 @@ func Parse(specifier string) (specs.Platform, error) { return p, nil } - return specs.Platform{}, errors.Wrapf(errdefs.ErrInvalidArgument, "%q: cannot parse platform specifier", specifier) + return specs.Platform{}, fmt.Errorf("%q: cannot parse platform specifier: %w", specifier, errdefs.ErrInvalidArgument) } // MustParse is like Parses but panics if the specifier cannot be parsed. diff --git a/plugin/context.go b/plugin/context.go index 3ee43c3dd..263fa9b8f 100644 --- a/plugin/context.go +++ b/plugin/context.go @@ -18,12 +18,12 @@ package plugin import ( "context" + "fmt" "path/filepath" "github.com/containerd/containerd/errdefs" "github.com/containerd/containerd/events/exchange" ocispec "github.com/opencontainers/image-spec/specs-go/v1" - "github.com/pkg/errors" ) // InitContext is used for plugin initialization @@ -117,7 +117,7 @@ func (ps *Set) Add(p *Plugin) error { } else if _, idok := byID[p.Registration.ID]; !idok { byID[p.Registration.ID] = p } else { - return errors.Wrapf(errdefs.ErrAlreadyExists, "plugin %v already initialized", p.Registration.URI()) + return fmt.Errorf("plugin %v already initialized: %w", p.Registration.URI(), errdefs.ErrAlreadyExists) } ps.ordered = append(ps.ordered, p) @@ -129,7 +129,7 @@ func (ps *Set) Get(t Type) (interface{}, error) { for _, v := range ps.byTypeAndID[t] { return v.Instance() } - return nil, errors.Wrapf(errdefs.ErrNotFound, "no plugins registered for %s", t) + return nil, fmt.Errorf("no plugins registered for %s: %w", t, errdefs.ErrNotFound) } // GetAll plugins in the set @@ -145,7 +145,7 @@ func (i *InitContext) GetByID(t Type, id string) (interface{}, error) { } p, ok := ps[id] if !ok { - return nil, errors.Wrapf(errdefs.ErrNotFound, "no %s plugins with id %s", t, id) + return nil, fmt.Errorf("no %s plugins with id %s: %w", t, id, errdefs.ErrNotFound) } return p.Instance() } @@ -154,7 +154,7 @@ func (i *InitContext) GetByID(t Type, id string) (interface{}, error) { func (i *InitContext) GetByType(t Type) (map[string]*Plugin, error) { p, ok := i.plugins.byTypeAndID[t] if !ok { - return nil, errors.Wrapf(errdefs.ErrNotFound, "no plugins registered for %s", t) + return nil, fmt.Errorf("no plugins registered for %s: %w", t, errdefs.ErrNotFound) } return p, nil diff --git a/plugin/plugin.go b/plugin/plugin.go index f24a3c77b..eb38c1271 100644 --- a/plugin/plugin.go +++ b/plugin/plugin.go @@ -17,10 +17,9 @@ package plugin import ( + "errors" "fmt" "sync" - - "github.com/pkg/errors" ) var ( @@ -172,7 +171,7 @@ func Register(r *Registration) { func checkUnique(r *Registration) error { for _, registered := range register.r { if r.URI() == registered.URI() { - return errors.Wrap(ErrIDRegistered, r.URI()) + return fmt.Errorf("%s: %w", r.URI(), ErrIDRegistered) } } return nil diff --git a/process.go b/process.go index fb17a48c0..42d0da60e 100644 --- a/process.go +++ b/process.go @@ -18,6 +18,7 @@ package containerd import ( "context" + "fmt" "strings" "syscall" "time" @@ -25,7 +26,6 @@ import ( "github.com/containerd/containerd/api/services/tasks/v1" "github.com/containerd/containerd/cio" "github.com/containerd/containerd/errdefs" - "github.com/pkg/errors" ) // Process represents a system process @@ -210,7 +210,7 @@ func (p *process) Delete(ctx context.Context, opts ...ProcessDeleteOpts) (*ExitS } switch status.Status { case Running, Paused, Pausing: - return nil, errors.Wrapf(errdefs.ErrFailedPrecondition, "current process state: %s, process must be stopped before deletion", status.Status) + return nil, fmt.Errorf("current process state: %s, process must be stopped before deletion: %w", status.Status, errdefs.ErrFailedPrecondition) } r, err := p.task.client.TaskService().DeleteProcess(ctx, &tasks.DeleteProcessRequest{ ContainerID: p.task.id, diff --git a/pull.go b/pull.go index 36365513f..92f7719b1 100644 --- a/pull.go +++ b/pull.go @@ -18,6 +18,8 @@ package containerd import ( "context" + "errors" + "fmt" "github.com/containerd/containerd/errdefs" "github.com/containerd/containerd/images" @@ -26,7 +28,6 @@ import ( "github.com/containerd/containerd/remotes/docker" "github.com/containerd/containerd/remotes/docker/schema1" ocispec "github.com/opencontainers/image-spec/specs-go/v1" - "github.com/pkg/errors" "golang.org/x/sync/errgroup" "golang.org/x/sync/semaphore" ) @@ -49,7 +50,7 @@ func (c *Client) Pull(ctx context.Context, ref string, opts ...RemoteOpt) (_ Ima } else { p, err := platforms.Parse(pullCtx.Platforms[0]) if err != nil { - return nil, errors.Wrapf(err, "invalid platform %s", pullCtx.Platforms[0]) + return nil, fmt.Errorf("invalid platform %s: %w", pullCtx.Platforms[0], err) } pullCtx.PlatformMatcher = platforms.Only(p) @@ -70,13 +71,13 @@ func (c *Client) Pull(ctx context.Context, ref string, opts ...RemoteOpt) (_ Ima // unpacker only supports schema 2 image, for schema 1 this is noop. u, err := c.newUnpacker(ctx, pullCtx) if err != nil { - return nil, errors.Wrap(err, "create unpacker") + return nil, fmt.Errorf("create unpacker: %w", err) } unpackWrapper, unpackEg = u.handlerWrapper(ctx, pullCtx, &unpacks) defer func() { if err := unpackEg.Wait(); err != nil { if retErr == nil { - retErr = errors.Wrap(err, "unpack") + retErr = fmt.Errorf("unpack: %w", err) } } }() @@ -117,7 +118,7 @@ func (c *Client) Pull(ctx context.Context, ref string, opts ...RemoteOpt) (_ Ima // Try to unpack is none is done previously. // This is at least required for schema 1 image. if err := i.Unpack(ctx, pullCtx.Snapshotter, pullCtx.UnpackOpts...); err != nil { - return nil, errors.Wrapf(err, "failed to unpack image on snapshotter %s", pullCtx.Snapshotter) + return nil, fmt.Errorf("failed to unpack image on snapshotter %s: %w", pullCtx.Snapshotter, err) } } } @@ -129,12 +130,12 @@ func (c *Client) fetch(ctx context.Context, rCtx *RemoteContext, ref string, lim store := c.ContentStore() name, desc, err := rCtx.Resolver.Resolve(ctx, ref) if err != nil { - return images.Image{}, errors.Wrapf(err, "failed to resolve reference %q", ref) + return images.Image{}, fmt.Errorf("failed to resolve reference %q: %w", ref, err) } fetcher, err := rCtx.Resolver.Fetcher(ctx, name) if err != nil { - return images.Image{}, errors.Wrapf(err, "failed to get fetcher for %q", name) + return images.Image{}, fmt.Errorf("failed to get fetcher for %q: %w", name, err) } var ( diff --git a/remotes/docker/auth/fetch.go b/remotes/docker/auth/fetch.go index 3a9c26184..c259873d2 100644 --- a/remotes/docker/auth/fetch.go +++ b/remotes/docker/auth/fetch.go @@ -19,6 +19,8 @@ package auth import ( "context" "encoding/json" + "errors" + "fmt" "net/http" "net/url" "strings" @@ -27,7 +29,6 @@ import ( "github.com/containerd/containerd/log" remoteserrors "github.com/containerd/containerd/remotes/errors" "github.com/containerd/containerd/version" - "github.com/pkg/errors" "golang.org/x/net/context/ctxhttp" ) @@ -46,7 +47,7 @@ func GenerateTokenOptions(ctx context.Context, host, username, secret string, c realmURL, err := url.Parse(realm) if err != nil { - return TokenOptions{}, errors.Wrap(err, "invalid token auth challenge realm") + return TokenOptions{}, fmt.Errorf("invalid token auth challenge realm: %w", err) } to := TokenOptions{ @@ -133,18 +134,18 @@ func FetchTokenWithOAuth(ctx context.Context, client *http.Client, headers http. defer resp.Body.Close() if resp.StatusCode < 200 || resp.StatusCode >= 400 { - return nil, errors.WithStack(remoteserrors.NewUnexpectedStatusErr(resp)) + return nil, remoteserrors.NewUnexpectedStatusErr(resp) } decoder := json.NewDecoder(resp.Body) var tr OAuthTokenResponse if err = decoder.Decode(&tr); err != nil { - return nil, errors.Wrap(err, "unable to decode token response") + return nil, fmt.Errorf("unable to decode token response: %w", err) } if tr.AccessToken == "" { - return nil, errors.WithStack(ErrNoToken) + return nil, ErrNoToken } return &tr, nil @@ -200,14 +201,14 @@ func FetchToken(ctx context.Context, client *http.Client, headers http.Header, t defer resp.Body.Close() if resp.StatusCode < 200 || resp.StatusCode >= 400 { - return nil, errors.WithStack(remoteserrors.NewUnexpectedStatusErr(resp)) + return nil, remoteserrors.NewUnexpectedStatusErr(resp) } decoder := json.NewDecoder(resp.Body) var tr FetchTokenResponse if err = decoder.Decode(&tr); err != nil { - return nil, errors.Wrap(err, "unable to decode token response") + return nil, fmt.Errorf("unable to decode token response: %w", err) } // `access_token` is equivalent to `token` and if both are specified @@ -218,7 +219,7 @@ func FetchToken(ctx context.Context, client *http.Client, headers http.Header, t } if tr.Token == "" { - return nil, errors.WithStack(ErrNoToken) + return nil, ErrNoToken } return &tr, nil diff --git a/remotes/docker/authorizer.go b/remotes/docker/authorizer.go index bcb6296f3..d898ca4f8 100644 --- a/remotes/docker/authorizer.go +++ b/remotes/docker/authorizer.go @@ -19,6 +19,7 @@ package docker import ( "context" "encoding/base64" + "errors" "fmt" "net/http" "strings" @@ -28,7 +29,6 @@ import ( "github.com/containerd/containerd/log" "github.com/containerd/containerd/remotes/docker/auth" remoteerrors "github.com/containerd/containerd/remotes/errors" - "github.com/pkg/errors" "github.com/sirupsen/logrus" ) @@ -205,7 +205,7 @@ func (a *dockerAuthorizer) AddResponses(ctx context.Context, responses []*http.R } } } - return errors.Wrap(errdefs.ErrNotImplemented, "failed to find supported auth scheme") + return fmt.Errorf("failed to find supported auth scheme: %w", errdefs.ErrNotImplemented) } // authResult is used to control limit rate. @@ -252,7 +252,7 @@ func (ah *authHandler) authorize(ctx context.Context) (string, string, error) { case auth.BearerAuth: return ah.doBearerAuth(ctx) default: - return "", "", errors.Wrapf(errdefs.ErrNotImplemented, "failed to find supported auth scheme: %s", string(ah.scheme)) + return "", "", fmt.Errorf("failed to find supported auth scheme: %s: %w", string(ah.scheme), errdefs.ErrNotImplemented) } } @@ -298,7 +298,9 @@ func (ah *authHandler) doBearerAuth(ctx context.Context) (token, refreshToken st // fetch token for the resource scope if to.Secret != "" { defer func() { - err = errors.Wrap(err, "failed to fetch oauth token") + if err != nil { + err = fmt.Errorf("failed to fetch oauth token: %w", err) + } }() // credential information is provided, use oauth POST endpoint // TODO: Allow setting client_id @@ -328,7 +330,7 @@ func (ah *authHandler) doBearerAuth(ctx context.Context) (token, refreshToken st // do request anonymously resp, err := auth.FetchToken(ctx, ah.client, ah.header, to) if err != nil { - return "", "", errors.Wrap(err, "failed to fetch anonymous token") + return "", "", fmt.Errorf("failed to fetch anonymous token: %w", err) } return resp.Token, resp.RefreshToken, nil } @@ -344,7 +346,7 @@ func invalidAuthorization(c auth.Challenge, responses []*http.Response) error { return nil } - return errors.Wrapf(ErrInvalidAuthorization, "server message: %s", errStr) + return fmt.Errorf("server message: %s: %w", errStr, ErrInvalidAuthorization) } func sameRequest(r1, r2 *http.Request) bool { diff --git a/remotes/docker/config/hosts.go b/remotes/docker/config/hosts.go index f47e4ec06..daccb1efb 100644 --- a/remotes/docker/config/hosts.go +++ b/remotes/docker/config/hosts.go @@ -20,6 +20,8 @@ package config import ( "context" "crypto/tls" + "errors" + "fmt" "net" "net/http" "net/url" @@ -34,7 +36,6 @@ import ( "github.com/containerd/containerd/log" "github.com/containerd/containerd/remotes/docker" "github.com/pelletier/go-toml" - "github.com/pkg/errors" ) // UpdateClientFunc is a function that lets you to amend http Client behavior used by registry clients. @@ -166,17 +167,17 @@ func ConfigureHosts(ctx context.Context, options HostOptions) docker.RegistryHos if tlsConfig.RootCAs == nil { rootPool, err := rootSystemPool() if err != nil { - return nil, errors.Wrap(err, "unable to initialize cert pool") + return nil, fmt.Errorf("unable to initialize cert pool: %w", err) } tlsConfig.RootCAs = rootPool } for _, f := range host.caCerts { data, err := os.ReadFile(f) if err != nil { - return nil, errors.Wrapf(err, "unable to read CA cert %q", f) + return nil, fmt.Errorf("unable to read CA cert %q: %w", f, err) } if !tlsConfig.RootCAs.AppendCertsFromPEM(data) { - return nil, errors.Errorf("unable to load CA cert %q", f) + return nil, fmt.Errorf("unable to load CA cert %q", f) } } } @@ -185,13 +186,13 @@ func ConfigureHosts(ctx context.Context, options HostOptions) docker.RegistryHos for _, pair := range host.clientPairs { certPEMBlock, err := os.ReadFile(pair[0]) if err != nil { - return nil, errors.Wrapf(err, "unable to read CERT file %q", pair[0]) + return nil, fmt.Errorf("unable to read CERT file %q: %w", pair[0], err) } var keyPEMBlock []byte if pair[1] != "" { keyPEMBlock, err = os.ReadFile(pair[1]) if err != nil { - return nil, errors.Wrapf(err, "unable to read CERT file %q", pair[1]) + return nil, fmt.Errorf("unable to read CERT file %q: %w", pair[1], err) } } else { // Load key block from same PEM file @@ -199,7 +200,7 @@ func ConfigureHosts(ctx context.Context, options HostOptions) docker.RegistryHos } cert, err := tls.X509KeyPair(certPEMBlock, keyPEMBlock) if err != nil { - return nil, errors.Wrap(err, "failed to load X509 key pair") + return nil, fmt.Errorf("failed to load X509 key pair: %w", err) } tlsConfig.Certificates = append(tlsConfig.Certificates, cert) @@ -315,7 +316,7 @@ type hostFileConfig struct { func parseHostsFile(baseDir string, b []byte) ([]hostConfig, error) { tree, err := toml.LoadBytes(b) if err != nil { - return nil, errors.Wrap(err, "failed to parse TOML") + return nil, fmt.Errorf("failed to parse TOML: %w", err) } // HACK: we want to keep toml parsing structures private in this package, however go-toml ignores private embedded types. @@ -377,7 +378,7 @@ func parseHostConfig(server string, baseDir string, config hostFileConfig) (host } u, err := url.Parse(server) if err != nil { - return hostConfig{}, errors.Wrapf(err, "unable to parse server %v", server) + return hostConfig{}, fmt.Errorf("unable to parse server %v: %w", server, err) } result.scheme = u.Scheme result.host = u.Host @@ -404,7 +405,7 @@ func parseHostConfig(server string, baseDir string, config hostFileConfig) (host case "push": result.capabilities |= docker.HostCapabilityPush default: - return hostConfig{}, errors.Errorf("unknown capability %v", c) + return hostConfig{}, fmt.Errorf("unknown capability %v", c) } } } else { @@ -423,7 +424,7 @@ func parseHostConfig(server string, baseDir string, config hostFileConfig) (host return hostConfig{}, err } default: - return hostConfig{}, errors.Errorf("invalid type %v for \"ca\"", cert) + return hostConfig{}, fmt.Errorf("invalid type %v for \"ca\"", cert) } } @@ -445,18 +446,18 @@ func parseHostConfig(server string, baseDir string, config hostFileConfig) (host return hostConfig{}, err } if len(slice) != 2 { - return hostConfig{}, errors.Errorf("invalid pair %v for \"client\"", p) + return hostConfig{}, fmt.Errorf("invalid pair %v for \"client\"", p) } var pair [2]string copy(pair[:], slice) result.clientPairs = append(result.clientPairs, pair) default: - return hostConfig{}, errors.Errorf("invalid type %T for \"client\"", p) + return hostConfig{}, fmt.Errorf("invalid type %T for \"client\"", p) } } default: - return hostConfig{}, errors.Errorf("invalid type %v for \"client\"", client) + return hostConfig{}, fmt.Errorf("invalid type %v for \"client\"", client) } } @@ -472,7 +473,7 @@ func parseHostConfig(server string, baseDir string, config hostFileConfig) (host return hostConfig{}, err } default: - return hostConfig{}, errors.Errorf("invalid type %v for header %q", ty, key) + return hostConfig{}, fmt.Errorf("invalid type %v for header %q", ty, key) } } result.header = header @@ -508,7 +509,7 @@ func makeStringSlice(slice []interface{}, cb func(string) string) ([]string, err for i, value := range slice { str, ok := value.(string) if !ok { - return nil, errors.Errorf("unable to cast %v to string", value) + return nil, fmt.Errorf("unable to cast %v to string", value) } if cb != nil { diff --git a/remotes/docker/converter.go b/remotes/docker/converter.go index 43e6b372c..d7dca0d36 100644 --- a/remotes/docker/converter.go +++ b/remotes/docker/converter.go @@ -28,7 +28,6 @@ import ( "github.com/containerd/containerd/remotes" digest "github.com/opencontainers/go-digest" ocispec "github.com/opencontainers/image-spec/specs-go/v1" - "github.com/pkg/errors" ) // LegacyConfigMediaType should be replaced by OCI image spec. @@ -52,12 +51,12 @@ func ConvertManifest(ctx context.Context, store content.Store, desc ocispec.Desc // read manifest data mb, err := content.ReadBlob(ctx, store, desc) if err != nil { - return ocispec.Descriptor{}, errors.Wrap(err, "failed to read index data") + return ocispec.Descriptor{}, fmt.Errorf("failed to read index data: %w", err) } var manifest ocispec.Manifest if err := json.Unmarshal(mb, &manifest); err != nil { - return ocispec.Descriptor{}, errors.Wrap(err, "failed to unmarshal data into manifest") + return ocispec.Descriptor{}, fmt.Errorf("failed to unmarshal data into manifest: %w", err) } // check config media type @@ -68,7 +67,7 @@ func ConvertManifest(ctx context.Context, store content.Store, desc ocispec.Desc manifest.Config.MediaType = images.MediaTypeDockerSchema2Config data, err := json.MarshalIndent(manifest, "", " ") if err != nil { - return ocispec.Descriptor{}, errors.Wrap(err, "failed to marshal manifest") + return ocispec.Descriptor{}, fmt.Errorf("failed to marshal manifest: %w", err) } // update manifest with gc labels @@ -82,7 +81,7 @@ func ConvertManifest(ctx context.Context, store content.Store, desc ocispec.Desc ref := remotes.MakeRefKey(ctx, desc) if err := content.WriteBlob(ctx, store, ref, bytes.NewReader(data), desc, content.WithLabels(labels)); err != nil { - return ocispec.Descriptor{}, errors.Wrap(err, "failed to update content") + return ocispec.Descriptor{}, fmt.Errorf("failed to update content: %w", err) } return desc, nil } diff --git a/remotes/docker/fetcher.go b/remotes/docker/fetcher.go index 31928463f..11a75356e 100644 --- a/remotes/docker/fetcher.go +++ b/remotes/docker/fetcher.go @@ -19,6 +19,7 @@ package docker import ( "context" "encoding/json" + "errors" "fmt" "io" "net/http" @@ -29,7 +30,6 @@ import ( "github.com/containerd/containerd/images" "github.com/containerd/containerd/log" ocispec "github.com/opencontainers/image-spec/specs-go/v1" - "github.com/pkg/errors" ) type dockerFetcher struct { @@ -41,7 +41,7 @@ func (r dockerFetcher) Fetch(ctx context.Context, desc ocispec.Descriptor) (io.R hosts := r.filterHosts(HostCapabilityPull) if len(hosts) == 0 { - return nil, errors.Wrap(errdefs.ErrNotFound, "no pull hosts") + return nil, fmt.Errorf("no pull hosts: %w", errdefs.ErrNotFound) } ctx, err := ContextWithRepositoryScope(ctx, r.refspec, false) @@ -141,9 +141,9 @@ func (r dockerFetcher) Fetch(ctx context.Context, desc ocispec.Descriptor) (io.R } if errdefs.IsNotFound(firstErr) { - firstErr = errors.Wrapf(errdefs.ErrNotFound, - "could not fetch content descriptor %v (%v) from remote", - desc.Digest, desc.MediaType) + firstErr = fmt.Errorf("could not fetch content descriptor %v (%v) from remote: %w", + desc.Digest, desc.MediaType, errdefs.ErrNotFound, + ) } return nil, firstErr @@ -178,19 +178,19 @@ func (r dockerFetcher) open(ctx context.Context, req *request, mediatype string, // implementation. if resp.StatusCode == http.StatusNotFound { - return nil, errors.Wrapf(errdefs.ErrNotFound, "content at %v not found", req.String()) + return nil, fmt.Errorf("content at %v not found: %w", req.String(), errdefs.ErrNotFound) } var registryErr Errors if err := json.NewDecoder(resp.Body).Decode(®istryErr); err != nil || registryErr.Len() < 1 { - return nil, errors.Errorf("unexpected status code %v: %v", req.String(), resp.Status) + return nil, fmt.Errorf("unexpected status code %v: %v", req.String(), resp.Status) } - return nil, errors.Errorf("unexpected status code %v: %s - Server message: %s", req.String(), resp.Status, registryErr.Error()) + return nil, fmt.Errorf("unexpected status code %v: %s - Server message: %s", req.String(), resp.Status, registryErr.Error()) } if offset > 0 { cr := resp.Header.Get("content-range") if cr != "" { if !strings.HasPrefix(cr, fmt.Sprintf("bytes %d-", offset)) { - return nil, errors.Errorf("unhandled content range in response: %v", cr) + return nil, fmt.Errorf("unhandled content range in response: %v", cr) } } else { @@ -202,7 +202,7 @@ func (r dockerFetcher) open(ctx context.Context, req *request, mediatype string, // Could use buffer pool here but this case should be rare n, err := io.Copy(io.Discard, io.LimitReader(resp.Body, offset)) if err != nil { - return nil, errors.Wrap(err, "failed to discard to offset") + return nil, fmt.Errorf("failed to discard to offset: %w", err) } if n != offset { return nil, errors.New("unable to discard to offset") diff --git a/remotes/docker/fetcher_test.go b/remotes/docker/fetcher_test.go index 3805b5f68..47cbb6fb3 100644 --- a/remotes/docker/fetcher_test.go +++ b/remotes/docker/fetcher_test.go @@ -27,7 +27,6 @@ import ( "net/url" "testing" - "github.com/pkg/errors" "gotest.tools/v3/assert" ) @@ -200,9 +199,9 @@ func TestDockerFetcherOpen(t *testing.T) { if tt.wantErr { var expectedError error if tt.wantServerMessageError { - expectedError = errors.Errorf("unexpected status code %v/ns: %v %s - Server message: %s", s.URL, tt.mockedStatus, http.StatusText(tt.mockedStatus), tt.mockedErr.Error()) + expectedError = fmt.Errorf("unexpected status code %v/ns: %v %s - Server message: %s", s.URL, tt.mockedStatus, http.StatusText(tt.mockedStatus), tt.mockedErr.Error()) } else if tt.wantPlainError { - expectedError = errors.Errorf("unexpected status code %v/ns: %v %s", s.URL, tt.mockedStatus, http.StatusText(tt.mockedStatus)) + expectedError = fmt.Errorf("unexpected status code %v/ns: %v %s", s.URL, tt.mockedStatus, http.StatusText(tt.mockedStatus)) } assert.Equal(t, expectedError.Error(), err.Error()) diff --git a/remotes/docker/httpreadseeker.go b/remotes/docker/httpreadseeker.go index ecb66836c..9a827ef04 100644 --- a/remotes/docker/httpreadseeker.go +++ b/remotes/docker/httpreadseeker.go @@ -18,11 +18,11 @@ package docker import ( "bytes" + "fmt" "io" "github.com/containerd/containerd/errdefs" "github.com/containerd/containerd/log" - "github.com/pkg/errors" ) const maxRetry = 3 @@ -94,7 +94,7 @@ func (hrs *httpReadSeeker) Close() error { func (hrs *httpReadSeeker) Seek(offset int64, whence int) (int64, error) { if hrs.closed { - return 0, errors.Wrap(errdefs.ErrUnavailable, "Fetcher.Seek: closed") + return 0, fmt.Errorf("Fetcher.Seek: closed: %w", errdefs.ErrUnavailable) } abs := hrs.offset @@ -105,15 +105,15 @@ func (hrs *httpReadSeeker) Seek(offset int64, whence int) (int64, error) { abs += offset case io.SeekEnd: if hrs.size == -1 { - return 0, errors.Wrap(errdefs.ErrUnavailable, "Fetcher.Seek: unknown size, cannot seek from end") + return 0, fmt.Errorf("Fetcher.Seek: unknown size, cannot seek from end: %w", errdefs.ErrUnavailable) } abs = hrs.size + offset default: - return 0, errors.Wrap(errdefs.ErrInvalidArgument, "Fetcher.Seek: invalid whence") + return 0, fmt.Errorf("Fetcher.Seek: invalid whence: %w", errdefs.ErrInvalidArgument) } if abs < 0 { - return 0, errors.Wrapf(errdefs.ErrInvalidArgument, "Fetcher.Seek: negative offset") + return 0, fmt.Errorf("Fetcher.Seek: negative offset: %w", errdefs.ErrInvalidArgument) } if abs != hrs.offset { @@ -140,12 +140,12 @@ func (hrs *httpReadSeeker) reader() (io.Reader, error) { // only try to reopen the body request if we are seeking to a value // less than the actual size. if hrs.open == nil { - return nil, errors.Wrapf(errdefs.ErrNotImplemented, "cannot open") + return nil, fmt.Errorf("cannot open: %w", errdefs.ErrNotImplemented) } rc, err := hrs.open(hrs.offset) if err != nil { - return nil, errors.Wrapf(err, "httpReadSeeker: failed open") + return nil, fmt.Errorf("httpReadSeeker: failed open: %w", err) } if hrs.rc != nil { diff --git a/remotes/docker/pusher.go b/remotes/docker/pusher.go index 593aa5d93..3705da263 100644 --- a/remotes/docker/pusher.go +++ b/remotes/docker/pusher.go @@ -18,6 +18,8 @@ package docker import ( "context" + "errors" + "fmt" "io" "net/http" "net/url" @@ -32,7 +34,6 @@ import ( remoteserrors "github.com/containerd/containerd/remotes/errors" digest "github.com/opencontainers/go-digest" ocispec "github.com/opencontainers/image-spec/specs-go/v1" - "github.com/pkg/errors" ) type dockerPusher struct { @@ -55,7 +56,7 @@ func (p dockerPusher) Writer(ctx context.Context, opts ...content.WriterOpt) (co } } 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) } return p.push(ctx, wOpts.Desc, wOpts.Ref, true) } @@ -76,22 +77,22 @@ func (p dockerPusher) push(ctx context.Context, desc ocispec.Descriptor, ref str status, err := p.tracker.GetStatus(ref) if err == nil { if status.Committed && status.Offset == status.Total { - return nil, errors.Wrapf(errdefs.ErrAlreadyExists, "ref %v", ref) + return nil, fmt.Errorf("ref %v: %w", ref, errdefs.ErrAlreadyExists) } if unavailableOnFail { // Another push of this ref is happening elsewhere. The rest of function // will continue only when `errdefs.IsNotFound(err) == true` (i.e. there // is no actively-tracked ref already). - return nil, errors.Wrap(errdefs.ErrUnavailable, "push is on-going") + return nil, fmt.Errorf("push is on-going: %w", errdefs.ErrUnavailable) } // TODO: Handle incomplete status } else if !errdefs.IsNotFound(err) { - return nil, errors.Wrap(err, "failed to get status") + return nil, fmt.Errorf("failed to get status: %w", err) } hosts := p.filterHosts(HostCapabilityPush) if len(hosts) == 0 { - return nil, errors.Wrap(errdefs.ErrNotFound, "no push hosts") + return nil, fmt.Errorf("no push hosts: %w", errdefs.ErrNotFound) } var ( @@ -143,7 +144,7 @@ func (p dockerPusher) push(ctx context.Context, desc ocispec.Descriptor, ref str }, }) resp.Body.Close() - return nil, errors.Wrapf(errdefs.ErrAlreadyExists, "content %v on remote", desc.Digest) + return nil, fmt.Errorf("content %v on remote: %w", desc.Digest, errdefs.ErrAlreadyExists) } } else if resp.StatusCode != http.StatusNotFound { err := remoteserrors.NewUnexpectedStatusErr(resp) @@ -205,7 +206,7 @@ func (p dockerPusher) push(ctx context.Context, desc ocispec.Descriptor, ref str Offset: desc.Size, }, }) - return nil, errors.Wrapf(errdefs.ErrAlreadyExists, "content %v on remote", desc.Digest) + return nil, fmt.Errorf("content %v on remote: %w", desc.Digest, errdefs.ErrAlreadyExists) default: err := remoteserrors.NewUnexpectedStatusErr(resp) log.G(ctx).WithField("resp", resp).WithField("body", string(err.(remoteserrors.ErrUnexpectedStatus).Body)).Debug("unexpected response") @@ -221,7 +222,7 @@ func (p dockerPusher) push(ctx context.Context, desc ocispec.Descriptor, ref str if strings.HasPrefix(location, "/") { lurl, err = url.Parse(lhost.Scheme + "://" + lhost.Host + location) if err != nil { - return nil, errors.Wrapf(err, "unable to parse location %v", location) + return nil, fmt.Errorf("unable to parse location %v: %w", location, err) } } else { if !strings.Contains(location, "://") { @@ -229,7 +230,7 @@ func (p dockerPusher) push(ctx context.Context, desc ocispec.Descriptor, ref str } lurl, err = url.Parse(location) if err != nil { - return nil, errors.Wrapf(err, "unable to parse location %v", location) + return nil, fmt.Errorf("unable to parse location %v: %w", location, err) } if lurl.Host != lhost.Host || lhost.Scheme != lurl.Scheme { @@ -374,7 +375,7 @@ func (pw *pushWriter) Digest() digest.Digest { func (pw *pushWriter) Commit(ctx context.Context, size int64, expected digest.Digest, opts ...content.Opt) error { // Check whether read has already thrown an error if _, err := pw.pipe.Write([]byte{}); err != nil && err != io.ErrClosedPipe { - return errors.Wrap(err, "pipe error before commit") + return fmt.Errorf("pipe error before commit: %w", err) } if err := pw.pipe.Close(); err != nil { @@ -397,11 +398,11 @@ func (pw *pushWriter) Commit(ctx context.Context, size int64, expected digest.Di status, err := pw.tracker.GetStatus(pw.ref) if err != nil { - return errors.Wrap(err, "failed to get status") + return fmt.Errorf("failed to get status: %w", err) } if size > 0 && size != status.Offset { - return errors.Errorf("unexpected size %d, expected %d", status.Offset, size) + return fmt.Errorf("unexpected size %d, expected %d", status.Offset, size) } if expected == "" { @@ -410,11 +411,11 @@ func (pw *pushWriter) Commit(ctx context.Context, size int64, expected digest.Di actual, err := digest.Parse(resp.Header.Get("Docker-Content-Digest")) if err != nil { - return errors.Wrap(err, "invalid content digest in response") + return fmt.Errorf("invalid content digest in response: %w", err) } if actual != expected { - return errors.Errorf("got digest %s, expected %s", actual, expected) + return fmt.Errorf("got digest %s, expected %s", actual, expected) } status.Committed = true diff --git a/remotes/docker/registry.go b/remotes/docker/registry.go index 1e77d4c86..98cafcd06 100644 --- a/remotes/docker/registry.go +++ b/remotes/docker/registry.go @@ -17,10 +17,9 @@ package docker import ( + "errors" "net" "net/http" - - "github.com/pkg/errors" ) // HostCapabilities represent the capabilities of the registry diff --git a/remotes/docker/resolver.go b/remotes/docker/resolver.go index 4af1d19db..9bbbc2622 100644 --- a/remotes/docker/resolver.go +++ b/remotes/docker/resolver.go @@ -18,6 +18,7 @@ package docker import ( "context" + "errors" "fmt" "io" "net/http" @@ -34,7 +35,6 @@ import ( "github.com/containerd/containerd/version" digest "github.com/opencontainers/go-digest" ocispec "github.com/opencontainers/image-spec/specs-go/v1" - "github.com/pkg/errors" "github.com/sirupsen/logrus" "golang.org/x/net/context/ctxhttp" ) @@ -254,7 +254,7 @@ func (r *dockerResolver) Resolve(ctx context.Context, ref string) (string, ocisp hosts := base.filterHosts(caps) if len(hosts) == 0 { - return "", ocispec.Descriptor{}, errors.Wrap(errdefs.ErrNotFound, "no resolve hosts") + return "", ocispec.Descriptor{}, fmt.Errorf("no resolve hosts: %w", errdefs.ErrNotFound) } ctx, err = ContextWithRepositoryScope(ctx, refspec, false) @@ -279,7 +279,7 @@ func (r *dockerResolver) Resolve(ctx context.Context, ref string) (string, ocisp resp, err := req.doWithRetries(ctx, nil) if err != nil { if errors.Is(err, ErrInvalidAuthorization) { - err = errors.Wrapf(err, "pull access denied, repository does not exist or may require authorization") + err = fmt.Errorf("pull access denied, repository does not exist or may require authorization: %w", err) } // Store the error for referencing later if firstErr == nil { @@ -298,11 +298,11 @@ func (r *dockerResolver) Resolve(ctx context.Context, ref string) (string, ocisp if resp.StatusCode > 399 { // Set firstErr when encountering the first non-404 status code. if firstErr == nil { - firstErr = errors.Errorf("pulling from host %s failed with status code %v: %v", host.Host, u, resp.Status) + firstErr = fmt.Errorf("pulling from host %s failed with status code %v: %v", host.Host, u, resp.Status) } continue // try another host } - return "", ocispec.Descriptor{}, errors.Errorf("pulling from host %s failed with unexpected status code %v: %v", host.Host, u, resp.Status) + return "", ocispec.Descriptor{}, fmt.Errorf("pulling from host %s failed with unexpected status code %v: %v", host.Host, u, resp.Status) } size := resp.ContentLength contentType := getManifestMediaType(resp) @@ -318,7 +318,7 @@ func (r *dockerResolver) Resolve(ctx context.Context, ref string) (string, ocisp if dgstHeader != "" && size != -1 { if err := dgstHeader.Validate(); err != nil { - return "", ocispec.Descriptor{}, errors.Wrapf(err, "%q in header not a valid digest", dgstHeader) + return "", ocispec.Descriptor{}, fmt.Errorf("%q in header not a valid digest: %w", dgstHeader, err) } dgst = dgstHeader } @@ -366,7 +366,7 @@ func (r *dockerResolver) Resolve(ctx context.Context, ref string) (string, ocisp // Prevent resolving to excessively large manifests if size > MaxManifestSize { if firstErr == nil { - firstErr = errors.Wrapf(errdefs.ErrNotFound, "rejecting %d byte manifest for %s", size, ref) + firstErr = fmt.Errorf("rejecting %d byte manifest for %s: %w", size, ref, errdefs.ErrNotFound) } continue } @@ -387,7 +387,7 @@ func (r *dockerResolver) Resolve(ctx context.Context, ref string) (string, ocisp // means that either no registries were given or each registry returned 404. if firstErr == nil { - firstErr = errors.Wrap(errdefs.ErrNotFound, ref) + firstErr = fmt.Errorf("%s: %w", ref, errdefs.ErrNotFound) } return "", ocispec.Descriptor{}, firstErr @@ -547,7 +547,7 @@ func (r *request) do(ctx context.Context) (*http.Response, error) { ctx = log.WithLogger(ctx, log.G(ctx).WithField("url", u)) log.G(ctx).WithFields(requestFields(req)).Debug("do request") if err := r.authorize(ctx, req); err != nil { - return nil, errors.Wrap(err, "failed to authorize") + return nil, fmt.Errorf("failed to authorize: %w", err) } var client = &http.Client{} @@ -559,13 +559,16 @@ func (r *request) do(ctx context.Context) (*http.Response, error) { if len(via) >= 10 { return errors.New("stopped after 10 redirects") } - return errors.Wrap(r.authorize(ctx, req), "failed to authorize redirect") + if err := r.authorize(ctx, req); err != nil { + return fmt.Errorf("failed to authorize redirect: %w", err) + } + return nil } } resp, err := ctxhttp.Do(ctx, client, req) if err != nil { - return nil, errors.Wrap(err, "failed to do request") + return nil, fmt.Errorf("failed to do request: %w", err) } log.G(ctx).WithFields(responseFields(resp)).Debug("fetch response received") return resp, nil diff --git a/remotes/docker/resolver_test.go b/remotes/docker/resolver_test.go index e73ba73b1..131c5072f 100644 --- a/remotes/docker/resolver_test.go +++ b/remotes/docker/resolver_test.go @@ -21,6 +21,7 @@ import ( "crypto/tls" "crypto/x509" "encoding/json" + "errors" "fmt" "io" "net/http" @@ -35,7 +36,6 @@ import ( digest "github.com/opencontainers/go-digest" specs "github.com/opencontainers/image-spec/specs-go" ocispec "github.com/opencontainers/image-spec/specs-go/v1" - "github.com/pkg/errors" ) func TestHTTPResolver(t *testing.T) { @@ -588,7 +588,7 @@ func testFetch(ctx context.Context, f remotes.Fetcher, desc ocispec.Descriptor) dgstr := desc.Digest.Algorithm().Digester() io.Copy(dgstr.Hash(), r) if dgstr.Digest() != desc.Digest { - return errors.Errorf("content mismatch: %s != %s", dgstr.Digest(), desc.Digest) + return fmt.Errorf("content mismatch: %s != %s", dgstr.Digest(), desc.Digest) } return nil @@ -597,14 +597,14 @@ func testFetch(ctx context.Context, f remotes.Fetcher, desc ocispec.Descriptor) func testocimanifest(ctx context.Context, f remotes.Fetcher, desc ocispec.Descriptor) ([]ocispec.Descriptor, error) { r, err := f.Fetch(ctx, desc) if err != nil { - return nil, errors.Wrapf(err, "failed to fetch %s", desc.Digest) + return nil, fmt.Errorf("failed to fetch %s: %w", desc.Digest, err) } p, err := io.ReadAll(r) if err != nil { return nil, err } if dgst := desc.Digest.Algorithm().FromBytes(p); dgst != desc.Digest { - return nil, errors.Errorf("digest mismatch: %s != %s", dgst, desc.Digest) + return nil, fmt.Errorf("digest mismatch: %s != %s", dgst, desc.Digest) } var manifest ocispec.Manifest diff --git a/remotes/docker/schema1/converter.go b/remotes/docker/schema1/converter.go index e72e6a88d..efa4e8d6e 100644 --- a/remotes/docker/schema1/converter.go +++ b/remotes/docker/schema1/converter.go @@ -21,6 +21,7 @@ import ( "context" "encoding/base64" "encoding/json" + "errors" "fmt" "io" "strconv" @@ -28,8 +29,6 @@ import ( "sync" "time" - "golang.org/x/sync/errgroup" - "github.com/containerd/containerd/archive/compression" "github.com/containerd/containerd/content" "github.com/containerd/containerd/errdefs" @@ -39,7 +38,7 @@ import ( digest "github.com/opencontainers/go-digest" specs "github.com/opencontainers/image-spec/specs-go" ocispec "github.com/opencontainers/image-spec/specs-go/v1" - "github.com/pkg/errors" + "golang.org/x/sync/errgroup" ) const ( @@ -158,12 +157,12 @@ func (c *Converter) Convert(ctx context.Context, opts ...ConvertOpt) (ocispec.De history, diffIDs, err := c.schema1ManifestHistory() if err != nil { - return ocispec.Descriptor{}, errors.Wrap(err, "schema 1 conversion failed") + return ocispec.Descriptor{}, fmt.Errorf("schema 1 conversion failed: %w", err) } var img ocispec.Image if err := json.Unmarshal([]byte(c.pulledManifest.History[0].V1Compatibility), &img); err != nil { - return ocispec.Descriptor{}, errors.Wrap(err, "failed to unmarshal image from schema 1 history") + return ocispec.Descriptor{}, fmt.Errorf("failed to unmarshal image from schema 1 history: %w", err) } img.History = history @@ -174,7 +173,7 @@ func (c *Converter) Convert(ctx context.Context, opts ...ConvertOpt) (ocispec.De b, err := json.MarshalIndent(img, "", " ") if err != nil { - return ocispec.Descriptor{}, errors.Wrap(err, "failed to marshal image") + return ocispec.Descriptor{}, fmt.Errorf("failed to marshal image: %w", err) } config := ocispec.Descriptor{ @@ -198,7 +197,7 @@ func (c *Converter) Convert(ctx context.Context, opts ...ConvertOpt) (ocispec.De mb, err := json.MarshalIndent(manifest, "", " ") if err != nil { - return ocispec.Descriptor{}, errors.Wrap(err, "failed to marshal image") + return ocispec.Descriptor{}, fmt.Errorf("failed to marshal image: %w", err) } desc := ocispec.Descriptor{ @@ -215,12 +214,12 @@ func (c *Converter) Convert(ctx context.Context, opts ...ConvertOpt) (ocispec.De ref := remotes.MakeRefKey(ctx, desc) if err := content.WriteBlob(ctx, c.contentStore, ref, bytes.NewReader(mb), desc, content.WithLabels(labels)); err != nil { - return ocispec.Descriptor{}, errors.Wrap(err, "failed to write image manifest") + return ocispec.Descriptor{}, fmt.Errorf("failed to write image manifest: %w", err) } ref = remotes.MakeRefKey(ctx, config) if err := content.WriteBlob(ctx, c.contentStore, ref, bytes.NewReader(b), config); err != nil { - return ocispec.Descriptor{}, errors.Wrap(err, "failed to write image config") + return ocispec.Descriptor{}, fmt.Errorf("failed to write image config: %w", err) } return desc, nil @@ -349,7 +348,7 @@ func (c *Converter) fetchBlob(ctx context.Context, desc ocispec.Descriptor) erro if desc.Size == -1 { info, err := c.contentStore.Info(ctx, desc.Digest) if err != nil { - return errors.Wrap(err, "failed to get blob info") + return fmt.Errorf("failed to get blob info: %w", err) } desc.Size = info.Size } @@ -370,7 +369,7 @@ func (c *Converter) fetchBlob(ctx context.Context, desc ocispec.Descriptor) erro } if _, err := c.contentStore.Update(ctx, cinfo, "labels.containerd.io/uncompressed", fmt.Sprintf("labels.%s", labelDockerSchema1EmptyLayer)); err != nil { - return errors.Wrap(err, "failed to update uncompressed label") + return fmt.Errorf("failed to update uncompressed label: %w", err) } c.mu.Lock() @@ -384,7 +383,7 @@ func (c *Converter) fetchBlob(ctx context.Context, desc ocispec.Descriptor) erro func (c *Converter) reuseLabelBlobState(ctx context.Context, desc ocispec.Descriptor) (bool, error) { cinfo, err := c.contentStore.Info(ctx, desc.Digest) if err != nil { - return false, errors.Wrap(err, "failed to get blob info") + return false, fmt.Errorf("failed to get blob info: %w", err) } desc.Size = cinfo.Size @@ -441,7 +440,7 @@ func (c *Converter) schema1ManifestHistory() ([]ocispec.History, []digest.Digest for i := range m.History { var h v1History if err := json.Unmarshal([]byte(m.History[i].V1Compatibility), &h); err != nil { - return nil, nil, errors.Wrap(err, "failed to unmarshal history") + return nil, nil, fmt.Errorf("failed to unmarshal history: %w", err) } blobSum := m.FSLayers[i].BlobSum @@ -553,7 +552,7 @@ func stripSignature(b []byte) ([]byte, error) { } pb, err := joseBase64UrlDecode(sig.Signatures[0].Protected) if err != nil { - return nil, errors.Wrapf(err, "could not decode %s", sig.Signatures[0].Protected) + return nil, fmt.Errorf("could not decode %s: %w", sig.Signatures[0].Protected, err) } var protected protectedBlock @@ -567,7 +566,7 @@ func stripSignature(b []byte) ([]byte, error) { tail, err := joseBase64UrlDecode(protected.Tail) if err != nil { - return nil, errors.Wrap(err, "invalid tail base 64 value") + return nil, fmt.Errorf("invalid tail base 64 value: %w", err) } return append(b[:protected.Length], tail...), nil diff --git a/remotes/docker/status.go b/remotes/docker/status.go index 9751edac7..751c27663 100644 --- a/remotes/docker/status.go +++ b/remotes/docker/status.go @@ -17,12 +17,12 @@ package docker import ( + "fmt" "sync" "github.com/containerd/containerd/content" "github.com/containerd/containerd/errdefs" "github.com/moby/locker" - "github.com/pkg/errors" ) // Status of a content operation @@ -67,7 +67,7 @@ func (t *memoryStatusTracker) GetStatus(ref string) (Status, error) { defer t.m.Unlock() status, ok := t.statuses[ref] if !ok { - return Status{}, errors.Wrapf(errdefs.ErrNotFound, "status for ref %v", ref) + return Status{}, fmt.Errorf("status for ref %v: %w", ref, errdefs.ErrNotFound) } return status, nil } diff --git a/remotes/handlers.go b/remotes/handlers.go index 8f79c608e..9ec54209f 100644 --- a/remotes/handlers.go +++ b/remotes/handlers.go @@ -18,6 +18,7 @@ package remotes import ( "context" + "errors" "fmt" "io" "strings" @@ -29,7 +30,6 @@ import ( "github.com/containerd/containerd/log" "github.com/containerd/containerd/platforms" ocispec "github.com/opencontainers/image-spec/specs-go/v1" - "github.com/pkg/errors" "github.com/sirupsen/logrus" "golang.org/x/sync/semaphore" ) @@ -127,13 +127,13 @@ func fetch(ctx context.Context, ingester content.Ingester, fetcher Fetcher, desc // most likely a poorly configured registry/web front end which responded with no // Content-Length header; unable (not to mention useless) to commit a 0-length entry // into the content store. Error out here otherwise the error sent back is confusing - return errors.Wrapf(errdefs.ErrInvalidArgument, "unable to fetch descriptor (%s) which reports content size of zero", desc.Digest) + return fmt.Errorf("unable to fetch descriptor (%s) which reports content size of zero: %w", desc.Digest, errdefs.ErrInvalidArgument) } if ws.Offset == desc.Size { // If writer is already complete, commit and return err := cw.Commit(ctx, desc.Size, desc.Digest) if err != nil && !errdefs.IsAlreadyExists(err) { - return errors.Wrapf(err, "failed commit on ref %q", ws.Ref) + return fmt.Errorf("failed commit on ref %q: %w", ws.Ref, err) } return nil } @@ -243,8 +243,8 @@ func PushContent(ctx context.Context, pusher Pusher, desc ocispec.Descriptor, st // as a marker for this problem if (manifestStack[i].MediaType == ocispec.MediaTypeImageIndex || manifestStack[i].MediaType == images.MediaTypeDockerSchema2ManifestList) && - errors.Cause(err) != nil && strings.Contains(errors.Cause(err).Error(), "400 Bad Request") { - return errors.Wrap(err, "manifest list/index references to blobs and/or manifests are missing in your target registry") + errors.Unwrap(err) != nil && strings.Contains(errors.Unwrap(err).Error(), "400 Bad Request") { + return fmt.Errorf("manifest list/index references to blobs and/or manifests are missing in your target registry: %w ", err) } return err } diff --git a/rootfs/apply.go b/rootfs/apply.go index f1ca624bf..b3f388e64 100644 --- a/rootfs/apply.go +++ b/rootfs/apply.go @@ -31,7 +31,6 @@ import ( "github.com/opencontainers/go-digest" "github.com/opencontainers/image-spec/identity" ocispec "github.com/opencontainers/image-spec/specs-go/v1" - "github.com/pkg/errors" ) // Layer represents the descriptors for a layer diff. These descriptions @@ -68,7 +67,7 @@ func ApplyLayersWithOpts(ctx context.Context, layers []Layer, sn snapshots.Snaps _, err := sn.Stat(ctx, chainID.String()) if err != nil { if !errdefs.IsNotFound(err) { - return "", errors.Wrapf(err, "failed to stat snapshot %s", chainID) + return "", fmt.Errorf("failed to stat snapshot %s: %w", chainID, err) } if err := applyLayers(ctx, layers, chain, sn, a, nil, applyOpts); err != nil && !errdefs.IsAlreadyExists(err) { @@ -96,7 +95,7 @@ func ApplyLayerWithOpts(ctx context.Context, layer Layer, chain []digest.Digest, ) if _, err := sn.Stat(ctx, chainID); err != nil { if !errdefs.IsNotFound(err) { - return false, errors.Wrapf(err, "failed to stat snapshot %s", chainID) + return false, fmt.Errorf("failed to stat snapshot %s: %w", chainID, err) } if err := applyLayers(ctx, []Layer{layer}, append(chain, layer.Diff.Digest), sn, a, opts, applyOpts); err != nil { @@ -143,7 +142,7 @@ func applyLayers(ctx context.Context, layers []Layer, chain []digest.Digest, sn } // Already exists should have the caller retry - return errors.Wrapf(err, "failed to prepare extraction snapshot %q", key) + return fmt.Errorf("failed to prepare extraction snapshot %q: %w", key, err) } break @@ -162,16 +161,16 @@ func applyLayers(ctx context.Context, layers []Layer, chain []digest.Digest, sn diff, err = a.Apply(ctx, layer.Blob, mounts, applyOpts...) if err != nil { - err = errors.Wrapf(err, "failed to extract layer %s", layer.Diff.Digest) + err = fmt.Errorf("failed to extract layer %s: %w", layer.Diff.Digest, err) return err } if diff.Digest != layer.Diff.Digest { - err = errors.Errorf("wrong diff id calculated on extraction %q", diff.Digest) + err = fmt.Errorf("wrong diff id calculated on extraction %q", diff.Digest) return err } if err = sn.Commit(ctx, chainID.String(), key, opts...); err != nil { - err = errors.Wrapf(err, "failed to commit snapshot %s", key) + err = fmt.Errorf("failed to commit snapshot %s: %w", key, err) return err } diff --git a/rootfs/init.go b/rootfs/init.go index 92908fa1c..02d13bfc3 100644 --- a/rootfs/init.go +++ b/rootfs/init.go @@ -18,6 +18,7 @@ package rootfs import ( "context" + "errors" "fmt" "os" @@ -25,7 +26,6 @@ import ( "github.com/containerd/containerd/mount" "github.com/containerd/containerd/snapshots" digest "github.com/opencontainers/go-digest" - "github.com/pkg/errors" ) var ( diff --git a/runtime/restart/monitor/change.go b/runtime/restart/monitor/change.go index 7de6f67c3..a74b3dcd1 100644 --- a/runtime/restart/monitor/change.go +++ b/runtime/restart/monitor/change.go @@ -18,12 +18,12 @@ package monitor import ( "context" + "fmt" "net/url" "syscall" "github.com/containerd/containerd" "github.com/containerd/containerd/cio" - "github.com/pkg/errors" "github.com/sirupsen/logrus" ) @@ -49,7 +49,7 @@ func (s *startChange) apply(ctx context.Context, client *containerd.Client) erro if s.logURI != "" { uri, err := url.Parse(s.logURI) if err != nil { - return errors.Wrapf(err, "failed to parse %v into url", s.logURI) + return fmt.Errorf("failed to parse %v into url: %w", s.logURI, err) } log = cio.LogURI(uri) } else if s.logPath != "" { diff --git a/runtime/restart/monitor/monitor.go b/runtime/restart/monitor/monitor.go index 623fc6f2a..a504ad9f4 100644 --- a/runtime/restart/monitor/monitor.go +++ b/runtime/restart/monitor/monitor.go @@ -35,7 +35,6 @@ import ( "github.com/containerd/containerd/runtime/restart" "github.com/containerd/containerd/services" "github.com/containerd/containerd/snapshots" - "github.com/pkg/errors" "github.com/sirupsen/logrus" ) @@ -94,12 +93,12 @@ func init() { func getServicesOpts(ic *plugin.InitContext) ([]containerd.ServicesOpt, error) { plugins, err := ic.GetByType(plugin.ServicePlugin) if err != nil { - return nil, errors.Wrap(err, "failed to get service plugin") + return nil, fmt.Errorf("failed to get service plugin: %w", err) } ep, err := ic.Get(plugin.EventPlugin) if err != nil { - return nil, errors.Wrap(err, "failed to get event plugin") + return nil, fmt.Errorf("failed to get event plugin: %w", err) } opts := []containerd.ServicesOpt{ @@ -133,14 +132,14 @@ func getServicesOpts(ic *plugin.InitContext) ([]containerd.ServicesOpt, error) { } { p := plugins[s] if p == nil { - return nil, errors.Errorf("service %q not found", s) + return nil, fmt.Errorf("service %q not found", s) } i, err := p.Instance() if err != nil { - return nil, errors.Wrapf(err, "failed to get instance of service %q", s) + return nil, fmt.Errorf("failed to get instance of service %q: %w", s, err) } if i == nil { - return nil, errors.Errorf("instance of service %q not found", s) + return nil, fmt.Errorf("instance of service %q not found", s) } opts = append(opts, fn(i)) } diff --git a/runtime/task_list.go b/runtime/task_list.go index 5b969e5a5..f24d689f1 100644 --- a/runtime/task_list.go +++ b/runtime/task_list.go @@ -18,10 +18,11 @@ package runtime import ( "context" + "errors" + "fmt" "sync" "github.com/containerd/containerd/namespaces" - "github.com/pkg/errors" ) var ( @@ -109,7 +110,7 @@ func (l *TaskList) AddWithNamespace(namespace string, t Task) error { l.tasks[namespace] = make(map[string]Task) } if _, ok := l.tasks[namespace][id]; ok { - return errors.Wrap(ErrTaskAlreadyExists, id) + return fmt.Errorf("%s: %w", id, ErrTaskAlreadyExists) } l.tasks[namespace][id] = t return nil diff --git a/runtime/v1/linux/bundle.go b/runtime/v1/linux/bundle.go index 9885d9501..b1830d004 100644 --- a/runtime/v1/linux/bundle.go +++ b/runtime/v1/linux/bundle.go @@ -32,7 +32,6 @@ import ( "github.com/containerd/containerd/runtime/v1/shim" "github.com/containerd/containerd/runtime/v1/shim/client" "github.com/opencontainers/runtime-spec/specs-go" - "github.com/pkg/errors" ) // loadBundle loads an existing bundle from disk @@ -185,7 +184,7 @@ func (b *bundle) Delete() error { if err2 == nil { return err } - return errors.Wrapf(err, "Failed to remove both bundle and workdir locations: %v", err2) + return fmt.Errorf("Failed to remove both bundle and workdir locations: %v: %w", err2, err) } func (b *bundle) legacyShimAddress(namespace string) string { diff --git a/runtime/v1/linux/process.go b/runtime/v1/linux/process.go index cf01abe89..b7f9e0dc5 100644 --- a/runtime/v1/linux/process.go +++ b/runtime/v1/linux/process.go @@ -21,6 +21,7 @@ package linux import ( "context" + "errors" eventstypes "github.com/containerd/containerd/api/events" "github.com/containerd/containerd/api/types/task" @@ -28,7 +29,6 @@ import ( "github.com/containerd/containerd/runtime" shim "github.com/containerd/containerd/runtime/v1/shim/v1" "github.com/containerd/ttrpc" - "github.com/pkg/errors" ) // Process implements a linux process diff --git a/runtime/v1/linux/runtime.go b/runtime/v1/linux/runtime.go index 4734fcdd8..b6d53820a 100644 --- a/runtime/v1/linux/runtime.go +++ b/runtime/v1/linux/runtime.go @@ -21,6 +21,7 @@ package linux import ( "context" + "errors" "fmt" "io" "os" @@ -48,7 +49,6 @@ import ( "github.com/containerd/typeurl" ptypes "github.com/gogo/protobuf/types" ocispec "github.com/opencontainers/image-spec/specs-go/v1" - "github.com/pkg/errors" "github.com/sirupsen/logrus" "golang.org/x/sys/unix" ) @@ -167,7 +167,7 @@ func (r *Runtime) Create(ctx context.Context, id string, opts runtime.CreateOpts } if err := identifiers.Validate(id); err != nil { - return nil, errors.Wrapf(err, "invalid task id") + return nil, fmt.Errorf("invalid task id: %w", err) } ropts, err := r.getRuncOptions(ctx, id) @@ -450,7 +450,7 @@ func (r *Runtime) cleanupAfterDeadShim(ctx context.Context, bundle *bundle, ns, ctx = namespaces.WithNamespace(ctx, ns) if err := r.terminate(ctx, bundle, ns, id); err != nil { if r.config.ShimDebug { - return errors.Wrap(err, "failed to terminate task, leaving bundle for debugging") + return fmt.Errorf("failed to terminate task, leaving bundle for debugging: %w", err) } log.G(ctx).WithError(err).Warn("failed to terminate task") } diff --git a/runtime/v1/linux/task.go b/runtime/v1/linux/task.go index 72dca64ca..3ac7839ff 100644 --- a/runtime/v1/linux/task.go +++ b/runtime/v1/linux/task.go @@ -21,6 +21,8 @@ package linux import ( "context" + "errors" + "fmt" "sync" "github.com/containerd/cgroups" @@ -36,7 +38,6 @@ import ( "github.com/containerd/ttrpc" "github.com/containerd/typeurl" "github.com/gogo/protobuf/types" - "github.com/pkg/errors" ) // Task on a linux based system @@ -229,7 +230,7 @@ func (t *Task) Kill(ctx context.Context, signal uint32, all bool) error { // Exec creates a new process inside the task func (t *Task) Exec(ctx context.Context, id string, opts runtime.ExecOpts) (runtime.ExecProcess, error) { if err := identifiers.Validate(id); err != nil { - return nil, errors.Wrapf(err, "invalid exec id") + return nil, fmt.Errorf("invalid exec id: %w", err) } request := &shim.ExecProcessRequest{ ID: id, @@ -333,7 +334,7 @@ func (t *Task) Stats(ctx context.Context) (*types.Any, error) { t.mu.Lock() defer t.mu.Unlock() if t.cg == nil { - return nil, errors.Wrap(errdefs.ErrNotFound, "cgroup does not exist") + return nil, fmt.Errorf("cgroup does not exist: %w", errdefs.ErrNotFound) } stats, err := t.cg.Stat(cgroups.IgnoreNotExist) if err != nil { @@ -347,7 +348,7 @@ func (t *Task) Cgroup() (cgroups.Cgroup, error) { t.mu.Lock() defer t.mu.Unlock() if t.cg == nil { - return nil, errors.Wrap(errdefs.ErrNotFound, "cgroup does not exist") + return nil, fmt.Errorf("cgroup does not exist: %w", errdefs.ErrNotFound) } return t.cg, nil } diff --git a/runtime/v1/shim/client/client.go b/runtime/v1/shim/client/client.go index ac38c33fe..6e5eae522 100644 --- a/runtime/v1/shim/client/client.go +++ b/runtime/v1/shim/client/client.go @@ -21,6 +21,7 @@ package client import ( "context" + "errors" "fmt" "io" "net" @@ -40,7 +41,6 @@ import ( "github.com/containerd/containerd/sys" "github.com/containerd/ttrpc" ptypes "github.com/gogo/protobuf/types" - "github.com/pkg/errors" "github.com/sirupsen/logrus" exec "golang.org/x/sys/execabs" "golang.org/x/sys/unix" @@ -60,7 +60,7 @@ func WithStart(binary, address, daemonAddress, cgroup string, debug bool, exitHa return nil, nil, err } if err := RemoveSocket(address); err != nil { - return nil, nil, errors.Wrap(err, "remove already used socket") + return nil, nil, fmt.Errorf("remove already used socket: %w", err) } if socket, err = newSocket(address); err != nil { return nil, nil, err @@ -69,7 +69,7 @@ func WithStart(binary, address, daemonAddress, cgroup string, debug bool, exitHa f, err := socket.File() if err != nil { - return nil, nil, errors.Wrapf(err, "failed to get fd for socket %s", address) + return nil, nil, fmt.Errorf("failed to get fd for socket %s: %w", address, err) } defer f.Close() @@ -77,12 +77,12 @@ func WithStart(binary, address, daemonAddress, cgroup string, debug bool, exitHa stderrCopy := io.Discard stdoutLog, err := v1.OpenShimStdoutLog(ctx, config.WorkDir) if err != nil { - return nil, nil, errors.Wrapf(err, "failed to create stdout log") + return nil, nil, fmt.Errorf("failed to create stdout log: %w", err) } stderrLog, err := v1.OpenShimStderrLog(ctx, config.WorkDir) if err != nil { - return nil, nil, errors.Wrapf(err, "failed to create stderr log") + return nil, nil, fmt.Errorf("failed to create stderr log: %w", err) } if debug { stdoutCopy = os.Stdout @@ -97,7 +97,7 @@ func WithStart(binary, address, daemonAddress, cgroup string, debug bool, exitHa return nil, nil, err } if err := cmd.Start(); err != nil { - return nil, nil, errors.Wrapf(err, "failed to start shim") + return nil, nil, fmt.Errorf("failed to start shim: %w", err) } defer func() { if err != nil { @@ -143,14 +143,14 @@ func WithStart(binary, address, daemonAddress, cgroup string, debug bool, exitHa } c, clo, err := WithConnect(address, func() {})(ctx, config) if err != nil { - return nil, nil, errors.Wrap(err, "failed to connect") + return nil, nil, fmt.Errorf("failed to connect: %w", err) } return c, clo, nil } } func eaddrinuse(err error) bool { - cause := errors.Cause(err) + cause := errors.Unwrap(err) netErr, ok := cause.(*net.OpError) if !ok { return false @@ -176,11 +176,11 @@ func setupOOMScore(shimPid int) error { pid := os.Getpid() score, err := sys.GetOOMScoreAdj(pid) if err != nil { - return errors.Wrap(err, "get daemon OOM score") + return fmt.Errorf("get daemon OOM score: %w", err) } shimScore := score + 1 if err := sys.AdjustOOMScore(shimPid, shimScore); err != nil { - return errors.Wrap(err, "set shim OOM score") + return fmt.Errorf("set shim OOM score: %w", err) } return nil } @@ -264,7 +264,7 @@ func (s socket) path() string { func newSocket(address string) (*net.UnixListener, error) { if len(address) > socketPathLimit { - return nil, errors.Errorf("%q: unix socket path too long (> %d)", address, socketPathLimit) + return nil, fmt.Errorf("%q: unix socket path too long (> %d)", address, socketPathLimit) } var ( sock = socket(address) @@ -272,12 +272,12 @@ func newSocket(address string) (*net.UnixListener, error) { ) if !sock.isAbstract() { if err := os.MkdirAll(filepath.Dir(path), 0600); err != nil { - return nil, errors.Wrapf(err, "%s", path) + return nil, fmt.Errorf("%s: %w", path, err) } } l, err := net.Listen("unix", path) if err != nil { - return nil, errors.Wrapf(err, "failed to listen to unix socket %q (abstract: %t)", address, sock.isAbstract()) + return nil, fmt.Errorf("failed to listen to unix socket %q (abstract: %t): %w", address, sock.isAbstract(), err) } if err := os.Chmod(path, 0600); err != nil { l.Close() diff --git a/runtime/v1/shim/client/client_linux.go b/runtime/v1/shim/client/client_linux.go index f8e40846a..15cf50565 100644 --- a/runtime/v1/shim/client/client_linux.go +++ b/runtime/v1/shim/client/client_linux.go @@ -17,10 +17,10 @@ package client import ( + "fmt" "syscall" "github.com/containerd/cgroups" - "github.com/pkg/errors" exec "golang.org/x/sys/execabs" ) @@ -33,12 +33,12 @@ func getSysProcAttr() *syscall.SysProcAttr { func setCgroup(cgroupPath string, cmd *exec.Cmd) error { cg, err := cgroups.Load(cgroups.V1, cgroups.StaticPath(cgroupPath)) if err != nil { - return errors.Wrapf(err, "failed to load cgroup %s", cgroupPath) + return fmt.Errorf("failed to load cgroup %s: %w", cgroupPath, err) } if err := cg.Add(cgroups.Process{ Pid: cmd.Process.Pid, }); err != nil { - return errors.Wrapf(err, "failed to join cgroup %s", cgroupPath) + return fmt.Errorf("failed to join cgroup %s: %w", cgroupPath, err) } return nil } diff --git a/runtime/v1/shim/service.go b/runtime/v1/shim/service.go index c0b32dcca..a08757d0a 100644 --- a/runtime/v1/shim/service.go +++ b/runtime/v1/shim/service.go @@ -45,7 +45,6 @@ import ( "github.com/containerd/typeurl" ptypes "github.com/gogo/protobuf/types" specs "github.com/opencontainers/runtime-spec/specs-go" - "github.com/pkg/errors" "github.com/sirupsen/logrus" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" @@ -91,7 +90,7 @@ func NewService(config Config, publisher events.Publisher) (*Service, error) { } go s.processExits() if err := s.initPlatform(); err != nil { - return nil, errors.Wrap(err, "failed to initialized platform behavior") + return nil, fmt.Errorf("failed to initialized platform behavior: %w", err) } go s.forward(publisher) return s, nil @@ -160,7 +159,7 @@ func (s *Service) Create(ctx context.Context, r *shimapi.CreateTaskRequest) (_ * Options: rm.Options, } if err := m.Mount(rootfs); err != nil { - return nil, errors.Wrapf(err, "failed to mount rootfs component %v", m) + return nil, fmt.Errorf("failed to mount rootfs component %v: %w", m, err) } } @@ -297,7 +296,7 @@ func (s *Service) ResizePty(ctx context.Context, r *shimapi.ResizePtyRequest) (* p := s.processes[r.ID] s.mu.Unlock() if p == nil { - return nil, errors.Errorf("process does not exist %s", r.ID) + return nil, fmt.Errorf("process does not exist %s", r.ID) } if err := p.Resize(ws); err != nil { return nil, errdefs.ToGRPC(err) @@ -411,7 +410,7 @@ func (s *Service) ListPids(ctx context.Context, r *shimapi.ListPidsRequest) (*sh } a, err := typeurl.MarshalAny(d) if err != nil { - return nil, errors.Wrapf(err, "failed to marshal process %d info", pid) + return nil, fmt.Errorf("failed to marshal process %d info: %w", pid, err) } pInfo.Info = a break @@ -432,7 +431,7 @@ func (s *Service) CloseIO(ctx context.Context, r *shimapi.CloseIORequest) (*ptyp } if stdin := p.Stdin(); stdin != nil { if err := stdin.Close(); err != nil { - return nil, errors.Wrap(err, "close stdin") + return nil, fmt.Errorf("close stdin: %w", err) } } return empty, nil diff --git a/runtime/v1/shim/service_linux.go b/runtime/v1/shim/service_linux.go index c0950049d..499490601 100644 --- a/runtime/v1/shim/service_linux.go +++ b/runtime/v1/shim/service_linux.go @@ -18,6 +18,8 @@ package shim import ( "context" + "errors" + "fmt" "io" "net/url" "os" @@ -28,7 +30,6 @@ import ( "github.com/containerd/containerd/namespaces" "github.com/containerd/containerd/pkg/process" "github.com/containerd/fifo" - "github.com/pkg/errors" ) type linuxPlatform struct { @@ -65,7 +66,7 @@ func (p *linuxPlatform) CopyConsole(ctx context.Context, console console.Console uri, err := url.Parse(stdout) if err != nil { - return nil, errors.Wrap(err, "unable to parse stdout uri") + return nil, fmt.Errorf("unable to parse stdout uri: %w", err) } switch uri.Scheme { @@ -89,14 +90,14 @@ func (p *linuxPlatform) CopyConsole(ctx context.Context, console console.Console // Create pipe to be used by logging binary for Stdout outR, outW, err := os.Pipe() if err != nil { - return nil, errors.Wrap(err, "failed to create stdout pipes") + return nil, fmt.Errorf("failed to create stdout pipes: %w", err) } filesToClose = append(filesToClose, outR) // Stderr is created for logging binary but unused when terminal is true serrR, _, err := os.Pipe() if err != nil { - return nil, errors.Wrap(err, "failed to create stderr pipes") + return nil, fmt.Errorf("failed to create stderr pipes: %w", err) } filesToClose = append(filesToClose, serrR) @@ -118,18 +119,18 @@ func (p *linuxPlatform) CopyConsole(ctx context.Context, console console.Console }() if err := cmd.Start(); err != nil { - return nil, errors.Wrap(err, "failed to start logging binary process") + return nil, fmt.Errorf("failed to start logging binary process: %w", err) } // Close our side of the pipe after start if err := w.Close(); err != nil { - return nil, errors.Wrap(err, "failed to close write pipe after start") + return nil, fmt.Errorf("failed to close write pipe after start: %w", err) } // Wait for the logging binary to be ready b := make([]byte, 1) if _, err := r.Read(b); err != nil && err != io.EOF { - return nil, errors.Wrap(err, "failed to read from logging binary") + return nil, fmt.Errorf("failed to read from logging binary: %w", err) } cwg.Wait() @@ -164,7 +165,7 @@ func (p *linuxPlatform) ShutdownConsole(ctx context.Context, cons console.Consol } epollConsole, ok := cons.(*console.EpollConsole) if !ok { - return errors.Errorf("expected EpollConsole, got %#v", cons) + return fmt.Errorf("expected EpollConsole, got %#v", cons) } return epollConsole.Shutdown(p.epoller.CloseConsole) } @@ -181,7 +182,7 @@ func (s *Service) initPlatform() error { } epoller, err := console.NewEpoller() if err != nil { - return errors.Wrap(err, "failed to initialize epoller") + return fmt.Errorf("failed to initialize epoller: %w", err) } s.platform = &linuxPlatform{ epoller: epoller, diff --git a/runtime/v1/shim/service_unix.go b/runtime/v1/shim/service_unix.go index 95f90ea2d..2e6bfb2f0 100644 --- a/runtime/v1/shim/service_unix.go +++ b/runtime/v1/shim/service_unix.go @@ -21,6 +21,7 @@ package shim import ( "context" + "fmt" "io" "net/url" "os" @@ -31,7 +32,6 @@ import ( "github.com/containerd/containerd/namespaces" "github.com/containerd/containerd/pkg/process" "github.com/containerd/fifo" - "github.com/pkg/errors" ) type unixPlatform struct { @@ -55,7 +55,7 @@ func (p *unixPlatform) CopyConsole(ctx context.Context, console console.Console, } uri, err := url.Parse(stdout) if err != nil { - return nil, errors.Wrap(err, "unable to parse stdout uri") + return nil, fmt.Errorf("unable to parse stdout uri: %w", err) } switch uri.Scheme { @@ -78,14 +78,14 @@ func (p *unixPlatform) CopyConsole(ctx context.Context, console console.Console, // Create pipe to be used by logging binary for Stdout outR, outW, err := os.Pipe() if err != nil { - return nil, errors.Wrap(err, "failed to create stdout pipes") + return nil, fmt.Errorf("failed to create stdout pipes: %w", err) } filesToClose = append(filesToClose, outR) // Stderr is created for logging binary but unused when terminal is true serrR, _, err := os.Pipe() if err != nil { - return nil, errors.Wrap(err, "failed to create stderr pipes") + return nil, fmt.Errorf("failed to create stderr pipes: %w", err) } filesToClose = append(filesToClose, serrR) @@ -107,18 +107,18 @@ func (p *unixPlatform) CopyConsole(ctx context.Context, console console.Console, }() if err := cmd.Start(); err != nil { - return nil, errors.Wrap(err, "failed to start logging binary process") + return nil, fmt.Errorf("failed to start logging binary process: %w", err) } // Close our side of the pipe after start if err := w.Close(); err != nil { - return nil, errors.Wrap(err, "failed to close write pipe after start") + return nil, fmt.Errorf("failed to close write pipe after start: %w", err) } // Wait for the logging binary to be ready b := make([]byte, 1) if _, err := r.Read(b); err != nil && err != io.EOF { - return nil, errors.Wrap(err, "failed to read from logging binary") + return nil, fmt.Errorf("failed to read from logging binary: %w", err) } cwg.Wait() diff --git a/runtime/v2/binary.go b/runtime/v2/binary.go index 130f00c58..437334913 100644 --- a/runtime/v2/binary.go +++ b/runtime/v2/binary.go @@ -19,6 +19,7 @@ package v2 import ( "bytes" "context" + "fmt" "io" "os" "path/filepath" @@ -32,7 +33,6 @@ import ( "github.com/containerd/containerd/runtime/v2/task" "github.com/containerd/ttrpc" "github.com/gogo/protobuf/types" - "github.com/pkg/errors" "github.com/sirupsen/logrus" ) @@ -93,7 +93,7 @@ func (b *binary) Start(ctx context.Context, opts *types.Any, onClose func()) (_ }() f, err := openShimLog(shimCtx, b.bundle, client.AnonDialer) if err != nil { - return nil, errors.Wrap(err, "open shim log pipe") + return nil, fmt.Errorf("open shim log pipe: %w", err) } defer func() { if err != nil { @@ -116,7 +116,7 @@ func (b *binary) Start(ctx context.Context, opts *types.Any, onClose func()) (_ }() out, err := cmd.CombinedOutput() if err != nil { - return nil, errors.Wrapf(err, "%s", out) + return nil, fmt.Errorf("%s: %w", out, err) } address := strings.TrimSpace(string(out)) conn, err := client.Connect(address, client.AnonDialer) @@ -177,7 +177,7 @@ func (b *binary) Delete(ctx context.Context) (*runtime.Exit, error) { cmd.Stderr = errb if err := cmd.Run(); err != nil { log.G(ctx).WithField("cmd", cmd).WithError(err).Error("failed to delete") - return nil, errors.Wrapf(err, "%s", errb.String()) + return nil, fmt.Errorf("%s: %w", errb.String(), err) } s := errb.String() if s != "" { diff --git a/runtime/v2/bundle.go b/runtime/v2/bundle.go index 7c47dd268..8152a5277 100644 --- a/runtime/v2/bundle.go +++ b/runtime/v2/bundle.go @@ -25,7 +25,6 @@ import ( "github.com/containerd/containerd/identifiers" "github.com/containerd/containerd/mount" "github.com/containerd/containerd/namespaces" - "github.com/pkg/errors" ) const configFilename = "config.json" @@ -46,7 +45,7 @@ func LoadBundle(ctx context.Context, root, id string) (*Bundle, error) { // NewBundle returns a new bundle on disk func NewBundle(ctx context.Context, root, state, id string, spec []byte) (b *Bundle, err error) { if err := identifiers.Validate(id); err != nil { - return nil, errors.Wrapf(err, "invalid task id %s", id) + return nil, fmt.Errorf("invalid task id %s: %w", id, err) } ns, err := namespaces.NamespaceRequired(ctx) @@ -121,10 +120,10 @@ func (b *Bundle) Delete() error { work, werr := os.Readlink(filepath.Join(b.Path, "work")) rootfs := filepath.Join(b.Path, "rootfs") if err := mount.UnmountAll(rootfs, 0); err != nil { - return errors.Wrapf(err, "unmount rootfs %s", rootfs) + return fmt.Errorf("unmount rootfs %s: %w", rootfs, err) } if err := os.Remove(rootfs); err != nil && !os.IsNotExist(err) { - return errors.Wrap(err, "failed to remove bundle rootfs") + return fmt.Errorf("failed to remove bundle rootfs: %w", err) } err := atomicDelete(b.Path) if err == nil { @@ -141,7 +140,7 @@ func (b *Bundle) Delete() error { return err } } - return errors.Wrapf(err, "failed to remove both bundle and workdir locations: %v", err2) + return fmt.Errorf("failed to remove both bundle and workdir locations: %v: %w", err2, err) } // atomicDelete renames the path to a hidden file before removal diff --git a/runtime/v2/logging/logging_windows.go b/runtime/v2/logging/logging_windows.go index 47b9032d8..67cebaf2f 100644 --- a/runtime/v2/logging/logging_windows.go +++ b/runtime/v2/logging/logging_windows.go @@ -18,6 +18,7 @@ package logging import ( "context" + "errors" "fmt" "net" "os" @@ -25,7 +26,6 @@ import ( "syscall" "github.com/Microsoft/go-winio" - "github.com/pkg/errors" ) // Run the logging driver @@ -53,19 +53,19 @@ func runInternal(fn LoggerFunc) error { return errors.New("'CONTAINER_STDOUT' environment variable missing") } if sout, err = winio.DialPipeContext(ctx, soutPipe); err != nil { - return errors.Wrap(err, "unable to dial stdout pipe") + return fmt.Errorf("unable to dial stdout pipe: %w", err) } if serrPipe, ok = os.LookupEnv("CONTAINER_STDERR"); !ok { return errors.New("'CONTAINER_STDERR' environment variable missing") } if serr, err = winio.DialPipeContext(ctx, serrPipe); err != nil { - return errors.Wrap(err, "unable to dial stderr pipe") + return fmt.Errorf("unable to dial stderr pipe: %w", err) } waitPipe = os.Getenv("CONTAINER_WAIT") if wait, err = winio.DialPipeContext(ctx, waitPipe); err != nil { - return errors.Wrap(err, "unable to dial wait pipe") + return fmt.Errorf("unable to dial wait pipe: %w", err) } config := &Config{ diff --git a/runtime/v2/manager.go b/runtime/v2/manager.go index 73703b802..5b8b579ea 100644 --- a/runtime/v2/manager.go +++ b/runtime/v2/manager.go @@ -37,7 +37,6 @@ import ( shimbinary "github.com/containerd/containerd/runtime/v2/shim" "github.com/containerd/containerd/runtime/v2/task" ocispec "github.com/opencontainers/image-spec/specs-go/v1" - "github.com/pkg/errors" ) // Config for the v2 runtime @@ -185,7 +184,7 @@ func (m *ShimManager) Start(ctx context.Context, id string, opts runtime.CreateO } if err := m.shims.Add(ctx, shimTask); err != nil { - return nil, errors.Wrap(err, "failed to add task") + return nil, fmt.Errorf("failed to add task: %w", err) } return shimTask, nil @@ -224,7 +223,7 @@ func (m *ShimManager) startShim(ctx context.Context, bundle *Bundle, id string, m.shims.Delete(ctx, id) }) if err != nil { - return nil, errors.Wrap(err, "start failed") + return nil, fmt.Errorf("start failed: %w", err) } return shim, nil @@ -283,7 +282,7 @@ func (m *ShimManager) resolveRuntimePath(runtime string) (string, error) { cmdPath = testPath } if cmdPath == "" { - return "", errors.Wrapf(os.ErrNotExist, "runtime %q binary not installed %q", runtime, name) + return "", fmt.Errorf("runtime %q binary not installed %q: %w", runtime, name, os.ErrNotExist) } } } @@ -368,7 +367,7 @@ func (m *TaskManager) ID() string { func (m *TaskManager) Create(ctx context.Context, taskID string, opts runtime.CreateOpts) (runtime.Task, error) { process, err := m.manager.Start(ctx, taskID, opts) if err != nil { - return nil, errors.Wrap(err, "failed to start shim") + return nil, fmt.Errorf("failed to start shim: %w", err) } // Cast to shim task and call task service to create a new container task instance. @@ -393,7 +392,7 @@ func (m *TaskManager) Create(ctx context.Context, taskID string, opts runtime.Cr shim.Close() } - return nil, errors.Wrap(err, "failed to create shim task") + return nil, fmt.Errorf("failed to create shim task: %w", err) } return t, nil diff --git a/runtime/v2/process.go b/runtime/v2/process.go index 497219ae5..84c90c74a 100644 --- a/runtime/v2/process.go +++ b/runtime/v2/process.go @@ -18,13 +18,13 @@ package v2 import ( "context" + "errors" tasktypes "github.com/containerd/containerd/api/types/task" "github.com/containerd/containerd/errdefs" "github.com/containerd/containerd/runtime" "github.com/containerd/containerd/runtime/v2/task" "github.com/containerd/ttrpc" - "github.com/pkg/errors" ) type process struct { diff --git a/runtime/v2/runc/container.go b/runtime/v2/runc/container.go index 11798f168..4da91d691 100644 --- a/runtime/v2/runc/container.go +++ b/runtime/v2/runc/container.go @@ -22,6 +22,7 @@ package runc import ( "context" "encoding/json" + "fmt" "os" "path/filepath" "sync" @@ -37,7 +38,6 @@ import ( "github.com/containerd/containerd/runtime/v2/runc/options" "github.com/containerd/containerd/runtime/v2/task" "github.com/containerd/typeurl" - "github.com/pkg/errors" "github.com/sirupsen/logrus" ) @@ -45,7 +45,7 @@ import ( func NewContainer(ctx context.Context, platform stdio.Platform, r *task.CreateTaskRequest) (_ *Container, retErr error) { ns, err := namespaces.NamespaceRequired(ctx) if err != nil { - return nil, errors.Wrap(err, "create namespace") + return nil, fmt.Errorf("create namespace: %w", err) } var opts options.Options @@ -110,7 +110,7 @@ func NewContainer(ctx context.Context, platform stdio.Platform, r *task.CreateTa Options: rm.Options, } if err := m.Mount(rootfs); err != nil { - return nil, errors.Wrapf(err, "failed to mount rootfs component %v", m) + return nil, fmt.Errorf("failed to mount rootfs component %v: %w", m, err) } } @@ -300,13 +300,13 @@ func (c *Container) Process(id string) (process.Process, error) { defer c.mu.Unlock() if id == "" { if c.process == nil { - return nil, errors.Wrapf(errdefs.ErrFailedPrecondition, "container must be created") + return nil, fmt.Errorf("container must be created: %w", errdefs.ErrFailedPrecondition) } return c.process, nil } p, ok := c.processes[id] if !ok { - return nil, errors.Wrapf(errdefs.ErrNotFound, "process does not exist %s", id) + return nil, fmt.Errorf("process does not exist %s: %w", id, errdefs.ErrNotFound) } return p, nil } @@ -453,7 +453,7 @@ func (c *Container) CloseIO(ctx context.Context, r *task.CloseIORequest) error { } if stdin := p.Stdin(); stdin != nil { if err := stdin.Close(); err != nil { - return errors.Wrap(err, "close stdin") + return fmt.Errorf("close stdin: %w", err) } } return nil diff --git a/runtime/v2/runc/manager/manager_linux.go b/runtime/v2/runc/manager/manager_linux.go index ba574beb0..39e97e9f6 100644 --- a/runtime/v2/runc/manager/manager_linux.go +++ b/runtime/v2/runc/manager/manager_linux.go @@ -19,6 +19,7 @@ package manager import ( "context" "encoding/json" + "fmt" "io/ioutil" "os" "path/filepath" @@ -40,7 +41,6 @@ import ( "github.com/containerd/typeurl" "github.com/gogo/protobuf/proto" ptypes "github.com/gogo/protobuf/types" - "github.com/pkg/errors" exec "golang.org/x/sys/execabs" "golang.org/x/sys/unix" ) @@ -141,19 +141,19 @@ func (manager) Start(ctx context.Context, id string, opts shim.StartOpts) (_ str // grouping functionality where the new process should be run with the same // shim as an existing container if !shim.SocketEaddrinuse(err) { - return "", errors.Wrap(err, "create new shim socket") + return "", fmt.Errorf("create new shim socket: %w", err) } if shim.CanConnect(address) { if err := shim.WriteAddress("address", address); err != nil { - return "", errors.Wrap(err, "write existing socket for shim") + return "", fmt.Errorf("write existing socket for shim: %w", err) } return address, nil } if err := shim.RemoveSocket(address); err != nil { - return "", errors.Wrap(err, "remove pre-existing socket") + return "", fmt.Errorf("remove pre-existing socket: %w", err) } if socket, err = shim.NewSocket(address); err != nil { - return "", errors.Wrap(err, "try create new shim socket 2x") + return "", fmt.Errorf("try create new shim socket 2x: %w", err) } } defer func() { @@ -178,7 +178,7 @@ func (manager) Start(ctx context.Context, id string, opts shim.StartOpts) (_ str goruntime.LockOSThread() if os.Getenv("SCHED_CORE") != "" { if err := schedcore.Create(schedcore.ProcessGroup); err != nil { - return "", errors.Wrap(err, "enable sched core support") + return "", fmt.Errorf("enable sched core support: %w", err) } } @@ -211,20 +211,20 @@ func (manager) Start(ctx context.Context, id string, opts shim.StartOpts) (_ str if cgroups.Mode() == cgroups.Unified { cg, err := cgroupsv2.LoadManager("/sys/fs/cgroup", opts.ShimCgroup) if err != nil { - return "", errors.Wrapf(err, "failed to load cgroup %s", opts.ShimCgroup) + return "", fmt.Errorf("failed to load cgroup %s: %w", opts.ShimCgroup, err) } if err := cg.AddProc(uint64(cmd.Process.Pid)); err != nil { - return "", errors.Wrapf(err, "failed to join cgroup %s", opts.ShimCgroup) + return "", fmt.Errorf("failed to join cgroup %s: %w", opts.ShimCgroup, err) } } else { cg, err := cgroups.Load(cgroups.V1, cgroups.StaticPath(opts.ShimCgroup)) if err != nil { - return "", errors.Wrapf(err, "failed to load cgroup %s", opts.ShimCgroup) + return "", fmt.Errorf("failed to load cgroup %s: %w", opts.ShimCgroup, err) } if err := cg.Add(cgroups.Process{ Pid: cmd.Process.Pid, }); err != nil { - return "", errors.Wrapf(err, "failed to join cgroup %s", opts.ShimCgroup) + return "", fmt.Errorf("failed to join cgroup %s: %w", opts.ShimCgroup, err) } } } @@ -232,7 +232,7 @@ func (manager) Start(ctx context.Context, id string, opts shim.StartOpts) (_ str } } if err := shim.AdjustOOMScore(cmd.Process.Pid); err != nil { - return "", errors.Wrap(err, "failed to adjust OOM score for shim") + return "", fmt.Errorf("failed to adjust OOM score for shim: %w", err) } return address, nil } diff --git a/runtime/v2/runc/platform.go b/runtime/v2/runc/platform.go index 77d050a58..c08d32912 100644 --- a/runtime/v2/runc/platform.go +++ b/runtime/v2/runc/platform.go @@ -21,6 +21,8 @@ package runc import ( "context" + "errors" + "fmt" "io" "net/url" "os" @@ -32,7 +34,6 @@ import ( "github.com/containerd/containerd/pkg/process" "github.com/containerd/containerd/pkg/stdio" "github.com/containerd/fifo" - "github.com/pkg/errors" ) var bufPool = sync.Pool{ @@ -48,7 +49,7 @@ var bufPool = sync.Pool{ func NewPlatform() (stdio.Platform, error) { epoller, err := console.NewEpoller() if err != nil { - return nil, errors.Wrap(err, "failed to initialize epoller") + return nil, fmt.Errorf("failed to initialize epoller: %w", err) } go epoller.Wait() return &linuxPlatform{ @@ -90,7 +91,7 @@ func (p *linuxPlatform) CopyConsole(ctx context.Context, console console.Console uri, err := url.Parse(stdout) if err != nil { - return nil, errors.Wrap(err, "unable to parse stdout uri") + return nil, fmt.Errorf("unable to parse stdout uri: %w", err) } switch uri.Scheme { @@ -114,14 +115,14 @@ func (p *linuxPlatform) CopyConsole(ctx context.Context, console console.Console // Create pipe to be used by logging binary for Stdout outR, outW, err := os.Pipe() if err != nil { - return nil, errors.Wrap(err, "failed to create stdout pipes") + return nil, fmt.Errorf("failed to create stdout pipes: %w", err) } filesToClose = append(filesToClose, outR) // Stderr is created for logging binary but unused when terminal is true serrR, _, err := os.Pipe() if err != nil { - return nil, errors.Wrap(err, "failed to create stderr pipes") + return nil, fmt.Errorf("failed to create stderr pipes: %w", err) } filesToClose = append(filesToClose, serrR) @@ -143,18 +144,18 @@ func (p *linuxPlatform) CopyConsole(ctx context.Context, console console.Console }() if err := cmd.Start(); err != nil { - return nil, errors.Wrap(err, "failed to start logging binary process") + return nil, fmt.Errorf("failed to start logging binary process: %w", err) } // Close our side of the pipe after start if err := w.Close(); err != nil { - return nil, errors.Wrap(err, "failed to close write pipe after start") + return nil, fmt.Errorf("failed to close write pipe after start: %w", err) } // Wait for the logging binary to be ready b := make([]byte, 1) if _, err := r.Read(b); err != nil && err != io.EOF { - return nil, errors.Wrap(err, "failed to read from logging binary") + return nil, fmt.Errorf("failed to read from logging binary: %w", err) } cwg.Wait() @@ -191,7 +192,7 @@ func (p *linuxPlatform) ShutdownConsole(ctx context.Context, cons console.Consol } epollConsole, ok := cons.(*console.EpollConsole) if !ok { - return errors.Errorf("expected EpollConsole, got %#v", cons) + return fmt.Errorf("expected EpollConsole, got %#v", cons) } return epollConsole.Shutdown(p.epoller.CloseConsole) } diff --git a/runtime/v2/runc/task/service.go b/runtime/v2/runc/task/service.go index a1b1c468a..4ad70dad3 100644 --- a/runtime/v2/runc/task/service.go +++ b/runtime/v2/runc/task/service.go @@ -21,6 +21,7 @@ package task import ( "context" + "fmt" "os" "sync" @@ -47,7 +48,6 @@ import ( "github.com/containerd/ttrpc" "github.com/containerd/typeurl" ptypes "github.com/gogo/protobuf/types" - "github.com/pkg/errors" "github.com/sirupsen/logrus" ) @@ -82,7 +82,7 @@ func NewTaskService(ctx context.Context, publisher shim.Publisher, sd shutdown.S go s.processExits() runcC.Monitor = reaper.Default if err := s.initPlatform(); err != nil { - return nil, errors.Wrap(err, "failed to initialized platform behavior") + return nil, fmt.Errorf("failed to initialized platform behavior: %w", err) } go s.forward(ctx, publisher) sd.RegisterCallback(func(context.Context) error { @@ -377,7 +377,7 @@ func (s *service) Pids(ctx context.Context, r *taskAPI.PidsRequest) (*taskAPI.Pi } a, err := typeurl.MarshalAny(d) if err != nil { - return nil, errors.Wrapf(err, "failed to marshal process %d info", pid) + return nil, fmt.Errorf("failed to marshal process %d info: %w", pid, err) } pInfo.Info = a break diff --git a/runtime/v2/runc/v1/service.go b/runtime/v2/runc/v1/service.go index 3609adac7..b630711db 100644 --- a/runtime/v2/runc/v1/service.go +++ b/runtime/v2/runc/v1/service.go @@ -21,6 +21,7 @@ package v1 import ( "context" + "fmt" "io" "os" "path/filepath" @@ -49,7 +50,6 @@ import ( "github.com/containerd/typeurl" "github.com/gogo/protobuf/proto" ptypes "github.com/gogo/protobuf/types" - "github.com/pkg/errors" "github.com/sirupsen/logrus" exec "golang.org/x/sys/execabs" "golang.org/x/sys/unix" @@ -79,7 +79,7 @@ func New(ctx context.Context, id string, publisher shim.Publisher, shutdown func runcC.Monitor = reaper.Default if err := s.initPlatform(); err != nil { shutdown() - return nil, errors.Wrap(err, "failed to initialized platform behavior") + return nil, fmt.Errorf("failed to initialized platform behavior: %w", err) } go s.forward(ctx, publisher) return s, nil @@ -144,7 +144,7 @@ func (s *service) StartShim(ctx context.Context, opts shim.StartOpts) (_ string, return "", err } if err := shim.RemoveSocket(address); err != nil { - return "", errors.Wrap(err, "remove already used socket") + return "", fmt.Errorf("remove already used socket: %w", err) } if socket, err = shim.NewSocket(address); err != nil { return "", err @@ -171,7 +171,7 @@ func (s *service) StartShim(ctx context.Context, opts shim.StartOpts) (_ string, goruntime.LockOSThread() if os.Getenv("SCHED_CORE") != "" { if err := schedcore.Create(schedcore.ProcessGroup); err != nil { - return "", errors.Wrap(err, "enable sched core support") + return "", fmt.Errorf("enable sched core support: %w", err) } } @@ -205,19 +205,19 @@ func (s *service) StartShim(ctx context.Context, opts shim.StartOpts) (_ string, if opts.ShimCgroup != "" { cg, err := cgroups.Load(cgroups.V1, cgroups.StaticPath(opts.ShimCgroup)) if err != nil { - return "", errors.Wrapf(err, "failed to load cgroup %s", opts.ShimCgroup) + return "", fmt.Errorf("failed to load cgroup %s: %w", opts.ShimCgroup, err) } if err := cg.Add(cgroups.Process{ Pid: cmd.Process.Pid, }); err != nil { - return "", errors.Wrapf(err, "failed to join cgroup %s", opts.ShimCgroup) + return "", fmt.Errorf("failed to join cgroup %s: %w", opts.ShimCgroup, err) } } } } } if err := shim.AdjustOOMScore(cmd.Process.Pid); err != nil { - return "", errors.Wrap(err, "failed to adjust OOM score for shim") + return "", fmt.Errorf("failed to adjust OOM score for shim: %w", err) } return address, nil } @@ -502,7 +502,7 @@ func (s *service) Pids(ctx context.Context, r *taskAPI.PidsRequest) (*taskAPI.Pi } a, err := typeurl.MarshalAny(d) if err != nil { - return nil, errors.Wrapf(err, "failed to marshal process %d info", pid) + return nil, fmt.Errorf("failed to marshal process %d info: %w", pid, err) } pInfo.Info = a break diff --git a/runtime/v2/shim.go b/runtime/v2/shim.go index 5d1ddf298..456ffb440 100644 --- a/runtime/v2/shim.go +++ b/runtime/v2/shim.go @@ -18,6 +18,7 @@ package v2 import ( "context" + "errors" "fmt" "io" "os" @@ -39,7 +40,6 @@ import ( "github.com/containerd/ttrpc" ptypes "github.com/gogo/protobuf/types" "github.com/hashicorp/go-multierror" - "github.com/pkg/errors" "github.com/sirupsen/logrus" ) @@ -85,7 +85,7 @@ func loadShim(ctx context.Context, bundle *Bundle, onClose func()) (_ *shimTask, }() f, err := openShimLog(shimCtx, bundle, client.AnonReconnectDialer) if err != nil { - return nil, errors.Wrap(err, "open shim log pipe when reload") + return nil, fmt.Errorf("open shim log pipe when reload: %w", err) } defer func() { if err != nil { @@ -394,7 +394,7 @@ func (s *shimTask) Kill(ctx context.Context, signal uint32, all bool) error { func (s *shimTask) Exec(ctx context.Context, id string, opts runtime.ExecOpts) (runtime.ExecProcess, error) { if err := identifiers.Validate(id); err != nil { - return nil, errors.Wrapf(err, "invalid exec id %s", id) + return nil, fmt.Errorf("invalid exec id %s: %w", id, err) } request := &task.ExecProcessRequest{ ID: s.ID(), diff --git a/runtime/v2/shim/shim.go b/runtime/v2/shim/shim.go index e25626cf3..289b489d6 100644 --- a/runtime/v2/shim/shim.go +++ b/runtime/v2/shim/shim.go @@ -18,6 +18,7 @@ package shim import ( "context" + "errors" "flag" "fmt" "io" @@ -36,7 +37,6 @@ import ( "github.com/containerd/containerd/version" "github.com/containerd/ttrpc" "github.com/gogo/protobuf/proto" - "github.com/pkg/errors" "github.com/sirupsen/logrus" ) @@ -398,7 +398,7 @@ func run(ctx context.Context, manager Manager, initFunc Init, name string, confi result := p.Init(initContext) if err := initialized.Add(result); err != nil { - return errors.Wrapf(err, "could not add plugin result to plugin set") + return fmt.Errorf("could not add plugin result to plugin set: %w", err) } instance, err := result.Instance() @@ -419,12 +419,12 @@ func run(ctx context.Context, manager Manager, initFunc Init, name string, confi server, err := newServer() if err != nil { - return errors.Wrap(err, "failed creating server") + return fmt.Errorf("failed creating server: %w", err) } for _, srv := range ttrpcServices { if err := srv.RegisterTTRPC(server); err != nil { - return errors.Wrap(err, "failed to register service") + return fmt.Errorf("failed to register service: %w", err) } } diff --git a/runtime/v2/shim/shim_unix.go b/runtime/v2/shim/shim_unix.go index cbab4f929..0701fdc6f 100644 --- a/runtime/v2/shim/shim_unix.go +++ b/runtime/v2/shim/shim_unix.go @@ -21,6 +21,7 @@ package shim import ( "context" + "fmt" "io" "net" "os" @@ -29,7 +30,6 @@ import ( "github.com/containerd/containerd/sys/reaper" "github.com/containerd/fifo" - "github.com/pkg/errors" "github.com/sirupsen/logrus" "golang.org/x/sys/unix" ) @@ -60,7 +60,7 @@ func serveListener(path string) (net.Listener, error) { path = "[inherited from parent]" } else { if len(path) > socketPathLimit { - return nil, errors.Errorf("%q: unix socket path too long (> %d)", path, socketPathLimit) + return nil, fmt.Errorf("%q: unix socket path too long (> %d)", path, socketPathLimit) } l, err = net.Listen("unix", path) } diff --git a/runtime/v2/shim/shim_windows.go b/runtime/v2/shim/shim_windows.go index 1ce56d29f..4eef8c9ff 100644 --- a/runtime/v2/shim/shim_windows.go +++ b/runtime/v2/shim/shim_windows.go @@ -18,12 +18,12 @@ package shim import ( "context" + "errors" "io" "net" "os" "github.com/containerd/ttrpc" - "github.com/pkg/errors" "github.com/sirupsen/logrus" ) diff --git a/runtime/v2/shim/util.go b/runtime/v2/shim/util.go index 0db7df5f5..28ac9d1e7 100644 --- a/runtime/v2/shim/util.go +++ b/runtime/v2/shim/util.go @@ -19,6 +19,7 @@ package shim import ( "bytes" "context" + "errors" "fmt" "net" "os" @@ -29,7 +30,6 @@ import ( "github.com/containerd/containerd/namespaces" "github.com/gogo/protobuf/proto" "github.com/gogo/protobuf/types" - "github.com/pkg/errors" exec "golang.org/x/sys/execabs" ) diff --git a/runtime/v2/shim/util_unix.go b/runtime/v2/shim/util_unix.go index cc33d300d..4e2309a80 100644 --- a/runtime/v2/shim/util_unix.go +++ b/runtime/v2/shim/util_unix.go @@ -33,7 +33,6 @@ import ( "github.com/containerd/containerd/defaults" "github.com/containerd/containerd/namespaces" "github.com/containerd/containerd/sys" - "github.com/pkg/errors" ) const ( @@ -54,11 +53,11 @@ func AdjustOOMScore(pid int) error { parent := os.Getppid() score, err := sys.GetOOMScoreAdj(parent) if err != nil { - return errors.Wrap(err, "get parent OOM score") + return fmt.Errorf("get parent OOM score: %w", err) } shimScore := score + 1 if err := sys.AdjustOOMScore(pid, shimScore); err != nil { - return errors.Wrap(err, "set shim OOM score") + return fmt.Errorf("set shim OOM score: %w", err) } return nil } @@ -96,7 +95,7 @@ func NewSocket(address string) (*net.UnixListener, error) { if !isAbstract { if err := os.MkdirAll(filepath.Dir(path), 0600); err != nil { - return nil, errors.Wrapf(err, "%s", path) + return nil, fmt.Errorf("%s: %w", path, err) } } l, err := net.Listen("unix", path) diff --git a/runtime/v2/shim/util_windows.go b/runtime/v2/shim/util_windows.go index 325c29004..b9042841b 100644 --- a/runtime/v2/shim/util_windows.go +++ b/runtime/v2/shim/util_windows.go @@ -18,13 +18,13 @@ package shim import ( "context" + "fmt" "net" "os" "syscall" "time" winio "github.com/Microsoft/go-winio" - "github.com/pkg/errors" ) const shimBinaryFormat = "containerd-shim-%s-%s.exe" @@ -40,9 +40,9 @@ func AnonReconnectDialer(address string, timeout time.Duration) (net.Conn, error c, err := winio.DialPipeContext(ctx, address) if os.IsNotExist(err) { - return nil, errors.Wrap(os.ErrNotExist, "npipe not found on reconnect") + return nil, fmt.Errorf("npipe not found on reconnect: %w", os.ErrNotExist) } else if err == context.DeadlineExceeded { - return nil, errors.Wrapf(err, "timed out waiting for npipe %s", address) + return nil, fmt.Errorf("timed out waiting for npipe %s: %w", address, err) } else if err != nil { return nil, err } @@ -65,14 +65,14 @@ func AnonDialer(address string, timeout time.Duration) (net.Conn, error) { if os.IsNotExist(err) { select { case <-serveTimer.C: - return nil, errors.Wrap(os.ErrNotExist, "pipe not found before timeout") + return nil, fmt.Errorf("pipe not found before timeout: %w", os.ErrNotExist) default: // Wait 10ms for the shim to serve and try again. time.Sleep(10 * time.Millisecond) continue } } else if err == context.DeadlineExceeded { - return nil, errors.Wrapf(err, "timed out waiting for npipe %s", address) + return nil, fmt.Errorf("timed out waiting for npipe %s: %w", address, err) } return nil, err } diff --git a/runtime/v2/shim_unix.go b/runtime/v2/shim_unix.go index ba49dfb1b..9ebfb27c8 100644 --- a/runtime/v2/shim_unix.go +++ b/runtime/v2/shim_unix.go @@ -21,6 +21,7 @@ package v2 import ( "context" + "errors" "io" "net" "os" @@ -28,7 +29,6 @@ import ( "time" "github.com/containerd/fifo" - "github.com/pkg/errors" "golang.org/x/sys/unix" ) diff --git a/runtime/v2/shim_windows.go b/runtime/v2/shim_windows.go index dc007c349..913e5b483 100644 --- a/runtime/v2/shim_windows.go +++ b/runtime/v2/shim_windows.go @@ -18,6 +18,7 @@ package v2 import ( "context" + "errors" "fmt" "io" "net" @@ -26,7 +27,6 @@ import ( "time" "github.com/containerd/containerd/namespaces" - "github.com/pkg/errors" ) type deferredPipeConnection struct { @@ -78,7 +78,7 @@ func openShimLog(ctx context.Context, bundle *Bundle, dialer func(string, time.D time.Second*10, ) if conerr != nil { - dpc.conerr = errors.Wrap(conerr, "failed to connect to shim log") + dpc.conerr = fmt.Errorf("failed to connect to shim log: %w", conerr) } dpc.c = c dpc.wg.Done() diff --git a/runtime/v2/shim_windows_test.go b/runtime/v2/shim_windows_test.go index d7660d597..b496c30f0 100644 --- a/runtime/v2/shim_windows_test.go +++ b/runtime/v2/shim_windows_test.go @@ -18,10 +18,9 @@ package v2 import ( "context" + "errors" "os" "testing" - - "github.com/pkg/errors" ) func TestCheckCopyShimLogError(t *testing.T) { diff --git a/services/containers/service.go b/services/containers/service.go index 77e844908..a8bfd96a6 100644 --- a/services/containers/service.go +++ b/services/containers/service.go @@ -18,13 +18,13 @@ package containers import ( "context" + "errors" "io" api "github.com/containerd/containerd/api/services/containers/v1" "github.com/containerd/containerd/plugin" "github.com/containerd/containerd/services" ptypes "github.com/gogo/protobuf/types" - "github.com/pkg/errors" "google.golang.org/grpc" ) diff --git a/services/content/contentserver/contentserver.go b/services/content/contentserver/contentserver.go index 44b9e4a76..eb5855a47 100644 --- a/services/content/contentserver/contentserver.go +++ b/services/content/contentserver/contentserver.go @@ -18,6 +18,7 @@ package contentserver import ( "context" + "fmt" "io" "sync" @@ -28,7 +29,6 @@ import ( ptypes "github.com/gogo/protobuf/types" digest "github.com/opencontainers/go-digest" ocispec "github.com/opencontainers/image-spec/specs-go/v1" - "github.com/pkg/errors" "github.com/sirupsen/logrus" "google.golang.org/grpc" "google.golang.org/grpc/codes" @@ -383,7 +383,7 @@ func (s *service) Write(session api.Content_WriteServer) (err error) { if req.Offset == 0 && ws.Offset > 0 { if err := wr.Truncate(req.Offset); err != nil { - return errors.Wrapf(err, "truncate failed") + return fmt.Errorf("truncate failed: %w", err) } msg.Offset = req.Offset } diff --git a/services/content/service.go b/services/content/service.go index 43320d54d..4717e62eb 100644 --- a/services/content/service.go +++ b/services/content/service.go @@ -17,11 +17,12 @@ package content import ( + "errors" + "github.com/containerd/containerd/content" "github.com/containerd/containerd/plugin" "github.com/containerd/containerd/services" "github.com/containerd/containerd/services/content/contentserver" - "github.com/pkg/errors" ) func init() { diff --git a/services/diff/local.go b/services/diff/local.go index f05b222db..7d0f07167 100644 --- a/services/diff/local.go +++ b/services/diff/local.go @@ -18,6 +18,7 @@ package diff import ( "context" + "fmt" diffapi "github.com/containerd/containerd/api/services/diff/v1" "github.com/containerd/containerd/api/types" @@ -27,7 +28,6 @@ import ( "github.com/containerd/containerd/plugin" "github.com/containerd/containerd/services" ocispec "github.com/opencontainers/image-spec/specs-go/v1" - "github.com/pkg/errors" "google.golang.org/grpc" ) @@ -65,16 +65,16 @@ func init() { for i, n := range orderedNames { differp, ok := differs[n] if !ok { - return nil, errors.Errorf("needed differ not loaded: %s", n) + return nil, fmt.Errorf("needed differ not loaded: %s", n) } d, err := differp.Instance() if err != nil { - return nil, errors.Wrapf(err, "could not load required differ due plugin init error: %s", n) + return nil, fmt.Errorf("could not load required differ due plugin init error: %s: %w", n, err) } ordered[i], ok = d.(differ) if !ok { - return nil, errors.Errorf("differ does not implement Comparer and Applier interface: %s", n) + return nil, fmt.Errorf("differ does not implement Comparer and Applier interface: %s", n) } } diff --git a/services/diff/service.go b/services/diff/service.go index 369e8f84d..4ac780976 100644 --- a/services/diff/service.go +++ b/services/diff/service.go @@ -18,11 +18,11 @@ package diff import ( "context" + "errors" diffapi "github.com/containerd/containerd/api/services/diff/v1" "github.com/containerd/containerd/plugin" "github.com/containerd/containerd/services" - "github.com/pkg/errors" "google.golang.org/grpc" ) diff --git a/services/events/service.go b/services/events/service.go index ef647582a..3b5f81138 100644 --- a/services/events/service.go +++ b/services/events/service.go @@ -18,6 +18,7 @@ package events import ( "context" + "fmt" api "github.com/containerd/containerd/api/services/events/v1" apittrpc "github.com/containerd/containerd/api/services/ttrpc/events/v1" @@ -27,7 +28,6 @@ import ( "github.com/containerd/containerd/plugin" "github.com/containerd/ttrpc" ptypes "github.com/gogo/protobuf/types" - "github.com/pkg/errors" "google.golang.org/grpc" ) @@ -98,11 +98,11 @@ func (s *service) Subscribe(req *api.SubscribeRequest, srv api.Events_SubscribeS select { case ev := <-eventq: if err := srv.Send(toProto(ev)); err != nil { - return errors.Wrapf(err, "failed sending event to subscriber") + return fmt.Errorf("failed sending event to subscriber: %w", err) } case err := <-errq: if err != nil { - return errors.Wrapf(err, "subscription error") + return fmt.Errorf("subscription error: %w", err) } return nil diff --git a/services/images/service.go b/services/images/service.go index 83d802140..fbfa74953 100644 --- a/services/images/service.go +++ b/services/images/service.go @@ -18,12 +18,12 @@ package images import ( "context" + "errors" imagesapi "github.com/containerd/containerd/api/services/images/v1" "github.com/containerd/containerd/plugin" "github.com/containerd/containerd/services" ptypes "github.com/gogo/protobuf/types" - "github.com/pkg/errors" "google.golang.org/grpc" ) diff --git a/services/introspection/service.go b/services/introspection/service.go index ecabaa913..f161e3525 100644 --- a/services/introspection/service.go +++ b/services/introspection/service.go @@ -18,12 +18,12 @@ package introspection import ( context "context" + "errors" api "github.com/containerd/containerd/api/services/introspection/v1" "github.com/containerd/containerd/plugin" "github.com/containerd/containerd/services" ptypes "github.com/gogo/protobuf/types" - "github.com/pkg/errors" "google.golang.org/grpc" ) diff --git a/services/leases/service.go b/services/leases/service.go index 8dcc9f746..75afa4f15 100644 --- a/services/leases/service.go +++ b/services/leases/service.go @@ -18,8 +18,7 @@ package leases import ( "context" - - "google.golang.org/grpc" + "errors" api "github.com/containerd/containerd/api/services/leases/v1" "github.com/containerd/containerd/errdefs" @@ -27,7 +26,7 @@ import ( "github.com/containerd/containerd/plugin" "github.com/containerd/containerd/services" ptypes "github.com/gogo/protobuf/types" - "github.com/pkg/errors" + "google.golang.org/grpc" ) func init() { diff --git a/services/namespaces/service.go b/services/namespaces/service.go index d3c74a2cb..27d977531 100644 --- a/services/namespaces/service.go +++ b/services/namespaces/service.go @@ -18,12 +18,12 @@ package namespaces import ( "context" + "errors" api "github.com/containerd/containerd/api/services/namespaces/v1" "github.com/containerd/containerd/plugin" "github.com/containerd/containerd/services" ptypes "github.com/gogo/protobuf/types" - "github.com/pkg/errors" "google.golang.org/grpc" ) diff --git a/services/opt/service.go b/services/opt/service.go index 5ac7665f1..76280ba62 100644 --- a/services/opt/service.go +++ b/services/opt/service.go @@ -22,7 +22,6 @@ import ( "path/filepath" "github.com/containerd/containerd/plugin" - "github.com/pkg/errors" ) // Config for the opt manager @@ -46,7 +45,7 @@ func init() { return nil, err } if err := os.Setenv("PATH", fmt.Sprintf("%s%c%s", bin, os.PathListSeparator, os.Getenv("PATH"))); err != nil { - return nil, errors.Wrapf(err, "set binary image directory in path %s", bin) + return nil, fmt.Errorf("set binary image directory in path %s: %w", bin, err) } lib := filepath.Join(path, "lib") @@ -54,7 +53,7 @@ func init() { return nil, err } if err := os.Setenv("LD_LIBRARY_PATH", fmt.Sprintf("%s%c%s", lib, os.PathListSeparator, os.Getenv("LD_LIBRARY_PATH"))); err != nil { - return nil, errors.Wrapf(err, "set binary lib directory in path %s", lib) + return nil, fmt.Errorf("set binary lib directory in path %s: %w", lib, err) } return &manager{}, nil }, diff --git a/services/server/config/config.go b/services/server/config/config.go index f6d759803..49175c9a0 100644 --- a/services/server/config/config.go +++ b/services/server/config/config.go @@ -17,12 +17,12 @@ package config import ( + "fmt" "path/filepath" "strings" "github.com/imdario/mergo" "github.com/pelletier/go-toml" - "github.com/pkg/errors" "github.com/sirupsen/logrus" "github.com/containerd/containerd/errdefs" @@ -104,17 +104,17 @@ func (c *Config) ValidateV2() error { } for _, p := range c.DisabledPlugins { if len(strings.Split(p, ".")) < 4 { - return errors.Errorf("invalid disabled plugin URI %q expect io.containerd.x.vx", p) + return fmt.Errorf("invalid disabled plugin URI %q expect io.containerd.x.vx", p) } } for _, p := range c.RequiredPlugins { if len(strings.Split(p, ".")) < 4 { - return errors.Errorf("invalid required plugin URI %q expect io.containerd.x.vx", p) + return fmt.Errorf("invalid required plugin URI %q expect io.containerd.x.vx", p) } } for p := range c.Plugins { if len(strings.Split(p, ".")) < 4 { - return errors.Errorf("invalid plugin key URI %q expect io.containerd.x.vx", p) + return fmt.Errorf("invalid plugin key URI %q expect io.containerd.x.vx", p) } } return nil @@ -201,7 +201,7 @@ func (bc *BoltConfig) Validate() error { case SharingPolicyShared, SharingPolicyIsolated: return nil default: - return errors.Wrapf(errdefs.ErrInvalidArgument, "unknown policy: %s", bc.ContentSharingPolicy) + return fmt.Errorf("unknown policy: %s: %w", bc.ContentSharingPolicy, errdefs.ErrInvalidArgument) } } @@ -224,7 +224,7 @@ func (c *Config) Decode(p *plugin.Registration) (interface{}, error) { // LoadConfig loads the containerd server config from the provided path func LoadConfig(path string, out *Config) error { if out == nil { - return errors.Wrapf(errdefs.ErrInvalidArgument, "argument out must not be nil") + return fmt.Errorf("argument out must not be nil: %w", errdefs.ErrInvalidArgument) } var ( @@ -266,7 +266,7 @@ func LoadConfig(path string, out *Config) error { err := out.ValidateV2() if err != nil { - return errors.Wrapf(err, "failed to load TOML from %s", path) + return fmt.Errorf("failed to load TOML from %s: %w", path, err) } return nil } @@ -277,11 +277,11 @@ func loadConfigFile(path string) (*Config, error) { file, err := toml.LoadFile(path) if err != nil { - return nil, errors.Wrapf(err, "failed to load TOML: %s", path) + return nil, fmt.Errorf("failed to load TOML: %s: %w", path, err) } if err := file.Unmarshal(config); err != nil { - return nil, errors.Wrap(err, "failed to unmarshal TOML") + return nil, fmt.Errorf("failed to unmarshal TOML: %w", err) } return config, nil diff --git a/services/server/server.go b/services/server/server.go index d56c41764..857cc9c76 100644 --- a/services/server/server.go +++ b/services/server/server.go @@ -20,7 +20,9 @@ import ( "context" "crypto/tls" "crypto/x509" + "errors" "expvar" + "fmt" "io" "net" "net/http" @@ -53,7 +55,6 @@ import ( metrics "github.com/docker/go-metrics" grpc_middleware "github.com/grpc-ecosystem/go-grpc-middleware" grpc_prometheus "github.com/grpc-ecosystem/go-grpc-prometheus" - "github.com/pkg/errors" bolt "go.etcd.io/bbolt" "go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc" "google.golang.org/grpc" @@ -117,7 +118,7 @@ func New(ctx context.Context, config *srvconfig.Config) (*Server, error) { for key, sec := range config.Timeouts { d, err := time.ParseDuration(sec) if err != nil { - return nil, errors.Errorf("unable to parse %s into a time duration", sec) + return nil, fmt.Errorf("unable to parse %s into a time duration", sec) } timeout.Set(key, d) } @@ -165,7 +166,7 @@ func New(ctx context.Context, config *srvconfig.Config) (*Server, error) { caCertPool := x509.NewCertPool() caCert, err := os.ReadFile(config.GRPC.TCPTLSCA) if err != nil { - return nil, errors.Wrap(err, "failed to load CA file") + return nil, fmt.Errorf("failed to load CA file: %w", err) } caCertPool.AppendCertsFromPEM(caCert) tlsConfig.ClientCAs = caCertPool @@ -241,7 +242,7 @@ func New(ctx context.Context, config *srvconfig.Config) (*Server, error) { } result := p.Init(initContext) if err := initialized.Add(result); err != nil { - return nil, errors.Wrapf(err, "could not add plugin result to plugin set") + return nil, fmt.Errorf("could not add plugin result to plugin set: %w", err) } instance, err := result.Instance() @@ -252,7 +253,7 @@ func New(ctx context.Context, config *srvconfig.Config) (*Server, error) { log.G(ctx).WithError(err).Warnf("failed to load plugin %s", id) } if _, ok := required[reqID]; ok { - return nil, errors.Wrapf(err, "load required plugin %s", id) + return nil, fmt.Errorf("load required plugin %s: %w", id, err) } continue } @@ -276,7 +277,7 @@ func New(ctx context.Context, config *srvconfig.Config) (*Server, error) { for id := range required { missing = append(missing, id) } - return nil, errors.Errorf("required plugin %s not included", missing) + return nil, fmt.Errorf("required plugin %s not included", missing) } // register services after all plugins have been initialized @@ -560,7 +561,7 @@ func (pc *proxyClients) getClient(address string) (*grpc.ClientConn, error) { conn, err := grpc.Dial(dialer.DialAddress(address), gopts...) if err != nil { - return nil, errors.Wrapf(err, "failed to dial %q", address) + return nil, fmt.Errorf("failed to dial %q: %w", address, err) } pc.clients[address] = conn diff --git a/services/snapshots/service.go b/services/snapshots/service.go index 1b58ac02c..c6d711cc2 100644 --- a/services/snapshots/service.go +++ b/services/snapshots/service.go @@ -18,6 +18,7 @@ package snapshots import ( "context" + "errors" snapshotsapi "github.com/containerd/containerd/api/services/snapshots/v1" "github.com/containerd/containerd/api/types" @@ -28,7 +29,6 @@ import ( "github.com/containerd/containerd/services" "github.com/containerd/containerd/snapshots" ptypes "github.com/gogo/protobuf/types" - "github.com/pkg/errors" "google.golang.org/grpc" ) diff --git a/services/tasks/local.go b/services/tasks/local.go index 8d327356c..96ed36ca4 100644 --- a/services/tasks/local.go +++ b/services/tasks/local.go @@ -48,7 +48,6 @@ import ( "github.com/containerd/typeurl" ptypes "github.com/gogo/protobuf/types" ocispec "github.com/opencontainers/image-spec/specs-go/v1" - "github.com/pkg/errors" "google.golang.org/grpc" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" @@ -232,11 +231,11 @@ func (l *local) Create(ctx context.Context, r *api.CreateTaskRequest, _ ...grpc. } labels := map[string]string{"runtime": container.Runtime.Name} if err := l.monitor.Monitor(c, labels); err != nil { - return nil, errors.Wrap(err, "monitor task") + return nil, fmt.Errorf("monitor task: %w", err) } pid, err := c.PID(ctx) if err != nil { - return nil, errors.Wrap(err, "failed to get task pid") + return nil, fmt.Errorf("failed to get task pid: %w", err) } return &api.CreateTaskResponse{ ContainerID: r.ContainerID, @@ -464,7 +463,7 @@ func (l *local) ListPids(ctx context.Context, r *api.ListPidsRequest, _ ...grpc. if p.Info != nil { a, err := typeurl.MarshalAny(p.Info) if err != nil { - return nil, errors.Wrapf(err, "failed to marshal process %d info", p.Pid) + return nil, fmt.Errorf("failed to marshal process %d info: %w", p.Pid, err) } pInfo.Info = a } diff --git a/services/tasks/local_unix.go b/services/tasks/local_unix.go index 50a29f612..df381a892 100644 --- a/services/tasks/local_unix.go +++ b/services/tasks/local_unix.go @@ -20,10 +20,11 @@ package tasks import ( + "errors" + "github.com/containerd/containerd/log" "github.com/containerd/containerd/plugin" "github.com/containerd/containerd/runtime" - "github.com/pkg/errors" ) var tasksServiceRequires = []plugin.Type{ diff --git a/services/tasks/rdt_linux.go b/services/tasks/rdt_linux.go index ff798368c..78f0d6979 100644 --- a/services/tasks/rdt_linux.go +++ b/services/tasks/rdt_linux.go @@ -20,10 +20,11 @@ package tasks import ( + "fmt" + "github.com/containerd/containerd/log" "github.com/intel/goresctrl/pkg/rdt" - "github.com/pkg/errors" ) const ( @@ -44,7 +45,7 @@ func initRdt(configFilePath string) error { } if err := rdt.Initialize(ResctrlPrefix); err != nil { - return errors.Wrap(err, "RDT not enabled") + return fmt.Errorf("RDT not enabled: %w", err) } if err := rdt.SetConfigFromFile(configFilePath, true); err != nil { diff --git a/services/tasks/service.go b/services/tasks/service.go index a92a9a07e..f73ffb415 100644 --- a/services/tasks/service.go +++ b/services/tasks/service.go @@ -18,12 +18,12 @@ package tasks import ( "context" + "errors" api "github.com/containerd/containerd/api/services/tasks/v1" "github.com/containerd/containerd/plugin" "github.com/containerd/containerd/services" ptypes "github.com/gogo/protobuf/types" - "github.com/pkg/errors" "google.golang.org/grpc" ) diff --git a/snapshots/benchsuite/benchmark_test.go b/snapshots/benchsuite/benchmark_test.go index 27a3ac7c4..1bc4cc6e9 100644 --- a/snapshots/benchsuite/benchmark_test.go +++ b/snapshots/benchsuite/benchmark_test.go @@ -31,7 +31,6 @@ import ( "time" "github.com/containerd/continuity/fs/fstest" - "github.com/pkg/errors" "github.com/sirupsen/logrus" "gotest.tools/v3/assert" @@ -287,7 +286,7 @@ func updateFile(name string) applierFn { path := filepath.Join(root, name) file, err := os.OpenFile(path, os.O_WRONLY, 0600) if err != nil { - return errors.Wrapf(err, "failed to open %q", path) + return fmt.Errorf("failed to open %q: %w", path, err) } info, err := file.Stat() @@ -305,7 +304,7 @@ func updateFile(name string) applierFn { } if _, err := file.WriteAt(buf, offset); err != nil { - return errors.Wrapf(err, "failed to write %q at offset %d", path, offset) + return fmt.Errorf("failed to write %q at offset %d: %w", path, offset, err) } return file.Close() diff --git a/snapshots/btrfs/btrfs.go b/snapshots/btrfs/btrfs.go index c289b32d4..0c4ba593b 100644 --- a/snapshots/btrfs/btrfs.go +++ b/snapshots/btrfs/btrfs.go @@ -35,7 +35,6 @@ import ( "github.com/containerd/containerd/snapshots" "github.com/containerd/containerd/snapshots/storage" - "github.com/pkg/errors" "github.com/sirupsen/logrus" ) @@ -69,7 +68,7 @@ func NewSnapshotter(root string) (snapshots.Snapshotter, error) { return nil, err } if mnt.FSType != "btrfs" { - return nil, errors.Wrapf(plugin.ErrSkipPlugin, "path %s (%s) must be a btrfs filesystem to be used with the btrfs snapshotter", root, mnt.FSType) + return nil, fmt.Errorf("path %s (%s) must be a btrfs filesystem to be used with the btrfs snapshotter: %w", root, mnt.FSType, plugin.ErrSkipPlugin) } var ( active = filepath.Join(root, "active") @@ -275,7 +274,7 @@ func (b *snapshotter) mounts(dir string, s storage.Snapshot) ([]mount.Mount, err func (b *snapshotter) Commit(ctx context.Context, name, key string, opts ...snapshots.Opt) (err error) { usage, err := b.usage(ctx, key) if err != nil { - return errors.Wrap(err, "failed to compute usage") + return fmt.Errorf("failed to compute usage: %w", err) } ctx, t, err := b.ms.TransactionContext(ctx, true) @@ -292,7 +291,7 @@ func (b *snapshotter) Commit(ctx context.Context, name, key string, opts ...snap id, err := storage.CommitActive(ctx, key, name, usage, opts...) // TODO(stevvooe): Resolve a usage value for btrfs if err != nil { - return errors.Wrap(err, "failed to commit") + return fmt.Errorf("failed to commit: %w", err) } source := filepath.Join(b.root, "active", id) @@ -331,7 +330,7 @@ func (b *snapshotter) Mounts(ctx context.Context, key string) ([]mount.Mount, er s, err := storage.GetSnapshot(ctx, key) t.Rollback() if err != nil { - return nil, errors.Wrap(err, "failed to get active snapshot") + return nil, fmt.Errorf("failed to get active snapshot: %w", err) } dir := filepath.Join(b.root, strings.ToLower(s.Kind.String()), s.ID) @@ -366,7 +365,7 @@ func (b *snapshotter) Remove(ctx context.Context, key string) (err error) { id, k, err := storage.Remove(ctx, key) if err != nil { - return errors.Wrap(err, "failed to remove snapshot") + return fmt.Errorf("failed to remove snapshot: %w", err) } switch k { @@ -389,7 +388,7 @@ func (b *snapshotter) Remove(ctx context.Context, key string) (err error) { } if err := btrfs.SubvolDelete(source); err != nil { - return errors.Wrapf(err, "failed to remove snapshot %v", source) + return fmt.Errorf("failed to remove snapshot %v: %w", source, err) } err = t.Commit() diff --git a/snapshots/btrfs/btrfs_test.go b/snapshots/btrfs/btrfs_test.go index 6f0c82b1c..e7dde3c50 100644 --- a/snapshots/btrfs/btrfs_test.go +++ b/snapshots/btrfs/btrfs_test.go @@ -22,6 +22,8 @@ package btrfs import ( "bytes" "context" + "errors" + "fmt" "os" "path/filepath" "strings" @@ -34,7 +36,6 @@ import ( "github.com/containerd/containerd/snapshots" "github.com/containerd/containerd/snapshots/testsuite" "github.com/containerd/continuity/testutil/loopback" - "github.com/pkg/errors" exec "golang.org/x/sys/execabs" "golang.org/x/sys/unix" ) @@ -66,7 +67,7 @@ func boltSnapshotter(t *testing.T) func(context.Context, string) (snapshots.Snap if out, err := exec.Command(mkbtrfs, loop.Device).CombinedOutput(); err != nil { loop.Close() - return nil, nil, errors.Wrapf(err, "failed to make btrfs filesystem (out: %q)", out) + return nil, nil, fmt.Errorf("failed to make btrfs filesystem (out: %q): %w", out, err) } // sync after a mkfs on the loopback before trying to mount the device unix.Sync() @@ -75,7 +76,7 @@ func boltSnapshotter(t *testing.T) func(context.Context, string) (snapshots.Snap for i := 0; i < 5; i++ { if out, err := exec.Command("mount", loop.Device, root).CombinedOutput(); err != nil { loop.Close() - return nil, nil, errors.Wrapf(err, "failed to mount device %s (out: %q)", loop.Device, out) + return nil, nil, fmt.Errorf("failed to mount device %s (out: %q): %w", loop.Device, out, err) } if i > 0 { @@ -95,7 +96,7 @@ func boltSnapshotter(t *testing.T) func(context.Context, string) (snapshots.Snap unix.Unmount(root, 0) } if snapshotter == nil { - return nil, nil, errors.Wrap(err, "failed to successfully create snapshotter after 5 attempts") + return nil, nil, fmt.Errorf("failed to successfully create snapshotter after 5 attempts: %w", err) } return snapshotter, func() error { @@ -104,7 +105,7 @@ func boltSnapshotter(t *testing.T) func(context.Context, string) (snapshots.Snap } err := mount.UnmountAll(root, unix.MNT_DETACH) if cerr := loop.Close(); cerr != nil { - err = errors.Wrap(cerr, "device cleanup failed") + err = fmt.Errorf("device cleanup failed: %w", cerr) } return err }, nil diff --git a/snapshots/devmapper/config.go b/snapshots/devmapper/config.go index 9e5ed7d84..335832985 100644 --- a/snapshots/devmapper/config.go +++ b/snapshots/devmapper/config.go @@ -26,7 +26,6 @@ import ( "github.com/docker/go-units" "github.com/hashicorp/go-multierror" "github.com/pelletier/go-toml" - "github.com/pkg/errors" ) // Config represents device mapper configuration loaded from file. @@ -68,11 +67,11 @@ func LoadConfig(path string) (*Config, error) { config := Config{} file, err := toml.LoadFile(path) if err != nil { - return nil, errors.Wrapf(err, "failed to open devmapepr TOML: %s", path) + return nil, fmt.Errorf("failed to open devmapepr TOML: %s: %w", path, err) } if err := file.Unmarshal(&config); err != nil { - return nil, errors.Wrap(err, "failed to unmarshal devmapper TOML") + return nil, fmt.Errorf("failed to unmarshal devmapper TOML: %w", err) } if err := config.parse(); err != nil { @@ -89,7 +88,7 @@ func LoadConfig(path string) (*Config, error) { func (c *Config) parse() error { baseImageSize, err := units.RAMInBytes(c.BaseImageSize) if err != nil { - return errors.Wrapf(err, "failed to parse base image size: '%s'", c.BaseImageSize) + return fmt.Errorf("failed to parse base image size: '%s': %w", c.BaseImageSize, err) } if c.FileSystemType == "" { diff --git a/snapshots/devmapper/dmsetup/dmsetup.go b/snapshots/devmapper/dmsetup/dmsetup.go index 7526984da..739178313 100644 --- a/snapshots/devmapper/dmsetup/dmsetup.go +++ b/snapshots/devmapper/dmsetup/dmsetup.go @@ -22,6 +22,7 @@ package dmsetup import ( + "errors" "fmt" "io" "os" @@ -29,7 +30,6 @@ import ( "strings" blkdiscard "github.com/containerd/containerd/snapshots/devmapper/blkdiscard" - "github.com/pkg/errors" exec "golang.org/x/sys/execabs" "golang.org/x/sys/unix" ) @@ -101,7 +101,7 @@ const ( func makeThinPoolMapping(dataFile, metaFile string, blockSizeSectors uint32) (string, error) { dataDeviceSizeBytes, err := BlockDeviceSize(dataFile) if err != nil { - return "", errors.Wrapf(err, "failed to get block device size: %s", dataFile) + return "", fmt.Errorf("failed to get block device size: %s: %w", dataFile, err) } // Thin-pool mapping target has the following format: @@ -259,7 +259,7 @@ func Info(deviceName string) ([]*DeviceInfo, error) { &info.EventNumber) if err != nil { - return nil, errors.Wrapf(err, "failed to parse line %q", line) + return nil, fmt.Errorf("failed to parse line %q: %w", line, err) } // Parse attributes (see "man 8 dmsetup" for details) @@ -309,17 +309,17 @@ func Status(deviceName string) (*DeviceStatus, error) { const MinParseCount = 4 parts := strings.Split(output, " ") if len(parts) < MinParseCount { - return nil, errors.Errorf("failed to parse output: %q", output) + return nil, fmt.Errorf("failed to parse output: %q", output) } status.Offset, err = strconv.ParseInt(parts[0], 10, 64) if err != nil { - return nil, errors.Wrapf(err, "failed to parse offset: %q", parts[0]) + return nil, fmt.Errorf("failed to parse offset: %q: %w", parts[0], err) } status.Length, err = strconv.ParseInt(parts[1], 10, 64) if err != nil { - return nil, errors.Wrapf(err, "failed to parse length: %q", parts[1]) + return nil, fmt.Errorf("failed to parse length: %q: %w", parts[1], err) } status.Target = parts[2] @@ -347,7 +347,7 @@ func BlockDeviceSize(path string) (int64, error) { size, err := f.Seek(0, io.SeekEnd) if err != nil { - return 0, errors.Wrapf(err, "failed to seek on %q", path) + return 0, fmt.Errorf("failed to seek on %q: %w", path, err) } return size, nil } @@ -379,7 +379,7 @@ func dmsetup(args ...string) (string, error) { return "", errno } - return "", errors.Wrapf(err, "dmsetup %s\nerror: %s\n", strings.Join(args, " "), output) + return "", fmt.Errorf("dmsetup %s\nerror: %s\n: %w", strings.Join(args, " "), output, err) } output = strings.TrimSuffix(output, "\n") diff --git a/snapshots/devmapper/metadata.go b/snapshots/devmapper/metadata.go index 730187e2f..6aab53a24 100644 --- a/snapshots/devmapper/metadata.go +++ b/snapshots/devmapper/metadata.go @@ -22,10 +22,10 @@ package devmapper import ( "context" "encoding/json" + "errors" "fmt" "strconv" - "github.com/pkg/errors" bolt "go.etcd.io/bbolt" ) @@ -70,7 +70,7 @@ func NewPoolMetadata(dbfile string) (*PoolMetadata, error) { metadata := &PoolMetadata{db: db} if err := metadata.ensureDatabaseInitialized(); err != nil { - return nil, errors.Wrap(err, "failed to initialize database") + return nil, fmt.Errorf("failed to initialize database: %w", err) } return metadata, nil @@ -102,7 +102,7 @@ func (m *PoolMetadata) AddDevice(ctx context.Context, info *DeviceInfo) error { // See https://github.com/containerd/containerd/pull/3436 for more context. var existing DeviceInfo if err := getObject(devicesBucket, info.Name, &existing); err == nil && existing.State != Faulty { - return errors.Wrapf(ErrAlreadyExists, "device %q is already there %+v", info.Name, existing) + return fmt.Errorf("device %q is already there %+v: %w", info.Name, existing, ErrAlreadyExists) } // Find next available device ID @@ -117,7 +117,7 @@ func (m *PoolMetadata) AddDevice(ctx context.Context, info *DeviceInfo) error { }) if err != nil { - return errors.Wrapf(err, "failed to save metadata for device %q (parent: %q)", info.Name, info.ParentName) + return fmt.Errorf("failed to save metadata for device %q (parent: %q): %w", info.Name, info.ParentName, err) } return nil @@ -213,7 +213,7 @@ func markDeviceID(tx *bolt.Tx, deviceID uint32, state deviceIDState) error { ) if err := bucket.Put([]byte(key), value); err != nil { - return errors.Wrapf(err, "failed to free device id %q", key) + return fmt.Errorf("failed to free device id %q: %w", key, err) } return nil @@ -282,7 +282,7 @@ func (m *PoolMetadata) RemoveDevice(ctx context.Context, name string) error { } if err := bucket.Delete([]byte(name)); err != nil { - return errors.Wrapf(err, "failed to delete device info for %q", name) + return fmt.Errorf("failed to delete device info for %q: %w", name, err) } return markDeviceID(tx, device.DeviceID, deviceFree) @@ -297,7 +297,7 @@ func (m *PoolMetadata) WalkDevices(ctx context.Context, cb func(info *DeviceInfo return bucket.ForEach(func(key, value []byte) error { device := &DeviceInfo{} if err := json.Unmarshal(value, device); err != nil { - return errors.Wrapf(err, "failed to unmarshal %s", key) + return fmt.Errorf("failed to unmarshal %s: %w", key, err) } return cb(device) @@ -340,16 +340,16 @@ func putObject(bucket *bolt.Bucket, key string, obj interface{}, overwrite bool) keyBytes := []byte(key) if !overwrite && bucket.Get(keyBytes) != nil { - return errors.Errorf("object with key %q already exists", key) + return fmt.Errorf("object with key %q already exists", key) } data, err := json.Marshal(obj) if err != nil { - return errors.Wrapf(err, "failed to marshal object with key %q", key) + return fmt.Errorf("failed to marshal object with key %q: %w", key, err) } if err := bucket.Put(keyBytes, data); err != nil { - return errors.Wrapf(err, "failed to insert object with key %q", key) + return fmt.Errorf("failed to insert object with key %q: %w", key, err) } return nil @@ -363,7 +363,7 @@ func getObject(bucket *bolt.Bucket, key string, obj interface{}) error { if obj != nil { if err := json.Unmarshal(data, obj); err != nil { - return errors.Wrapf(err, "failed to unmarshal object with key %q", key) + return fmt.Errorf("failed to unmarshal object with key %q: %w", key, err) } } diff --git a/snapshots/devmapper/metadata_test.go b/snapshots/devmapper/metadata_test.go index 17b2bb2d3..f482fd45c 100644 --- a/snapshots/devmapper/metadata_test.go +++ b/snapshots/devmapper/metadata_test.go @@ -21,12 +21,12 @@ package devmapper import ( "context" + "errors" "os" "path/filepath" "strconv" "testing" - "github.com/pkg/errors" "go.etcd.io/bbolt" "gotest.tools/v3/assert" is "gotest.tools/v3/assert/cmp" diff --git a/snapshots/devmapper/plugin/plugin.go b/snapshots/devmapper/plugin/plugin.go index ad74e1fe1..403fd69d2 100644 --- a/snapshots/devmapper/plugin/plugin.go +++ b/snapshots/devmapper/plugin/plugin.go @@ -20,10 +20,11 @@ package plugin import ( + "errors" + "github.com/containerd/containerd/platforms" "github.com/containerd/containerd/plugin" "github.com/containerd/containerd/snapshots/devmapper" - "github.com/pkg/errors" ) func init() { diff --git a/snapshots/devmapper/pool_device.go b/snapshots/devmapper/pool_device.go index 8a297d0f0..3af80d338 100644 --- a/snapshots/devmapper/pool_device.go +++ b/snapshots/devmapper/pool_device.go @@ -21,12 +21,13 @@ package devmapper import ( "context" + "errors" + "fmt" "path/filepath" "strconv" "time" "github.com/hashicorp/go-multierror" - "github.com/pkg/errors" "golang.org/x/sys/unix" "github.com/containerd/containerd/log" @@ -72,7 +73,7 @@ func NewPoolDevice(ctx context.Context, config *Config) (*PoolDevice, error) { // Make sure pool exists and available poolPath := dmsetup.GetFullDevicePath(config.PoolName) if _, err := dmsetup.Info(poolPath); err != nil { - return nil, errors.Wrapf(err, "failed to query pool %q", poolPath) + return nil, fmt.Errorf("failed to query pool %q: %w", poolPath, err) } poolDevice := &PoolDevice{ @@ -82,7 +83,7 @@ func NewPoolDevice(ctx context.Context, config *Config) (*PoolDevice, error) { } if err := poolDevice.ensureDeviceStates(ctx); err != nil { - return nil, errors.Wrap(err, "failed to check devices state") + return nil, fmt.Errorf("failed to check devices state: %w", err) } return poolDevice, nil @@ -134,7 +135,7 @@ func (p *PoolDevice) ensureDeviceStates(ctx context.Context) error { } return nil }); err != nil { - return errors.Wrap(err, "failed to query devices from metastore") + return fmt.Errorf("failed to query devices from metastore: %w", err) } var result *multierror.Error @@ -175,7 +176,7 @@ func (p *PoolDevice) transition(ctx context.Context, deviceName string, tryingSt }) if uerr != nil { - return errors.Wrapf(uerr, "failed to set device %q state to %q", deviceName, tryingState) + return fmt.Errorf("failed to set device %q state to %q: %w", deviceName, tryingState, uerr) } var result *multierror.Error @@ -293,7 +294,7 @@ func (p *PoolDevice) createDevice(ctx context.Context, info *DeviceInfo) error { if err := p.transition(ctx, info.Name, Creating, Created, func() error { return dmsetup.CreateDevice(p.poolName, info.DeviceID) }); err != nil { - return errors.Wrapf(err, "failed to create new thin device %q (dev: %d)", info.Name, info.DeviceID) + return fmt.Errorf("failed to create new thin device %q (dev: %d): %w", info.Name, info.DeviceID, err) } return nil @@ -304,7 +305,7 @@ func (p *PoolDevice) activateDevice(ctx context.Context, info *DeviceInfo) error if err := p.transition(ctx, info.Name, Activating, Activated, func() error { return dmsetup.ActivateDevice(p.poolName, info.Name, info.DeviceID, info.Size, "") }); err != nil { - return errors.Wrapf(err, "failed to activate new thin device %q (dev: %d)", info.Name, info.DeviceID) + return fmt.Errorf("failed to activate new thin device %q (dev: %d): %w", info.Name, info.DeviceID, err) } return nil @@ -314,7 +315,7 @@ func (p *PoolDevice) activateDevice(ctx context.Context, info *DeviceInfo) error func (p *PoolDevice) CreateSnapshotDevice(ctx context.Context, deviceName string, snapshotName string, virtualSizeBytes uint64) (retErr error) { baseInfo, err := p.metadata.GetDevice(ctx, deviceName) if err != nil { - return errors.Wrapf(err, "failed to query device metadata for %q", deviceName) + return fmt.Errorf("failed to query device metadata for %q: %w", deviceName, err) } snapInfo := &DeviceInfo{ @@ -386,12 +387,13 @@ func (p *PoolDevice) createSnapshot(ctx context.Context, baseInfo, snapInfo *Dev if err := p.transition(ctx, snapInfo.Name, Creating, Created, func() error { return dmsetup.CreateSnapshot(p.poolName, snapInfo.DeviceID, baseInfo.DeviceID) }); err != nil { - return errors.Wrapf(err, - "failed to create snapshot %q (dev: %d) from %q (dev: %d)", + return fmt.Errorf( + "failed to create snapshot %q (dev: %d) from %q (dev: %d): %w", snapInfo.Name, snapInfo.DeviceID, baseInfo.Name, - baseInfo.DeviceID) + baseInfo.DeviceID, err, + ) } return nil @@ -402,7 +404,7 @@ func (p *PoolDevice) SuspendDevice(ctx context.Context, deviceName string) error if err := p.transition(ctx, deviceName, Suspending, Suspended, func() error { return dmsetup.SuspendDevice(deviceName) }); err != nil { - return errors.Wrapf(err, "failed to suspend device %q", deviceName) + return fmt.Errorf("failed to suspend device %q: %w", deviceName, err) } return nil @@ -413,7 +415,7 @@ func (p *PoolDevice) ResumeDevice(ctx context.Context, deviceName string) error if err := p.transition(ctx, deviceName, Resuming, Resumed, func() error { return dmsetup.ResumeDevice(deviceName) }); err != nil { - return errors.Wrapf(err, "failed to resume device %q", deviceName) + return fmt.Errorf("failed to resume device %q: %w", deviceName, err) } return nil @@ -446,13 +448,13 @@ func (p *PoolDevice) DeactivateDevice(ctx context.Context, deviceName string, de } } if err := dmsetup.RemoveDevice(deviceName, opts...); err != nil { - return errors.Wrap(err, "failed to deactivate device") + return fmt.Errorf("failed to deactivate device: %w", err) } return nil }) }); err != nil { - return errors.Wrapf(err, "failed to deactivate device %q", deviceName) + return fmt.Errorf("failed to deactivate device %q: %w", deviceName, err) } return nil @@ -487,7 +489,7 @@ func (p *PoolDevice) IsLoaded(deviceName string) bool { func (p *PoolDevice) GetUsage(deviceName string) (int64, error) { status, err := dmsetup.Status(deviceName) if err != nil { - return 0, errors.Wrapf(err, "can't get status for device %q", deviceName) + return 0, fmt.Errorf("can't get status for device %q: %w", deviceName, err) } if len(status.Params) == 0 { @@ -496,7 +498,7 @@ func (p *PoolDevice) GetUsage(deviceName string) (int64, error) { count, err := strconv.ParseInt(status.Params[0], 10, 64) if err != nil { - return 0, errors.Wrapf(err, "failed to parse status params: %q", status.Params[0]) + return 0, fmt.Errorf("failed to parse status params: %q: %w", status.Params[0], err) } return count * dmsetup.SectorSize, nil @@ -506,7 +508,7 @@ func (p *PoolDevice) GetUsage(deviceName string) (int64, error) { func (p *PoolDevice) RemoveDevice(ctx context.Context, deviceName string) error { info, err := p.metadata.GetDevice(ctx, deviceName) if err != nil { - return errors.Wrapf(err, "can't query metadata for device %q", deviceName) + return fmt.Errorf("can't query metadata for device %q: %w", deviceName, err) } if err := p.DeactivateDevice(ctx, deviceName, false, true); err != nil { @@ -519,7 +521,7 @@ func (p *PoolDevice) RemoveDevice(ctx context.Context, deviceName string) error // Remove record from meta store and free device ID if err := p.metadata.RemoveDevice(ctx, deviceName); err != nil { - return errors.Wrapf(err, "can't remove device %q metadata from store after removal", deviceName) + return fmt.Errorf("can't remove device %q metadata from store after removal: %w", deviceName, err) } return nil @@ -537,7 +539,7 @@ func (p *PoolDevice) deleteDevice(ctx context.Context, info *DeviceInfo) error { return nil }) }); err != nil { - return errors.Wrapf(err, "failed to delete device %q (dev id: %d)", info.Name, info.DeviceID) + return fmt.Errorf("failed to delete device %q (dev id: %d): %w", info.Name, info.DeviceID, err) } return nil @@ -547,7 +549,7 @@ func (p *PoolDevice) deleteDevice(ctx context.Context, info *DeviceInfo) error { func (p *PoolDevice) RemovePool(ctx context.Context) error { deviceNames, err := p.metadata.GetDeviceNames(ctx) if err != nil { - return errors.Wrap(err, "can't query device names") + return fmt.Errorf("can't query device names: %w", err) } var result *multierror.Error @@ -555,12 +557,12 @@ func (p *PoolDevice) RemovePool(ctx context.Context) error { // Deactivate devices if any for _, name := range deviceNames { if err := p.DeactivateDevice(ctx, name, true, true); err != nil { - result = multierror.Append(result, errors.Wrapf(err, "failed to remove %q", name)) + result = multierror.Append(result, fmt.Errorf("failed to remove %q: %w", name, err)) } } if err := dmsetup.RemoveDevice(p.poolName, dmsetup.RemoveWithForce, dmsetup.RemoveWithRetries, dmsetup.RemoveDeferred); err != nil { - result = multierror.Append(result, errors.Wrapf(err, "failed to remove pool %q", p.poolName)) + result = multierror.Append(result, fmt.Errorf("failed to remove pool %q: %w", p.poolName, err)) } return result.ErrorOrNil() diff --git a/snapshots/devmapper/snapshotter.go b/snapshots/devmapper/snapshotter.go index 4a504ac7c..ca9867f49 100644 --- a/snapshots/devmapper/snapshotter.go +++ b/snapshots/devmapper/snapshotter.go @@ -21,6 +21,7 @@ package devmapper import ( "context" + "errors" "fmt" "os" "path/filepath" @@ -34,7 +35,6 @@ import ( "github.com/containerd/containerd/snapshots/devmapper/dmsetup" "github.com/containerd/containerd/snapshots/storage" "github.com/hashicorp/go-multierror" - "github.com/pkg/errors" "github.com/sirupsen/logrus" exec "golang.org/x/sys/execabs" ) @@ -76,12 +76,12 @@ func NewSnapshotter(ctx context.Context, config *Config) (*Snapshotter, error) { var cleanupFn []closeFunc if err := os.MkdirAll(config.RootPath, 0750); err != nil && !os.IsExist(err) { - return nil, errors.Wrapf(err, "failed to create root directory: %s", config.RootPath) + return nil, fmt.Errorf("failed to create root directory: %s: %w", config.RootPath, err) } store, err := storage.NewMetaStore(filepath.Join(config.RootPath, metadataFileName)) if err != nil { - return nil, errors.Wrap(err, "failed to create metastore") + return nil, fmt.Errorf("failed to create metastore: %w", err) } cleanupFn = append(cleanupFn, store.Close) @@ -481,7 +481,7 @@ func mkfs(ctx context.Context, fs fsType, fsOptions string, path string) error { b, err := exec.Command(mkfsCommand, args...).CombinedOutput() out := string(b) if err != nil { - return errors.Wrapf(err, "%s couldn't initialize %q: %s", mkfsCommand, path, out) + return fmt.Errorf("%s couldn't initialize %q: %s: %w", mkfsCommand, path, out, err) } log.G(ctx).Debugf("mkfs:\n%s", out) @@ -539,12 +539,12 @@ func (s *Snapshotter) withTransaction(ctx context.Context, writable bool, fn fun if err != nil || !writable { if terr := trans.Rollback(); terr != nil { log.G(ctx).WithError(terr).Error("failed to rollback transaction") - result = multierror.Append(result, errors.Wrap(terr, "rollback failed")) + result = multierror.Append(result, fmt.Errorf("rollback failed: %w", terr)) } } else { if terr := trans.Commit(); terr != nil { log.G(ctx).WithError(terr).Error("failed to commit transaction") - result = multierror.Append(result, errors.Wrap(terr, "commit failed")) + result = multierror.Append(result, fmt.Errorf("commit failed: %w", terr)) } } diff --git a/snapshots/lcow/lcow.go b/snapshots/lcow/lcow.go index 43511f8ef..8c911c052 100644 --- a/snapshots/lcow/lcow.go +++ b/snapshots/lcow/lcow.go @@ -42,7 +42,6 @@ import ( "github.com/containerd/containerd/snapshots/storage" "github.com/containerd/continuity/fs" ocispec "github.com/opencontainers/image-spec/specs-go/v1" - "github.com/pkg/errors" ) func init() { @@ -80,7 +79,7 @@ func NewSnapshotter(root string) (snapshots.Snapshotter, error) { return nil, err } if strings.ToLower(fsType) != "ntfs" { - return nil, errors.Wrapf(errdefs.ErrInvalidArgument, "%s is not on an NTFS volume - only NTFS volumes are supported", root) + return nil, fmt.Errorf("%s is not on an NTFS volume - only NTFS volumes are supported: %w", root, errdefs.ErrInvalidArgument) } if err := os.MkdirAll(root, 0700); err != nil { @@ -180,7 +179,7 @@ func (s *snapshotter) Mounts(ctx context.Context, key string) ([]mount.Mount, er snapshot, err := storage.GetSnapshot(ctx, key) if err != nil { - return nil, errors.Wrap(err, "failed to get snapshot mount") + return nil, fmt.Errorf("failed to get snapshot mount: %w", err) } return s.mounts(snapshot), nil } @@ -210,7 +209,7 @@ func (s *snapshotter) Commit(ctx context.Context, name, key string, opts ...snap } if _, err = storage.CommitActive(ctx, key, name, snapshots.Usage(usage), opts...); err != nil { - return errors.Wrap(err, "failed to commit snapshot") + return fmt.Errorf("failed to commit snapshot: %w", err) } return t.Commit() @@ -227,7 +226,7 @@ func (s *snapshotter) Remove(ctx context.Context, key string) error { id, _, err := storage.Remove(ctx, key) if err != nil { - return errors.Wrap(err, "failed to remove") + return fmt.Errorf("failed to remove: %w", err) } path := s.getSnapshotDir(id) @@ -241,7 +240,7 @@ func (s *snapshotter) Remove(ctx context.Context, key string) error { // May cause inconsistent data on disk log.G(ctx).WithError(err1).WithField("path", renamed).Error("Failed to rename after failed commit") } - return errors.Wrap(err, "failed to commit") + return fmt.Errorf("failed to commit: %w", err) } if err := os.RemoveAll(renamed); err != nil { @@ -319,7 +318,7 @@ func (s *snapshotter) createSnapshot(ctx context.Context, kind snapshots.Kind, k newSnapshot, err := storage.CreateSnapshot(ctx, kind, key, parent, opts...) if err != nil { - return nil, errors.Wrap(err, "failed to create snapshot") + return nil, fmt.Errorf("failed to create snapshot: %w", err) } if kind == snapshots.KindActive { @@ -385,20 +384,20 @@ func (s *snapshotter) createSnapshot(ctx context.Context, kind snapshots.Kind, k destPath := filepath.Join(snDir, "sandbox.vhdx") dest, err := os.OpenFile(destPath, os.O_RDWR|os.O_CREATE, 0700) if err != nil { - return nil, errors.Wrap(err, "failed to create sandbox.vhdx in snapshot") + return nil, fmt.Errorf("failed to create sandbox.vhdx in snapshot: %w", err) } defer dest.Close() if _, err := io.Copy(dest, scratchSource); err != nil { dest.Close() os.Remove(destPath) - return nil, errors.Wrap(err, "failed to copy cached scratch.vhdx to sandbox.vhdx in snapshot") + return nil, fmt.Errorf("failed to copy cached scratch.vhdx to sandbox.vhdx in snapshot: %w", err) } } } } if err := t.Commit(); err != nil { - return nil, errors.Wrap(err, "commit failed") + return nil, fmt.Errorf("commit failed: %w", err) } return s.mounts(newSnapshot), nil @@ -417,19 +416,19 @@ func (s *snapshotter) handleSharing(ctx context.Context, id, snDir string) error mounts, err := s.Mounts(ctx, key) if err != nil { - return errors.Wrap(err, "failed to get mounts for owner snapshot") + return fmt.Errorf("failed to get mounts for owner snapshot: %w", err) } sandboxPath := filepath.Join(mounts[0].Source, "sandbox.vhdx") linkPath := filepath.Join(snDir, "sandbox.vhdx") if _, err := os.Stat(sandboxPath); err != nil { - return errors.Wrap(err, "failed to find sandbox.vhdx in snapshot directory") + return fmt.Errorf("failed to find sandbox.vhdx in snapshot directory: %w", err) } // We've found everything we need, now just make a symlink in our new snapshot to the // sandbox.vhdx in the scratch we're asking to share. if err := os.Symlink(sandboxPath, linkPath); err != nil { - return errors.Wrap(err, "failed to create symlink for sandbox scratch space") + return fmt.Errorf("failed to create symlink for sandbox scratch space: %w", err) } return nil } @@ -452,7 +451,7 @@ func (s *snapshotter) openOrCreateScratch(ctx context.Context, sizeGB int, scrat scratchSource, err := os.OpenFile(scratchFinalPath, os.O_RDONLY, 0700) if err != nil { if !os.IsNotExist(err) { - return nil, errors.Wrapf(err, "failed to open vhd %s for read", vhdFileName) + return nil, fmt.Errorf("failed to open vhd %s for read: %w", vhdFileName, err) } log.G(ctx).Debugf("vhdx %s not found, creating a new one", vhdFileName) @@ -478,16 +477,16 @@ func (s *snapshotter) openOrCreateScratch(ctx context.Context, sizeGB int, scrat if err := rhcs.CreateScratchWithOpts(ctx, scratchTempPath, &opt); err != nil { os.Remove(scratchTempPath) - return nil, errors.Wrapf(err, "failed to create '%s' temp file", scratchTempName) + return nil, fmt.Errorf("failed to create '%s' temp file: %w", scratchTempName, err) } if err := os.Rename(scratchTempPath, scratchFinalPath); err != nil { os.Remove(scratchTempPath) - return nil, errors.Wrapf(err, "failed to rename '%s' temp file to 'scratch.vhdx'", scratchTempName) + return nil, fmt.Errorf("failed to rename '%s' temp file to 'scratch.vhdx': %w", scratchTempName, err) } scratchSource, err = os.OpenFile(scratchFinalPath, os.O_RDONLY, 0700) if err != nil { os.Remove(scratchFinalPath) - return nil, errors.Wrap(err, "failed to open scratch.vhdx for read after creation") + return nil, fmt.Errorf("failed to open scratch.vhdx for read after creation: %w", err) } } else { log.G(ctx).Debugf("scratch vhd %s was already present. Retrieved from cache", vhdFileName) diff --git a/snapshots/native/native.go b/snapshots/native/native.go index f3d33afa0..33578fd14 100644 --- a/snapshots/native/native.go +++ b/snapshots/native/native.go @@ -18,6 +18,7 @@ package native import ( "context" + "fmt" "os" "path/filepath" @@ -27,7 +28,6 @@ import ( "github.com/containerd/containerd/snapshots/storage" "github.com/containerd/continuity/fs" - "github.com/pkg/errors" ) type snapshotter struct { @@ -137,7 +137,7 @@ func (o *snapshotter) Mounts(ctx context.Context, key string) ([]mount.Mount, er s, err := storage.GetSnapshot(ctx, key) t.Rollback() if err != nil { - return nil, errors.Wrap(err, "failed to get snapshot mount") + return nil, fmt.Errorf("failed to get snapshot mount: %w", err) } return o.mounts(s), nil } @@ -162,7 +162,7 @@ func (o *snapshotter) Commit(ctx context.Context, name, key string, opts ...snap if rerr := t.Rollback(); rerr != nil { log.G(ctx).WithError(rerr).Warn("failed to rollback transaction") } - return errors.Wrap(err, "failed to commit snapshot") + return fmt.Errorf("failed to commit snapshot: %w", err) } return t.Commit() } @@ -184,14 +184,14 @@ func (o *snapshotter) Remove(ctx context.Context, key string) (err error) { id, _, err := storage.Remove(ctx, key) if err != nil { - return errors.Wrap(err, "failed to remove") + return fmt.Errorf("failed to remove: %w", err) } path := o.getSnapshotDir(id) renamed := filepath.Join(o.root, "snapshots", "rm-"+id) if err := os.Rename(path, renamed); err != nil { if !os.IsNotExist(err) { - return errors.Wrap(err, "failed to rename") + return fmt.Errorf("failed to rename: %w", err) } renamed = "" } @@ -205,7 +205,7 @@ func (o *snapshotter) Remove(ctx context.Context, key string) (err error) { log.G(ctx).WithError(err1).WithField("path", renamed).Error("failed to rename after failed commit") } } - return errors.Wrap(err, "failed to commit") + return fmt.Errorf("failed to commit: %w", err) } if renamed != "" { if err := os.RemoveAll(renamed); err != nil { @@ -235,21 +235,21 @@ func (o *snapshotter) createSnapshot(ctx context.Context, kind snapshots.Kind, k if kind == snapshots.KindActive || parent == "" { td, err = os.MkdirTemp(filepath.Join(o.root, "snapshots"), "new-") if err != nil { - return nil, errors.Wrap(err, "failed to create temp dir") + return nil, fmt.Errorf("failed to create temp dir: %w", err) } if err := os.Chmod(td, 0755); err != nil { - return nil, errors.Wrapf(err, "failed to chmod %s to 0755", td) + return nil, fmt.Errorf("failed to chmod %s to 0755: %w", td, err) } defer func() { if err != nil { if td != "" { if err1 := os.RemoveAll(td); err1 != nil { - err = errors.Wrapf(err, "remove failed: %v", err1) + err = fmt.Errorf("remove failed: %v: %w", err1, err) } } if path != "" { if err1 := os.RemoveAll(path); err1 != nil { - err = errors.Wrapf(err, "failed to remove path: %v", err1) + err = fmt.Errorf("failed to remove path: %v: %w", err1, err) } } } @@ -266,7 +266,7 @@ func (o *snapshotter) createSnapshot(ctx context.Context, kind snapshots.Kind, k if rerr := t.Rollback(); rerr != nil { log.G(ctx).WithError(rerr).Warn("failed to rollback transaction") } - return nil, errors.Wrap(err, "failed to create snapshot") + return nil, fmt.Errorf("failed to create snapshot: %w", err) } if td != "" { @@ -281,7 +281,7 @@ func (o *snapshotter) createSnapshot(ctx context.Context, kind snapshots.Kind, k fs.WithXAttrErrorHandler(xattrErrorHandler), } if err := fs.CopyDir(td, parent, copyDirOpts...); err != nil { - return nil, errors.Wrap(err, "copying of parent failed") + return nil, fmt.Errorf("copying of parent failed: %w", err) } } @@ -290,13 +290,13 @@ func (o *snapshotter) createSnapshot(ctx context.Context, kind snapshots.Kind, k if rerr := t.Rollback(); rerr != nil { log.G(ctx).WithError(rerr).Warn("failed to rollback transaction") } - return nil, errors.Wrap(err, "failed to rename") + return nil, fmt.Errorf("failed to rename: %w", err) } td = "" } if err := t.Commit(); err != nil { - return nil, errors.Wrap(err, "commit failed") + return nil, fmt.Errorf("commit failed: %w", err) } return o.mounts(s), nil diff --git a/snapshots/overlay/overlay.go b/snapshots/overlay/overlay.go index b9073724c..26ee5c568 100644 --- a/snapshots/overlay/overlay.go +++ b/snapshots/overlay/overlay.go @@ -33,7 +33,6 @@ import ( "github.com/containerd/containerd/snapshots/overlay/overlayutils" "github.com/containerd/containerd/snapshots/storage" "github.com/containerd/continuity/fs" - "github.com/pkg/errors" "github.com/sirupsen/logrus" ) @@ -231,7 +230,7 @@ func (o *snapshotter) Mounts(ctx context.Context, key string) ([]mount.Mount, er s, err := storage.GetSnapshot(ctx, key) t.Rollback() if err != nil { - return nil, errors.Wrap(err, "failed to get active mount") + return nil, fmt.Errorf("failed to get active mount: %w", err) } return o.mounts(s), nil } @@ -262,7 +261,7 @@ func (o *snapshotter) Commit(ctx context.Context, name, key string, opts ...snap } if _, err = storage.CommitActive(ctx, key, name, snapshots.Usage(usage), opts...); err != nil { - return errors.Wrap(err, "failed to commit snapshot") + return fmt.Errorf("failed to commit snapshot: %w", err) } return t.Commit() } @@ -285,14 +284,14 @@ func (o *snapshotter) Remove(ctx context.Context, key string) (err error) { _, _, err = storage.Remove(ctx, key) if err != nil { - return errors.Wrap(err, "failed to remove") + return fmt.Errorf("failed to remove: %w", err) } if !o.asyncRemove { var removals []string removals, err = o.getCleanupDirectories(ctx, t) if err != nil { - return errors.Wrap(err, "unable to get directories for removal") + return fmt.Errorf("unable to get directories for removal: %w", err) } // Remove directories after the transaction is closed, failures must not @@ -411,7 +410,7 @@ func (o *snapshotter) createSnapshot(ctx context.Context, kind snapshots.Kind, k if path != "" { if err1 := os.RemoveAll(path); err1 != nil { log.G(ctx).WithError(err1).WithField("path", path).Error("failed to reclaim snapshot directory, directory may need removal") - err = errors.Wrapf(err, "failed to remove path: %v", err1) + err = fmt.Errorf("failed to remove path: %v: %w", err1, err) } } } @@ -423,7 +422,7 @@ func (o *snapshotter) createSnapshot(ctx context.Context, kind snapshots.Kind, k if rerr := t.Rollback(); rerr != nil { log.G(ctx).WithError(rerr).Warn("failed to rollback transaction") } - return nil, errors.Wrap(err, "failed to create prepare snapshot dir") + return nil, fmt.Errorf("failed to create prepare snapshot dir: %w", err) } rollback := true defer func() { @@ -436,13 +435,13 @@ func (o *snapshotter) createSnapshot(ctx context.Context, kind snapshots.Kind, k s, err := storage.CreateSnapshot(ctx, kind, key, parent, opts...) if err != nil { - return nil, errors.Wrap(err, "failed to create snapshot") + return nil, fmt.Errorf("failed to create snapshot: %w", err) } if len(s.ParentIDs) > 0 { st, err := os.Stat(o.upperPath(s.ParentIDs[0])) if err != nil { - return nil, errors.Wrap(err, "failed to stat parent") + return nil, fmt.Errorf("failed to stat parent: %w", err) } stat := st.Sys().(*syscall.Stat_t) @@ -451,19 +450,19 @@ func (o *snapshotter) createSnapshot(ctx context.Context, kind snapshots.Kind, k if rerr := t.Rollback(); rerr != nil { log.G(ctx).WithError(rerr).Warn("failed to rollback transaction") } - return nil, errors.Wrap(err, "failed to chown") + return nil, fmt.Errorf("failed to chown: %w", err) } } path = filepath.Join(snapshotDir, s.ID) if err = os.Rename(td, path); err != nil { - return nil, errors.Wrap(err, "failed to rename") + return nil, fmt.Errorf("failed to rename: %w", err) } td = "" rollback = false if err = t.Commit(); err != nil { - return nil, errors.Wrap(err, "commit failed") + return nil, fmt.Errorf("commit failed: %w", err) } return o.mounts(s), nil @@ -472,7 +471,7 @@ func (o *snapshotter) createSnapshot(ctx context.Context, kind snapshots.Kind, k func (o *snapshotter) prepareDirectory(ctx context.Context, snapshotDir string, kind snapshots.Kind) (string, error) { td, err := os.MkdirTemp(snapshotDir, "new-") if err != nil { - return "", errors.Wrap(err, "failed to create temp dir") + return "", fmt.Errorf("failed to create temp dir: %w", err) } if err := os.Mkdir(filepath.Join(td, "fs"), 0755); err != nil { diff --git a/snapshots/overlay/overlayutils/check.go b/snapshots/overlay/overlayutils/check.go index 27bd305cb..c5b93fc57 100644 --- a/snapshots/overlay/overlayutils/check.go +++ b/snapshots/overlay/overlayutils/check.go @@ -28,7 +28,6 @@ import ( "github.com/containerd/containerd/mount" "github.com/containerd/containerd/pkg/userns" "github.com/containerd/continuity/fs" - "github.com/pkg/errors" ) // SupportsMultipleLowerDir checks if the system supports multiple lowerdirs, @@ -63,7 +62,7 @@ func SupportsMultipleLowerDir(d string) error { } dest := filepath.Join(td, "merged") if err := m.Mount(dest); err != nil { - return errors.Wrap(err, "failed to mount overlay") + return fmt.Errorf("failed to mount overlay: %w", err) } if err := mount.UnmountAll(dest, 0); err != nil { log.L.WithError(err).Warnf("Failed to unmount check directory %v", dest) diff --git a/snapshots/storage/bolt.go b/snapshots/storage/bolt.go index 712c71f72..894ac2e02 100644 --- a/snapshots/storage/bolt.go +++ b/snapshots/storage/bolt.go @@ -19,6 +19,7 @@ package storage import ( "context" "encoding/binary" + "errors" "fmt" "strings" "time" @@ -27,7 +28,6 @@ import ( "github.com/containerd/containerd/filters" "github.com/containerd/containerd/metadata/boltutil" "github.com/containerd/containerd/snapshots" - "github.com/pkg/errors" bolt "go.etcd.io/bbolt" ) @@ -100,7 +100,7 @@ func UpdateInfo(ctx context.Context, info snapshots.Info, fieldpaths ...string) err := withBucket(ctx, func(ctx context.Context, bkt, pbkt *bolt.Bucket) error { sbkt := bkt.Bucket([]byte(info.Name)) if sbkt == nil { - return errors.Wrap(errdefs.ErrNotFound, "snapshot does not exist") + return fmt.Errorf("snapshot does not exist: %w", errdefs.ErrNotFound) } if err := readSnapshot(sbkt, nil, &updated); err != nil { return err @@ -122,7 +122,7 @@ func UpdateInfo(ctx context.Context, info snapshots.Info, fieldpaths ...string) case "labels": updated.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 { @@ -181,25 +181,25 @@ func GetSnapshot(ctx context.Context, key string) (s Snapshot, err error) { err = withBucket(ctx, func(ctx context.Context, bkt, pbkt *bolt.Bucket) error { sbkt := bkt.Bucket([]byte(key)) if sbkt == nil { - return errors.Wrap(errdefs.ErrNotFound, "snapshot does not exist") + return fmt.Errorf("snapshot does not exist: %w", errdefs.ErrNotFound) } s.ID = fmt.Sprintf("%d", readID(sbkt)) s.Kind = readKind(sbkt) if s.Kind != snapshots.KindActive && s.Kind != snapshots.KindView { - return errors.Wrapf(errdefs.ErrFailedPrecondition, "requested snapshot %v not active or view", key) + return fmt.Errorf("requested snapshot %v not active or view: %w", key, errdefs.ErrFailedPrecondition) } if parentKey := sbkt.Get(bucketKeyParent); len(parentKey) > 0 { spbkt := bkt.Bucket(parentKey) if spbkt == nil { - return errors.Wrap(errdefs.ErrNotFound, "parent does not exist") + return fmt.Errorf("parent does not exist: %w", errdefs.ErrNotFound) } s.ParentIDs, err = parents(bkt, spbkt, readID(spbkt)) if err != nil { - return errors.Wrap(err, "failed to get parent chain") + return fmt.Errorf("failed to get parent chain: %w", err) } } return nil @@ -216,7 +216,7 @@ func CreateSnapshot(ctx context.Context, kind snapshots.Kind, key, parent string switch kind { case snapshots.KindActive, snapshots.KindView: default: - return Snapshot{}, errors.Wrapf(errdefs.ErrInvalidArgument, "snapshot type %v invalid; only snapshots of type Active or View can be created", kind) + return Snapshot{}, fmt.Errorf("snapshot type %v invalid; only snapshots of type Active or View can be created: %w", kind, errdefs.ErrInvalidArgument) } var base snapshots.Info for _, opt := range opts { @@ -232,24 +232,24 @@ func CreateSnapshot(ctx context.Context, kind snapshots.Kind, key, parent string if parent != "" { spbkt = bkt.Bucket([]byte(parent)) if spbkt == nil { - return errors.Wrapf(errdefs.ErrNotFound, "missing parent %q bucket", parent) + return fmt.Errorf("missing parent %q bucket: %w", parent, errdefs.ErrNotFound) } if readKind(spbkt) != snapshots.KindCommitted { - return errors.Wrapf(errdefs.ErrInvalidArgument, "parent %q is not committed snapshot", parent) + return fmt.Errorf("parent %q is not committed snapshot: %w", parent, errdefs.ErrInvalidArgument) } } sbkt, err := bkt.CreateBucket([]byte(key)) if err != nil { if err == bolt.ErrBucketExists { - err = errors.Wrapf(errdefs.ErrAlreadyExists, "snapshot %v", key) + err = fmt.Errorf("snapshot %v: %w", key, errdefs.ErrAlreadyExists) } return err } id, err := bkt.NextSequence() if err != nil { - return errors.Wrapf(err, "unable to get identifier for snapshot %q", key) + return fmt.Errorf("unable to get identifier for snapshot %q: %w", key, err) } t := time.Now().UTC() @@ -270,12 +270,12 @@ func CreateSnapshot(ctx context.Context, kind snapshots.Kind, key, parent string // Store a backlink from the key to the parent. Store the snapshot name // as the value to allow following the backlink to the snapshot value. if err := pbkt.Put(parentKey(pid, id), []byte(key)); err != nil { - return errors.Wrapf(err, "failed to write parent link for snapshot %q", key) + return fmt.Errorf("failed to write parent link for snapshot %q: %w", key, err) } s.ParentIDs, err = parents(bkt, spbkt, pid) if err != nil { - return errors.Wrapf(err, "failed to get parent chain for snapshot %q", key) + return fmt.Errorf("failed to get parent chain for snapshot %q: %w", key, err) } } @@ -302,33 +302,33 @@ func Remove(ctx context.Context, key string) (string, snapshots.Kind, error) { if err := withBucket(ctx, func(ctx context.Context, bkt, pbkt *bolt.Bucket) error { sbkt := bkt.Bucket([]byte(key)) if sbkt == nil { - return errors.Wrapf(errdefs.ErrNotFound, "snapshot %v", key) + return fmt.Errorf("snapshot %v: %w", key, errdefs.ErrNotFound) } if err := readSnapshot(sbkt, &id, &si); err != nil { - return errors.Wrapf(err, "failed to read snapshot %s", key) + return fmt.Errorf("failed to read snapshot %s: %w", key, err) } if pbkt != nil { k, _ := pbkt.Cursor().Seek(parentPrefixKey(id)) if getParentPrefix(k) == id { - return errors.Wrap(errdefs.ErrFailedPrecondition, "cannot remove snapshot with child") + return fmt.Errorf("cannot remove snapshot with child: %w", errdefs.ErrFailedPrecondition) } if si.Parent != "" { spbkt := bkt.Bucket([]byte(si.Parent)) if spbkt == nil { - return errors.Wrapf(errdefs.ErrNotFound, "snapshot %v", key) + return fmt.Errorf("snapshot %v: %w", key, errdefs.ErrNotFound) } if err := pbkt.Delete(parentKey(readID(spbkt), id)); err != nil { - return errors.Wrap(err, "failed to delete parent link") + return fmt.Errorf("failed to delete parent link: %w", err) } } } if err := bkt.DeleteBucket([]byte(key)); err != nil { - return errors.Wrap(err, "failed to delete snapshot") + return fmt.Errorf("failed to delete snapshot: %w", err) } return nil @@ -362,20 +362,20 @@ func CommitActive(ctx context.Context, key, name string, usage snapshots.Usage, if err == bolt.ErrBucketExists { err = errdefs.ErrAlreadyExists } - return errors.Wrapf(err, "committed snapshot %v", name) + return fmt.Errorf("committed snapshot %v: %w", name, err) } sbkt := bkt.Bucket([]byte(key)) if sbkt == nil { - return errors.Wrapf(errdefs.ErrNotFound, "failed to get active snapshot %q", key) + return fmt.Errorf("failed to get active snapshot %q: %w", key, errdefs.ErrNotFound) } var si snapshots.Info if err := readSnapshot(sbkt, &id, &si); err != nil { - return errors.Wrapf(err, "failed to read active snapshot %q", key) + return fmt.Errorf("failed to read active snapshot %q: %w", key, err) } if si.Kind != snapshots.KindActive { - return errors.Wrapf(errdefs.ErrFailedPrecondition, "snapshot %q is not active", key) + return fmt.Errorf("snapshot %q is not active: %w", key, errdefs.ErrFailedPrecondition) } si.Kind = snapshots.KindCommitted si.Created = time.Now().UTC() @@ -391,18 +391,18 @@ func CommitActive(ctx context.Context, key, name string, usage snapshots.Usage, return err } if err := bkt.DeleteBucket([]byte(key)); err != nil { - return errors.Wrapf(err, "failed to delete active snapshot %q", key) + return fmt.Errorf("failed to delete active snapshot %q: %w", key, err) } if si.Parent != "" { spbkt := bkt.Bucket([]byte(si.Parent)) if spbkt == nil { - return errors.Wrapf(errdefs.ErrNotFound, "missing parent %q of snapshot %q", si.Parent, key) + return fmt.Errorf("missing parent %q of snapshot %q: %w", si.Parent, key, errdefs.ErrNotFound) } pid := readID(spbkt) // Updates parent back link to use new key if err := pbkt.Put(parentKey(pid, id), []byte(name)); err != nil { - return errors.Wrapf(err, "failed to update parent link %q from %q to %q", pid, key, name) + return fmt.Errorf("failed to update parent link %q from %q to %q: %w", pid, key, name, err) } } @@ -441,15 +441,15 @@ func withSnapshotBucket(ctx context.Context, key string, fn func(context.Context } vbkt := tx.Bucket(bucketKeyStorageVersion) if vbkt == nil { - return errors.Wrap(errdefs.ErrNotFound, "bucket does not exist") + return fmt.Errorf("bucket does not exist: %w", errdefs.ErrNotFound) } bkt := vbkt.Bucket(bucketKeySnapshot) if bkt == nil { - return errors.Wrap(errdefs.ErrNotFound, "snapshots bucket does not exist") + return fmt.Errorf("snapshots bucket does not exist: %w", errdefs.ErrNotFound) } bkt = bkt.Bucket([]byte(key)) if bkt == nil { - return errors.Wrap(errdefs.ErrNotFound, "snapshot does not exist") + return fmt.Errorf("snapshot does not exist: %w", errdefs.ErrNotFound) } return fn(ctx, bkt, vbkt.Bucket(bucketKeyParents)) @@ -462,7 +462,7 @@ func withBucket(ctx context.Context, fn func(context.Context, *bolt.Bucket, *bol } bkt := tx.Bucket(bucketKeyStorageVersion) if bkt == nil { - return errors.Wrap(errdefs.ErrNotFound, "bucket does not exist") + return fmt.Errorf("bucket does not exist: %w", errdefs.ErrNotFound) } return fn(ctx, bkt.Bucket(bucketKeySnapshot), bkt.Bucket(bucketKeyParents)) } @@ -475,15 +475,15 @@ func createBucketIfNotExists(ctx context.Context, fn func(context.Context, *bolt bkt, err := tx.CreateBucketIfNotExists(bucketKeyStorageVersion) if err != nil { - return errors.Wrap(err, "failed to create version bucket") + return fmt.Errorf("failed to create version bucket: %w", err) } sbkt, err := bkt.CreateBucketIfNotExists(bucketKeySnapshot) if err != nil { - return errors.Wrap(err, "failed to create snapshots bucket") + return fmt.Errorf("failed to create snapshots bucket: %w", err) } pbkt, err := bkt.CreateBucketIfNotExists(bucketKeyParents) if err != nil { - return errors.Wrap(err, "failed to create parents bucket") + return fmt.Errorf("failed to create parents bucket: %w", err) } return fn(ctx, sbkt, pbkt) } @@ -498,7 +498,7 @@ func parents(bkt, pbkt *bolt.Bucket, parent uint64) (parents []string, err error } pbkt = bkt.Bucket(parentKey) if pbkt == nil { - return nil, errors.Wrap(errdefs.ErrNotFound, "missing parent") + return nil, fmt.Errorf("missing parent: %w", errdefs.ErrNotFound) } parent = readID(pbkt) diff --git a/snapshots/storage/metastore.go b/snapshots/storage/metastore.go index 69ba3ea96..6ba2f15bf 100644 --- a/snapshots/storage/metastore.go +++ b/snapshots/storage/metastore.go @@ -23,10 +23,10 @@ package storage import ( "context" + "fmt" "sync" "github.com/containerd/containerd/snapshots" - "github.com/pkg/errors" bolt "go.etcd.io/bbolt" ) @@ -88,7 +88,7 @@ func (ms *MetaStore) TransactionContext(ctx context.Context, writable bool) (con db, err := bolt.Open(ms.dbfile, 0600, nil) if err != nil { ms.dbL.Unlock() - return ctx, nil, errors.Wrap(err, "failed to open database file") + return ctx, nil, fmt.Errorf("failed to open database file: %w", err) } ms.db = db } @@ -96,7 +96,7 @@ func (ms *MetaStore) TransactionContext(ctx context.Context, writable bool) (con tx, err := ms.db.Begin(writable) if err != nil { - return ctx, nil, errors.Wrap(err, "failed to start transaction") + return ctx, nil, fmt.Errorf("failed to start transaction: %w", err) } ctx = context.WithValue(ctx, transactionKey{}, tx) diff --git a/snapshots/storage/metastore_test.go b/snapshots/storage/metastore_test.go index 8f1af68f0..b3355e863 100644 --- a/snapshots/storage/metastore_test.go +++ b/snapshots/storage/metastore_test.go @@ -18,6 +18,7 @@ package storage import ( "context" + "errors" "fmt" "os" "testing" @@ -26,7 +27,6 @@ import ( "github.com/containerd/containerd/errdefs" "github.com/containerd/containerd/snapshots" "github.com/google/go-cmp/cmp" - "github.com/pkg/errors" "gotest.tools/v3/assert" is "gotest.tools/v3/assert/cmp" ) @@ -147,31 +147,31 @@ func inWriteTransaction(fn testFunc) testFunc { // - "active-5": readonly active with parent "committed-2" func basePopulate(ctx context.Context, ms *MetaStore) error { if _, err := CreateSnapshot(ctx, snapshots.KindActive, "committed-tmp-1", ""); err != nil { - return errors.Wrap(err, "failed to create active") + return fmt.Errorf("failed to create active: %w", err) } if _, err := CommitActive(ctx, "committed-tmp-1", "committed-1", snapshots.Usage{Size: 1}); err != nil { - return errors.Wrap(err, "failed to create active") + return fmt.Errorf("failed to create active: %w", err) } if _, err := CreateSnapshot(ctx, snapshots.KindActive, "committed-tmp-2", "committed-1"); err != nil { - return errors.Wrap(err, "failed to create active") + return fmt.Errorf("failed to create active: %w", err) } if _, err := CommitActive(ctx, "committed-tmp-2", "committed-2", snapshots.Usage{Size: 2}); err != nil { - return errors.Wrap(err, "failed to create active") + return fmt.Errorf("failed to create active: %w", err) } if _, err := CreateSnapshot(ctx, snapshots.KindActive, "active-1", ""); err != nil { - return errors.Wrap(err, "failed to create active") + return fmt.Errorf("failed to create active: %w", err) } if _, err := CreateSnapshot(ctx, snapshots.KindActive, "active-2", "committed-1"); err != nil { - return errors.Wrap(err, "failed to create active") + return fmt.Errorf("failed to create active: %w", err) } if _, err := CreateSnapshot(ctx, snapshots.KindActive, "active-3", "committed-2"); err != nil { - return errors.Wrap(err, "failed to create active") + return fmt.Errorf("failed to create active: %w", err) } if _, err := CreateSnapshot(ctx, snapshots.KindView, "view-1", ""); err != nil { - return errors.Wrap(err, "failed to create active") + return fmt.Errorf("failed to create active: %w", err) } if _, err := CreateSnapshot(ctx, snapshots.KindView, "view-2", "committed-2"); err != nil { - return errors.Wrap(err, "failed to create active") + return fmt.Errorf("failed to create active: %w", err) } return nil } @@ -286,10 +286,10 @@ func testGetSnapshot(ctx context.Context, t *testing.T, ms *MetaStore) { snapshotMap := map[string]Snapshot{} populate := func(ctx context.Context, ms *MetaStore) error { if _, err := CreateSnapshot(ctx, snapshots.KindActive, "committed-tmp-1", ""); err != nil { - return errors.Wrap(err, "failed to create active") + return fmt.Errorf("failed to create active: %w", err) } if _, err := CommitActive(ctx, "committed-tmp-1", "committed-1", snapshots.Usage{}); err != nil { - return errors.Wrap(err, "failed to create active") + return fmt.Errorf("failed to create active: %w", err) } for _, opts := range []struct { @@ -318,7 +318,7 @@ func testGetSnapshot(ctx context.Context, t *testing.T, ms *MetaStore) { } { active, err := CreateSnapshot(ctx, opts.Kind, opts.Name, opts.Parent) if err != nil { - return errors.Wrap(err, "failed to create active") + return fmt.Errorf("failed to create active: %w", err) } snapshotMap[opts.Name] = active } diff --git a/snapshots/testsuite/helpers.go b/snapshots/testsuite/helpers.go index eeed9d2fb..bc3db2c55 100644 --- a/snapshots/testsuite/helpers.go +++ b/snapshots/testsuite/helpers.go @@ -25,22 +25,21 @@ import ( "github.com/containerd/containerd/mount" "github.com/containerd/containerd/snapshots" "github.com/containerd/continuity/fs/fstest" - "github.com/pkg/errors" ) func applyToMounts(m []mount.Mount, work string, a fstest.Applier) (err error) { td, err := os.MkdirTemp(work, "prepare") if err != nil { - return errors.Wrap(err, "failed to create temp dir") + return fmt.Errorf("failed to create temp dir: %w", err) } defer os.RemoveAll(td) if err := mount.All(m, td); err != nil { - return errors.Wrap(err, "failed to mount") + return fmt.Errorf("failed to mount: %w", err) } defer func() { - if err1 := mount.UnmountAll(td, umountflags); err == nil { - err = errors.Wrap(err1, "failed to unmount") + if err1 := mount.UnmountAll(td, umountflags); err1 != nil && err == nil { + err = fmt.Errorf("failed to unmount: %w", err1) } }() @@ -55,15 +54,15 @@ func createSnapshot(ctx context.Context, sn snapshots.Snapshotter, parent, work m, err := sn.Prepare(ctx, prepare, parent, opt) if err != nil { - return "", errors.Wrap(err, "failed to prepare snapshot") + return "", fmt.Errorf("failed to prepare snapshot: %w", err) } if err := applyToMounts(m, work, a); err != nil { - return "", errors.Wrap(err, "failed to apply") + return "", fmt.Errorf("failed to apply: %w", err) } if err := sn.Commit(ctx, n, prepare, opt); err != nil { - return "", errors.Wrap(err, "failed to commit") + return "", fmt.Errorf("failed to commit: %w", err) } return n, nil @@ -72,36 +71,36 @@ func createSnapshot(ctx context.Context, sn snapshots.Snapshotter, parent, work func checkSnapshot(ctx context.Context, sn snapshots.Snapshotter, work, name, check string) (err error) { td, err := os.MkdirTemp(work, "check") if err != nil { - return errors.Wrap(err, "failed to create temp dir") + return fmt.Errorf("failed to create temp dir: %w", err) } defer func() { - if err1 := os.RemoveAll(td); err == nil { - err = errors.Wrapf(err1, "failed to remove temporary directory %s", td) + if err1 := os.RemoveAll(td); err1 != nil && err == nil { + err = fmt.Errorf("failed to remove temporary directory %s: %w", td, err1) } }() view := fmt.Sprintf("%s-view", name) m, err := sn.View(ctx, view, name, opt) if err != nil { - return errors.Wrap(err, "failed to create view") + return fmt.Errorf("failed to create view: %w", err) } defer func() { - if err1 := sn.Remove(ctx, view); err == nil { - err = errors.Wrap(err1, "failed to remove view") + if err1 := sn.Remove(ctx, view); err1 != nil && err == nil { + err = fmt.Errorf("failed to remove view: %w", err1) } }() if err := mount.All(m, td); err != nil { - return errors.Wrap(err, "failed to mount") + return fmt.Errorf("failed to mount: %w", err) } defer func() { - if err1 := mount.UnmountAll(td, umountflags); err == nil { - err = errors.Wrap(err1, "failed to unmount view") + if err1 := mount.UnmountAll(td, umountflags); err1 != nil && err == nil { + err = fmt.Errorf("failed to unmount view: %w", err1) } }() if err := fstest.CheckDirectoryEqual(check, td); err != nil { - return errors.Wrap(err, "check directory failed") + return fmt.Errorf("check directory failed: %w", err) } return nil @@ -113,7 +112,7 @@ func checkSnapshot(ctx context.Context, sn snapshots.Snapshotter, work, name, ch func checkSnapshots(ctx context.Context, sn snapshots.Snapshotter, work string, as ...fstest.Applier) error { td, err := os.MkdirTemp(work, "flat") if err != nil { - return errors.Wrap(err, "failed to create temp dir") + return fmt.Errorf("failed to create temp dir: %w", err) } defer os.RemoveAll(td) @@ -121,15 +120,15 @@ func checkSnapshots(ctx context.Context, sn snapshots.Snapshotter, work string, for i, a := range as { s, err := createSnapshot(ctx, sn, parentID, work, a) if err != nil { - return errors.Wrapf(err, "failed to create snapshot %d", i+1) + return fmt.Errorf("failed to create snapshot %d: %w", i+1, err) } if err := a.Apply(td); err != nil { - return errors.Wrapf(err, "failed to apply to check directory on %d", i+1) + return fmt.Errorf("failed to apply to check directory on %d: %w", i+1, err) } if err := checkSnapshot(ctx, sn, work, s, td); err != nil { - return errors.Wrapf(err, "snapshot check failed on snapshot %d", i+1) + return fmt.Errorf("snapshot check failed on snapshot %d: %w", i+1, err) } parentID = s @@ -141,28 +140,28 @@ func checkSnapshots(ctx context.Context, sn snapshots.Snapshotter, work string, // checkInfo checks that the infos are the same func checkInfo(si1, si2 snapshots.Info) error { if si1.Kind != si2.Kind { - return errors.Errorf("Expected kind %v, got %v", si1.Kind, si2.Kind) + return fmt.Errorf("Expected kind %v, got %v", si1.Kind, si2.Kind) } if si1.Name != si2.Name { - return errors.Errorf("Expected name %v, got %v", si1.Name, si2.Name) + return fmt.Errorf("Expected name %v, got %v", si1.Name, si2.Name) } if si1.Parent != si2.Parent { - return errors.Errorf("Expected Parent %v, got %v", si1.Parent, si2.Parent) + return fmt.Errorf("Expected Parent %v, got %v", si1.Parent, si2.Parent) } if len(si1.Labels) != len(si2.Labels) { - return errors.Errorf("Expected %d labels, got %d", len(si1.Labels), len(si2.Labels)) + return fmt.Errorf("Expected %d labels, got %d", len(si1.Labels), len(si2.Labels)) } for k, l1 := range si1.Labels { l2 := si2.Labels[k] if l1 != l2 { - return errors.Errorf("Expected label %v, got %v", l1, l2) + return fmt.Errorf("Expected label %v, got %v", l1, l2) } } if si1.Created != si2.Created { - return errors.Errorf("Expected Created %v, got %v", si1.Created, si2.Created) + return fmt.Errorf("Expected Created %v, got %v", si1.Created, si2.Created) } if si1.Updated != si2.Updated { - return errors.Errorf("Expected Updated %v, got %v", si1.Updated, si2.Updated) + return fmt.Errorf("Expected Updated %v, got %v", si1.Updated, si2.Updated) } return nil diff --git a/snapshots/windows/windows.go b/snapshots/windows/windows.go index 36bf30d6d..820f9858f 100644 --- a/snapshots/windows/windows.go +++ b/snapshots/windows/windows.go @@ -22,6 +22,7 @@ package windows import ( "context" "encoding/json" + "errors" "fmt" "io" "os" @@ -43,7 +44,6 @@ import ( "github.com/containerd/containerd/snapshots/storage" "github.com/containerd/continuity/fs" ocispec "github.com/opencontainers/image-spec/specs-go/v1" - "github.com/pkg/errors" ) func init() { @@ -77,7 +77,7 @@ func NewSnapshotter(root string) (snapshots.Snapshotter, error) { return nil, err } if strings.ToLower(fsType) != "ntfs" { - return nil, errors.Wrapf(errdefs.ErrInvalidArgument, "%s is not on an NTFS volume - only NTFS volumes are supported", root) + return nil, fmt.Errorf("%s is not on an NTFS volume - only NTFS volumes are supported: %w", root, errdefs.ErrInvalidArgument) } if err := os.MkdirAll(root, 0700); err != nil { @@ -182,7 +182,7 @@ func (s *snapshotter) Mounts(ctx context.Context, key string) ([]mount.Mount, er snapshot, err := storage.GetSnapshot(ctx, key) if err != nil { - return nil, errors.Wrap(err, "failed to get snapshot mount") + return nil, fmt.Errorf("failed to get snapshot mount: %w", err) } return s.mounts(snapshot), nil } @@ -204,7 +204,7 @@ func (s *snapshotter) Commit(ctx context.Context, name, key string, opts ...snap // grab the existing id id, _, _, err := storage.GetInfo(ctx, key) if err != nil { - return errors.Wrapf(err, "failed to get storage info for %s", key) + return fmt.Errorf("failed to get storage info for %s: %w", key, err) } snapshot, err := storage.GetSnapshot(ctx, key) @@ -224,11 +224,11 @@ func (s *snapshotter) Commit(ctx context.Context, name, key string, opts ...snap usage, err := fs.DiskUsage(ctx, path) if err != nil { - return errors.Wrapf(err, "failed to collect disk usage of snapshot storage: %s", path) + return fmt.Errorf("failed to collect disk usage of snapshot storage: %s: %w", path, err) } if _, err := storage.CommitActive(ctx, key, name, snapshots.Usage(usage), opts...); err != nil { - return errors.Wrap(err, "failed to commit snapshot") + return fmt.Errorf("failed to commit snapshot: %w", err) } return t.Commit() } @@ -244,7 +244,7 @@ func (s *snapshotter) Remove(ctx context.Context, key string) error { id, _, err := storage.Remove(ctx, key) if err != nil { - return errors.Wrap(err, "failed to remove") + return fmt.Errorf("failed to remove: %w", err) } path := s.getSnapshotDir(id) @@ -265,11 +265,11 @@ func (s *snapshotter) Remove(ctx context.Context, key string) error { ) if deactivateErr := hcsshim.DeactivateLayer(di, layerID); deactivateErr != nil { - return errors.Wrapf(err, "failed to deactivate layer following failed rename: %s", deactivateErr) + return fmt.Errorf("failed to deactivate layer following failed rename: %s: %w", deactivateErr, err) } if renameErr := os.Rename(path, renamed); renameErr != nil && !os.IsNotExist(renameErr) { - return errors.Wrapf(err, "second rename attempt following detach failed: %s", renameErr) + return fmt.Errorf("second rename attempt following detach failed: %s: %w", renameErr, err) } } @@ -278,7 +278,7 @@ func (s *snapshotter) Remove(ctx context.Context, key string) error { // May cause inconsistent data on disk log.G(ctx).WithError(err1).WithField("path", renamed).Error("Failed to rename after failed commit") } - return errors.Wrap(err, "failed to commit") + return fmt.Errorf("failed to commit: %w", err) } if err := hcsshim.DestroyLayer(s.info, renamedID); err != nil { @@ -356,7 +356,7 @@ func (s *snapshotter) createSnapshot(ctx context.Context, kind snapshots.Kind, k newSnapshot, err := storage.CreateSnapshot(ctx, kind, key, parent, opts...) if err != nil { - return nil, errors.Wrap(err, "failed to create snapshot") + return nil, fmt.Errorf("failed to create snapshot: %w", err) } if kind == snapshots.KindActive { @@ -385,7 +385,7 @@ func (s *snapshotter) createSnapshot(ctx context.Context, kind snapshots.Kind, k if sizeGBstr, ok := snapshotInfo.Labels[rootfsSizeLabel]; ok { i32, err := strconv.ParseInt(sizeGBstr, 10, 32) if err != nil { - return nil, errors.Wrapf(err, "failed to parse label %q=%q", rootfsSizeLabel, sizeGBstr) + return nil, fmt.Errorf("failed to parse label %q=%q: %w", rootfsSizeLabel, sizeGBstr, err) } sizeGB = int(i32) } @@ -398,17 +398,17 @@ func (s *snapshotter) createSnapshot(ctx context.Context, kind snapshots.Kind, k // This has to be run first to avoid clashing with the containers sandbox.vhdx. if makeUVMScratch { if err := s.createUVMScratchLayer(ctx, snDir, parentLayerPaths); err != nil { - return nil, errors.Wrap(err, "failed to make UVM's scratch layer") + return nil, fmt.Errorf("failed to make UVM's scratch layer: %w", err) } } if err := s.createScratchLayer(ctx, snDir, parentLayerPaths, sizeGB); err != nil { - return nil, errors.Wrap(err, "failed to create scratch layer") + return nil, fmt.Errorf("failed to create scratch layer: %w", err) } } } if err := t.Commit(); err != nil { - return nil, errors.Wrap(err, "commit failed") + return nil, fmt.Errorf("commit failed: %w", err) } return s.mounts(newSnapshot), nil @@ -450,7 +450,7 @@ func (s *snapshotter) createScratchLayer(ctx context.Context, snDir string, pare if _, err := os.Stat(templateDiffDisk); os.IsNotExist(err) { // Scratch disk not present so lets make it. if err := computestorage.SetupContainerBaseLayer(ctx, baseLayer, templateBase, templateDiffDisk, 1); err != nil { - return errors.Wrapf(err, "failed to create scratch vhdx at %q", baseLayer) + return fmt.Errorf("failed to create scratch vhdx at %q: %w", baseLayer, err) } } @@ -462,7 +462,7 @@ func (s *snapshotter) createScratchLayer(ctx context.Context, snDir string, pare if expand { gbToByte := 1024 * 1024 * 1024 if err := hcsshim.ExpandSandboxSize(s.info, filepath.Base(snDir), uint64(gbToByte*sizeGB)); err != nil { - return errors.Wrapf(err, "failed to expand sandbox vhdx size to %d GB", sizeGB) + return fmt.Errorf("failed to expand sandbox vhdx size to %d GB: %w", sizeGB, err) } } return nil @@ -476,7 +476,7 @@ func (s *snapshotter) convertScratchToReadOnlyLayer(ctx context.Context, snapsho // temporary, leaving it enabled is OK for now. // https://github.com/containerd/containerd/issues/1681 if err := winio.EnableProcessPrivileges([]string{winio.SeBackupPrivilege, winio.SeRestorePrivilege}); err != nil { - return errors.Wrap(err, "failed to enable necessary privileges") + return fmt.Errorf("failed to enable necessary privileges: %w", err) } parentLayerPaths := s.parentIDsToParentPaths(snapshot.ParentIDs) @@ -488,11 +488,11 @@ func (s *snapshotter) convertScratchToReadOnlyLayer(ctx context.Context, snapsho }() if _, err := ociwclayer.ImportLayerFromTar(ctx, reader, path, parentLayerPaths); err != nil { - return errors.Wrap(err, "failed to reimport snapshot") + return fmt.Errorf("failed to reimport snapshot: %w", err) } if _, err := io.Copy(io.Discard, reader); err != nil { - return errors.Wrap(err, "failed discarding extra data in import stream") + return fmt.Errorf("failed discarding extra data in import stream: %w", err) } // NOTE: We do not delete the sandbox.vhdx here, as that will break later calls to @@ -516,7 +516,7 @@ func (s *snapshotter) createUVMScratchLayer(ctx context.Context, snDir string, p // Make sure base layer has a UtilityVM folder. uvmPath := filepath.Join(baseLayer, "UtilityVM") if _, err := os.Stat(uvmPath); os.IsNotExist(err) { - return errors.Wrapf(err, "failed to find UtilityVM directory in base layer %q", baseLayer) + return fmt.Errorf("failed to find UtilityVM directory in base layer %q: %w", baseLayer, err) } templateDiffDisk := filepath.Join(uvmPath, "SystemTemplate.vhdx") @@ -530,7 +530,7 @@ func (s *snapshotter) createUVMScratchLayer(ctx context.Context, snDir string, p // Move the sandbox.vhdx into a nested vm folder to avoid clashing with a containers sandbox.vhdx. vmScratchDir := filepath.Join(snDir, "vm") if err := os.MkdirAll(vmScratchDir, 0777); err != nil { - return errors.Wrap(err, "failed to make `vm` directory for vm's scratch space") + return fmt.Errorf("failed to make `vm` directory for vm's scratch space: %w", err) } return copyScratchDisk(templateDiffDisk, filepath.Join(vmScratchDir, "sandbox.vhdx")) @@ -539,19 +539,19 @@ func (s *snapshotter) createUVMScratchLayer(ctx context.Context, snDir string, p func copyScratchDisk(source, dest string) error { scratchSource, err := os.OpenFile(source, os.O_RDWR, 0700) if err != nil { - return errors.Wrapf(err, "failed to open %s", source) + return fmt.Errorf("failed to open %s: %w", source, err) } defer scratchSource.Close() f, err := os.OpenFile(dest, os.O_RDWR|os.O_CREATE, 0700) if err != nil { - return errors.Wrap(err, "failed to create sandbox.vhdx in snapshot") + return fmt.Errorf("failed to create sandbox.vhdx in snapshot: %w", err) } defer f.Close() if _, err := io.Copy(f, scratchSource); err != nil { os.Remove(dest) - return errors.Wrapf(err, "failed to copy cached %q to %q in snapshot", source, dest) + return fmt.Errorf("failed to copy cached %q to %q in snapshot: %w", source, dest, err) } return nil } diff --git a/sys/filesys_windows.go b/sys/filesys_windows.go index 1c3cc40ac..87ebacc20 100644 --- a/sys/filesys_windows.go +++ b/sys/filesys_windows.go @@ -17,6 +17,7 @@ package sys import ( + "fmt" "os" "path/filepath" "regexp" @@ -27,7 +28,6 @@ import ( "unsafe" "github.com/Microsoft/hcsshim" - "github.com/pkg/errors" "golang.org/x/sys/windows" ) @@ -268,7 +268,7 @@ func ForceRemoveAll(path string) error { snapshotDir := filepath.Join(path, snapshotPlugin, "snapshots") if stat, err := os.Stat(snapshotDir); err == nil && stat.IsDir() { if err := cleanupWCOWLayers(snapshotDir); err != nil { - return errors.Wrapf(err, "failed to cleanup WCOW layers in %s", snapshotDir) + return fmt.Errorf("failed to cleanup WCOW layers in %s: %w", snapshotDir, err) } } @@ -329,16 +329,16 @@ func cleanupWCOWLayer(layerPath string) error { // ERROR_FLT_INSTANCE_NOT_FOUND is returned if the layer is currently activated but not prepared. if err := hcsshim.UnprepareLayer(info, filepath.Base(layerPath)); err != nil { if hcserror, ok := err.(*hcsshim.HcsError); !ok || (hcserror.Err != windows.ERROR_DEV_NOT_EXIST && hcserror.Err != syscall.Errno(windows.ERROR_FLT_INSTANCE_NOT_FOUND)) { - return errors.Wrapf(err, "failed to unprepare %s", layerPath) + return fmt.Errorf("failed to unprepare %s: %w", layerPath, err) } } if err := hcsshim.DeactivateLayer(info, filepath.Base(layerPath)); err != nil { - return errors.Wrapf(err, "failed to deactivate %s", layerPath) + return fmt.Errorf("failed to deactivate %s: %w", layerPath, err) } if err := hcsshim.DestroyLayer(info, filepath.Base(layerPath)); err != nil { - return errors.Wrapf(err, "failed to destroy %s", layerPath) + return fmt.Errorf("failed to destroy %s: %w", layerPath, err) } return nil diff --git a/sys/reaper/reaper_unix.go b/sys/reaper/reaper_unix.go index a40232606..6c4f13b90 100644 --- a/sys/reaper/reaper_unix.go +++ b/sys/reaper/reaper_unix.go @@ -20,12 +20,13 @@ package reaper import ( + "errors" + "fmt" "sync" "syscall" "time" runc "github.com/containerd/go-runc" - "github.com/pkg/errors" exec "golang.org/x/sys/execabs" "golang.org/x/sys/unix" ) @@ -143,7 +144,7 @@ func (m *Monitor) WaitTimeout(c *exec.Cmd, ec chan runc.Exit, timeout time.Durat select { case <-timer.C: syscall.Kill(c.Process.Pid, syscall.SIGKILL) - return 0, errors.Errorf("timeout %v for cmd(pid=%d): %s, %s", timeout, c.Process.Pid, c.Path, c.Args) + return 0, fmt.Errorf("timeout %v for cmd(pid=%d): %s, %s", timeout, c.Process.Pid, c.Path, c.Args) case res := <-waitCh: return res.status, res.err } diff --git a/sys/socket_unix.go b/sys/socket_unix.go index eb803503e..367e19cad 100644 --- a/sys/socket_unix.go +++ b/sys/socket_unix.go @@ -20,11 +20,11 @@ package sys import ( + "fmt" "net" "os" "path/filepath" - "github.com/pkg/errors" "golang.org/x/sys/unix" ) @@ -32,7 +32,7 @@ import ( func CreateUnixSocket(path string) (net.Listener, error) { // BSDs have a 104 limit if len(path) > 104 { - return nil, errors.Errorf("%q: unix socket path too long (> 104)", path) + return nil, fmt.Errorf("%q: unix socket path too long (> 104)", path) } if err := os.MkdirAll(filepath.Dir(path), 0660); err != nil { return nil, err diff --git a/task.go b/task.go index 4e23fb861..692d92c1d 100644 --- a/task.go +++ b/task.go @@ -20,6 +20,7 @@ import ( "bytes" "context" "encoding/json" + "errors" "fmt" "io" goruntime "runtime" @@ -46,7 +47,6 @@ import ( is "github.com/opencontainers/image-spec/specs-go" v1 "github.com/opencontainers/image-spec/specs-go/v1" specs "github.com/opencontainers/runtime-spec/specs-go" - "github.com/pkg/errors" ) // UnknownExitStatus is returned when containerd is unable to @@ -312,7 +312,7 @@ func (t *task) Delete(ctx context.Context, opts ...ProcessDeleteOpts) (*ExitStat } fallthrough default: - return nil, errors.Wrapf(errdefs.ErrFailedPrecondition, "task must be stopped before deletion: %s", status.Status) + return nil, fmt.Errorf("task must be stopped before deletion: %s: %w", status.Status, errdefs.ErrFailedPrecondition) } if t.io != nil { t.io.Close() @@ -334,7 +334,7 @@ func (t *task) Delete(ctx context.Context, opts ...ProcessDeleteOpts) (*ExitStat func (t *task) Exec(ctx context.Context, id string, spec *specs.Process, ioCreate cio.Creator) (_ Process, err error) { if id == "" { - return nil, errors.Wrapf(errdefs.ErrInvalidArgument, "exec id must not be empty") + return nil, fmt.Errorf("exec id must not be empty: %w", errdefs.ErrInvalidArgument) } i, err := ioCreate(id) if err != nil { @@ -555,7 +555,7 @@ func (t *task) LoadProcess(ctx context.Context, id string, ioAttach cio.Attach) if err != nil { err = errdefs.FromGRPC(err) if errdefs.IsNotFound(err) { - return nil, errors.Wrapf(err, "no running process found") + return nil, fmt.Errorf("no running process found: %w", err) } return nil, err } diff --git a/task_opts.go b/task_opts.go index c2e8437c6..56f3cbad6 100644 --- a/task_opts.go +++ b/task_opts.go @@ -19,6 +19,7 @@ package containerd import ( "context" "encoding/json" + "errors" "fmt" "syscall" @@ -31,7 +32,6 @@ import ( "github.com/containerd/containerd/runtime/v2/runc/options" imagespec "github.com/opencontainers/image-spec/specs-go/v1" "github.com/opencontainers/runtime-spec/specs-go" - "github.com/pkg/errors" ) // NewTaskOpts allows the caller to set options on a new task diff --git a/task_opts_unix.go b/task_opts_unix.go index 639fb7c53..1d5983b62 100644 --- a/task_opts_unix.go +++ b/task_opts_unix.go @@ -21,10 +21,10 @@ package containerd import ( "context" + "errors" "github.com/containerd/containerd/runtime/linux/runctypes" "github.com/containerd/containerd/runtime/v2/runc/options" - "github.com/pkg/errors" ) // WithNoNewKeyring causes tasks not to be created with a new keyring for secret storage. diff --git a/tracing/plugin/otlp.go b/tracing/plugin/otlp.go index e95a78b6b..4a5d1f382 100644 --- a/tracing/plugin/otlp.go +++ b/tracing/plugin/otlp.go @@ -17,11 +17,11 @@ package plugin import ( + "fmt" "io" "github.com/containerd/containerd/log" "github.com/containerd/containerd/plugin" - "github.com/pkg/errors" "go.opentelemetry.io/otel" "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc" "go.opentelemetry.io/otel/propagation" @@ -42,7 +42,7 @@ func init() { InitFn: func(ic *plugin.InitContext) (interface{}, error) { cfg := ic.Config.(*OTLPConfig) if cfg.Endpoint == "" { - return nil, errors.Wrap(plugin.ErrSkipPlugin, "otlp endpoint not set") + return nil, fmt.Errorf("otlp endpoint not set: %w", plugin.ErrSkipPlugin) } dialOpts := []grpc.DialOption{grpc.WithBlock()} if cfg.Insecure { @@ -54,7 +54,7 @@ func init() { otlptracegrpc.WithDialOption(dialOpts...), ) if err != nil { - return nil, errors.Wrap(err, "failed to create otlp exporter") + return nil, fmt.Errorf("failed to create otlp exporter: %w", err) } return sdktrace.NewBatchSpanProcessor(exp), nil }, @@ -103,7 +103,7 @@ func newTracer(ic *plugin.InitContext) (io.Closer, error) { ), ) if err != nil { - return nil, errors.Wrap(err, "failed to create resource") + return nil, fmt.Errorf("failed to create resource: %w", err) } opts := []sdktrace.TracerProviderOption{ @@ -113,7 +113,7 @@ func newTracer(ic *plugin.InitContext) (io.Closer, error) { ls, err := ic.GetByType(plugin.TracingProcessorPlugin) if err != nil { - return nil, errors.Wrap(err, "failed to get tracing processors") + return nil, fmt.Errorf("failed to get tracing processors: %w", err) } procs := make([]sdktrace.SpanProcessor, 0, len(ls)) diff --git a/unpacker.go b/unpacker.go index d9e120dce..719345a1c 100644 --- a/unpacker.go +++ b/unpacker.go @@ -20,6 +20,7 @@ import ( "context" "encoding/base64" "encoding/json" + "errors" "fmt" "math/rand" "sync" @@ -36,7 +37,6 @@ import ( "github.com/opencontainers/go-digest" "github.com/opencontainers/image-spec/identity" ocispec "github.com/opencontainers/image-spec/specs-go/v1" - "github.com/pkg/errors" "github.com/sirupsen/logrus" "golang.org/x/sync/errgroup" "golang.org/x/sync/semaphore" @@ -92,18 +92,18 @@ func (u *unpacker) unpack( var i ocispec.Image if err := json.Unmarshal(p, &i); err != nil { - return errors.Wrap(err, "unmarshal image config") + return fmt.Errorf("unmarshal image config: %w", err) } diffIDs := i.RootFS.DiffIDs if len(layers) != len(diffIDs) { - return errors.Errorf("number of layers and diffIDs don't match: %d != %d", len(layers), len(diffIDs)) + return fmt.Errorf("number of layers and diffIDs don't match: %d != %d", len(layers), len(diffIDs)) } if u.config.CheckPlatformSupported { imgPlatform := platforms.Normalize(ocispec.Platform{OS: i.OS, Architecture: i.Architecture}) snapshotterPlatformMatcher, err := u.c.GetSnapshotterSupportedPlatforms(ctx, u.snapshotter) if err != nil { - return errors.Wrapf(err, "failed to find supported platforms for snapshotter %s", u.snapshotter) + return fmt.Errorf("failed to find supported platforms for snapshotter %s: %w", u.snapshotter, err) } if !snapshotterPlatformMatcher.Match(imgPlatform) { return fmt.Errorf("snapshotter %s does not support platform %s for image %s", u.snapshotter, imgPlatform, config.Digest) @@ -137,7 +137,7 @@ EachLayer: // no need to handle continue } else if !errdefs.IsNotFound(err) { - return errors.Wrapf(err, "failed to stat snapshot %s", chainID) + return fmt.Errorf("failed to stat snapshot %s: %w", chainID, err) } // inherits annotations which are provided as snapshot labels. @@ -161,7 +161,7 @@ EachLayer: if errdefs.IsAlreadyExists(err) { if _, err := sn.Stat(ctx, chainID); err != nil { if !errdefs.IsNotFound(err) { - return errors.Wrapf(err, "failed to stat snapshot %s", chainID) + return fmt.Errorf("failed to stat snapshot %s: %w", chainID, err) } // Try again, this should be rare, log it log.G(ctx).WithField("key", key).WithField("chainid", chainID).Debug("extraction snapshot already exists, chain id not found") @@ -170,14 +170,14 @@ EachLayer: continue EachLayer } } else { - return errors.Wrapf(err, "failed to prepare extraction snapshot %q", key) + return fmt.Errorf("failed to prepare extraction snapshot %q: %w", key, err) } } else { break } } if err != nil { - return errors.Wrap(err, "unable to prepare extraction snapshot") + return fmt.Errorf("unable to prepare extraction snapshot: %w", err) } // Abort the snapshot if commit does not happen @@ -217,11 +217,11 @@ EachLayer: diff, err := a.Apply(ctx, desc, mounts, u.config.ApplyOpts...) if err != nil { abort() - return errors.Wrapf(err, "failed to extract layer %s", diffIDs[i]) + return fmt.Errorf("failed to extract layer %s: %w", diffIDs[i], err) } if diff.Digest != diffIDs[i] { abort() - return errors.Errorf("wrong diff id calculated on extraction %q", diffIDs[i]) + return fmt.Errorf("wrong diff id calculated on extraction %q", diffIDs[i]) } if err = sn.Commit(ctx, chainID, key, opts...); err != nil { @@ -229,7 +229,7 @@ EachLayer: if errdefs.IsAlreadyExists(err) { continue } - return errors.Wrapf(err, "failed to commit snapshot %s", key) + return fmt.Errorf("failed to commit snapshot %s: %w", key, err) } // Set the uncompressed label after the uncompressed diff --git a/vendor/modules.txt b/vendor/modules.txt index 188e93b58..6af6ba8a7 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -337,7 +337,6 @@ github.com/opencontainers/selinux/pkg/pwalk ## explicit github.com/pelletier/go-toml # github.com/pkg/errors v0.9.1 -## explicit github.com/pkg/errors # github.com/pmezard/go-difflib v1.0.0 github.com/pmezard/go-difflib/difflib