1414 limitations under the License.
1515*/
1616
17- package errdefs
17+ // Package grpc provides utility functions for translating errors to
18+ // and from a gRPC context.
19+ //
20+ // The functions ToGRPC and ToNative can be used to map server-side and
21+ // client-side errors to the correct types.
22+ package grpc
1823
1924import (
2025 "context"
@@ -24,6 +29,9 @@ import (
2429
2530 "google.golang.org/grpc/codes"
2631 "google.golang.org/grpc/status"
32+
33+ "github.com/containerd/errdefs"
34+ "github.com/containerd/errdefs/internal/cause"
2735)
2836
2937// ToGRPC will attempt to map the backend containerd error into a grpc error,
@@ -45,37 +53,37 @@ func ToGRPC(err error) error {
4553 }
4654
4755 switch {
48- case IsInvalidArgument (err ):
56+ case errdefs . IsInvalidArgument (err ):
4957 return status .Error (codes .InvalidArgument , err .Error ())
50- case IsNotFound (err ):
58+ case errdefs . IsNotFound (err ):
5159 return status .Error (codes .NotFound , err .Error ())
52- case IsAlreadyExists (err ):
60+ case errdefs . IsAlreadyExists (err ):
5361 return status .Error (codes .AlreadyExists , err .Error ())
54- case IsFailedPrecondition (err ) || IsConflict (err ) || IsNotModified (err ):
62+ case errdefs . IsFailedPrecondition (err ) || errdefs . IsConflict (err ) || errdefs . IsNotModified (err ):
5563 return status .Error (codes .FailedPrecondition , err .Error ())
56- case IsUnavailable (err ):
64+ case errdefs . IsUnavailable (err ):
5765 return status .Error (codes .Unavailable , err .Error ())
58- case IsNotImplemented (err ):
66+ case errdefs . IsNotImplemented (err ):
5967 return status .Error (codes .Unimplemented , err .Error ())
60- case IsCanceled (err ):
68+ case errdefs . IsCanceled (err ):
6169 return status .Error (codes .Canceled , err .Error ())
62- case IsDeadlineExceeded (err ):
70+ case errdefs . IsDeadlineExceeded (err ):
6371 return status .Error (codes .DeadlineExceeded , err .Error ())
64- case IsUnauthorized (err ):
72+ case errdefs . IsUnauthorized (err ):
6573 return status .Error (codes .Unauthenticated , err .Error ())
66- case IsPermissionDenied (err ):
74+ case errdefs . IsPermissionDenied (err ):
6775 return status .Error (codes .PermissionDenied , err .Error ())
68- case IsInternal (err ):
76+ case errdefs . IsInternal (err ):
6977 return status .Error (codes .Internal , err .Error ())
70- case IsDataLoss (err ):
78+ case errdefs . IsDataLoss (err ):
7179 return status .Error (codes .DataLoss , err .Error ())
72- case IsAborted (err ):
80+ case errdefs . IsAborted (err ):
7381 return status .Error (codes .Aborted , err .Error ())
74- case IsOutOfRange (err ):
82+ case errdefs . IsOutOfRange (err ):
7583 return status .Error (codes .OutOfRange , err .Error ())
76- case IsResourceExhausted (err ):
84+ case errdefs . IsResourceExhausted (err ):
7785 return status .Error (codes .ResourceExhausted , err .Error ())
78- case IsUnknown (err ):
86+ case errdefs . IsUnknown (err ):
7987 return status .Error (codes .Unknown , err .Error ())
8088 }
8189
@@ -85,13 +93,13 @@ func ToGRPC(err error) error {
8593// ToGRPCf maps the error to grpc error codes, assembling the formatting string
8694// and combining it with the target error string.
8795//
88- // This is equivalent to errdefs .ToGRPC(fmt.Errorf("%s: %w", fmt.Sprintf(format, args...), err))
96+ // This is equivalent to grpc .ToGRPC(fmt.Errorf("%s: %w", fmt.Sprintf(format, args...), err))
8997func ToGRPCf (err error , format string , args ... interface {}) error {
9098 return ToGRPC (fmt .Errorf ("%s: %w" , fmt .Sprintf (format , args ... ), err ))
9199}
92100
93- // FromGRPC returns the underlying error from a grpc service based on the grpc error code
94- func FromGRPC (err error ) error {
101+ // ToNative returns the underlying error from a grpc service based on the grpc error code
102+ func ToNative (err error ) error {
95103 if err == nil {
96104 return nil
97105 }
@@ -102,49 +110,49 @@ func FromGRPC(err error) error {
102110
103111 switch code (err ) {
104112 case codes .InvalidArgument :
105- cls = ErrInvalidArgument
113+ cls = errdefs . ErrInvalidArgument
106114 case codes .AlreadyExists :
107- cls = ErrAlreadyExists
115+ cls = errdefs . ErrAlreadyExists
108116 case codes .NotFound :
109- cls = ErrNotFound
117+ cls = errdefs . ErrNotFound
110118 case codes .Unavailable :
111- cls = ErrUnavailable
119+ cls = errdefs . ErrUnavailable
112120 case codes .FailedPrecondition :
113- if desc == ErrConflict .Error () || strings .HasSuffix (desc , ": " + ErrConflict .Error ()) {
114- cls = ErrConflict
115- } else if desc == ErrNotModified .Error () || strings .HasSuffix (desc , ": " + ErrNotModified .Error ()) {
116- cls = ErrNotModified
121+ if desc == errdefs . ErrConflict .Error () || strings .HasSuffix (desc , ": " + errdefs . ErrConflict .Error ()) {
122+ cls = errdefs . ErrConflict
123+ } else if desc == errdefs . ErrNotModified .Error () || strings .HasSuffix (desc , ": " + errdefs . ErrNotModified .Error ()) {
124+ cls = errdefs . ErrNotModified
117125 } else {
118- cls = ErrFailedPrecondition
126+ cls = errdefs . ErrFailedPrecondition
119127 }
120128 case codes .Unimplemented :
121- cls = ErrNotImplemented
129+ cls = errdefs . ErrNotImplemented
122130 case codes .Canceled :
123131 cls = context .Canceled
124132 case codes .DeadlineExceeded :
125133 cls = context .DeadlineExceeded
126134 case codes .Aborted :
127- cls = ErrAborted
135+ cls = errdefs . ErrAborted
128136 case codes .Unauthenticated :
129- cls = ErrUnauthenticated
137+ cls = errdefs . ErrUnauthenticated
130138 case codes .PermissionDenied :
131- cls = ErrPermissionDenied
139+ cls = errdefs . ErrPermissionDenied
132140 case codes .Internal :
133- cls = ErrInternal
141+ cls = errdefs . ErrInternal
134142 case codes .DataLoss :
135- cls = ErrDataLoss
143+ cls = errdefs . ErrDataLoss
136144 case codes .OutOfRange :
137- cls = ErrOutOfRange
145+ cls = errdefs . ErrOutOfRange
138146 case codes .ResourceExhausted :
139- cls = ErrResourceExhausted
147+ cls = errdefs . ErrResourceExhausted
140148 default :
141- if idx := strings .LastIndex (desc , unexpectedStatusPrefix ); idx > 0 {
142- if status , err := strconv .Atoi (desc [idx + len (unexpectedStatusPrefix ):]); err == nil && status >= 200 && status < 600 {
143- cls = errUnexpectedStatus { status }
149+ if idx := strings .LastIndex (desc , cause . UnexpectedStatusPrefix ); idx > 0 {
150+ if status , err := strconv .Atoi (desc [idx + len (cause . UnexpectedStatusPrefix ):]); err == nil && status >= 200 && status < 600 {
151+ cls = cause. ErrUnexpectedStatus { Status : status }
144152 }
145153 }
146154 if cls == nil {
147- cls = ErrUnknown
155+ cls = errdefs . ErrUnknown
148156 }
149157 }
150158
0 commit comments