12
12
*/
13
13
package io .kubernetes .client .spring .extended .controller ;
14
14
15
+ import io .kubernetes .client .common .KubernetesObject ;
15
16
import io .kubernetes .client .informer .SharedIndexInformer ;
16
17
import io .kubernetes .client .informer .SharedInformer ;
17
18
import io .kubernetes .client .informer .SharedInformerFactory ;
20
21
import io .kubernetes .client .spring .extended .controller .annotation .KubernetesInformer ;
21
22
import io .kubernetes .client .spring .extended .controller .annotation .KubernetesInformers ;
22
23
import io .kubernetes .client .util .generic .GenericKubernetesApi ;
23
- import java .time .Duration ;
24
- import org .slf4j .Logger ;
25
- import org .slf4j .LoggerFactory ;
26
24
import org .springframework .beans .BeansException ;
27
- import org .springframework .beans .factory .annotation . Autowired ;
25
+ import org .springframework .beans .factory .BeanFactory ;
28
26
import org .springframework .beans .factory .config .ConfigurableListableBeanFactory ;
29
- import org .springframework .beans .factory .support .AbstractBeanDefinition ;
27
+ import org .springframework .beans .factory .support .BeanDefinitionBuilder ;
30
28
import org .springframework .beans .factory .support .BeanDefinitionRegistry ;
31
29
import org .springframework .beans .factory .support .BeanDefinitionRegistryPostProcessor ;
32
30
import org .springframework .beans .factory .support .RootBeanDefinition ;
33
31
import org .springframework .core .Ordered ;
34
32
import org .springframework .core .ResolvableType ;
33
+ import org .springframework .core .annotation .AnnotatedElementUtils ;
35
34
36
35
/**
37
36
* The type Kubernetes informer factory processor which basically does the following things:
44
43
public class KubernetesInformerFactoryProcessor
45
44
implements BeanDefinitionRegistryPostProcessor , Ordered {
46
45
47
- private static final Logger log =
48
- LoggerFactory .getLogger (KubernetesInformerFactoryProcessor .class );
49
-
50
46
public static final int ORDER = 0 ;
51
47
52
- private BeanDefinitionRegistry beanDefinitionRegistry ;
53
-
54
- private final ApiClient apiClient ;
55
- private final SharedInformerFactory sharedInformerFactory ;
56
-
57
- @ Autowired
58
- public KubernetesInformerFactoryProcessor (
59
- ApiClient apiClient , SharedInformerFactory sharedInformerFactory ) {
60
- this .apiClient = apiClient ;
61
- this .sharedInformerFactory = sharedInformerFactory ;
62
- }
48
+ private ConfigurableListableBeanFactory beanFactory ;
63
49
64
50
@ Override
65
51
public void postProcessBeanFactory (ConfigurableListableBeanFactory beanFactory )
66
52
throws BeansException {
67
-
68
- this .apiClient .setHttpClient (
69
- this .apiClient .getHttpClient ().newBuilder ().readTimeout (Duration .ZERO ).build ());
70
-
71
- KubernetesInformers kubernetesInformers =
72
- sharedInformerFactory .getClass ().getAnnotation (KubernetesInformers .class );
73
- if (kubernetesInformers == null || kubernetesInformers .value ().length == 0 ) {
74
- log .info ("No informers registered in the sharedInformerFactory.." );
75
- return ;
76
- }
77
- for (KubernetesInformer kubernetesInformer : kubernetesInformers .value ()) {
78
- final GenericKubernetesApi api =
79
- new GenericKubernetesApi (
80
- kubernetesInformer .apiTypeClass (),
81
- kubernetesInformer .apiListTypeClass (),
82
- kubernetesInformer .groupVersionResource ().apiGroup (),
83
- kubernetesInformer .groupVersionResource ().apiVersion (),
84
- kubernetesInformer .groupVersionResource ().resourcePlural (),
85
- apiClient );
86
- SharedIndexInformer sharedIndexInformer =
87
- sharedInformerFactory .sharedIndexInformerFor (
88
- api ,
89
- kubernetesInformer .apiTypeClass (),
90
- kubernetesInformer .resyncPeriodMillis (),
91
- kubernetesInformer .namespace ());
92
- ResolvableType informerType =
93
- ResolvableType .forClassWithGenerics (
94
- SharedInformer .class , kubernetesInformer .apiTypeClass ());
95
- RootBeanDefinition informerBean = new RootBeanDefinition ();
96
- informerBean .setTargetType (informerType );
97
- informerBean .setAutowireMode (AbstractBeanDefinition .AUTOWIRE_BY_TYPE );
98
- informerBean .setAutowireCandidate (true );
99
- String informerBeanName = informerType .toString ();
100
- this .beanDefinitionRegistry .registerBeanDefinition (informerBeanName , informerBean );
101
- beanFactory .registerSingleton (informerBeanName , sharedIndexInformer );
102
-
103
- Lister lister = new Lister (sharedIndexInformer .getIndexer ());
104
- ResolvableType listerType =
105
- ResolvableType .forClassWithGenerics (Lister .class , kubernetesInformer .apiTypeClass ());
106
- RootBeanDefinition listerBean = new RootBeanDefinition ();
107
- listerBean .setTargetType (listerType );
108
- listerBean .setAutowireMode (AbstractBeanDefinition .AUTOWIRE_BY_TYPE );
109
- listerBean .setAutowireCandidate (true );
110
- String listerBeanName = listerType .toString ();
111
- this .beanDefinitionRegistry .registerBeanDefinition (listerBeanName , listerBean );
112
- beanFactory .registerSingleton (listerBeanName , lister );
113
- }
53
+ this .beanFactory = beanFactory ;
114
54
}
115
55
116
56
@ Override
@@ -121,6 +61,80 @@ public int getOrder() {
121
61
@ Override
122
62
public void postProcessBeanDefinitionRegistry (BeanDefinitionRegistry registry )
123
63
throws BeansException {
124
- this .beanDefinitionRegistry = registry ;
64
+ if (!(registry instanceof BeanFactory )) {
65
+ return ;
66
+ }
67
+ for (String name : registry .getBeanDefinitionNames ()) {
68
+ Class <?> cls = ((BeanFactory ) registry ).getType (name );
69
+ if (cls != null ) {
70
+ KubernetesInformers kubernetesInformers =
71
+ AnnotatedElementUtils .getMergedAnnotation (cls , KubernetesInformers .class );
72
+ if (kubernetesInformers != null && kubernetesInformers .value ().length > 0 ) {
73
+ for (KubernetesInformer kubernetesInformer : kubernetesInformers .value ()) {
74
+ registerInformer (registry , kubernetesInformer );
75
+ registerLister (registry , kubernetesInformer );
76
+ }
77
+ }
78
+ }
79
+ }
80
+ }
81
+
82
+ private void registerInformer (
83
+ BeanDefinitionRegistry registry , KubernetesInformer kubernetesInformer ) {
84
+ RootBeanDefinition informerBean =
85
+ (RootBeanDefinition )
86
+ BeanDefinitionBuilder .rootBeanDefinition (SharedInformer .class ).getBeanDefinition ();
87
+ informerBean .setInstanceSupplier (
88
+ () -> informer (kubernetesInformer .apiTypeClass (), kubernetesInformer ));
89
+ ResolvableType informerType =
90
+ ResolvableType .forClassWithGenerics (
91
+ SharedIndexInformer .class , kubernetesInformer .apiTypeClass ());
92
+ informerBean .setTargetType (informerType );
93
+ registry .registerBeanDefinition (
94
+ getInformerBeanName (kubernetesInformer .apiTypeClass ()), informerBean );
95
+ }
96
+
97
+ private String getInformerBeanName (Class <?> type ) {
98
+ return type .getName () + "Informer" ;
99
+ }
100
+
101
+ private void registerLister (
102
+ BeanDefinitionRegistry registry , KubernetesInformer kubernetesInformer ) {
103
+ RootBeanDefinition listerBean =
104
+ (RootBeanDefinition )
105
+ BeanDefinitionBuilder .rootBeanDefinition (Lister .class ).getBeanDefinition ();
106
+ listerBean .setInstanceSupplier (() -> lister (kubernetesInformer .apiTypeClass ()));
107
+ ResolvableType listerType =
108
+ ResolvableType .forClassWithGenerics (Lister .class , kubernetesInformer .apiTypeClass ());
109
+ listerBean .setTargetType (listerType );
110
+ registry .registerBeanDefinition (listerType .toString (), listerBean );
111
+ }
112
+
113
+ @ SuppressWarnings ({"unchecked" , "rawtypes" })
114
+ private <T extends KubernetesObject > Lister <T > lister (Class <T > type ) {
115
+ SharedIndexInformer sharedInformer =
116
+ this .beanFactory .getBean (getInformerBeanName (type ), SharedIndexInformer .class );
117
+ Lister <T > lister = new Lister <>(sharedInformer .getIndexer ());
118
+ return lister ;
119
+ }
120
+
121
+ @ SuppressWarnings ({"unchecked" , "rawtypes" })
122
+ private <T extends KubernetesObject > SharedInformer <T > informer (
123
+ Class <T > type , KubernetesInformer kubernetesInformer ) {
124
+ ApiClient apiClient = this .beanFactory .getBean (ApiClient .class );
125
+ SharedInformerFactory sharedInformerFactory =
126
+ this .beanFactory .getBean (SharedInformerFactory .class );
127
+ final GenericKubernetesApi api =
128
+ new GenericKubernetesApi (
129
+ kubernetesInformer .apiTypeClass (),
130
+ kubernetesInformer .apiListTypeClass (),
131
+ kubernetesInformer .groupVersionResource ().apiGroup (),
132
+ kubernetesInformer .groupVersionResource ().apiVersion (),
133
+ kubernetesInformer .groupVersionResource ().resourcePlural (),
134
+ apiClient );
135
+ SharedIndexInformer <T > sharedIndexInformer =
136
+ sharedInformerFactory .sharedIndexInformerFor (
137
+ api , type , kubernetesInformer .resyncPeriodMillis (), kubernetesInformer .namespace ());
138
+ return sharedIndexInformer ;
125
139
}
126
140
}
0 commit comments