From fee1f0dd8f879f517f09a690c53acebc8da623d8 Mon Sep 17 00:00:00 2001 From: nikhiljindal Date: Mon, 6 Feb 2017 17:22:37 -0800 Subject: [PATCH] Updating the registry to return whether the resource was immediately deleted --- pkg/endpoints/handlers/rest.go | 3 ++- pkg/registry/generic/registry/store.go | 25 ++++++++++++++----------- pkg/registry/rest/rest.go | 9 ++++++--- 3 files changed, 22 insertions(+), 15 deletions(-) diff --git a/pkg/endpoints/handlers/rest.go b/pkg/endpoints/handlers/rest.go index 280729c62..ac954e154 100644 --- a/pkg/endpoints/handlers/rest.go +++ b/pkg/endpoints/handlers/rest.go @@ -858,7 +858,8 @@ func DeleteResource(r rest.GracefulDeleter, allowsOptions bool, scope RequestSco trace.Step("About do delete object from database") result, err := finishRequest(timeout, func() (runtime.Object, error) { - return r.Delete(ctx, name, options) + obj, _, err := r.Delete(ctx, name, options) + return obj, err }) if err != nil { scope.err(err, res.ResponseWriter, req.Request) diff --git a/pkg/registry/generic/registry/store.go b/pkg/registry/generic/registry/store.go index 0f3e0fa51..5977613ed 100644 --- a/pkg/registry/generic/registry/store.go +++ b/pkg/registry/generic/registry/store.go @@ -758,15 +758,15 @@ func (e *Store) updateForGracefulDeletionAndFinalizers(ctx genericapirequest.Con } // Delete removes the item from storage. -func (e *Store) Delete(ctx genericapirequest.Context, name string, options *metav1.DeleteOptions) (runtime.Object, error) { +func (e *Store) Delete(ctx genericapirequest.Context, name string, options *metav1.DeleteOptions) (runtime.Object, bool, error) { key, err := e.KeyFunc(ctx, name) if err != nil { - return nil, err + return nil, false, err } obj := e.NewFunc() if err := e.Storage.Get(ctx, key, "", obj, false); err != nil { - return nil, storeerr.InterpretDeleteError(err, e.QualifiedResource, name) + return nil, false, storeerr.InterpretDeleteError(err, e.QualifiedResource, name) } // support older consumers of delete by treating "nil" as delete immediately if options == nil { @@ -778,16 +778,17 @@ func (e *Store) Delete(ctx genericapirequest.Context, name string, options *meta } graceful, pendingGraceful, err := rest.BeforeDelete(e.DeleteStrategy, ctx, obj, options) if err != nil { - return nil, err + return nil, false, err } // this means finalizers cannot be updated via DeleteOptions if a deletion is already pending if pendingGraceful { - return e.finalizeDelete(obj, false) + out, err := e.finalizeDelete(obj, false) + return out, false, err } // check if obj has pending finalizers accessor, err := meta.Accessor(obj) if err != nil { - return nil, kubeerr.NewInternalError(err) + return nil, false, kubeerr.NewInternalError(err) } pendingFinalizers := len(accessor.GetFinalizers()) != 0 var ignoreNotFound bool @@ -810,7 +811,7 @@ func (e *Store) Delete(ctx genericapirequest.Context, name string, options *meta } // !deleteImmediately covers all cases where err != nil. We keep both to be future-proof. if !deleteImmediately || err != nil { - return out, err + return out, false, err } // delete immediately, or no graceful deletion supported @@ -822,11 +823,13 @@ func (e *Store) Delete(ctx genericapirequest.Context, name string, options *meta if storage.IsNotFound(err) && ignoreNotFound && lastExisting != nil { // The lastExisting object may not be the last state of the object // before its deletion, but it's the best approximation. - return e.finalizeDelete(lastExisting, true) + out, err := e.finalizeDelete(lastExisting, true) + return out, true, err } - return nil, storeerr.InterpretDeleteError(err, e.QualifiedResource, name) + return nil, false, storeerr.InterpretDeleteError(err, e.QualifiedResource, name) } - return e.finalizeDelete(out, true) + out, err = e.finalizeDelete(out, true) + return out, true, err } // DeleteCollection removes all items returned by List with a given ListOptions from storage. @@ -890,7 +893,7 @@ func (e *Store) DeleteCollection(ctx genericapirequest.Context, options *metav1. errs <- err return } - if _, err := e.Delete(ctx, accessor.GetName(), options); err != nil && !kubeerr.IsNotFound(err) { + if _, _, err := e.Delete(ctx, accessor.GetName(), options); err != nil && !kubeerr.IsNotFound(err) { glog.V(4).Infof("Delete %s in DeleteCollection failed: %v", accessor.GetName(), err) errs <- err return diff --git a/pkg/registry/rest/rest.go b/pkg/registry/rest/rest.go index 9af285cec..cc6613f9d 100644 --- a/pkg/registry/rest/rest.go +++ b/pkg/registry/rest/rest.go @@ -136,7 +136,9 @@ type GracefulDeleter interface { // 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, options *metav1.DeleteOptions) (runtime.Object, error) + // It also returns a boolean which is set to true if the resource was instantly + // deleted or false if it will be deleted asynchronously. + Delete(ctx genericapirequest.Context, name string, options *metav1.DeleteOptions) (runtime.Object, bool, error) } // GracefulDeleteAdapter adapts the Deleter interface to GracefulDeleter @@ -145,8 +147,9 @@ type GracefulDeleteAdapter struct { } // Delete implements RESTGracefulDeleter in terms of Deleter -func (w GracefulDeleteAdapter) Delete(ctx genericapirequest.Context, name string, options *metav1.DeleteOptions) (runtime.Object, error) { - return w.Deleter.Delete(ctx, name) +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