From 0e9ca75037482816a467e26cdd8d9ca7efa91fee Mon Sep 17 00:00:00 2001 From: Britania Rodriguez Reyes Date: Tue, 19 Mar 2024 18:37:19 -0700 Subject: [PATCH] update code --- pkg/utils/informer/informermanager.go | 18 +- pkg/utils/informer/informermanager_test.go | 277 --------------------- pkg/utils/informer/suite_test.go | 76 ------ 3 files changed, 4 insertions(+), 367 deletions(-) delete mode 100644 pkg/utils/informer/informermanager_test.go delete mode 100644 pkg/utils/informer/suite_test.go diff --git a/pkg/utils/informer/informermanager.go b/pkg/utils/informer/informermanager.go index 77ca719c0..81075cc74 100644 --- a/pkg/utils/informer/informermanager.go +++ b/pkg/utils/informer/informermanager.go @@ -75,7 +75,6 @@ func NewInformerManager(client dynamic.Interface, scheme *runtime.Scheme, defaul cfg := config.GetConfigOrDie() c, err := Cache.New(cfg, Cache.Options{Scheme: scheme, SyncPeriod: &defaultResync}) if err != nil { - //handle error klog.V(2).ErrorS(err, "Failed to create informer cache") } return &informerManagerImpl{ @@ -127,18 +126,13 @@ func (s *informerManagerImpl) AddDynamicResources(dynResources []APIResourceMeta addInformerFunc := func(newRes APIResourceMeta) { _, exist := s.apiResources[newRes.GroupVersionKind] if !exist { - c, err := Cache.New(config.GetConfigOrDie(), Cache.Options{Scheme: s.scheme}) - if err != nil { - //handle error - klog.ErrorS(err, "Failed to create informer cache") - } - s.cache = c + // TODO: how to add GVK to scheme? informer, err := s.cache.GetInformerForKind(s.ctx, newRes.GroupVersionKind) if err != nil { - // Log the error instead of panicking klog.ErrorS(err, "Failed to create informer for resource", "gvk", newRes.GroupVersionKind, "err", err) return } + // if AddEventHandler returns an error, it is because the informer has stopped and cannot be restarted if newRes.Registration, err = informer.AddEventHandler(handler); err != nil { if s.ctx.Err() != nil { @@ -173,8 +167,8 @@ func (s *informerManagerImpl) AddDynamicResources(dynResources []APIResourceMeta if !newGVKs[gvk] && !dynRes.isStaticResource { informer, err := s.cache.GetInformerForKind(s.ctx, dynRes.GroupVersionKind) if err != nil { - //handle error - panic(err) + klog.ErrorS(err, "Failed to get informer for resource", "gvk", dynRes.GroupVersionKind, "err", err) + return } if err := informer.RemoveEventHandler(dynRes.Registration); err != nil { if s.ctx.Err() == nil { @@ -185,7 +179,6 @@ func (s *informerManagerImpl) AddDynamicResources(dynResources []APIResourceMeta } obj, err := s.scheme.New(gvk) if err != nil { - // handle error klog.V(2).ErrorS(err, "Could not get object of a disappeared resource", "res", dynRes) } err = s.cache.RemoveInformer(s.ctx, obj.(client.Object)) @@ -215,12 +208,10 @@ func (s *informerManagerImpl) AddStaticResource(resource APIResourceMeta, handle s.apiResources[resource.GroupVersionKind] = &resource informer, err := s.cache.GetInformerForKind(s.ctx, resource.GroupVersionKind) if err != nil { - //handle error klog.V(2).ErrorS(err, "Failed to create informer for resource", "gvk", resource.GroupVersionKind) } resource.Registration, err = informer.AddEventHandler(handler) if err != nil { - //handle error klog.V(2).ErrorS(err, "Failed to add event handler for resource", "gvk", resource.GroupVersionKind) } } @@ -229,7 +220,6 @@ func (s *informerManagerImpl) IsInformerSynced(resource schema.GroupVersionKind) // TODO: use a lazy initialized sync map to reduce the number of informer sync look ups informer, err := s.cache.GetInformerForKind(s.ctx, resource) if err != nil { - //handle error klog.V(2).ErrorS(err, "Failed to get informer for resource", "gvk", resource) } return informer.HasSynced() diff --git a/pkg/utils/informer/informermanager_test.go b/pkg/utils/informer/informermanager_test.go deleted file mode 100644 index bd1480a9a..000000000 --- a/pkg/utils/informer/informermanager_test.go +++ /dev/null @@ -1,277 +0,0 @@ -package informer - -import ( - //"fmt" - - . "github.com/onsi/ginkgo/v2" - //"k8s.io/utils/ptr" - //Cache "sigs.k8s.io/controller-runtime/pkg/cache" -) - -var _ = Describe("Informer Manager Suite", func() { - Context("Add then remove dynamic resources", Ordered, func() { - It("", func() { - println("Works?") - //dynResources := []APIResourceMeta{ - // { - // GroupVersionKind: schema.GroupVersionKind{ - // Group: "apiextensions.k8s.io", - // Version: "v1", - // Kind: "CustomResourceDefinition", - // }, - // GroupVersionResource: schema.GroupVersionResource{ - // Group: "example.com", - // Version: "v1", - // Resource: "exampleresources", - // }, - // IsClusterScoped: true, - // isStaticResource: false, - // Registration: nil, - // }, - //} - //// Create a resource event handler - //handler := &cache.ResourceEventHandlerFuncs{ - // AddFunc: func(obj interface{}) {}, - // UpdateFunc: func(oldObj, newObj interface{}) {}, - // DeleteFunc: func(obj interface{}) {}, - //} - //// Create a new unstructured object - //obj := &unstructured.Unstructured{} - // - //// Set the object's GroupVersionKind - //obj.SetGroupVersionKind(schema.GroupVersionKind{ - // Group: "apiextensions.k8s.io", - // Version: "v1", - // Kind: "CustomResourceDefinition", - //}) - ////manager.Start() - //// Add the dynamic resource to the informer manager - //impl.AddDynamicResources(dynResources, handler, true) - ////manager.AddDynamicResources(tc.dynResources, handler, true) - //for _, dynResource := range dynResources { - // if _, ok := impl.apiResources[dynResource.GroupVersionKind]; !ok { - // println(fmt.Errorf("Expected dynamic resource %v to be added to informer manager", dynResource)) - // } - //} - // - ////// Check that the informer was created for the dynamic resources - //for _, dynResource := range dynResources { - // informer, err := impl.cache.GetInformerForKind(ctx, dynResource.GroupVersionKind) - // if informer == nil || err != nil { - // println(fmt.Errorf("Expected informer to be created for resource %v", dynResource)) - // } - //} - // - ////Remove the dynamic resource from the informer manager - //impl.AddDynamicResources([]APIResourceMeta{}, handler, true) - //for _, dynResource := range dynResources { - // if _, ok := impl.apiResources[dynResource.GroupVersionKind]; ok { - // println(fmt.Errorf("Expected dynamic resource %v to be removed to informer manager", dynResource)) - // } - //} - }) - }) -}) - -//func TestAddDynamicResources(t *testing.T) { -// -// tests := map[string]struct { -// dynResources []APIResourceMeta -// dynamicClient *fake.FakeDynamicClient -// }{ -// "add multiple dynamic resources then remove one": { -// dynResources: []APIResourceMeta{ -// { -// GroupVersionKind: schema.GroupVersionKind{ -// Group: "apiextensions.k8s.io", -// Version: "v1", -// Kind: "CustomResourceDefinition", -// }, -// GroupVersionResource: schema.GroupVersionResource{ -// Group: "example.com", -// Version: "v1", -// Resource: "exampleresources", -// }, -// IsClusterScoped: true, -// isStaticResource: false, -// Registration: nil, -// }, -// }, -// }, -// } -// for testName, tc := range tests { -// t.Run(testName, func(t *testing.T) { -// // Create a resource event handler -// handler := &cache.ResourceEventHandlerFuncs{ -// AddFunc: func(obj interface{}) {}, -// UpdateFunc: func(oldObj, newObj interface{}) {}, -// DeleteFunc: func(obj interface{}) {}, -// } -// // Create a new unstructured object -// obj := &unstructured.Unstructured{} -// -// // Set the object's GroupVersionKind -// obj.SetGroupVersionKind(schema.GroupVersionKind{ -// Group: "apiextensions.k8s.io", -// Version: "v1", -// Kind: "CustomResourceDefinition", -// }) -// groupVersion := schema.GroupVersion{Group: tc.dynResources[0].GroupVersionKind.Group, Version: tc.dynResources[0].GroupVersionKind.Version} -// // Create a fake dynamic client and informer manager -// scheme := runtime.NewScheme() -// scheme.AddKnownTypeWithName(groupVersion.WithKind(tc.dynResources[0].GroupVersionKind.Kind), obj) -// metav1.AddToGroupVersion(scheme, groupVersion) -// //RegisterUnstructuredTypes(scheme, tc.dynResources[0].GroupVersionKind, tc.dynResources[1].GroupVersionKind) -// scheme.New(tc.dynResources[0].GroupVersionKind) -// client := fake.NewSimpleDynamicClient(scheme) -// ctx, cancel := context.WithCancel(context.Background()) -// cfg := &rest.Config{ -// Host: "https://my-kubernetes-cluster.example.com", -// } -// c, err := Cache.New(cfg, Cache.Options{SyncPeriod: ptr.To(1 * time.Minute)}) -// if err != nil { -// t.Fatalf("Expected cache to be created for resource") -// } -// //manager := NewInformerManager(client, time.Minute*10, make(chan struct{})) -// impl := informerManagerImpl{ -// dynamicClient: client, -// ctx: ctx, -// cancel: cancel, -// cache: c, -// apiResources: make(map[schema.GroupVersionKind]*APIResourceMeta), -// } -// //manager.Start() -// // Add the dynamic resource to the informer manager -// impl.AddDynamicResources(tc.dynResources, handler, true) -// //manager.AddDynamicResources(tc.dynResources, handler, true) -// for _, dynResource := range tc.dynResources { -// if _, ok := impl.apiResources[dynResource.GroupVersionKind]; !ok { -// t.Errorf("Expected dynamic resource %v to be added to informer manager", dynResource) -// } -// } -// -// //// Check that the informer was created for the dynamic resources -// for _, dynResource := range tc.dynResources { -// informer, err := impl.cache.GetInformerForKind(ctx, dynResource.GroupVersionKind) -// if informer == nil || err != nil { -// t.Fatalf("Expected informer to be created for resource %v", dynResource) -// } -// } -// -// //Remove the dynamic resource from the informer manager -// impl.AddDynamicResources([]APIResourceMeta{}, handler, true) -// for _, dynResource := range tc.dynResources { -// if _, ok := impl.apiResources[dynResource.GroupVersionKind]; ok { -// t.Errorf("Expected dynamic resource %v to be removed to informer manager", dynResource) -// } -// } -// }) -// } -//} - -// -//func TestAddDynamicResources(t *testing.T) { -// // Create some mock APIResourceMeta objects -// resource1 := APIResourceMeta{ -// GroupVersionKind: schema.GroupVersionKind{ -// Group: "apiextensions.k8s.io", -// Version: "v1", -// Kind: "CustomResourceDefinition", -// }, -// GroupVersionResource: schema.GroupVersionResource{ -// Group: "apiextensions.k8s.io", -// Version: "v1", -// Resource: "customresourcedefinition", -// }, -// IsClusterScoped: true, -// isStaticResource: false, -// } -// // Create a dynamic client and a parent channel -// scheme := runtime.NewScheme() -// scheme.New(resource1.GroupVersionKind) -// client := fake.NewSimpleDynamicClient(scheme) -// ctx, cancel := context.WithCancel(context.Background()) -// cfg, err := NewMockConfig() -// if err != nil { -// t.Fatalf("Expected cache to be created for resource") -// } -// c, err := Cache.New(cfg, Cache.Options{SyncPeriod: ptr.To(1 * time.Minute)}) -// if err != nil { -// println(fmt.Errorf("Expected cache to be created for resource %s", err)) -// } -// manager := NewInformerManager(cfg, client, time.Minute*10, make(chan struct{})) -// impl := informerManagerImpl{ -// dynamicClient: client, -// ctx: ctx, -// cancel: cancel, -// cache: c, -// apiResources: make(map[schema.GroupVersionKind]*APIResourceMeta), -// } -// // Create a mock resource event handler -// mockHandler := &cache.ResourceEventHandlerFuncs{ -// AddFunc: func(obj interface{}) {}, -// UpdateFunc: func(oldObj, newObj interface{}) {}, -// DeleteFunc: func(obj interface{}) {}, -// } -// -// // Add the mock resources to the informer manager -// manager.AddDynamicResources([]APIResourceMeta{resource1}, mockHandler, true) -// impl.AddDynamicResources([]APIResourceMeta{resource1}, mockHandler, true) -// if ok := impl.IsInformerSynced(resource1.GroupVersionKind); !ok { -// t.Errorf("Resource1 not found in apiResources") -// } -// //if _, ok := informerManager.apiResources[resource2.GroupVersionKind]; !ok { -// // t.Errorf("Resource2 not found in apiResources") -// //} -// // -// //// Verify that the mock handler was added to the informers -// //if len(mockHandler.calls) != 2 { -// // t.Errorf("Expected 2 calls to mock handler, got...%d", len(mockHandler.calls)) -// //} -// //for _, call := range mockHandler.calls { -// // if call.Action != "add" { -// // t.Errorf("Expected 'add' action, got %s", call.Action) -// // } -// //} -// // -// //// Remove one of the resources from the informer manager -// //informerManager.AddDynamicResources([]APIResourceMeta{resource1}, mockHandler, true) -// // -// //// Verify that the removed resource is no longer in the apiResources map -// //if len(informerManager.apiResources) != 1 { -// // t.Errorf("Expected 1 resource, got %d", len(informerManager.apiResources)) -// //} -// //if _, ok := informerManager.apiResources[resource1.GroupVersionKind]; ok { -// // t.Errorf("Resource1 still found in apiResources") -// //} -// //if _, ok := informerManager.apiResources[resource2.GroupVersionKind]; !ok { -// // t.Errorf("Resource2 not found in apiResources") -// //} -// // -// //// Verify that the mock handler was removed from the informer for the removed resource -// //if len(mockHandler.calls) != 3 { -// // t.Errorf("Expected 3 calls to mock handler, got %d", len(mockHandler.calls)) -// //} -// //for _, call := range mockHandler.calls { -// // if call.Action == "remove" && call.GVK == resource1.GroupVersionKind { -// // break -// // } -// // if call.Action != "add" { -// // t.Errorf("Expected 'add' or 'remove' action, got %s", call.Action) -// // } -// //} -//} -// -//func NewMockConfig() (*rest.Config, error) { -// kubeconfigPath := clientcmd.NewDefaultClientConfigLoadingRules().GetDefaultFilename() -// -// // Create a new client config object from the default kubeconfig file -// clientConfig, err := clientcmd.NewNonInteractiveDeferredLoadingClientConfig( -// &clientcmd.ClientConfigLoadingRules{ExplicitPath: kubeconfigPath}, -// &clientcmd.ConfigOverrides{}).ClientConfig() -// if err != nil { -// return nil, err -// } -// -// return clientConfig, nil -//} diff --git a/pkg/utils/informer/suite_test.go b/pkg/utils/informer/suite_test.go deleted file mode 100644 index 3d7ea978c..000000000 --- a/pkg/utils/informer/suite_test.go +++ /dev/null @@ -1,76 +0,0 @@ -package informer - -import ( - "context" - "testing" - "time" - - . "github.com/onsi/ginkgo/v2" - . "github.com/onsi/gomega" - "k8s.io/utils/ptr" - Cache "sigs.k8s.io/controller-runtime/pkg/cache" - - "k8s.io/client-go/dynamic" - "k8s.io/klog/v2" - "sigs.k8s.io/controller-runtime/pkg/envtest" - "sigs.k8s.io/controller-runtime/pkg/log/zap" -) - -var ( - testEnv *envtest.Environment - //dynamicClient dynamic.DynamicClient - //impl *informerManagerImpl - informerMgr Manager - ctx context.Context - cancel context.CancelFunc -) - -func TestAPIs(t *testing.T) { - RegisterFailHandler(Fail) - - RunSpecs(t, "Informer Manager Suite") -} - -var _ = BeforeSuite(func() { - klog.SetLogger(zap.New(zap.WriteTo(GinkgoWriter), zap.UseDevMode(true))) - - ctx, cancel = context.WithCancel(context.TODO()) - - By("bootstrap the test environment") - - // Start the test environment. - testEnv = &envtest.Environment{} - restCfg, err := testEnv.Start() - Expect(err).NotTo(HaveOccurred()) - Expect(restCfg).NotTo(BeNil()) - - dynamicClient, err := dynamic.NewForConfig(restCfg) - Expect(dynamicClient).NotTo(BeNil()) - Expect(err).NotTo(HaveOccurred()) - cache, err := Cache.New(restCfg, Cache.Options{SyncPeriod: ptr.To(time.Minute * 1)}) - Expect(cache).NotTo(BeNil()) - Expect(err).NotTo(HaveOccurred()) - informerMgr = NewInformerManager(dynamicClient, time.Minute*1, make(<-chan struct{})) - //impl = &informerManagerImpl{ - // dynamicClient: dynamicClient, - // ctx: ctx, - // cancel: cancel, - // cache: cache, - // apiResources: make(map[schema.GroupVersionKind]*APIResourceMeta), - //} - - //informerMgr = impl - defer func() { - informerMgr.Start() - }() - - informerMgr.WaitForCacheSync() -}) - -var _ = AfterSuite(func() { - defer klog.Flush() - cancel() - - By("tearing down the test environment") - Expect(testEnv.Stop()).Should(Succeed()) -})