mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-08-03 01:06:27 +00:00
Clean up redundant post-finalizer deletions
This commit is contained in:
parent
cc4ca629a9
commit
000fffd3c7
@ -45,7 +45,7 @@ type NamespacedResourcesDeleterInterface interface {
|
|||||||
func NewNamespacedResourcesDeleter(nsClient v1clientset.NamespaceInterface,
|
func NewNamespacedResourcesDeleter(nsClient v1clientset.NamespaceInterface,
|
||||||
metadataClient metadata.Interface, podsGetter v1clientset.PodsGetter,
|
metadataClient metadata.Interface, podsGetter v1clientset.PodsGetter,
|
||||||
discoverResourcesFn func() ([]*metav1.APIResourceList, error),
|
discoverResourcesFn func() ([]*metav1.APIResourceList, error),
|
||||||
finalizerToken v1.FinalizerName, deleteNamespaceWhenDone bool) NamespacedResourcesDeleterInterface {
|
finalizerToken v1.FinalizerName) NamespacedResourcesDeleterInterface {
|
||||||
d := &namespacedResourcesDeleter{
|
d := &namespacedResourcesDeleter{
|
||||||
nsClient: nsClient,
|
nsClient: nsClient,
|
||||||
metadataClient: metadataClient,
|
metadataClient: metadataClient,
|
||||||
@ -53,9 +53,8 @@ func NewNamespacedResourcesDeleter(nsClient v1clientset.NamespaceInterface,
|
|||||||
opCache: &operationNotSupportedCache{
|
opCache: &operationNotSupportedCache{
|
||||||
m: make(map[operationKey]bool),
|
m: make(map[operationKey]bool),
|
||||||
},
|
},
|
||||||
discoverResourcesFn: discoverResourcesFn,
|
discoverResourcesFn: discoverResourcesFn,
|
||||||
finalizerToken: finalizerToken,
|
finalizerToken: finalizerToken,
|
||||||
deleteNamespaceWhenDone: deleteNamespaceWhenDone,
|
|
||||||
}
|
}
|
||||||
d.initOpCache()
|
d.initOpCache()
|
||||||
return d
|
return d
|
||||||
@ -77,8 +76,6 @@ type namespacedResourcesDeleter struct {
|
|||||||
// The finalizer token that should be removed from the namespace
|
// The finalizer token that should be removed from the namespace
|
||||||
// when all resources in that namespace have been deleted.
|
// when all resources in that namespace have been deleted.
|
||||||
finalizerToken v1.FinalizerName
|
finalizerToken v1.FinalizerName
|
||||||
// Also delete the namespace when all resources in the namespace have been deleted.
|
|
||||||
deleteNamespaceWhenDone bool
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Delete deletes all resources in the given namespace.
|
// Delete deletes all resources in the given namespace.
|
||||||
@ -89,7 +86,6 @@ type namespacedResourcesDeleter struct {
|
|||||||
// (updates the namespace phase if it is not yet marked terminating)
|
// (updates the namespace phase if it is not yet marked terminating)
|
||||||
// After deleting the resources:
|
// After deleting the resources:
|
||||||
// * It removes finalizer token from the given namespace.
|
// * It removes finalizer token from the given namespace.
|
||||||
// * Deletes the namespace if deleteNamespaceWhenDone is true.
|
|
||||||
//
|
//
|
||||||
// Returns an error if any of those steps fail.
|
// Returns an error if any of those steps fail.
|
||||||
// Returns ResourcesRemainingError if it deleted some resources but needs
|
// Returns ResourcesRemainingError if it deleted some resources but needs
|
||||||
@ -127,10 +123,9 @@ func (d *namespacedResourcesDeleter) Delete(nsName string) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Delete the namespace if it is already finalized.
|
// return if it is already finalized.
|
||||||
if d.deleteNamespaceWhenDone && finalized(namespace) {
|
if finalized(namespace) {
|
||||||
// TODO(liggitt): just return in 1.16, once n-1 apiservers automatically delete when finalizers are all removed
|
return nil
|
||||||
return d.deleteNamespace(namespace)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// there may still be content for us to remove
|
// there may still be content for us to remove
|
||||||
@ -153,12 +148,6 @@ func (d *namespacedResourcesDeleter) Delete(nsName string) error {
|
|||||||
}
|
}
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if we can delete now.
|
|
||||||
if d.deleteNamespaceWhenDone && finalized(namespace) {
|
|
||||||
// TODO(liggitt): just return in 1.16, once n-1 apiservers automatically delete when finalizers are all removed
|
|
||||||
return d.deleteNamespace(namespace)
|
|
||||||
}
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -147,7 +147,6 @@ func testSyncNamespaceThatIsTerminating(t *testing.T, versions *metav1.APIVersio
|
|||||||
strings.Join([]string{"create", "namespaces", "finalize"}, "-"),
|
strings.Join([]string{"create", "namespaces", "finalize"}, "-"),
|
||||||
strings.Join([]string{"list", "pods", ""}, "-"),
|
strings.Join([]string{"list", "pods", ""}, "-"),
|
||||||
strings.Join([]string{"update", "namespaces", "status"}, "-"),
|
strings.Join([]string{"update", "namespaces", "status"}, "-"),
|
||||||
strings.Join([]string{"delete", "namespaces", ""}, "-"),
|
|
||||||
),
|
),
|
||||||
metadataClientActionSet: metadataClientActionSet,
|
metadataClientActionSet: metadataClientActionSet,
|
||||||
},
|
},
|
||||||
@ -155,7 +154,6 @@ func testSyncNamespaceThatIsTerminating(t *testing.T, versions *metav1.APIVersio
|
|||||||
testNamespace: testNamespaceFinalizeComplete,
|
testNamespace: testNamespaceFinalizeComplete,
|
||||||
kubeClientActionSet: sets.NewString(
|
kubeClientActionSet: sets.NewString(
|
||||||
strings.Join([]string{"get", "namespaces", ""}, "-"),
|
strings.Join([]string{"get", "namespaces", ""}, "-"),
|
||||||
strings.Join([]string{"delete", "namespaces", ""}, "-"),
|
|
||||||
),
|
),
|
||||||
metadataClientActionSet: sets.NewString(),
|
metadataClientActionSet: sets.NewString(),
|
||||||
},
|
},
|
||||||
@ -163,7 +161,6 @@ func testSyncNamespaceThatIsTerminating(t *testing.T, versions *metav1.APIVersio
|
|||||||
testNamespace: testNamespaceFinalizeComplete,
|
testNamespace: testNamespaceFinalizeComplete,
|
||||||
kubeClientActionSet: sets.NewString(
|
kubeClientActionSet: sets.NewString(
|
||||||
strings.Join([]string{"get", "namespaces", ""}, "-"),
|
strings.Join([]string{"get", "namespaces", ""}, "-"),
|
||||||
strings.Join([]string{"delete", "namespaces", ""}, "-"),
|
|
||||||
),
|
),
|
||||||
metadataClientActionSet: sets.NewString(),
|
metadataClientActionSet: sets.NewString(),
|
||||||
gvrError: fmt.Errorf("test error"),
|
gvrError: fmt.Errorf("test error"),
|
||||||
@ -202,7 +199,7 @@ func testSyncNamespaceThatIsTerminating(t *testing.T, versions *metav1.APIVersio
|
|||||||
fn := func() ([]*metav1.APIResourceList, error) {
|
fn := func() ([]*metav1.APIResourceList, error) {
|
||||||
return resources, testInput.gvrError
|
return resources, testInput.gvrError
|
||||||
}
|
}
|
||||||
d := NewNamespacedResourcesDeleter(mockClient.CoreV1().Namespaces(), metadataClient, mockClient.CoreV1(), fn, v1.FinalizerKubernetes, true)
|
d := NewNamespacedResourcesDeleter(mockClient.CoreV1().Namespaces(), metadataClient, mockClient.CoreV1(), fn, v1.FinalizerKubernetes)
|
||||||
if err := d.Delete(testInput.testNamespace.Name); !matchErrors(err, testInput.expectErrorOnDelete) {
|
if err := d.Delete(testInput.testNamespace.Name); !matchErrors(err, testInput.expectErrorOnDelete) {
|
||||||
t.Errorf("expected error %q when syncing namespace, got %q, %v", testInput.expectErrorOnDelete, err, testInput.expectErrorOnDelete == err)
|
t.Errorf("expected error %q when syncing namespace, got %q, %v", testInput.expectErrorOnDelete, err, testInput.expectErrorOnDelete == err)
|
||||||
}
|
}
|
||||||
@ -300,7 +297,7 @@ func TestSyncNamespaceThatIsActive(t *testing.T) {
|
|||||||
return testResources(), nil
|
return testResources(), nil
|
||||||
}
|
}
|
||||||
d := NewNamespacedResourcesDeleter(mockClient.CoreV1().Namespaces(), nil, mockClient.CoreV1(),
|
d := NewNamespacedResourcesDeleter(mockClient.CoreV1().Namespaces(), nil, mockClient.CoreV1(),
|
||||||
fn, v1.FinalizerKubernetes, true)
|
fn, v1.FinalizerKubernetes)
|
||||||
err := d.Delete(testNamespace.Name)
|
err := d.Delete(testNamespace.Name)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Errorf("Unexpected error when synching namespace %v", err)
|
t.Errorf("Unexpected error when synching namespace %v", err)
|
||||||
|
@ -72,7 +72,7 @@ func NewNamespaceController(
|
|||||||
// create the controller so we can inject the enqueue function
|
// create the controller so we can inject the enqueue function
|
||||||
namespaceController := &NamespaceController{
|
namespaceController := &NamespaceController{
|
||||||
queue: workqueue.NewNamedRateLimitingQueue(workqueue.DefaultControllerRateLimiter(), "namespace"),
|
queue: workqueue.NewNamedRateLimitingQueue(workqueue.DefaultControllerRateLimiter(), "namespace"),
|
||||||
namespacedResourcesDeleter: deletion.NewNamespacedResourcesDeleter(kubeClient.CoreV1().Namespaces(), metadataClient, kubeClient.CoreV1(), discoverResourcesFn, finalizerToken, true),
|
namespacedResourcesDeleter: deletion.NewNamespacedResourcesDeleter(kubeClient.CoreV1().Namespaces(), metadataClient, kubeClient.CoreV1(), discoverResourcesFn, finalizerToken),
|
||||||
}
|
}
|
||||||
|
|
||||||
if kubeClient != nil && kubeClient.CoreV1().RESTClient().GetRateLimiter() != nil {
|
if kubeClient != nil && kubeClient.CoreV1().RESTClient().GetRateLimiter() != nil {
|
||||||
|
@ -170,16 +170,6 @@ func (c *CRDFinalizer) sync(key string) error {
|
|||||||
// deleted or changed in the meantime, we'll get called again
|
// deleted or changed in the meantime, we'll get called again
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// and now issue another delete, which should clean it all up if no finalizers remain or no-op if they do
|
|
||||||
// TODO(liggitt): just return in 1.16, once n-1 apiservers automatically delete when finalizers are all removed
|
|
||||||
err = c.crdClient.CustomResourceDefinitions().Delete(crd.Name, nil)
|
|
||||||
if apierrors.IsNotFound(err) {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user