diff --git a/pkg/apiserver/resthandler.go b/pkg/apiserver/resthandler.go index 33a936ad575..046d955de12 100644 --- a/pkg/apiserver/resthandler.go +++ b/pkg/apiserver/resthandler.go @@ -80,8 +80,8 @@ type RequestScope struct { Subresource string } -func (scope *RequestScope) err(err error, req *restful.Request, res *restful.Response) { - errorNegotiated(err, scope.Serializer, scope.Kind.GroupVersion(), res.ResponseWriter, req.Request) +func (scope *RequestScope) err(err error, w http.ResponseWriter, req *http.Request) { + errorNegotiated(err, scope.Serializer, scope.Kind.GroupVersion(), w, req) } // getterFunc performs a get request with the given context and object name. The request @@ -98,7 +98,7 @@ func getResourceHandler(scope RequestScope, getter getterFunc) restful.RouteFunc w := res.ResponseWriter namespace, name, err := scope.Namer.Name(req) if err != nil { - scope.err(err, req, res) + scope.err(err, res.ResponseWriter, req.Request) return } ctx := scope.ContextFunc(req) @@ -106,11 +106,11 @@ func getResourceHandler(scope RequestScope, getter getterFunc) restful.RouteFunc result, err := getter(ctx, name, req) if err != nil { - scope.err(err, req, res) + scope.err(err, res.ResponseWriter, req.Request) return } if err := setSelfLink(result, req, scope.Namer); err != nil { - scope.err(err, req, res) + scope.err(err, res.ResponseWriter, req.Request) return } write(http.StatusOK, scope.Kind.GroupVersion(), scope.Serializer, result, w, req.Request) @@ -179,14 +179,14 @@ func ConnectResource(connecter rest.Connecter, scope RequestScope, admit admissi w := res.ResponseWriter namespace, name, err := scope.Namer.Name(req) if err != nil { - scope.err(err, req, res) + scope.err(err, res.ResponseWriter, req.Request) return } ctx := scope.ContextFunc(req) ctx = api.WithNamespace(ctx, namespace) opts, subpath, subpathKey := connecter.NewConnectOptions() if err := getRequestOptions(req, scope, opts, subpath, subpathKey); err != nil { - scope.err(err, req, res) + scope.err(err, res.ResponseWriter, req.Request) return } if admit.Handles(admission.Connect) { @@ -199,13 +199,13 @@ func ConnectResource(connecter rest.Connecter, scope RequestScope, admit admissi err = admit.Admit(admission.NewAttributesRecord(connectRequest, scope.Kind.GroupKind(), namespace, name, scope.Resource.GroupResource(), scope.Subresource, admission.Connect, userInfo)) if err != nil { - scope.err(err, req, res) + scope.err(err, res.ResponseWriter, req.Request) return } } handler, err := connecter.Connect(ctx, name, opts, &responder{scope: scope, req: req, res: res}) if err != nil { - scope.err(err, req, res) + scope.err(err, res.ResponseWriter, req.Request) return } handler.ServeHTTP(w, req.Request) @@ -224,7 +224,7 @@ func (r *responder) Object(statusCode int, obj runtime.Object) { } func (r *responder) Error(err error) { - r.scope.err(err, r.req, r.res) + r.scope.err(err, r.res.ResponseWriter, r.req.Request) } // ListResource returns a function that handles retrieving a list of resources from a rest.Storage object. @@ -237,7 +237,7 @@ func ListResource(r rest.Lister, rw rest.Watcher, scope RequestScope, forceWatch namespace, err := scope.Namer.Namespace(req) if err != nil { - scope.err(err, req, res) + scope.err(err, res.ResponseWriter, req.Request) return } @@ -254,7 +254,7 @@ func ListResource(r rest.Lister, rw rest.Watcher, scope RequestScope, forceWatch opts := api.ListOptions{} if err := scope.ParameterCodec.DecodeParameters(req.Request.URL.Query(), scope.Kind.GroupVersion(), &opts); err != nil { - scope.err(err, req, res) + scope.err(err, res.ResponseWriter, req.Request) return } @@ -267,7 +267,7 @@ func ListResource(r rest.Lister, rw rest.Watcher, scope RequestScope, forceWatch if opts.FieldSelector, err = opts.FieldSelector.Transform(fn); err != nil { // TODO: allow bad request to set field causes based on query parameters err = errors.NewBadRequest(err.Error()) - scope.err(err, req, res) + scope.err(err, res.ResponseWriter, req.Request) return } } @@ -283,7 +283,7 @@ func ListResource(r rest.Lister, rw rest.Watcher, scope RequestScope, forceWatch // and a field selector, since just the name is // sufficient to narrow down the request to a // single object. - scope.err(errors.NewBadRequest("both a name and a field selector provided; please provide one or the other."), req, res) + scope.err(errors.NewBadRequest("both a name and a field selector provided; please provide one or the other."), res.ResponseWriter, req.Request) return } opts.FieldSelector = nameSelector @@ -292,7 +292,7 @@ func ListResource(r rest.Lister, rw rest.Watcher, scope RequestScope, forceWatch if (opts.Watch || forceWatch) && rw != nil { watcher, err := rw.Watch(ctx, &opts) if err != nil { - scope.err(err, req, res) + scope.err(err, res.ResponseWriter, req.Request) return } // TODO: Currently we explicitly ignore ?timeout= and use only ?timeoutSeconds=. @@ -312,13 +312,13 @@ func ListResource(r rest.Lister, rw rest.Watcher, scope RequestScope, forceWatch trace.Step("About to List from storage") result, err := r.List(ctx, &opts) if err != nil { - scope.err(err, req, res) + scope.err(err, res.ResponseWriter, req.Request) return } trace.Step("Listing from storage done") numberOfItems, err := setListSelfLink(result, req, scope.Namer) if err != nil { - scope.err(err, req, res) + scope.err(err, res.ResponseWriter, req.Request) return } trace.Step("Self-linking done") @@ -348,7 +348,7 @@ func createHandler(r rest.NamedCreater, scope RequestScope, typer runtime.Object namespace, err = scope.Namer.Namespace(req) } if err != nil { - scope.err(err, req, res) + scope.err(err, res.ResponseWriter, req.Request) return } @@ -358,14 +358,14 @@ func createHandler(r rest.NamedCreater, scope RequestScope, typer runtime.Object gv := scope.Kind.GroupVersion() s, err := negotiateInputSerializer(req.Request, scope.Serializer) if err != nil { - scope.err(err, req, res) + scope.err(err, res.ResponseWriter, req.Request) return } decoder := scope.Serializer.DecoderToVersion(s, unversioned.GroupVersion{Group: gv.Group, Version: runtime.APIVersionInternal}) body, err := readBody(req.Request) if err != nil { - scope.err(err, req, res) + scope.err(err, res.ResponseWriter, req.Request) return } @@ -375,12 +375,12 @@ func createHandler(r rest.NamedCreater, scope RequestScope, typer runtime.Object obj, gvk, err := decoder.Decode(body, &defaultGVK, original) if err != nil { err = transformDecodeError(typer, err, original, gvk) - scope.err(err, req, res) + scope.err(err, res.ResponseWriter, req.Request) return } if gvk.GroupVersion() != gv { err = errors.NewBadRequest(fmt.Sprintf("the API version in the data (%s) does not match the expected API version (%v)", gvk.GroupVersion().String(), gv.String())) - scope.err(err, req, res) + scope.err(err, res.ResponseWriter, req.Request) return } trace.Step("Conversion done") @@ -390,7 +390,7 @@ func createHandler(r rest.NamedCreater, scope RequestScope, typer runtime.Object err = admit.Admit(admission.NewAttributesRecord(obj, scope.Kind.GroupKind(), namespace, name, scope.Resource.GroupResource(), scope.Subresource, admission.Create, userInfo)) if err != nil { - scope.err(err, req, res) + scope.err(err, res.ResponseWriter, req.Request) return } } @@ -404,13 +404,13 @@ func createHandler(r rest.NamedCreater, scope RequestScope, typer runtime.Object return out, err }) if err != nil { - scope.err(err, req, res) + scope.err(err, res.ResponseWriter, req.Request) return } trace.Step("Object stored in database") if err := setSelfLink(result, req, scope.Namer); err != nil { - scope.err(err, req, res) + scope.err(err, res.ResponseWriter, req.Request) return } trace.Step("Self-link added") @@ -450,7 +450,7 @@ func PatchResource(r rest.Patcher, scope RequestScope, typer runtime.ObjectTyper namespace, name, err := scope.Namer.Name(req) if err != nil { - scope.err(err, req, res) + scope.err(err, res.ResponseWriter, req.Request) return } @@ -459,7 +459,7 @@ func PatchResource(r rest.Patcher, scope RequestScope, typer runtime.ObjectTyper versionedObj, err := converter.ConvertToVersion(r.New(), scope.Kind.GroupVersion().String()) if err != nil { - scope.err(err, req, res) + scope.err(err, res.ResponseWriter, req.Request) return } @@ -473,13 +473,13 @@ func PatchResource(r rest.Patcher, scope RequestScope, typer runtime.ObjectTyper patchJS, err := readBody(req.Request) if err != nil { - scope.err(err, req, res) + scope.err(err, res.ResponseWriter, req.Request) return } s, ok := scope.Serializer.SerializerForMediaType("application/json", nil) if !ok { - scope.err(fmt.Errorf("no serializer defined for JSON"), req, res) + scope.err(fmt.Errorf("no serializer defined for JSON"), res.ResponseWriter, req.Request) return } gv := scope.Kind.GroupVersion() @@ -499,12 +499,12 @@ func PatchResource(r rest.Patcher, scope RequestScope, typer runtime.ObjectTyper result, err := patchResource(ctx, updateAdmit, timeout, versionedObj, r, name, patchType, patchJS, scope.Namer, codec) if err != nil { - scope.err(err, req, res) + scope.err(err, res.ResponseWriter, req.Request) return } if err := setSelfLink(result, req, scope.Namer); err != nil { - scope.err(err, req, res) + scope.err(err, res.ResponseWriter, req.Request) return } @@ -625,7 +625,7 @@ func UpdateResource(r rest.Updater, scope RequestScope, typer runtime.ObjectType namespace, name, err := scope.Namer.Name(req) if err != nil { - scope.err(err, req, res) + scope.err(err, res.ResponseWriter, req.Request) return } ctx := scope.ContextFunc(req) @@ -633,13 +633,13 @@ func UpdateResource(r rest.Updater, scope RequestScope, typer runtime.ObjectType body, err := readBody(req.Request) if err != nil { - scope.err(err, req, res) + scope.err(err, res.ResponseWriter, req.Request) return } s, err := negotiateInputSerializer(req.Request, scope.Serializer) if err != nil { - scope.err(err, req, res) + scope.err(err, res.ResponseWriter, req.Request) return } defaultGVK := scope.Kind @@ -648,18 +648,18 @@ func UpdateResource(r rest.Updater, scope RequestScope, typer runtime.ObjectType obj, gvk, err := scope.Serializer.DecoderToVersion(s, defaultGVK.GroupVersion()).Decode(body, &defaultGVK, original) if err != nil { err = transformDecodeError(typer, err, original, gvk) - scope.err(err, req, res) + scope.err(err, res.ResponseWriter, req.Request) return } if gvk.GroupVersion() != defaultGVK.GroupVersion() { err = errors.NewBadRequest(fmt.Sprintf("the API version in the data (%s) does not match the expected API version (%s)", gvk.GroupVersion(), defaultGVK.GroupVersion())) - scope.err(err, req, res) + scope.err(err, res.ResponseWriter, req.Request) return } trace.Step("Conversion done") if err := checkName(obj, name, namespace, scope.Namer); err != nil { - scope.err(err, req, res) + scope.err(err, res.ResponseWriter, req.Request) return } @@ -668,7 +668,7 @@ func UpdateResource(r rest.Updater, scope RequestScope, typer runtime.ObjectType err = admit.Admit(admission.NewAttributesRecord(obj, scope.Kind.GroupKind(), namespace, name, scope.Resource.GroupResource(), scope.Subresource, admission.Update, userInfo)) if err != nil { - scope.err(err, req, res) + scope.err(err, res.ResponseWriter, req.Request) return } } @@ -681,13 +681,13 @@ func UpdateResource(r rest.Updater, scope RequestScope, typer runtime.ObjectType return obj, err }) if err != nil { - scope.err(err, req, res) + scope.err(err, res.ResponseWriter, req.Request) return } trace.Step("Object stored in database") if err := setSelfLink(result, req, scope.Namer); err != nil { - scope.err(err, req, res) + scope.err(err, res.ResponseWriter, req.Request) return } trace.Step("Self-link added") @@ -714,7 +714,7 @@ func DeleteResource(r rest.GracefulDeleter, checkBody bool, scope RequestScope, namespace, name, err := scope.Namer.Name(req) if err != nil { - scope.err(err, req, res) + scope.err(err, res.ResponseWriter, req.Request) return } ctx := scope.ContextFunc(req) @@ -724,23 +724,23 @@ func DeleteResource(r rest.GracefulDeleter, checkBody bool, scope RequestScope, if checkBody { body, err := readBody(req.Request) if err != nil { - scope.err(err, req, res) + scope.err(err, res.ResponseWriter, req.Request) return } if len(body) > 0 { s, err := negotiateInputSerializer(req.Request, scope.Serializer) if err != nil { - scope.err(err, req, res) + scope.err(err, res.ResponseWriter, req.Request) return } defaultGVK := scope.Kind.GroupVersion().WithKind("DeleteOptions") obj, _, err := scope.Serializer.DecoderToVersion(s, defaultGVK.GroupVersion()).Decode(body, &defaultGVK, options) if err != nil { - scope.err(err, req, res) + scope.err(err, res.ResponseWriter, req.Request) return } if obj != options { - scope.err(fmt.Errorf("decoded object cannot be converted to DeleteOptions"), req, res) + scope.err(fmt.Errorf("decoded object cannot be converted to DeleteOptions"), res.ResponseWriter, req.Request) return } } @@ -751,7 +751,7 @@ func DeleteResource(r rest.GracefulDeleter, checkBody bool, scope RequestScope, err = admit.Admit(admission.NewAttributesRecord(nil, scope.Kind.GroupKind(), namespace, name, scope.Resource.GroupResource(), scope.Subresource, admission.Delete, userInfo)) if err != nil { - scope.err(err, req, res) + scope.err(err, res.ResponseWriter, req.Request) return } } @@ -761,7 +761,7 @@ func DeleteResource(r rest.GracefulDeleter, checkBody bool, scope RequestScope, return r.Delete(ctx, name, options) }) if err != nil { - scope.err(err, req, res) + scope.err(err, res.ResponseWriter, req.Request) return } trace.Step("Object deleted from database") @@ -781,7 +781,7 @@ func DeleteResource(r rest.GracefulDeleter, checkBody bool, scope RequestScope, // when a non-status response is returned, set the self link if _, ok := result.(*unversioned.Status); !ok { if err := setSelfLink(result, req, scope.Namer); err != nil { - scope.err(err, req, res) + scope.err(err, res.ResponseWriter, req.Request) return } } @@ -800,7 +800,7 @@ func DeleteCollection(r rest.CollectionDeleter, checkBody bool, scope RequestSco namespace, err := scope.Namer.Namespace(req) if err != nil { - scope.err(err, req, res) + scope.err(err, res.ResponseWriter, req.Request) return } @@ -812,14 +812,14 @@ func DeleteCollection(r rest.CollectionDeleter, checkBody bool, scope RequestSco err = admit.Admit(admission.NewAttributesRecord(nil, scope.Kind.GroupKind(), namespace, "", scope.Resource.GroupResource(), scope.Subresource, admission.Delete, userInfo)) if err != nil { - scope.err(err, req, res) + scope.err(err, res.ResponseWriter, req.Request) return } } listOptions := api.ListOptions{} if err := scope.ParameterCodec.DecodeParameters(req.Request.URL.Query(), scope.Kind.GroupVersion(), &listOptions); err != nil { - scope.err(err, req, res) + scope.err(err, res.ResponseWriter, req.Request) return } @@ -832,7 +832,7 @@ func DeleteCollection(r rest.CollectionDeleter, checkBody bool, scope RequestSco if listOptions.FieldSelector, err = listOptions.FieldSelector.Transform(fn); err != nil { // TODO: allow bad request to set field causes based on query parameters err = errors.NewBadRequest(err.Error()) - scope.err(err, req, res) + scope.err(err, res.ResponseWriter, req.Request) return } } @@ -841,23 +841,23 @@ func DeleteCollection(r rest.CollectionDeleter, checkBody bool, scope RequestSco if checkBody { body, err := readBody(req.Request) if err != nil { - scope.err(err, req, res) + scope.err(err, res.ResponseWriter, req.Request) return } if len(body) > 0 { s, err := negotiateInputSerializer(req.Request, scope.Serializer) if err != nil { - scope.err(err, req, res) + scope.err(err, res.ResponseWriter, req.Request) return } defaultGVK := scope.Kind.GroupVersion().WithKind("DeleteOptions") obj, _, err := scope.Serializer.DecoderToVersion(s, defaultGVK.GroupVersion()).Decode(body, &defaultGVK, options) if err != nil { - scope.err(err, req, res) + scope.err(err, res.ResponseWriter, req.Request) return } if obj != options { - scope.err(fmt.Errorf("decoded object cannot be converted to DeleteOptions"), req, res) + scope.err(fmt.Errorf("decoded object cannot be converted to DeleteOptions"), res.ResponseWriter, req.Request) return } } @@ -867,7 +867,7 @@ func DeleteCollection(r rest.CollectionDeleter, checkBody bool, scope RequestSco return r.DeleteCollection(ctx, options, &listOptions) }) if err != nil { - scope.err(err, req, res) + scope.err(err, res.ResponseWriter, req.Request) return } @@ -885,7 +885,7 @@ func DeleteCollection(r rest.CollectionDeleter, checkBody bool, scope RequestSco // when a non-status response is returned, set the self link if _, ok := result.(*unversioned.Status); !ok { if _, err := setListSelfLink(result, req, scope.Namer); err != nil { - scope.err(err, req, res) + scope.err(err, res.ResponseWriter, req.Request) return } } diff --git a/pkg/apiserver/watch.go b/pkg/apiserver/watch.go index 8b951d9e539..086ebfe3d83 100644 --- a/pkg/apiserver/watch.go +++ b/pkg/apiserver/watch.go @@ -68,7 +68,7 @@ func (w *realTimeoutFactory) TimeoutCh() (<-chan time.Time, func() bool) { func serveWatch(watcher watch.Interface, scope RequestScope, req *restful.Request, res *restful.Response, timeout time.Duration) { s, mediaType, err := negotiateOutputSerializer(req.Request, scope.Serializer) if err != nil { - scope.err(err, req, res) + scope.err(err, res.ResponseWriter, req.Request) return } // TODO: replace with typed serialization