mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-09-16 22:53:22 +00:00
Return validation errors from storage create/update
This commit is contained in:
@@ -78,15 +78,25 @@ func NewConflictErr(kind, name string, err error) error {
|
||||
}
|
||||
|
||||
// NewInvalidError returns an error indicating the item is invalid and cannot be processed.
|
||||
func NewInvalidError(kind, name string, errs errors.ErrorList) error {
|
||||
func NewInvalidErr(kind, name string, errs errors.ErrorList) error {
|
||||
causes := make([]api.StatusCause, 0, len(errs))
|
||||
for i := range errs {
|
||||
if err, ok := errs[i].(errors.ValidationError); ok {
|
||||
causes = append(causes, api.StatusCause{
|
||||
Reason: api.CauseReasonType(err.Type),
|
||||
Message: err.Error(),
|
||||
Field: err.Field,
|
||||
})
|
||||
}
|
||||
}
|
||||
return &apiServerError{api.Status{
|
||||
Status: api.StatusFailure,
|
||||
Code: 422, // RFC 4918
|
||||
Reason: api.ReasonTypeInvalid,
|
||||
Details: &api.StatusDetails{
|
||||
Kind: kind,
|
||||
ID: name,
|
||||
// TODO: causes
|
||||
Kind: kind,
|
||||
ID: name,
|
||||
Causes: causes,
|
||||
},
|
||||
Message: fmt.Sprintf("%s %q is invalid: %s", kind, name, errs.ToError()),
|
||||
}}
|
||||
|
@@ -19,9 +19,11 @@ package apiserver
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"reflect"
|
||||
"testing"
|
||||
|
||||
"github.com/GoogleCloudPlatform/kubernetes/pkg/api"
|
||||
apierrors "github.com/GoogleCloudPlatform/kubernetes/pkg/api/errors"
|
||||
)
|
||||
|
||||
func TestErrorNew(t *testing.T) {
|
||||
@@ -45,11 +47,86 @@ func TestErrorNew(t *testing.T) {
|
||||
if !IsNotFound(NewNotFoundErr("test", "3")) {
|
||||
t.Errorf("expected to be not found")
|
||||
}
|
||||
if !IsInvalid(NewInvalidError("test", "2", nil)) {
|
||||
if !IsInvalid(NewInvalidErr("test", "2", nil)) {
|
||||
t.Errorf("expected to be invalid")
|
||||
}
|
||||
}
|
||||
|
||||
func TestNewInvalidErr(t *testing.T) {
|
||||
testCases := []struct {
|
||||
Err apierrors.ValidationError
|
||||
Details *api.StatusDetails
|
||||
}{
|
||||
{
|
||||
apierrors.NewDuplicate("field[0].name", "bar"),
|
||||
&api.StatusDetails{
|
||||
Kind: "kind",
|
||||
ID: "name",
|
||||
Causes: []api.StatusCause{{
|
||||
Reason: api.CauseReasonTypeFieldValueDuplicate,
|
||||
Field: "field[0].name",
|
||||
}},
|
||||
},
|
||||
},
|
||||
{
|
||||
apierrors.NewInvalid("field[0].name", "bar"),
|
||||
&api.StatusDetails{
|
||||
Kind: "kind",
|
||||
ID: "name",
|
||||
Causes: []api.StatusCause{{
|
||||
Reason: api.CauseReasonTypeFieldValueInvalid,
|
||||
Field: "field[0].name",
|
||||
}},
|
||||
},
|
||||
},
|
||||
{
|
||||
apierrors.NewNotFound("field[0].name", "bar"),
|
||||
&api.StatusDetails{
|
||||
Kind: "kind",
|
||||
ID: "name",
|
||||
Causes: []api.StatusCause{{
|
||||
Reason: api.CauseReasonTypeFieldValueNotFound,
|
||||
Field: "field[0].name",
|
||||
}},
|
||||
},
|
||||
},
|
||||
{
|
||||
apierrors.NewNotSupported("field[0].name", "bar"),
|
||||
&api.StatusDetails{
|
||||
Kind: "kind",
|
||||
ID: "name",
|
||||
Causes: []api.StatusCause{{
|
||||
Reason: api.CauseReasonTypeFieldValueNotSupported,
|
||||
Field: "field[0].name",
|
||||
}},
|
||||
},
|
||||
},
|
||||
{
|
||||
apierrors.NewRequired("field[0].name", "bar"),
|
||||
&api.StatusDetails{
|
||||
Kind: "kind",
|
||||
ID: "name",
|
||||
Causes: []api.StatusCause{{
|
||||
Reason: api.CauseReasonTypeFieldValueRequired,
|
||||
Field: "field[0].name",
|
||||
}},
|
||||
},
|
||||
},
|
||||
}
|
||||
for i := range testCases {
|
||||
vErr, expected := testCases[i].Err, testCases[i].Details
|
||||
expected.Causes[0].Message = vErr.Error()
|
||||
err := NewInvalidErr("kind", "name", apierrors.ErrorList{vErr})
|
||||
status := errToAPIStatus(err)
|
||||
if status.Code != 422 || status.Reason != api.ReasonTypeInvalid {
|
||||
t.Errorf("unexpected status: %#v", status)
|
||||
}
|
||||
if !reflect.DeepEqual(expected, status.Details) {
|
||||
t.Errorf("expected %#v, got %#v", expected, status.Details)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func Test_errToAPIStatus(t *testing.T) {
|
||||
err := &apiServerError{}
|
||||
status := errToAPIStatus(err)
|
||||
|
Reference in New Issue
Block a user