8000 Merge pull request #1470 from dsyer/status_writer · tony-clarke-amdocs/java@614f0de · GitHub 8000
[go: up one dir, main page]

Skip to content

Commit 614f0de

Browse files
authored
Merge pull request kubernetes-client#1470 from dsyer/status_writer
Add updateStatus() convenience methods to GenericKubernetesApi
2 parents 2e8d23b + e685afe commit 614f0de

File tree

2 files changed

+114
-0
lines changed

2 files changed

+114
-0
lines changed

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

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@
3737
import io.kubernetes.client.util.generic.options.PatchOptions;
3838
import io.kubernetes.client.util.generic.options.UpdateOptions;
3939
import java.io.IOException;
40+
import java.util.Arrays;
41+
import java.util.function.Function;
4042
import okhttp3.Call;
4143
import okhttp3.HttpUrl;
4244

@@ -476,6 +478,63 @@ public KubernetesApiResponse<ApiType> update(ApiType object, final UpdateOptions
476478
});
477479
}
478480

481+
/**
482+
* Create kubernetes api response, if the namespace in the object is present, it will send a
483+
* namespace-scoped requests, vice versa.
484+
*
485+
* @param object the object
486+
* @param status function to extract the status from the object
487+
* @return the kubernetes api response
488+
*/
489+
public KubernetesApiResponse<ApiType> updateStatus(
490+
ApiType object, Function<ApiType, Object> status) {
491+
return updateStatus(object, status, new UpdateOptions());
492+
}
493+
494+
/**
495+
* Update status of kubernetes api response.
496+
*
497+
* @param object the object
498+
* @param status function to extract the status from the object
499+
* @param updateOptions the update options
500+
* @return the kubernetes api response
501+
*/
502+
public KubernetesApiResponse<ApiType> updateStatus(
503+
ApiType object, Function<ApiType, Object> status, final UpdateOptions updateOptions) {
504+
V1ObjectMeta objectMeta = object.getMetadata();
505+
return executeCall(
506+
customObjectsApi.getApiClient(),
507+
apiTypeClass,
508+
() -> {
509+
//// TODO(yue9944882): judge namespaced object via api discovery
510+
boolean isNamespaced = !Strings.isNullOrEmpty(objectMeta.getNamespace());
511+
if (isNamespaced) {
512+
return customObjectsApi.patchNamespacedCustomObjectStatusCall(
513+
this.apiGroup,
514+
this.apiVersion,
515+
objectMeta.getNamespace(),
516+
this.resourcePlural,
517+
objectMeta.getName(),
518+
Arrays.asList(new StatusPatch(status.apply(object))),
519+
updateOptions.getDryRun(),
520+
updateOptions.getFieldManager(),
521+
null,
522+
null);
523+
} else {
524+
return customObjectsApi.patchClusterCustomObjectStatusCall(
525+
this.apiGroup,
526+
this.apiVersion,
527+
this.resourcePlural,
528+
objectMeta.getName(),
529+
Arrays.asList(new StatusPatch(status.apply(object))),
530+
updateOptions.getDryRun(),
531+
updateOptions.getFieldManager(),
532+
null,
533+
null);
534+
}
535+
});
536+
}
537+
479538
/**
480539
* Patch kubernetes api response.
481540
*
@@ -771,4 +830,41 @@ private Call tweakCallForCoreV1Group(Call call) {
771830
.getHttpClient()
772831
.newCall(call.request().newBuilder().url(tweakedUrl).build());
773832
}
833+
834+
public static class StatusPatch {
835+
836+
private String op = "replace";
837+
838+
private String path = "/status";
839+
840+
private Object value;
841+
842+
public StatusPatch(Object value) {
843+
this.value = value;
844+
}
845+
846+
public String getOp() {
847+
return op;
848+
}
849+
850+
public void setOp(String op) {
851+
this.op = op;
852+
}
853+
854+
public String getPath() {
855+
return path;
856+
}
857+
858+
public void setPath(String path) {
859+
this.path = path;
860+
}
861+
862+
public Object getValue() {
863+
return value;
864+
}
865+
866+
public void setValue(Object value) {
867+
this.value = value;
868+
}
869+
}
774870
}

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

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import io.kubernetes.client.openapi.ApiException;
2323
import io.kubernetes.client.openapi.models.V1Job;
2424
import io.kubernetes.client.openapi.models.V1JobList;
25+
import io.kubernetes.client.openapi.models.V1JobStatus;
2526
import io.kubernetes.client.openapi.models.V1ListMeta;
2627
import io.kubernetes.client.openapi.models.V1ObjectMeta;
2728
import io.kubernetes.client.openapi.models.V1Status;
@@ -152,6 +153,23 @@ public void updateNamespacedJobReturningObject() {
152153
verify(1, putRequestedFor(urlPathEqualTo("/apis/batch/v1/namespaces/default/jobs/foo1")));
153154
}
154155

156+
@Test
157+
public void updateStatusNamespacedJobReturningObject() {
158+
V1Job foo1 =
159+
new V1Job().kind("Job").metadata(new V1ObjectMeta().namespace("default").name("foo1"));
160+
foo1.setStatus(new V1JobStatus().failed(1));
161+
162+
stubFor(
163+
patch(urlEqualTo("/apis/batch/v1/namespaces/default/jobs/foo1/status"))
164+
.willReturn(aResponse().withStatus(200).withBody(new Gson().toJson(foo1))));
165+
KubernetesApiResponse<V1Job> jobListResp = jobClient.updateStatus(foo1, t -> t.getStatus());
166+
assertTrue(jobListResp.isSuccess());
167+
assertEquals(foo1, jobListResp.getObject());
168+
assertNull(jobListResp.getStatus());
169+
verify(
170+
1, patchRequestedFor(urlPathEqualTo("/apis/batch/v1/namespaces/default/jobs/foo1/status")));
171+
}
172+
155173
@Test
156174
public void patchNamespacedJobReturningObject() {
157175
V1Patch v1Patch = new V1Patch("{}");

0 commit comments

Comments
 (0)
0