Skip to content

Commit ce59155

Browse files
committed
dedicated config bean for dependent informer
Signed-off-by: Attila Mészáros <[email protected]>
1 parent d8a0bc3 commit ce59155

File tree

13 files changed

+257
-157
lines changed

13 files changed

+257
-157
lines changed

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

+3-10
Original file line numberDiff line numberDiff line change
@@ -151,9 +151,9 @@ static boolean inheritsNamespacesFromController(Set<String> namespaces) {
151151
@SuppressWarnings("unused")
152152
class InformerConfigurationBuilder<R extends HasMetadata> {
153153

154-
private Class<R> resourceClass;
155-
protected GroupVersionKind groupVersionKind;
156-
protected Class<? extends HasMetadata> primaryResourceClass;
154+
private final Class<R> resourceClass;
155+
private final GroupVersionKind groupVersionKind;
156+
private final Class<? extends HasMetadata> primaryResourceClass;
157157
private String name;
158158
private PrimaryToSecondaryMapper<?> primaryToSecondaryMapper;
159159
private SecondaryToPrimaryMapper<R> secondaryToPrimaryMapper;
@@ -179,8 +179,6 @@ private InformerConfigurationBuilder(GroupVersionKind groupVersionKind,
179179
this((Class<R>) GenericKubernetesResource.class, primaryResourceClass, groupVersionKind);
180180
}
181181

182-
protected InformerConfigurationBuilder() {}
183-
184182
private InformerConfigurationBuilder(Class<R> resourceClass,
185183
Class<? extends HasMetadata> primaryResourceClass, GroupVersionKind groupVersionKind) {
186184
this.resourceClass = resourceClass;
@@ -297,11 +295,6 @@ public InformerConfigurationBuilder<R> withItemStore(ItemStore<R> itemStore) {
297295
return this;
298296
}
299297

300-
public InformerConfigurationBuilder<R> withResourceClass(Class<R> resourceClass) {
301-
this.resourceClass = resourceClass;
302-
return this;
303-
}
304-
305298
/**
306299
* Sets a max page size limit when starting the informer. This will result in pagination while
307300
* populating the cache. This means that longer lists will take multiple requests to fetch. See

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

-12
Original file line numberDiff line numberDiff line change
@@ -83,16 +83,4 @@
8383
*/
8484
boolean followControllerNamespacesOnChange() default DEFAULT_FOLLOW_CONTROLLER_NAMESPACES_ON_CHANGE;
8585

86-
/**
87-
* The {@link io.javaoperatorsdk.operator.processing.GroupVersionKind} of the secondary resource
88-
* of this dependent resource. Used only if dependent resource is based on
89-
* {@link io.fabric8.kubernetes.api.model.GenericKubernetesResource}
90-
*
91-
* It should be in format: [group]/[version]/[kind]. Thus: apps/v1/Deployment.
92-
* <p/>
93-
* Note that using this dynamic approach only makes sense if there is no class representation for
94-
* the target resource.
95-
**/
96-
String groupVersionKind() default NO_VALUE_SET;
97-
9886
}

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

+13-32
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,7 @@
1010
import io.javaoperatorsdk.operator.api.config.Utils;
1111
import io.javaoperatorsdk.operator.api.config.dependent.ConfigurationConverter;
1212
import io.javaoperatorsdk.operator.api.config.dependent.DependentResourceSpec;
13-
import io.javaoperatorsdk.operator.api.config.informer.InformerConfiguration;
1413
import io.javaoperatorsdk.operator.api.reconciler.Constants;
15-
import io.javaoperatorsdk.operator.processing.GroupVersionKind;
1614
import io.javaoperatorsdk.operator.processing.event.source.filter.GenericFilter;
1715
import io.javaoperatorsdk.operator.processing.event.source.filter.OnAddFilter;
1816
import io.javaoperatorsdk.operator.processing.event.source.filter.OnDeleteFilter;
@@ -49,75 +47,58 @@ public KubernetesDependentResourceConfig<R> configFrom(KubernetesDependent confi
4947
}
5048

5149
@SuppressWarnings({"unchecked", "rawtypes"})
52-
private InformerConfiguration.InformerConfigurationBuilder<R> createInformerConfig(
50+
private KubernetesDependentInformerConfig<R> createInformerConfig(
5351
KubernetesDependent configAnnotation,
5452
DependentResourceSpec<R, P, KubernetesDependentResourceConfig<R>> spec,
5553
ControllerConfiguration<? extends HasMetadata> controllerConfig) {
5654
Class<? extends KubernetesDependentResource<?, ?>> dependentResourceClass =
5755
(Class<? extends KubernetesDependentResource<?, ?>>) spec.getDependentResourceClass();
5856

59-
InformerConfiguration.InformerConfigurationBuilder informerBuilder;
60-
if (configAnnotation != null && configAnnotation.informerConfig() != null &&
61-
!Constants.NO_VALUE_SET.equals(configAnnotation.informerConfig().groupVersionKind())) {
62-
63-
informerBuilder = InformerConfiguration.from(
64-
GroupVersionKind.fromString(configAnnotation.informerConfig().groupVersionKind()),
65-
controllerConfig.getResourceClass());
66-
} else {
67-
informerBuilder = new InternalInformerConfigBuilder(controllerConfig.getResourceClass());
68-
}
69-
7057
if (configAnnotation != null && configAnnotation.informerConfig() != null) {
58+
var config = new KubernetesDependentInformerConfigBuilder<>();
59+
7160
// override default name if more specific one is provided
7261
if (!Constants.NO_VALUE_SET.equals(configAnnotation.informerConfig().name())) {
73-
informerBuilder.withName(configAnnotation.informerConfig().name());
74-
} else if (spec.getName() != null && !Constants.NO_VALUE_SET.equals(spec.getName())) {
75-
informerBuilder.withName(spec.getName());
62+
config.withName(configAnnotation.informerConfig().name());
7663
}
7764

7865
var namespaces = Set.of(configAnnotation.informerConfig().namespaces());
79-
informerBuilder.withNamespaces(namespaces);
66+
config.withNamespaces(namespaces);
8067

8168
final var fromAnnotation = configAnnotation.informerConfig().labelSelector();
8269
var labelSelector = Constants.NO_VALUE_SET.equals(fromAnnotation) ? null : fromAnnotation;
83-
informerBuilder.withLabelSelector(labelSelector);
70+
config.withLabelSelector(labelSelector);
8471

8572
final var context = Utils.contextFor(controllerConfig, dependentResourceClass,
8673
configAnnotation.annotationType());
8774

8875
var onAddFilter = Utils.instantiate(configAnnotation.informerConfig().onAddFilter(),
8976
OnAddFilter.class, context);
90-
informerBuilder.withOnAddFilter((OnAddFilter<? super R>) onAddFilter);
77+
config.withOnAddFilter(onAddFilter);
9178

9279
var onUpdateFilter =
9380
Utils.instantiate(configAnnotation.informerConfig().onUpdateFilter(),
9481
OnUpdateFilter.class, context);
95-
informerBuilder.withOnUpdateFilter((OnUpdateFilter<? super R>) onUpdateFilter);
82+
config.withOnUpdateFilter(onUpdateFilter);
9683

9784
var onDeleteFilter =
9885
Utils.instantiate(configAnnotation.informerConfig().onDeleteFilter(),
9986
OnDeleteFilter.class, context);
100-
informerBuilder.withOnDeleteFilter((OnDeleteFilter<? super R>) onDeleteFilter);
87+
config.withOnDeleteFilter(onDeleteFilter);
10188

10289
var genericFilter =
10390
Utils.instantiate(configAnnotation.informerConfig().genericFilter(),
10491
GenericFilter.class,
10592
context);
10693

107-
informerBuilder.withGenericFilter((GenericFilter<? super R>) genericFilter);
94+
config.withGenericFilter(genericFilter);
10895

109-
informerBuilder.followControllerNamespacesOnChange(
96+
config.withFollowControllerNamespacesOnChange(
11097
configAnnotation.informerConfig().followControllerNamespacesOnChange());
11198

99+
return config.build();
112100
}
113-
return informerBuilder;
114-
}
115-
116-
private class InternalInformerConfigBuilder
117-
extends InformerConfiguration.InformerConfigurationBuilder<R> {
118-
public InternalInformerConfigBuilder(Class<? extends HasMetadata> primaryResourceClass) {
119-
this.primaryResourceClass = primaryResourceClass;
120-
}
101+
return new KubernetesDependentInformerConfigBuilder<>().build();
121102
}
122103

123104
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
package io.javaoperatorsdk.operator.processing.dependent.kubernetes;
2+
3+
import java.util.Set;
4+
5+
import io.fabric8.kubernetes.api.model.HasMetadata;
6+
import io.fabric8.kubernetes.client.informers.cache.ItemStore;
7+
import io.javaoperatorsdk.operator.api.config.informer.InformerConfiguration;
8+
import io.javaoperatorsdk.operator.processing.event.source.filter.GenericFilter;
9+
import io.javaoperatorsdk.operator.processing.event.source.filter.OnAddFilter;
10+
import io.javaoperatorsdk.operator.processing.event.source.filter.OnDeleteFilter;
11+
import io.javaoperatorsdk.operator.processing.event.source.filter.OnUpdateFilter;
12+
13+
14+
public class KubernetesDependentInformerConfig<R extends HasMetadata> {
15+
16+
private String name;
17+
private Set<String> namespaces;
18+
private boolean followControllerNamespacesOnChange;
19+
private String labelSelector;
20+
private OnAddFilter<? super R> onAddFilter;
21+
private OnUpdateFilter<? super R> onUpdateFilter;
22+
private OnDeleteFilter<? super R> onDeleteFilter;
23+
private GenericFilter<? super R> genericFilter;
24+
private ItemStore<R> itemStore;
25+
private Long informerListLimit;
26+
27+
public KubernetesDependentInformerConfig(String name, Set<String> namespaces,
28+
boolean followControllerNamespacesOnChange,
29+
String labelSelector, OnAddFilter<? super R> onAddFilter,
30+
OnUpdateFilter<? super R> onUpdateFilter, OnDeleteFilter<? super R> onDeleteFilter,
31+
GenericFilter<? super R> genericFilter, ItemStore<R> itemStore, Long informerListLimit) {
32+
this.name = name;
33+
this.namespaces = namespaces;
34+
this.followControllerNamespacesOnChange = followControllerNamespacesOnChange;
35+
this.labelSelector = labelSelector;
36+
this.onAddFilter = onAddFilter;
37+
this.onUpdateFilter = onUpdateFilter;
38+
this.onDeleteFilter = onDeleteFilter;
39+
this.genericFilter = genericFilter;
40+
this.itemStore = itemStore;
41+
this.informerListLimit = informerListLimit;
42+
}
43+
44+
public String getName() {
45+
return name;
46+
}
47+
48+
public Set<String> getNamespaces() {
49+
return namespaces;
50+
}
51+
52+
public boolean isFollowControllerNamespacesOnChange() {
53+
return followControllerNamespacesOnChange;
54+
}
55+
56+
public String getLabelSelector() {
57+
return labelSelector;
58+
}
59+
60+
public OnAddFilter<? super R> getOnAddFilter() {
61+
return onAddFilter;
62+
}
63+
64+
public OnUpdateFilter<? super R> getOnUpdateFilter() {
65+
return onUpdateFilter;
66+
}
67+
68+
public OnDeleteFilter<? super R> getOnDeleteFilter() {
69+
return onDeleteFilter;
70+
}
71+
72+
public GenericFilter<? super R> getGenericFilter() {
73+
return genericFilter;
74+
}
75+
76+
public ItemStore<R> getItemStore() {
77+
return itemStore;
78+
}
79+
80+
public Long getInformerListLimit() {
81+
return informerListLimit;
82+
}
83+
84+
public void updateInformerConfigBuilder(
85+
InformerConfiguration.InformerConfigurationBuilder<R> builder) {
86+
builder.withName(name);
87+
builder.withNamespaces(namespaces);
88+
builder.followControllerNamespacesOnChange(followControllerNamespacesOnChange);
89+
builder.withLabelSelector(labelSelector);
90+
builder.withItemStore(itemStore);
91+
builder.withOnAddFilter(onAddFilter);
92+
builder.withOnUpdateFilter(onUpdateFilter);
93+
builder.withOnDeleteFilter(onDeleteFilter);
94+
builder.withGenericFilter(genericFilter);
95+
builder.withInformerListLimit(informerListLimit);
96+
}
97+
98+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
package io.javaoperatorsdk.operator.processing.dependent.kubernetes;
2+
3+
import java.util.Set;
4+
5+
import io.fabric8.kubernetes.api.model.HasMetadata;
6+
import io.fabric8.kubernetes.client.informers.cache.ItemStore;
7+
import io.javaoperatorsdk.operator.processing.event.source.filter.GenericFilter;
8+
import io.javaoperatorsdk.operator.processing.event.source.filter.OnAddFilter;
9+
import io.javaoperatorsdk.operator.processing.event.source.filter.OnDeleteFilter;
10+
import io.javaoperatorsdk.operator.processing.event.source.filter.OnUpdateFilter;
11+
12+
import static io.javaoperatorsdk.operator.api.config.informer.InformerConfiguration.DEFAULT_FOLLOW_CONTROLLER_NAMESPACES_ON_CHANGE;
13+
import static io.javaoperatorsdk.operator.api.reconciler.Constants.SAME_AS_CONTROLLER_NAMESPACES_SET;
14+
15+
public final class KubernetesDependentInformerConfigBuilder<R extends HasMetadata> {
16+
17+
private String name;
18+
private Set<String> namespaces = SAME_AS_CONTROLLER_NAMESPACES_SET;
19+
private boolean followControllerNamespacesOnChange =
20+
DEFAULT_FOLLOW_CONTROLLER_NAMESPACES_ON_CHANGE;
21+
private String labelSelector;
22+
private OnAddFilter<? super R> onAddFilter;
23+
private OnUpdateFilter<? super R> onUpdateFilter;
24+
private OnDeleteFilter<? super R> onDeleteFilter;
25+
private GenericFilter<? super R> genericFilter;
26+
private ItemStore<R> itemStore;
27+
private Long informerListLimit;
28+
29+
public KubernetesDependentInformerConfigBuilder() {}
30+
31+
public KubernetesDependentInformerConfigBuilder withName(String name) {
32+
this.name = name;
33+
return this;
34+
}
35+
36+
public KubernetesDependentInformerConfigBuilder withNamespaces(Set<String> namespaces) {
37+
this.namespaces = namespaces;
38+
return this;
39+
}
40+
41+
public KubernetesDependentInformerConfigBuilder withFollowControllerNamespacesOnChange(
42+
boolean followControllerNamespacesOnChange) {
43+
this.followControllerNamespacesOnChange = followControllerNamespacesOnChange;
44+
return this;
45+
}
46+
47+
public KubernetesDependentInformerConfigBuilder withLabelSelector(String labelSelector) {
48+
this.labelSelector = labelSelector;
49+
return this;
50+
}
51+
52+
public KubernetesDependentInformerConfigBuilder withOnAddFilter(
53+
OnAddFilter<? super R> onAddFilter) {
54+
this.onAddFilter = onAddFilter;
55+
return this;
56+
}
57+
58+
public KubernetesDependentInformerConfigBuilder withOnUpdateFilter(
59+
OnUpdateFilter<? super R> onUpdateFilter) {
60+
this.onUpdateFilter = onUpdateFilter;
61+
return this;
62+
}
63+
64+
public KubernetesDependentInformerConfigBuilder withOnDeleteFilter(
65+
OnDeleteFilter<? super R> onDeleteFilter) {
66+
this.onDeleteFilter = onDeleteFilter;
67+
return this;
68+
}
69+
70+
public KubernetesDependentInformerConfigBuilder withGenericFilter(
71+
GenericFilter<? super R> genericFilter) {
72+
this.genericFilter = genericFilter;
73+
return this;
74+
}
75+
76+
public KubernetesDependentInformerConfigBuilder withItemStore(ItemStore<R> itemStore) {
77+
this.itemStore = itemStore;
78+
return this;
79+
}
80+
81+
public KubernetesDependentInformerConfigBuilder withInformerListLimit(Long informerListLimit) {
82+
this.informerListLimit = informerListLimit;
83+
return this;
84+
}
85+
86+
public KubernetesDependentInformerConfig build() {
87+
return new KubernetesDependentInformerConfig(name, namespaces,
88+
followControllerNamespacesOnChange,
89+
labelSelector, onAddFilter, onUpdateFilter, onDeleteFilter, genericFilter, itemStore,
90+
informerListLimit);
91+
}
92+
}

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

+9-7
Original file line numberDiff line numberDiff line change
@@ -208,15 +208,17 @@ protected void addReferenceHandlingMetadata(R desired, P primary) {
208208
protected InformerEventSource<R, P> createEventSource(EventSourceContext<P> context) {
209209
InformerConfiguration<R> config;
210210
if (kubernetesDependentResourceConfig != null
211-
&& kubernetesDependentResourceConfig.informerConfigurationBuilder() != null) {
212-
var configBuilder = kubernetesDependentResourceConfig.informerConfigurationBuilder();
213-
configBuilder.withResourceClass(resourceType());
214-
if (configBuilder.getName() == null) {
211+
&& kubernetesDependentResourceConfig.informerConfig() != null) {
212+
213+
var configBuilder = InformerConfiguration.from(resourceType(), getPrimaryResourceType());
214+
kubernetesDependentResourceConfig.informerConfig().updateInformerConfigBuilder(configBuilder);
215+
216+
if (kubernetesDependentResourceConfig.informerConfig().getName() == null) {
215217
configBuilder.withName(name());
218+
} else {
219+
configBuilder.withName(kubernetesDependentResourceConfig.informerConfig().getName());
216220
}
217-
if (configBuilder.getSecondaryToPrimaryMapper() == null) {
218-
configBuilder.withSecondaryToPrimaryMapper(getSecondaryToPrimaryMapper().orElseThrow());
219-
}
221+
configBuilder.withSecondaryToPrimaryMapper(getSecondaryToPrimaryMapper().orElseThrow());
220222
config = configBuilder.build();
221223
} else {
222224
config = informerConfigurationBuilder()

0 commit comments

Comments
 (0)