Skip to content

Commit 8440796

Browse files
committed
feat: move controller informer-related configuration to InformerConfig
Signed-off-by: Chris Laprun <claprun@redhat.com>
1 parent 576e7a5 commit 8440796

File tree

31 files changed

+552
-557
lines changed

31 files changed

+552
-557
lines changed

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

Lines changed: 5 additions & 33 deletions
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

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
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;
@@ -189,12 +190,26 @@ public ControllerConfigurationOverrider<R> replacingNamedDependentResourceConfig
189190
}
190191

191192
public ControllerConfiguration<R> build() {
193+
// todo: should use an informer builder directly and share code across similar builders
194+
InformerConfigHolder<R> informerConfig =
195+
InformerConfigHolder.builder(original.getResourceClass())
196+
.withLabelSelector(labelSelector)
197+
.withItemStore(itemStore)
198+
.withInformerListLimit(informerListLimit)
199+
.withName(name)
200+
.withNamespaces(namespaces)
201+
.withOnAddFilter(onAddFilter)
202+
.withOnUpdateFilter(onUpdateFilter)
203+
.withGenericFilter(genericFilter)
204+
.buildForController();
205+
192206
return new ResolvedControllerConfiguration<>(original.getResourceClass(),
193207
name,
194208
generationAware, original.getAssociatedReconcilerClassName(), retry, rateLimiter,
195-
reconciliationMaxInterval, onAddFilter, onUpdateFilter, genericFilter,
196-
namespaces, finalizer, labelSelector, configurations, itemStore, fieldManager,
197-
original.getConfigurationService(), informerListLimit,
209+
reconciliationMaxInterval,
210+
finalizer, configurations, fieldManager,
211+
original.getConfigurationService(),
212+
informerConfig,
198213
original.getWorkflowSpec().orElse(null));
199214
}
200215

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
}

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

Lines changed: 34 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -4,18 +4,14 @@
44
import java.util.Collections;
55
import java.util.Map;
66
import java.util.Optional;
7-
import java.util.Set;
87
import java.util.concurrent.TimeUnit;
98

109
import io.fabric8.kubernetes.api.model.HasMetadata;
11-
import io.fabric8.kubernetes.client.informers.cache.ItemStore;
1210
import io.javaoperatorsdk.operator.api.config.dependent.DependentResourceSpec;
1311
import io.javaoperatorsdk.operator.api.config.workflow.WorkflowSpec;
1412
import io.javaoperatorsdk.operator.api.reconciler.Reconciler;
13+
import io.javaoperatorsdk.operator.processing.dependent.kubernetes.InformerConfigHolder;
1514
import io.javaoperatorsdk.operator.processing.event.rate.RateLimiter;
16-
import io.javaoperatorsdk.operator.processing.event.source.filter.GenericFilter;
17-
import io.javaoperatorsdk.operator.processing.event.source.filter.OnAddFilter;
18-
import io.javaoperatorsdk.operator.processing.event.source.filter.OnUpdateFilter;
1915
import io.javaoperatorsdk.operator.processing.retry.Retry;
2016

2117
@SuppressWarnings("rawtypes")
@@ -31,7 +27,6 @@ public class ResolvedControllerConfiguration<P extends HasMetadata>
3127
private final Duration maxReconciliationInterval;
3228
private final String finalizer;
3329
private final Map<DependentResourceSpec, Object> configurations;
34-
private final ItemStore<P> itemStore;
3530
private final ConfigurationService configurationService;
3631
private final String fieldManager;
3732
private WorkflowSpec workflowSpec;
@@ -40,60 +35,35 @@ public ResolvedControllerConfiguration(Class<P> resourceClass, ControllerConfigu
4035
this(resourceClass, other.getName(), other.isGenerationAware(),
4136
other.getAssociatedReconcilerClassName(), other.getRetry(), other.getRateLimiter(),
4237
other.maxReconciliationInterval().orElse(null),
43-
other.onAddFilter().orElse(null), other.onUpdateFilter().orElse(null),
44-
other.genericFilter().orElse(null),
45-
other.getNamespaces(),
46-
other.getFinalizerName(), other.getLabelSelector(), Collections.emptyMap(),
47-
other.getItemStore().orElse(null), other.fieldManager(),
38+
other.getFinalizerName(), Collections.emptyMap(),
39+
other.fieldManager(),
4840
other.getConfigurationService(),
49-
other.getInformerListLimit().orElse(null), other.getWorkflowSpec().orElse(null));
50-
}
51-
52-
public static Duration getMaxReconciliationInterval(long interval, TimeUnit timeUnit) {
53-
return interval > 0 ? Duration.of(interval, timeUnit.toChronoUnit()) : null;
54-
}
55-
56-
public static String getAssociatedReconcilerClassName(
57-
Class<? extends Reconciler> reconcilerClass) {
58-
return reconcilerClass.getCanonicalName();
59-
}
60-
61-
protected Retry ensureRetry(Retry given) {
62-
return given == null ? ControllerConfiguration.super.getRetry() : given;
63-
}
64-
65-
protected RateLimiter ensureRateLimiter(RateLimiter given) {
66-
return given == null ? ControllerConfiguration.super.getRateLimiter() : given;
41+
other.getInformerConfig(),
42+
other.getWorkflowSpec().orElse(null));
6743
}
6844

