From d428c6b8fe6c5ba4d532fd1f5bc544d53e403b8f Mon Sep 17 00:00:00 2001 From: Ed Bartosh Date: Sun, 8 Dec 2024 22:03:21 +0200 Subject: [PATCH] kubelet: fix DRA registration test Set expected slice fields in the reactor function instead of test cleanup instead of doing it in the test cleanup. This should fix the test failure caused by kubelet calling reactor function before the test cleanup sets the deleteCollectionForDriver variable. --- .../cm/dra/plugin/registration_test.go | 20 ++++++++----------- 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/pkg/kubelet/cm/dra/plugin/registration_test.go b/pkg/kubelet/cm/dra/plugin/registration_test.go index c8e17f034fb..949682f6aab 100644 --- a/pkg/kubelet/cm/dra/plugin/registration_test.go +++ b/pkg/kubelet/cm/dra/plugin/registration_test.go @@ -19,7 +19,6 @@ package plugin import ( "sort" "strings" - "sync/atomic" "testing" "time" @@ -37,7 +36,6 @@ import ( drapbv1alpha4 "k8s.io/kubelet/pkg/apis/dra/v1alpha4" drapb "k8s.io/kubelet/pkg/apis/dra/v1beta1" "k8s.io/kubernetes/test/utils/ktesting" - "k8s.io/utils/ptr" ) const ( @@ -126,18 +124,13 @@ func TestRegistrationHandler(t *testing.T) { // Stand-alone kubelet has no connection to an // apiserver, so faking one is optional. var client kubernetes.Interface - var deleteCollectionForDriver atomic.Pointer[string] if test.withClient { + expectedSliceFields := fields.Set{"spec.nodeName": nodeName} fakeClient := fake.NewClientset(slice) fakeClient.AddReactor("delete-collection", "resourceslices", func(action cgotesting.Action) (bool, runtime.Object, error) { deleteAction := action.(cgotesting.DeleteCollectionAction) restrictions := deleteAction.GetListRestrictions() - sliceFields := fields.Set{"spec.nodeName": nodeName} - forDriver := deleteCollectionForDriver.Load() - if forDriver != nil { - sliceFields["spec.driver"] = *forDriver - } - fieldsSelector := fields.SelectorFromSet(sliceFields) + fieldsSelector := fields.SelectorFromSet(expectedSliceFields) // The order of field requirements is random because it comes // from a map. We need to sort. normalize := func(selector string) string { @@ -152,6 +145,12 @@ func TestRegistrationHandler(t *testing.T) { // Delete doesn't return an error if already deleted, which is what // we need here (no error when nothing to delete). err := fakeClient.Tracker().Delete(resourceapi.SchemeGroupVersion.WithResource("resourceslices"), "", slice.Name) + + // Set expected slice fields for the next call of this reactor. + // The reactor will be called next time when resourceslices object is deleted + // by the kubelet after plugin deregistration. + expectedSliceFields = fields.Set{"spec.nodeName": nodeName, "spec.driver": test.pluginName} + return true, nil, err }) client = fakeClient @@ -211,9 +210,6 @@ func TestRegistrationHandler(t *testing.T) { // Nop. handler.DeRegisterPlugin(test.pluginName) - // Deleted by the kubelet after deregistration, now specifically - // for that plugin (checked by the fake client reactor). - deleteCollectionForDriver.Store(ptr.To(test.pluginName)) requireNoSlices() }) assert.Equal(t, test.endpoint, plugin.endpoint, "plugin endpoint")