Skip to content

Commit c8841ce

Browse files
author
Kubernetes Submit Queue
authored
Merge pull request kubernetes#60592 from xmudrii/crd-tests
Automatic merge from submit-queue (batch tested with PRs 61402, 61143, 61427, 60592). If you want to cherry-pick this change to another branch, please follow the instructions <a href="https://github.com/kubernetes/community/blob/master/contributors/devel/cherry-picks.md">here</a>. apiextensions-apiserver: TestFinaliazationAndDeletion integration test **What this PR does / why we need it**: This PR adds an integration test for [behavior described in the issue kubernetes#60538 (comment)](kubernetes#60538 (comment)). **Which issue(s) this PR fixes** *(optional, in `fixes #<issue number>(, fixes #<issue_number>, ...)` format, will close the issue(s) when PR gets merged)*: Partially addresses kubernetes#60538 -- tests **Special notes for your reviewer**: This is based of the PR kubernetes#60542, so this shouldn't be merged before that one. Tests are failing on the line 155, due to the timeout/non-nil error. I've tried to debug it furtherly, and found out that the CRD is still terminating. Actually, the CRD gets deleted, but it takes some time. For example, if you add `time.Sleep(x * time.Second)` on the line 152, the test would pass. The problem is this isn't predictable. With `x` of 6-10 seconds, I manage to get this test passing, but there's zero guarantees the CRD will get deleted for that 10 seconds. I have found the `wait.Poll` function in some tests, but I'm not sure can it fix the problem I have. This is my first PR to the Kubernetes project, so I could be missing something. Any idea is appreciated. :) **Release note**: ```release-note NONE ``` /sig api-machinery /area custom-resources /cc nikhita sttts liggitt
2 parents f9c9a25 + 1178990 commit c8841ce

File tree

1 file changed

+74
-0
lines changed

1 file changed

+74
-0
lines changed

staging/src/k8s.io/apiextensions-apiserver/test/integration/finalization_test.go

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,16 @@ package integration
1818

1919
import (
2020
"testing"
21+
"time"
2122

2223
"github.com/stretchr/testify/require"
2324

2425
apiextensionsv1beta1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1"
26+
2527
"k8s.io/apiextensions-apiserver/test/integration/testserver"
2628
"k8s.io/apimachinery/pkg/api/errors"
2729
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
30+
"k8s.io/apimachinery/pkg/util/wait"
2831
)
2932

3033
func TestFinalization(t *testing.T) {
@@ -89,3 +92,74 @@ func TestFinalization(t *testing.T) {
8992
require.Error(t, err)
9093
require.True(t, errors.IsNotFound(err), "%#v", err)
9194
}
95+
96+
func TestFinalizationAndDeletion(t *testing.T) {
97+
stopCh, apiExtensionClient, clientPool, err := testserver.StartDefaultServerWithClients()
98+
require.NoError(t, err)
99+
defer close(stopCh)
100+
101+
// Create a CRD.
102+
noxuDefinition := testserver.NewNoxuCustomResourceDefinition(apiextensionsv1beta1.ClusterScoped)
103+
noxuVersionClient, err := testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, clientPool)
104+
require.NoError(t, err)
105+
106+
// Create a CR with a finalizer.
107+
ns := "not-the-default"
108+
name := "foo123"
109+
noxuResourceClient := NewNamespacedCustomResourceClient(ns, noxuVersionClient, noxuDefinition)
110+
111+
instance := testserver.NewNoxuInstance(ns, name)
112+
instance.SetFinalizers([]string{"noxu.example.com/finalizer"})
113+
createdNoxuInstance, err := instantiateCustomResource(t, instance, noxuResourceClient, noxuDefinition)
114+
require.NoError(t, err)
115+
116+
// Delete a CR. Because there's a finalizer, it will not get deleted now.
117+
uid := createdNoxuInstance.GetUID()
118+
err = noxuResourceClient.Delete(name, &metav1.DeleteOptions{
119+
Preconditions: &metav1.Preconditions{
120+
UID: &uid,
121+
},
122+
})
123+
require.NoError(t, err)
124+
125+
// Check is the CR scheduled for deletion.
126+
gottenNoxuInstance, err := noxuResourceClient.Get(name, metav1.GetOptions{})
127+
require.NoError(t, err)
128+
require.NotNil(t, gottenNoxuInstance.GetDeletionTimestamp())
129+
130+
// Delete the CRD.
131+
testserver.DeleteCustomResourceDefinition(noxuDefinition, apiExtensionClient)
132+
133+
// Check is CR still there after the CRD deletion.
134+
gottenNoxuInstance, err = noxuResourceClient.Get(name, metav1.GetOptions{})
135+
require.NoError(t, err)
136+
137+
// Update the CR to remove the finalizer.
138+
for {
139+
gottenNoxuInstance.SetFinalizers(nil)
140+
_, err = noxuResourceClient.Update(gottenNoxuInstance)
141+
if err == nil {
142+
break
143+
}
144+
if !errors.IsConflict(err) {
145+
require.NoError(t, err) // Fail on unexpected error
146+
}
147+
gottenNoxuInstance, err = noxuResourceClient.Get(name, metav1.GetOptions{})
148+
require.NoError(t, err)
149+
}
150+
151+
// Verify the CR is gone.
152+
// It should return the NonFound error.
153+
_, err = noxuResourceClient.Get(name, metav1.GetOptions{})
154+
if !errors.IsNotFound(err) {
155+
t.Fatalf("unable to delete cr: %v", err)
156+
}
157+
158+
err = wait.Poll(500*time.Millisecond, wait.ForeverTestTimeout, func() (bool, error) {
159+
_, err = testserver.GetCustomResourceDefinition(noxuDefinition, apiExtensionClient)
160+
return errors.IsNotFound(err), err
161+
})
162+
if !errors.IsNotFound(err) {
163+
t.Fatalf("unable to delete crd: %v", err)
164+
}
165+
}

0 commit comments

Comments
 (0)