1
1
package io .javaoperatorsdk .quarkus .extension .deployment ;
2
2
3
3
import java .lang .reflect .Modifier ;
4
+ import java .util .List ;
4
5
import java .util .Optional ;
5
6
import java .util .function .Function ;
6
7
import java .util .function .Supplier ;
16
17
import io .javaoperatorsdk .quarkus .extension .ConfigurationServiceRecorder ;
17
18
import io .javaoperatorsdk .quarkus .extension .QuarkusConfigurationService ;
18
19
import io .javaoperatorsdk .quarkus .extension .QuarkusControllerConfiguration ;
20
+ import io .javaoperatorsdk .quarkus .extension .QuarkusOperator ;
21
+ import io .quarkus .arc .deployment .AdditionalBeanBuildItem ;
19
22
import io .quarkus .arc .deployment .SyntheticBeanBuildItem ;
20
23
import io .quarkus .deployment .GeneratedClassGizmoAdaptor ;
21
24
import io .quarkus .deployment .annotations .BuildProducer ;
29
32
import io .quarkus .gizmo .ClassOutput ;
30
33
import io .quarkus .gizmo .MethodCreator ;
31
34
import io .quarkus .gizmo .MethodDescriptor ;
35
+ import io .quarkus .kubernetes .client .spi .KubernetesClientBuildItem ;
32
36
import org .jboss .jandex .AnnotationInstance ;
33
37
import org .jboss .jandex .AnnotationValue ;
34
38
import org .jboss .jandex .ClassInfo ;
@@ -51,24 +55,42 @@ FeatureBuildItem feature() {
51
55
52
56
53
57
@ BuildStep
54
- @ Record (ExecutionTime .RUNTIME_INIT )
55
- void createDoneableClasses (CombinedIndexBuildItem combinedIndexBuildItem ,
56
- BuildProducer <SyntheticBeanBuildItem > syntheticBeanBuildItemBuildProducer ,
57
- BuildProducer <GeneratedClassBuildItem > generatedClass ,
58
- ConfigurationServiceRecorder recorder ) {
58
+ List <ControllerConfigurationBuildItem > createControllerBeans (CombinedIndexBuildItem combinedIndexBuildItem ,
59
+ BuildProducer <GeneratedClassBuildItem > generatedClass ,
60
+ BuildProducer <AdditionalBeanBuildItem > additionalBeans ) {
59
61
final var index = combinedIndexBuildItem .getIndex ();
60
62
final var resourceControllers = index .getAllKnownImplementors (RESOURCE_CONTROLLER );
61
- final var controllerConfigs = resourceControllers .stream ()
62
- .map (ci -> createControllerConfiguration (ci , new GeneratedClassGizmoAdaptor (generatedClass , true )))
63
+
64
+ final var classOutput = new GeneratedClassGizmoAdaptor (generatedClass , true );
65
+ return resourceControllers .stream ()
66
+ .map (ci -> createControllerConfiguration (ci , classOutput , additionalBeans ))
67
+ .collect (Collectors .toList ());
68
+ }
69
+
70
+
71
+ @ BuildStep
72
+ @ Record (ExecutionTime .RUNTIME_INIT )
73
+ void createConfigurationService (BuildProducer <SyntheticBeanBuildItem > syntheticBeanBuildItemBuildProducer ,
74
+ List <ControllerConfigurationBuildItem > configurations ,
75
+ KubernetesClientBuildItem clientBuildItem ,
76
+ ConfigurationServiceRecorder recorder ) {
77
+ final List <ControllerConfiguration > controllerConfigs = configurations .stream ()
78
+ .map (ControllerConfigurationBuildItem ::getConfiguration )
63
79
.collect (Collectors .toList ());
80
+ final var supplier = recorder .configurationServiceSupplier (controllerConfigs , clientBuildItem .getClient ());
64
81
syntheticBeanBuildItemBuildProducer .produce (SyntheticBeanBuildItem .configure (QuarkusConfigurationService .class )
65
82
.scope (Singleton .class )
66
83
.setRuntimeInit ()
67
- .supplier (recorder . configurationServiceSupplier ( controllerConfigs ) )
84
+ .supplier (supplier )
68
85
.done ());
69
86
}
70
87
71
- private ControllerConfiguration createControllerConfiguration (ClassInfo info , ClassOutput classOutput ) {
88
+ @ BuildStep
89
+ void createOperator (BuildProducer <AdditionalBeanBuildItem > additionalBeans ) {
90
+ additionalBeans .produce (AdditionalBeanBuildItem .unremovableOf (QuarkusOperator .class ));
91
+ }
92
+
93
+ private ControllerConfigurationBuildItem createControllerConfiguration (ClassInfo info , ClassOutput classOutput , BuildProducer <AdditionalBeanBuildItem > additionalBeans ) {
72
94
// first retrieve the custom resource class
73
95
final var rcInterface = info .interfaceTypes ().stream ()
74
96
.filter (t -> t .name ().equals (RESOURCE_CONTROLLER ))
@@ -83,6 +105,9 @@ private ControllerConfiguration createControllerConfiguration(ClassInfo info, Cl
83
105
throw new IllegalArgumentException ("Couldn't find class " + crType );
84
106
}
85
107
108
+ // create ResourceController bean
109
+ additionalBeans .produce (AdditionalBeanBuildItem .unremovableOf (crType ));
110
+
86
111
// generate associated Doneable class
87
112
final var doneableClassName = crType + "Doneable" ;
88
113
try (ClassCreator cc = ClassCreator .builder ()
@@ -96,12 +121,10 @@ private ControllerConfiguration createControllerConfiguration(ClassInfo info, Cl
96
121
ctor .invokeSpecialMethod (MethodDescriptor .ofConstructor (CustomResourceDoneable .class , crClass , Function .class ), ctor .getThis (), ctor .getMethodParam (0 ), ctor .invokeStaticMethod (MethodDescriptor .ofMethod (Function .class , "identity" , Function .class )));
97
122
}
98
123
99
- // get Controller annotation
124
+ // generate configuration
100
125
final var controllerAnnotation = info .classAnnotation (CONTROLLER );
101
-
102
-
103
126
final var crdName = valueOrDefault (controllerAnnotation , "crdName" , AnnotationValue ::asString , EXCEPTION_SUPPLIER );
104
- return new QuarkusControllerConfiguration (
127
+ final var configuration = new QuarkusControllerConfiguration (
105
128
valueOrDefault (controllerAnnotation , "name" , AnnotationValue ::asString , () -> ControllerUtils .getDefaultResourceControllerName (info .simpleName ())),
106
129
crdName ,
107
130
valueOrDefault (controllerAnnotation , "finalizerName" , AnnotationValue ::asString , () -> ControllerUtils .getDefaultFinalizerName (crdName )),
@@ -112,8 +135,11 @@ private ControllerConfiguration createControllerConfiguration(ClassInfo info, Cl
112
135
doneableClassName ,
113
136
null // todo: fix-me
114
137
);
138
+
139
+ return new ControllerConfigurationBuildItem (configuration );
115
140
}
116
141
142
+
117
143
private <T > T valueOrDefault (AnnotationInstance annotation , String name , Function <AnnotationValue , T > converter , Supplier <T > defaultValue ) {
118
144
return Optional .ofNullable (annotation .value (name )).map (converter ).orElseGet (defaultValue );
119
145
}
0 commit comments