File tree

3 files changed

+79
-13
lines changed

3 files changed

+79
-13
lines changed
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package io.javaoperatorsdk.operator.api.config.informer;
22

3+
import java.util.Map;
34
import java.util.Objects;
45
import java.util.Optional;
56
import java.util.Set;
@@ -265,6 +266,21 @@ public Builder<R> withInformerListLimit(Long informerListLimit) {
265266
return this;
266267
}
267268

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);
281+
return this;
282+
}
283+
268284
public void updateFrom(InformerConfiguration<R> informerConfig) {
269285
if (informerConfig != null) {
270286
final var informerConfigName = informerConfig.getName();
@@ -281,7 +297,12 @@ public void updateFrom(InformerConfiguration<R> informerConfig) {
281297
.withOnUpdateFilter(informerConfig.getOnUpdateFilter())
282298
.withOnDeleteFilter(informerConfig.getOnDeleteFilter())
283299
.withGenericFilter(informerConfig.getGenericFilter())
284-
.withInformerListLimit(informerConfig.getInformerListLimit());
300+
.withInformerListLimit(informerConfig.getInformerListLimit())
301+
.withFields(informerConfig.getWithFields());
302+
303+
informerConfig
304+
.getWithoutFields()
305+
.forEach(f -> config.withoutField(f.getKey(), f.getValue()));
285306
}
286307
}
287308

Original file line numberDiff line numberDiff line change
@@ -1,23 +1,25 @@
11
package io.javaoperatorsdk.operator.baseapi.fieldselector;
22

33
import java.time.Duration;
4-
import java.util.Map;
54

65
import org.junit.jupiter.api.Test;
76
import org.junit.jupiter.api.extension.RegisterExtension;
87

98
import io.fabric8.kubernetes.api.model.ObjectMetaBuilder;
109
import io.fabric8.kubernetes.api.model.SecretBuilder;
1110
import io.javaoperatorsdk.operator.junit.LocallyRunOperatorExtension;
11+
import io.javaoperatorsdk.operator.processing.event.ResourceID;
1212

1313
import static io.javaoperatorsdk.operator.baseapi.fieldselector.FieldSelectorTestReconciler.MY_SECRET_TYPE;
14+
import static io.javaoperatorsdk.operator.baseapi.fieldselector.FieldSelectorTestReconciler.OTHER_SECRET_TYPE;
1415
import static org.assertj.core.api.Assertions.assertThat;
1516
import static org.awaitility.Awaitility.await;
1617

1718
class FieldSelectorIT {
1819

1920
public static final String TEST_1 = "test1";
2021
public static final String TEST_2 = "test2";
22+
public static final String TEST_3 = "test3";
2123

2224
@RegisterExtension
2325
LocallyRunOperatorExtension extension =
@@ -28,25 +30,44 @@ class FieldSelectorIT {
2830
@Test
2931
void filtersCustomResourceByLabel() {
3032

31-
extension.create(
32-
new SecretBuilder()
33-
.withMetadata(new ObjectMetaBuilder().withName(TEST_1).build())
34-
.withStringData(Map.of("key1", "value1"))
35-
.withType(MY_SECRET_TYPE)
36-
.build());
33+
var customPrimarySecret =
34+
extension.create(
35+
new SecretBuilder()
36+
.withMetadata(new ObjectMetaBuilder().withName(TEST_1).build())
37+
.withType(MY_SECRET_TYPE)
38+
.build());
3739

38-
extension.create(
39-
new SecretBuilder()
40-
.withMetadata(new ObjectMetaBuilder().withName(TEST_2).build())
41-
.withStringData(Map.of("key2", "value2"))
42-
.build());
40+
var otherSecret =
41+
extension.create(
42+
new SecretBuilder()
43+
.withMetadata(new ObjectMetaBuilder().withName(TEST_2).build())
44+
.build());
45+
46+
var dependentSecret =
47+
extension.create(
48+
new SecretBuilder()
49+
.withMetadata(new ObjectMetaBuilder().withName(TEST_3).build())
50+
.withType(OTHER_SECRET_TYPE)
51+
.build());
4352

4453
await()
4554
.pollDelay(Duration.ofMillis(150))
4655
.untilAsserted(
4756
() -> {
4857
var r = extension.getReconcilerOfType(FieldSelectorTestReconciler.class);
4958
assertThat(r.getReconciledSecrets()).containsExactly(TEST_1);
59+
60+
assertThat(
61+
r.getDependentSecretEventSource()
62+
.get(ResourceID.fromResource(dependentSecret)))
63+
.isPresent();
64+
assertThat(
65+
r.getDependentSecretEventSource()
66+
.get(ResourceID.fromResource(customPrimarySecret)))
67+
.isNotPresent();
68+
assertThat(
69+
r.getDependentSecretEventSource().get(ResourceID.fromResource(otherSecret)))
70+
.isNotPresent();
5071
});
5172
}
5273
}
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,21 @@
22

33
import java.util.Collections;
44
import java.util.HashSet;
5+
import java.util.List;
56
import java.util.Set;
67
import java.util.concurrent.atomic.AtomicInteger;
78

89
import io.fabric8.kubernetes.api.model.Secret;
910
import io.javaoperatorsdk.operator.api.config.informer.Field;
1011
import io.javaoperatorsdk.operator.api.config.informer.Informer;
12+
import io.javaoperatorsdk.operator.api.config.informer.InformerEventSourceConfiguration;
1113
import io.javaoperatorsdk.operator.api.reconciler.Context;
1214
import io.javaoperatorsdk.operator.api.reconciler.ControllerConfiguration;
15+
import io.javaoperatorsdk.operator.api.reconciler.EventSourceContext;
1316
import io.javaoperatorsdk.operator.api.reconciler.Reconciler;
1417
import io.javaoperatorsdk.operator.api.reconciler.UpdateControl;
18+
import io.javaoperatorsdk.operator.processing.event.source.EventSource;
19+
import io.javaoperatorsdk.operator.processing.event.source.informer.InformerEventSource;
1520
import io.javaoperatorsdk.operator.support.TestExecutionInfoProvider;
1621

1722
@ControllerConfiguration(
@@ -22,9 +27,11 @@
2227
public class FieldSelectorTestReconciler implements Reconciler<Secret>, TestExecutionInfoProvider {
2328

2429
public static final String MY_SECRET_TYPE = "my-secret-type";
30+
public static final String OTHER_SECRET_TYPE = "my-dependent-secret-type";
2531
private final AtomicInteger numberOfExecutions = new AtomicInteger(0);
2632

2733
private Set<String> reconciledSecrets = Collections.synchronizedSet(new HashSet<>());
34+
private InformerEventSource<Secret, Secret> dependentSecretEventSource;
2835

2936
@Override
3037
public UpdateControl<Secret> reconcile(Secret resource, Context<Secret> context) {
@@ -40,4 +47,21 @@ public int getNumberOfExecutions() {
4047
public Set<String> getReconciledSecrets() {
4148
return reconciledSecrets;
4249
}
50+
51+
@Override
52+
public List<EventSource<?, Secret>> prepareEventSources(EventSourceContext<Secret> context) {
53+
dependentSecretEventSource =
54+
new InformerEventSource<>(
55+
InformerEventSourceConfiguration.from(Secret.class, Secret.class)
56+
.withNamespacesInheritedFromController()
57+
.withField("type", OTHER_SECRET_TYPE)
58+
.build(),
59+
context);
60+
61+
return List.of(dependentSecretEventSource);
62+
}
63+
64+
public InformerEventSource<Secret, Secret> getDependentSecretEventSource() {
65+
return dependentSecretEventSource;
66+
}
4367
}

0 commit comments

Comments
 (0)