type NamespacedResourcesDeleterInterface … // NewNamespacedResourcesDeleter returns a new NamespacedResourcesDeleter. func NewNamespacedResourcesDeleter(ctx context.Context, nsClient v1clientset.NamespaceInterface, metadataClient metadata.Interface, podsGetter v1clientset.PodsGetter, discoverResourcesFn func() ([]*metav1.APIResourceList, error), finalizerToken v1.FinalizerName) NamespacedResourcesDeleterInterface { … } var _ … type namespacedResourcesDeleter … // Delete deletes all resources in the given namespace. // Before deleting resources: // - It ensures that deletion timestamp is set on the // namespace (does nothing if deletion timestamp is missing). // - Verifies that the namespace is in the "terminating" phase // (updates the namespace phase if it is not yet marked terminating) // // After deleting the resources: // * It removes finalizer token from the given namespace. // // Returns an error if any of those steps fail. // Returns ResourcesRemainingError if it deleted some resources but needs // to wait for them to go away. // Caller is expected to keep calling this until it succeeds. func (d *namespacedResourcesDeleter) Delete(ctx context.Context, nsName string) error { … } func (d *namespacedResourcesDeleter) initOpCache(ctx context.Context) { … } type ResourcesRemainingError … func (e *ResourcesRemainingError) Error() string { … } type operation … const operationDeleteCollection … const operationList … const finalizerEstimateSeconds … type operationKey … type operationNotSupportedCache … // isSupported returns true if the operation is supported func (o *operationNotSupportedCache) isSupported(key operationKey) bool { … } func (o *operationNotSupportedCache) setNotSupported(key operationKey) { … } type updateNamespaceFunc … // retryOnConflictError retries the specified fn if there was a conflict error // it will return an error if the UID for an object changes across retry operations. // TODO RetryOnConflict should be a generic concept in client code func (d *namespacedResourcesDeleter) retryOnConflictError(ctx context.Context, namespace *v1.Namespace, fn updateNamespaceFunc) (result *v1.Namespace, err error) { … } // updateNamespaceStatusFunc will verify that the status of the namespace is correct func (d *namespacedResourcesDeleter) updateNamespaceStatusFunc(ctx context.Context, namespace *v1.Namespace) (*v1.Namespace, error) { … } // finalized returns true if the namespace.Spec.Finalizers is an empty list func finalized(namespace *v1.Namespace) bool { … } // finalizeNamespace removes the specified finalizerToken and finalizes the namespace func (d *namespacedResourcesDeleter) finalizeNamespace(ctx context.Context, namespace *v1.Namespace) (*v1.Namespace, error) { … } // deleteCollection is a helper function that will delete the collection of resources // it returns true if the operation was supported on the server. // it returns an error if the operation was supported on the server but was unable to complete. func (d *namespacedResourcesDeleter) deleteCollection(ctx context.Context, gvr schema.GroupVersionResource, namespace string) (bool, error) { … } // listCollection will list the items in the specified namespace // it returns the following: // // the list of items in the collection (if found) // a boolean if the operation is supported // an error if the operation is supported but could not be completed. func (d *namespacedResourcesDeleter) listCollection(ctx context.Context, gvr schema.GroupVersionResource, namespace string) (*metav1.PartialObjectMetadataList, bool, error) { … } // deleteEachItem is a helper function that will list the collection of resources and delete each item 1 by 1. func (d *namespacedResourcesDeleter) deleteEachItem(ctx context.Context, gvr schema.GroupVersionResource, namespace string) error { … } type gvrDeletionMetadata … // deleteAllContentForGroupVersionResource will use the dynamic client to delete each resource identified in gvr. // It returns an estimate of the time remaining before the remaining resources are deleted. // If estimate > 0, not all resources are guaranteed to be gone. func (d *namespacedResourcesDeleter) deleteAllContentForGroupVersionResource( ctx context.Context, gvr schema.GroupVersionResource, namespace string, namespaceDeletedAt metav1.Time) (gvrDeletionMetadata, error) { … } type allGVRDeletionMetadata … // deleteAllContent will use the dynamic client to delete each resource identified in groupVersionResources. // It returns an estimate of the time remaining before the remaining resources are deleted. // If estimate > 0, not all resources are guaranteed to be gone. func (d *namespacedResourcesDeleter) deleteAllContent(ctx context.Context, ns *v1.Namespace) (int64, error) { … } // estimateGracefulTermination will estimate the graceful termination required for the specific entity in the namespace func (d *namespacedResourcesDeleter) estimateGracefulTermination(ctx context.Context, gvr schema.GroupVersionResource, ns string, namespaceDeletedAt metav1.Time) (int64, error) { … } // estimateGracefulTerminationForPods determines the graceful termination period for pods in the namespace func (d *namespacedResourcesDeleter) estimateGracefulTerminationForPods(ctx context.Context, ns string) (int64, error) { … }