From 60d83657516f63b51e43f5b2350821cb5b6835f0 Mon Sep 17 00:00:00 2001 From: Clayton Coleman Date: Mon, 27 Feb 2017 15:45:34 -0500 Subject: [PATCH] Server timeout returns an incorrect error Not a valid Status object in JSON --- .../apiserver/pkg/server/filters/timeout.go | 2 +- .../pkg/server/filters/timeout_test.go | 17 ++++++++++++----- vendor/BUILD | 2 ++ 3 files changed, 15 insertions(+), 6 deletions(-) diff --git a/staging/src/k8s.io/apiserver/pkg/server/filters/timeout.go b/staging/src/k8s.io/apiserver/pkg/server/filters/timeout.go index 9232fcb516a..ed2de1a9972 100644 --- a/staging/src/k8s.io/apiserver/pkg/server/filters/timeout.go +++ b/staging/src/k8s.io/apiserver/pkg/server/filters/timeout.go @@ -197,7 +197,7 @@ func (tw *baseTimeoutWriter) timeout(err *apierrors.StatusError) { if !tw.wroteHeader && !tw.hijacked { tw.w.WriteHeader(http.StatusGatewayTimeout) enc := json.NewEncoder(tw.w) - enc.Encode(err) + enc.Encode(&err.ErrStatus) } else { // The timeout writer has been used by the inner handler. There is // no way to timeout the HTTP request at the point. We have to shutdown diff --git a/staging/src/k8s.io/apiserver/pkg/server/filters/timeout_test.go b/staging/src/k8s.io/apiserver/pkg/server/filters/timeout_test.go index 4498122414c..991427231a8 100644 --- a/staging/src/k8s.io/apiserver/pkg/server/filters/timeout_test.go +++ b/staging/src/k8s.io/apiserver/pkg/server/filters/timeout_test.go @@ -17,15 +17,18 @@ limitations under the License. package filters import ( + "encoding/json" "io/ioutil" "net/http" "net/http/httptest" + "reflect" "testing" "time" apierrors "k8s.io/apimachinery/pkg/api/errors" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime/schema" - "strings" + "k8s.io/apimachinery/pkg/util/diff" ) func TestTimeout(t *testing.T) { @@ -50,7 +53,7 @@ func TestTimeout(t *testing.T) { sendResponse <- struct{}{} res, err := http.Get(ts.URL) if err != nil { - t.Error(err) + t.Fatal(err) } if res.StatusCode != http.StatusOK { t.Errorf("got res.StatusCode %d; expected %d", res.StatusCode, http.StatusOK) @@ -67,14 +70,18 @@ func TestTimeout(t *testing.T) { timeout <- time.Time{} res, err = http.Get(ts.URL) if err != nil { - t.Error(err) + t.Fatal(err) } if res.StatusCode != http.StatusGatewayTimeout { t.Errorf("got res.StatusCode %d; expected %d", res.StatusCode, http.StatusServiceUnavailable) } body, _ = ioutil.ReadAll(res.Body) - if !strings.Contains(string(body), timeoutErr.Error()) { - t.Errorf("got body %q; expected it to contain %q", string(body), timeoutErr.Error()) + status := &metav1.Status{} + if err := json.Unmarshal(body, status); err != nil { + t.Fatal(err) + } + if !reflect.DeepEqual(status, &timeoutErr.ErrStatus) { + t.Errorf("unexpected object: %s", diff.ObjectReflectDiff(&timeoutErr.ErrStatus, status)) } // Now try to send a response diff --git a/vendor/BUILD b/vendor/BUILD index 5fae3897dbe..da14ccedc7c 100644 --- a/vendor/BUILD +++ b/vendor/BUILD @@ -10399,7 +10399,9 @@ go_test( tags = ["automanaged"], deps = [ "//vendor:k8s.io/apimachinery/pkg/api/errors", + "//vendor:k8s.io/apimachinery/pkg/apis/meta/v1", "//vendor:k8s.io/apimachinery/pkg/runtime/schema", + "//vendor:k8s.io/apimachinery/pkg/util/diff", "//vendor:k8s.io/apimachinery/pkg/util/sets", "//vendor:k8s.io/apiserver/pkg/endpoints/filters", "//vendor:k8s.io/apiserver/pkg/endpoints/request",