diff --git a/CHANGELOG.md b/CHANGELOG.md index a1a4c27650b..3d8101f713e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ ### 6.2-SNAPSHOT #### Bugs +* Fix #4478: Removing the resourceVersion bump with null status * Fix #4369: Informers will retry with a backoff on list/watch failure as they did in 5.12 and prior. * Fix #4350: SchemaSwap annotation is now repeatable and is applied multiple times if classes are used more than once in the class hierarchy. * Fix #3733: The authentication command from the .kube/config won't be discarded if no arguments are specified diff --git a/junit/kubernetes-server-mock/src/main/java/io/fabric8/kubernetes/client/server/mock/crud/PatchHandler.java b/junit/kubernetes-server-mock/src/main/java/io/fabric8/kubernetes/client/server/mock/crud/PatchHandler.java index a3bba34b44f..544d808ca64 100644 --- a/junit/kubernetes-server-mock/src/main/java/io/fabric8/kubernetes/client/server/mock/crud/PatchHandler.java +++ b/junit/kubernetes-server-mock/src/main/java/io/fabric8/kubernetes/client/server/mock/crud/PatchHandler.java @@ -67,7 +67,7 @@ public MockResponse handle(String path, String contentType, String requestBody) final JsonNode updatedResource; if (isStatusPath(path)) { updatedResource = currentResource.deepCopy(); - setStatus(updatedResource, fullPatch.path(STATUS)); + setStatus(updatedResource, fullPatch.get(STATUS)); } else { updatedResource = fullPatch; // preserve original status (PATCH requests to the custom resource ignore changes to the status stanza) diff --git a/junit/kubernetes-server-mock/src/main/java/io/fabric8/kubernetes/client/server/mock/crud/PutHandler.java b/junit/kubernetes-server-mock/src/main/java/io/fabric8/kubernetes/client/server/mock/crud/PutHandler.java index 774cbe92162..47d456938d7 100644 --- a/junit/kubernetes-server-mock/src/main/java/io/fabric8/kubernetes/client/server/mock/crud/PutHandler.java +++ b/junit/kubernetes-server-mock/src/main/java/io/fabric8/kubernetes/client/server/mock/crud/PutHandler.java @@ -48,12 +48,12 @@ public MockResponse handle(String path, String contentType, String requestBody) final JsonNode updatedResource; if (isStatusPath(path)) { updatedResource = currentResource.deepCopy(); - setStatus(updatedResource, persistence.asNode(requestBody).path(STATUS)); + setStatus(updatedResource, persistence.asNode(requestBody).get(STATUS)); } else { updatedResource = persistence.asNode(requestBody); // preserve original status (PUT requests to the custom resource ignore changes to the status stanza) if (persistence.isStatusSubresourceEnabledForResource(path)) { - setStatus(updatedResource, currentResource.path(STATUS)); + setStatus(updatedResource, currentResource.get(STATUS)); } } validatePath(attributes, updatedResource); diff --git a/kubernetes-tests/src/test/java/io/fabric8/kubernetes/client/mock/CustomResourceCrudTest.java b/kubernetes-tests/src/test/java/io/fabric8/kubernetes/client/mock/CustomResourceCrudTest.java index 8f75d6bbed7..ee0c0b4cc14 100644 --- a/kubernetes-tests/src/test/java/io/fabric8/kubernetes/client/mock/CustomResourceCrudTest.java +++ b/kubernetes-tests/src/test/java/io/fabric8/kubernetes/client/mock/CustomResourceCrudTest.java @@ -195,6 +195,30 @@ void testStatusPatch() { assertNotNull(result.getStatus()); } + @Test + void testNullStatus() { + CronTab cronTab = createCronTab("my-new-cron-object", "* * * * */5", 3, "my-awesome-cron-image"); + + NonNamespaceOperation, Resource> cronTabClient = client + .resources(CronTab.class).inNamespace("test-ns"); + + CronTab result = cronTabClient.resource(cronTab).create(); + + // should be null after create + assertNull(result.getStatus()); + String resourceVersion = result.getMetadata().getResourceVersion(); + + // should be a no-op + result = cronTabClient.resource(result).patchStatus(); + assertNull(result.getStatus()); + assertEquals(resourceVersion, result.getMetadata().getResourceVersion()); + + // should be a no-op + result = cronTabClient.resource(result).replace(); + assertNull(result.getStatus()); + assertEquals(resourceVersion, result.getMetadata().getResourceVersion()); + } + void assertCronTab(CronTab cronTab, String name, String cronTabSpec, int replicas, String image) { assertEquals(name, cronTab.getMetadata().getName()); assertEquals(cronTabSpec, cronTab.getSpec().getCronSpec());