@@ -4,26 +4,28 @@ import (
44 "fmt"
55
66 networkclient "github.com/GoogleCloudPlatform/gke-networking-api/client/network/clientset/versioned"
7- informernetwork "github.com/GoogleCloudPlatform/gke-networking-api/client/network/informers/externalversions/network/v1 "
7+ networkinformers "github.com/GoogleCloudPlatform/gke-networking-api/client/network/informers/externalversions"
88 nodetopologyclient "github.com/GoogleCloudPlatform/gke-networking-api/client/nodetopology/clientset/versioned"
9- informernodetopology "github.com/GoogleCloudPlatform/gke-networking-api/client/nodetopology/informers/externalversions/nodetopology/v1 "
9+ nodetopologyinformers "github.com/GoogleCloudPlatform/gke-networking-api/client/nodetopology/informers/externalversions"
1010 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
11- informerv1 "k8s.io/client-go/informers/core/v1"
12- discoveryinformer "k8s.io/client-go/informers/discovery/v1"
13- informernetworking "k8s.io/client-go/informers/networking/v1"
11+ "k8s.io/client-go/informers"
1412 "k8s.io/client-go/kubernetes"
1513 "k8s.io/client-go/tools/cache"
1614 "k8s.io/ingress-gce/pkg/multiproject/common/filteredinformer"
1715 svcnegclient "k8s.io/ingress-gce/pkg/svcneg/client/clientset/versioned"
18- informersvcneg "k8s.io/ingress-gce/pkg/svcneg/client/informers/externalversions/svcneg/v1beta1"
19- "k8s.io/ingress-gce/pkg/utils"
16+ svcneginformers "k8s.io/ingress-gce/pkg/svcneg/client/informers/externalversions"
2017 "k8s.io/ingress-gce/pkg/utils/endpointslices"
2118 "k8s.io/klog/v2"
2219)
2320
2421// InformerSet manages all shared informers used by multiproject controllers.
2522// It provides centralized initialization and lifecycle management.
2623type InformerSet struct {
24+ kubeFactory informers.SharedInformerFactory
25+ svcNegFactory svcneginformers.SharedInformerFactory
26+ networkFactory networkinformers.SharedInformerFactory
27+ nodetopologyFactory nodetopologyinformers.SharedInformerFactory
28+
2729 // Core Kubernetes informers (always present)
2830 Ingress cache.SharedIndexInformer
2931 Service cache.SharedIndexInformer
@@ -51,80 +53,48 @@ func NewInformerSet(
5153 nodeTopologyClient nodetopologyclient.Interface ,
5254 resyncPeriod metav1.Duration ,
5355) * InformerSet {
54- informers := & InformerSet {}
55-
56- // Create core Kubernetes informers
57- informers .Ingress = informernetworking .NewIngressInformer (
58- kubeClient ,
59- metav1 .NamespaceAll ,
60- resyncPeriod .Duration ,
61- utils .NewNamespaceIndexer (),
62- )
63-
64- informers .Service = informerv1 .NewServiceInformer (
65- kubeClient ,
66- metav1 .NamespaceAll ,
67- resyncPeriod .Duration ,
68- utils .NewNamespaceIndexer (),
69- )
56+ infSet := & InformerSet {}
7057
71- informers .Pod = informerv1 .NewPodInformer (
72- kubeClient ,
73- metav1 .NamespaceAll ,
74- resyncPeriod .Duration ,
75- utils .NewNamespaceIndexer (),
76- )
58+ infSet .kubeFactory = informers .NewSharedInformerFactory (kubeClient , resyncPeriod .Duration )
59+ if svcNegClient != nil {
60+ infSet .svcNegFactory = svcneginformers .NewSharedInformerFactory (svcNegClient , resyncPeriod .Duration )
61+ }
62+ if networkClient != nil {
63+ infSet .networkFactory = networkinformers .NewSharedInformerFactory (networkClient , resyncPeriod .Duration )
64+ }
65+ if nodeTopologyClient != nil {
66+ infSet .nodetopologyFactory = nodetopologyinformers .NewSharedInformerFactory (nodeTopologyClient , resyncPeriod .Duration )
67+ }
7768
78- informers . Node = informerv1 . NewNodeInformer (
79- kubeClient ,
80- resyncPeriod . Duration ,
81- utils . NewNamespaceIndexer (),
82- )
69+ // Create core Kubernetes informers from factory
70+ infSet . Ingress = infSet . kubeFactory . Networking (). V1 (). Ingresses (). Informer ()
71+ infSet . Service = infSet . kubeFactory . Core (). V1 (). Services (). Informer ()
72+ infSet . Pod = infSet . kubeFactory . Core (). V1 (). Pods (). Informer ()
73+ infSet . Node = infSet . kubeFactory . Core (). V1 (). Nodes (). Informer ( )
8374
8475 // EndpointSlice informer with custom indexers for NEG controller
85- informers .EndpointSlice = discoveryinformer .NewEndpointSliceInformer (
86- kubeClient ,
87- metav1 .NamespaceAll ,
88- resyncPeriod .Duration ,
89- cache.Indexers {
90- cache .NamespaceIndex : cache .MetaNamespaceIndexFunc ,
91- endpointslices .EndpointSlicesByServiceIndex : endpointslices .EndpointSlicesByServiceFunc ,
92- },
93- )
94-
95- // Create CRD informers if clients are available
96- if svcNegClient != nil {
97- informers .SvcNeg = informersvcneg .NewServiceNetworkEndpointGroupInformer (
98- svcNegClient ,
99- metav1 .NamespaceAll ,
100- resyncPeriod .Duration ,
101- utils .NewNamespaceIndexer (),
102- )
76+ endpointSliceInformer := infSet .kubeFactory .Discovery ().V1 ().EndpointSlices ().Informer ()
77+ if err := endpointSliceInformer .AddIndexers (cache.Indexers {
78+ endpointslices .EndpointSlicesByServiceIndex : endpointslices .EndpointSlicesByServiceFunc ,
79+ }); err != nil {
80+ klog .Fatalf ("failed to add indexers to endpointSlice informer: %v" , err )
10381 }
82+ infSet .EndpointSlice = endpointSliceInformer
10483
105- if networkClient != nil {
106- informers .Network = informernetwork .NewNetworkInformer (
107- networkClient ,
108- resyncPeriod .Duration ,
109- utils .NewNamespaceIndexer (),
110- )
111-
112- informers .GkeNetworkParams = informernetwork .NewGKENetworkParamSetInformer (
113- networkClient ,
114- resyncPeriod .Duration ,
115- utils .NewNamespaceIndexer (),
116- )
84+ // Create CRD informers if factories are available
85+ if infSet .svcNegFactory != nil {
86+ infSet .SvcNeg = infSet .svcNegFactory .Networking ().V1beta1 ().ServiceNetworkEndpointGroups ().Informer ()
11787 }
11888
119- if nodeTopologyClient != nil {
120- informers .NodeTopology = informernodetopology .NewNodeTopologyInformer (
121- nodeTopologyClient ,
122- resyncPeriod .Duration ,
123- utils .NewNamespaceIndexer (),
124- )
89+ if infSet .networkFactory != nil {
90+ infSet .Network = infSet .networkFactory .Networking ().V1 ().Networks ().Informer ()
91+ infSet .GkeNetworkParams = infSet .networkFactory .Networking ().V1 ().GKENetworkParamSets ().Informer ()
12592 }
12693
127- return informers
94+ if infSet .nodetopologyFactory != nil {
95+ infSet .NodeTopology = infSet .nodetopologyFactory .Networking ().V1 ().NodeTopologies ().Informer ()
96+ }
97+ return infSet
12898}
12999
130100// Start starts all informers and waits for their caches to sync.
@@ -147,18 +117,19 @@ func (i *InformerSet) Start(stopCh <-chan struct{}, logger klog.Logger) error {
147117 default :
148118 }
149119
150- // Start all core informers
151- startInformer (i .Ingress , stopCh )
152- startInformer (i .Service , stopCh )
153- startInformer (i .Pod , stopCh )
154- startInformer (i .Node , stopCh )
155- startInformer (i .EndpointSlice , stopCh )
156-
157- // Start optional informers
158- startInformer (i .SvcNeg , stopCh )
159- startInformer (i .Network , stopCh )
160- startInformer (i .GkeNetworkParams , stopCh )
161- startInformer (i .NodeTopology , stopCh )
120+ // Start factories
121+ if i .kubeFactory != nil {
122+ i .kubeFactory .Start (stopCh )
123+ }
124+ if i .svcNegFactory != nil {
125+ i .svcNegFactory .Start (stopCh )
126+ }
127+ if i .networkFactory != nil {
128+ i .networkFactory .Start (stopCh )
129+ }
130+ if i .nodetopologyFactory != nil {
131+ i .nodetopologyFactory .Start (stopCh )
132+ }
162133
163134 i .started = true
164135
@@ -271,11 +242,3 @@ func (i *InformerSet) hasSyncedFuncs() []func() bool {
271242
272243 return funcs
273244}
274-
275- // startInformer starts the informer if it is non-nil.
276- func startInformer (inf cache.SharedIndexInformer , stopCh <- chan struct {}) {
277- if inf == nil {
278- return
279- }
280- go inf .Run (stopCh )
281- }
0 commit comments