Updating the registry to return whether the resource was immediately deleted
This commit is contained in:
parent
ba5f134ce9
commit
fee1f0dd8f
|
|
@ -858,7 +858,8 @@ func DeleteResource(r rest.GracefulDeleter, allowsOptions bool, scope RequestSco
|
||||||
|
|
||||||
trace.Step("About do delete object from database")
|
trace.Step("About do delete object from database")
|
||||||
result, err := finishRequest(timeout, func() (runtime.Object, error) {
|
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 {
|
if err != nil {
|
||||||
scope.err(err, res.ResponseWriter, req.Request)
|
scope.err(err, res.ResponseWriter, req.Request)
|
||||||
|
|
|
||||||
|
|
@ -758,15 +758,15 @@ func (e *Store) updateForGracefulDeletionAndFinalizers(ctx genericapirequest.Con
|
||||||
}
|
}
|
||||||
|
|
||||||
// Delete removes the item from storage.
|
// 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)
|
key, err := e.KeyFunc(ctx, name)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, false, err
|
||||||
}
|
}
|
||||||
|
|
||||||
obj := e.NewFunc()
|
obj := e.NewFunc()
|
||||||
if err := e.Storage.Get(ctx, key, "", obj, false); err != nil {
|
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
|
// support older consumers of delete by treating "nil" as delete immediately
|
||||||
if options == nil {
|
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)
|
graceful, pendingGraceful, err := rest.BeforeDelete(e.DeleteStrategy, ctx, obj, options)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, false, err
|
||||||
}
|
}
|
||||||
// this means finalizers cannot be updated via DeleteOptions if a deletion is already pending
|
// this means finalizers cannot be updated via DeleteOptions if a deletion is already pending
|
||||||
if pendingGraceful {
|
if pendingGraceful {
|
||||||
return e.finalizeDelete(obj, false)
|
out, err := e.finalizeDelete(obj, false)
|
||||||
|
return out, false, err
|
||||||
}
|
}
|
||||||
// check if obj has pending finalizers
|
// check if obj has pending finalizers
|
||||||
accessor, err := meta.Accessor(obj)
|
accessor, err := meta.Accessor(obj)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, kubeerr.NewInternalError(err)
|
return nil, false, kubeerr.NewInternalError(err)
|
||||||
}
|
}
|
||||||
pendingFinalizers := len(accessor.GetFinalizers()) != 0
|
pendingFinalizers := len(accessor.GetFinalizers()) != 0
|
||||||
var ignoreNotFound bool
|
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.
|
// !deleteImmediately covers all cases where err != nil. We keep both to be future-proof.
|
||||||
if !deleteImmediately || err != nil {
|
if !deleteImmediately || err != nil {
|
||||||
return out, err
|
return out, false, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// delete immediately, or no graceful deletion supported
|
// 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 {
|
if storage.IsNotFound(err) && ignoreNotFound && lastExisting != nil {
|
||||||
// The lastExisting object may not be the last state of the object
|
// The lastExisting object may not be the last state of the object
|
||||||
// before its deletion, but it's the best approximation.
|
// 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.
|
// 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
|
errs <- err
|
||||||
return
|
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)
|
glog.V(4).Infof("Delete %s in DeleteCollection failed: %v", accessor.GetName(), err)
|
||||||
errs <- err
|
errs <- err
|
||||||
return
|
return
|
||||||
|
|
|
||||||
|
|
@ -136,7 +136,9 @@ type GracefulDeleter interface {
|
||||||
// returned error value err when the specified resource is not found.
|
// 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
|
// Delete *may* return the object that was deleted, or a status object indicating additional
|
||||||
// information about deletion.
|
// 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
|
// GracefulDeleteAdapter adapts the Deleter interface to GracefulDeleter
|
||||||
|
|
@ -145,8 +147,9 @@ type GracefulDeleteAdapter struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Delete implements RESTGracefulDeleter in terms of Deleter
|
// Delete implements RESTGracefulDeleter in terms of Deleter
|
||||||
func (w GracefulDeleteAdapter) Delete(ctx genericapirequest.Context, name string, options *metav1.DeleteOptions) (runtime.Object, error) {
|
func (w GracefulDeleteAdapter) Delete(ctx genericapirequest.Context, name string, options *metav1.DeleteOptions) (runtime.Object, bool, error) {
|
||||||
return w.Deleter.Delete(ctx, name)
|
obj, err := w.Deleter.Delete(ctx, name)
|
||||||
|
return obj, true, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// CollectionDeleter is an object that can delete a collection
|
// CollectionDeleter is an object that can delete a collection
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue