diff --git a/CHANGELOG.md b/CHANGELOG.md index 8cd908d5bc1..990f1c2c262 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,8 @@ #### New Features #### _**Note**_: Breaking changes +* Fix #3972: deprecated Parameterizable and methods on Serialization accepting parameters - that was only needed as a workaround for non-string parameters. You should instead include those parameter values in the map passed to processLocally. +* Fix #3972: WARNING: future client versions will not implicitly process templates as part of the load operation nor will the static yaml and json ObjectMappers be provided via Serialization. ### 6.3.1-SNAPSHOT diff --git a/kubernetes-client-api/src/main/java/io/fabric8/kubernetes/client/dsl/ParameterMixedOperation.java b/kubernetes-client-api/src/main/java/io/fabric8/kubernetes/client/dsl/ParameterMixedOperation.java index 3213b4c47b0..c46197a6287 100644 --- a/kubernetes-client-api/src/main/java/io/fabric8/kubernetes/client/dsl/ParameterMixedOperation.java +++ b/kubernetes-client-api/src/main/java/io/fabric8/kubernetes/client/dsl/ParameterMixedOperation.java @@ -17,12 +17,15 @@ package io.fabric8.kubernetes.client.dsl; /** - * A {@link Parameterizable} {@link MixedOperation} + * It is no longer necessary to associate parameters prior to deserialization. + *

