diff --git a/federation/registry/cluster/registry.go b/federation/registry/cluster/registry.go index ee1e972db5d..0cb919ea09b 100644 --- a/federation/registry/cluster/registry.go +++ b/federation/registry/cluster/registry.go @@ -78,6 +78,6 @@ func (s *storage) UpdateCluster(ctx genericapirequest.Context, cluster *federati } func (s *storage) DeleteCluster(ctx genericapirequest.Context, name string) error { - _, err := s.Delete(ctx, name, nil) + _, _, err := s.Delete(ctx, name, nil) return err } diff --git a/pkg/master/thirdparty/thirdparty.go b/pkg/master/thirdparty/thirdparty.go index d9a4f19c6c6..6c614238e02 100644 --- a/pkg/master/thirdparty/thirdparty.go +++ b/pkg/master/thirdparty/thirdparty.go @@ -175,7 +175,7 @@ func (m *ThirdPartyResourceServer) removeAllThirdPartyResources(registry *thirdp } for ix := range list.Items { item := &list.Items[ix] - if _, err := registry.Delete(ctx, item.Name, nil); err != nil { + if _, _, err := registry.Delete(ctx, item.Name, nil); err != nil { return err } } diff --git a/pkg/registry/certificates/certificates/registry.go b/pkg/registry/certificates/certificates/registry.go index 1c78c71b582..05d3bb63a59 100644 --- a/pkg/registry/certificates/certificates/registry.go +++ b/pkg/registry/certificates/certificates/registry.go @@ -79,6 +79,6 @@ func (s *storage) GetCSR(ctx genericapirequest.Context, name string, options *me } func (s *storage) DeleteCSR(ctx genericapirequest.Context, name string) error { - _, err := s.Delete(ctx, name, nil) + _, _, err := s.Delete(ctx, name, nil) return err } diff --git a/pkg/registry/core/configmap/registry.go b/pkg/registry/core/configmap/registry.go index 581d40a9798..1d4c9c6f623 100644 --- a/pkg/registry/core/configmap/registry.go +++ b/pkg/registry/core/configmap/registry.go @@ -87,7 +87,6 @@ func (s *storage) UpdateConfigMap(ctx genericapirequest.Context, cfg *api.Config } func (s *storage) DeleteConfigMap(ctx genericapirequest.Context, name string) error { - _, err := s.Delete(ctx, name, nil) - + _, _, err := s.Delete(ctx, name, nil) return err } diff --git a/pkg/registry/core/endpoint/registry.go b/pkg/registry/core/endpoint/registry.go index 86d969e9b0e..8ac57b2a9e0 100644 --- a/pkg/registry/core/endpoint/registry.go +++ b/pkg/registry/core/endpoint/registry.go @@ -71,6 +71,6 @@ func (s *storage) UpdateEndpoints(ctx genericapirequest.Context, endpoints *api. } func (s *storage) DeleteEndpoints(ctx genericapirequest.Context, name string) error { - _, err := s.Delete(ctx, name, nil) + _, _, err := s.Delete(ctx, name, nil) return err } diff --git a/pkg/registry/core/namespace/registry.go b/pkg/registry/core/namespace/registry.go index 5cb6fcdf157..dc5d422df55 100644 --- a/pkg/registry/core/namespace/registry.go +++ b/pkg/registry/core/namespace/registry.go @@ -77,6 +77,6 @@ func (s *storage) UpdateNamespace(ctx genericapirequest.Context, namespace *api. } func (s *storage) DeleteNamespace(ctx genericapirequest.Context, namespaceID string) error { - _, err := s.Delete(ctx, namespaceID, nil) + _, _, err := s.Delete(ctx, namespaceID, nil) return err } diff --git a/pkg/registry/core/namespace/storage/storage.go b/pkg/registry/core/namespace/storage/storage.go index 2d6cdb2a5d6..de7508ecfe9 100644 --- a/pkg/registry/core/namespace/storage/storage.go +++ b/pkg/registry/core/namespace/storage/storage.go @@ -82,10 +82,10 @@ func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, *StatusREST, *Finaliz } // Delete enforces life-cycle rules for namespace termination -func (r *REST) Delete(ctx genericapirequest.Context, name string, options *metav1.DeleteOptions) (runtime.Object, error) { +func (r *REST) Delete(ctx genericapirequest.Context, name string, options *metav1.DeleteOptions) (runtime.Object, bool, error) { nsObj, err := r.Get(ctx, name, &metav1.GetOptions{}) if err != nil { - return nil, err + return nil, false, err } namespace := nsObj.(*api.Namespace) @@ -105,7 +105,7 @@ func (r *REST) Delete(ctx genericapirequest.Context, name string, options *metav name, fmt.Errorf("Precondition failed: UID in precondition: %v, UID in object meta: %v", *options.Preconditions.UID, namespace.UID), ) - return nil, err + return nil, false, err } // upon first request to delete, we switch the phase to start namespace termination @@ -113,7 +113,7 @@ func (r *REST) Delete(ctx genericapirequest.Context, name string, options *metav if namespace.DeletionTimestamp.IsZero() { key, err := r.Store.KeyFunc(ctx, name) if err != nil { - return nil, err + return nil, false, err } preconditions := storage.Preconditions{UID: options.Preconditions.UID} @@ -159,16 +159,16 @@ func (r *REST) Delete(ctx genericapirequest.Context, name string, options *metav if _, ok := err.(*apierrors.StatusError); !ok { err = apierrors.NewInternalError(err) } - return nil, err + return nil, false, err } - return out, nil + return out, false, nil } // prior to final deletion, we must ensure that finalizers is empty if len(namespace.Spec.Finalizers) != 0 { err = apierrors.NewConflict(api.Resource("namespaces"), namespace.Name, fmt.Errorf("The system is ensuring all content is removed from this namespace. Upon completion, this namespace will automatically be purged by the system.")) - return nil, err + return nil, false, err } return r.Store.Delete(ctx, name, options) } diff --git a/pkg/registry/core/node/registry.go b/pkg/registry/core/node/registry.go index a6505f37d4f..2fab505dbbe 100644 --- a/pkg/registry/core/node/registry.go +++ b/pkg/registry/core/node/registry.go @@ -78,6 +78,6 @@ func (s *storage) GetNode(ctx genericapirequest.Context, name string, options *m } func (s *storage) DeleteNode(ctx genericapirequest.Context, name string) error { - _, err := s.Delete(ctx, name, nil) + _, _, err := s.Delete(ctx, name, nil) return err } diff --git a/pkg/registry/core/pod/storage/eviction.go b/pkg/registry/core/pod/storage/eviction.go index 52bc1e10a73..214680cce0a 100644 --- a/pkg/registry/core/pod/storage/eviction.go +++ b/pkg/registry/core/pod/storage/eviction.go @@ -136,7 +136,7 @@ func (r *EvictionREST) Create(ctx genericapirequest.Context, obj runtime.Object) // At this point there was either no PDB or we succeded in decrementing // Try the delete - _, err = r.store.Delete(ctx, eviction.Name, eviction.DeleteOptions) + _, _, err = r.store.Delete(ctx, eviction.Name, eviction.DeleteOptions) if err != nil { return nil, err } diff --git a/pkg/registry/core/replicationcontroller/registry.go b/pkg/registry/core/replicationcontroller/registry.go index dbb07524ece..02eff75fe7f 100644 --- a/pkg/registry/core/replicationcontroller/registry.go +++ b/pkg/registry/core/replicationcontroller/registry.go @@ -90,6 +90,6 @@ func (s *storage) UpdateController(ctx genericapirequest.Context, controller *ap } func (s *storage) DeleteController(ctx genericapirequest.Context, controllerID string) error { - _, err := s.Delete(ctx, controllerID, nil) + _, _, err := s.Delete(ctx, controllerID, nil) return err } diff --git a/pkg/registry/core/secret/registry.go b/pkg/registry/core/secret/registry.go index bdf529a39bd..21ecbc6d09f 100644 --- a/pkg/registry/core/secret/registry.go +++ b/pkg/registry/core/secret/registry.go @@ -77,6 +77,6 @@ func (s *storage) UpdateSecret(ctx genericapirequest.Context, secret *api.Secret } func (s *storage) DeleteSecret(ctx genericapirequest.Context, name string) error { - _, err := s.Delete(ctx, name, nil) + _, _, err := s.Delete(ctx, name, nil) return err } diff --git a/pkg/registry/core/service/registry.go b/pkg/registry/core/service/registry.go index 6f966c5f035..e37afb50074 100644 --- a/pkg/registry/core/service/registry.go +++ b/pkg/registry/core/service/registry.go @@ -74,7 +74,7 @@ func (s *storage) GetService(ctx genericapirequest.Context, name string, options } func (s *storage) DeleteService(ctx genericapirequest.Context, name string) error { - _, err := s.Delete(ctx, name, nil) + _, _, err := s.Delete(ctx, name, nil) return err } diff --git a/pkg/registry/core/serviceaccount/registry.go b/pkg/registry/core/serviceaccount/registry.go index 8246e1d3fa0..0a733d5a808 100644 --- a/pkg/registry/core/serviceaccount/registry.go +++ b/pkg/registry/core/serviceaccount/registry.go @@ -77,6 +77,6 @@ func (s *storage) UpdateServiceAccount(ctx genericapirequest.Context, serviceAcc } func (s *storage) DeleteServiceAccount(ctx genericapirequest.Context, name string) error { - _, err := s.Delete(ctx, name, nil) + _, _, err := s.Delete(ctx, name, nil) return err } diff --git a/pkg/registry/extensions/deployment/registry.go b/pkg/registry/extensions/deployment/registry.go index fb5160c5094..45d95224000 100644 --- a/pkg/registry/extensions/deployment/registry.go +++ b/pkg/registry/extensions/deployment/registry.go @@ -82,6 +82,6 @@ func (s *storage) UpdateDeployment(ctx genericapirequest.Context, deployment *ex } func (s *storage) DeleteDeployment(ctx genericapirequest.Context, deploymentID string) error { - _, err := s.Delete(ctx, deploymentID, nil) + _, _, err := s.Delete(ctx, deploymentID, nil) return err } diff --git a/pkg/registry/extensions/replicaset/registry.go b/pkg/registry/extensions/replicaset/registry.go index 781bfcb10df..e33cbd075b3 100644 --- a/pkg/registry/extensions/replicaset/registry.go +++ b/pkg/registry/extensions/replicaset/registry.go @@ -91,6 +91,6 @@ func (s *storage) UpdateReplicaSet(ctx genericapirequest.Context, replicaSet *ex } func (s *storage) DeleteReplicaSet(ctx genericapirequest.Context, replicaSetID string) error { - _, err := s.Delete(ctx, replicaSetID, nil) + _, _, err := s.Delete(ctx, replicaSetID, nil) return err } diff --git a/pkg/registry/extensions/thirdpartyresourcedata/registry.go b/pkg/registry/extensions/thirdpartyresourcedata/registry.go index b2ea5c1b812..c844d0a5d2e 100644 --- a/pkg/registry/extensions/thirdpartyresourcedata/registry.go +++ b/pkg/registry/extensions/thirdpartyresourcedata/registry.go @@ -78,6 +78,6 @@ func (s *storage) UpdateThirdPartyResourceData(ctx genericapirequest.Context, Th } func (s *storage) DeleteThirdPartyResourceData(ctx genericapirequest.Context, name string) error { - _, err := s.Delete(ctx, name, nil) + _, _, err := s.Delete(ctx, name, nil) return err } diff --git a/pkg/registry/rbac/clusterrole/registry.go b/pkg/registry/rbac/clusterrole/registry.go index 4c3cf731950..df6b5863878 100644 --- a/pkg/registry/rbac/clusterrole/registry.go +++ b/pkg/registry/rbac/clusterrole/registry.go @@ -79,7 +79,7 @@ func (s *storage) GetClusterRole(ctx genericapirequest.Context, name string, opt } func (s *storage) DeleteClusterRole(ctx genericapirequest.Context, name string) error { - _, err := s.Delete(ctx, name, nil) + _, _, err := s.Delete(ctx, name, nil) return err } diff --git a/pkg/registry/rbac/clusterrolebinding/registry.go b/pkg/registry/rbac/clusterrolebinding/registry.go index c07f384e840..1764f4a7386 100644 --- a/pkg/registry/rbac/clusterrolebinding/registry.go +++ b/pkg/registry/rbac/clusterrolebinding/registry.go @@ -79,7 +79,7 @@ func (s *storage) GetClusterRoleBinding(ctx genericapirequest.Context, name stri } func (s *storage) DeleteClusterRoleBinding(ctx genericapirequest.Context, name string) error { - _, err := s.Delete(ctx, name, nil) + _, _, err := s.Delete(ctx, name, nil) return err } diff --git a/pkg/registry/rbac/role/registry.go b/pkg/registry/rbac/role/registry.go index 4457aa46c95..9c3ea883b48 100644 --- a/pkg/registry/rbac/role/registry.go +++ b/pkg/registry/rbac/role/registry.go @@ -79,7 +79,7 @@ func (s *storage) GetRole(ctx genericapirequest.Context, name string, options *m } func (s *storage) DeleteRole(ctx genericapirequest.Context, name string) error { - _, err := s.Delete(ctx, name, nil) + _, _, err := s.Delete(ctx, name, nil) return err } diff --git a/pkg/registry/rbac/rolebinding/registry.go b/pkg/registry/rbac/rolebinding/registry.go index f826198d37f..c468cb71668 100644 --- a/pkg/registry/rbac/rolebinding/registry.go +++ b/pkg/registry/rbac/rolebinding/registry.go @@ -80,7 +80,7 @@ func (s *storage) GetRoleBinding(ctx genericapirequest.Context, name string, opt } func (s *storage) DeleteRoleBinding(ctx genericapirequest.Context, name string) error { - _, err := s.Delete(ctx, name, nil) + _, _, err := s.Delete(ctx, name, nil) return err } diff --git a/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/rest.go b/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/rest.go index 280729c6261..ac954e154f8 100644 --- a/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/rest.go +++ b/staging/src/k8s.io/apiserver/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/staging/src/k8s.io/apiserver/pkg/registry/generic/registry/store.go b/staging/src/k8s.io/apiserver/pkg/registry/generic/registry/store.go index 0f3e0fa5113..5977613ed45 100644 --- a/staging/src/k8s.io/apiserver/pkg/registry/generic/registry/store.go +++ b/staging/src/k8s.io/apiserver/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/staging/src/k8s.io/apiserver/pkg/registry/rest/rest.go b/staging/src/k8s.io/apiserver/pkg/registry/rest/rest.go index 9af285cecdd..cc6613f9d6c 100644 --- a/staging/src/k8s.io/apiserver/pkg/registry/rest/rest.go +++ b/staging/src/k8s.io/apiserver/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