Skip to content

Commit a73174b

Browse files
committed
refactor: simplify handling of filters
1 parent a9088c8 commit a73174b

File tree

7 files changed

+45
-100
lines changed

7 files changed

+45
-100
lines changed

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/AnnotationControllerConfiguration.java

Lines changed: 34 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,6 @@
3333
import io.javaoperatorsdk.operator.processing.event.source.filter.OnAddFilter;
3434
import io.javaoperatorsdk.operator.processing.event.source.filter.OnDeleteFilter;
3535
import io.javaoperatorsdk.operator.processing.event.source.filter.OnUpdateFilter;
36-
import io.javaoperatorsdk.operator.processing.event.source.filter.VoidGenericFilter;
37-
import io.javaoperatorsdk.operator.processing.event.source.filter.VoidOnAddFilter;
38-
import io.javaoperatorsdk.operator.processing.event.source.filter.VoidOnDeleteFilter;
39-
import io.javaoperatorsdk.operator.processing.event.source.filter.VoidOnUpdateFilter;
4036
import io.javaoperatorsdk.operator.processing.retry.Retry;
4137

4238
import static io.javaoperatorsdk.operator.api.reconciler.Constants.DEFAULT_NAMESPACES_SET;
@@ -45,6 +41,10 @@
4541
public class AnnotationControllerConfiguration<P extends HasMetadata>
4642
implements io.javaoperatorsdk.operator.api.config.ControllerConfiguration<P> {
4743

44+
private static final String CONTROLLER_CONFIG_ANNOTATION =
45+
ControllerConfiguration.class.getSimpleName();
46+
private static final String KUBE_DEPENDENT_NAME = KubernetesDependent.class.getSimpleName();
47+
4848
protected final Reconciler<P> reconciler;
4949
private final ControllerConfiguration annotation;
5050
private List<DependentResourceSpec> specs;
@@ -152,18 +152,19 @@ public Optional<Duration> maxReconciliationInterval() {
152152
@Override
153153
public RateLimiter getRateLimiter() {
154154
final Class<? extends RateLimiter> rateLimiterClass = annotation.rateLimiter();
155-
return instantiateAndConfigureIfNeeded(rateLimiterClass, RateLimiter.class);
155+
return instantiateAndConfigureIfNeeded(rateLimiterClass, RateLimiter.class,
156+
CONTROLLER_CONFIG_ANNOTATION);
156157
}
157158

158159
@Override
159160
public Retry getRetry() {
160161
final Class<? extends Retry> retryClass = annotation.retry();
161-
return instantiateAndConfigureIfNeeded(retryClass, Retry.class);
162+
return instantiateAndConfigureIfNeeded(retryClass, Retry.class, CONTROLLER_CONFIG_ANNOTATION);
162163
}
163164

164165
@SuppressWarnings("unchecked")
165-
private <T> T instantiateAndConfigureIfNeeded(Class<? extends T> targetClass,
166-
Class<T> expectedType) {
166+
protected <T> T instantiateAndConfigureIfNeeded(Class<? extends T> targetClass,
167+
Class<T> expectedType, String context) {
167168
try {
168169
final Constructor<? extends T> constructor = targetClass.getDeclaredConstructor();
169170
constructor.setAccessible(true);
@@ -183,57 +184,39 @@ private <T> T instantiateAndConfigureIfNeeded(Class<? extends T> targetClass,
183184
| NoSuchMethodException e) {
184185
throw new OperatorException("Couldn't instantiate " + expectedType.getSimpleName() + " '"
185186
+ targetClass.getName() + "' for '" + getName()
186-
+ "' reconciler. You need to provide an accessible no-arg constructor.", e);
187+
+ "' reconciler in " + context
188+
+ ". You need to provide an accessible no-arg constructor.", e);
187189
}
188190
}
189191

190192
@Override
191193
@SuppressWarnings("unchecked")
192194
public Optional<OnAddFilter<P>> onAddFilter() {
193-
return (Optional<OnAddFilter<P>>) createFilter(annotation.onAddFilter(), FilterType.onAdd,
194-
annotation.getClass().getSimpleName());
195-
}
196-
197-
private enum FilterType {
198-
onAdd(VoidOnAddFilter.class), onUpdate(VoidOnUpdateFilter.class), onDelete(
199-
VoidOnDeleteFilter.class), generic(VoidGenericFilter.class);
200-
201-
final Class<?> defaultValue;
202-
203-
FilterType(Class<?> defaultValue) {
204-
this.defaultValue = defaultValue;
205-
}
195+
return (Optional<OnAddFilter<P>>) createFilter(annotation.onAddFilter(), OnAddFilter.class,
196+
CONTROLLER_CONFIG_ANNOTATION);
206197
}
207198

208-
private <T> Optional<T> createFilter(Class<T> filter, FilterType filterType, String origin) {
209-
if (filterType.defaultValue.equals(filter)) {
199+
protected <T> Optional<? extends T> createFilter(Class<? extends T> filter, Class<T> defaultValue,
200+
String origin) {
201+
if (defaultValue.equals(filter)) {
210202
return Optional.empty();
211203
} else {
212-
try {
213-
var instance = (T) filter.getDeclaredConstructor().newInstance();
214-
return Optional.of(instance);
215-
} catch (InstantiationException | IllegalAccessException | InvocationTargetException
216-
| NoSuchMethodException e) {
217-
throw new OperatorException(
218-
"Couldn't create " + filterType + " filter from " + filter.getName() + " class in "
219-
+ origin + " for reconciler " + getName(),
220-
e);
221-
}
204+
return Optional.of(instantiateAndConfigureIfNeeded(filter, defaultValue, origin));
222205
}
223206
}
224207

225208
@SuppressWarnings("unchecked")
226209
@Override
227210
public Optional<OnUpdateFilter<P>> onUpdateFilter() {
228211
return (Optional<OnUpdateFilter<P>>) createFilter(annotation.onUpdateFilter(),
229-
FilterType.onUpdate, annotation.getClass().getSimpleName());
212+
OnUpdateFilter.class, CONTROLLER_CONFIG_ANNOTATION);
230213
}
231214

232215
@SuppressWarnings("unchecked")
233216
@Override
234217
public Optional<GenericFilter<P>> genericFilter() {
235218
return (Optional<GenericFilter<P>>) createFilter(annotation.genericFilter(),
236-
FilterType.generic, annotation.getClass().getSimpleName());
219+
GenericFilter.class, CONTROLLER_CONFIG_ANNOTATION);
237220
}
238221

239222
@SuppressWarnings({"rawtypes", "unchecked"})
@@ -259,13 +242,14 @@ public List<DependentResourceSpec> getDependentResources() {
259242
var spec = specsMap.get(name);
260243
if (spec != null) {
261244
throw new IllegalArgumentException(
262-
"A DependentResource named: " + name + " already exists: " + spec);
245+
"A DependentResource named '" + name + "' already exists: " + spec);
263246
}
247+
final var context = "DependentResource of type '" + dependentType.getName() + "'";
264248
spec = new DependentResourceSpec(dependentType, config, name,
265249
Set.of(dependent.dependsOn()),
266-
instantiateConditionIfNotVoid(dependent.readyPostcondition()),
267-
instantiateConditionIfNotVoid(dependent.reconcilePrecondition()),
268-
instantiateConditionIfNotVoid(dependent.deletePostcondition()));
250+
instantiateConditionIfNotDefault(dependent.readyPostcondition(), context),
251+
instantiateConditionIfNotDefault(dependent.reconcilePrecondition(), context),
252+
instantiateConditionIfNotDefault(dependent.deletePostcondition(), context));
269253
specsMap.put(name, spec);
270254
}
271255

@@ -274,9 +258,10 @@ public List<DependentResourceSpec> getDependentResources() {
274258
return specs;
275259
}
276260

277-
private Condition<?, ?> instantiateConditionIfNotVoid(Class<? extends Condition> condition) {
261+
protected Condition<?, ?> instantiateConditionIfNotDefault(Class<? extends Condition> condition,
262+
String context) {
278263
if (condition != Condition.class) {
279-
return instantiateAndConfigureIfNeeded(condition, Condition.class);
264+
return instantiateAndConfigureIfNeeded(condition, Condition.class, context);
280265
}
281266
return null;
282267
}
@@ -312,17 +297,19 @@ private Object createKubernetesResourceConfig(Class<? extends DependentResource>
312297
final var fromAnnotation = kubeDependent.labelSelector();
313298
labelSelector = Constants.NO_VALUE_SET.equals(fromAnnotation) ? null : fromAnnotation;
314299

315-
final var kubeDependentName = KubernetesDependent.class.getSimpleName();
316-
onAddFilter = createFilter(kubeDependent.onAddFilter(), FilterType.onAdd, kubeDependentName)
300+
301+
final var context =
302+
KUBE_DEPENDENT_NAME + " annotation on " + dependentType.getName() + " DependentResource";
303+
onAddFilter = createFilter(kubeDependent.onAddFilter(), OnAddFilter.class, context)
317304
.orElse(null);
318305
onUpdateFilter =
319-
createFilter(kubeDependent.onUpdateFilter(), FilterType.onUpdate, kubeDependentName)
306+
createFilter(kubeDependent.onUpdateFilter(), OnUpdateFilter.class, context)
320307
.orElse(null);
321308
onDeleteFilter =
322-
createFilter(kubeDependent.onDeleteFilter(), FilterType.onDelete, kubeDependentName)
309+
createFilter(kubeDependent.onDeleteFilter(), OnDeleteFilter.class, context)
323310
.orElse(null);
324311
genericFilter =
325-
createFilter(kubeDependent.genericFilter(), FilterType.generic, kubeDependentName)
312+
createFilter(kubeDependent.genericFilter(), GenericFilter.class, context)
326313
.orElse(null);
327314
}
328315

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/ControllerConfiguration.java

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,17 +6,13 @@
66
import java.lang.annotation.RetentionPolicy;
77
import java.lang.annotation.Target;
88

9-
import io.fabric8.kubernetes.api.model.HasMetadata;
109
import io.javaoperatorsdk.operator.api.reconciler.dependent.Dependent;
1110
import io.javaoperatorsdk.operator.processing.event.rate.LinearRateLimiter;
1211
import io.javaoperatorsdk.operator.processing.event.rate.RateLimiter;
1312
import io.javaoperatorsdk.operator.processing.event.source.controller.ResourceEventFilter;
1413
import io.javaoperatorsdk.operator.processing.event.source.filter.GenericFilter;
1514
import io.javaoperatorsdk.operator.processing.event.source.filter.OnAddFilter;
1615
import io.javaoperatorsdk.operator.processing.event.source.filter.OnUpdateFilter;
17-
import io.javaoperatorsdk.operator.processing.event.source.filter.VoidGenericFilter;
18-
import io.javaoperatorsdk.operator.processing.event.source.filter.VoidOnAddFilter;
19-
import io.javaoperatorsdk.operator.processing.event.source.filter.VoidOnUpdateFilter;
2016
import io.javaoperatorsdk.operator.processing.retry.GenericRetry;
2117
import io.javaoperatorsdk.operator.processing.retry.Retry;
2218

@@ -79,15 +75,15 @@
7975
/**
8076
* Filter of onAdd events of resources.
8177
**/
82-
Class<? extends OnAddFilter<? extends HasMetadata>> onAddFilter() default VoidOnAddFilter.class;
78+
Class<? extends OnAddFilter> onAddFilter() default OnAddFilter.class;
8379

8480
/** Filter of onUpdate events of resources. */
85-
Class<? extends OnUpdateFilter<? extends HasMetadata>> onUpdateFilter() default VoidOnUpdateFilter.class;
81+
Class<? extends OnUpdateFilter> onUpdateFilter() default OnUpdateFilter.class;
8682

8783
/**
8884
* Filter applied to all operations (add, update, delete). Used to ignore some resources.
8985
**/
90-
Class<? extends GenericFilter<? extends HasMetadata>> genericFilter() default VoidGenericFilter.class;
86+
Class<? extends GenericFilter> genericFilter() default GenericFilter.class;
9187

9288
/**
9389
* Optional configuration of the maximal interval the SDK will wait for a reconciliation request

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/KubernetesDependent.java

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,11 @@
55
import java.lang.annotation.RetentionPolicy;
66
import java.lang.annotation.Target;
77

8-
import io.fabric8.kubernetes.api.model.HasMetadata;
98
import io.javaoperatorsdk.operator.api.reconciler.Constants;
10-
import io.javaoperatorsdk.operator.processing.event.source.filter.*;
9+
import io.javaoperatorsdk.operator.processing.event.source.filter.GenericFilter;
10+
import io.javaoperatorsdk.operator.processing.event.source.filter.OnAddFilter;
11+
import io.javaoperatorsdk.operator.processing.event.source.filter.OnDeleteFilter;
12+
import io.javaoperatorsdk.operator.processing.event.source.filter.OnUpdateFilter;
1113

1214
import static io.javaoperatorsdk.operator.api.reconciler.Constants.NO_VALUE_SET;
1315

@@ -35,11 +37,11 @@
3537
*/
3638
String labelSelector() default NO_VALUE_SET;
3739

38-
Class<? extends OnAddFilter<? extends HasMetadata>> onAddFilter() default VoidOnAddFilter.class;
40+
Class<? extends OnAddFilter> onAddFilter() default OnAddFilter.class;
3941

40-
Class<? extends OnUpdateFilter<? extends HasMetadata>> onUpdateFilter() default VoidOnUpdateFilter.class;
42+
Class<? extends OnUpdateFilter> onUpdateFilter() default OnUpdateFilter.class;
4143

42-
Class<? extends OnDeleteFilter<? extends HasMetadata>> onDeleteFilter() default VoidOnDeleteFilter.class;
44+
Class<? extends OnDeleteFilter> onDeleteFilter() default OnDeleteFilter.class;
4345

44-
Class<? extends GenericFilter<? extends HasMetadata>> genericFilter() default VoidGenericFilter.class;
46+
Class<? extends GenericFilter> genericFilter() default GenericFilter.class;
4547
}

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/source/filter/VoidGenericFilter.java

Lines changed: 0 additions & 10 deletions
This file was deleted.

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/source/filter/VoidOnAddFilter.java

Lines changed: 0 additions & 10 deletions
This file was deleted.

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/source/filter/VoidOnDeleteFilter.java

Lines changed: 0 additions & 10 deletions
This file was deleted.

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/source/filter/VoidOnUpdateFilter.java

Lines changed: 0 additions & 10 deletions
This file was deleted.

0 commit comments

Comments
 (0)