mirror of https://github.com/k3s-io/k3s
Updating the registry to return whether the resource was immediately deleted
parent
746cc5d284
commit
1d32897eed
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue