@@ -26,6 +26,7 @@ import (
26
26
"k8s.io/apimachinery/pkg/runtime/serializer"
27
27
utilerrors "k8s.io/apimachinery/pkg/util/errors"
28
28
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
29
+ "k8s.io/apimachinery/pkg/util/sets"
29
30
"k8s.io/client-go/informers"
30
31
"k8s.io/client-go/tools/cache"
31
32
"k8s.io/klog/v2"
@@ -187,6 +188,9 @@ func (c *StaticResourceController) AddKubeInformers(kubeInformersByNamespace v1h
187
188
// set the informers so we can have caching clients
188
189
c .clients = c .clients .WithKubernetesInformers (kubeInformersByNamespace )
189
190
191
+ // avoid adding an informer more than once
192
+ informerSet := sets .New [cache.SharedIndexInformer ]()
193
+
190
194
ret := c
191
195
for _ , conditionalManifest := range c .manifests {
192
196
for _ , file := range conditionalManifest .files {
@@ -227,29 +231,29 @@ func (c *StaticResourceController) AddKubeInformers(kubeInformersByNamespace v1h
227
231
case * corev1.Namespace :
228
232
ret = ret .AddNamespaceInformer (informer .Core ().V1 ().Namespaces ().Informer (), t .Name )
229
233
case * corev1.Service :
230
- ret = ret .AddInformer (informer .Core ().V1 ().Services ().Informer ())
234
+ ret = ret .AddInformer (informerSet , informer .Core ().V1 ().Services ().Informer ())
231
235
case * corev1.Pod :
232
- ret = ret .AddInformer (informer .Core ().V1 ().Pods ().Informer ())
236
+ ret = ret .AddInformer (informerSet , informer .Core ().V1 ().Pods ().Informer ())
233
237
case * corev1.ServiceAccount :
234
- ret = ret .AddInformer (informer .Core ().V1 ().ServiceAccounts ().Informer ())
238
+ ret = ret .AddInformer (informerSet , informer .Core ().V1 ().ServiceAccounts ().Informer ())
235
239
case * corev1.ConfigMap :
236
- ret = ret .AddInformer (informer .Core ().V1 ().ConfigMaps ().Informer ())
240
+ ret = ret .AddInformer (informerSet , informer .Core ().V1 ().ConfigMaps ().Informer ())
237
241
case * corev1.Secret :
238
- ret = ret .AddInformer (informer .Core ().V1 ().Secrets ().Informer ())
242
+ ret = ret .AddInformer (informerSet , informer .Core ().V1 ().Secrets ().Informer ())
239
243
case * rbacv1.ClusterRole :
240
- ret = ret .AddInformer (informer .Rbac ().V1 ().ClusterRoles ().Informer ())
244
+ ret = ret .AddInformer (informerSet , informer .Rbac ().V1 ().ClusterRoles ().Informer ())
241
245
case * rbacv1.ClusterRoleBinding :
242
- ret = ret .AddInformer (informer .Rbac ().V1 ().ClusterRoleBindings ().Informer ())
246
+ ret = ret .AddInformer (informerSet , informer .Rbac ().V1 ().ClusterRoleBindings ().Informer ())
243
247
case * rbacv1.Role :
244
- ret = ret .AddInformer (informer .Rbac ().V1 ().Roles ().Informer ())
248
+ ret = ret .AddInformer (informerSet , informer .Rbac ().V1 ().Roles ().Informer ())
245
249
case * rbacv1.RoleBinding :
246
- ret = ret .AddInformer (informer .Rbac ().V1 ().RoleBindings ().Informer ())
250
+ ret = ret .AddInformer (informerSet , informer .Rbac ().V1 ().RoleBindings ().Informer ())
247
251
case * policyv1.PodDisruptionBudget :
248
- ret = ret .AddInformer (informer .Policy ().V1 ().PodDisruptionBudgets ().Informer ())
252
+ ret = ret .AddInformer (informerSet , informer .Policy ().V1 ().PodDisruptionBudgets ().Informer ())
249
253
case * storagev1.StorageClass :
250
- ret = ret .AddInformer (informer .Storage ().V1 ().StorageClasses ().Informer ())
254
+ ret = ret .AddInformer (informerSet , informer .Storage ().V1 ().StorageClasses ().Informer ())
251
255
case * storagev1.CSIDriver :
252
- ret = ret .AddInformer (informer .Storage ().V1 ().CSIDrivers ().Informer ())
256
+ ret = ret .AddInformer (informerSet , informer .Storage ().V1 ().CSIDrivers ().Informer ())
253
257
default :
254
258
// if there's a missing case, the caller can add an informer or count on a time based trigger.
255
259
// if the controller doesn't handle it, then there will be failure from the underlying apply.
@@ -261,8 +265,11 @@ func (c *StaticResourceController) AddKubeInformers(kubeInformersByNamespace v1h
261
265
return ret
262
266
}
263
267
264
- func (c * StaticResourceController ) AddInformer (informer cache.SharedIndexInformer ) * StaticResourceController {
265
- c .factory .WithInformers (informer )
268
+ func (c * StaticResourceController ) AddInformer (set sets.Set [cache.SharedIndexInformer ], informer cache.SharedIndexInformer ) * StaticResourceController {
269
+ if ! set .Has (informer ) {
270
+ sets .Insert (set , informer )
271
+ c .factory .WithInformers (informer )
272
+ }
266
273
return c
267
274
}
268
275
0 commit comments