datahub/error.go (309 lines of code) (raw):
package datahub
import (
"fmt"
)
/*
examples errors
*/
// Error codes
const (
InvalidParameter = "InvalidParameter"
InvalidSubscription = "InvalidSubscription"
InvalidCursor = "InvalidCursor"
/**
* for later arrange error code
*/
ResourceNotFound = "ResourceNotFound"
NoSuchTopic = "NoSuchTopic"
NoSuchProject = "NoSuchProject"
NoSuchSubscription = "NoSuchSubscription"
NoSuchShard = "NoSuchShard"
NoSuchConnector = "NoSuchConnector"
NoSuchMeterInfo = "NoSuchMeteringInfo"
/**
* for later arrange error code
*/
SeekOutOfRange = "SeekOutOfRange"
ResourceAlreadyExist = "ResourceAlreadyExist"
ProjectAlreadyExist = "ProjectAlreadyExist"
TopicAlreadyExist = "TopicAlreadyExist"
ConnectorAlreadyExist = "ConnectorAlreadyExist"
UnAuthorized = "Unauthorized"
NoPermission = "NoPermission"
InvalidShardOperation = "InvalidShardOperation"
OperatorDenied = "OperationDenied"
LimitExceed = "LimitExceeded"
//ODPSServiceError = "OdpsServiceError"
//MysqlServiceError = "MysqlServiceError"
//InternalServerErrorS = "InternalServerError"
SubscriptionOffline = "SubscriptionOffline"
OffsetReseted = "OffsetReseted"
OffsetSessionClosed = "OffsetSessionClosed"
OffsetSessionChanged = "OffsetSessionChanged"
MalformedRecord = "MalformedRecord"
NoSuchConsumer = "NoSuchConsumer"
ConsumerGroupInProcess = "ConsumerGroupInProcess"
)
const (
projectNameInvalid string = "project name should start with letter, only contains [a-zA-Z0-9_], 3 < length < 32"
commentInvalid string = "comment can not be empty and length must less than 1024"
topicNameInvalid string = "topic name should start with letter, only contains [a-zA-Z0-9_], 1 < length < 128"
shardIdInvalid string = "shardId is invalid"
shardListInvalid string = "shard list is empty"
lifecycleInvalid string = "lifecycle is invalid"
parameterInvalid string = "parameter is invalid"
parameterNull string = "parameter is nil"
parameterNumInvalid string = "parameter num invalid"
parameterTypeInvalid string = "parameter type is invalid,please check your input parameter type"
missingRecordSchema string = "missing record schema for tuple record type"
recordsInvalid string = "records is invalid, nil, empty or other invalid reason"
)
// return the specific err type by errCode,
// you can handle the error by type assert
func errorHandler(statusCode int, requestId string, errorCode string, message string) error {
switch errorCode {
case InvalidParameter, InvalidSubscription, InvalidCursor:
return NewInvalidParameterError(statusCode, requestId, errorCode, message)
case ResourceNotFound, NoSuchTopic, NoSuchProject, NoSuchSubscription, NoSuchShard, NoSuchConnector,
NoSuchMeterInfo, NoSuchConsumer:
return NewResourceNotFoundError(statusCode, requestId, errorCode, message)
case SeekOutOfRange:
return NewSeekOutOfRangeError(statusCode, requestId, errorCode, message)
case ResourceAlreadyExist, ProjectAlreadyExist, TopicAlreadyExist, ConnectorAlreadyExist:
return NewResourceExistError(statusCode, requestId, errorCode, message)
case UnAuthorized:
return NewAuthorizationFailedError(statusCode, requestId, errorCode, message)
case NoPermission:
return NewNoPermissionError(statusCode, requestId, errorCode, message)
case OperatorDenied:
return NewInvalidOperationError(statusCode, requestId, errorCode, message)
case LimitExceed:
return NewLimitExceededError(statusCode, requestId, errorCode, message)
case SubscriptionOffline:
return NewSubscriptionOfflineError(statusCode, requestId, errorCode, message)
case OffsetReseted:
return NewSubscriptionOffsetResetError(statusCode, requestId, errorCode, message)
case OffsetSessionClosed, OffsetSessionChanged:
return NewSubscriptionSessionInvalidError(statusCode, requestId, errorCode, message)
case MalformedRecord:
return NewMalformedRecordError(statusCode, requestId, errorCode, message)
case ConsumerGroupInProcess:
return NewServiceInProcessError(statusCode, requestId, errorCode, message)
case InvalidShardOperation:
return NewShardSealedError(statusCode, requestId, errorCode, message)
}
return NewDatahubClientError(statusCode, requestId, errorCode, message)
}
// create a new DatahubClientError
func NewDatahubClientError(statusCode int, requestId string, code string, message string) *DatahubClientError {
return &DatahubClientError{StatusCode: statusCode, RequestId: requestId, Code: code, Message: message}
}
// DatahubError struct
type DatahubClientError struct {
StatusCode int `json:"StatusCode"` // Http status code
RequestId string `json:"RequestId"` // Request-id to trace the request
Code string `json:"ErrorCode"` // Datahub error code
Message string `json:"ErrorMessage"` // Error msg of the error code
}
func (err *DatahubClientError) Error() string {
return fmt.Sprintf("statusCode: %d, requestId: %s, errCode: %s, errMsg: %s",
err.StatusCode, err.RequestId, err.Code, err.Message)
}
func NewInvalidParameterErrorWithMessage(message string) *InvalidParameterError {
return &InvalidParameterError{
DatahubClientError{
StatusCode: -1,
RequestId: "",
Code: "",
Message: message,
},
}
}
func NewInvalidParameterError(statusCode int, requestId string, code string, message string) *InvalidParameterError {
return &InvalidParameterError{
DatahubClientError{
StatusCode: statusCode,
RequestId: requestId,
Code: code,
Message: message,
},
}
}
// InvalidParameterError represent the parameter error
type InvalidParameterError struct {
DatahubClientError
}
func NewResourceNotFoundError(statusCode int, requestId string, code string, message string) *ResourceNotFoundError {
return &ResourceNotFoundError{
DatahubClientError{
StatusCode: statusCode,
RequestId: requestId,
Code: code,
Message: message,
},
}
}
type ResourceNotFoundError struct {
DatahubClientError
}
func NewResourceExistError(statusCode int, requestId string, code string, message string) *ResourceExistError {
return &ResourceExistError{
DatahubClientError{
StatusCode: statusCode,
RequestId: requestId,
Code: code,
Message: message,
},
}
}
type ResourceExistError struct {
DatahubClientError
}
func NewInvalidOperationError(statusCode int, requestId string, code string, message string) *InvalidOperationError {
return &InvalidOperationError{
DatahubClientError{
StatusCode: statusCode,
RequestId: requestId,
Code: code,
Message: message,
},
}
}
type InvalidOperationError struct {
DatahubClientError
}
func NewLimitExceededError(statusCode int, requestId string, code string, message string) *LimitExceededError {
return &LimitExceededError{
DatahubClientError{
StatusCode: statusCode,
RequestId: requestId,
Code: code,
Message: message,
},
}
}
type LimitExceededError struct {
DatahubClientError
}
func NewAuthorizationFailedError(statusCode int, requestId string, code string, message string) *AuthorizationFailedError {
return &AuthorizationFailedError{
DatahubClientError{
StatusCode: statusCode,
RequestId: requestId,
Code: code,
Message: message,
},
}
}
type AuthorizationFailedError struct {
DatahubClientError
}
//func (afe *AuthorizationFailureError) Error() string {
// return afe.DatahubClientError.Error()
//}
func NewNoPermissionError(statusCode int, requestId string, code string, message string) *NoPermissionError {
return &NoPermissionError{
DatahubClientError{
StatusCode: statusCode,
RequestId: requestId,
Code: code,
Message: message,
},
}
}
type NoPermissionError struct {
DatahubClientError
}
func NewSeekOutOfRangeError(statusCode int, requestId string, code string, message string) *SeekOutOfRangeError {
return &SeekOutOfRangeError{
DatahubClientError{
StatusCode: statusCode,
RequestId: requestId,
Code: code,
Message: message,
},
}
}
type SeekOutOfRangeError struct {
DatahubClientError
}
func NewSubscriptionOfflineError(statusCode int, requestId string, code string, message string) *SubscriptionOfflineError {
return &SubscriptionOfflineError{
DatahubClientError{
StatusCode: statusCode,
RequestId: requestId,
Code: code,
Message: message,
},
}
}
type SubscriptionOfflineError struct {
DatahubClientError
}
func NewSubscriptionOffsetResetError(statusCode int, requestId string, code string, message string) *SubscriptionOffsetResetError {
return &SubscriptionOffsetResetError{
DatahubClientError{
StatusCode: statusCode,
RequestId: requestId,
Code: code,
Message: message,
},
}
}
type SubscriptionOffsetResetError struct {
DatahubClientError
}
func NewSubscriptionSessionInvalidError(statusCode int, requestId string, code string, message string) *SubscriptionSessionInvalidError {
return &SubscriptionSessionInvalidError{
DatahubClientError{
StatusCode: statusCode,
RequestId: requestId,
Code: code,
Message: message,
},
}
}
type SubscriptionSessionInvalidError struct {
DatahubClientError
}
func NewMalformedRecordError(statusCode int, requestId string, code string, message string) *MalformedRecordError {
return &MalformedRecordError{
DatahubClientError{
StatusCode: statusCode,
RequestId: requestId,
Code: code,
Message: message,
},
}
}
type MalformedRecordError struct {
DatahubClientError
}
func NewServiceInProcessError(statusCode int, requestId string, code string, message string) *ServiceInProcessError {
return &ServiceInProcessError{
DatahubClientError{
StatusCode: statusCode,
RequestId: requestId,
Code: code,
Message: message,
},
}
}
type ServiceInProcessError struct {
DatahubClientError
}
func NewShardSealedError(statusCode int, requestId string, code string, message string) *ShardSealedError {
return &ShardSealedError{
DatahubClientError{
StatusCode: statusCode,
RequestId: requestId,
Code: code,
Message: message,
},
}
}
type ShardSealedError struct {
DatahubClientError
}
func NewServiceTemporaryUnavailableError(message string) *ServiceTemporaryUnavailableError {
return &ServiceTemporaryUnavailableError{
DatahubClientError{
StatusCode: -1,
RequestId: "",
Code: "",
Message: message,
},
}
}
func NewServiceTemporaryUnavailableErrorWithCode(statusCode int, requestId string, code string, message string) *ServiceTemporaryUnavailableError {
return &ServiceTemporaryUnavailableError{
DatahubClientError{
StatusCode: statusCode,
RequestId: requestId,
Code: code,
Message: message,
},
}
}
type ServiceTemporaryUnavailableError struct {
DatahubClientError
}