Skip to content

Commit ddffb97

Browse files
committed
refactor
Signed-off-by: Attila Mészáros <[email protected]>
1 parent 21aced8 commit ddffb97

File tree

8 files changed

+83
-76
lines changed

8 files changed

+83
-76
lines changed

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@
22

33
public @interface Field {
44

5-
String field();
5+
String path();
66

77
String value();
8+
9+
boolean negate() default false;
810
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package io.javaoperatorsdk.operator.api.config.informer;
2+
3+
import java.util.Arrays;
4+
import java.util.List;
5+
6+
public class FieldSelector {
7+
private final List<Field> fields;
8+
9+
public FieldSelector(List<Field> fields) {
10+
this.fields = fields;
11+
}
12+
13+
public FieldSelector(Field... fields) {
14+
this.fields = Arrays.asList(fields);
15+
}
16+
17+
public List<Field> getFields() {
18+
return fields;
19+
}
20+
21+
public record Field(String path, String value, boolean negated) {
22+
public Field(String value, String path) {
23+
this(path, value, false);
24+
}
25+
}
26+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package io.javaoperatorsdk.operator.api.config.informer;
2+
3+
import java.util.ArrayList;
4+
import java.util.List;
5+
6+
public class FieldSelectorBuilder {
7+
8+
private final List<FieldSelector.Field> fields = new ArrayList<>();
9+
10+
public FieldSelectorBuilder withField(String path, String value) {
11+
fields.add(new FieldSelector.Field(path, value));
12+
return this;
13+
}
14+
15+
public FieldSelectorBuilder withoutField(String path, String value) {
16+
fields.add(new FieldSelector.Field(path, value, true));
17+
return this;
18+
}
19+
20+
public FieldSelector build() {
21+
return new FieldSelector(fields);
22+
}
23+
}

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

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -114,9 +114,6 @@
114114
*/
115115
long informerListLimit() default NO_LONG_VALUE_SET;
116116

117-
/** Field selector for informer, for matching field with the value: field=value; */
118-
Field[] withFields() default {};
119-
120-
/** Negated field selector for informer, for non-matching field with the value: field!=value; */
121-
Field[] withoutFields() default {};
117+
/** Kubernetes field selector for additional resource filtering */
118+
Field[] fieldSelector() default {};
122119
}

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

Lines changed: 13 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,8 @@
11
package io.javaoperatorsdk.operator.api.config.informer;
22

3-
import java.util.AbstractMap;
4-
import java.util.ArrayList;
53
import java.util.Arrays;
64
import java.util.Collection;
75
import java.util.Collections;
8-
import java.util.HashMap;
9-
import java.util.List;
10-
import java.util.Map;
116
import java.util.Set;
127
import java.util.stream.Collectors;
138

@@ -42,8 +37,7 @@ public class InformerConfiguration<R extends HasMetadata> {
4237
private GenericFilter<? super R> genericFilter;
4338
private ItemStore<R> itemStore;
4439
private Long informerListLimit;
45-
private Map<String, String> withFields = new HashMap<>();
46-
private List<AbstractMap.SimpleEntry<String, String>> withoutFields = new ArrayList<>();
40+
private FieldSelector fieldSelector;
4741

4842
protected InformerConfiguration(
4943
Class<R> resourceClass,
@@ -57,8 +51,7 @@ protected InformerConfiguration(
5751
GenericFilter<? super R> genericFilter,
5852
ItemStore<R> itemStore,
5953
Long informerListLimit,
60-
Map<String, String> withFields,
61-
List<AbstractMap.SimpleEntry<String, String>> withoutFields) {
54+
FieldSelector fieldSelector) {
6255
this(resourceClass);
6356
this.name = name;
6457
this.namespaces = namespaces;
@@ -70,8 +63,7 @@ protected InformerConfiguration(
7063
this.genericFilter = genericFilter;
7164
this.itemStore = itemStore;
7265
this.informerListLimit = informerListLimit;
73-
this.withFields = withFields;
74-
this.withoutFields = withoutFields;
66+
this.fieldSelector = fieldSelector;
7567
}
7668

7769
private InformerConfiguration(Class<R> resourceClass) {
@@ -106,8 +98,7 @@ public static <R extends HasMetadata> InformerConfiguration<R>.Builder builder(
10698
original.genericFilter,
10799
original.itemStore,
108100
original.informerListLimit,
109-
original.withFields,
110-
original.withoutFields)
101+
original.fieldSelector)
111102
.builder;
112103
}
113104

@@ -278,12 +269,8 @@ public Long getInformerListLimit() {
278269
return informerListLimit;
279270
}
280271

281-
public Map<String, String> getWithFields() {
282-
return withFields;
283-
}
284-
285-
public List<AbstractMap.SimpleEntry<String, String>> getWithoutFields() {
286-
return withoutFields;
272+
public FieldSelector getFieldSelector() {
273+
return fieldSelector;
287274
}
288275

289276
@SuppressWarnings("UnusedReturnValue")
@@ -352,9 +339,11 @@ public InformerConfiguration<R>.Builder initFromAnnotation(
352339
informerListLimitValue == Constants.NO_LONG_VALUE_SET ? null : informerListLimitValue;
353340
withInformerListLimit(informerListLimit);
354341

355-
Arrays.stream(informerConfig.withFields()).forEach(f -> withField(f.field(), f.value()));
356-
Arrays.stream(informerConfig.withoutFields())
357-
.forEach(f -> withoutField(f.field(), f.value()));
342+
withFieldSelector(
343+
new FieldSelector(
344+
Arrays.stream(informerConfig.fieldSelector())
345+
.map(f -> new FieldSelector.Field(f.path(), f.value(), f.negate()))
346+
.toList()));
358347
}
359348
return this;
360349
}
@@ -451,25 +440,8 @@ public Builder withInformerListLimit(Long informerListLimit) {
451440
return this;
452441
}
453442

454-
public Builder withField(String field, String value) {
455-
InformerConfiguration.this.withFields.put(field, value);
456-
return this;
457-
}
458-
459-
public Builder withFields(Map<String, String> fields) {
460-
InformerConfiguration.this.withFields.putAll(fields);
461-
return this;
462-
}
463-
464-
/**
465-
* Note that there can be more values for the same field. Like key != value1,key != value2.
466-
*
467-
* @param field key
468-
* @param value negated
469-
* @return builder
470-
*/
471-
public Builder withoutField(String field, String value) {
472-
InformerConfiguration.this.withoutFields.add(new AbstractMap.SimpleEntry<>(field, value));
443+
public Builder withFieldSelector(FieldSelector fieldSelector) {
444+
InformerConfiguration.this.fieldSelector = fieldSelector;
473445
return this;
474446
}
475447
}

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

Lines changed: 3 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package io.javaoperatorsdk.operator.api.config.informer;
22

3-
import java.util.Map;
43
import java.util.Objects;
54
import java.util.Optional;
65
import java.util.Set;
@@ -266,18 +265,8 @@ public Builder<R> withInformerListLimit(Long informerListLimit) {
266265
return this;
267266
}
268267

269-
public Builder<R> withField(String field, String value) {
270-
config.withField(field, value);
271-
return this;
272-
}
273-
274-
public Builder<R> withFields(Map<String, String> fields) {
275-
config.withFields(fields);
276-
return this;
277-
}
278-
279-
public Builder<R> withoutField(String field, String value) {
280-
config.withoutField(field, value);
268+
public Builder<R> withFieldSelector(FieldSelector fieldSelector) {
269+
config.withFieldSelector(fieldSelector);
281270
return this;
282271
}
283272

@@ -298,11 +287,7 @@ public void updateFrom(InformerConfiguration<R> informerConfig) {
298287
.withOnDeleteFilter(informerConfig.getOnDeleteFilter())
299288
.withGenericFilter(informerConfig.getGenericFilter())
300289
.withInformerListLimit(informerConfig.getInformerListLimit())
301-
.withFields(informerConfig.getWithFields());
302-
303-
informerConfig
304-
.getWithoutFields()
305-
.forEach(f -> config.withoutField(f.getKey(), f.getValue()));
290+
.withFieldSelector(informerConfig.getFieldSelector());
306291
}
307292
}
308293

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/source/informer/InformerManager.java

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -135,14 +135,14 @@ private InformerWrapper<R> createEventSource(
135135
String namespaceIdentifier) {
136136
final var informerConfig = configuration.getInformerConfig();
137137

138-
if (!informerConfig.getWithFields().isEmpty()) {
139-
filteredBySelectorClient =
140-
filteredBySelectorClient.withFields(informerConfig.getWithFields());
141-
}
142-
143-
if (!informerConfig.getWithoutFields().isEmpty()) {
144-
for (var e : informerConfig.getWithoutFields()) {
145-
filteredBySelectorClient = filteredBySelectorClient.withoutField(e.getKey(), e.getValue());
138+
if (informerConfig.getFieldSelector() != null
139+
&& !informerConfig.getFieldSelector().getFields().isEmpty()) {
140+
for (var f : informerConfig.getFieldSelector().getFields()) {
141+
if (f.negated()) {
142+
filteredBySelectorClient = filteredBySelectorClient.withoutField(f.path(), f.value());
143+
} else {
144+
filteredBySelectorClient = filteredBySelectorClient.withField(f.path(), f.value());
145+
}
146146
}
147147
}
148148

operator-framework/src/test/java/io/javaoperatorsdk/operator/baseapi/fieldselector/FieldSelectorTestReconciler.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
import io.fabric8.kubernetes.api.model.Secret;
1010
import io.javaoperatorsdk.operator.api.config.informer.Field;
11+
import io.javaoperatorsdk.operator.api.config.informer.FieldSelectorBuilder;
1112
import io.javaoperatorsdk.operator.api.config.informer.Informer;
1213
import io.javaoperatorsdk.operator.api.config.informer.InformerEventSourceConfiguration;
1314
import io.javaoperatorsdk.operator.api.reconciler.Context;
@@ -22,8 +23,8 @@
2223
@ControllerConfiguration(
2324
informer =
2425
@Informer(
25-
withFields =
26-
@Field(field = "type", value = FieldSelectorTestReconciler.MY_SECRET_TYPE)))
26+
fieldSelector =
27+
@Field(path = "type", value = FieldSelectorTestReconciler.MY_SECRET_TYPE)))
2728
public class FieldSelectorTestReconciler implements Reconciler<Secret>, TestExecutionInfoProvider {
2829

2930
public static final String MY_SECRET_TYPE = "my-secret-type";
@@ -54,7 +55,8 @@ public List<EventSource<?, Secret>> prepareEventSources(EventSourceContext<Secre
5455
new InformerEventSource<>(
5556
InformerEventSourceConfiguration.from(Secret.class, Secret.class)
5657
.withNamespacesInheritedFromController()
57-
.withField("type", OTHER_SECRET_TYPE)
58+
.withFieldSelector(
59+
new FieldSelectorBuilder().withField("type", OTHER_SECRET_TYPE).build())
5860
.build(),
5961
context);
6062

0 commit comments

Comments
 (0)