Skip to content

Commit 6021f2d

Browse files
committed
imporve diff logging
Signed-off-by: bachmanity1 <bachmanity138@gmail.com>
1 parent 7ba6f8a commit 6021f2d

File tree

2 files changed

+52
-7
lines changed

2 files changed

+52
-7
lines changed

operator-framework-core/pom.xml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,6 @@
5858
<dependency>
5959
<groupId>org.assertj</groupId>
6060
<artifactId>assertj-core</artifactId>
61-
<scope>test</scope>
6261
</dependency>
6362
<dependency>
6463
<groupId>io.fabric8</groupId>

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

Lines changed: 52 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import java.util.Arrays;
66
import java.util.Collections;
77
import java.util.HashMap;
8+
import java.util.LinkedHashMap;
89
import java.util.List;
910
import java.util.Map;
1011
import java.util.Map.Entry;
@@ -13,6 +14,7 @@
1314
import java.util.SortedMap;
1415
import java.util.TreeMap;
1516

17+
import org.assertj.core.util.diff.DiffUtils;
1618
import org.slf4j.Logger;
1719
import org.slf4j.LoggerFactory;
1820

@@ -104,19 +106,63 @@ public boolean matches(R actual, R desired, Context<?> context) {
104106
removeIrrelevantValues(desiredMap);
105107

106108
if (LoggingUtils.isNotSensitiveResource(desired)) {
107-
logDiff(prunedActual, desiredMap, objectMapper);
109+
var diff = getDiff(prunedActual, desiredMap, objectMapper);
110+
if (diff != null) {
111+
log.debug("Diff between actual and desired state for resource: {} with name: {} in namespace: {} is: \n{}",
112+
actual.getKind(), actual.getMetadata().getName(), actual.getMetadata().getNamespace(), diff);
113+
}
108114
}
109115

110116
return prunedActual.equals(desiredMap);
111117
}
112118

113-
private void logDiff(Map<String, Object> prunedActualMap, Map<String, Object> desiredMap,
114-
KubernetesSerialization serialization) {
119+
private String getDiff(Map<String, Object> prunedActualMap, Map<String, Object> desiredMap,
120+
KubernetesSerialization serialization) {
115121
if (log.isDebugEnabled()) {
116-
var actualYaml = serialization.asYaml(prunedActualMap);
117-
var desiredYaml = serialization.asYaml(desiredMap);
118-
log.debug("Pruned actual yaml: \n {} \n desired yaml: \n {} ", actualYaml, desiredYaml);
122+
var actualLines = serialization.asYaml(sortMap(prunedActualMap)).lines().toList();
123+
var desiredLines = serialization.asYaml(sortMap(desiredMap)).lines().toList();
124+
125+
var patch = DiffUtils.diff(actualLines, desiredLines);
126+
List<String> unifiedDiff = DiffUtils.generateUnifiedDiff("", "", actualLines, patch, 0);
127+
return unifiedDiff.isEmpty() ? null : String.join("\n", unifiedDiff);
128+
}
129+
return null;
130+
}
131+
132+
@SuppressWarnings("unchecked")
133+
private Map<String, Object> sortMap(Map<String, Object> map) {
134+
List<String> sortedKeys = new ArrayList<>(map.keySet());
135+
Collections.sort(sortedKeys);
136+
137+
Map<String, Object> sortedMap = new LinkedHashMap<>();
138+
for (String key : sortedKeys) {
139+
Object value = map.get(key);
140+
if (value instanceof Map) {
141+
Map<String, Object> nestedMap = (Map<String, Object>) value;
142+
sortedMap.put(key, sortMap(nestedMap));
143+
} else if (value instanceof List) {
144+
sortedMap.put(key, sortList((List<?>) value));
145+
} else {
146+
sortedMap.put(key, value);
147+
}
148+
}
149+
return sortedMap;
150+
}
151+
152+
@SuppressWarnings("unchecked")
153+
private List<?> sortList(List<?> list) {
154+
List<Object> sortedList = new ArrayList<>();
155+
for (Object item : list) {
156+
if (item instanceof Map) {
157+
Map<String, Object> mapItem = (Map<String, Object>) item;
158+
sortedList.add(sortMap(mapItem));
159+
} else if (item instanceof List) {
160+
sortedList.add(sortList((List<?>) item));
161+
} else {
162+
sortedList.add(item);
163+
}
119164
}
165+
return sortedList;
120166
}
121167

122168
/**

0 commit comments

Comments
 (0)