From 1345ad6157f4729920faedf3365d51423e3a3a54 Mon Sep 17 00:00:00 2001 From: Mohamed Awnallah Date: Mon, 18 Nov 2024 20:08:28 +0200 Subject: [PATCH] pkg/search/controllers_test: fix flaky test cases In this commit, we fix flaky test cases mainly by increasing the timeout from 250 milliseconds to 500 milliseconds. Signed-off-by: Mohamed Awnallah --- pkg/search/controllers_test.go | 150 ++++++++++++++++++++++++--------- 1 file changed, 109 insertions(+), 41 deletions(-) diff --git a/pkg/search/controllers_test.go b/pkg/search/controllers_test.go index 6576b3d35956..7bb83670cf16 100644 --- a/pkg/search/controllers_test.go +++ b/pkg/search/controllers_test.go @@ -30,6 +30,7 @@ import ( fakedynamic "k8s.io/client-go/dynamic/fake" "k8s.io/client-go/kubernetes/scheme" "k8s.io/client-go/rest" + "k8s.io/client-go/restmapper" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/client/fake" @@ -43,6 +44,41 @@ import ( "github.com/karmada-io/karmada/pkg/util" ) +var apiGroupResources = []*restmapper.APIGroupResources{ + { + Group: metav1.APIGroup{ + Name: "apps", + Versions: []metav1.GroupVersionForDiscovery{ + {GroupVersion: "apps/v1", Version: "v1"}, + }, + PreferredVersion: metav1.GroupVersionForDiscovery{ + GroupVersion: "apps/v1", Version: "v1", + }, + }, + VersionedResources: map[string][]metav1.APIResource{ + "v1": { + {Name: "deployments", SingularName: "deployment", Namespaced: true, Kind: "Deployment"}, + }, + }, + }, + { + Group: metav1.APIGroup{ + Name: "", + Versions: []metav1.GroupVersionForDiscovery{ + {GroupVersion: "v1", Version: "v1"}, + }, + PreferredVersion: metav1.GroupVersionForDiscovery{ + GroupVersion: "v1", Version: "v1", + }, + }, + VersionedResources: map[string][]metav1.APIResource{ + "v1": { + {Name: "pods", SingularName: "pod", Namespaced: true, Kind: "Pod"}, + }, + }, + }, +} + func TestNewKarmadaSearchController(t *testing.T) { tests := []struct { name string @@ -115,7 +151,7 @@ func TestAddClusterEventHandler(t *testing.T) { if err := upsertCluster(clientConnector, labels, apiEndpoint, clusterName, resourceVersion); err != nil { return err } - time.Sleep(time.Millisecond * 250) + time.Sleep(time.Millisecond * 500) if err := cacheNextWrapper(controller); err != nil { return err } @@ -157,7 +193,7 @@ func TestUpdateClusterEventHandler(t *testing.T) { name: "AddAllEventHandlers_TriggerUpdateClusterEvent_UpdatedClusterAddedToWorkQueue", restConfig: &rest.Config{}, client: fakekarmadaclient.NewSimpleClientset(), - restMapper: meta.NewDefaultRESTMapper(nil), + restMapper: restmapper.NewDiscoveryRESTMapper(apiGroupResources), stopCh: make(chan struct{}), prep: func(clientConnector *fakekarmadaclient.Clientset, restConfig *rest.Config, restMapper meta.RESTMapper) (*Controller, informerfactory.SharedInformerFactory, error) { factory := informerfactory.NewSharedInformerFactory(clientConnector, 0) @@ -175,7 +211,7 @@ func TestUpdateClusterEventHandler(t *testing.T) { if err := upsertCluster(clientConnector, oldLabels, apiEndpoint, clusterName, resourceVersion); err != nil { return err } - time.Sleep(time.Millisecond * 250) + time.Sleep(time.Millisecond * 500) if err := cacheNextWrapper(controller); err != nil { return err } @@ -185,7 +221,7 @@ func TestUpdateClusterEventHandler(t *testing.T) { if err := upsertCluster(clientConnector, newLabels, apiEndpoint, clusterName, updatedResourceVerison); err != nil { return err } - time.Sleep(time.Millisecond * 250) + time.Sleep(time.Millisecond * 500) if err := cacheNextWrapper(controller); err != nil { return err } @@ -229,7 +265,7 @@ func TestDeleteClusterEventHandler(t *testing.T) { restConfig: &rest.Config{}, client: fakekarmadaclient.NewSimpleClientset(), controlPlaneClient: fake.NewFakeClient(), - restMapper: meta.NewDefaultRESTMapper(nil), + restMapper: restmapper.NewDiscoveryRESTMapper(apiGroupResources), stopCh: make(chan struct{}), prep: func(clientConnector *fakekarmadaclient.Clientset, restConfig *rest.Config, restMapper meta.RESTMapper) (*Controller, informerfactory.SharedInformerFactory, error) { factory := informerfactory.NewSharedInformerFactory(clientConnector, 0) @@ -249,12 +285,6 @@ func TestDeleteClusterEventHandler(t *testing.T) { } ) - if err := clusterv1alpha1.Install(scheme.Scheme); err != nil { - return fmt.Errorf("failed to install scheme: %w", err) - } - if err := upsertClusterControllerRuntime(controlPlaneClient, labels, clusterName, apiEndpoint); err != nil { - return err - } controlPlaneClientBuilder = func(*rest.Config) client.Client { return controlPlaneClient } @@ -265,12 +295,19 @@ func TestDeleteClusterEventHandler(t *testing.T) { }, nil } + if err := clusterv1alpha1.Install(scheme.Scheme); err != nil { + return fmt.Errorf("failed to install scheme: %w", err) + } + if err := upsertClusterControllerRuntime(controlPlaneClient, labels, clusterName, apiEndpoint); err != nil { + return err + } + // Wait a bit to allow for addCluster background // thread to complete its execution. if err := upsertCluster(clientConnector, labels, apiEndpoint, clusterName, resourceVersion); err != nil { return err } - time.Sleep(time.Millisecond * 250) + time.Sleep(time.Millisecond * 500) if err := cacheNextWrapper(controller); err != nil { return err } @@ -280,7 +317,7 @@ func TestDeleteClusterEventHandler(t *testing.T) { if err := upsertResourceRegistry(clientConnector, resourceSelectors, registryName, resourceVersion, []string{clusterName}); err != nil { return err } - time.Sleep(time.Millisecond * 250) + time.Sleep(time.Millisecond * 500) if err := cacheNextWrapper(controller); err != nil { return err } @@ -290,10 +327,7 @@ func TestDeleteClusterEventHandler(t *testing.T) { if err := deleteCluster(clientConnector, clusterName); err != nil { return err } - time.Sleep(time.Millisecond * 250) - if err := cacheNextWrapper(controller); err != nil { - return err - } + time.Sleep(time.Millisecond * 500) // Verify no backend store for this deleted cluster. if backend := backendstore.GetBackend(clusterName); backend != nil { @@ -339,7 +373,7 @@ func TestAddResourceRegistryEventHandler(t *testing.T) { restConfig: &rest.Config{}, client: fakekarmadaclient.NewSimpleClientset(), controlPlaneClient: fake.NewFakeClient(), - restMapper: meta.NewDefaultRESTMapper(nil), + restMapper: restmapper.NewDiscoveryRESTMapper(apiGroupResources), stopCh: make(chan struct{}), prep: func(clientConnector *fakekarmadaclient.Clientset, restConfig *rest.Config, restMapper meta.RESTMapper) (*Controller, informerfactory.SharedInformerFactory, error) { factory := informerfactory.NewSharedInformerFactory(clientConnector, 0) @@ -374,7 +408,7 @@ func TestAddResourceRegistryEventHandler(t *testing.T) { if err := upsertCluster(clientConnector, labels, apiEndpoint, clusterName, resourceVersion); err != nil { return err } - time.Sleep(time.Millisecond * 250) + time.Sleep(time.Millisecond * 500) if err := cacheNextWrapper(controller); err != nil { return err } @@ -384,7 +418,7 @@ func TestAddResourceRegistryEventHandler(t *testing.T) { if err := upsertResourceRegistry(clientConnector, resourceSelectors, registryName, resourceVersion, []string{clusterName}); err != nil { return err } - time.Sleep(time.Millisecond * 250) + time.Sleep(time.Millisecond * 500) if err := cacheNextWrapper(controller); err != nil { return err } @@ -414,26 +448,28 @@ func TestAddResourceRegistryEventHandler(t *testing.T) { func TestUpdateResourceRegistryEventHandler(t *testing.T) { tests := []struct { - name string - restConfig *rest.Config - client *fakekarmadaclient.Clientset - restMapper meta.RESTMapper - stopCh chan struct{} - prep func(*fakekarmadaclient.Clientset, *rest.Config, meta.RESTMapper) (*Controller, informerfactory.SharedInformerFactory, error) - verify func(*fakekarmadaclient.Clientset, *Controller) error + name string + restConfig *rest.Config + client *fakekarmadaclient.Clientset + controlPlaneClient client.WithWatch + restMapper meta.RESTMapper + stopCh chan struct{} + prep func(*fakekarmadaclient.Clientset, *rest.Config, meta.RESTMapper) (*Controller, informerfactory.SharedInformerFactory, error) + verify func(clientConnector *fakekarmadaclient.Clientset, controller *Controller, controlPlaneClient client.Client) error }{ { - name: "AddAllEventHandlers_TriggerUpdateResourceRegistryEvent_UpdatedResourceRegistryAddedToWorkQueue", - restConfig: &rest.Config{}, - client: fakekarmadaclient.NewSimpleClientset(), - restMapper: meta.NewDefaultRESTMapper(nil), - stopCh: make(chan struct{}), + name: "AddAllEventHandlers_TriggerUpdateResourceRegistryEvent_UpdatedResourceRegistryAddedToWorkQueue", + restConfig: &rest.Config{}, + client: fakekarmadaclient.NewSimpleClientset(), + controlPlaneClient: fake.NewFakeClient(), + restMapper: restmapper.NewDiscoveryRESTMapper(apiGroupResources), + stopCh: make(chan struct{}), prep: func(clientConnector *fakekarmadaclient.Clientset, restConfig *rest.Config, restMapper meta.RESTMapper) (*Controller, informerfactory.SharedInformerFactory, error) { factory := informerfactory.NewSharedInformerFactory(clientConnector, 0) controller, err := createController(restConfig, factory, restMapper) return controller, factory, err }, - verify: func(clientConnector *fakekarmadaclient.Clientset, controller *Controller) error { + verify: func(clientConnector *fakekarmadaclient.Clientset, controller *Controller, controlPlaneClient client.Client) error { var ( registryName, clusterName, resourceVersion = "test-registry", "test-cluster", "1000" apiEndpoint, labels = "10.0.0.1", map[string]string{} @@ -455,12 +491,22 @@ func TestUpdateResourceRegistryEventHandler(t *testing.T) { } ) + controlPlaneClientBuilder = func(*rest.Config) client.Client { + return controlPlaneClient + } + clusterDynamicClientBuilder = func(string, client.Client) (*util.DynamicClusterClient, error) { + return &util.DynamicClusterClient{ + DynamicClientSet: fakedynamic.NewSimpleDynamicClient(scheme.Scheme), + ClusterName: clusterName, + }, nil + } + // Wait a bit to allow addCluster background thread // to complete its execution. if err := upsertCluster(clientConnector, labels, apiEndpoint, clusterName, resourceVersion); err != nil { return err } - time.Sleep(time.Millisecond * 250) + time.Sleep(time.Millisecond * 500) if err := cacheNextWrapper(controller); err != nil { return err } @@ -470,7 +516,7 @@ func TestUpdateResourceRegistryEventHandler(t *testing.T) { if err := upsertResourceRegistry(clientConnector, resourceSelectors, registryName, resourceVersion, []string{clusterName}); err != nil { return err } - time.Sleep(time.Millisecond * 250) + time.Sleep(time.Millisecond * 500) if err := cacheNextWrapper(controller); err != nil { return err } @@ -480,7 +526,7 @@ func TestUpdateResourceRegistryEventHandler(t *testing.T) { if err := upsertResourceRegistry(clientConnector, resourceSelectorsUpdated, registryName, resourceVersion, []string{clusterName}); err != nil { return err } - time.Sleep(time.Millisecond * 250) + time.Sleep(time.Millisecond * 500) if err := cacheNextWrapper(controller); err != nil { return err } @@ -501,7 +547,7 @@ func TestUpdateResourceRegistryEventHandler(t *testing.T) { informer.Start(test.stopCh) defer close(test.stopCh) - if err := test.verify(test.client, controller); err != nil { + if err := test.verify(test.client, controller, test.controlPlaneClient); err != nil { t.Errorf("failed to verify controller, got: %v", err) } }) @@ -524,7 +570,7 @@ func TestDeleteResourceRegistryEventHandler(t *testing.T) { restConfig: &rest.Config{}, client: fakekarmadaclient.NewSimpleClientset(), controlPlaneClient: fake.NewFakeClient(), - restMapper: meta.NewDefaultRESTMapper(nil), + restMapper: restmapper.NewDiscoveryRESTMapper(apiGroupResources), stopCh: make(chan struct{}), prep: func(clientConnector *fakekarmadaclient.Clientset, restConfig *rest.Config, restMapper meta.RESTMapper) (*Controller, informerfactory.SharedInformerFactory, error) { factory := informerfactory.NewSharedInformerFactory(clientConnector, 0) @@ -559,7 +605,7 @@ func TestDeleteResourceRegistryEventHandler(t *testing.T) { if err := upsertCluster(clientConnector, labels, apiEndpoint, clusterName, resourceVersion); err != nil { return err } - time.Sleep(time.Millisecond * 250) + time.Sleep(time.Millisecond * 500) if err := cacheNextWrapper(controller); err != nil { return err } @@ -569,7 +615,7 @@ func TestDeleteResourceRegistryEventHandler(t *testing.T) { if err := upsertResourceRegistry(clientConnector, resourceSelectors, registryName, resourceVersion, []string{clusterName}); err != nil { return err } - time.Sleep(time.Millisecond * 250) + time.Sleep(time.Millisecond * 500) if err := cacheNextWrapper(controller); err != nil { return err } @@ -579,7 +625,7 @@ func TestDeleteResourceRegistryEventHandler(t *testing.T) { if err := deleteResourceRegistry(clientConnector, registryName); err != nil { return err } - time.Sleep(time.Millisecond * 250) + time.Sleep(time.Millisecond * 500) if err := cacheNextWrapper(controller); err != nil { return err } @@ -637,6 +683,17 @@ func upsertCluster(client *fakekarmadaclient.Clientset, labels map[string]string Status: metav1.ConditionTrue, }, }, + APIEnablements: []clusterv1alpha1.APIEnablement{ + { + GroupVersion: "apps/v1", + Resources: []clusterv1alpha1.APIResource{ + { + Name: "Deployments", + Kind: "Deployment", + }, + }, + }, + }, }, } @@ -678,6 +735,17 @@ func upsertClusterControllerRuntime(controlPlaneClient client.Client, labels map Status: metav1.ConditionTrue, }, }, + APIEnablements: []clusterv1alpha1.APIEnablement{ + { + GroupVersion: "apps/v1", + Resources: []clusterv1alpha1.APIResource{ + { + Name: "Deployments", + Kind: "Deployment", + }, + }, + }, + }, }, }