From 282bfb270b4862d04a58e5c2a8d8ad93832f5eec Mon Sep 17 00:00:00 2001 From: Phillip Ferrell Date: Thu, 15 Aug 2019 15:05:23 -0700 Subject: [PATCH 1/2] #1083: use unstructured runtime.Object with the apiResource info when registering informers (needs backend change in client-go to log the gvk of the unstructured object) --- pkg/controller/status/controller.go | 5 ++--- pkg/controller/sync/accessor.go | 6 +++--- pkg/controller/util/federated_informer.go | 2 +- pkg/controller/util/resourceinformer.go | 22 +++++++++++++++------- pkg/schedulingtypes/plugin.go | 2 +- 5 files changed, 22 insertions(+), 15 deletions(-) diff --git a/pkg/controller/status/controller.go b/pkg/controller/status/controller.go index adf2fe7d3d..6176dd138b 100644 --- a/pkg/controller/status/controller.go +++ b/pkg/controller/status/controller.go @@ -133,10 +133,9 @@ func newKubeFedStatusController(controllerConfig *util.ControllerConfig, typeCon targetNamespace := controllerConfig.TargetNamespace - s.federatedStore, s.federatedController = util.NewResourceInformer(federatedTypeClient, targetNamespace, enqueueObj) - s.statusStore, s.statusController = util.NewResourceInformer(statusClient, targetNamespace, enqueueObj) - targetAPIResource := typeConfig.GetTargetType() + s.federatedStore, s.federatedController = util.NewResourceInformer(federatedTypeClient, targetNamespace, &targetAPIResource, enqueueObj) + s.statusStore, s.statusController = util.NewResourceInformer(statusClient, targetNamespace, statusAPIResource, enqueueObj) // Federated informer for resources in member clusters s.informer, err = util.NewFederatedInformer( diff --git a/pkg/controller/sync/accessor.go b/pkg/controller/sync/accessor.go index 5f6d9d1523..33bee89f58 100644 --- a/pkg/controller/sync/accessor.go +++ b/pkg/controller/sync/accessor.go @@ -95,7 +95,7 @@ func NewFederatedResourceAccessor( if err != nil { return nil, err } - a.federatedStore, a.federatedController = util.NewResourceInformer(federatedTypeClient, targetNamespace, enqueueObj) + a.federatedStore, a.federatedController = util.NewResourceInformer(federatedTypeClient, targetNamespace, &federatedTypeAPIResource, enqueueObj) if a.targetIsNamespace { // Initialize an informer for namespaces. The namespace @@ -106,7 +106,7 @@ func NewFederatedResourceAccessor( if err != nil { return nil, err } - a.namespaceStore, a.namespaceController = util.NewResourceInformer(namespaceTypeClient, targetNamespace, enqueueObj) + a.namespaceStore, a.namespaceController = util.NewResourceInformer(namespaceTypeClient, targetNamespace, &namespaceAPIResource, enqueueObj) } if typeConfig.GetNamespaced() { @@ -133,7 +133,7 @@ func NewFederatedResourceAccessor( if err != nil { return nil, err } - a.fedNamespaceStore, a.fedNamespaceController = util.NewResourceInformer(fedNamespaceClient, targetNamespace, fedNamespaceEnqueue) + a.fedNamespaceStore, a.fedNamespaceController = util.NewResourceInformer(fedNamespaceClient, targetNamespace, fedNamespaceAPIResource, fedNamespaceEnqueue) } a.versionManager = version.NewVersionManager( diff --git a/pkg/controller/util/federated_informer.go b/pkg/controller/util/federated_informer.go index d4f00f0394..f268c3ad6a 100644 --- a/pkg/controller/util/federated_informer.go +++ b/pkg/controller/util/federated_informer.go @@ -147,7 +147,7 @@ func NewFederatedInformer( return nil, nil, err } targetNamespace := NamespaceForCluster(cluster.Name, config.TargetNamespace) - store, controller := NewManagedResourceInformer(resourceClient, targetNamespace, triggerFunc) + store, controller := NewManagedResourceInformer(resourceClient, targetNamespace, apiResource, triggerFunc) return store, controller, nil } diff --git a/pkg/controller/util/resourceinformer.go b/pkg/controller/util/resourceinformer.go index 31b5e2c27d..5b1e6eafc5 100644 --- a/pkg/controller/util/resourceinformer.go +++ b/pkg/controller/util/resourceinformer.go @@ -23,24 +23,32 @@ import ( "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/labels" pkgruntime "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/util/runtime" "k8s.io/apimachinery/pkg/watch" "k8s.io/client-go/tools/cache" ) -// NewManagedResourceInformer returns an unfiltered informer. -func NewResourceInformer(client ResourceClient, namespace string, triggerFunc func(pkgruntime.Object)) (cache.Store, cache.Controller) { - return newResourceInformer(client, namespace, triggerFunc, "") +// NewResourceInformer returns an unfiltered informer. +func NewResourceInformer(client ResourceClient, namespace string, apiResource *metav1.APIResource, triggerFunc func(pkgruntime.Object)) (cache.Store, cache.Controller) { + return newResourceInformer(client, namespace, apiResource, triggerFunc, "") } // NewManagedResourceInformer returns an informer limited to resources // managed by KubeFed as indicated by labeling. -func NewManagedResourceInformer(client ResourceClient, namespace string, triggerFunc func(pkgruntime.Object)) (cache.Store, cache.Controller) { +func NewManagedResourceInformer(client ResourceClient, namespace string, apiResource *metav1.APIResource, triggerFunc func(pkgruntime.Object)) (cache.Store, cache.Controller) { labelSelector := labels.Set(map[string]string{ManagedByKubeFedLabelKey: ManagedByKubeFedLabelValue}).AsSelector().String() - return newResourceInformer(client, namespace, triggerFunc, labelSelector) + return newResourceInformer(client, namespace, apiResource, triggerFunc, labelSelector) } -func newResourceInformer(client ResourceClient, namespace string, triggerFunc func(pkgruntime.Object), labelSelector string) (cache.Store, cache.Controller) { +func newResourceInformer(client ResourceClient, namespace string, apiResource *metav1.APIResource, triggerFunc func(pkgruntime.Object), labelSelector string) (cache.Store, cache.Controller) { + obj := &unstructured.Unstructured{} + + if apiResource != nil { + gvk := schema.GroupVersionKind{Group: apiResource.Group, Version: apiResource.Version, Kind: apiResource.Kind} + obj.SetGroupVersionKind(gvk) + obj.SetNamespace(namespace) + } return cache.NewInformer( &cache.ListWatch{ ListFunc: func(options metav1.ListOptions) (pkgruntime.Object, error) { @@ -52,7 +60,7 @@ func newResourceInformer(client ResourceClient, namespace string, triggerFunc fu return client.Resources(namespace).Watch(options) }, }, - nil, // Skip checks for expected type since the type will depend on the client + obj, // use a unstructured type with apiVersion / Kind populated for informer logging purposes NoResyncPeriod, NewTriggerOnAllChanges(triggerFunc), ) diff --git a/pkg/schedulingtypes/plugin.go b/pkg/schedulingtypes/plugin.go index b43342cc3a..e02e3f6436 100644 --- a/pkg/schedulingtypes/plugin.go +++ b/pkg/schedulingtypes/plugin.go @@ -82,7 +82,7 @@ func NewPlugin(controllerConfig *util.ControllerConfig, eventHandlers SchedulerE if err != nil { return nil, err } - p.federatedStore, p.federatedController = util.NewResourceInformer(p.federatedTypeClient, targetNamespace, kubeFedEventHandler) + p.federatedStore, p.federatedController = util.NewResourceInformer(p.federatedTypeClient, targetNamespace, &federatedTypeAPIResource, kubeFedEventHandler) return p, nil } From 638f523fc24eb07ab7e2939dff5bf5235930d136 Mon Sep 17 00:00:00 2001 From: Jimmi Dyson Date: Thu, 27 Feb 2020 18:18:53 +0000 Subject: [PATCH 2/2] chore: Remove redundant SetNamespace call and fix up comment --- pkg/controller/util/resourceinformer.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/pkg/controller/util/resourceinformer.go b/pkg/controller/util/resourceinformer.go index 5b1e6eafc5..30b785743e 100644 --- a/pkg/controller/util/resourceinformer.go +++ b/pkg/controller/util/resourceinformer.go @@ -47,7 +47,6 @@ func newResourceInformer(client ResourceClient, namespace string, apiResource *m if apiResource != nil { gvk := schema.GroupVersionKind{Group: apiResource.Group, Version: apiResource.Version, Kind: apiResource.Kind} obj.SetGroupVersionKind(gvk) - obj.SetNamespace(namespace) } return cache.NewInformer( &cache.ListWatch{ @@ -60,7 +59,7 @@ func newResourceInformer(client ResourceClient, namespace string, apiResource *m return client.Resources(namespace).Watch(options) }, }, - obj, // use a unstructured type with apiVersion / Kind populated for informer logging purposes + obj, // use an unstructured type with apiVersion / kind populated for informer logging purposes NoResyncPeriod, NewTriggerOnAllChanges(triggerFunc), )