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