diff --git a/pkg/api/errors/errors.go b/pkg/api/errors/errors.go index 4eb4a72a166..87aa398f1f9 100644 --- a/pkg/api/errors/errors.go +++ b/pkg/api/errors/errors.go @@ -45,6 +45,12 @@ type StatusError struct { 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{} // Error implements the Error interface. @@ -394,7 +400,7 @@ func IsServerTimeout(err error) bool { // and may be the result of another HTTP actor. func IsUnexpectedServerError(err error) bool { switch t := err.(type) { - case *StatusError: + case APIStatus: if d := t.Status().Details; d != nil { for _, cause := range d.Causes { if cause.Type == unversioned.CauseTypeUnexpectedServerResponse { @@ -416,7 +422,7 @@ func IsUnexpectedObjectError(err error) bool { // suggested seconds to wait, or false if the error does not imply a wait. func SuggestsClientDelay(err error) (int, bool) { switch t := err.(type) { - case *StatusError: + case APIStatus: if t.Status().Details != nil { switch t.Status().Reason { case unversioned.StatusReasonServerTimeout, unversioned.StatusReasonTimeout: @@ -429,8 +435,8 @@ func SuggestsClientDelay(err error) (int, bool) { func reasonForError(err error) unversioned.StatusReason { switch t := err.(type) { - case *StatusError: - return t.ErrStatus.Reason + case APIStatus: + return t.Status().Reason } return unversioned.StatusReasonUnknown } diff --git a/pkg/client/unversioned/client.go b/pkg/client/unversioned/client.go index b761fdcd64c..1ac969cf341 100644 --- a/pkg/client/unversioned/client.go +++ b/pkg/client/unversioned/client.go @@ -120,12 +120,6 @@ type VersionInterface interface { 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. type Client struct { *RESTClient diff --git a/pkg/client/unversioned/request.go b/pkg/client/unversioned/request.go index d71a6909fda..57713f66ac2 100644 --- a/pkg/client/unversioned/request.go +++ b/pkg/client/unversioned/request.go @@ -686,7 +686,7 @@ func (r *Request) Stream() (io.ReadCloser, error) { if runtimeObject, err := r.codec.Decode(bodyBytes); err == nil { statusError := errors.FromObject(runtimeObject) - if _, ok := statusError.(APIStatus); ok { + if _, ok := statusError.(errors.APIStatus); ok { return nil, statusError } } diff --git a/pkg/client/unversioned/request_test.go b/pkg/client/unversioned/request_test.go index bc0e02062c0..3371d1ece26 100644 --- a/pkg/client/unversioned/request_test.go +++ b/pkg/client/unversioned/request_test.go @@ -333,7 +333,7 @@ func TestTransformResponse(t *testing.T) { if hasErr != test.Error { t.Errorf("%d: unexpected error: %t %v", i, test.Error, err) } else if hasErr && test.Response.StatusCode > 399 { - status, ok := err.(APIStatus) + status, ok := err.(apierrors.APIStatus) if !ok { t.Errorf("%d: response should have been transformable into APIStatus: %v", i, err) continue diff --git a/pkg/client/unversioned/restclient_test.go b/pkg/client/unversioned/restclient_test.go index d2f19080ea8..c5dd33a5092 100644 --- a/pkg/client/unversioned/restclient_test.go +++ b/pkg/client/unversioned/restclient_test.go @@ -22,6 +22,7 @@ import ( "reflect" "testing" + "k8s.io/kubernetes/pkg/api/errors" "k8s.io/kubernetes/pkg/api/testapi" "k8s.io/kubernetes/pkg/api/unversioned" "k8s.io/kubernetes/pkg/util" @@ -92,7 +93,7 @@ func TestDoRequestFailed(t *testing.T) { if err == nil || body != nil { t.Errorf("unexpected non-error: %#v", body) } - ss, ok := err.(APIStatus) + ss, ok := err.(errors.APIStatus) if !ok { t.Errorf("unexpected error type %v", err) } diff --git a/pkg/kubectl/cmd/edit.go b/pkg/kubectl/cmd/edit.go index 4c496576e51..35036206043 100644 --- a/pkg/kubectl/cmd/edit.go +++ b/pkg/kubectl/cmd/edit.go @@ -29,7 +29,6 @@ import ( "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api/errors" "k8s.io/kubernetes/pkg/api/unversioned" - client "k8s.io/kubernetes/pkg/client/unversioned" "k8s.io/kubernetes/pkg/kubectl" cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" "k8s.io/kubernetes/pkg/kubectl/cmd/util/editor" @@ -370,7 +369,7 @@ func (r *editResults) addError(err error, info *resource.Info) string { reason := editReason{ 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 { for _, cause := range details.Causes { reason.other = append(reason.other, cause.Message) diff --git a/pkg/kubectl/cmd/util/helpers.go b/pkg/kubectl/cmd/util/helpers.go index 3a7a15f1569..57bedff555a 100644 --- a/pkg/kubectl/cmd/util/helpers.go +++ b/pkg/kubectl/cmd/util/helpers.go @@ -31,7 +31,6 @@ import ( "k8s.io/kubernetes/pkg/api/errors" "k8s.io/kubernetes/pkg/api/latest" "k8s.io/kubernetes/pkg/api/unversioned" - client "k8s.io/kubernetes/pkg/client/unversioned" "k8s.io/kubernetes/pkg/client/unversioned/clientcmd" "k8s.io/kubernetes/pkg/kubectl" "k8s.io/kubernetes/pkg/kubectl/resource" @@ -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. func AddSourceToErr(verb string, source string, err error) error { if source != "" { - if statusError, ok := err.(*errors.StatusError); ok { + if statusError, ok := err.(errors.APIStatus); ok { status := statusError.Status() status.Message = fmt.Sprintf("error when %s %q: %v", verb, source, status.Message) return &errors.StatusError{ErrStatus: status} @@ -145,7 +144,7 @@ func StandardErrorMessage(err error) (string, bool) { if debugErr, ok := err.(debugError); ok { glog.V(4).Infof(debugErr.DebugError()) } - _, isStatus := err.(client.APIStatus) + _, isStatus := err.(errors.APIStatus) switch { case isStatus: return fmt.Sprintf("Error from server: %s", err.Error()), true