Skip to content

Commit 6d7db80

Browse files
shawkinsmanusa
authored andcommitted
fix #4662: refining the client to not use static deserialization logic
1 parent 441e3f2 commit 6d7db80

File tree

69 files changed

+947
-1008
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

69 files changed

+947
-1008
lines changed

kubernetes-client-api/src/main/java/io/fabric8/kubernetes/client/DefaultKubernetesClient.java

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,6 @@
2121
import io.fabric8.kubernetes.client.http.HttpClient.Factory;
2222
import io.fabric8.kubernetes.client.http.StandardHttpClientBuilder;
2323
import io.fabric8.kubernetes.client.utils.HttpClientUtils;
24-
import io.fabric8.kubernetes.client.utils.Serialization;
25-
26-
import java.io.InputStream;
2724

2825
/**
2926
* Class for Default Kubernetes Client implementing KubernetesClient interface.
@@ -36,14 +33,6 @@ public class DefaultKubernetesClient extends NamespacedKubernetesClientAdapter<N
3633

3734
public static final String KUBERNETES_VERSION_ENDPOINT = "version";
3835

39-
public static DefaultKubernetesClient fromConfig(String config) {
40-
return new DefaultKubernetesClient(Serialization.unmarshal(config, Config.class));
41-
}
42-
43-
public static DefaultKubernetesClient fromConfig(InputStream is) {
44-
return new DefaultKubernetesClient(Serialization.unmarshal(is, Config.class));
45-
}
46-
4736
public DefaultKubernetesClient() {
4837
this(new ConfigBuilder().build());
4938
}

kubernetes-client-api/src/main/java/io/fabric8/kubernetes/client/KubernetesClient.java

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,6 @@
7777
import io.fabric8.kubernetes.client.dsl.NamespaceableResource;
7878
import io.fabric8.kubernetes.client.dsl.NetworkAPIGroupDSL;
7979
import io.fabric8.kubernetes.client.dsl.NonNamespaceOperation;
80-
import io.fabric8.kubernetes.client.dsl.ParameterNamespaceListVisitFromServerGetDeleteRecreateWaitApplicable;
8180
import io.fabric8.kubernetes.client.dsl.PodResource;
8281
import io.fabric8.kubernetes.client.dsl.PolicyAPIGroupDSL;
8382
import io.fabric8.kubernetes.client.dsl.RbacAPIGroupDSL;
@@ -91,6 +90,7 @@
9190
import io.fabric8.kubernetes.client.extended.leaderelection.LeaderElectorBuilder;
9291
import io.fabric8.kubernetes.client.extended.run.RunOperations;
9392
import io.fabric8.kubernetes.client.informers.SharedInformerFactory;
93+
import io.fabric8.kubernetes.client.utils.KubernetesSerialization;
9494

9595
import java.io.InputStream;
9696
import java.util.Collection;
@@ -300,15 +300,15 @@ MixedOperation<GenericKubernetesResource, GenericKubernetesResourceList, Resourc
300300
* @param is the input stream containing JSON/YAML content
301301
* @return an operation instance to work on the list of Kubernetes Resource objects
302302
*/
303-
ParameterNamespaceListVisitFromServerGetDeleteRecreateWaitApplicable<HasMetadata> load(InputStream is);
303+
NamespaceListVisitFromServerGetDeleteRecreateWaitApplicable<HasMetadata> load(InputStream is);
304304

305305
/**
306306
* Load a Kubernetes list object
307307
*
308308
* @param s kubernetes list as string
309309
* @return an operation instance to work on the deserialized KubernetesList objects
310310
*/
311-
ParameterNamespaceListVisitFromServerGetDeleteRecreateWaitApplicable<HasMetadata> resourceList(String s);
311+
NamespaceListVisitFromServerGetDeleteRecreateWaitApplicable<HasMetadata> resourceList(String s);
312312

313313
/**
314314
* KubernetesResourceList operations
@@ -543,4 +543,9 @@ NamespaceListVisitFromServerGetDeleteRecreateWaitApplicable<HasMetadata> resourc
543543
* @param visitor
544544
*/
545545
void visitResources(ApiVisitor visitor);
546+
547+
/**
548+
* @return the {@link KubernetesSerialization} used by this client
549+
*/
550+
KubernetesSerialization getKubernetesSerialization();
546551
}

kubernetes-client-api/src/main/java/io/fabric8/kubernetes/client/KubernetesClientBuilder.java

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,12 @@
1616

1717
package io.fabric8.kubernetes.client;
1818

19+
import com.fasterxml.jackson.databind.ObjectMapper;
1920
import io.fabric8.kubernetes.client.http.HttpClient;
2021
import io.fabric8.kubernetes.client.informers.ResourceEventHandler;
2122
import io.fabric8.kubernetes.client.utils.HttpClientUtils;
22-
import io.fabric8.kubernetes.client.utils.Serialization;
23+
import io.fabric8.kubernetes.client.utils.KubernetesSerialization;
24+
import io.fabric8.kubernetes.client.utils.Utils;
2325

