Skip to content

Commit 534daaf

Browse files
authored
feat: move controller informer-related configuration to InformerConfig (#2455)
* feat: move controller informer-related configuration to InformerConfig Signed-off-by: Chris Laprun <[email protected]> * refactor: start isolating ResourceConfiguration Signed-off-by: Chris Laprun <[email protected]> * fix: initFromAnnotation now properly inits the current instance Signed-off-by: Chris Laprun <[email protected]> * fix: default onDeleteFilter implementation Signed-off-by: Chris Laprun <[email protected]> * fix: properly set default namespaces in controller case Signed-off-by: Chris Laprun <[email protected]> * refactor: remove KubernetesDependentInformerConfigBuilder Signed-off-by: Chris Laprun <[email protected]> * refactor: use InformerConfigHolder in more places, unifying handling Signed-off-by: Chris Laprun <[email protected]> * fix: properly propagate name to informer config Signed-off-by: Chris Laprun <[email protected]> * feat: add factory method to init builder from an extising configuation Signed-off-by: Chris Laprun <[email protected]> * fix: remove potentially problematic default implementation Signed-off-by: Chris Laprun <[email protected]> --------- Signed-off-by: Chris Laprun <[email protected]>
1 parent 27a9f50 commit 534daaf

File tree

42 files changed

+710
-867
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

42 files changed

+710
-867
lines changed

caffeine-bounded-cache-support/src/test/java/io/javaoperatorsdk/operator/processing/event/source/cache/sample/AbstractTestReconciler.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ public List<EventSource<?, P>> prepareEventSources(
7878
ConfigMap.class, Duration.ofMinutes(1), 1); // setting max size for testing purposes
7979

8080
var es = new InformerEventSource<>(InformerConfiguration.from(ConfigMap.class, primaryClass())
81-
.withItemStore(boundedItemStore)
81+
.withInformerConfiguration(c -> c.withItemStore(boundedItemStore))
8282
.withSecondaryToPrimaryMapper(
8383
Mappers.fromOwnerReferences(context.getPrimaryResourceClass(),
8484
this instanceof BoundedCacheClusterScopeTestReconciler))

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

+5-33
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313

1414
import io.fabric8.kubernetes.api.model.HasMetadata;
1515
import io.fabric8.kubernetes.client.KubernetesClient;
16-
import io.fabric8.kubernetes.client.informers.cache.ItemStore;
1716
import io.javaoperatorsdk.operator.ReconcilerUtils;
1817
import io.javaoperatorsdk.operator.api.config.Utils.Configurator;
1918
import io.javaoperatorsdk.operator.api.config.dependent.DependentResourceConfigurationResolver;
@@ -24,11 +23,9 @@
2423
import io.javaoperatorsdk.operator.api.reconciler.Workflow;
2524
import io.javaoperatorsdk.operator.api.reconciler.dependent.Dependent;
2625
import io.javaoperatorsdk.operator.api.reconciler.dependent.DependentResource;
26+
import io.javaoperatorsdk.operator.processing.dependent.kubernetes.InformerConfigHolder;
2727
import io.javaoperatorsdk.operator.processing.dependent.workflow.Condition;
2828
import io.javaoperatorsdk.operator.processing.event.rate.RateLimiter;
29-
import io.javaoperatorsdk.operator.processing.event.source.filter.GenericFilter;
30-
import io.javaoperatorsdk.operator.processing.event.source.filter.OnAddFilter;
31-
import io.javaoperatorsdk.operator.processing.event.source.filter.OnUpdateFilter;
3229
import io.javaoperatorsdk.operator.processing.retry.Retry;
3330

3431
import static io.javaoperatorsdk.operator.api.config.ControllerConfiguration.CONTROLLER_NAME_AS_FIELD_MANAGER;
@@ -278,43 +275,20 @@ private <P extends HasMetadata> ResolvedControllerConfiguration<P> controllerCon
278275
fieldManager.equals(CONTROLLER_NAME_AS_FIELD_MANAGER) ? name
279276
: fieldManager;
280277

281-
var informerListLimitValue = valueOrDefaultFromAnnotation(annotation,
282-
io.javaoperatorsdk.operator.api.reconciler.ControllerConfiguration::informerListLimit,
283-
"informerListLimit");
284-
final var informerListLimit =
285-
informerListLimitValue == Constants.NO_LONG_VALUE_SET ? null
286-
: informerListLimitValue;
278+
InformerConfigHolder<P> informerConfig = InformerConfigHolder.builder(resourceClass)
279+
.initFromAnnotation(annotation != null ? annotation.informerConfig() : null, context)
280+
.buildForController();
287281

288282
return new ResolvedControllerConfiguration<P>(
289283
resourceClass, name, generationAware,
290284
associatedReconcilerClass, retry, rateLimiter,
291285
ResolvedControllerConfiguration.getMaxReconciliationInterval(interval, timeUnit),
292-
Utils.instantiate(valueOrDefaultFromAnnotation(annotation,
293-
io.javaoperatorsdk.operator.api.reconciler.ControllerConfiguration::onAddFilter,
294-
"onAddFilter"), OnAddFilter.class, context),
295-
Utils.instantiate(valueOrDefaultFromAnnotation(annotation,
296-
io.javaoperatorsdk.operator.api.reconciler.ControllerConfiguration::onUpdateFilter,
297-
"onUpdateFilter"), OnUpdateFilter.class, context),
298-
Utils.instantiate(valueOrDefaultFromAnnotation(annotation,
299-
io.javaoperatorsdk.operator.api.reconciler.ControllerConfiguration::genericFilter,
300-
"genericFilter"), GenericFilter.class, context),
301-
Set.of(valueOrDefaultFromAnnotation(annotation,
302-
io.javaoperatorsdk.operator.api.reconciler.ControllerConfiguration::namespaces,
303-
"namespaces")),
304286
valueOrDefaultFromAnnotation(annotation,
305287
io.javaoperatorsdk.operator.api.reconciler.ControllerConfiguration::finalizerName,
306288
"finalizerName"),
307-
valueOrDefaultFromAnnotation(annotation,
308-
io.javaoperatorsdk.operator.api.reconciler.ControllerConfiguration::labelSelector,
309-
"labelSelector"),
310289
null,
311-
Utils.instantiate(
312-
valueOrDefaultFromAnnotation(annotation,
313-
io.javaoperatorsdk.operator.api.reconciler.ControllerConfiguration::itemStore,
314-
"itemStore"),
315-
ItemStore.class, context),
316290
dependentFieldManager,
317-
this, informerListLimit);
291+
this, informerConfig);
318292
}
319293

