Skip to content

Commit aacd5c6

Browse files
committed
updating the integration test
also testing the exclusion in the ssa matching
1 parent 572814f commit aacd5c6

File tree

5 files changed

+56
-27
lines changed

5 files changed

+56
-27
lines changed

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

+3-2
Original file line numberDiff line numberDiff line change
@@ -148,9 +148,10 @@ public R update(R actual, R target, P primary, Context<P> context) {
148148
}
149149

150150
void addPreviousAnnotation(String resourceVersion, HasMetadata target) {
151-
String id = ((InformerEventSource<HasMetadata, HasMetadata>) eventSource().orElseThrow()).getId();
151+
String id =
152+
((InformerEventSource<HasMetadata, HasMetadata>) eventSource().orElseThrow()).getId();
152153
target.getMetadata().getAnnotations().put(PREVIOUS_ANNOTATION_KEY,
153-
id + resourceVersion != null ? ("," + resourceVersion) : "");
154+
id + Optional.ofNullable(resourceVersion).map(rv -> "," + rv).orElse(""));
154155
}
155156

156157
@Override

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

+4-2
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
// see also: https://kubernetes.slack.com/archives/C0123CNN8F3/p1686141087220719
4141
public class SSABasedGenericKubernetesResourceMatcher<R extends HasMetadata> {
4242

43+
private static final String ANNOTATIONS_KEY = "annotations";
4344
@SuppressWarnings("rawtypes")
4445
private static final SSABasedGenericKubernetesResourceMatcher INSTANCE =
4546
new SSABasedGenericKubernetesResourceMatcher<>();
@@ -101,9 +102,10 @@ public boolean matches(R actual, R desired, Context<?> context) {
101102
return prunedActual.equals(desiredMap);
102103
}
103104

104-
private void removeSDKAnnotations(HashMap<String, Object> prunedActual) {
105+
@SuppressWarnings("unchecked")
106+
private static void removeSDKAnnotations(HashMap<String, Object> prunedActual) {
105107
Optional.ofNullable(((Map<String, Object>) prunedActual.get(METADATA_KEY)))
106-
.ifPresent(m -> m.computeIfPresent("annotations",
108+
.ifPresent(m -> m.computeIfPresent(ANNOTATIONS_KEY,
107109
(k, v) -> {
108110
var annotations = (Map<String, Object>) v;
109111
annotations.remove(KubernetesDependentResource.PREVIOUS_ANNOTATION_KEY);

operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/event/source/informer/InformerEventSourceTest.java

+10-4
Original file line numberDiff line numberDiff line change
@@ -82,15 +82,20 @@ void skipsEventPropagationIfResourceWithSameVersionInResourceCache() {
8282
@Test
8383
void skipsAddEventPropagationViaAnnotation() {
8484
informerEventSource.onAdd(new DeploymentBuilder(testDeployment()).editMetadata()
85-
.addToAnnotations(KubernetesDependentResource.PREVIOUS_ANNOTATION_KEY, informerEventSource.getId()).endMetadata().build());
85+
.addToAnnotations(KubernetesDependentResource.PREVIOUS_ANNOTATION_KEY,
86+
informerEventSource.getId())
87+
.endMetadata().build());
8688

8789
verify(eventHandlerMock, never()).handleEvent(any());
8890
}
8991

9092
@Test
9193
void skipsUpdateEventPropagationViaAnnotation() {
92-
informerEventSource.onUpdate(testDeployment(), new DeploymentBuilder(testDeployment()).editMetadata()
93-
.addToAnnotations(KubernetesDependentResource.PREVIOUS_ANNOTATION_KEY, informerEventSource.getId() + ",1").endMetadata().build());
94+
informerEventSource.onUpdate(testDeployment(),
95+
new DeploymentBuilder(testDeployment()).editMetadata()
96+
.addToAnnotations(KubernetesDependentResource.PREVIOUS_ANNOTATION_KEY,
97+
informerEventSource.getId() + ",1")
98+
.endMetadata().build());
9499

95100
verify(eventHandlerMock, never()).handleEvent(any());
96101
}
@@ -105,7 +110,8 @@ void processEventPropagationWithoutAnnotation() {
105110
@Test
106111
void processEventPropagationWithIncorrectAnnotation() {
107112
informerEventSource.onAdd(new DeploymentBuilder(testDeployment()).editMetadata()
108-
.addToAnnotations(KubernetesDependentResource.PREVIOUS_ANNOTATION_KEY, "invalid").endMetadata().build());
113+
.addToAnnotations(KubernetesDependentResource.PREVIOUS_ANNOTATION_KEY, "invalid")
114+
.endMetadata().build());
109115

110116
verify(eventHandlerMock, times(1)).handleEvent(any());
111117
}

operator-framework-core/src/test/resources/io/javaoperatorsdk/operator/processing/dependent/kubernetes/deployment-with-managed-fields.yaml

+5
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,17 @@ kind: Deployment
33
metadata:
44
annotations:
55
deployment.kubernetes.io/revision: "1"
6+
javaoperatorsdk.io/previous: "abc,400"
67
creationTimestamp: "2023-06-01T08:43:47Z"
78
generation: 1
89
managedFields:
910
- apiVersion: apps/v1
1011
fieldsType: FieldsV1
1112
fieldsV1:
13+
f:metadata:
14+
f:annotations:
15+
.: {}
16+
f:javaoperatorsdk.io/previous: {}
1217
f:spec:
1318
f:progressDeadlineSeconds: {}
1419
f:replicas: {}

operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/createupdateeventfilter/CreateUpdateEventFilterTestReconciler.java

+34-19
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
import io.javaoperatorsdk.operator.api.reconciler.Reconciler;
1717
import io.javaoperatorsdk.operator.api.reconciler.UpdateControl;
1818
import io.javaoperatorsdk.operator.junit.KubernetesClientAware;
19-
import io.javaoperatorsdk.operator.processing.event.ResourceID;
19+
import io.javaoperatorsdk.operator.processing.dependent.kubernetes.CRUDKubernetesDependentResource;
2020
import io.javaoperatorsdk.operator.processing.event.source.EventSource;
2121
import io.javaoperatorsdk.operator.processing.event.source.informer.InformerEventSource;
2222

@@ -26,10 +26,35 @@ public class CreateUpdateEventFilterTestReconciler
2626
EventSourceInitializer<CreateUpdateEventFilterTestCustomResource>,
2727
KubernetesClientAware {
2828

29+
private static final class DirectConfigMapDependentResource
30+
extends
31+
CRUDKubernetesDependentResource<ConfigMap, CreateUpdateEventFilterTestCustomResource> {
32+
33+
private ConfigMap desired;
34+
35+
private DirectConfigMapDependentResource(Class<ConfigMap> resourceType) {
36+
super(resourceType);
37+
}
38+
39+
@Override
40+
protected ConfigMap desired(CreateUpdateEventFilterTestCustomResource primary,
41+
Context<CreateUpdateEventFilterTestCustomResource> context) {
42+
return desired;
43+
}
44+
45+
@Override
46+
public void setEventSource(
47+
io.javaoperatorsdk.operator.processing.event.source.informer.InformerEventSource<ConfigMap, CreateUpdateEventFilterTestCustomResource> eventSource) {
48+
super.setEventSource(eventSource);
49+
}
50+
}
51+
2952
public static final String CONFIG_MAP_TEST_DATA_KEY = "key";
3053
private KubernetesClient client;
3154
private final AtomicInteger numberOfExecutions = new AtomicInteger(0);
3255
private InformerEventSource<ConfigMap, CreateUpdateEventFilterTestCustomResource> informerEventSource;
56+
private DirectConfigMapDependentResource configMapDR =
57+
new DirectConfigMapDependentResource(ConfigMap.class);
3358

3459
@Override
3560
public UpdateControl<CreateUpdateEventFilterTestCustomResource> reconcile(
@@ -44,28 +69,14 @@ public UpdateControl<CreateUpdateEventFilterTestCustomResource> reconcile(
4469
.withName(resource.getMetadata().getName())
4570
.get();
4671
if (configMap == null) {
47-
var configMapToCreate = createConfigMap(resource);
48-
final var resourceID = ResourceID.fromResource(configMapToCreate);
49-
configMap =
50-
client
51-
.configMaps()
52-
.inNamespace(resource.getMetadata().getNamespace())
53-
.resource(configMapToCreate)
54-
.create();
55-
informerEventSource.handleRecentResourceCreate(resourceID, configMap);
72+
configMapDR.desired = createConfigMap(resource);
73+
configMapDR.reconcile(resource, context);
5674
} else {
57-
ResourceID resourceID = ResourceID.fromResource(configMap);
5875
if (!Objects.equals(
5976
configMap.getData().get(CONFIG_MAP_TEST_DATA_KEY), resource.getSpec().getValue())) {
6077
configMap.getData().put(CONFIG_MAP_TEST_DATA_KEY, resource.getSpec().getValue());
61-
var newConfigMap =
62-
client
63-
.configMaps()
64-
.inNamespace(resource.getMetadata().getNamespace())
65-
.resource(configMap)
66-
.replace();
67-
informerEventSource.handleRecentResourceUpdate(resourceID,
68-
newConfigMap, configMap);
78+
configMapDR.desired = configMap;
79+
configMapDR.reconcile(resource, context);
6980
}
7081
}
7182
return UpdateControl.noUpdate();
@@ -94,6 +105,10 @@ public Map<String, EventSource> prepareEventSources(
94105
.build();
95106
informerEventSource =
96107
new InformerEventSource<>(informerConfiguration, client);
108+
109+
this.configMapDR.setKubernetesClient(context.getClient());
110+
this.configMapDR.setEventSource(informerEventSource);
111+
97112
return EventSourceInitializer.nameEventSources(informerEventSource);
98113
}
99114

0 commit comments

Comments
 (0)