2
2
3
3
import java .lang .annotation .Annotation ;
4
4
import java .time .Duration ;
5
- import java .util .Arrays ;
6
5
import java .util .Collections ;
7
6
import java .util .LinkedHashMap ;
8
7
import java .util .List ;
15
14
import io .javaoperatorsdk .operator .OperatorException ;
16
15
import io .javaoperatorsdk .operator .ReconcilerUtils ;
17
16
import io .javaoperatorsdk .operator .api .config .dependent .DependentResourceSpec ;
18
- import io .javaoperatorsdk .operator .api .reconciler .* ;
17
+ import io .javaoperatorsdk .operator .api .reconciler .Constants ;
19
18
import io .javaoperatorsdk .operator .api .reconciler .ControllerConfiguration ;
19
+ import io .javaoperatorsdk .operator .api .reconciler .Reconciler ;
20
20
import io .javaoperatorsdk .operator .api .reconciler .dependent .Dependent ;
21
21
import io .javaoperatorsdk .operator .api .reconciler .dependent .DependentResource ;
22
- import io .javaoperatorsdk .operator .processing .dependent .kubernetes .KubernetesDependent ;
23
- import io .javaoperatorsdk .operator .processing .dependent .kubernetes .KubernetesDependentResource ;
24
- import io .javaoperatorsdk .operator .processing .dependent .kubernetes .KubernetesDependentResourceConfig ;
22
+ import io .javaoperatorsdk .operator .api .reconciler .dependent .managed .AnnotationDependentResourceConfigurator ;
25
23
import io .javaoperatorsdk .operator .processing .dependent .workflow .Condition ;
26
24
import io .javaoperatorsdk .operator .processing .event .rate .RateLimiter ;
27
25
import io .javaoperatorsdk .operator .processing .event .source .controller .ResourceEventFilter ;
28
26
import io .javaoperatorsdk .operator .processing .event .source .controller .ResourceEventFilters ;
29
27
import io .javaoperatorsdk .operator .processing .event .source .filter .GenericFilter ;
30
28
import io .javaoperatorsdk .operator .processing .event .source .filter .OnAddFilter ;
31
- import io .javaoperatorsdk .operator .processing .event .source .filter .OnDeleteFilter ;
32
29
import io .javaoperatorsdk .operator .processing .event .source .filter .OnUpdateFilter ;
33
30
import io .javaoperatorsdk .operator .processing .retry .Retry ;
34
31
@@ -158,7 +155,7 @@ public Retry getRetry() {
158
155
159
156
160
157
@ SuppressWarnings ("unchecked" )
161
- private < T > void configureFromAnnotatedReconciler (T instance ) {
158
+ private void configureFromAnnotatedReconciler (Object instance ) {
162
159
if (instance instanceof AnnotationConfigurable ) {
163
160
AnnotationConfigurable configurable = (AnnotationConfigurable ) instance ;
164
161
final Class <? extends Annotation > configurationClass =
@@ -171,6 +168,22 @@ private <T> void configureFromAnnotatedReconciler(T instance) {
171
168
}
172
169
}
173
170
171
+ @ SuppressWarnings ("unchecked" )
172
+ private void configureFromCustomAnnotation (Object instance ) {
173
+ if (instance instanceof AnnotationDependentResourceConfigurator ) {
174
+ AnnotationDependentResourceConfigurator configurator =
175
+ (AnnotationDependentResourceConfigurator ) instance ;
176
+ final Class <? extends Annotation > configurationClass =
177
+ (Class <? extends Annotation >) Utils .getFirstTypeArgumentFromInterface (
178
+ instance .getClass (), AnnotationDependentResourceConfigurator .class );
179
+ final var configAnnotation = instance .getClass ().getAnnotation (configurationClass );
180
+ // always called even if the annotation is null so that implementations can provide default
181
+ // values
182
+ final var config = configurator .configFrom (configAnnotation , this );
183
+ configurator .configureWith (config );
184
+ }
185
+ }
186
+
174
187
@ Override
175
188
@ SuppressWarnings ("unchecked" )
176
189
public Optional <OnAddFilter <P >> onAddFilter () {
@@ -208,22 +221,24 @@ public List<DependentResourceSpec> getDependentResources() {
208
221
209
222
final var specsMap = new LinkedHashMap <String , DependentResourceSpec >(dependents .length );
210
223
for (Dependent dependent : dependents ) {
211
- Object config = null ;
212
224
final Class <? extends DependentResource > dependentType = dependent .type ();
213
- if (KubernetesDependentResource .class .isAssignableFrom (dependentType )) {
214
- config = createKubernetesResourceConfig (dependentType );
215
- }
216
225
217
226
final var name = getName (dependent , dependentType );
218
227
var spec = specsMap .get (name );
219
228
if (spec != null ) {
220
229
throw new IllegalArgumentException (
221
230
"A DependentResource named '" + name + "' already exists: " + spec );
222
231
}
232
+
233
+ final var dependentResource = Utils .instantiateAndConfigureIfNeeded (dependentType ,
234
+ DependentResource .class ,
235
+ Utils .contextFor (this , dependentType , Dependent .class ),
236
+ this ::configureFromCustomAnnotation );
237
+
223
238
var eventSourceName = dependent .useEventSourceWithName ();
224
239
eventSourceName = Constants .NO_VALUE_SET .equals (eventSourceName ) ? null : eventSourceName ;
225
240
final var context = Utils .contextFor (this , dependentType , null );
226
- spec = new DependentResourceSpec (dependentType , config , name ,
241
+ spec = new DependentResourceSpec (dependentResource , name ,
227
242
Set .of (dependent .dependsOn ()),
228
243
Utils .instantiate (dependent .readyPostcondition (), Condition .class , context ),
229
244
Utils .instantiate (dependent .reconcilePrecondition (), Condition .class , context ),
@@ -245,52 +260,6 @@ private String getName(Dependent dependent, Class<? extends DependentResource> d
245
260
return name ;
246
261
}
247
262
248
- @ SuppressWarnings ({"rawtypes" , "unchecked" })
249
- private Object createKubernetesResourceConfig (Class <? extends DependentResource > dependentType ) {
250
-
251
- Object config ;
252
- final var kubeDependent = dependentType .getAnnotation (KubernetesDependent .class );
253
-
254
- var namespaces = getNamespaces ();
255
- var configuredNS = false ;
256
- String labelSelector = null ;
257
- OnAddFilter <? extends HasMetadata > onAddFilter = null ;
258
- OnUpdateFilter <? extends HasMetadata > onUpdateFilter = null ;
259
- OnDeleteFilter <? extends HasMetadata > onDeleteFilter = null ;
260
- GenericFilter <? extends HasMetadata > genericFilter = null ;
261
- ResourceDiscriminator <?, ? extends HasMetadata > resourceDiscriminator = null ;
262
- if (kubeDependent != null ) {
263
- if (!Arrays .equals (KubernetesDependent .DEFAULT_NAMESPACES ,
264
- kubeDependent .namespaces ())) {
265
- namespaces = Set .of (kubeDependent .namespaces ());
266
- configuredNS = true ;
267
- }
268
- final var fromAnnotation = kubeDependent .labelSelector ();
269
- labelSelector = Constants .NO_VALUE_SET .equals (fromAnnotation ) ? null : fromAnnotation ;
270
-
271
- final var context =
272
- Utils .contextFor (this , dependentType , null );
273
- onAddFilter = Utils .instantiate (kubeDependent .onAddFilter (), OnAddFilter .class , context );
274
- onUpdateFilter =
275
- Utils .instantiate (kubeDependent .onUpdateFilter (), OnUpdateFilter .class , context );
276
- onDeleteFilter =
277
- Utils .instantiate (kubeDependent .onDeleteFilter (), OnDeleteFilter .class , context );
278
- genericFilter =
279
- Utils .instantiate (kubeDependent .genericFilter (), GenericFilter .class , context );
280
-
281
- resourceDiscriminator =
282
- Utils .instantiate (kubeDependent .resourceDiscriminator (),
283
- ResourceDiscriminator .class , context );
284
- }
285
-
286
- config =
287
- new KubernetesDependentResourceConfig (namespaces , labelSelector , configuredNS ,
288
- resourceDiscriminator , onAddFilter ,
289
- onUpdateFilter , onDeleteFilter , genericFilter );
290
-
291
- return config ;
292
- }
293
-
294
263
public static <T > T valueOrDefault (
295
264
ControllerConfiguration controllerConfiguration ,
296
265
Function <ControllerConfiguration , T > mapper ,
0 commit comments