320294

@@ -326,6 +300,4 @@ protected boolean createIfNeeded() {
326300
public boolean checkCRDAndValidateLocalModel() {
327301
return Utils.shouldCheckCRDAndValidateLocalModel();
328302
}
329-
330-
331303
}

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

+45-39
Original file line numberDiff line numberDiff line change
@@ -10,51 +10,46 @@
1010
import io.fabric8.kubernetes.api.model.HasMetadata;
1111
import io.fabric8.kubernetes.client.informers.cache.ItemStore;
1212
import io.javaoperatorsdk.operator.api.config.dependent.DependentResourceSpec;
13+
import io.javaoperatorsdk.operator.processing.dependent.kubernetes.InformerConfigHolder;
1314
import io.javaoperatorsdk.operator.processing.event.rate.RateLimiter;
1415
import io.javaoperatorsdk.operator.processing.event.source.filter.GenericFilter;
1516
import io.javaoperatorsdk.operator.processing.event.source.filter.OnAddFilter;
1617
import io.javaoperatorsdk.operator.processing.event.source.filter.OnUpdateFilter;
1718
import io.javaoperatorsdk.operator.processing.retry.Retry;
1819

19-
import static io.javaoperatorsdk.operator.api.reconciler.Constants.DEFAULT_NAMESPACES_SET;
20-
import static io.javaoperatorsdk.operator.api.reconciler.Constants.WATCH_CURRENT_NAMESPACE_SET;
2120

