Skip to content

Commit 27e792b

Browse files
authored
refactor(crd-generator): YamlDumpSettings as part of KubernetesSerialization settings
Signed-off-by: Marc Nuri <[email protected]>
1 parent 7b55de6 commit 27e792b

File tree

6 files changed

+70
-55
lines changed

6 files changed

+70
-55
lines changed

CHANGELOG.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
#### Improvements
88

99
* Fix #6863: ensuring SerialExecutor does not throw RejectedExecutionException to prevent unnecessary error logs
10-
* Fix #6763: CRDGenerator: YAML output customization
10+
* Fix #6763: (crd-generator) YAML output customization
1111

1212
#### Dependency Upgrade
1313

crd-generator/api-v2/src/main/java/io/fabric8/crdv2/generator/CRDGenerator.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@
2020
import io.fabric8.kubernetes.api.model.HasMetadata;
2121
import io.fabric8.kubernetes.client.utils.ApiVersionUtil;
2222
import io.fabric8.kubernetes.client.utils.KubernetesSerialization;
23-
import io.fabric8.kubernetes.client.utils.YamlDumpSettings;
2423
import io.fabric8.kubernetes.client.utils.YamlDumpSettingsBuilder;
2524
import org.slf4j.Logger;
2625
import org.slf4j.LoggerFactory;
@@ -183,7 +182,9 @@ public CRDGenerationInfo detailedGenerate() {
183182

184183
final ResolvingContext context;
185184
if (this.objectMapper == null) {
186-
context = ResolvingContext.defaultResolvingContext(implicitPreserveUnknownFields);
185+
context = ResolvingContext.defaultResolvingContext(
186+
implicitPreserveUnknownFields,
187+
new YamlDumpSettingsBuilder().setMinimizeQuotes(minQuotes).build());
187188
this.kubernetesSerialization = context.kubernetesSerialization;
188189
} else {
189190
context = new ResolvingContext(this.objectMapper, this.kubernetesSerialization, implicitPreserveUnknownFields);
@@ -220,8 +221,7 @@ public void emitCrd(HasMetadata crd, Set<String> dependentClassNames, CRDGenerat
220221
final String outputName = getOutputName(crdName, version);
221222
try (final OutputStreamWriter writer = new OutputStreamWriter(output.outputFor(outputName), StandardCharsets.UTF_8)) {
222223
writer.write("# Generated by Fabric8 CRDGenerator, manual edits might get overwritten!\n");
223-
YamlDumpSettings yamlSettings = new YamlDumpSettingsBuilder().setMinimizeQuotes(minQuotes).build();
224-
String yaml = kubernetesSerialization.asYaml(crd, yamlSettings);
224+
String yaml = kubernetesSerialization.asYaml(crd);
225225
// strip the explicit start added by default
226226
writer.write(yaml.substring(4));
227227
final URI fileURI = output.crdURI(outputName);

crd-generator/api-v2/src/main/java/io/fabric8/crdv2/generator/ResolvingContext.java

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@
3030
import com.fasterxml.jackson.module.jsonSchema.factories.WrapperFactory;
3131
import com.fasterxml.jackson.module.jsonSchema.types.ObjectSchema;
3232
import io.fabric8.kubernetes.client.utils.KubernetesSerialization;
33+
import io.fabric8.kubernetes.client.utils.YamlDumpSettings;
34+
import io.fabric8.kubernetes.client.utils.YamlDumpSettingsBuilder;
3335

3436
import java.util.LinkedHashMap;
3537
import java.util.Map;
@@ -92,15 +94,21 @@ public JsonObjectFormatVisitor expectObjectFormat(JavaType convertedType) {
9294
final Map<String, GeneratorObjectSchema> uriToJacksonSchema;
9395
final boolean implicitPreserveUnknownFields;
9496

95-
private static KubernetesSerialization KUBERNETES_SERIALIZATION;
9697
private static ObjectMapper OBJECT_MAPPER;
9798

9899
public static ResolvingContext defaultResolvingContext(boolean implicitPreserveUnknownFields) {
99-
if (KUBERNETES_SERIALIZATION == null) {
100+
return defaultResolvingContext(implicitPreserveUnknownFields, new YamlDumpSettingsBuilder().build());
101+
}
102+
103+
public static ResolvingContext defaultResolvingContext(boolean implicitPreserveUnknownFields,
104+
YamlDumpSettings yamlDumpSettings) {
105+
if (OBJECT_MAPPER == null) {
100106
OBJECT_MAPPER = new ObjectMapper();
101-
KUBERNETES_SERIALIZATION = new KubernetesSerialization(OBJECT_MAPPER, false);
102107
}
103-
return new ResolvingContext(OBJECT_MAPPER, KUBERNETES_SERIALIZATION, implicitPreserveUnknownFields);
108+
return new ResolvingContext(
109+
OBJECT_MAPPER,
110+
new KubernetesSerialization(OBJECT_MAPPER, false, yamlDumpSettings),
111+
implicitPreserveUnknownFields);
104112
}
105113

106114
public ResolvingContext forkContext() {

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

Lines changed: 16 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ public class KubernetesSerialization {
6969
private final UnmatchedFieldTypeModule unmatchedFieldTypeModule = new UnmatchedFieldTypeModule();
7070
private KubernetesDeserializer kubernetesDeserializer;
7171
private final boolean searchClassloaders;
72+
private final YamlDumpSettings yamlDumpSettings;
7273

7374
/**
7475
* Creates a new instance with a fresh ObjectMapper
@@ -81,11 +82,25 @@ public KubernetesSerialization() {
8182
* Creates a new instance with the given ObjectMapper, which will be configured for use for
8283
* kubernetes resource serialization / deserialization.
8384
*
84-
* @param searchClassloaders if {@link KubernetesResource} should be automatically discovered via {@link ServiceLoader}
85+
* @param mapper the ObjectMapper to use.
86+
* @param searchClassloaders if {@link KubernetesResource} should be automatically discovered via {@link ServiceLoader}.
8587
*/
8688
public KubernetesSerialization(ObjectMapper mapper, boolean searchClassloaders) {
89+
this(mapper, searchClassloaders, new YamlDumpSettingsBuilder().build());
90+
}
91+
92+
/**
93+
* Creates a new instance with the given ObjectMapper, which will be configured for use for
94+
* kubernetes resource serialization / deserialization.
95+
*
96+
* @param mapper the ObjectMapper to use.
97+
* @param searchClassloaders if {@link KubernetesResource} should be automatically discovered via {@link ServiceLoader}.
98+
* @param yamlDumpSettings configuration for YAML serialization.
99+
*/
100+
public KubernetesSerialization(ObjectMapper mapper, boolean searchClassloaders, YamlDumpSettings yamlDumpSettings) {
87101
this.mapper = mapper;
88102
this.searchClassloaders = searchClassloaders;
103+
this.yamlDumpSettings = yamlDumpSettings;
89104
configureMapper(mapper);
90105
}
91106

@@ -188,23 +203,6 @@ public <T> String asJson(T object) {
188203
* @return a String containing a JSON representation of the provided object.
189204
*/
190205
public <T> String asYaml(T object) {
191-
return asYaml(object, new YamlDumpSettingsBuilder().build());
192-
}
193-
194-
/**
195-
* Returns a YAML representation of the given object.
196-
*
197-
* <p>
198-
* If the provided object contains a JsonAnyGetter annotated method with a Map that contains an entry that
199-
* overrides a field of the provided object, the Map entry will take precedence upon serialization. Properties won't
200-
* be duplicated.
201-
*
202-
* @param object the object to serialize.
203-
* @param yamlDumpSettings configuration for YAML serialization.
204-
* @param <T> the type of the object being serialized.
205-
* @return a String containing a JSON representation of the provided object.
206-
*/
207-
public <T> String asYaml(T object, YamlDumpSettings yamlDumpSettings) {
208206
DumpSettings settings = DumpSettings.builder()
209207
.setExplicitStart(true).setDefaultFlowStyle(FlowStyle.BLOCK).build();
210208
final Dump yaml = new Dump(settings, new StandardRepresenter(settings) {

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
*/
2121
public class YamlDumpSettings {
2222

23-
private boolean minQuotes;
23+
private final boolean minQuotes;
2424

2525
YamlDumpSettings(boolean minQuotes) {
2626
this.minQuotes = minQuotes;

kubernetes-client-api/src/test/java/io/fabric8/kubernetes/client/utils/KubernetesSerializationTest.java

Lines changed: 36 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -34,11 +34,7 @@
3434
import org.junit.jupiter.params.provider.Arguments;
3535
import org.junit.jupiter.params.provider.MethodSource;
3636

37-
import java.io.File;
3837
import java.io.IOException;
39-
import java.nio.charset.StandardCharsets;
40-
import java.nio.file.Files;
41-
import java.util.stream.Collectors;
4238
import java.util.stream.Stream;
4339

4440
import static org.assertj.core.api.Assertions.assertThat;
@@ -71,29 +67,6 @@ void withRegisteredKubernetesResourceShouldDeserializeToPod() {
7167
.isInstanceOf(io.fabric8.kubernetes.api.model.Pod.class);
7268
}
7369

74-
@Test
75-
void asYaml() throws Exception {
76-
final String input = readYamlToString("/serialization/test-crd-schema.yml");
77-
final CustomResourceDefinition crd = Serialization.unmarshal(input, CustomResourceDefinition.class);
78-
79-
String result = kubernetesSerialization.asYaml(crd);
80-
assertThat(result).asString().contains("\"widgets.test.fabric8.io\"");
81-
82-
result = kubernetesSerialization.asYaml(crd, new YamlDumpSettingsBuilder().build());
83-
assertThat(result).asString().contains("\"widgets.test.fabric8.io\"");
84-
85-
result = kubernetesSerialization.asYaml(crd, new YamlDumpSettingsBuilder().setMinimizeQuotes(true).build());
86-
assertThat(result).asString().contains("widgets.test.fabric8.io").doesNotContain("\"widgets.test.fabric8.io\"");
87-
}
88-
89-
private String readYamlToString(String path) throws IOException {
90-
return Files.readAllLines(
91-
new File(KubernetesSerializationTest.class.getResource(path).getFile()).toPath(), StandardCharsets.UTF_8)
92-
.stream()
93-
.filter(line -> !line.startsWith("#"))
94-
.collect(Collectors.joining("\n"));
95-
}
96-
9770
@ParameterizedTest(name = "{index}: {0} {1} deserializes to {2}")
9871
@MethodSource("sameGVK")
9972
void withCollidingRegisteredKubernetesResourceShouldDeserializeAppropriate(
@@ -116,6 +89,42 @@ private Stream<Arguments> sameGVK() {
11689
}
11790
}
11891

92+
@Nested
93+
class AsYaml {
94+
95+
private CustomResourceDefinition inputResource;
96+
97+
@BeforeEach
98+
void loadYamlAsString() throws IOException {
99+
try (var is = KubernetesSerializationTest.class.getResourceAsStream("/serialization/test-crd-schema.yml")) {
100+
inputResource = Serialization.unmarshal(new String(is.readAllBytes()), CustomResourceDefinition.class);
101+
}
102+
}
103+
104+
@Test
105+
void asYamlWithDefaults() {
106+
assertThat(new KubernetesSerialization().asYaml(inputResource))
107+
.contains("\"widgets.test.fabric8.io\"");
108+
}
109+
110+
@Test
111+
void asYamlWithDefaultYamlDumpSettings() {
112+
kubernetesSerialization = new KubernetesSerialization(new ObjectMapper(), true,
113+
new YamlDumpSettingsBuilder().build());
114+
assertThat(kubernetesSerialization.asYaml(inputResource))
115+
.contains("\"widgets.test.fabric8.io\"");
116+
}
117+
118+
@Test
119+
void asYamlWithDefaultYamlDumpSettingsMinimizeQuotes() {
120+
kubernetesSerialization = new KubernetesSerialization(new ObjectMapper(), true,
121+
new YamlDumpSettingsBuilder().setMinimizeQuotes(true).build());
122+
assertThat(kubernetesSerialization.asYaml(inputResource))
123+
.contains("widgets.test.fabric8.io");
124+
}
125+
126+
}
127+
119128
@Version("v1")
120129
@Group("custom.core.kubernetes.io")
121130
@JsonDeserialize(using = JsonDeserializer.None.class)

0 commit comments

Comments
 (0)