diff --git a/staging/src/k8s.io/apiextensions-apiserver/test/integration/finalization_test.go b/staging/src/k8s.io/apiextensions-apiserver/test/integration/finalization_test.go index 57b04884b9..7cb76ee418 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/test/integration/finalization_test.go +++ b/staging/src/k8s.io/apiextensions-apiserver/test/integration/finalization_test.go @@ -18,13 +18,16 @@ package integration import ( "testing" + "time" "github.com/stretchr/testify/require" apiextensionsv1beta1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1" + "k8s.io/apiextensions-apiserver/test/integration/testserver" "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/util/wait" ) func TestFinalization(t *testing.T) { @@ -89,3 +92,74 @@ func TestFinalization(t *testing.T) { require.Error(t, err) require.True(t, errors.IsNotFound(err), "%#v", err) } + +func TestFinalizationAndDeletion(t *testing.T) { + stopCh, apiExtensionClient, clientPool, err := testserver.StartDefaultServerWithClients() + require.NoError(t, err) + defer close(stopCh) + + // Create a CRD. + noxuDefinition := testserver.NewNoxuCustomResourceDefinition(apiextensionsv1beta1.ClusterScoped) + noxuVersionClient, err := testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, clientPool) + require.NoError(t, err) + + // Create a CR with a finalizer. + ns := "not-the-default" + name := "foo123" + noxuResourceClient := NewNamespacedCustomResourceClient(ns, noxuVersionClient, noxuDefinition) + + instance := testserver.NewNoxuInstance(ns, name) + instance.SetFinalizers([]string{"noxu.example.com/finalizer"}) + createdNoxuInstance, err := instantiateCustomResource(t, instance, noxuResourceClient, noxuDefinition) + require.NoError(t, err) + + // Delete a CR. Because there's a finalizer, it will not get deleted now. + uid := createdNoxuInstance.GetUID() + err = noxuResourceClient.Delete(name, &metav1.DeleteOptions{ + Preconditions: &metav1.Preconditions{ + UID: &uid, + }, + }) + require.NoError(t, err) + + // Check is the CR scheduled for deletion. + gottenNoxuInstance, err := noxuResourceClient.Get(name, metav1.GetOptions{}) + require.NoError(t, err) + require.NotNil(t, gottenNoxuInstance.GetDeletionTimestamp()) + + // Delete the CRD. + testserver.DeleteCustomResourceDefinition(noxuDefinition, apiExtensionClient) + + // Check is CR still there after the CRD deletion. + gottenNoxuInstance, err = noxuResourceClient.Get(name, metav1.GetOptions{}) + require.NoError(t, err) + + // Update the CR to remove the finalizer. + for { + gottenNoxuInstance.SetFinalizers(nil) + _, err = noxuResourceClient.Update(gottenNoxuInstance) + if err == nil { + break + } + if !errors.IsConflict(err) { + require.NoError(t, err) // Fail on unexpected error + } + gottenNoxuInstance, err = noxuResourceClient.Get(name, metav1.GetOptions{}) + require.NoError(t, err) + } + + // Verify the CR is gone. + // It should return the NonFound error. + _, err = noxuResourceClient.Get(name, metav1.GetOptions{}) + if !errors.IsNotFound(err) { + t.Fatalf("unable to delete cr: %v", err) + } + + err = wait.Poll(500*time.Millisecond, wait.ForeverTestTimeout, func() (bool, error) { + _, err = testserver.GetCustomResourceDefinition(noxuDefinition, apiExtensionClient) + return errors.IsNotFound(err), err + }) + if !errors.IsNotFound(err) { + t.Fatalf("unable to delete crd: %v", err) + } +}