blob: 3bbc26b8fd1835a8e904ae66e363b7feb0e5d3af [file] [log] [blame]
William Kurkianea869482019-04-09 15:16:11 -04001// Copyright 2015 The etcd Authors
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15package rpctypes
16
17import (
18 "google.golang.org/grpc/codes"
19 "google.golang.org/grpc/status"
20)
21
22// server-side error
23var (
24 ErrGRPCEmptyKey = status.New(codes.InvalidArgument, "etcdserver: key is not provided").Err()
25 ErrGRPCKeyNotFound = status.New(codes.InvalidArgument, "etcdserver: key not found").Err()
26 ErrGRPCValueProvided = status.New(codes.InvalidArgument, "etcdserver: value is provided").Err()
27 ErrGRPCLeaseProvided = status.New(codes.InvalidArgument, "etcdserver: lease is provided").Err()
28 ErrGRPCTooManyOps = status.New(codes.InvalidArgument, "etcdserver: too many operations in txn request").Err()
29 ErrGRPCDuplicateKey = status.New(codes.InvalidArgument, "etcdserver: duplicate key given in txn request").Err()
30 ErrGRPCCompacted = status.New(codes.OutOfRange, "etcdserver: mvcc: required revision has been compacted").Err()
31 ErrGRPCFutureRev = status.New(codes.OutOfRange, "etcdserver: mvcc: required revision is a future revision").Err()
32 ErrGRPCNoSpace = status.New(codes.ResourceExhausted, "etcdserver: mvcc: database space exceeded").Err()
33
34 ErrGRPCLeaseNotFound = status.New(codes.NotFound, "etcdserver: requested lease not found").Err()
35 ErrGRPCLeaseExist = status.New(codes.FailedPrecondition, "etcdserver: lease already exists").Err()
36 ErrGRPCLeaseTTLTooLarge = status.New(codes.OutOfRange, "etcdserver: too large lease TTL").Err()
37
38 ErrGRPCMemberExist = status.New(codes.FailedPrecondition, "etcdserver: member ID already exist").Err()
39 ErrGRPCPeerURLExist = status.New(codes.FailedPrecondition, "etcdserver: Peer URLs already exists").Err()
40 ErrGRPCMemberNotEnoughStarted = status.New(codes.FailedPrecondition, "etcdserver: re-configuration failed due to not enough started members").Err()
41 ErrGRPCMemberBadURLs = status.New(codes.InvalidArgument, "etcdserver: given member URLs are invalid").Err()
42 ErrGRPCMemberNotFound = status.New(codes.NotFound, "etcdserver: member not found").Err()
Abhilash S.L3b494632019-07-16 15:51:09 +053043 ErrGRPCMemberNotLearner = status.New(codes.FailedPrecondition, "etcdserver: can only promote a learner member").Err()
44 ErrGRPCLearnerNotReady = status.New(codes.FailedPrecondition, "etcdserver: can only promote a learner member which is in sync with leader").Err()
45 ErrGRPCTooManyLearners = status.New(codes.FailedPrecondition, "etcdserver: too many learner members in cluster").Err()
William Kurkianea869482019-04-09 15:16:11 -040046
47 ErrGRPCRequestTooLarge = status.New(codes.InvalidArgument, "etcdserver: request is too large").Err()
48 ErrGRPCRequestTooManyRequests = status.New(codes.ResourceExhausted, "etcdserver: too many requests").Err()
49
50 ErrGRPCRootUserNotExist = status.New(codes.FailedPrecondition, "etcdserver: root user does not exist").Err()
51 ErrGRPCRootRoleNotExist = status.New(codes.FailedPrecondition, "etcdserver: root user does not have root role").Err()
52 ErrGRPCUserAlreadyExist = status.New(codes.FailedPrecondition, "etcdserver: user name already exists").Err()
53 ErrGRPCUserEmpty = status.New(codes.InvalidArgument, "etcdserver: user name is empty").Err()
54 ErrGRPCUserNotFound = status.New(codes.FailedPrecondition, "etcdserver: user name not found").Err()
55 ErrGRPCRoleAlreadyExist = status.New(codes.FailedPrecondition, "etcdserver: role name already exists").Err()
56 ErrGRPCRoleNotFound = status.New(codes.FailedPrecondition, "etcdserver: role name not found").Err()
57 ErrGRPCAuthFailed = status.New(codes.InvalidArgument, "etcdserver: authentication failed, invalid user ID or password").Err()
58 ErrGRPCPermissionDenied = status.New(codes.PermissionDenied, "etcdserver: permission denied").Err()
59 ErrGRPCRoleNotGranted = status.New(codes.FailedPrecondition, "etcdserver: role is not granted to the user").Err()
60 ErrGRPCPermissionNotGranted = status.New(codes.FailedPrecondition, "etcdserver: permission is not granted to the role").Err()
61 ErrGRPCAuthNotEnabled = status.New(codes.FailedPrecondition, "etcdserver: authentication is not enabled").Err()
62 ErrGRPCInvalidAuthToken = status.New(codes.Unauthenticated, "etcdserver: invalid auth token").Err()
63 ErrGRPCInvalidAuthMgmt = status.New(codes.InvalidArgument, "etcdserver: invalid auth management").Err()
64
65 ErrGRPCNoLeader = status.New(codes.Unavailable, "etcdserver: no leader").Err()
66 ErrGRPCNotLeader = status.New(codes.FailedPrecondition, "etcdserver: not leader").Err()
67 ErrGRPCLeaderChanged = status.New(codes.Unavailable, "etcdserver: leader changed").Err()
68 ErrGRPCNotCapable = status.New(codes.Unavailable, "etcdserver: not capable").Err()
69 ErrGRPCStopped = status.New(codes.Unavailable, "etcdserver: server stopped").Err()
70 ErrGRPCTimeout = status.New(codes.Unavailable, "etcdserver: request timed out").Err()
71 ErrGRPCTimeoutDueToLeaderFail = status.New(codes.Unavailable, "etcdserver: request timed out, possibly due to previous leader failure").Err()
72 ErrGRPCTimeoutDueToConnectionLost = status.New(codes.Unavailable, "etcdserver: request timed out, possibly due to connection lost").Err()
73 ErrGRPCUnhealthy = status.New(codes.Unavailable, "etcdserver: unhealthy cluster").Err()
74 ErrGRPCCorrupt = status.New(codes.DataLoss, "etcdserver: corrupt cluster").Err()
Abhilash S.L3b494632019-07-16 15:51:09 +053075 ErrGPRCNotSupportedForLearner = status.New(codes.Unavailable, "etcdserver: rpc not supported for learner").Err()
76 ErrGRPCBadLeaderTransferee = status.New(codes.FailedPrecondition, "etcdserver: bad leader transferee").Err()
William Kurkianea869482019-04-09 15:16:11 -040077
78 errStringToError = map[string]error{
79 ErrorDesc(ErrGRPCEmptyKey): ErrGRPCEmptyKey,
80 ErrorDesc(ErrGRPCKeyNotFound): ErrGRPCKeyNotFound,
81 ErrorDesc(ErrGRPCValueProvided): ErrGRPCValueProvided,
82 ErrorDesc(ErrGRPCLeaseProvided): ErrGRPCLeaseProvided,
83
84 ErrorDesc(ErrGRPCTooManyOps): ErrGRPCTooManyOps,
85 ErrorDesc(ErrGRPCDuplicateKey): ErrGRPCDuplicateKey,
86 ErrorDesc(ErrGRPCCompacted): ErrGRPCCompacted,
87 ErrorDesc(ErrGRPCFutureRev): ErrGRPCFutureRev,
88 ErrorDesc(ErrGRPCNoSpace): ErrGRPCNoSpace,
89
90 ErrorDesc(ErrGRPCLeaseNotFound): ErrGRPCLeaseNotFound,
91 ErrorDesc(ErrGRPCLeaseExist): ErrGRPCLeaseExist,
92 ErrorDesc(ErrGRPCLeaseTTLTooLarge): ErrGRPCLeaseTTLTooLarge,
93
94 ErrorDesc(ErrGRPCMemberExist): ErrGRPCMemberExist,
95 ErrorDesc(ErrGRPCPeerURLExist): ErrGRPCPeerURLExist,
96 ErrorDesc(ErrGRPCMemberNotEnoughStarted): ErrGRPCMemberNotEnoughStarted,
97 ErrorDesc(ErrGRPCMemberBadURLs): ErrGRPCMemberBadURLs,
98 ErrorDesc(ErrGRPCMemberNotFound): ErrGRPCMemberNotFound,
Abhilash S.L3b494632019-07-16 15:51:09 +053099 ErrorDesc(ErrGRPCMemberNotLearner): ErrGRPCMemberNotLearner,
100 ErrorDesc(ErrGRPCLearnerNotReady): ErrGRPCLearnerNotReady,
101 ErrorDesc(ErrGRPCTooManyLearners): ErrGRPCTooManyLearners,
William Kurkianea869482019-04-09 15:16:11 -0400102
103 ErrorDesc(ErrGRPCRequestTooLarge): ErrGRPCRequestTooLarge,
104 ErrorDesc(ErrGRPCRequestTooManyRequests): ErrGRPCRequestTooManyRequests,
105
106 ErrorDesc(ErrGRPCRootUserNotExist): ErrGRPCRootUserNotExist,
107 ErrorDesc(ErrGRPCRootRoleNotExist): ErrGRPCRootRoleNotExist,
108 ErrorDesc(ErrGRPCUserAlreadyExist): ErrGRPCUserAlreadyExist,
109 ErrorDesc(ErrGRPCUserEmpty): ErrGRPCUserEmpty,
110 ErrorDesc(ErrGRPCUserNotFound): ErrGRPCUserNotFound,
111 ErrorDesc(ErrGRPCRoleAlreadyExist): ErrGRPCRoleAlreadyExist,
112 ErrorDesc(ErrGRPCRoleNotFound): ErrGRPCRoleNotFound,
113 ErrorDesc(ErrGRPCAuthFailed): ErrGRPCAuthFailed,
114 ErrorDesc(ErrGRPCPermissionDenied): ErrGRPCPermissionDenied,
115 ErrorDesc(ErrGRPCRoleNotGranted): ErrGRPCRoleNotGranted,
116 ErrorDesc(ErrGRPCPermissionNotGranted): ErrGRPCPermissionNotGranted,
117 ErrorDesc(ErrGRPCAuthNotEnabled): ErrGRPCAuthNotEnabled,
118 ErrorDesc(ErrGRPCInvalidAuthToken): ErrGRPCInvalidAuthToken,
119 ErrorDesc(ErrGRPCInvalidAuthMgmt): ErrGRPCInvalidAuthMgmt,
120
121 ErrorDesc(ErrGRPCNoLeader): ErrGRPCNoLeader,
122 ErrorDesc(ErrGRPCNotLeader): ErrGRPCNotLeader,
123 ErrorDesc(ErrGRPCLeaderChanged): ErrGRPCLeaderChanged,
124 ErrorDesc(ErrGRPCNotCapable): ErrGRPCNotCapable,
125 ErrorDesc(ErrGRPCStopped): ErrGRPCStopped,
126 ErrorDesc(ErrGRPCTimeout): ErrGRPCTimeout,
127 ErrorDesc(ErrGRPCTimeoutDueToLeaderFail): ErrGRPCTimeoutDueToLeaderFail,
128 ErrorDesc(ErrGRPCTimeoutDueToConnectionLost): ErrGRPCTimeoutDueToConnectionLost,
129 ErrorDesc(ErrGRPCUnhealthy): ErrGRPCUnhealthy,
130 ErrorDesc(ErrGRPCCorrupt): ErrGRPCCorrupt,
Abhilash S.L3b494632019-07-16 15:51:09 +0530131 ErrorDesc(ErrGPRCNotSupportedForLearner): ErrGPRCNotSupportedForLearner,
132 ErrorDesc(ErrGRPCBadLeaderTransferee): ErrGRPCBadLeaderTransferee,
William Kurkianea869482019-04-09 15:16:11 -0400133 }
134)
135
136// client-side error
137var (
138 ErrEmptyKey = Error(ErrGRPCEmptyKey)
139 ErrKeyNotFound = Error(ErrGRPCKeyNotFound)
140 ErrValueProvided = Error(ErrGRPCValueProvided)
141 ErrLeaseProvided = Error(ErrGRPCLeaseProvided)
142 ErrTooManyOps = Error(ErrGRPCTooManyOps)
143 ErrDuplicateKey = Error(ErrGRPCDuplicateKey)
144 ErrCompacted = Error(ErrGRPCCompacted)
145 ErrFutureRev = Error(ErrGRPCFutureRev)
146 ErrNoSpace = Error(ErrGRPCNoSpace)
147
148 ErrLeaseNotFound = Error(ErrGRPCLeaseNotFound)
149 ErrLeaseExist = Error(ErrGRPCLeaseExist)
150 ErrLeaseTTLTooLarge = Error(ErrGRPCLeaseTTLTooLarge)
151
152 ErrMemberExist = Error(ErrGRPCMemberExist)
153 ErrPeerURLExist = Error(ErrGRPCPeerURLExist)
154 ErrMemberNotEnoughStarted = Error(ErrGRPCMemberNotEnoughStarted)
155 ErrMemberBadURLs = Error(ErrGRPCMemberBadURLs)
156 ErrMemberNotFound = Error(ErrGRPCMemberNotFound)
Abhilash S.L3b494632019-07-16 15:51:09 +0530157 ErrMemberNotLearner = Error(ErrGRPCMemberNotLearner)
158 ErrMemberLearnerNotReady = Error(ErrGRPCLearnerNotReady)
159 ErrTooManyLearners = Error(ErrGRPCTooManyLearners)
William Kurkianea869482019-04-09 15:16:11 -0400160
161 ErrRequestTooLarge = Error(ErrGRPCRequestTooLarge)
162 ErrTooManyRequests = Error(ErrGRPCRequestTooManyRequests)
163
164 ErrRootUserNotExist = Error(ErrGRPCRootUserNotExist)
165 ErrRootRoleNotExist = Error(ErrGRPCRootRoleNotExist)
166 ErrUserAlreadyExist = Error(ErrGRPCUserAlreadyExist)
167 ErrUserEmpty = Error(ErrGRPCUserEmpty)
168 ErrUserNotFound = Error(ErrGRPCUserNotFound)
169 ErrRoleAlreadyExist = Error(ErrGRPCRoleAlreadyExist)
170 ErrRoleNotFound = Error(ErrGRPCRoleNotFound)
171 ErrAuthFailed = Error(ErrGRPCAuthFailed)
172 ErrPermissionDenied = Error(ErrGRPCPermissionDenied)
173 ErrRoleNotGranted = Error(ErrGRPCRoleNotGranted)
174 ErrPermissionNotGranted = Error(ErrGRPCPermissionNotGranted)
175 ErrAuthNotEnabled = Error(ErrGRPCAuthNotEnabled)
176 ErrInvalidAuthToken = Error(ErrGRPCInvalidAuthToken)
177 ErrInvalidAuthMgmt = Error(ErrGRPCInvalidAuthMgmt)
178
179 ErrNoLeader = Error(ErrGRPCNoLeader)
180 ErrNotLeader = Error(ErrGRPCNotLeader)
181 ErrLeaderChanged = Error(ErrGRPCLeaderChanged)
182 ErrNotCapable = Error(ErrGRPCNotCapable)
183 ErrStopped = Error(ErrGRPCStopped)
184 ErrTimeout = Error(ErrGRPCTimeout)
185 ErrTimeoutDueToLeaderFail = Error(ErrGRPCTimeoutDueToLeaderFail)
186 ErrTimeoutDueToConnectionLost = Error(ErrGRPCTimeoutDueToConnectionLost)
187 ErrUnhealthy = Error(ErrGRPCUnhealthy)
188 ErrCorrupt = Error(ErrGRPCCorrupt)
Abhilash S.L3b494632019-07-16 15:51:09 +0530189 ErrBadLeaderTransferee = Error(ErrGRPCBadLeaderTransferee)
William Kurkianea869482019-04-09 15:16:11 -0400190)
191
192// EtcdError defines gRPC server errors.
193// (https://github.com/grpc/grpc-go/blob/master/rpc_util.go#L319-L323)
194type EtcdError struct {
195 code codes.Code
196 desc string
197}
198
199// Code returns grpc/codes.Code.
200// TODO: define clientv3/codes.Code.
201func (e EtcdError) Code() codes.Code {
202 return e.code
203}
204
205func (e EtcdError) Error() string {
206 return e.desc
207}
208
209func Error(err error) error {
210 if err == nil {
211 return nil
212 }
213 verr, ok := errStringToError[ErrorDesc(err)]
214 if !ok { // not gRPC error
215 return err
216 }
217 ev, ok := status.FromError(verr)
218 var desc string
219 if ok {
220 desc = ev.Message()
221 } else {
222 desc = verr.Error()
223 }
224 return EtcdError{code: ev.Code(), desc: desc}
225}
226
227func ErrorDesc(err error) string {
228 if s, ok := status.FromError(err); ok {
229 return s.Message()
230 }
231 return err.Error()
232}