Skip to content

Commit 9364a33

Browse files
committed
matching improvements
1 parent 5386ed3 commit 9364a33

File tree

4 files changed

+70
-8
lines changed

4 files changed

+70
-8
lines changed

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

+16-7
Original file line numberDiff line numberDiff line change
@@ -67,11 +67,6 @@ public boolean matches(R actual, R desired, Context<?> context) {
6767
managedFieldsEntry.getFieldsV1().getAdditionalProperties(), objectMapper);
6868
removeIrrelevantValues(desiredMap);
6969

70-
// this is kind strange fix for:
71-
// https://kubernetes.slack.com/archives/C0EG7JC6T/p1685706853248489
72-
removeOwnerRefernces(desiredMap);
73-
removeOwnerRefernces(prunedActual);
74-
7570
log.trace("Pruned actual: \n {} \n desired: \n {} ", prunedActual, desiredMap);
7671

7772
return prunedActual.equals(desiredMap);
@@ -101,6 +96,10 @@ private void removeIrrelevantValues(HashMap<String, Object> desiredMap) {
10196
private void pruneActualAccordingManagedFields(Map<String, Object> result,
10297
Map<String, Object> actualMap,
10398
Map<String, Object> managedFields, ObjectMapper objectMapper) {
99+
if (managedFields.isEmpty()) {
100+
result.putAll(actualMap);
101+
return;
102+
}
104103
for (Map.Entry<String, Object> entry : managedFields.entrySet()) {
105104
String key = entry.getKey();
106105
if (key.startsWith(F_PREFIX)) {
@@ -113,13 +112,23 @@ private void pruneActualAccordingManagedFields(Map<String, Object> result,
113112
var valueList = new ArrayList<>();
114113
result.put(targetKey, valueList);
115114
for (Map.Entry<String, Object> listEntry : managedEntrySet) {
115+
var actualListEntry = selectListEntryBasedOnKey(listEntry.getKey().substring(2),
116+
(List<Map<String, Object>>) actualMap.get(targetKey), objectMapper);
117+
118+
if (listEntry.getValue() instanceof Map
119+
&& ((Map<String, Object>) listEntry.getValue()).isEmpty()) {
120+
var map = new HashMap<String, Object>();
121+
valueList.add(map);
122+
pruneActualAccordingManagedFields(map, actualListEntry,
123+
(Map<String, Object>) listEntry.getValue(), objectMapper);
124+
continue;
125+
}
126+
116127
if (DOT_KEY.equals(listEntry.getKey())) {
117128
continue;
118129
}
119130
var emptyResMapValue = new HashMap<String, Object>();
120131
valueList.add(emptyResMapValue);
121-
var actualListEntry = selectListEntryBasedOnKey(listEntry.getKey().substring(2),
122-
(List<Map<String, Object>>) actualMap.get(targetKey), objectMapper);
123132
pruneActualAccordingManagedFields(emptyResMapValue, actualListEntry,
124133
(Map<String, Object>) listEntry.getValue(), objectMapper);
125134
}

Diff for: operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/SSABasedGenericKubernetesResourceMatcherTest.java

+13-1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
import org.junit.jupiter.api.BeforeEach;
44
import org.junit.jupiter.api.Test;
55

6+
import io.fabric8.kubernetes.api.model.ConfigMap;
7+
import io.fabric8.kubernetes.api.model.HasMetadata;
68
import io.fabric8.kubernetes.api.model.apps.Deployment;
79
import io.javaoperatorsdk.operator.ReconcilerUtils;
810
import io.javaoperatorsdk.operator.api.config.ConfigurationService;
@@ -17,7 +19,7 @@ class SSABasedGenericKubernetesResourceMatcherTest {
1719

1820
Context<?> mockedContext = mock(Context.class);
1921

20-
SSABasedGenericKubernetesResourceMatcher<Deployment> matcher =
22+
SSABasedGenericKubernetesResourceMatcher<HasMetadata> matcher =
2123
new SSABasedGenericKubernetesResourceMatcher<>();
2224

2325
@BeforeEach
@@ -40,6 +42,16 @@ void checksIfAddsNotAddedByController() {
4042
assertThat(matcher.matches(actual, desired, mockedContext)).isTrue();
4143
}
4244

45+
@Test
46+
void emptyListElementMatchesAllFields() {
47+
var desiredConfigMap = loadResource("configmap.empty-owner-reference-desired.yaml",
48+
ConfigMap.class);
49+
var actualConfigMap = loadResource("configmap.empty-owner-reference.yaml",
50+
ConfigMap.class);
51+
52+
assertThat(matcher.matches(actualConfigMap, desiredConfigMap, mockedContext)).isTrue();
53+
}
54+
4355
// todo test lists with more entries
4456

4557
private <R> R loadResource(String fileName, Class<R> clazz) {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
apiVersion: v1
2+
kind: ConfigMap
3+
metadata:
4+
name: test1
5+
namespace: default
6+
ownerReferences:
7+
- apiVersion: v1
8+
kind: ConfigMap
9+
name: kube-root-ca.crt
10+
uid: 1ef74cb4-dbbd-45ef-9caf-aa76186594ea
11+
data:
12+
key1: "val1"
13+
14+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
apiVersion: v1
2+
data:
3+
key1: "val1"
4+
kind: ConfigMap
5+
metadata:
6+
creationTimestamp: "2023-06-07T11:08:34Z"
7+
managedFields:
8+
- apiVersion: v1
9+
fieldsType: FieldsV1
10+
fieldsV1:
11+
f:data:
12+
f:key1: {}
13+
f:metadata:
14+
f:ownerReferences:
15+
k:{"uid":"1ef74cb4-dbbd-45ef-9caf-aa76186594ea"}: {}
16+
manager: controller
17+
operation: Apply
18+
time: "2023-06-07T11:08:34Z"
19+
name: test1
20+
namespace: default
21+
ownerReferences:
22+
- apiVersion: v1
23+
kind: ConfigMap
24+
name: kube-root-ca.crt
25+
uid: 1ef74cb4-dbbd-45ef-9caf-aa76186594ea
26+
resourceVersion: "400"
27+
uid: 1d47f98f-ff1e-46d8-bbb5-6658ec488ae2

0 commit comments

Comments
 (0)