13
13
package io .kubernetes .client .examples ;
14
14
15
15
import io .kubernetes .client .extended .controller .Controller ;
16
+ import io .kubernetes .client .extended .controller .builder .ControllerBuilder ;
17
+ import io .kubernetes .client .extended .controller .builder .DefaultControllerBuilder ;
16
18
import io .kubernetes .client .extended .controller .reconciler .Reconciler ;
17
19
import io .kubernetes .client .extended .controller .reconciler .Request ;
18
20
import io .kubernetes .client .extended .controller .reconciler .Result ;
21
+ import io .kubernetes .client .informer .SharedIndexInformer ;
19
22
import io .kubernetes .client .informer .SharedInformer ;
20
23
import io .kubernetes .client .informer .SharedInformerFactory ;
21
24
import io .kubernetes .client .informer .cache .Lister ;
25
+ import io .kubernetes .client .openapi .ApiClient ;
22
26
import io .kubernetes .client .openapi .models .V1Endpoints ;
23
27
import io .kubernetes .client .openapi .models .V1EndpointsList ;
24
28
import io .kubernetes .client .openapi .models .V1Node ;
25
29
import io .kubernetes .client .openapi .models .V1NodeList ;
26
30
import io .kubernetes .client .openapi .models .V1Pod ;
27
31
import 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 ;
38
34
import org .springframework .beans .factory .annotation .Value ;
39
35
import org .springframework .boot .CommandLineRunner ;
40
36
import org .springframework .boot .SpringApplication ;
@@ -55,8 +51,7 @@ public static class AppConfig {
55
51
56
52
@ Bean
57
53
public CommandLineRunner commandLineRunner (
58
- SharedInformerFactory sharedInformerFactory ,
59
- @ Qualifier ("node-printing-controller" ) Controller nodePrintingController ) {
54
+ SharedInformerFactory sharedInformerFactory , Controller nodePrintingController ) {
60
55
return args -> {
61
56
System .out .println ("starting informers.." );
62
57
sharedInformerFactory .startAllRegisteredInformers ();
@@ -66,63 +61,72 @@ public CommandLineRunner commandLineRunner(
66
61
};
67
62
}
68
63
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 );
75
103
}
76
104
}
77
105
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
- }))
112
106
@ Component
113
107
public static class NodePrintingReconciler implements Reconciler {
114
108
115
109
@ Value ("${namespace}" )
116
110
private String namespace ;
117
111
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
+ }
122
127
123
128
// *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..
126
130
public boolean informerReady () {
127
131
return podInformer .hasSynced () && nodeInformer .hasSynced ();
128
132
}
0 commit comments