Commit 414ebd2d authored by k8s-merge-robot's avatar k8s-merge-robot

Merge pull request #17991 from krousey/errorstatus

Auto commit by PR queue bot
parents 29e8b612 ca7c765f
...@@ -45,6 +45,12 @@ type StatusError struct { ...@@ -45,6 +45,12 @@ type StatusError struct {
ErrStatus unversioned.Status ErrStatus unversioned.Status
} }
// APIStatus is exposed by errors that can be converted to an api.Status object
// for finer grained details.
type APIStatus interface {
Status() unversioned.Status
}
var _ error = &StatusError{} var _ error = &StatusError{}
// Error implements the Error interface. // Error implements the Error interface.
...@@ -394,7 +400,7 @@ func IsServerTimeout(err error) bool { ...@@ -394,7 +400,7 @@ func IsServerTimeout(err error) bool {
// and may be the result of another HTTP actor. // and may be the result of another HTTP actor.
func IsUnexpectedServerError(err error) bool { func IsUnexpectedServerError(err error) bool {
switch t := err.(type) { switch t := err.(type) {
case *StatusError: case APIStatus:
if d := t.Status().Details; d != nil { if d := t.Status().Details; d != nil {
for _, cause := range d.Causes { for _, cause := range d.Causes {
if cause.Type == unversioned.CauseTypeUnexpectedServerResponse { if cause.Type == unversioned.CauseTypeUnexpectedServerResponse {
...@@ -416,7 +422,7 @@ func IsUnexpectedObjectError(err error) bool { ...@@ -416,7 +422,7 @@ func IsUnexpectedObjectError(err error) bool {
// suggested seconds to wait, or false if the error does not imply a wait. // suggested seconds to wait, or false if the error does not imply a wait.
func SuggestsClientDelay(err error) (int, bool) { func SuggestsClientDelay(err error) (int, bool) {
switch t := err.(type) { switch t := err.(type) {
case *StatusError: case APIStatus:
if t.Status().Details != nil { if t.Status().Details != nil {
switch t.Status().Reason { switch t.Status().Reason {
case unversioned.StatusReasonServerTimeout, unversioned.StatusReasonTimeout: case unversioned.StatusReasonServerTimeout, unversioned.StatusReasonTimeout:
...@@ -429,8 +435,8 @@ func SuggestsClientDelay(err error) (int, bool) { ...@@ -429,8 +435,8 @@ func SuggestsClientDelay(err error) (int, bool) {
func reasonForError(err error) unversioned.StatusReason { func reasonForError(err error) unversioned.StatusReason {
switch t := err.(type) { switch t := err.(type) {
case *StatusError: case APIStatus:
return t.ErrStatus.Reason return t.Status().Reason
} }
return unversioned.StatusReasonUnknown return unversioned.StatusReasonUnknown
} }
...@@ -120,12 +120,6 @@ type VersionInterface interface { ...@@ -120,12 +120,6 @@ type VersionInterface interface {
ServerAPIVersions() (*unversioned.APIVersions, error) ServerAPIVersions() (*unversioned.APIVersions, error)
} }
// APIStatus is exposed by errors that can be converted to an api.Status object
// for finer grained details.
type APIStatus interface {
Status() unversioned.Status
}
// Client is the implementation of a Kubernetes client. // Client is the implementation of a Kubernetes client.
type Client struct { type Client struct {
*RESTClient *RESTClient
......
...@@ -710,7 +710,7 @@ func (r *Request) Stream() (io.ReadCloser, error) { ...@@ -710,7 +710,7 @@ func (r *Request) Stream() (io.ReadCloser, error) {
if runtimeObject, err := r.codec.Decode(bodyBytes); err == nil { if runtimeObject, err := r.codec.Decode(bodyBytes); err == nil {
statusError := errors.FromObject(runtimeObject) statusError := errors.FromObject(runtimeObject)
if _, ok := statusError.(APIStatus); ok { if _, ok := statusError.(errors.APIStatus); ok {
return nil, statusError return nil, statusError
} }
} }
......
...@@ -333,7 +333,7 @@ func TestTransformResponse(t *testing.T) { ...@@ -333,7 +333,7 @@ func TestTransformResponse(t *testing.T) {
if hasErr != test.Error { if hasErr != test.Error {
t.Errorf("%d: unexpected error: %t %v", i, test.Error, err) t.Errorf("%d: unexpected error: %t %v", i, test.Error, err)
} else if hasErr && test.Response.StatusCode > 399 { } else if hasErr && test.Response.StatusCode > 399 {
status, ok := err.(APIStatus) status, ok := err.(apierrors.APIStatus)
if !ok { if !ok {
t.Errorf("%d: response should have been transformable into APIStatus: %v", i, err) t.Errorf("%d: response should have been transformable into APIStatus: %v", i, err)
continue continue
......
...@@ -25,6 +25,7 @@ import ( ...@@ -25,6 +25,7 @@ import (
"testing" "testing"
"time" "time"
"k8s.io/kubernetes/pkg/api/errors"
"k8s.io/kubernetes/pkg/api/testapi" "k8s.io/kubernetes/pkg/api/testapi"
"k8s.io/kubernetes/pkg/api/unversioned" "k8s.io/kubernetes/pkg/api/unversioned"
"k8s.io/kubernetes/pkg/util" "k8s.io/kubernetes/pkg/util"
...@@ -95,7 +96,7 @@ func TestDoRequestFailed(t *testing.T) { ...@@ -95,7 +96,7 @@ func TestDoRequestFailed(t *testing.T) {
if err == nil || body != nil { if err == nil || body != nil {
t.Errorf("unexpected non-error: %#v", body) t.Errorf("unexpected non-error: %#v", body)
} }
ss, ok := err.(APIStatus) ss, ok := err.(errors.APIStatus)
if !ok { if !ok {
t.Errorf("unexpected error type %v", err) t.Errorf("unexpected error type %v", err)
} }
......
...@@ -29,7 +29,6 @@ import ( ...@@ -29,7 +29,6 @@ import (
"k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/errors" "k8s.io/kubernetes/pkg/api/errors"
"k8s.io/kubernetes/pkg/api/unversioned" "k8s.io/kubernetes/pkg/api/unversioned"
client "k8s.io/kubernetes/pkg/client/unversioned"
"k8s.io/kubernetes/pkg/kubectl" "k8s.io/kubernetes/pkg/kubectl"
cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util"
"k8s.io/kubernetes/pkg/kubectl/cmd/util/editor" "k8s.io/kubernetes/pkg/kubectl/cmd/util/editor"
...@@ -370,7 +369,7 @@ func (r *editResults) addError(err error, info *resource.Info) string { ...@@ -370,7 +369,7 @@ func (r *editResults) addError(err error, info *resource.Info) string {
reason := editReason{ reason := editReason{
head: fmt.Sprintf("%s %s was not valid", info.Mapping.Kind, info.Name), head: fmt.Sprintf("%s %s was not valid", info.Mapping.Kind, info.Name),
} }
if err, ok := err.(client.APIStatus); ok { if err, ok := err.(errors.APIStatus); ok {
if details := err.Status().Details; details != nil { if details := err.Status().Details; details != nil {
for _, cause := range details.Causes { for _, cause := range details.Causes {
reason.other = append(reason.other, cause.Message) reason.other = append(reason.other, cause.Message)
......
...@@ -31,7 +31,6 @@ import ( ...@@ -31,7 +31,6 @@ import (
"k8s.io/kubernetes/pkg/api/errors" "k8s.io/kubernetes/pkg/api/errors"
"k8s.io/kubernetes/pkg/api/latest" "k8s.io/kubernetes/pkg/api/latest"
"k8s.io/kubernetes/pkg/api/unversioned" "k8s.io/kubernetes/pkg/api/unversioned"
client "k8s.io/kubernetes/pkg/client/unversioned"
"k8s.io/kubernetes/pkg/client/unversioned/clientcmd" "k8s.io/kubernetes/pkg/client/unversioned/clientcmd"
"k8s.io/kubernetes/pkg/kubectl" "k8s.io/kubernetes/pkg/kubectl"
"k8s.io/kubernetes/pkg/kubectl/resource" "k8s.io/kubernetes/pkg/kubectl/resource"
...@@ -57,7 +56,7 @@ type debugError interface { ...@@ -57,7 +56,7 @@ type debugError interface {
// souce is the filename or URL to the template file(*.json or *.yaml), or stdin to use to handle the resource. // souce is the filename or URL to the template file(*.json or *.yaml), or stdin to use to handle the resource.
func AddSourceToErr(verb string, source string, err error) error { func AddSourceToErr(verb string, source string, err error) error {
if source != "" { if source != "" {
if statusError, ok := err.(*errors.StatusError); ok { if statusError, ok := err.(errors.APIStatus); ok {
status := statusError.Status() status := statusError.Status()
status.Message = fmt.Sprintf("error when %s %q: %v", verb, source, status.Message) status.Message = fmt.Sprintf("error when %s %q: %v", verb, source, status.Message)
return &errors.StatusError{ErrStatus: status} return &errors.StatusError{ErrStatus: status}
...@@ -145,7 +144,7 @@ func StandardErrorMessage(err error) (string, bool) { ...@@ -145,7 +144,7 @@ func StandardErrorMessage(err error) (string, bool) {
if debugErr, ok := err.(debugError); ok { if debugErr, ok := err.(debugError); ok {
glog.V(4).Infof(debugErr.DebugError()) glog.V(4).Infof(debugErr.DebugError())
} }
_, isStatus := err.(client.APIStatus) _, isStatus := err.(errors.APIStatus)
switch { switch {
case isStatus: case isStatus:
return fmt.Sprintf("Error from server: %s", err.Error()), true return fmt.Sprintf("Error from server: %s", err.Error()), true
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment