...
1 package oc
2
3 import (
4 "errors"
5 "io"
6 "net"
7 "os"
8
9 "github.com/containerd/containerd/errdefs"
10 "google.golang.org/grpc/codes"
11 "google.golang.org/grpc/status"
12 )
13
14
15
16
17 func toStatusCode(err error) codes.Code {
18
19
20
21 if s, ok := status.FromError(errdefs.ToGRPC(err)); ok {
22 return s.Code()
23 }
24
25 switch {
26
27
28 case isAny(err, os.ErrInvalid):
29 return codes.InvalidArgument
30 case isAny(err, os.ErrDeadlineExceeded):
31 return codes.DeadlineExceeded
32 case isAny(err, os.ErrNotExist):
33 return codes.NotFound
34 case isAny(err, os.ErrExist):
35 return codes.AlreadyExists
36 case isAny(err, os.ErrPermission):
37 return codes.PermissionDenied
38
39
40 case isAny(err, os.ErrClosed, net.ErrClosed, io.ErrClosedPipe, io.ErrShortBuffer):
41 return codes.FailedPrecondition
42
43
44
45
46
47
48 case isAny(err, io.ErrNoProgress):
49 return codes.Internal
50
51
52 case isAny(err, io.ErrShortWrite, io.ErrUnexpectedEOF):
53 return codes.DataLoss
54
55
56 default:
57 return codes.Unknown
58 }
59 }
60
61
62 func isAny(err error, errs ...error) bool {
63 for _, e := range errs {
64 if errors.Is(err, e) {
65 return true
66 }
67 }
68 return false
69 }
70
View as plain text