Skip to content

Commit 7f95758

Browse files
authored
Merge pull request #2734 from PTas24/fix/kubectl_apply_npe
fix: NPE in GenericKubernetesApi if response body is empty
2 parents fdc96a7 + 96daeae commit 7f95758

File tree

2 files changed

+23
-1
lines changed

2 files changed

+23
-1
lines changed

util/src/main/java/io/kubernetes/client/util/generic/GenericKubernetesApi.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import io.kubernetes.client.openapi.ApiCallback;
2424
import io.kubernetes.client.openapi.ApiClient;
2525
import io.kubernetes.client.openapi.ApiException;
26+
import io.kubernetes.client.openapi.ApiResponse;
2627
import io.kubernetes.client.openapi.Configuration;
2728
import io.kubernetes.client.openapi.apis.CustomObjectsApi;
2829
import io.kubernetes.client.openapi.models.V1ObjectMeta;
@@ -1356,7 +1357,11 @@ private <DataType extends KubernetesType> KubernetesApiResponse<DataType> execut
13561357
ApiClient apiClient, Class<DataType> dataClass, CallBuilder callBuilder) {
13571358
try {
13581359
Call call = prepareCall(callBuilder);
1359-
JsonElement element = apiClient.<JsonElement>execute(call, JsonElement.class).getData();
1360+
ApiResponse<JsonElement> response = apiClient.execute(call, JsonElement.class);
1361+
JsonElement element = response.getData();
1362+
if (element == null) {
1363+
throw new ApiException(null, response.getStatusCode(), null, "Unexpected response body");
1364+
}
13601365
return getKubernetesApiResponse(dataClass, element, apiClient.getJSON().getGson());
13611366
} catch (ApiException e) {
13621367
return responseFromApiException(apiClient, e);

util/src/test/java/io/kubernetes/client/util/generic/GenericKubernetesApiTest.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,23 @@ public void patchNamespacedJobReturningObject() {
245245
verify(1, patchRequestedFor(urlPathEqualTo("/apis/batch/v1/namespaces/default/jobs/foo1")));
246246
}
247247

248+
@Test
249+
public void patchNamespacedJobReturningEmpty() {
250+
V1Patch v1Patch = new V1Patch("{}");
251+
stubFor(
252+
patch(urlEqualTo("/apis/batch/v1/namespaces/default/jobs/foo1"))
253+
.withHeader("Content-Type", containing(V1Patch.PATCH_FORMAT_STRATEGIC_MERGE_PATCH))
254+
.willReturn(aResponse().withStatus(200).withBody("")));
255+
KubernetesApiResponse<V1Job> jobPatchResp =
256+
jobClient.patch("default", "foo1", V1Patch.PATCH_FORMAT_STRATEGIC_MERGE_PATCH, v1Patch);
257+
258+
assertTrue(jobPatchResp.isSuccess());
259+
assertNull(jobPatchResp.getObject());
260+
assertEquals("Unexpected response body", jobPatchResp.getStatus().getMessage());
261+
assertEquals(200, jobPatchResp.getStatus().getCode().intValue());
262+
verify(1, patchRequestedFor(urlPathEqualTo("/apis/batch/v1/namespaces/default/jobs/foo1")));
263+
}
264+
248265
@Test
249266
public void watchNamespacedJobReturningObject() throws ApiException {
250267
V1JobList jobList = new V1JobList().kind("JobList").metadata(new V1ListMeta());

0 commit comments

Comments
 (0)