Change Format of API Error (#784)

This is a wire breaking change for json errors since we have removed and renamed a few fields, and changed part of the structure of the returned json error.

* Remove redundant fields in Status, details.error_id, details.TraceId and details.request_id from API errors.

* Added wrapped errors and "ops" field to indicate the internal operation of the errors returned by the API.

* Added error cli error reporting of Op and wrapped errors.
This commit is contained in:
Todd Knight authored and GitHub committed 2020-12-07 14:25:16 -07:00
1 parent 18ea39b237
commit aa4157639c
48 files changed
+742 -728

No files matched your search

+4 -4
View File
@@ -165,7 +165,7 @@ func TestErrors(t *testing.T) {
require.Error(err)
apiErr := api.AsServerError(err)
require.NotNil(apiErr)
assert.EqualValues(http.StatusNotFound, apiErr.Status)
assert.EqualValues(http.StatusNotFound, apiErr.ResponseStatus())
// Create another resource with the same name.
_, err = accountClient.Create(tc.Context(), amId, accounts.WithPasswordAccountLoginName("first"))
@@ -177,17 +177,17 @@ func TestErrors(t *testing.T) {
require.Error(err)
apiErr = api.AsServerError(err)
require.NotNil(apiErr)
assert.EqualValues(http.StatusNotFound, apiErr.Status)
assert.EqualValues(http.StatusNotFound, apiErr.ResponseStatus())
_, err = accountClient.Read(tc.Context(), "invalid id")
require.Error(err)
apiErr = api.AsServerError(err)
require.NotNil(apiErr)
assert.EqualValues(http.StatusBadRequest, apiErr.Status)
assert.EqualValues(http.StatusBadRequest, apiErr.ResponseStatus())
_, err = accountClient.Update(tc.Context(), u.Item.Id, u.Item.Version)
require.Error(err)
apiErr = api.AsServerError(err)
require.NotNil(apiErr)
assert.EqualValues(http.StatusBadRequest, apiErr.Status)
assert.EqualValues(http.StatusBadRequest, apiErr.ResponseStatus())
}
@@ -32,5 +32,5 @@ func TestAuthenticate(t *testing.T) {
require.Error(err)
apiErr := api.AsServerError(err)
require.NotNil(apiErr)
assert.EqualValuesf(http.StatusUnauthorized, apiErr.Status, "Expected unauthorized, got %q", apiErr.Message)
assert.EqualValuesf(http.StatusUnauthorized, apiErr.ResponseStatus(), "Expected unauthorized, got %q", apiErr.Message)
}
@@ -145,11 +145,11 @@ func TestErrors(t *testing.T) {
require.Error(err)
apiErr := api.AsServerError(err)
require.NotNil(apiErr)
assert.EqualValues(http.StatusNotFound, apiErr.Status)
assert.EqualValues(http.StatusNotFound, apiErr.ResponseStatus())
_, err = tokens.Read(tc.Context(), "invalid id")
require.Error(err)
apiErr = api.AsServerError(err)
require.NotNil(apiErr)
assert.EqualValues(http.StatusBadRequest, apiErr.Status)
assert.EqualValues(http.StatusBadRequest, apiErr.ResponseStatus())
}
+5 -5
View File
@@ -151,7 +151,7 @@ func TestCrud(t *testing.T) {
require.Error(err)
apiErr := api.AsServerError(err)
require.NotNil(apiErr)
assert.EqualValues(http.StatusNotFound, apiErr.Status)
assert.EqualValues(http.StatusNotFound, apiErr.ResponseStatus())
})
}
}
@@ -193,7 +193,7 @@ func TestErrors(t *testing.T) {
require.Error(err)
apiErr := api.AsServerError(err)
require.NotNil(apiErr)
assert.EqualValues(http.StatusNotFound, apiErr.Status)
assert.EqualValues(http.StatusNotFound, apiErr.ResponseStatus())
// Create another resource with the same name.
_, err = groupClient.Create(tc.Context(), tt.scopeId, groups.WithName("first"))
@@ -203,19 +203,19 @@ func TestErrors(t *testing.T) {
require.Error(err)
apiErr = api.AsServerError(err)
require.NotNil(apiErr)
assert.EqualValues(http.StatusNotFound, apiErr.Status)
assert.EqualValues(http.StatusNotFound, apiErr.ResponseStatus())
_, err = groupClient.Read(tc.Context(), "invalid id")
require.Error(err)
apiErr = api.AsServerError(err)
require.NotNil(apiErr)
assert.EqualValues(http.StatusBadRequest, apiErr.Status)
assert.EqualValues(http.StatusBadRequest, apiErr.ResponseStatus())
_, err = groupClient.Update(tc.Context(), g.Item.Id, g.Item.Version)
require.Error(err)
apiErr = api.AsServerError(err)
require.NotNil(apiErr)
assert.EqualValues(http.StatusBadRequest, apiErr.Status)
assert.EqualValues(http.StatusBadRequest, apiErr.ResponseStatus())
})
}
}
@@ -109,7 +109,7 @@ func TestCrud(t *testing.T) {
require.Error(err)
apiErr := api.AsServerError(err)
assert.NotNil(apiErr)
assert.EqualValues(http.StatusNotFound, apiErr.Status)
assert.EqualValues(http.StatusNotFound, apiErr.ResponseStatus())
}
func TestErrors(t *testing.T) {
@@ -134,7 +134,7 @@ func TestErrors(t *testing.T) {
require.Error(err)
apiErr = api.AsServerError(err)
assert.NotNil(apiErr)
assert.EqualValues(http.StatusNotFound, apiErr.Status)
assert.EqualValues(http.StatusNotFound, apiErr.ResponseStatus())
_, err = pc.Create(tc.Context(), "static", proj.GetPublicId(), hostcatalogs.WithName("foo"))
require.Error(err)
@@ -145,11 +145,11 @@ func TestErrors(t *testing.T) {
require.Error(err)
apiErr = api.AsServerError(err)
assert.NotNil(apiErr)
assert.EqualValues(http.StatusNotFound, apiErr.Status)
assert.EqualValues(http.StatusNotFound, apiErr.ResponseStatus())
_, err = pc.Read(tc.Context(), "invalid id")
require.Error(err)
apiErr = api.AsServerError(err)
assert.NotNil(apiErr)
assert.EqualValues(http.StatusBadRequest, apiErr.Status)
assert.EqualValues(http.StatusBadRequest, apiErr.ResponseStatus())
}
+4 -4
View File
@@ -119,7 +119,7 @@ func TestCrud(t *testing.T) {
require.Error(err)
apiErr := api.AsServerError(err)
assert.NotNil(apiErr)
assert.EqualValues(http.StatusNotFound, apiErr.Status)
assert.EqualValues(http.StatusNotFound, apiErr.ResponseStatus())
}
func TestErrors(t *testing.T) {
@@ -147,7 +147,7 @@ func TestErrors(t *testing.T) {
require.Error(err)
apiErr := api.AsServerError(err)
assert.NotNil(apiErr)
assert.EqualValues(http.StatusNotFound, apiErr.Status)
assert.EqualValues(http.StatusNotFound, apiErr.ResponseStatus())
_, err = hClient.Create(tc.Context(), hc.Item.Id, hosts.WithName("foo"), hosts.WithStaticHostAddress("someaddress"))
require.Error(err)
@@ -158,11 +158,11 @@ func TestErrors(t *testing.T) {
require.Error(err)
apiErr = api.AsServerError(err)
assert.NotNil(apiErr)
assert.EqualValues(http.StatusNotFound, apiErr.Status)
assert.EqualValues(http.StatusNotFound, apiErr.ResponseStatus())
_, err = hClient.Read(tc.Context(), "invalid id")
require.Error(err)
apiErr = api.AsServerError(err)
assert.NotNil(apiErr)
assert.EqualValues(http.StatusBadRequest, apiErr.Status)
assert.EqualValues(http.StatusBadRequest, apiErr.ResponseStatus())
}
+4 -4
View File
@@ -156,7 +156,7 @@ func TestCrud(t *testing.T) {
require.Error(err)
apiErr := api.AsServerError(err)
require.NotNil(apiErr)
assert.EqualValues(http.StatusNotFound, apiErr.Status)
assert.EqualValues(http.StatusNotFound, apiErr.ResponseStatus())
}
// TODO: Get better coverage for expected errors and error formats.
@@ -185,7 +185,7 @@ func TestErrors(t *testing.T) {
require.Error(err)
apiErr := api.AsServerError(err)
assert.NotNil(apiErr)
assert.EqualValues(http.StatusNotFound, apiErr.Status)
assert.EqualValues(http.StatusNotFound, apiErr.ResponseStatus())
h, err = hClient.Create(tc.Context(), hc.Item.Id, hostsets.WithName("foo"))
require.Error(err)
@@ -197,11 +197,11 @@ func TestErrors(t *testing.T) {
require.Error(err)
apiErr = api.AsServerError(err)
assert.NotNil(apiErr)
assert.EqualValues(http.StatusNotFound, apiErr.Status)
assert.EqualValues(http.StatusNotFound, apiErr.ResponseStatus())
_, err = hClient.Read(tc.Context(), "invalid id")
require.Error(err)
apiErr = api.AsServerError(err)
assert.NotNil(apiErr)
assert.EqualValues(http.StatusBadRequest, apiErr.Status)
assert.EqualValues(http.StatusBadRequest, apiErr.ResponseStatus())
}
+4 -4
View File
@@ -284,7 +284,7 @@ func TestErrors(t *testing.T) {
require.Error(err)
apiErr := api.AsServerError(err)
assert.NotNil(apiErr)
assert.EqualValues(http.StatusNotFound, apiErr.Status)
assert.EqualValues(http.StatusNotFound, apiErr.ResponseStatus())
// Create another resource with the same name.
_, err = roleClient.Create(tc.Context(), tt.scopeId, roles.WithName("first"))
@@ -296,19 +296,19 @@ func TestErrors(t *testing.T) {
require.Error(err)
apiErr = api.AsServerError(err)
assert.NotNil(apiErr)
assert.EqualValues(http.StatusNotFound, apiErr.Status)
assert.EqualValues(http.StatusNotFound, apiErr.ResponseStatus())
_, err = roleClient.Read(tc.Context(), "invalid id")
require.Error(err)
apiErr = api.AsServerError(err)
assert.NotNil(apiErr)
assert.EqualValues(http.StatusBadRequest, apiErr.Status)
assert.EqualValues(http.StatusBadRequest, apiErr.ResponseStatus())
_, err = roleClient.Update(tc.Context(), u.Item.Id, u.Item.Version)
require.Error(err)
apiErr = api.AsServerError(err)
assert.NotNil(apiErr)
assert.EqualValues(http.StatusBadRequest, apiErr.Status)
assert.EqualValues(http.StatusBadRequest, apiErr.ResponseStatus())
})
}
}
+4 -4
View File
@@ -98,7 +98,7 @@ func TestCrud(t *testing.T) {
require.Error(err)
apiErr := api.AsServerError(err)
assert.NotNil(apiErr)
assert.EqualValues(http.StatusNotFound, apiErr.Status)
assert.EqualValues(http.StatusNotFound, apiErr.ResponseStatus())
}
func TestErrors(t *testing.T) {
@@ -122,17 +122,17 @@ func TestErrors(t *testing.T) {
require.Error(err)
apiErr := api.AsServerError(err)
assert.NotNil(apiErr)
assert.EqualValues(http.StatusNotFound, apiErr.Status)
assert.EqualValues(http.StatusNotFound, apiErr.ResponseStatus())
_, err = scps.Read(tc.Context(), "p_doesntexis")
require.Error(err)
apiErr = api.AsServerError(err)
assert.NotNil(apiErr)
assert.EqualValues(http.StatusNotFound, apiErr.Status)
assert.EqualValues(http.StatusNotFound, apiErr.ResponseStatus())
_, err = scps.Read(tc.Context(), "invalid id")
assert.Error(err)
apiErr = api.AsServerError(err)
assert.NotNil(apiErr)
assert.EqualValues(http.StatusBadRequest, apiErr.Status)
assert.EqualValues(http.StatusBadRequest, apiErr.ResponseStatus())
}
+4 -4
View File
@@ -152,7 +152,7 @@ func TestCrud(t *testing.T) {
assert.Error(err)
apiErr := api.AsServerError(err)
assert.NotNil(apiErr)
assert.EqualValues(http.StatusNotFound, apiErr.Status)
assert.EqualValues(http.StatusNotFound, apiErr.ResponseStatus())
}
func TestSet_Errors(t *testing.T) {
@@ -176,7 +176,7 @@ func TestSet_Errors(t *testing.T) {
require.Error(err)
apiErr := api.AsServerError(err)
assert.NotNil(apiErr)
assert.EqualValues(http.StatusNotFound, apiErr.Status)
assert.EqualValues(http.StatusNotFound, apiErr.ResponseStatus())
tar, err = tarClient.Create(tc.Context(), "tcp", proj.GetPublicId(), targets.WithName("foo"))
require.Error(err)
@@ -188,11 +188,11 @@ func TestSet_Errors(t *testing.T) {
require.Error(err)
apiErr = api.AsServerError(err)
assert.NotNil(apiErr)
assert.EqualValues(http.StatusNotFound, apiErr.Status)
assert.EqualValues(http.StatusNotFound, apiErr.ResponseStatus())
_, err = tarClient.Read(tc.Context(), "invalid id")
require.Error(err)
apiErr = api.AsServerError(err)
assert.NotNil(apiErr)
assert.EqualValues(http.StatusBadRequest, apiErr.Status)
assert.EqualValues(http.StatusBadRequest, apiErr.ResponseStatus())
}
+5 -5
View File
@@ -148,7 +148,7 @@ func TestCrud(t *testing.T) {
require.Error(err)
apiErr := api.AsServerError(err)
assert.NotNil(apiErr)
assert.EqualValues(http.StatusNotFound, apiErr.Status)
assert.EqualValues(http.StatusNotFound, apiErr.ResponseStatus())
}
func TestErrors(t *testing.T) {
@@ -171,7 +171,7 @@ func TestErrors(t *testing.T) {
require.Error(err)
apiErr := api.AsServerError(err)
assert.NotNil(apiErr)
assert.EqualValues(http.StatusNotFound, apiErr.Status)
assert.EqualValues(http.StatusNotFound, apiErr.ResponseStatus())
// Create another resource with the same name.
_, err = userClient.Create(tc.Context(), org.GetPublicId(), users.WithName("first"))
@@ -183,17 +183,17 @@ func TestErrors(t *testing.T) {
require.Error(err)
apiErr = api.AsServerError(err)
assert.NotNil(apiErr)
assert.EqualValues(http.StatusNotFound, apiErr.Status)
assert.EqualValues(http.StatusNotFound, apiErr.ResponseStatus())
_, err = userClient.Read(tc.Context(), "invalid id")
require.Error(err)
apiErr = api.AsServerError(err)
assert.NotNil(apiErr)
assert.EqualValues(http.StatusBadRequest, apiErr.Status)
assert.EqualValues(http.StatusBadRequest, apiErr.ResponseStatus())
_, err = userClient.Update(tc.Context(), u.Item.Id, u.Item.Version)
require.Error(err)
apiErr = api.AsServerError(err)
assert.NotNil(apiErr)
assert.EqualValues(http.StatusBadRequest, apiErr.Status)
assert.EqualValues(http.StatusBadRequest, apiErr.ResponseStatus())
}