errors.go 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. package oc
  2. import (
  3. "errors"
  4. "io"
  5. "net"
  6. "os"
  7. "github.com/containerd/containerd/errdefs"
  8. "google.golang.org/grpc/codes"
  9. "google.golang.org/grpc/status"
  10. )
  11. // todo: break import cycle with "internal/hcs/errors.go" and reference errors defined there
  12. // todo: add errors defined in "internal/guest/gcserror" (Hresult does not implement error)
  13. func toStatusCode(err error) codes.Code {
  14. // checks if err implements GRPCStatus() *"google.golang.org/grpc/status".Status,
  15. // wraps an error defined in "github.com/containerd/containerd/errdefs", or is a
  16. // context timeout or cancelled error
  17. if s, ok := status.FromError(errdefs.ToGRPC(err)); ok {
  18. return s.Code()
  19. }
  20. switch {
  21. // case isAny(err):
  22. // return codes.Cancelled
  23. case isAny(err, os.ErrInvalid):
  24. return codes.InvalidArgument
  25. case isAny(err, os.ErrDeadlineExceeded):
  26. return codes.DeadlineExceeded
  27. case isAny(err, os.ErrNotExist):
  28. return codes.NotFound
  29. case isAny(err, os.ErrExist):
  30. return codes.AlreadyExists
  31. case isAny(err, os.ErrPermission):
  32. return codes.PermissionDenied
  33. // case isAny(err):
  34. // return codes.ResourceExhausted
  35. case isAny(err, os.ErrClosed, net.ErrClosed, io.ErrClosedPipe, io.ErrShortBuffer):
  36. return codes.FailedPrecondition
  37. // case isAny(err):
  38. // return codes.Aborted
  39. // case isAny(err):
  40. // return codes.OutOfRange
  41. // case isAny(err):
  42. // return codes.Unimplemented
  43. case isAny(err, io.ErrNoProgress):
  44. return codes.Internal
  45. // case isAny(err):
  46. // return codes.Unavailable
  47. case isAny(err, io.ErrShortWrite, io.ErrUnexpectedEOF):
  48. return codes.DataLoss
  49. // case isAny(err):
  50. // return codes.Unauthenticated
  51. default:
  52. return codes.Unknown
  53. }
  54. }
  55. // isAny returns true if errors.Is is true for any of the provided errors, errs.
  56. func isAny(err error, errs ...error) bool {
  57. for _, e := range errs {
  58. if errors.Is(err, e) {
  59. return true
  60. }
  61. }
  62. return false
  63. }