Skip to content

Commit 6eb2486

Browse files
authored
fix: checking for null to avoid NPE with SSA matching (#3037)
closes: #3034 Signed-off-by: Steve Hawkins <shawkins@redhat.com>
1 parent c27b0c6 commit 6eb2486

File tree

3 files changed

+467
-0
lines changed

3 files changed

+467
-0
lines changed

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -320,6 +320,10 @@ private static void handleListKeyEntrySet(
320320
result.put(keyInActual, valueList);
321321
var actualValueList = (List<Map<String, Object>>) actualMap.get(keyInActual);
322322

323+
if (actualValueList == null) {
324+
return;
325+
}
326+
323327
var targetValuesByIndex = new TreeMap<Integer, Map<String, Object>>();
324328
var managedEntryByIndex = new HashMap<Integer, Map<String, Object>>();
325329

@@ -396,6 +400,11 @@ private static void handleSetValues(
396400
continue;
397401
}
398402
var values = (List<?>) actualMap.get(keyInActual);
403+
404+
if (values == null || values.isEmpty()) {
405+
continue;
406+
}
407+
399408
var targetClass = (values.get(0) instanceof Map) ? null : values.get(0).getClass();
400409
var value = parseKeyValue(keyWithoutPrefix(valueEntry.getKey()), targetClass, objectMapper);
401410
valueList.add(value);

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

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,29 @@ void setup() {
4949
when(mockedContext.getControllerConfiguration()).thenReturn(controllerConfiguration);
5050
}
5151

52+
@Test
53+
void statefulSetWithMissingManagedField() {
54+
var actual = loadResource("statefulset-with-managed-fields-missing.yaml", StatefulSet.class);
55+
var desired =
56+
actual
57+
.edit()
58+
.editMetadata()
59+
.withManagedFields(List.of())
60+
.endMetadata()
61+
.editSpec()
62+
.editTemplate()
63+
.editSpec()
64+
.editFirstContainer()
65+
.withImage("new")
66+
.endContainer()
67+
.endSpec()
68+
.endTemplate()
69+
.endSpec()
70+
.build();
71+
72+
assertThat(matcher.matches(actual, desired, mockedContext)).isFalse();
73+
}
74+
5275
@Test
5376
void noMatchWhenNoMatchingController() {
5477
var desired = loadResource("nginx-deployment.yaml", Deployment.class);

0 commit comments

Comments
 (0)