+ * reference {@link MixedOperation} instead * * @param The Kubernetes resource type. * @param The list variant of the Kubernetes resource type. * @param The resource operations. */ +@Deprecated public interface ParameterMixedOperation> extends MixedOperation, Parameterizable> { } diff --git a/kubernetes-client-api/src/main/java/io/fabric8/kubernetes/client/dsl/ParameterNamespaceListVisitFromServerGetDeleteRecreateWaitApplicable.java b/kubernetes-client-api/src/main/java/io/fabric8/kubernetes/client/dsl/ParameterNamespaceListVisitFromServerGetDeleteRecreateWaitApplicable.java index f8c39a58fbc..fac443b891b 100644 --- a/kubernetes-client-api/src/main/java/io/fabric8/kubernetes/client/dsl/ParameterNamespaceListVisitFromServerGetDeleteRecreateWaitApplicable.java +++ b/kubernetes-client-api/src/main/java/io/fabric8/kubernetes/client/dsl/ParameterNamespaceListVisitFromServerGetDeleteRecreateWaitApplicable.java @@ -16,6 +16,12 @@ package io.fabric8.kubernetes.client.dsl; +/** + * It is no longer necessary to associate parameters prior to deserialization. + *

+ * reference {@link NamespaceListVisitFromServerGetDeleteRecreateWaitApplicable} instead + */ +@Deprecated public interface ParameterNamespaceListVisitFromServerGetDeleteRecreateWaitApplicable extends NamespaceListVisitFromServerGetDeleteRecreateWaitApplicable, Parameterizable> { diff --git a/kubernetes-client-api/src/main/java/io/fabric8/kubernetes/client/dsl/Parameterizable.java b/kubernetes-client-api/src/main/java/io/fabric8/kubernetes/client/dsl/Parameterizable.java index 3dfdd74d083..8e4acfb694c 100644 --- a/kubernetes-client-api/src/main/java/io/fabric8/kubernetes/client/dsl/Parameterizable.java +++ b/kubernetes-client-api/src/main/java/io/fabric8/kubernetes/client/dsl/Parameterizable.java @@ -17,6 +17,11 @@ import java.util.Map; +/** + * It is no longer necessary to associate parameters prior to deserialization. Please + * provide the parameters to one of the process methods instead + */ +@Deprecated public interface Parameterizable { T withParameters(Map parameters); diff --git a/kubernetes-client-api/src/main/java/io/fabric8/kubernetes/client/utils/Serialization.java b/kubernetes-client-api/src/main/java/io/fabric8/kubernetes/client/utils/Serialization.java index a5ffeb936b5..d747ee3f099 100644 --- a/kubernetes-client-api/src/main/java/io/fabric8/kubernetes/client/utils/Serialization.java +++ b/kubernetes-client-api/src/main/java/io/fabric8/kubernetes/client/utils/Serialization.java @@ -35,7 +35,6 @@ import java.io.BufferedInputStream; import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.lang.reflect.Type; @@ -180,17 +179,13 @@ public static T unmarshal(InputStream is) { * @param parameters A {@link Map} with parameters for placeholder substitution. * @param The target type. * @return returns returns de-serialized object + * + * @deprecated please directly apply {@link Utils#interpolateString(String, Map)} instead of passing parameters here */ + @Deprecated @SuppressWarnings("unchecked") public static T unmarshal(InputStream is, Map parameters) { - String specFile = readSpecFileFromInputStream(is); - if (containsMultipleDocuments(specFile)) { - return (T) getKubernetesResourceList(parameters, specFile); - } else if (specFile.contains(DOCUMENT_DELIMITER)) { - specFile = specFile.replaceAll("^---([ \\t].*?)?\\r?\\n", ""); - specFile = specFile.replaceAll("\\n---([ \\t].*?)?\\r?\\n?$", "\n"); - } - return unmarshal(new ByteArrayInputStream(specFile.getBytes()), JSON_MAPPER, parameters); + return unmarshal(is, JSON_MAPPER, parameters); } /** @@ -217,9 +212,27 @@ public static T unmarshal(InputStream is, ObjectMapper mapper) { * @param parameters A {@link Map} with parameters for placeholder substitution. * @param The target type. * @return returns de-serialized object + * + * @deprecated please directly apply {@link Utils#interpolateString(String, Map)} instead of passing parameters here */ + @Deprecated public static T unmarshal(InputStream is, ObjectMapper mapper, Map parameters) { - return unmarshal(is, mapper, new TypeReference() { + // it's not well documented which Serialization methods are aware of input that can contain + // multiple docs + String specFile; + try { + specFile = IOHelpers.readFully(is); + } catch (IOException e1) { + throw new RuntimeException("Could not read stream"); + } + if (containsMultipleDocuments(specFile)) { + return (T) getKubernetesResourceList(Collections.emptyMap(), specFile); + } else if (specFile.contains(DOCUMENT_DELIMITER)) { + specFile = specFile.replaceAll("^---([ \\t].*?)?\\r?\\n", ""); + specFile = specFile.replaceAll("\\n---([ \\t].*?)?\\r?\\n?$", "\n"); + } + + return unmarshal(new ByteArrayInputStream(specFile.getBytes(StandardCharsets.UTF_8)), mapper, new TypeReference() { @Override public Type getType() { return KubernetesResource.class; @@ -228,9 +241,8 @@ public Type getType() { } private static T unmarshal(InputStream is, ObjectMapper mapper, TypeReference type, Map parameters) { - try ( - InputStream wrapped = parameters != null && !parameters.isEmpty() ? ReplaceValueStream.replaceValues(is, parameters) - : is; + try (InputStream wrapped = parameters != null && !parameters.isEmpty() ? ReplaceValueStream.replaceValues(is, parameters) + : is; BufferedInputStream bis = new BufferedInputStream(wrapped)) { bis.mark(-1); int intch; @@ -296,7 +308,10 @@ public static T unmarshal(String str, final Class type) { * @param parameters A hashmap containing parameters * * @return returns de-serialized object + * + * @deprecated please directly apply {@link Utils#interpolateString(String, Map)} instead of passing parameters here */ + @Deprecated public static T unmarshal(String str, final Class type, Map parameters) { try (InputStream is = new ByteArrayInputStream(str.getBytes(StandardCharsets.UTF_8))) { return unmarshal(is, new TypeReference() { @@ -330,7 +345,10 @@ public static T unmarshal(InputStream is, final Class type) { * @param parameters A {@link Map} with parameters for placeholder substitution. * @param Template argument denoting type * @return returns de-serialized object + * + * @deprecated please directly apply {@link Utils#interpolateString(String, Map)} instead of passing parameters here */ + @Deprecated public static T unmarshal(InputStream is, final Class type, Map parameters) { return unmarshal(is, new TypeReference() { @Override @@ -361,7 +379,10 @@ public static T unmarshal(InputStream is, TypeReference type) { * @param Template argument denoting type * * @return returns de-serialized object + * + * @deprecated please directly apply {@link Utils#interpolateString(String, Map)} instead of passing parameters here */ + @Deprecated public static T unmarshal(InputStream is, TypeReference type, Map parameters) { return unmarshal(is, JSON_MAPPER, type, parameters); } @@ -401,20 +422,6 @@ private static boolean validate(String document) { return !document.isEmpty() && keyValueMatcher.find(); } - private static String readSpecFileFromInputStream(InputStream inputStream) { - ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); - byte[] buffer = new byte[1024]; - int length; - try { - while ((length = inputStream.read(buffer)) != -1) { - outputStream.write(buffer, 0, length); - } - return outputStream.toString(); - } catch (IOException e) { - throw new RuntimeException("Unable to read InputStream." + e); - } - } - /** * Create a copy of the resource via serialization. * diff --git a/kubernetes-client-api/src/test/java/io/fabric8/kubernetes/client/utils/SerializationSingleDocumentUnmarshalTest.java b/kubernetes-client-api/src/test/java/io/fabric8/kubernetes/client/utils/SerializationSingleDocumentUnmarshalTest.java index d8bf77536ef..936a85fa64b 100644 --- a/kubernetes-client-api/src/test/java/io/fabric8/kubernetes/client/utils/SerializationSingleDocumentUnmarshalTest.java +++ b/kubernetes-client-api/src/test/java/io/fabric8/kubernetes/client/utils/SerializationSingleDocumentUnmarshalTest.java @@ -21,8 +21,6 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; -import java.util.Collections; - import static org.assertj.core.api.Assertions.assertThat; class SerializationSingleDocumentUnmarshalTest { @@ -36,8 +34,7 @@ class SerializationSingleDocumentUnmarshalTest { void unmarshalWithSingleDocumentWithDocumentDelimiterShouldReturnKubernetesResource(String arg) { // When final KubernetesResource result = Serialization.unmarshal( - SerializationTest.class.getResourceAsStream(String.format("/serialization/%s", arg)), - Collections.emptyMap()); + SerializationTest.class.getResourceAsStream(String.format("/serialization/%s", arg))); // Then assertThat(result) .asInstanceOf(InstanceOfAssertFactories.type(Service.class))