// NewGenericServerResponse returns a new error for server responses that are not in a recognizable form. func NewGenericServerResponse(code int, verb string, qualifiedResource unversioned.GroupResource, name, serverMessage string, retryAfterSeconds int, isUnexpectedResponse bool) *StatusError { reason := unversioned.StatusReasonUnknown message := fmt.Sprintf("the server responded with the status code %d but did not return more information", code) switch code { case http.StatusConflict: if verb == "POST" { reason = unversioned.StatusReasonAlreadyExists } else { reason = unversioned.StatusReasonConflict } message = "the server reported a conflict" case http.StatusNotFound: reason = unversioned.StatusReasonNotFound message = "the server could not find the requested resource" case http.StatusBadRequest: reason = unversioned.StatusReasonBadRequest message = "the server rejected our request for an unknown reason" case http.StatusUnauthorized: reason = unversioned.StatusReasonUnauthorized message = "the server has asked for the client to provide credentials" case http.StatusForbidden: reason = unversioned.StatusReasonForbidden message = "the server does not allow access to the requested resource" case http.StatusMethodNotAllowed: reason = unversioned.StatusReasonMethodNotAllowed message = "the server does not allow this method on the requested resource" case StatusUnprocessableEntity: reason = unversioned.StatusReasonInvalid message = "the server rejected our request due to an error in our request" case StatusServerTimeout: reason = unversioned.StatusReasonServerTimeout message = "the server cannot complete the requested operation at this time, try again later" case StatusTooManyRequests: reason = unversioned.StatusReasonTimeout message = "the server has received too many requests and has asked us to try again later" default: if code >= 500 { reason = unversioned.StatusReasonInternalError message = fmt.Sprintf("an error on the server (%q) has prevented the request from succeeding", serverMessage) } } switch { case !qualifiedResource.Empty() && len(name) > 0: message = fmt.Sprintf("%s (%s %s %s)", message, strings.ToLower(verb), qualifiedResource.String(), name) case !qualifiedResource.Empty(): message = fmt.Sprintf("%s (%s %s)", message, strings.ToLower(verb), qualifiedResource.String()) } var causes []unversioned.StatusCause if isUnexpectedResponse { causes = []unversioned.StatusCause{ { Type: unversioned.CauseTypeUnexpectedServerResponse, Message: serverMessage, }, } } else { causes = nil } return &StatusError{unversioned.Status{ Status: unversioned.StatusFailure, Code: int32(code), Reason: reason, Details: &unversioned.StatusDetails{ Group: qualifiedResource.Group, Kind: qualifiedResource.Resource, Name: name, Causes: causes, RetryAfterSeconds: int32(retryAfterSeconds), }, Message: message, }} }