From 282bfb270b4862d04a58e5c2a8d8ad93832f5eec Mon Sep 17 00:00:00 2001
From: Phillip Ferrell <pferrell@snaproute.com>
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 <jimmidyson@gmail.com>
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),
 	)