|
|
@@ -20,62 +20,104 @@ import (
|
|
|
)
|
|
|
|
|
|
var (
|
|
|
- ErrEmptyKey = grpc.Errorf(codes.InvalidArgument, "etcdserver: key is not provided")
|
|
|
- ErrTooManyOps = grpc.Errorf(codes.InvalidArgument, "etcdserver: too many operations in txn request")
|
|
|
- ErrDuplicateKey = grpc.Errorf(codes.InvalidArgument, "etcdserver: duplicate key given in txn request")
|
|
|
- ErrCompacted = grpc.Errorf(codes.OutOfRange, "etcdserver: mvcc: required revision has been compacted")
|
|
|
- ErrFutureRev = grpc.Errorf(codes.OutOfRange, "etcdserver: mvcc: required revision is a future revision")
|
|
|
- ErrNoSpace = grpc.Errorf(codes.ResourceExhausted, "etcdserver: mvcc: database space exceeded")
|
|
|
+ // server-side error
|
|
|
+ ErrGRPCEmptyKey = grpc.Errorf(codes.InvalidArgument, "etcdserver: key is not provided")
|
|
|
+ ErrGRPCTooManyOps = grpc.Errorf(codes.InvalidArgument, "etcdserver: too many operations in txn request")
|
|
|
+ ErrGRPCDuplicateKey = grpc.Errorf(codes.InvalidArgument, "etcdserver: duplicate key given in txn request")
|
|
|
+ ErrGRPCCompacted = grpc.Errorf(codes.OutOfRange, "etcdserver: mvcc: required revision has been compacted")
|
|
|
+ ErrGRPCFutureRev = grpc.Errorf(codes.OutOfRange, "etcdserver: mvcc: required revision is a future revision")
|
|
|
+ ErrGRPCNoSpace = grpc.Errorf(codes.ResourceExhausted, "etcdserver: mvcc: database space exceeded")
|
|
|
|
|
|
- ErrLeaseNotFound = grpc.Errorf(codes.NotFound, "etcdserver: requested lease not found")
|
|
|
- ErrLeaseExist = grpc.Errorf(codes.FailedPrecondition, "etcdserver: lease already exists")
|
|
|
+ ErrGRPCLeaseNotFound = grpc.Errorf(codes.NotFound, "etcdserver: requested lease not found")
|
|
|
+ ErrGRPCLeaseExist = grpc.Errorf(codes.FailedPrecondition, "etcdserver: lease already exists")
|
|
|
|
|
|
- ErrMemberExist = grpc.Errorf(codes.FailedPrecondition, "etcdserver: member ID already exist")
|
|
|
- ErrPeerURLExist = grpc.Errorf(codes.FailedPrecondition, "etcdserver: Peer URLs already exists")
|
|
|
- ErrMemberBadURLs = grpc.Errorf(codes.InvalidArgument, "etcdserver: given member URLs are invalid")
|
|
|
- ErrMemberNotFound = grpc.Errorf(codes.NotFound, "etcdserver: member not found")
|
|
|
+ ErrGRPCMemberExist = grpc.Errorf(codes.FailedPrecondition, "etcdserver: member ID already exist")
|
|
|
+ ErrGRPCPeerURLExist = grpc.Errorf(codes.FailedPrecondition, "etcdserver: Peer URLs already exists")
|
|
|
+ ErrGRPCMemberBadURLs = grpc.Errorf(codes.InvalidArgument, "etcdserver: given member URLs are invalid")
|
|
|
+ ErrGRPCMemberNotFound = grpc.Errorf(codes.NotFound, "etcdserver: member not found")
|
|
|
|
|
|
- ErrRequestTooLarge = grpc.Errorf(codes.InvalidArgument, "etcdserver: request is too large")
|
|
|
+ ErrGRPCRequestTooLarge = grpc.Errorf(codes.InvalidArgument, "etcdserver: request is too large")
|
|
|
|
|
|
- ErrUserAlreadyExist = grpc.Errorf(codes.FailedPrecondition, "etcdserver: user name already exists")
|
|
|
- ErrUserNotFound = grpc.Errorf(codes.FailedPrecondition, "etcdserver: user name not found")
|
|
|
- ErrRoleAlreadyExist = grpc.Errorf(codes.FailedPrecondition, "etcdserver: role name already exists")
|
|
|
- ErrRoleNotFound = grpc.Errorf(codes.FailedPrecondition, "etcdserver: role name not found")
|
|
|
- ErrAuthFailed = grpc.Errorf(codes.InvalidArgument, "etcdserver: authentication failed, invalid user ID or password")
|
|
|
+ ErrGRPCUserAlreadyExist = grpc.Errorf(codes.FailedPrecondition, "etcdserver: user name already exists")
|
|
|
+ ErrGRPCUserNotFound = grpc.Errorf(codes.FailedPrecondition, "etcdserver: user name not found")
|
|
|
+ ErrGRPCRoleAlreadyExist = grpc.Errorf(codes.FailedPrecondition, "etcdserver: role name already exists")
|
|
|
+ ErrGRPCRoleNotFound = grpc.Errorf(codes.FailedPrecondition, "etcdserver: role name not found")
|
|
|
+ ErrGRPCAuthFailed = grpc.Errorf(codes.InvalidArgument, "etcdserver: authentication failed, invalid user ID or password")
|
|
|
|
|
|
errStringToError = map[string]error{
|
|
|
- grpc.ErrorDesc(ErrEmptyKey): ErrEmptyKey,
|
|
|
- grpc.ErrorDesc(ErrTooManyOps): ErrTooManyOps,
|
|
|
- grpc.ErrorDesc(ErrDuplicateKey): ErrDuplicateKey,
|
|
|
- grpc.ErrorDesc(ErrCompacted): ErrCompacted,
|
|
|
- grpc.ErrorDesc(ErrFutureRev): ErrFutureRev,
|
|
|
- grpc.ErrorDesc(ErrNoSpace): ErrNoSpace,
|
|
|
-
|
|
|
- grpc.ErrorDesc(ErrLeaseNotFound): ErrLeaseNotFound,
|
|
|
- grpc.ErrorDesc(ErrLeaseExist): ErrLeaseExist,
|
|
|
-
|
|
|
- grpc.ErrorDesc(ErrMemberExist): ErrMemberExist,
|
|
|
- grpc.ErrorDesc(ErrPeerURLExist): ErrPeerURLExist,
|
|
|
- grpc.ErrorDesc(ErrMemberBadURLs): ErrMemberBadURLs,
|
|
|
- grpc.ErrorDesc(ErrMemberNotFound): ErrMemberNotFound,
|
|
|
-
|
|
|
- grpc.ErrorDesc(ErrRequestTooLarge): ErrRequestTooLarge,
|
|
|
-
|
|
|
- grpc.ErrorDesc(ErrUserAlreadyExist): ErrUserAlreadyExist,
|
|
|
- grpc.ErrorDesc(ErrUserNotFound): ErrUserNotFound,
|
|
|
- grpc.ErrorDesc(ErrRoleAlreadyExist): ErrRoleAlreadyExist,
|
|
|
- grpc.ErrorDesc(ErrRoleNotFound): ErrRoleNotFound,
|
|
|
- grpc.ErrorDesc(ErrAuthFailed): ErrAuthFailed,
|
|
|
+ grpc.ErrorDesc(ErrGRPCEmptyKey): ErrGRPCEmptyKey,
|
|
|
+ grpc.ErrorDesc(ErrGRPCTooManyOps): ErrGRPCTooManyOps,
|
|
|
+ grpc.ErrorDesc(ErrGRPCDuplicateKey): ErrGRPCDuplicateKey,
|
|
|
+ grpc.ErrorDesc(ErrGRPCCompacted): ErrGRPCCompacted,
|
|
|
+ grpc.ErrorDesc(ErrGRPCFutureRev): ErrGRPCFutureRev,
|
|
|
+ grpc.ErrorDesc(ErrGRPCNoSpace): ErrGRPCNoSpace,
|
|
|
+
|
|
|
+ grpc.ErrorDesc(ErrGRPCLeaseNotFound): ErrGRPCLeaseNotFound,
|
|
|
+ grpc.ErrorDesc(ErrGRPCLeaseExist): ErrGRPCLeaseExist,
|
|
|
+
|
|
|
+ grpc.ErrorDesc(ErrGRPCMemberExist): ErrGRPCMemberExist,
|
|
|
+ grpc.ErrorDesc(ErrGRPCPeerURLExist): ErrGRPCPeerURLExist,
|
|
|
+ grpc.ErrorDesc(ErrGRPCMemberBadURLs): ErrGRPCMemberBadURLs,
|
|
|
+ grpc.ErrorDesc(ErrGRPCMemberNotFound): ErrGRPCMemberNotFound,
|
|
|
+
|
|
|
+ grpc.ErrorDesc(ErrGRPCRequestTooLarge): ErrGRPCRequestTooLarge,
|
|
|
+
|
|
|
+ grpc.ErrorDesc(ErrGRPCUserAlreadyExist): ErrGRPCUserAlreadyExist,
|
|
|
+ grpc.ErrorDesc(ErrGRPCUserNotFound): ErrGRPCUserNotFound,
|
|
|
+ grpc.ErrorDesc(ErrGRPCRoleAlreadyExist): ErrGRPCRoleAlreadyExist,
|
|
|
+ grpc.ErrorDesc(ErrGRPCRoleNotFound): ErrGRPCRoleNotFound,
|
|
|
+ grpc.ErrorDesc(ErrGRPCAuthFailed): ErrGRPCAuthFailed,
|
|
|
}
|
|
|
+
|
|
|
+ // client-side error
|
|
|
+ ErrEmptyKey = Error(ErrGRPCEmptyKey)
|
|
|
+ ErrTooManyOps = Error(ErrGRPCTooManyOps)
|
|
|
+ ErrDuplicateKey = Error(ErrGRPCDuplicateKey)
|
|
|
+ ErrCompacted = Error(ErrGRPCCompacted)
|
|
|
+ ErrFutureRev = Error(ErrGRPCFutureRev)
|
|
|
+ ErrNoSpace = Error(ErrGRPCNoSpace)
|
|
|
+
|
|
|
+ ErrLeaseNotFound = Error(ErrGRPCLeaseNotFound)
|
|
|
+ ErrLeaseExist = Error(ErrGRPCLeaseExist)
|
|
|
+
|
|
|
+ ErrMemberExist = Error(ErrGRPCMemberExist)
|
|
|
+ ErrPeerURLExist = Error(ErrGRPCPeerURLExist)
|
|
|
+ ErrMemberBadURLs = Error(ErrGRPCMemberBadURLs)
|
|
|
+ ErrMemberNotFound = Error(ErrGRPCMemberNotFound)
|
|
|
+
|
|
|
+ ErrRequestTooLarge = Error(ErrGRPCRequestTooLarge)
|
|
|
+
|
|
|
+ ErrUserAlreadyExist = Error(ErrGRPCUserAlreadyExist)
|
|
|
+ ErrUserNotFound = Error(ErrGRPCUserNotFound)
|
|
|
+ ErrRoleAlreadyExist = Error(ErrGRPCRoleAlreadyExist)
|
|
|
+ ErrRoleNotFound = Error(ErrGRPCRoleNotFound)
|
|
|
+ ErrAuthFailed = Error(ErrGRPCAuthFailed)
|
|
|
)
|
|
|
|
|
|
+// EtcdError defines gRPC server errors.
|
|
|
+// (https://github.com/grpc/grpc-go/blob/master/rpc_util.go#L319-L323)
|
|
|
+type EtcdError struct {
|
|
|
+ code codes.Code
|
|
|
+ desc string
|
|
|
+}
|
|
|
+
|
|
|
+// Code returns grpc/codes.Code.
|
|
|
+// TODO: define clientv3/codes.Code.
|
|
|
+func (e EtcdError) Code() codes.Code {
|
|
|
+ return e.code
|
|
|
+}
|
|
|
+
|
|
|
+func (e EtcdError) Error() string {
|
|
|
+ return e.desc
|
|
|
+}
|
|
|
+
|
|
|
func Error(err error) error {
|
|
|
if err == nil {
|
|
|
return nil
|
|
|
}
|
|
|
- v, ok := errStringToError[err.Error()]
|
|
|
- if !ok {
|
|
|
+ verr, ok := errStringToError[grpc.ErrorDesc(err)]
|
|
|
+ if !ok { // not gRPC error
|
|
|
return err
|
|
|
}
|
|
|
- return v
|
|
|
+ return EtcdError{code: grpc.Code(verr), desc: grpc.ErrorDesc(verr)}
|
|
|
}
|