@@ -23,13 +23,19 @@ import (
2323
2424 "github.com/stretchr/testify/require"
2525
26+ apiextensionshelpers "k8s.io/apiextensions-apiserver/pkg/apihelpers"
2627 apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
2728 "k8s.io/apiextensions-apiserver/test/integration/fixtures"
2829 "k8s.io/apimachinery/pkg/api/errors"
2930 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
3031 "k8s.io/apimachinery/pkg/util/wait"
3132)
3233
34+ const (
35+ testNamespace = "not-the-default"
36+ testFinalizer = "noxu.example.com/finalizer"
37+ )
38+
3339func TestFinalization (t * testing.T ) {
3440 tearDown , apiExtensionClient , dynamicClient , err := fixtures .StartDefaultServerWithClients (t )
3541 require .NoError (t , err )
@@ -39,12 +45,12 @@ func TestFinalization(t *testing.T) {
3945 noxuDefinition , err = fixtures .CreateNewV1CustomResourceDefinition (noxuDefinition , apiExtensionClient , dynamicClient )
4046 require .NoError (t , err )
4147
42- ns := "not-the-default"
48+ ns := testNamespace
4349 name := "foo123"
4450 noxuResourceClient := newNamespacedCustomResourceClient (ns , dynamicClient , noxuDefinition )
4551
4652 instance := fixtures .NewNoxuInstance (ns , name )
47- instance .SetFinalizers ([]string {"noxu.example.com/finalizer" })
53+ instance .SetFinalizers ([]string {testFinalizer })
4854 createdNoxuInstance , err := instantiateCustomResource (t , instance , noxuResourceClient , noxuDefinition )
4955 require .NoError (t , err )
5056
@@ -104,12 +110,12 @@ func TestFinalizationAndDeletion(t *testing.T) {
104110 require .NoError (t , err )
105111
106112 // Create a CR with a finalizer.
107- ns := "not-the-default"
113+ ns := testNamespace
108114 name := "foo123"
109115 noxuResourceClient := newNamespacedCustomResourceClient (ns , dynamicClient , noxuDefinition )
110116
111117 instance := fixtures .NewNoxuInstance (ns , name )
112- instance .SetFinalizers ([]string {"noxu.example.com/finalizer" })
118+ instance .SetFinalizers ([]string {testFinalizer })
113119 createdNoxuInstance , err := instantiateCustomResource (t , instance , noxuResourceClient , noxuDefinition )
114120 require .NoError (t , err )
115121
@@ -171,28 +177,35 @@ func TestApplyCRDuringCRDFinalization(t *testing.T) {
171177
172178 // Create a CRD with a finalizer which will stall deletion
173179 noxuDefinition := fixtures .NewNoxuV1CustomResourceDefinition (apiextensionsv1 .ClusterScoped )
174- noxuDefinition .SetFinalizers ([]string {"noxu.example.com/finalizer" })
180+ noxuDefinition .SetFinalizers ([]string {testFinalizer })
175181 noxuDefinition , err = fixtures .CreateNewV1CustomResourceDefinition (noxuDefinition , apiExtensionClient , dynamicClient )
176182 require .NoError (t , err )
177183
178184 // Delete the CRD. Since it has a finalizer it will be stuck in terminating state
179185 err = apiExtensionClient .ApiextensionsV1 ().CustomResourceDefinitions ().Delete (t .Context (), noxuDefinition .Name , metav1.DeleteOptions {})
180186 require .NoError (t , err )
181187
188+ // Wait for the CRD to have the Terminating condition set to True.
189+ // The handler checks IsCRDConditionTrue(crd, apiextensionsv1.Terminating) to block
190+ // CR creation, and this condition is set asynchronously by the CRD finalizer controller
191+ // after it observes the DeletionTimestamp. Without this wait, the Apply could succeed
192+ // if it races ahead of the controller setting the condition.
193+ err = wait .PollUntilContextTimeout (t .Context (), 100 * time .Millisecond , wait .ForeverTestTimeout , true , func (ctx context.Context ) (bool , error ) {
194+ crd , err := apiExtensionClient .ApiextensionsV1 ().CustomResourceDefinitions ().Get (ctx , noxuDefinition .Name , metav1.GetOptions {})
195+ if err != nil {
196+ return false , err
197+ }
198+ return apiextensionshelpers .IsCRDConditionTrue (crd , apiextensionsv1 .Terminating ), nil
199+ })
200+ require .NoError (t , err , "timed out waiting for CRD Terminating condition to be set" )
201+
182202 // Try to create a CR using SSA. This should fail due to the CRD validation
183- ns := "not-the-default"
203+ ns := testNamespace
184204 name := "foo123"
185205 noxuResourceClient := newNamespacedCustomResourceClient (ns , dynamicClient , noxuDefinition )
186206
187- err = wait .PollUntilContextTimeout (t .Context (), 100 * time .Millisecond , wait .ForeverTestTimeout , true , func (ctx context.Context ) (bool , error ) {
188- instance := fixtures .NewNoxuInstance (ns , name )
189- _ , err := noxuResourceClient .Apply (ctx , name , instance , metav1.ApplyOptions {DryRun : []string {"All" }, FieldManager : "manager" })
190- if err == nil {
191- t .Log ("apply was not blocked, retrying..." )
192- return false , nil
193- }
194- return true , err
195- })
207+ instance := fixtures .NewNoxuInstance (ns , name )
208+ _ , err = noxuResourceClient .Apply (t .Context (), name , instance , metav1.ApplyOptions {DryRun : []string {"All" }, FieldManager : "manager" })
196209 wantErr := `create not allowed while custom resource definition is terminating`
197210 require .ErrorContains (t , err , wantErr )
198211}
0 commit comments