diff --git a/pkg/endpoints/apiserver_test.go b/pkg/endpoints/apiserver_test.go index 0e9292708..54172d70e 100644 --- a/pkg/endpoints/apiserver_test.go +++ b/pkg/endpoints/apiserver_test.go @@ -2839,65 +2839,6 @@ func TestDeleteWithOptionsQueryAndBody(t *testing.T) { } } -func TestLegacyDelete(t *testing.T) { - storage := map[string]rest.Storage{} - simpleStorage := SimpleRESTStorage{} - ID := "id" - storage["simple"] = LegacyRESTStorage{&simpleStorage} - var _ rest.Deleter = storage["simple"].(LegacyRESTStorage) - handler := handle(storage) - server := httptest.NewServer(handler) - defer server.Close() - - client := http.Client{} - request, err := http.NewRequest("DELETE", server.URL+"/"+prefix+"/"+testGroupVersion.Group+"/"+testGroupVersion.Version+"/namespaces/default/simple/"+ID, nil) - res, err := client.Do(request) - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - if res.StatusCode != http.StatusOK { - t.Errorf("unexpected response: %#v", res) - } - if simpleStorage.deleted != ID { - t.Errorf("Unexpected delete: %s, expected %s", simpleStorage.deleted, ID) - } - if simpleStorage.deleteOptions != nil { - t.Errorf("unexpected delete options: %#v", simpleStorage.deleteOptions) - } -} - -func TestLegacyDeleteIgnoresOptions(t *testing.T) { - storage := map[string]rest.Storage{} - simpleStorage := SimpleRESTStorage{} - ID := "id" - storage["simple"] = LegacyRESTStorage{&simpleStorage} - handler := handle(storage) - server := httptest.NewServer(handler) - defer server.Close() - - item := metav1.NewDeleteOptions(300) - body, err := runtime.Encode(codec, item) - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - - client := http.Client{} - request, err := http.NewRequest("DELETE", server.URL+"/"+prefix+"/"+testGroupVersion.Group+"/"+testGroupVersion.Version+"/namespaces/default/simple/"+ID, bytes.NewReader(body)) - res, err := client.Do(request) - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - if res.StatusCode != http.StatusOK { - t.Errorf("unexpected response: %#v", res) - } - if simpleStorage.deleted != ID { - t.Errorf("Unexpected delete: %s, expected %s", simpleStorage.deleted, ID) - } - if simpleStorage.deleteOptions != nil { - t.Errorf("unexpected delete options: %#v", simpleStorage.deleteOptions) - } -} - func TestDeleteInvokesAdmissionControl(t *testing.T) { // TODO: remove mutating deny when we removed it from the endpoint implementation and ported all plugins for _, admit := range []admission.Interface{alwaysMutatingDeny{}, alwaysValidatingDeny{}} { diff --git a/pkg/endpoints/installer.go b/pkg/endpoints/installer.go index 90b8439b8..934ee94f7 100644 --- a/pkg/endpoints/installer.go +++ b/pkg/endpoints/installer.go @@ -227,7 +227,6 @@ func (a *APIInstaller) registerResourceHandlers(path string, storage rest.Storag lister, isLister := storage.(rest.Lister) getter, isGetter := storage.(rest.Getter) getterWithOptions, isGetterWithOptions := storage.(rest.GetterWithOptions) - deleter, isDeleter := storage.(rest.Deleter) gracefulDeleter, isGracefulDeleter := storage.(rest.GracefulDeleter) collectionDeleter, isCollectionDeleter := storage.(rest.CollectionDeleter) updater, isUpdater := storage.(rest.Updater) @@ -273,16 +272,12 @@ func (a *APIInstaller) registerResourceHandlers(path string, storage rest.Storag var versionedDeleteOptions runtime.Object var versionedDeleterObject interface{} - switch { - case isGracefulDeleter: + if isGracefulDeleter { versionedDeleteOptions, err = a.group.Creater.New(optionsExternalVersion.WithKind("DeleteOptions")) if err != nil { return nil, err } versionedDeleterObject = indirectArbitraryPointer(versionedDeleteOptions) - isDeleter = true - case isDeleter: - gracefulDeleter = rest.GracefulDeleteAdapter{Deleter: deleter} } versionedStatusPtr, err := a.group.Creater.New(optionsExternalVersion.WithKind("Status")) @@ -416,7 +411,7 @@ func (a *APIInstaller) registerResourceHandlers(path string, storage rest.Storag } actions = appendIf(actions, action{"PUT", itemPath, nameParams, namer, false}, isUpdater) actions = appendIf(actions, action{"PATCH", itemPath, nameParams, namer, false}, isPatcher) - actions = appendIf(actions, action{"DELETE", itemPath, nameParams, namer, false}, isDeleter) + actions = appendIf(actions, action{"DELETE", itemPath, nameParams, namer, false}, isGracefulDeleter) actions = appendIf(actions, action{"WATCH", "watch/" + itemPath, nameParams, namer, false}, isWatcher) actions = appendIf(actions, action{"CONNECT", itemPath, nameParams, namer, false}, isConnecter) actions = appendIf(actions, action{"CONNECT", itemPath + "/{path:*}", proxyParams, namer, false}, isConnecter && connectSubpath) @@ -462,7 +457,7 @@ func (a *APIInstaller) registerResourceHandlers(path string, storage rest.Storag } actions = appendIf(actions, action{"PUT", itemPath, nameParams, namer, false}, isUpdater) actions = appendIf(actions, action{"PATCH", itemPath, nameParams, namer, false}, isPatcher) - actions = appendIf(actions, action{"DELETE", itemPath, nameParams, namer, false}, isDeleter) + actions = appendIf(actions, action{"DELETE", itemPath, nameParams, namer, false}, isGracefulDeleter) actions = appendIf(actions, action{"WATCH", "watch/" + itemPath, nameParams, namer, false}, isWatcher) actions = appendIf(actions, action{"CONNECT", itemPath, nameParams, namer, false}, isConnecter) actions = appendIf(actions, action{"CONNECT", itemPath + "/{path:*}", proxyParams, namer, false}, isConnecter && connectSubpath) diff --git a/pkg/registry/rest/rest.go b/pkg/registry/rest/rest.go index 8cf9689ac..a2b0930f3 100644 --- a/pkg/registry/rest/rest.go +++ b/pkg/registry/rest/rest.go @@ -137,16 +137,6 @@ type TableConvertor interface { ConvertToTable(ctx genericapirequest.Context, object runtime.Object, tableOptions runtime.Object) (*metav1beta1.Table, error) } -// Deleter is an object that can delete a named RESTful resource. -type Deleter interface { - // Delete finds a resource in the storage and deletes it. - // Although it can return an arbitrary error value, IsNotFound(err) is true for the - // returned error value err when the specified resource is not found. - // Delete *may* return the object that was deleted, or a status object indicating additional - // information about deletion. - Delete(ctx genericapirequest.Context, name string) (runtime.Object, error) -} - // GracefulDeleter knows how to pass deletion options to allow delayed deletion of a // RESTful object. type GracefulDeleter interface { @@ -162,17 +152,6 @@ type GracefulDeleter interface { Delete(ctx genericapirequest.Context, name string, options *metav1.DeleteOptions) (runtime.Object, bool, error) } -// GracefulDeleteAdapter adapts the Deleter interface to GracefulDeleter -type GracefulDeleteAdapter struct { - Deleter -} - -// Delete implements RESTGracefulDeleter in terms of Deleter -func (w GracefulDeleteAdapter) Delete(ctx genericapirequest.Context, name string, options *metav1.DeleteOptions) (runtime.Object, bool, error) { - obj, err := w.Deleter.Delete(ctx, name) - return obj, true, err -} - // CollectionDeleter is an object that can delete a collection // of RESTful resources. type CollectionDeleter interface {