Merge pull request #126265 from tnqn/fix-watch-error

Enrich the error returned from Request.Watch method
This commit is contained in:
Kubernetes Prow Robot 2024-08-30 14:47:31 +01:00 committed by GitHub
commit fd58143ed2
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 16 additions and 29 deletions

View File

@ -752,8 +752,9 @@ func (r *Request) Watch(ctx context.Context) (watch.Interface, error) {
// the server must have sent us an error in 'err' // the server must have sent us an error in 'err'
return true, nil return true, nil
} }
if result := r.transformResponse(resp, req); result.err != nil { result := r.transformResponse(resp, req)
return true, result.err if err := result.Error(); err != nil {
return true, err
} }
return true, fmt.Errorf("for request %s, got status: %v", url, resp.StatusCode) return true, fmt.Errorf("for request %s, got status: %v", url, resp.StatusCode)
}() }()

View File

@ -977,7 +977,7 @@ func TestRequestWatch(t *testing.T) {
Err: true, Err: true,
}, },
{ {
name: "server returns forbidden", name: "server returns forbidden with json content",
Request: &Request{ Request: &Request{
c: &RESTClient{ c: &RESTClient{
content: defaultContentConfig(), content: defaultContentConfig(),
@ -986,41 +986,27 @@ func TestRequestWatch(t *testing.T) {
}, },
serverReturns: []responseErr{ serverReturns: []responseErr{
{response: &http.Response{ {response: &http.Response{
Header: http.Header{"Content-Type": []string{"application/json"}},
StatusCode: http.StatusForbidden, StatusCode: http.StatusForbidden,
Body: io.NopCloser(bytes.NewReader([]byte{})), Body: io.NopCloser(bytes.NewReader([]byte(runtime.EncodeOrDie(scheme.Codecs.LegacyCodec(v1.SchemeGroupVersion), &metav1.Status{
Status: metav1.StatusFailure,
Message: "secrets is forbidden",
Reason: metav1.StatusReasonForbidden,
Code: http.StatusForbidden,
})))),
}, err: nil}, }, err: nil},
}, },
attemptsExpected: 1, attemptsExpected: 1,
Expect: []watch.Event{ Err: true,
{
Type: watch.Error,
Object: &metav1.Status{
Status: "Failure",
Code: 500,
Reason: "InternalError",
Message: `an error on the server ("unable to decode an event from the watch stream: test error") has prevented the request from succeeding`,
Details: &metav1.StatusDetails{
Causes: []metav1.StatusCause{
{
Type: "UnexpectedServerResponse",
Message: "unable to decode an event from the watch stream: test error",
},
{
Type: "ClientWatchDecoding",
Message: "unable to decode an event from the watch stream: test error",
},
},
},
},
},
},
Err: true,
ErrFn: func(err error) bool { ErrFn: func(err error) bool {
if err.Error() != "secrets is forbidden" {
return false
}
return apierrors.IsForbidden(err) return apierrors.IsForbidden(err)
}, },
}, },
{ {
name: "server returns forbidden", name: "server returns forbidden without content",
Request: &Request{ Request: &Request{
c: &RESTClient{ c: &RESTClient{
content: defaultContentConfig(), content: defaultContentConfig(),