6945
public ResolvedControllerConfiguration(Class<P> resourceClass, String name,
7046
boolean generationAware, String associatedReconcilerClassName, Retry retry,
7147
RateLimiter rateLimiter, Duration maxReconciliationInterval,
72-
OnAddFilter<? super P> onAddFilter, OnUpdateFilter<? super P> onUpdateFilter,
73-
GenericFilter<? super P> genericFilter,
74-
Set<String> namespaces, String finalizer, String labelSelector,
75-
Map<DependentResourceSpec, Object> configurations, ItemStore<P> itemStore,
48+
String finalizer,
49+
Map<DependentResourceSpec, Object> configurations,
7650
String fieldManager,
77-
ConfigurationService configurationService, Long informerListLimit,
51+
ConfigurationService configurationService,
52+
InformerConfigHolder<P> informerConfig,
7853
WorkflowSpec workflowSpec) {
7954
this(resourceClass, name, generationAware, associatedReconcilerClassName, retry, rateLimiter,
80-
maxReconciliationInterval, onAddFilter, onUpdateFilter, genericFilter,
81-
namespaces, finalizer, labelSelector, configurations, itemStore, fieldManager,
82-
configurationService, informerListLimit);
55+
maxReconciliationInterval, finalizer, configurations, fieldManager,
56+
configurationService, informerConfig);
8357
setWorkflowSpec(workflowSpec);
8458
}
8559

8660
protected ResolvedControllerConfiguration(Class<P> resourceClass, String name,
8761
boolean generationAware, String associatedReconcilerClassName, Retry retry,
88-
RateLimiter rateLimiter, Duration maxReconciliationInterval,
89-
OnAddFilter<? super P> onAddFilter, OnUpdateFilter<? super P> onUpdateFilter,
90-
GenericFilter<? super P> genericFilter,
91-
Set<String> namespaces, String finalizer, String labelSelector,
92-
Map<DependentResourceSpec, Object> configurations, ItemStore<P> itemStore,
62+
RateLimiter rateLimiter, Duration maxReconciliationInterval, String finalizer,
63+
Map<DependentResourceSpec, Object> configurations,
9364
String fieldManager,
94-
ConfigurationService configurationService, Long informerListLimit) {
95-
super(resourceClass, namespaces, labelSelector, onAddFilter, onUpdateFilter, genericFilter,
96-
itemStore, informerListLimit);
65+
ConfigurationService configurationService, InformerConfigHolder<P> informerConfig) {
66+
super(resourceClass, informerConfig);
9767
this.configurationService = configurationService;
9868
this.name = ControllerConfiguration.ensureValidName(name, associatedReconcilerClassName);
9969
this.generationAware = generationAware;
@@ -102,7 +72,6 @@ protected ResolvedControllerConfiguration(Class<P> resourceClass, String name,
10272
this.rateLimiter = ensureRateLimiter(rateLimiter);
10373
this.maxReconciliationInterval = maxReconciliationInterval;
10474
this.configurations = configurations != null ? configurations : Collections.emptyMap();
105-
this.itemStore = itemStore;
10675
this.finalizer =
10776
ControllerConfiguration.ensureValidFinalizerName(finalizer, getResourceTypeName());
10877
this.fieldManager = fieldManager;
@@ -111,8 +80,25 @@ protected ResolvedControllerConfiguration(Class<P> resourceClass, String name,
11180
protected ResolvedControllerConfiguration(Class<P> resourceClass, String name,
11281
Class<? extends Reconciler> reconcilerClas, ConfigurationService configurationService) {
11382
this(resourceClass, name, false, getAssociatedReconcilerClassName(reconcilerClas), null, null,
114-
null, null, null, null, null,
115-
null, null, null, null, null, configurationService, null);
83+
null, null, null, null, configurationService,
84+
InformerConfigHolder.builder(resourceClass).buildForController());
85+
}
86+
87+
public static Duration getMaxReconciliationInterval(long interval, TimeUnit timeUnit) {
88+
return interval > 0 ? Duration.of(interval, timeUnit.toChronoUnit()) : null;
89+
}
90+
91+
public static String getAssociatedReconcilerClassName(
92+
Class<? extends Reconciler> reconcilerClass) {
93+
return reconcilerClass.getCanonicalName();
94+
}
95+
96+
protected Retry ensureRetry(Retry given) {
97+
return given == null ? ControllerConfiguration.super.getRetry() : given;
98+
}
99+
100+
protected RateLimiter ensureRateLimiter(RateLimiter given) {
101+
return given == null ? ControllerConfiguration.super.getRateLimiter() : given;
116102
}
117103

118104
@Override
@@ -177,11 +163,6 @@ public <C> C getConfigurationFor(DependentResourceSpec<?, P, C> spec) {
177163
return (C) config;
178164
}
179165

180-
@Override
181-
public Optional<ItemStore<P>> getItemStore() {
182-
return Optional.ofNullable(itemStore);
183-
}
184-
185166
@Override
186167
public String fieldManager() {
187168
return fieldManager;

0 commit comments

Comments
 (0)