1313package io .kubernetes .client .examples ;
1414
1515import io .kubernetes .client .extended .controller .Controller ;
16+ import io .kubernetes .client .extended .controller .builder .ControllerBuilder ;
17+ import io .kubernetes .client .extended .controller .builder .DefaultControllerBuilder ;
1618import io .kubernetes .client .extended .controller .reconciler .Reconciler ;
1719import io .kubernetes .client .extended .controller .reconciler .Request ;
1820import io .kubernetes .client .extended .controller .reconciler .Result ;
21+ import io .kubernetes .client .informer .SharedIndexInformer ;
1922import io .kubernetes .client .informer .SharedInformer ;
2023import io .kubernetes .client .informer .SharedInformerFactory ;
2124import io .kubernetes .client .informer .cache .Lister ;
25+ import io .kubernetes .client .openapi .ApiClient ;
2226import io .kubernetes .client .openapi .models .V1Endpoints ;
2327import io .kubernetes .client .openapi .models .V1EndpointsList ;
2428import io .kubernetes .client .openapi .models .V1Node ;
2529import io .kubernetes .client .openapi .models .V1NodeList ;
2630import io .kubernetes .client .openapi .models .V1Pod ;
2731import io .kubernetes .client .openapi .models .V1PodList ;
28- import io .kubernetes .client .spring .extended .controller .annotation .GroupVersionResource ;
29- import io .kubernetes .client .spring .extended .controller .annotation .KubernetesInformer ;
30- import io .kubernetes .client .spring .extended .controller .annotation .KubernetesInformers ;
31- import io .kubernetes .client .spring .extended .controller .annotation .KubernetesReconciler ;
32- import io .kubernetes .client .spring .extended .controller .annotation .KubernetesReconcilerReadyFunc ;
33- import io .kubernetes .client .spring .extended .controller .annotation .KubernetesReconcilerWatch ;
34- import io .kubernetes .client .spring .extended .controller .annotation .KubernetesReconcilerWatches ;
35- import io .kubernetes .client .spring .extended .controller .factory .KubernetesControllerFactory ;
36- import org .springframework .beans .factory .annotation .Autowired ;
37- import org .springframework .beans .factory .annotation .Qualifier ;
32+ import io .kubernetes .client .util .generic .GenericKubernetesApi ;
33+ import java .time .Duration ;
3834import org .springframework .beans .factory .annotation .Value ;
3935import org .springframework .boot .CommandLineRunner ;
4036import org .springframework .boot .SpringApplication ;
@@ -55,8 +51,7 @@ public static class AppConfig {
5551
5652 @ Bean
5753 public CommandLineRunner commandLineRunner (
58- SharedInformerFactory sharedInformerFactory ,
59- @ Qualifier ("node-printing-controller" ) Controller nodePrintingController ) {
54+ SharedInformerFactory sharedInformerFactory , Controller nodePrintingController ) {
6055 return args -> {
6156 System .out .println ("starting informers.." );
6257 sharedInformerFactory .startAllRegisteredInformers ();
@@ -66,63 +61,72 @@ public CommandLineRunner commandLineRunner(
6661 };
6762 }
6863
69- // *REQUIRED*
70- // factorybean to crete controller
71- @ Bean ("node-printing-controller" )
72- public KubernetesControllerFactory kubernetesReconcilerConfigurer (
73- SharedInformerFactory sharedInformerFactory , Reconciler reconciler ) {
74- return new KubernetesControllerFactory (sharedInformerFactory , reconciler );
64+ @ Bean
65+ public Controller nodePrintingController (
66+ SharedInformerFactory sharedInformerFactory , NodePrintingReconciler reconciler ) {
67+ DefaultControllerBuilder builder = ControllerBuilder .defaultBuilder (sharedInformerFactory );
68+ builder =
69+ builder .watch (
70+ (q ) -> {
71+ return ControllerBuilder .controllerWatchBuilder (V1Node .class , q )
72+ .withResyncPeriod (Duration .ofMinutes (1 ))
73+ .build ();
74+ });
75+ builder .withWorkerCount (2 );
76+ builder .withReadyFunc (reconciler ::informerReady );
77+ return builder .withReconciler (reconciler ).withName ("nodePrintingController" ).build ();
78+ }
79+
80+ @ Bean
81+ public SharedIndexInformer <V1Endpoints > endpointsInformer (
82+ ApiClient apiClient , SharedInformerFactory sharedInformerFactory ) {
83+ GenericKubernetesApi <V1Endpoints , V1EndpointsList > genericApi =
84+ new GenericKubernetesApi <>(
85+ V1Endpoints .class , V1EndpointsList .class , "" , "v1" , "endpoints" , apiClient );
86+ return sharedInformerFactory .sharedIndexInformerFor (genericApi , V1Endpoints .class , 0 );
87+ }
88+
89+ @ Bean
90+ public SharedIndexInformer <V1Node > nodeInformer (
91+ ApiClient apiClient , SharedInformerFactory sharedInformerFactory ) {
92+ GenericKubernetesApi <V1Node , V1NodeList > genericApi =
93+ new GenericKubernetesApi <>(V1Node .class , V1NodeList .class , "" , "v1" , "nodes" , apiClient );
94+ return sharedInformerFactory .sharedIndexInformerFor (genericApi , V1Node .class , 60 * 1000L );
95+ }
96+
97+ @ Bean
98+ public SharedIndexInformer <V1Pod > podInformer (
99+ ApiClient apiClient , SharedInformerFactory sharedInformerFactory ) {
100+ GenericKubernetesApi <V1Pod , V1PodList > genericApi =
101+ new GenericKubernetesApi <>(V1Pod .class , V1PodList .class , "" , "v1" , "pods" , apiClient );
102+ return sharedInformerFactory .sharedIndexInformerFor (genericApi , V1Pod .class , 0 );
75103 }
76104 }
77105
78- @ KubernetesInformers ({ // Defining what resources is the informer-factory actually watching.
79- @ KubernetesInformer (
80- apiTypeClass = V1Endpoints .class ,
81- apiListTypeClass = V1EndpointsList .class ,
82- groupVersionResource =
83- @ GroupVersionResource (apiGroup = "" , apiVersion = "v1" , resourcePlural = "endpoints" )),
84- @ KubernetesInformer (
85- apiTypeClass = V1Node .class ,
86- apiListTypeClass = V1NodeList .class ,
87- groupVersionResource =
88- @ GroupVersionResource (apiGroup = "" , apiVersion = "v1" , resourcePlural = "nodes" ),
89- resyncPeriodMillis = 60 * 1000L ),
90- @ KubernetesInformer (
91- apiTypeClass = V1Pod .class ,
92- apiListTypeClass = V1PodList .class ,
93- groupVersionResource =
94- @ GroupVersionResource (apiGroup = "" , apiVersion = "v1" , resourcePlural = "pods" )),
95- })
96- @ Component
97- public static class MySharedInformerFactory extends SharedInformerFactory {}
98-
99- // As long as a reconciler bean attached `@KubernetesReconciler` detected in the context, we
100- // will
101- // be automatically creating a conresponding controller bean implementing {@link
102- // io.kubernetes.client.extended.controller.Controller}
103- // with the name specified and registering it to the spring bean-factory.
104- @ KubernetesReconciler (
105- watches =
106- @ KubernetesReconcilerWatches ({
107- @ KubernetesReconcilerWatch (
108- apiTypeClass = V1Node .class ,
109- resyncPeriodMillis = 60 * 1000L // fully resync every 1 minute
110- ),
111- }))
112106 @ Component
113107 public static class NodePrintingReconciler implements Reconciler {
114108
115109 @ Value ("${namespace}" )
116110 private String namespace ;
117111
118- @ Autowired private SharedInformer <V1Node > nodeInformer ;
119- @ Autowired private SharedInformer <V1Pod > podInformer ;
120- @ Autowired private Lister <V1Node > nodeLister ;
121- @ Autowired private Lister <V1Pod > podLister ;
112+ private SharedInformer <V1Node > nodeInformer ;
113+
114+ private SharedInformer <V1Pod > podInformer ;
115+
116+ private Lister <V1Node > nodeLister ;
117+
118+ private Lister <V1Pod > podLister ;
119+
120+ public NodePrintingReconciler (
121+ SharedIndexInformer <V1Node > nodeInformer , SharedIndexInformer <V1Pod > podInformer ) {
122+ this .nodeInformer = nodeInformer ;
123+ this .podInformer = podInformer ;
124+ this .nodeLister = new Lister <>(nodeInformer .getIndexer (), namespace );
125+ this .podLister = new Lister <>(podInformer .getIndexer (), namespace );
126+ }
122127
123128 // *OPTIONAL*
124- // If you feed like hold the controller from running util some condition..
125- @ KubernetesReconcilerReadyFunc
129+ // If you want to hold the controller from running util some condition..
126130 public boolean informerReady () {
127131 return podInformer .hasSynced () && nodeInformer .hasSynced ();
128132 }
0 commit comments