Skip to content

Commit 3844f99

Browse files
committed
Fixes for new codegen.
1 parent f93790e commit 3844f99

File tree

12 files changed

+94
-32
lines changed

12 files changed

+94
-32
lines changed

extended/src/main/java/io/kubernetes/client/extended/kubectl/KubectlDrain.java

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -93,9 +93,6 @@ private void validatePods(List<V1Pod> pods) throws KubectlException {
9393
for (V1Pod pod : pods) {
9494
if (pod.getMetadata().getOwnerReferences() == null) continue;
9595

96-
if (!force && pod.getMetadata().getOwnerReferences().size() == 0) {
97-
throw new KubectlException("Pods unmanaged by a controller are present on the node");
98-
}
9996
// Throw exception if there are daemon set pods and ignore daemon set is false
10097
if (!ignoreDaemonSets) {
10198
for (V1OwnerReference ref : pod.getMetadata().getOwnerReferences()) {

extended/src/test/java/io/kubernetes/client/extended/kubectl/KubectlDeleteTest.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,7 @@ void kubectlDelete() throws KubectlException, ApiException {
211211
kubectlDelete.namespace("foo").name("bar");
212212
DeleteOptions deleteOptions = new DeleteOptions();
213213
deleteOptions.setPropagationPolicy("Foreground");
214+
deleteOptions.setDryRun(null);
214215
kubectlDelete.deleteOptions(deleteOptions);
215216
kubectlDelete.execute();
216217
apiServer.verify(
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
/*
2+
Copyright 2024 The Kubernetes Authors.
3+
Licensed under the Apache License, Version 2.0 (the "License");
4+
you may not use this file except in compliance with the License.
5+
You may obtain a copy of the License at
6+
http://www.apache.org/licenses/LICENSE-2.0
7+
Unless required by applicable law or agreed to in writing, software
8+
distributed under the License is distributed on an "AS IS" BASIS,
9+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
10+
See the License for the specific language governing permissions and
11+
limitations under the License.
12+
*/
13+
package io.kubernetes.client.gson;
14+
15+
import com.google.gson.ExclusionStrategy;
16+
import com.google.gson.FieldAttributes;
17+
import io.kubernetes.client.openapi.models.V1ObjectMeta;
18+
19+
public class V1MetadataExclusionStrategy implements com.google.gson.ExclusionStrategy {
20+
public boolean shouldSkipField(FieldAttributes f) {
21+
// Don't serialize the 'managedFields' field.
22+
return (f.getDeclaringClass().equals(V1ObjectMeta.class) && f.getName().equalsIgnoreCase("managedFields"));
23+
}
24+
25+
public boolean shouldSkipClass(Class<?> clazz) {
26+
return false;
27+
}
28+
}

kubernetes/src/main/java/io/kubernetes/client/openapi/JSON.java

Lines changed: 33 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,9 @@
2222
import com.google.gson.JsonElement;
2323
import io.gsonfire.GsonFireBuilder;
2424
import io.gsonfire.TypeSelector;
25-
25+
import io.kubernetes.client.gson.V1MetadataExclusionStrategy;
26+
import io.kubernetes.client.gson.V1StatusPreProcessor;
27+
import io.kubernetes.client.openapi.models.V1Status;
2628
import okio.ByteString;
2729

2830
import java.io.IOException;
@@ -35,6 +37,9 @@
3537
import java.time.ZoneId;
3638
import java.time.ZoneOffset;
3739
import java.time.format.DateTimeFormatter;
40+
import java.time.format.DateTimeFormatterBuilder;
41+
import java.time.format.DateTimeParseException;
42+
import java.time.temporal.ChronoField;
3843
import java.util.Date;
3944
import java.util.Locale;
4045
import java.util.Map;
@@ -50,9 +55,19 @@
5055
public class JSON {
5156
private static Gson gson;
5257
private static boolean isLenientOnJson = false;
58+
private static final DateTimeFormatter RFC3339MICRO_FORMATTER =
59+
new DateTimeFormatterBuilder()
60+
.parseDefaulting(ChronoField.OFFSET_SECONDS, 0)
61+
.append(DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss"))
62+
.optionalStart()
63+
.appendFraction(ChronoField.NANO_OF_SECOND, 6, 6, true)
64+
.optionalEnd()
65+
.appendLiteral("Z")
66+
.toFormatter();
67+
5368
private static DateTypeAdapter dateTypeAdapter = new DateTypeAdapter();
5469
private static SqlDateTypeAdapter sqlDateTypeAdapter = new SqlDateTypeAdapter();
55-
private static OffsetDateTimeTypeAdapter offsetDateTimeTypeAdapter = new OffsetDateTimeTypeAdapter();
70+
private static OffsetDateTimeTypeAdapter offsetDateTimeTypeAdapter = new OffsetDateTimeTypeAdapter(RFC3339MICRO_FORMATTER);
5671
private static LocalDateTypeAdapter localDateTypeAdapter = new LocalDateTypeAdapter();
5772
private static ByteArrayAdapter byteArrayAdapter = new ByteArrayAdapter();
5873

@@ -63,10 +78,12 @@ public class JSON {
6378

6479
@SuppressWarnings("unchecked")
6580
public static GsonBuilder createGson() {
66-
GsonFireBuilder fireBuilder = new GsonFireBuilder()
67-
;
68-
GsonBuilder builder = fireBuilder.createGsonBuilder();
69-
return builder;
81+
GsonFireBuilder fireBuilder = new GsonFireBuilder();
82+
GsonBuilder builder =
83+
fireBuilder
84+
.registerPreProcessor(V1Status.class, new V1StatusPreProcessor())
85+
.createGsonBuilder();
86+
return builder.setExclusionStrategies(new V1MetadataExclusionStrategy());
7087
}
7188

7289
private static String getDiscriminatorValue(JsonElement readElement, String discriminatorField) {
@@ -784,11 +801,15 @@ public static class ByteArrayAdapter extends TypeAdapter<byte[]> {
784801

785802
@Override
786803
public void write(JsonWriter out, byte[] value) throws IOException {
804+
boolean oldHtmlSafe = out.isHtmlSafe();
805+
out.setHtmlSafe(false);
806+
787807
if (value == null) {
788808
out.nullValue();
789809
} else {
790810
out.value(ByteString.of(value).base64());
791811
}
812+
out.setHtmlSafe(oldHtmlSafe);
792813
}
793814

794815
@Override
@@ -844,7 +865,12 @@ public OffsetDateTime read(JsonReader in) throws IOException {
844865
if (date.endsWith("+0000")) {
845866
date = date.substring(0, date.length()-5) + "Z";
846867
}
847-
return OffsetDateTime.parse(date, formatter);
868+
try {
869+
return OffsetDateTime.parse(date, formatter);
870+
} catch (DateTimeParseException e) {
871+
// backward-compatibility for ISO8601 timestamp format
872+
return OffsetDateTime.parse(date, DateTimeFormatter.ISO_OFFSET_DATE_TIME);
873+
}
848874
}
849875
}
850876
}

kubernetes/src/main/java/io/kubernetes/client/openapi/models/V1ListMeta.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -258,7 +258,8 @@ public void write(JsonWriter out, V1ListMeta value) throws IOException {
258258
@Override
259259
public V1ListMeta read(JsonReader in) throws IOException {
260260
JsonElement jsonElement = elementAdapter.read(in);
261-
validateJsonElement(jsonElement);
261+
// Disable validation so delete API can tolerate non-status return object (graceful deletion)
262+
// validateJsonObject(jsonObj);
262263
return thisAdapter.fromJsonTree(jsonElement);
263264
}
264265

kubernetes/src/main/java/io/kubernetes/client/openapi/models/V1Secret.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import com.google.gson.annotations.SerializedName;
1919
import com.google.gson.stream.JsonReader;
2020
import com.google.gson.stream.JsonWriter;
21+
import io.kubernetes.client.custom.MapUtils;
2122
import io.kubernetes.client.openapi.models.V1ObjectMeta;
2223
import java.io.IOException;
2324
import java.util.Arrays;
@@ -244,7 +245,7 @@ public boolean equals(Object o) {
244245
}
245246
V1Secret v1Secret = (V1Secret) o;
246247
return Objects.equals(this.apiVersion, v1Secret.apiVersion) &&
247-
Objects.equals(this.data, v1Secret.data) &&
248+
MapUtils.equals(this.data, v1Secret.data) &&
248249
Objects.equals(this.immutable, v1Secret.immutable) &&
249250
Objects.equals(this.kind, v1Secret.kind) &&
250251
Objects.equals(this.metadata, v1Secret.metadata) &&

kubernetes/src/main/java/io/kubernetes/client/openapi/models/V1Status.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -378,7 +378,8 @@ public void write(JsonWriter out, V1Status value) throws IOException {
378378
@Override
379379
public V1Status read(JsonReader in) throws IOException {
380380
JsonElement jsonElement = elementAdapter.read(in);
381-
validateJsonElement(jsonElement);
381+
// Disable validation so delete API can tolerate non-status return object (graceful deletion)
382+
// validateJsonObject(jsonObj);
382383
return thisAdapter.fromJsonTree(jsonElement);
383384
}
384385

scripts/patches/json.diff

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -51,9 +51,11 @@ index 4406c2199..f56413a25 100644
5151
+ fireBuilder
5252
+ .registerPreProcessor(V1Status.class, new V1StatusPreProcessor())
5353
+ .createGsonBuilder();
54-
return builder;
54+
- return builder;
55+
+ return builder.setExclusionStrategies(new V1MetadataExclusionStrategy());
5556
}
56-
57+
58+
private static String getDiscriminatorValue(JsonElement readElement, String discriminatorField) {
5759
@@ -721,11 +739,14 @@ public class JSON {
5860

5961
@Override
@@ -82,4 +84,4 @@ index 4406c2199..f56413a25 100644
8284
+ }
8385
}
8486
}
85-
}
87+
}

scripts/patches/list-meta.diff

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,14 @@
11
diff --git a/kubernetes/src/main/java/io/kubernetes/client/openapi/models/V1ListMeta.java b/kubernetes/src/main/java/io/kubernetes/client/openapi/models/V1ListMeta.java
2-
index 60381b312..7fb47e230 100644
2+
index f161284a2..d3d563bbb 100644
33
--- a/kubernetes/src/main/java/io/kubernetes/client/openapi/models/V1ListMeta.java
44
+++ b/kubernetes/src/main/java/io/kubernetes/client/openapi/models/V1ListMeta.java
5-
@@ -266,7 +266,9 @@ public class V1ListMeta {
5+
@@ -258,7 +258,8 @@ public class V1ListMeta {
66
@Override
77
public V1ListMeta read(JsonReader in) throws IOException {
8-
JsonObject jsonObj = elementAdapter.read(in).getAsJsonObject();
9-
- validateJsonObject(jsonObj);
10-
+
8+
JsonElement jsonElement = elementAdapter.read(in);
9+
- validateJsonElement(jsonElement);
1110
+ // Disable validation so delete API can tolerate non-status return object (graceful deletion)
1211
+ // validateJsonObject(jsonObj);
13-
return thisAdapter.fromJsonTree(jsonObj);
12+
return thisAdapter.fromJsonTree(jsonElement);
1413
}
1514

scripts/patches/secret.diff

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,22 @@
11
diff --git a/kubernetes/src/main/java/io/kubernetes/client/openapi/models/V1Secret.java b/kubernetes/src/main/java/io/kubernetes/client/openapi/models/V1Secret.java
2-
index 8fdadaac6..5fe296242 100644
2+
index 5684f4776..aa77bd40f 100644
33
--- a/kubernetes/src/main/java/io/kubernetes/client/openapi/models/V1Secret.java
44
+++ b/kubernetes/src/main/java/io/kubernetes/client/openapi/models/V1Secret.java
5-
@@ -19,6 +19,7 @@ import com.google.gson.annotations.JsonAdapter;
5+
@@ -18,6 +18,7 @@ import com.google.gson.annotations.JsonAdapter;
66
import com.google.gson.annotations.SerializedName;
77
import com.google.gson.stream.JsonReader;
88
import com.google.gson.stream.JsonWriter;
99
+import io.kubernetes.client.custom.MapUtils;
1010
import io.kubernetes.client.openapi.models.V1ObjectMeta;
1111
import java.io.IOException;
12-
import java.util.HashMap;
13-
@@ -259,7 +260,7 @@ public class V1Secret implements io.kubernetes.client.common.KubernetesObject {
12+
import java.util.Arrays;
13+
@@ -243,8 +244,8 @@ public class V1Secret implements io.kubernetes.client.common.KubernetesObject {
14+
return false;
1415
}
1516
V1Secret v1Secret = (V1Secret) o;
16-
return Objects.equals(this.apiVersion, v1Secret.apiVersion) &&
17+
- return Objects.equals(this.apiVersion, v1Secret.apiVersion) &&
1718
- Objects.equals(this.data, v1Secret.data) &&
19+
+ return Objects.equals(this.apiVersion, v1Secret.apiVersion) &&
1820
+ MapUtils.equals(this.data, v1Secret.data) &&
1921
Objects.equals(this.immutable, v1Secret.immutable) &&
2022
Objects.equals(this.kind, v1Secret.kind) &&

0 commit comments

Comments
 (0)