diff --git a/pkg/httperrors/errors.go b/pkg/httperrors/errors.go index d57bf8ff79..c447191304 100644 --- a/pkg/httperrors/errors.go +++ b/pkg/httperrors/errors.go @@ -6,37 +6,48 @@ import ( "yunion.io/x/onecloud/pkg/util/httputils" ) -func NewJsonClientError(code int, title string, msg string) *httputils.JSONClientError { - err := httputils.JSONClientError{Code: code, Class: title, Details: msg} +func NewJsonClientError(code int, title string, msg string, error httputils.Error) *httputils.JSONClientError { + err := httputils.JSONClientError{Code: code, Class: title, Details: msg, Data: error} return &err } -func NewBadGatewayError(msg string, params ...interface{}) *httputils.JSONClientError { +func errorMessage(msg string, params ...interface{}) (string, httputils.Error) { + fileds := make([]string, len(params)) + for i, v := range params { + fileds[i] = fmt.Sprint(v) + } + + error := httputils.Error{Id: msg, Fields: fileds} if len(params) > 0 { msg = fmt.Sprintf(msg, params...) } - return NewJsonClientError(502, "BadGateway", msg) + + return msg, error +} + +func NewBadGatewayError(msg string, params ...interface{}) *httputils.JSONClientError { + msg, err := errorMessage(msg, params) + return NewJsonClientError(502, "BadGateway", msg, err) } func NewNotImplementedError(msg string, params ...interface{}) *httputils.JSONClientError { - if len(params) > 0 { - msg = fmt.Sprintf(msg, params...) - } - return NewJsonClientError(501, "NotImplemented", msg) + msg, err := errorMessage(msg, params) + return NewJsonClientError(501, "NotImplemented", msg, err) } func NewInternalServerError(msg string, params ...interface{}) *httputils.JSONClientError { - if len(params) > 0 { - msg = fmt.Sprintf(msg, params...) - } - return NewJsonClientError(500, "InternalServerError", msg) + msg, err := errorMessage(msg, params) + return NewJsonClientError(500, "InternalServerError", msg, err) } func NewResourceNotReadyError(msg string, params ...interface{}) *httputils.JSONClientError { - if len(params) > 0 { - msg = fmt.Sprintf(msg, params...) - } - return NewJsonClientError(500, "ResourceNotReadyError", msg) + msg, err := errorMessage(msg, params) + return NewJsonClientError(500, "ResourceNotReadyError", msg, err) +} + +func NewOutOfResourceError(msg string, params ...interface{}) *httputils.JSONClientError { + msg, err := errorMessage(msg, params) + return NewJsonClientError(500, "NewOutOfResourceError", msg, err) } func NewOutOfResourceError(msg string, params ...interface{}) *httputils.JSONClientError { @@ -47,178 +58,128 @@ func NewOutOfResourceError(msg string, params ...interface{}) *httputils.JSONCli } func NewServerStatusError(msg string, params ...interface{}) *httputils.JSONClientError { - if len(params) > 0 { - msg = fmt.Sprintf(msg, params...) - } - return NewJsonClientError(400, "ServerStatusError", msg) + msg, err := errorMessage(msg, params) + return NewJsonClientError(400, "ServerStatusError", msg, err) } func NewPaymentError(msg string, params ...interface{}) *httputils.JSONClientError { - if len(params) > 0 { - msg = fmt.Sprintf(msg, params...) - } - return NewJsonClientError(402, "PaymentError", msg) + msg, err := errorMessage(msg, params) + return NewJsonClientError(402, "PaymentError", msg, err) } func NewImageNotFoundError(msg string, params ...interface{}) *httputils.JSONClientError { - if len(params) > 0 { - msg = fmt.Sprintf(msg, params...) - } - return NewJsonClientError(404, "ImageNotFoundError", msg) + msg, err := errorMessage(msg, params) + return NewJsonClientError(404, "ImageNotFoundError", msg, err) } func NewResourceNotFoundError(msg string, params ...interface{}) *httputils.JSONClientError { - if len(params) > 0 { - msg = fmt.Sprintf(msg, params...) - } - return NewJsonClientError(404, "ResourceNotFoundError", msg) + msg, err := errorMessage(msg, params) + return NewJsonClientError(404, "ResourceNotFoundError", msg, err) } func NewSpecNotFoundError(msg string, params ...interface{}) *httputils.JSONClientError { - if len(params) > 0 { - msg = fmt.Sprintf(msg, params...) - } - return NewJsonClientError(404, "SpecNotFoundError", msg) + msg, err := errorMessage(msg, params) + return NewJsonClientError(404, "SpecNotFoundError", msg, err) } func NewActionNotFoundError(msg string, params ...interface{}) *httputils.JSONClientError { - if len(params) > 0 { - msg = fmt.Sprintf(msg, params...) - } - return NewJsonClientError(404, "ActionNotFoundError", msg) + msg, err := errorMessage(msg, params) + return NewJsonClientError(404, "ActionNotFoundError", msg, err) } func NewTenantNotFoundError(msg string, params ...interface{}) *httputils.JSONClientError { - if len(params) > 0 { - msg = fmt.Sprintf(msg, params...) - } - return NewJsonClientError(404, "TenantNotFoundError", msg) + msg, err := errorMessage(msg, params) + return NewJsonClientError(404, "TenantNotFoundError", msg, err) } func NewUserNotFoundError(msg string, params ...interface{}) *httputils.JSONClientError { - if len(params) > 0 { - msg = fmt.Sprintf(msg, params...) - } - return NewJsonClientError(404, "UserNotFoundError", msg) + msg, err := errorMessage(msg, params) + return NewJsonClientError(404, "UserNotFoundError", msg, err) } func NewInvalidStatusError(msg string, params ...interface{}) *httputils.JSONClientError { - if len(params) > 0 { - msg = fmt.Sprintf(msg, params...) - } - return NewJsonClientError(400, "InvalidStatusError", msg) + msg, err := errorMessage(msg, params) + return NewJsonClientError(400, "InvalidStatusError", msg, err) } func NewInputParameterError(msg string, params ...interface{}) *httputils.JSONClientError { - if len(params) > 0 { - msg = fmt.Sprintf(msg, params...) - } - return NewJsonClientError(400, "InputParameterError", msg) + msg, err := errorMessage(msg, params) + return NewJsonClientError(400, "InputParameterError", msg, err) } func NewInsufficientResourceError(msg string, params ...interface{}) *httputils.JSONClientError { - if len(params) > 0 { - msg = fmt.Sprintf(msg, params...) - } - return NewJsonClientError(400, "InsufficientResourceError", msg) + msg, err := errorMessage(msg, params) + return NewJsonClientError(400, "InsufficientResourceError", msg, err) } func NewOutOfQuotaError(msg string, params ...interface{}) *httputils.JSONClientError { - if len(params) > 0 { - msg = fmt.Sprintf(msg, params...) - } - return NewJsonClientError(400, "OutOfQuotaError", msg) + msg, err := errorMessage(msg, params) + return NewJsonClientError(400, "OutOfQuotaError", msg, err) } func NewNotSufficientPrivilegeError(msg string, params ...interface{}) *httputils.JSONClientError { - if len(params) > 0 { - msg = fmt.Sprintf(msg, params...) - } - return NewJsonClientError(403, "NotSufficientPrivilegeError", msg) + msg, err := errorMessage(msg, params) + return NewJsonClientError(403, "NotSufficientPrivilegeError", msg, err) } func NewUnsupportOperationError(msg string, params ...interface{}) *httputils.JSONClientError { - if len(params) > 0 { - msg = fmt.Sprintf(msg, params...) - } - return NewJsonClientError(406, "UnsupportOperationError", msg) + msg, err := errorMessage(msg, params) + return NewJsonClientError(406, "UnsupportOperationError", msg, err) } func NewNotEmptyError(msg string, params ...interface{}) *httputils.JSONClientError { - if len(params) > 0 { - msg = fmt.Sprintf(msg, params...) - } - return NewJsonClientError(406, "NotEmptyError", msg) + msg, err := errorMessage(msg, params) + return NewJsonClientError(406, "NotEmptyError", msg, err) } func NewBadRequestError(msg string, params ...interface{}) *httputils.JSONClientError { - if len(params) > 0 { - msg = fmt.Sprintf(msg, params...) - } - return NewJsonClientError(400, "BadRequestError", msg) + msg, err := errorMessage(msg, params) + return NewJsonClientError(400, "BadRequestError", msg, err) } func NewUnauthorizedError(msg string, params ...interface{}) *httputils.JSONClientError { - if len(params) > 0 { - msg = fmt.Sprintf(msg, params...) - } - return NewJsonClientError(401, "UnauthorizedError", msg) + msg, err := errorMessage(msg, params) + return NewJsonClientError(401, "UnauthorizedError", msg, err) } func NewInvalidCredentialError(msg string, params ...interface{}) *httputils.JSONClientError { - if len(params) > 0 { - msg = fmt.Sprintf(msg, params...) - } - return NewJsonClientError(401, "InvalidCredentialError", msg) + msg, err := errorMessage(msg, params) + return NewJsonClientError(401, "InvalidCredentialError", msg, err) } func NewForbiddenError(msg string, params ...interface{}) *httputils.JSONClientError { - if len(params) > 0 { - msg = fmt.Sprintf(msg, params...) - } - return NewJsonClientError(403, "ForbiddenError", msg) + msg, err := errorMessage(msg, params) + return NewJsonClientError(403, "ForbiddenError", msg, err) } func NewNotFoundError(msg string, params ...interface{}) *httputils.JSONClientError { - if len(params) > 0 { - msg = fmt.Sprintf(msg, params...) - } - return NewJsonClientError(404, "NotFoundError", msg) + msg, err := errorMessage(msg, params) + return NewJsonClientError(404, "NotFoundError", msg, err) } func NewNotAcceptableError(msg string, params ...interface{}) *httputils.JSONClientError { - if len(params) > 0 { - msg = fmt.Sprintf(msg, params...) - } - return NewJsonClientError(406, "NotAcceptableError", msg) + msg, err := errorMessage(msg, params) + return NewJsonClientError(406, "NotAcceptableError", msg, err) } func NewDuplicateNameError(msg string, params ...interface{}) *httputils.JSONClientError { - if len(params) > 0 { - msg = fmt.Sprintf(msg, params...) - } - return NewJsonClientError(409, "DuplicateNameError", msg) + msg, err := errorMessage(msg, params) + return NewJsonClientError(409, "DuplicateNameError", msg, err) } func NewConflictError(msg string, params ...interface{}) *httputils.JSONClientError { - if len(params) > 0 { - msg = fmt.Sprintf(msg, params...) - } - return NewJsonClientError(409, "ConflictError", msg) + msg, err := errorMessage(msg, params) + return NewJsonClientError(409, "ConflictError", msg, err) } func NewResourceBusyError(msg string, params ...interface{}) *httputils.JSONClientError { - if len(params) > 0 { - msg = fmt.Sprintf(msg, params...) - } - return NewJsonClientError(409, "ResourceBusyError", msg) + msg, err := errorMessage(msg, params) + return NewJsonClientError(409, "ResourceBusyError", msg, err) } func NewRequireLicenseError(msg string, params ...interface{}) *httputils.JSONClientError { - if len(params) > 0 { - msg = fmt.Sprintf(msg, params...) - } - return NewJsonClientError(402, "RequireLicenseError", msg) + msg, err := errorMessage(msg, params) + return NewJsonClientError(402, "RequireLicenseError", msg, err) } func NewGeneralError(err error) *httputils.JSONClientError { diff --git a/pkg/httperrors/httperrors.go b/pkg/httperrors/httperrors.go index a696ab0394..6fc0d8c741 100644 --- a/pkg/httperrors/httperrors.go +++ b/pkg/httperrors/httperrors.go @@ -8,18 +8,22 @@ import ( "yunion.io/x/onecloud/pkg/util/httputils" ) -func HTTPError(w http.ResponseWriter, msg string, statusCode int, class string) { +func HTTPError(w http.ResponseWriter, msg string, statusCode int, class string, error httputils.Error) { w.WriteHeader(statusCode) w.Header().Set("Content-Type", "application/json") body := jsonutils.NewDict() body.Add(jsonutils.NewInt(int64(statusCode)), "code") body.Add(jsonutils.NewString(msg), "details") body.Add(jsonutils.NewString(class), "class") + err := jsonutils.NewDict() + err.Add(jsonutils.NewString(error.Id), "id") + err.Add(jsonutils.NewStringArray(error.Fields), "fields") + body.Add(err, "data") w.Write([]byte(body.String())) } func JsonClientError(w http.ResponseWriter, e *httputils.JSONClientError) { - HTTPError(w, e.Details, e.Code, e.Class) + HTTPError(w, e.Details, e.Code, e.Class, e.Data) } func GeneralServerError(w http.ResponseWriter, e error) { diff --git a/pkg/util/httputils/httputils.go b/pkg/util/httputils/httputils.go index 603f99987a..efd7cfecd5 100644 --- a/pkg/util/httputils/httputils.go +++ b/pkg/util/httputils/httputils.go @@ -32,10 +32,16 @@ var ( cyan = color.New(color.FgHiCyan, color.Bold).PrintlnFunc() ) +type Error struct { + Id string + Fields []string +} + type JSONClientError struct { Code int Class string Details string + Data Error } func (e *JSONClientError) Error() string {