Skip to content

Commit c343a01

Browse files
Merge pull request kubernetes-client#242 from archcosmo/intorstring-yaml-load
Add custom Constructor to Yaml to fix issue kubernetes-client#241
2 parents c7087e4 + a69e5a5 commit c343a01

File tree

2 files changed

+47
-1
lines changed

2 files changed

+47
-1
lines changed

util/src/main/java/io/kubernetes/client/util/Yaml.java

+25-1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
package io.kubernetes.client.util;
1414

1515
import com.google.common.reflect.ClassPath;
16+
import io.kubernetes.client.custom.IntOrString;
1617
import java.io.File;
1718
import java.io.FileReader;
1819
import java.io.IOException;
@@ -23,9 +24,13 @@
2324
import java.util.Set;
2425
import org.slf4j.Logger;
2526
import org.slf4j.LoggerFactory;
27+
import org.yaml.snakeyaml.constructor.Constructor;
28+
import org.yaml.snakeyaml.nodes.Node;
29+
import org.yaml.snakeyaml.nodes.ScalarNode;
2630

2731
public class Yaml {
28-
private static org.yaml.snakeyaml.Yaml yaml = new org.yaml.snakeyaml.Yaml();
32+
private static org.yaml.snakeyaml.Yaml yaml =
33+
new org.yaml.snakeyaml.Yaml(new CustomConstructor());
2934
private static Map<String, Class<?>> classes = new HashMap<>();
3035

3136
static final Logger logger = LoggerFactory.getLogger(Yaml.class);
@@ -185,4 +190,23 @@ public static <T> T loadAs(File f, Class<T> clazz) throws IOException {
185190
public static <T> T loadAs(Reader reader, Class<T> clazz) {
186191
return yaml.loadAs(reader, clazz);
187192
}
193+
194+
/** Defines constructor logic for custom types in this library. */
195+
public static class CustomConstructor extends Constructor {
196+
@Override
197+
protected Object constructObject(Node node) {
198+
if (node.getType() == IntOrString.class) {
199+
return constructIntOrString((ScalarNode) node);
200+
}
201+
return super.constructObject(node);
202+
}
203+
204+
private IntOrString constructIntOrString(ScalarNode node) {
205+
try {
206+
return new IntOrString(Integer.parseInt(node.getValue()));
207+
} catch (NumberFormatException err) {
208+
return new IntOrString(node.getValue());
209+
}
210+
}
211+
}
188212
}

util/src/test/java/io/kubernetes/client/util/YamlTest.java

+22
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import static org.junit.Assert.*;
1616

1717
import io.kubernetes.client.models.V1ObjectMeta;
18+
import io.kubernetes.client.models.V1ServicePort;
1819
import java.io.StringReader;
1920
import java.lang.reflect.Method;
2021
import org.junit.Test;
@@ -57,4 +58,25 @@ public void testLoad() {
5758
}
5859
}
5960
}
61+
62+
@Test
63+
public void testLoadIntOrString() {
64+
try {
65+
String strInput = "targetPort: test";
66+
String intInput = "targetPort: 1";
67+
68+
V1ServicePort stringPort = Yaml.loadAs(strInput, V1ServicePort.class);
69+
V1ServicePort intPort = Yaml.loadAs(intInput, V1ServicePort.class);
70+
71+
assertFalse(
72+
"Target port for 'stringPort' was parsed to an integer, string expected.",
73+
stringPort.getTargetPort().isInteger());
74+
assertTrue(
75+
"Target port for 'intPort' was parsed to a string, integer expected.",
76+
intPort.getTargetPort().isInteger());
77+
78+
} catch (Exception ex) {
79+
assertNull("Unexpected exception: " + ex.toString(), ex);
80+
}
81+
}
6082
}

0 commit comments

Comments
 (0)