Skip to content

Commit

Permalink
Merge pull request kubernetes#2124 from brendandburns/fix
Browse files Browse the repository at this point in the history
Make endpoints return 400 instead of 500
  • Loading branch information
dchen1107 committed Nov 3, 2014
2 parents c92e156 + 32a04e4 commit 81785d8
Show file tree
Hide file tree
Showing 4 changed files with 41 additions and 3 deletions.
21 changes: 21 additions & 0 deletions pkg/api/errors/errors.go
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,22 @@ func NewInvalid(kind, name string, errs ValidationErrorList) error {
}}
}

// NewBadRequest creates an error that indicates that the request is invalid and can not be processed.
func NewBadRequest(reason string) error {
return &statusError{
api.Status{
Status: api.StatusFailure,
Code: 400,
Reason: api.StatusReasonBadRequest,
Details: &api.StatusDetails{
Causes: []api.StatusCause{
{Message: reason},
},
},
},
}
}

// IsNotFound returns true if the specified error was created by NewNotFoundErr.
func IsNotFound(err error) bool {
return reasonForError(err) == api.StatusReasonNotFound
Expand All @@ -136,6 +152,11 @@ func IsInvalid(err error) bool {
return reasonForError(err) == api.StatusReasonInvalid
}

// IsBadRequest determines if err is an error which indicates that the request is invalid.
func IsBadRequest(err error) bool {
return reasonForError(err) == api.StatusReasonBadRequest
}

func reasonForError(err error) api.StatusReason {
switch t := err.(type) {
case *statusError:
Expand Down
6 changes: 6 additions & 0 deletions pkg/api/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -680,6 +680,12 @@ const (
// field attributes will be set.
// Status code 422
StatusReasonInvalid StatusReason = "Invalid"

// StatusReasonBadRequest means that the request itself was invalid, because the request
// doesn't make any sense, for example deleting a read-only object. This is different than
// StatusReasonInvalid above which indicates that the API call could possibly succeed, but the
// data was invalid. API calls that return BadRequest can never succeed.
StatusReasonBadRequest StatusReason = "BadRequest"
)

// StatusCause provides more information about an api.Status failure, including
Expand Down
6 changes: 3 additions & 3 deletions pkg/registry/endpoint/rest.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,10 @@ limitations under the License.
package endpoint

import (
"errors"
"fmt"

"github.com/GoogleCloudPlatform/kubernetes/pkg/api"
"github.com/GoogleCloudPlatform/kubernetes/pkg/api/errors"
"github.com/GoogleCloudPlatform/kubernetes/pkg/apiserver"
"github.com/GoogleCloudPlatform/kubernetes/pkg/labels"
"github.com/GoogleCloudPlatform/kubernetes/pkg/runtime"
Expand Down Expand Up @@ -48,7 +48,7 @@ func (rs *REST) Get(ctx api.Context, id string) (runtime.Object, error) {
// List satisfies the RESTStorage interface.
func (rs *REST) List(ctx api.Context, label, field labels.Selector) (runtime.Object, error) {
if !label.Empty() || !field.Empty() {
return nil, errors.New("label/field selectors are not supported on endpoints")
return nil, errors.NewBadRequest("label/field selectors are not supported on endpoints")
}
return rs.registry.ListEndpoints(ctx)
}
Expand Down Expand Up @@ -95,7 +95,7 @@ func (rs *REST) Update(ctx api.Context, obj runtime.Object) (<-chan apiserver.RE

// Delete satisfies the RESTStorage interface but is unimplemented.
func (rs *REST) Delete(ctx api.Context, id string) (<-chan apiserver.RESTResult, error) {
return nil, errors.New("unimplemented")
return nil, errors.NewBadRequest("Endpoints are read-only")
}

// New implements the RESTStorage interface.
Expand Down
11 changes: 11 additions & 0 deletions pkg/registry/endpoint/rest_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -96,3 +96,14 @@ func TestEndpointsRegistryList(t *testing.T) {
t.Errorf("Unexpected resource version: %#v", sl)
}
}

func TestEndpointsRegistryDelete(t *testing.T) {
registry := registrytest.NewServiceRegistry()
storage := NewREST(registry)
_, err := storage.Delete(api.NewContext(), "n/a")
if err == nil {
t.Error("unexpected non-error")
} else if !errors.IsBadRequest(err) {
t.Errorf("unexpected error: %v", err)
}
}

0 comments on commit 81785d8

Please sign in to comment.