Skip to content

Commit f4ff589

Browse files
aviralgarg05k8s-publishing-bot
authored andcommitted
Fix flaky TestApplyCRDuringCRDFinalization test
This PR fixes the flaky TestApplyCRDuringCRDFinalization test that was failing intermittently on slower systems (s390x architecture, race detector builds). The root cause was a race condition where the test would attempt to apply a CR immediately after requesting CRD deletion, without waiting for the CRD to actually enter the terminating state. The fix explicitly waits for the CRD to have the Terminating condition set to True before attempting the apply. Kubernetes-commit: 0a9d14b01c41faffa5b218c5d8724b87ef862a54
1 parent 09f0433 commit f4ff589

File tree

1 file changed

+28
-15
lines changed

1 file changed

+28
-15
lines changed

test/integration/finalization_test.go

Lines changed: 28 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
3339
func 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

Comments
 (0)