Better convey duplicate name errors to client (#116)
Motivation: Creating duplicate resources currently results in a 500 error being displayed by the client, with no information about the true nature of the failure. Modifications: * ResourceStore now converts any errors from the etcd client into fission errors, capturing the reason for the error in the case of a duplicate key (as ErrorNameExists) * ErrorNameExists errors are signaled to the client with a 409 (Conflict) HTTP status * MakeErrorFromHTTP() now reads the body of the error response to retrieve the actual error message instead of using the HTTP status message * the controller client now uses MakeErrorFromHTTP() to centralize status code -> error code mapping * tests for all of the resources now check that duplicate resources are reported properly Result: The client can now provide more context when a duplicate name is given related to #112
This commit is contained in:
committed by
Soam Vasani
parent
99d6a95bc1
commit
c8b5bb2972
@@ -18,7 +18,9 @@ package fission
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"io/ioutil"
|
||||
"net/http"
|
||||
"strings"
|
||||
)
|
||||
|
||||
func (e Error) Error() string {
|
||||
@@ -36,29 +38,39 @@ func MakeErrorFromHTTP(resp *http.Response) error {
|
||||
|
||||
var errCode int
|
||||
switch resp.StatusCode {
|
||||
case 400:
|
||||
errCode = ErrorInvalidArgument
|
||||
case 403:
|
||||
errCode = ErrorNotAuthorized
|
||||
case 404:
|
||||
errCode = ErrorNotFound
|
||||
case 400:
|
||||
errCode = ErrorInvalidArgument
|
||||
case 409:
|
||||
errCode = ErrorNameExists
|
||||
default:
|
||||
errCode = ErrorInternal
|
||||
}
|
||||
return MakeError(errCode, resp.Status)
|
||||
|
||||
msg := resp.Status
|
||||
defer resp.Body.Close()
|
||||
body, err := ioutil.ReadAll(resp.Body)
|
||||
if err == nil && len(body) > 0 {
|
||||
msg = strings.TrimSpace(string(body))
|
||||
}
|
||||
|
||||
return MakeError(errCode, msg)
|
||||
}
|
||||
|
||||
func (err Error) HTTPStatus() int {
|
||||
var code int
|
||||
switch err.Code {
|
||||
case ErrorNotFound:
|
||||
code = 404
|
||||
case ErrorInvalidArgument:
|
||||
code = 400
|
||||
case ErrorNoSpace:
|
||||
code = 500
|
||||
case ErrorNotAuthorized:
|
||||
code = 403
|
||||
case ErrorNotFound:
|
||||
code = 404
|
||||
case ErrorNameExists:
|
||||
code = 409
|
||||
default:
|
||||
code = 500
|
||||
}
|
||||
@@ -70,8 +82,8 @@ func GetHTTPError(err error) (int, string) {
|
||||
var code int
|
||||
fe, ok := err.(Error)
|
||||
if ok {
|
||||
msg = fe.Message
|
||||
code = fe.HTTPStatus()
|
||||
msg = fe.Message
|
||||
} else {
|
||||
code = 500
|
||||
msg = err.Error()
|
||||
|
||||
Reference in New Issue
Block a user