2426
import java.io.InputStream;
2527
import java.lang.reflect.InvocationTargetException;
@@ -47,6 +49,7 @@ default void onClose(Executor executor) {
4749
private Class<KubernetesClient> clazz;
4850
private ExecutorSupplier executorSupplier;
4951
private Consumer<HttpClient.Builder> builderConsumer;
52+
private KubernetesSerialization kubernetesSerialization = new KubernetesSerialization(new ObjectMapper());
5053

5154
public KubernetesClientBuilder() {
5255
// basically the same logic as in KubernetesResourceUtil for finding list types
@@ -75,8 +78,9 @@ public KubernetesClient build() {
7578
this.factory = HttpClientUtils.getHttpClientFactory();
7679
}
7780
HttpClient client = getHttpClient();
78-
return clazz.getConstructor(HttpClient.class, Config.class, ExecutorSupplier.class).newInstance(client, config,
79-
executorSupplier);
81+
return clazz.getConstructor(HttpClient.class, Config.class, ExecutorSupplier.class, KubernetesSerialization.class)
82+
.newInstance(client, config,
83+
executorSupplier, kubernetesSerialization);
8084
} catch (InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException
8185
| NoSuchMethodException | SecurityException e) {
8286
throw KubernetesClientException.launderThrowable(e);
@@ -96,13 +100,18 @@ public KubernetesClientBuilder withConfig(Config config) {
96100
return this;
97101
}
98102

103+
public KubernetesClientBuilder withKubernetesSerialization(KubernetesSerialization kubernetesSerialization) {
104+
this.kubernetesSerialization = Utils.checkNotNull(kubernetesSerialization, "kubernetesSerialization must not be null");
105+
return this;
106+
}
107+
99108
public KubernetesClientBuilder withConfig(String config) {
100-
this.config = Serialization.unmarshal(config, Config.class);
109+
this.config = kubernetesSerialization.unmarshal(config, Config.class);
101110
return this;
102111
}
103112

104113
public KubernetesClientBuilder withConfig(InputStream config) {
105-
this.config = Serialization.unmarshal(config, Config.class);
114+
this.config = kubernetesSerialization.unmarshal(config, Config.class);
106115
return this;
107116
}
108117

kubernetes-client-api/src/main/java/io/fabric8/kubernetes/client/NamespacedKubernetesClientAdapter.java

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,6 @@
7878
import io.fabric8.kubernetes.client.dsl.NamespaceableResource;
7979
import io.fabric8.kubernetes.client.dsl.NetworkAPIGroupDSL;
8080
import io.fabric8.kubernetes.client.dsl.NonNamespaceOperation;
81-
import io.fabric8.kubernetes.client.dsl.ParameterNamespaceListVisitFromServerGetDeleteRecreateWaitApplicable;
8281
import io.fabric8.kubernetes.client.dsl.PodResource;
8382
import io.fabric8.kubernetes.client.dsl.PolicyAPIGroupDSL;
8483
import io.fabric8.kubernetes.client.dsl.RbacAPIGroupDSL;
@@ -93,6 +92,7 @@
9392
import io.fabric8.kubernetes.client.extended.run.RunOperations;
9493
import io.fabric8.kubernetes.client.extension.ClientAdapter;
9594
import io.fabric8.kubernetes.client.informers.SharedInformerFactory;
95+
import io.fabric8.kubernetes.client.utils.KubernetesSerialization;
9696

9797
import java.io.InputStream;
9898
import java.util.Collection;
@@ -255,12 +255,12 @@ public NonNamespaceOperation<ComponentStatus, ComponentStatusList, Resource<Comp
255255
}
256256

257257
@Override
258-
public ParameterNamespaceListVisitFromServerGetDeleteRecreateWaitApplicable<HasMetadata> load(InputStream is) {
258+
public NamespaceListVisitFromServerGetDeleteRecreateWaitApplicable<HasMetadata> load(InputStream is) {
259259
return getClient().load(is);
260260
}
261261

262262
@Override
263-
public ParameterNamespaceListVisitFromServerGetDeleteRecreateWaitApplicable<HasMetadata> resourceList(String s) {
263+
public NamespaceListVisitFromServerGetDeleteRecreateWaitApplicable<HasMetadata> resourceList(String s) {
264264
return getClient().resourceList(s);
265265
}
266266

@@ -425,4 +425,9 @@ public String raw(String uri, String method, Object payload) {
425425
return getClient().raw(uri, method, payload);
426426
}
427427

428+
@Override
429+
public KubernetesSerialization getKubernetesSerialization() {
430+
return getClient().getKubernetesSerialization();
431+
}
432+
428433
}

kubernetes-client-api/src/main/java/io/fabric8/kubernetes/client/dsl/ParameterNamespaceListVisitFromServerGetDeleteRecreateWaitApplicable.java

Lines changed: 0 additions & 29 deletions
This file was deleted.

kubernetes-client-api/src/main/java/io/fabric8/kubernetes/client/informers/cache/ReducedStateItemStore.java

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818

1919
import io.fabric8.kubernetes.api.model.GenericKubernetesResource;
2020
import io.fabric8.kubernetes.api.model.HasMetadata;
21-
import io.fabric8.kubernetes.client.utils.Serialization;
21+
import io.fabric8.kubernetes.client.utils.KubernetesSerialization;
2222

2323
import java.util.ArrayList;
2424
import java.util.Arrays;
@@ -42,6 +42,7 @@ public class ReducedStateItemStore<V extends HasMetadata> implements ItemStore<V
4242
private final List<String[]> fields = new ArrayList<>();
4343
private final Class<V> typeClass;
4444
private final KeyState keyState;
45+
private KubernetesSerialization serialization;
4546

4647
public static class KeyState {
4748

@@ -101,7 +102,8 @@ public KeyState(Function<HasMetadata, String> keyFunction, Function<String, Stri
101102
* @param typeClass the expected type
102103
* @param valueFields the additional fields to save
103104
*/
104-
public ReducedStateItemStore(KeyState keyState, Class<V> typeClass, String... valueFields) {
105+
public ReducedStateItemStore(KeyState keyState, Class<V> typeClass, KubernetesSerialization serialization,
106+
String... valueFields) {
105107
this.keyState = keyState;
106108
fields.add(new String[] { METADATA, "resourceVersion" });
107109
if (valueFields != null) {
@@ -110,13 +112,14 @@ public ReducedStateItemStore(KeyState keyState, Class<V> typeClass, String... va
110112
}
111113
}
112114
this.typeClass = typeClass;
115+
this.serialization = serialization;
113116
}
114117

115118
Object[] store(V value) {
116119
if (value == null) {
117120
return null;
118121
}
119-
Map<String, Object> raw = Serialization.jsonMapper().convertValue(value, Map.class);
122+
Map<String, Object> raw = serialization.convertValue(value, Map.class);
120123
return fields.stream().map(f -> GenericKubernetesResource.get(raw, (Object[]) f)).toArray();
121124
}
122125

@@ -129,7 +132,7 @@ V restore(String key, Object[] values) {
129132
String[] keyParts = this.keyState.keyFieldFunction.apply(key);
130133
applyFields(keyParts, raw, this.keyState.keyFields);
131134

132-
return Serialization.jsonMapper().convertValue(raw, typeClass);
135+
return serialization.convertValue(raw, typeClass);
133136
}
134137

135138
private static void applyFields(Object[] values, Map<String, Object> raw, List<String[]> fields) {

kubernetes-client-api/src/main/java/io/fabric8/kubernetes/client/utils/BackwardsCompatibilityInterceptor.java

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@
1515
*/
1616
package io.fabric8.kubernetes.client.utils;
1717

18-
import io.fabric8.kubernetes.api.model.HasMetadata;
18+
import com.fasterxml.jackson.databind.JsonNode;
19+
import com.fasterxml.jackson.databind.node.ObjectNode;
1920
import io.fabric8.kubernetes.client.http.BasicBuilder;
2021
import io.fabric8.kubernetes.client.http.HttpRequest;
2122
import io.fabric8.kubernetes.client.http.HttpRequest.Builder;
@@ -165,19 +166,18 @@ public CompletableFuture<Boolean> afterFailure(Builder builder, HttpResponse<?>
165166

166167
HttpRequest request = response.request();
167168
if (request.bodyString() != null && !request.method().equalsIgnoreCase(PATCH)) {
168-
Object object = Serialization.unmarshal(request.bodyString());
169-
if (object instanceof HasMetadata) {
170-
HasMetadata h = (HasMetadata) object;
171-
h.setApiVersion(target.group + "/" + target.version);
169+
JsonNode object = Serialization.unmarshal(request.bodyString(), JsonNode.class);
170+
if (object.get("apiVersion") != null) {
171+
((ObjectNode) object).put("apiVersion", target.group + "/" + target.version);
172172
switch (request.method()) {
173173
case "POST":
174-
builder.post(JSON, Serialization.asJson(h));
174+
builder.post(JSON, Serialization.asJson(object));
175175
break;
176176
case "PUT":
177-
builder.put(JSON, Serialization.asJson(h));
177+
builder.put(JSON, Serialization.asJson(object));
178178
break;
179179
case "DELETE":
180-
builder.delete(JSON, Serialization.asJson(h));
180+
builder.delete(JSON, Serialization.asJson(object));
181181
break;
182182
default:
183183
return CompletableFuture.completedFuture(false);

kubernetes-client-api/src/main/java/io/fabric8/kubernetes/client/utils/IOHelpers.java

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
package io.fabric8.kubernetes.client.utils;
1717

1818
import com.fasterxml.jackson.core.JsonProcessingException;
19+
import com.fasterxml.jackson.databind.JsonNode;
1920
import com.fasterxml.jackson.databind.ObjectMapper;
2021

2122
import java.io.BufferedReader;
@@ -64,6 +65,10 @@ private static void copy(Reader reader, Writer writer) throws IOException {
6465
}
6566
}
6667

68+
/**
69+
* @deprecated will be removed in future versions
70+
*/
71+
@Deprecated
6772
public static boolean isJSONValid(String json) {
6873
try {
6974
ObjectMapper objectMapper = Serialization.jsonMapper();
@@ -74,10 +79,18 @@ public static boolean isJSONValid(String json) {
7479
return true;
7580
}
7681

82+
/**
83+
* @deprecated will be removed in future versions
84+
*/
85+
@Deprecated
7786
public static String convertYamlToJson(String yaml) {
78-
return Serialization.asJson(Serialization.unmarshal(yaml, Object.class));
87+
return Serialization.asJson(Serialization.unmarshal(yaml, JsonNode.class));
7988
}
8089

90+
/**
91+
* @deprecated will be removed in future versions
92+
*/
93+
@Deprecated
8194
public static String convertToJson(String jsonOrYaml) {
8295
if (isJSONValid(jsonOrYaml)) {
8396
return jsonOrYaml;

kubernetes-client-api/src/main/java/io/fabric8/kubernetes/client/utils/KubernetesResourceUtil.java

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616

1717
package io.fabric8.kubernetes.client.utils;
1818

19-
import com.fasterxml.jackson.core.JsonProcessingException;
2019
import io.fabric8.kubernetes.api.builder.VisitableBuilder;
2120
import io.fabric8.kubernetes.api.model.DefaultKubernetesResourceList;
2221
import io.fabric8.kubernetes.api.model.EnvVar;
@@ -383,7 +382,7 @@ public static List<EnvVar> convertMapToEnvVarList(Map<String, String> envVarMap)
383382
* Check whether a Kubernetes resource is Ready or not. Applicable only to
384383
* Deployment, ReplicaSet, Pod, ReplicationController, Endpoints, Node and
385384
* StatefulSet
386-
*
385+
*
387386
* @param item item which needs to be checked
388387
* @return boolean value indicating it's status
389388
*/
@@ -393,7 +392,7 @@ public static boolean isResourceReady(HasMetadata item) {
393392

394393
/**
395394
* Calculates age of a kubernetes resource
396-
*
395+
*
397396
* @param kubernetesResource
398397
* @return a positive duration indicating age of the kubernetes resource
399398
*/
@@ -432,10 +431,9 @@ private static Class<?> loadRelated(Class<?> type, String suffix, Class<?> defau
432431
* secret's default name : "container-image-registry-secret" is the default name for secret
433432
* @return an object of Secret
434433
*/
435-
public static Secret createDockerRegistrySecret(String dockerServer, String username, String password)
436-
throws JsonProcessingException {
434+
public static Secret createDockerRegistrySecret(String dockerServer, String username, String password) {
437435
Map<String, Object> dockerConfigMap = createDockerRegistryConfigMap(dockerServer, username, password);
438-
String dockerConfigAsStr = Serialization.jsonMapper().writeValueAsString(dockerConfigMap);
436+
String dockerConfigAsStr = Serialization.asJson(dockerConfigMap);
439437

440438
return createDockerSecret(DEFAULT_CONTAINER_IMAGE_REGISTRY_SECRET_NAME, dockerConfigAsStr);
441439
}
@@ -449,10 +447,9 @@ public static Secret createDockerRegistrySecret(String dockerServer, String user
449447
* @param secretName secretName that needs to be used during secret creation
450448
* @return an object of Secret
451449
*/
452-
public static Secret createDockerRegistrySecret(String dockerServer, String username, String password, String secretName)
453-
throws JsonProcessingException {
450+
public static Secret createDockerRegistrySecret(String dockerServer, String username, String password, String secretName) {
454451
Map<String, Object> dockerConfigMap = createDockerRegistryConfigMap(dockerServer, username, password);
455-
String dockerConfigAsStr = Serialization.jsonMapper().writeValueAsString(dockerConfigMap);
452+
String dockerConfigAsStr = Serialization.asJson(dockerConfigMap);
456453

457454
return createDockerSecret(secretName, dockerConfigAsStr);
458455
}

0 commit comments

Comments
 (0)