Skip to content

Commit 7eb0915

Browse files
authored
Merge pull request kubernetes-client#2550 from rjeberhard/partialmetadataobject
Support PartialObjectMetadata requests
2 parents 8f5bc1a + d1c4735 commit 7eb0915

4 files changed

Lines changed: 166 additions & 36 deletions

File tree

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

Lines changed: 79 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
import java.util.Arrays;
4242
import java.util.List;
4343
import java.util.Map;
44+
import java.util.Optional;
4445
import java.util.concurrent.CancellationException;
4546
import java.util.concurrent.CountDownLatch;
4647
import java.util.concurrent.Future;
@@ -79,6 +80,12 @@
7980
public class GenericKubernetesApi<
8081
ApiType extends KubernetesObject, ApiListType extends KubernetesListObject> {
8182

83+
private static final String PARTIAL_OBJECT_METADATA_HEADER =
84+
"application/json;as=PartialObjectMetadata;g=meta.k8s.io;v=v1,application/json";
85+
86+
private static final String PARTIAL_OBJECT_METADATA_LIST_HEADER =
87+
"application/json;as=PartialObjectMetadataList;g=meta.k8s.io;v=v1,application/json";
88+
8289
// TODO(yue9944882): supports status operations..
8390
// TODO(yue9944882): supports generic sub-resource operations..
8491
// TODO(yue9944882): supports delete-collections..
@@ -453,8 +460,23 @@ public KubernetesApiResponse<ApiType> get(String name, final GetOptions getOptio
453460

454461
private CallBuilder makeClusterGetCallBuilder(String name, final GetOptions getOptions) {
455462
return () ->
456-
customObjectsApi.getClusterCustomObjectCall(
457-
this.apiGroup, this.apiVersion, this.resourcePlural, name, null);
463+
adaptGetCall(
464+
customObjectsApi.getApiClient(),
465+
customObjectsApi.getClusterCustomObjectCall(
466+
this.apiGroup, this.apiVersion, this.resourcePlural, name, null),
467+
getOptions);
468+
}
469+
470+
private Call adaptGetCall(ApiClient apiClient, Call call, GetOptions getOptions) {
471+
if (Optional.ofNullable(getOptions)
472+
.map(GetOptions::isPartialObjectMetadataRequest)
473+
.orElse(Boolean.FALSE)) {
474+
Request request = call.request();
475+
return apiClient
476+
.getHttpClient()
477+
.newCall(request.newBuilder().header("Accept", PARTIAL_OBJECT_METADATA_HEADER).build());
478+
}
479+
return call;
458480
}
459481

460482
/**
@@ -504,8 +526,11 @@ public KubernetesApiResponse<ApiType> get(
504526
private CallBuilder makeNamespacedGetCallBuilder(
505527
String namespace, String name, final GetOptions getOptions) {
506528
return () ->
507-
customObjectsApi.getNamespacedCustomObjectCall(
508-
this.apiGroup, this.apiVersion, namespace, this.resourcePlural, name, null);
529+
adaptGetCall(
530+
customObjectsApi.getApiClient(),
531+
customObjectsApi.getNamespacedCustomObjectCall(
532+
this.apiGroup, this.apiVersion, namespace, this.resourcePlural, name, null),
533+
getOptions);
509534
}
510535

511536
/**
@@ -548,21 +573,37 @@ public KubernetesApiResponse<ApiListType> list(final ListOptions listOptions) {
548573

549574
private CallBuilder makeClusterListCallBuilder(final ListOptions listOptions) {
550575
return () ->
551-
customObjectsApi.listClusterCustomObjectCall(
552-
this.apiGroup,
553-
this.apiVersion,
554-
this.resourcePlural,
555-
null,
556-
false,
557-
listOptions.getContinue(),
558-
listOptions.getFieldSelector(),
559-
listOptions.getLabelSelector(),
560-
listOptions.getLimit(),
561-
listOptions.getResourceVersion(),
562-
null,
563-
listOptions.getTimeoutSeconds(),
564-
false,
565-
null);
576+
adaptListCall(
577+
customObjectsApi.getApiClient(),
578+
customObjectsApi.listClusterCustomObjectCall(
579+
this.apiGroup,
580+
this.apiVersion,
581+
this.resourcePlural,
582+
null,
583+
false,
584+
listOptions.getContinue(),
585+
listOptions.getFieldSelector(),
586+
listOptions.getLabelSelector(),
587+
listOptions.getLimit(),
588+
listOptions.getResourceVersion(),
589+
null,
590+
listOptions.getTimeoutSeconds(),
591+
false,
592+
null),
593+
listOptions);
594+
}
595+
596+
private Call adaptListCall(ApiClient apiClient, Call call, ListOptions listOptions) {
597+
if (Optional.ofNullable(listOptions)
598+
.map(ListOptions::isPartialObjectMetadataListRequest)
599+
.orElse(Boolean.FALSE)) {
600+
Request request = call.request();
601+
return apiClient
602+
.getHttpClient()
603+
.newCall(
604+
request.newBuilder().header("Accept", PARTIAL_OBJECT_METADATA_LIST_HEADER).build());
605+
}
606+
return call;
566607
}
567608

568609
/**
@@ -585,22 +626,25 @@ public KubernetesApiResponse<ApiListType> list(String namespace, final ListOptio
585626
private CallBuilder makeNamespacedListCallBuilder(
586627
String namespace, final ListOptions listOptions) {
587628
return () ->
588-
customObjectsApi.listNamespacedCustomObjectCall(
589-
this.apiGroup,
590-
this.apiVersion,
591-
namespace,
592-
this.resourcePlural,
593-
null,
594-
null,
595-
listOptions.getContinue(),
596-
listOptions.getFieldSelector(),
597-
listOptions.getLabelSelector(),
598-
listOptions.getLimit(),
599-
listOptions.getResourceVersion(),
600-
null,
601-
listOptions.getTimeoutSeconds(),
602-
false,
603-
null);
629+
adaptListCall(
630+
customObjectsApi.getApiClient(),
631+
customObjectsApi.listNamespacedCustomObjectCall(
632+
this.apiGroup,
633+
this.apiVersion,
634+
namespace,
635+
this.resourcePlural,
636+
null,
637+
null,
638+
listOptions.getContinue(),
639+
listOptions.getFieldSelector(),
640+
listOptions.getLabelSelector(),
641+
listOptions.getLimit(),
642+
listOptions.getResourceVersion(),
643+
null,
644+
listOptions.getTimeoutSeconds(),
645+
false,
646+
null),
647+
listOptions);
604648
}
605649

606650
/**

util/src/main/java/io/kubernetes/client/util/generic/options/GetOptions.java

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,19 @@
1212
*/
1313
package io.kubernetes.client.util.generic.options;
1414

15-
public class GetOptions {}
15+
public class GetOptions {
16+
private Boolean isPartialObjectMetadataRequest;
17+
18+
public GetOptions isPartialObjectMetadataRequest(Boolean isPartialObjectMetadataRequest) {
19+
this.isPartialObjectMetadataRequest = isPartialObjectMetadataRequest;
20+
return this;
21+
}
22+
23+
public Boolean isPartialObjectMetadataRequest() {
24+
return isPartialObjectMetadataRequest;
25+
}
26+
27+
public void setPartialObjectMetadataRequest(Boolean isPartialObjectMetadataRequest) {
28+
this.isPartialObjectMetadataRequest = isPartialObjectMetadataRequest;
29+
}
30+
}

util/src/main/java/io/kubernetes/client/util/generic/options/ListOptions.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,9 @@ public class ListOptions {
3333
@SerializedName("continue")
3434
private String _continue;
3535

36+
@SerializedName("isPartialObjectMetadataListRequest")
37+
private Boolean isPartialObjectMetadataListRequest;
38+
3639
public ListOptions fieldSelector(String fieldSelector) {
3740
this.fieldSelector = fieldSelector;
3841
return this;
@@ -110,4 +113,18 @@ public Integer getTimeoutSeconds() {
110113
public void setTimeoutSeconds(Integer timeoutSeconds) {
111114
this.timeoutSeconds = timeoutSeconds;
112115
}
116+
117+
public ListOptions isPartialObjectMetadataListRequest(
118+
Boolean isPartialObjectMetadataListRequest) {
119+
this.isPartialObjectMetadataListRequest = isPartialObjectMetadataListRequest;
120+
return this;
121+
}
122+
123+
public Boolean isPartialObjectMetadataListRequest() {
124+
return isPartialObjectMetadataListRequest;
125+
}
126+
127+
public void setPartialObjectMetadataListRequest(Boolean isPartialObjectMetadataListRequest) {
128+
this.isPartialObjectMetadataListRequest = isPartialObjectMetadataListRequest;
129+
}
113130
}

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

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import io.kubernetes.client.openapi.models.V1Status;
3030
import io.kubernetes.client.util.ClientBuilder;
3131
import io.kubernetes.client.util.Watchable;
32+
import io.kubernetes.client.util.generic.options.GetOptions;
3233
import io.kubernetes.client.util.generic.options.ListOptions;
3334
import java.io.IOException;
3435
import java.net.SocketTimeoutException;
@@ -112,6 +113,59 @@ public void listNamespacedJobReturningObject() {
112113
verify(1, getRequestedFor(urlPathEqualTo("/apis/batch/v1/namespaces/default/jobs")));
113114
}
114115

116+
@Test
117+
public void listNamespacedJobWithPartialMetadataObjectListHeader() {
118+
V1JobList jobList =
119+
new V1JobList().kind("PartialObjectMetadataList").metadata(new V1ListMeta());
120+
121+
stubFor(
122+
get(urlPathEqualTo("/apis/batch/v1/namespaces/default/jobs"))
123+
.willReturn(aResponse().withStatus(200).withBody(json.serialize(jobList))));
124+
125+
GenericKubernetesApi<V1Job, V1JobList> pomClient =
126+
new GenericKubernetesApi<>(
127+
V1Job.class, V1JobList.class, "batch", "v1", "jobs", jobClient.getApiClient());
128+
129+
KubernetesApiResponse<V1JobList> jobListResp =
130+
pomClient.list("default", new ListOptions().isPartialObjectMetadataListRequest(true));
131+
assertTrue(jobListResp.isSuccess());
132+
assertEquals(jobList, jobListResp.getObject());
133+
assertNull(jobListResp.getStatus());
134+
verify(
135+
1,
136+
getRequestedFor(urlPathEqualTo("/apis/batch/v1/namespaces/default/jobs"))
137+
.withHeader(
138+
"Accept",
139+
equalTo(
140+
"application/json;as=PartialObjectMetadataList;g=meta.k8s.io;v=v1,application/json")));
141+
}
142+
143+
@Test
144+
public void getNamespacedJobWithPartialMetadataObjectHeader() {
145+
V1Job job = new V1Job().kind("PartialObjectMetadata").metadata(new V1ObjectMeta());
146+
147+
stubFor(
148+
get(urlPathEqualTo("/apis/batch/v1/namespaces/default/jobs/noxu"))
149+
.willReturn(aResponse().withStatus(200).withBody(json.serialize(job))));
150+
151+
GenericKubernetesApi<V1Job, V1JobList> pomClient =
152+
new GenericKubernetesApi<>(
153+
V1Job.class, V1JobList.class, "batch", "v1", "jobs", jobClient.getApiClient());
154+
155+
KubernetesApiResponse<V1Job> jobResp =
156+
pomClient.get("default", "noxu", new GetOptions().isPartialObjectMetadataRequest(true));
157+
assertTrue(jobResp.isSuccess());
158+
assertEquals(job, jobResp.getObject());
159+
assertNull(jobResp.getStatus());
160+
verify(
161+
1,
162+
getRequestedFor(urlPathEqualTo("/apis/batch/v1/namespaces/default/jobs/noxu"))
163+
.withHeader(
164+
"Accept",
165+
equalTo(
166+
"application/json;as=PartialObjectMetadata;g=meta.k8s.io;v=v1,application/json")));
167+
}
168+
115169
@Test
116170
public void listClusterJobReturningObject() {
117171
V1JobList jobList = new V1JobList().kind("JobList").metadata(new V1ListMeta());

0 commit comments

Comments
 (0)