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:
Toby Crawley
2017-02-13 08:58:52 -08:00
committed by Soam Vasani
parent 99d6a95bc1
commit c8b5bb2972
4 changed files with 74 additions and 35 deletions
+20 -8
View File
@@ -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()