@@ -18,13 +18,16 @@ package integration
18
18
19
19
import (
20
20
"testing"
21
+ "time"
21
22
22
23
"github.com/stretchr/testify/require"
23
24
24
25
apiextensionsv1beta1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1"
26
+
25
27
"k8s.io/apiextensions-apiserver/test/integration/testserver"
26
28
"k8s.io/apimachinery/pkg/api/errors"
27
29
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
30
+ "k8s.io/apimachinery/pkg/util/wait"
28
31
)
29
32
30
33
func TestFinalization (t * testing.T ) {
@@ -89,3 +92,74 @@ func TestFinalization(t *testing.T) {
89
92
require .Error (t , err )
90
93
require .True (t , errors .IsNotFound (err ), "%#v" , err )
91
94
}
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