2221
@SuppressWarnings({"rawtypes", "unused", "UnusedReturnValue"})
2322
public class ControllerConfigurationOverrider<R extends HasMetadata> {
2423

24+
private final ControllerConfiguration<R> original;
25+
private String name;
2526
private String finalizer;
2627
private boolean generationAware;
27-
private Set<String> namespaces;
2828
private Retry retry;
29-
private String labelSelector;
30-
private final ControllerConfiguration<R> original;
31-
private Duration reconciliationMaxInterval;
32-
private OnAddFilter<? super R> onAddFilter;
33-
private OnUpdateFilter<? super R> onUpdateFilter;
34-
private GenericFilter<? super R> genericFilter;
3529
private RateLimiter rateLimiter;
36-
private Map<DependentResourceSpec, Object> configurations;
37-
private ItemStore<R> itemStore;
38-
private String name;
3930
private String fieldManager;
40-
private Long informerListLimit;
31+
private Duration reconciliationMaxInterval;
32+
private Map<DependentResourceSpec, Object> configurations;
33+
private final InformerConfigHolder<R>.Builder config;
4134

4235
private ControllerConfigurationOverrider(ControllerConfiguration<R> original) {
4336
this.finalizer = original.getFinalizerName();
4437
this.generationAware = original.isGenerationAware();
45-
this.namespaces = new HashSet<>(original.getNamespaces());
38+
this.config = InformerConfigHolder.builder(original.getResourceClass())
39+
.withName(name)
40+
.withNamespaces(original.getNamespaces())
41+
.withLabelSelector(original.getLabelSelector())
42+
.withOnAddFilter(original.onAddFilter().orElse(null))
43+
.withOnUpdateFilter(original.onUpdateFilter().orElse(null))
44+
.withGenericFilter(original.genericFilter().orElse(null))
45+
.withInformerListLimit(original.getInformerListLimit().orElse(null))
46+
.withItemStore(original.getItemStore().orElse(null));
4647
this.retry = original.getRetry();
47-
this.labelSelector = original.getLabelSelector();
4848
this.reconciliationMaxInterval = original.maxReconciliationInterval().orElse(null);
49-
this.onAddFilter = original.onAddFilter().orElse(null);
50-
this.onUpdateFilter = original.onUpdateFilter().orElse(null);
51-
this.genericFilter = original.genericFilter().orElse(null);
5249
this.original = original;
5350
this.rateLimiter = original.getRateLimiter();
5451
this.name = original.getName();
5552
this.fieldManager = original.fieldManager();
56-
this.informerListLimit = original.getInformerListLimit().orElse(null);
57-
this.itemStore = original.getItemStore().orElse(null);
5853
}
5954

6055
public ControllerConfigurationOverrider<R> withFinalizer(String finalizer) {
@@ -68,26 +63,36 @@ public ControllerConfigurationOverrider<R> withGenerationAware(boolean generatio
6863
}
6964

7065
public ControllerConfigurationOverrider<R> watchingOnlyCurrentNamespace() {
71-
this.namespaces = WATCH_CURRENT_NAMESPACE_SET;
66+
config.withWatchCurrentNamespace();
7267
return this;
7368
}
7469

7570
public ControllerConfigurationOverrider<R> addingNamespaces(String... namespaces) {
76-
this.namespaces.addAll(List.of(namespaces));
71+
if (namespaces != null && namespaces.length > 0) {
72+
final var current = config.namespaces();
73+
final var aggregated = new HashSet<String>(current.size() + namespaces.length);
74+
aggregated.addAll(current);
75+
aggregated.addAll(Set.of(namespaces));
76+
config.withNamespaces(aggregated);
77+
}
7778
return this;
7879
}
7980

8081
public ControllerConfigurationOverrider<R> removingNamespaces(String... namespaces) {
81-
List.of(namespaces).forEach(this.namespaces::remove);
82-
if (this.namespaces.isEmpty()) {
83-
this.namespaces = DEFAULT_NAMESPACES_SET;
82+
if (namespaces != null && namespaces.length > 0) {
83+
final var current = new HashSet<>(config.namespaces());
84+
List.of(namespaces).forEach(current::remove);
85+
if (current.isEmpty()) {
86+
return watchingAllNamespaces();
87+
} else {
88+
config.withNamespaces(current);
89+
}
8490
}
8591
return this;
8692
}
8793

8894
public ControllerConfigurationOverrider<R> settingNamespaces(Set<String> newNamespaces) {
89-
this.namespaces.clear();
90-
this.namespaces.addAll(newNamespaces);
95+
config.withNamespaces(newNamespaces);
9196
return this;
9297
}
9398

@@ -96,13 +101,12 @@ public ControllerConfigurationOverrider<R> settingNamespaces(String... newNamesp
96101
}
97102

98103
public ControllerConfigurationOverrider<R> settingNamespace(String namespace) {
99-
this.namespaces.clear();
100-
this.namespaces.add(namespace);
104+
config.withNamespaces(Set.of(namespace));
101105
return this;
102106
}
103107

104108
public ControllerConfigurationOverrider<R> watchingAllNamespaces() {
105-
this.namespaces = DEFAULT_NAMESPACES_SET;
109+
config.withWatchAllNamespaces();
106110
return this;
107111
}
108112

@@ -117,7 +121,7 @@ public ControllerConfigurationOverrider<R> withRateLimiter(RateLimiter rateLimit
117121
}
118122

119123
public ControllerConfigurationOverrider<R> withLabelSelector(String labelSelector) {
120-
this.labelSelector = labelSelector;
124+
config.withLabelSelector(labelSelector);
121125
return this;
122126
}
123127

@@ -128,27 +132,28 @@ public ControllerConfigurationOverrider<R> withReconciliationMaxInterval(
128132
}
129133

130134
public ControllerConfigurationOverrider<R> withOnAddFilter(OnAddFilter<R> onAddFilter) {
131-
this.onAddFilter = onAddFilter;
135+
config.withOnAddFilter(onAddFilter);
132136
return this;
133137
}
134138

135139
public ControllerConfigurationOverrider<R> withOnUpdateFilter(OnUpdateFilter<R> onUpdateFilter) {
136-
this.onUpdateFilter = onUpdateFilter;
140+
config.withOnUpdateFilter(onUpdateFilter);
137141
return this;
138142
}
139143

140144
public ControllerConfigurationOverrider<R> withGenericFilter(GenericFilter<R> genericFilter) {
141-
this.genericFilter = genericFilter;
145+
config.withGenericFilter(genericFilter);
142146
return this;
143147
}
144148

145149
public ControllerConfigurationOverrider<R> withItemStore(ItemStore<R> itemStore) {
146-
this.itemStore = itemStore;
150+
config.withItemStore(itemStore);
147151
return this;
148152
}
149153

150154
public ControllerConfigurationOverrider<R> withName(String name) {
151155
this.name = name;
156+
config.withName(name);
152157
return this;
153158
}
154159

@@ -168,7 +173,7 @@ public ControllerConfigurationOverrider<R> withFieldManager(
168173
*/
169174
public ControllerConfigurationOverrider<R> withInformerListLimit(
170175
Long informerListLimit) {
171-
this.informerListLimit = informerListLimit;
176+
config.withInformerListLimit(informerListLimit);
172177
return this;
173178
}
174179

@@ -192,9 +197,10 @@ public ControllerConfiguration<R> build() {
192197
return new ResolvedControllerConfiguration<>(original.getResourceClass(),
193198
name,
194199
generationAware, original.getAssociatedReconcilerClassName(), retry, rateLimiter,
195-
reconciliationMaxInterval, onAddFilter, onUpdateFilter, genericFilter,
196-
namespaces, finalizer, labelSelector, configurations, itemStore, fieldManager,
197-
original.getConfigurationService(), informerListLimit,
200+
reconciliationMaxInterval,
201+
finalizer, configurations, fieldManager,
202+
original.getConfigurationService(),
203+
config.buildForController(),
198204
original.getWorkflowSpec().orElse(null));
199205
}
200206

Original file line numberDiff line numberDiff line change
@@ -1,92 +1,41 @@
11
package io.javaoperatorsdk.operator.api.config;
22

3-
import java.util.Optional;
4-
import java.util.Set;
53

64
import io.fabric8.kubernetes.api.model.GenericKubernetesResource;
75
import io.fabric8.kubernetes.api.model.HasMetadata;
8-
import io.fabric8.kubernetes.client.informers.cache.ItemStore;
96
import io.javaoperatorsdk.operator.ReconcilerUtils;
10-
import io.javaoperatorsdk.operator.processing.event.source.filter.GenericFilter;
11-
import io.javaoperatorsdk.operator.processing.event.source.filter.OnAddFilter;
12-
import io.javaoperatorsdk.operator.processing.event.source.filter.OnUpdateFilter;
7+
import io.javaoperatorsdk.operator.processing.dependent.kubernetes.InformerConfigHolder;
138

149
public class DefaultResourceConfiguration<R extends HasMetadata>
1510
implements ResourceConfiguration<R> {
1611

1712
private final Class<R> resourceClass;
1813
private final String resourceTypeName;
19-
private final OnAddFilter<? super R> onAddFilter;
20-
private final OnUpdateFilter<? super R> onUpdateFilter;
21-
private final GenericFilter<? super R> genericFilter;
22-
private final String labelSelector;
23-
private final Set<String> namespaces;
24-
private final ItemStore<R> itemStore;
25-
private final Long informerListLimit;
14+
private final InformerConfigHolder<R> informerConfig;
2615

2716
protected DefaultResourceConfiguration(Class<R> resourceClass,
28-
Set<String> namespaces, String labelSelector, OnAddFilter<? super R> onAddFilter,
29-
OnUpdateFilter<? super R> onUpdateFilter, GenericFilter<? super R> genericFilter,
30-
ItemStore<R> itemStore, Long informerListLimit) {
17+
InformerConfigHolder<R> informerConfig) {
3118
this.resourceClass = resourceClass;
3219
this.resourceTypeName = resourceClass.isAssignableFrom(GenericKubernetesResource.class)
3320
// in general this is irrelevant now for secondary resources it is used just by controller
3421
// where GenericKubernetesResource now does not apply
3522
? GenericKubernetesResource.class.getSimpleName()
3623
: ReconcilerUtils.getResourceTypeName(resourceClass);
37-
this.onAddFilter = onAddFilter;
38-
this.onUpdateFilter = onUpdateFilter;
39-
this.genericFilter = genericFilter;
40-
41-
this.namespaces = ResourceConfiguration.ensureValidNamespaces(namespaces);
42-
this.labelSelector = ResourceConfiguration.ensureValidLabelSelector(labelSelector);
43-
this.itemStore = itemStore;
44-
this.informerListLimit = informerListLimit;
24+
this.informerConfig = informerConfig;
4525
}
4626

4727
@Override
4828
public String getResourceTypeName() {
4929
return resourceTypeName;
5030
}
5131

52-
@Override
53-
public String getLabelSelector() {
54-
return labelSelector;
55-
}
56-
57-
@Override
58-
public Set<String> getNamespaces() {
59-
return namespaces;
60-
}
61-
6232
@Override
6333
public Class<R> getResourceClass() {
6434
return resourceClass;
6535
}
6636

6737
@Override
68-
public Optional<OnAddFilter<? super R>> onAddFilter() {
69-
return Optional.ofNullable(onAddFilter);
70-
}
71-
72-
@Override
73-
public Optional<OnUpdateFilter<? super R>> onUpdateFilter() {
74-
return Optional.ofNullable(onUpdateFilter);
38+
public InformerConfigHolder<R> getInformerConfig() {
39+
return informerConfig;
7540
}
76-
77-
@Override
78-
public Optional<GenericFilter<? super R>> genericFilter() {
79-
return Optional.ofNullable(genericFilter);
80-
}
81-
82-
@Override
83-
public Optional<ItemStore<R>> getItemStore() {
84-
return Optional.ofNullable(itemStore);
85-
}
86-
87-
@Override
88-
public Optional<Long> getInformerListLimit() {
89-
return Optional.ofNullable(informerListLimit);
90-
}
91-
9241
}

0 commit comments

Comments
 (0)