From 804f8c75843eb03f029ec2d5dad93428532b4aae 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")