1212*/
1313package io .kubernetes .client .spring .extended .controller ;
1414
15+ import io .kubernetes .client .common .KubernetesObject ;
1516import io .kubernetes .client .informer .SharedIndexInformer ;
1617import io .kubernetes .client .informer .SharedInformer ;
1718import io .kubernetes .client .informer .SharedInformerFactory ;
2021import io .kubernetes .client .spring .extended .controller .annotation .KubernetesInformer ;
2122import io .kubernetes .client .spring .extended .controller .annotation .KubernetesInformers ;
2223import io .kubernetes .client .util .generic .GenericKubernetesApi ;
23- import java .time .Duration ;
24- import org .slf4j .Logger ;
25- import org .slf4j .LoggerFactory ;
2624import org .springframework .beans .BeansException ;
27- import org .springframework .beans .factory .annotation . Autowired ;
25+ import org .springframework .beans .factory .BeanFactory ;
2826import org .springframework .beans .factory .config .ConfigurableListableBeanFactory ;
29- import org .springframework .beans .factory .support .AbstractBeanDefinition ;
27+ import org .springframework .beans .factory .support .BeanDefinitionBuilder ;
3028import org .springframework .beans .factory .support .BeanDefinitionRegistry ;
3129import org .springframework .beans .factory .support .BeanDefinitionRegistryPostProcessor ;
3230import org .springframework .beans .factory .support .RootBeanDefinition ;
3331import org .springframework .core .Ordered ;
3432import org .springframework .core .ResolvableType ;
33+ import org .springframework .core .annotation .AnnotatedElementUtils ;
3534
3635/**
3736 * The type Kubernetes informer factory processor which basically does the following things:
4443public class KubernetesInformerFactoryProcessor
4544 implements BeanDefinitionRegistryPostProcessor , Ordered {
4645
47- private static final Logger log =
48- LoggerFactory .getLogger (KubernetesInformerFactoryProcessor .class );
49-
5046 public static final int ORDER = 0 ;
5147
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 ;
6349
6450 @ Override
6551 public void postProcessBeanFactory (ConfigurableListableBeanFactory beanFactory )
6652 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 ;
11454 }
11555
11656 @ Override
@@ -121,6 +61,80 @@ public int getOrder() {
12161 @ Override
12262 public void postProcessBeanDefinitionRegistry (BeanDefinitionRegistry registry )
12363 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 ;
125139 }
126140}
0 commit comments