Skip to content
This repository was archived by the owner on Jun 19, 2024. It is now read-only.

Commit fa070a9

Browse files
erikgbrohanKanojia
authored andcommitted
Resolve #1718: Support for binary files in fmp-configmap-file
1 parent 56d96f5 commit fa070a9

File tree

4 files changed

+151
-71
lines changed

4 files changed

+151
-71
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ After this we will switch probably to real [Semantic Versioning 2.0.0](http://se
2626
* Feature #1706: Prometheus Enricher; Configuration support for Prometheus path
2727
* Fix #1715: ApplyService#applyProjectRequest should be (truly) idempotent
2828
* Added generator support for Open Liberty
29+
* Fix #1718: Support for binary files in fmp-configmap-file
2930

3031
### 4.2.0 (01-08-2019)
3132
* Fix #1638: Remove enrichAll parameter from ImageChangeTriggerEnricher

enricher/standard/src/main/java/io/fabric8/maven/enricher/standard/ConfigMapEnricher.java

Lines changed: 53 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -19,19 +19,25 @@
1919
import io.fabric8.kubernetes.api.model.ConfigMapBuilder;
2020
import io.fabric8.kubernetes.api.model.KubernetesListBuilder;
2121
import io.fabric8.maven.core.config.ConfigMapEntry;
22-
import io.fabric8.maven.core.config.ResourceConfig;
2322
import io.fabric8.maven.core.config.PlatformMode;
23+
import io.fabric8.maven.core.config.ResourceConfig;
2424
import io.fabric8.maven.enricher.api.BaseEnricher;
2525
import io.fabric8.maven.enricher.api.MavenEnricherContext;
2626

2727
import java.io.IOException;
28+
import java.nio.ByteBuffer;
29+
import java.nio.charset.CharacterCodingException;
30+
import java.nio.charset.CodingErrorAction;
31+
import java.nio.charset.StandardCharsets;
2832
import java.nio.file.Files;
2933
import java.nio.file.Paths;
30-
import java.util.HashMap;
34+
import java.util.Base64;
3135
import java.util.Iterator;
3236
import java.util.Map;
3337
import java.util.Set;
3438

39+
import static java.util.Collections.singletonMap;
40+
3541
public class ConfigMapEnricher extends BaseEnricher {
3642

3743
protected static final String PREFIX_ANNOTATION = "maven.fabric8.io/cm/";
@@ -53,34 +59,40 @@ private void addAnnotations(KubernetesListBuilder builder) {
5359
public void visit(ConfigMapBuilder element) {
5460
final Map<String, String> annotations = element.buildMetadata().getAnnotations();
5561
try {
56-
final Map<String, String> configMapAnnotations = createConfigMapFromAnnotations(annotations);
57-
element.addToData(configMapAnnotations);
62+
addConfigMapFromAnnotations(annotations, element);
5863
} catch (IOException e) {
5964
throw new IllegalArgumentException(e);
6065
}
6166
}
6267
});
6368
}
6469

65-
private Map<String, String> createConfigMapFromAnnotations(final Map<String, String> annotations) throws IOException {
70+
private void addConfigMapFromAnnotations(final Map<String, String> annotations, final ConfigMapBuilder configMapBuilder) throws IOException {
6671
final Set<Map.Entry<String, String>> entries = annotations.entrySet();
67-
final Map<String, String> configMapFileLocations = new HashMap<>();
68-
69-
for(Iterator<Map.Entry<String, String>> it = entries.iterator(); it.hasNext(); ) {
72+
for (Iterator<Map.Entry<String, String>> it = entries.iterator(); it.hasNext(); ) {
7073
Map.Entry<String, String> entry = it.next();
7174
final String key = entry.getKey();
7275

73-
if(key.startsWith(PREFIX_ANNOTATION)) {
74-
configMapFileLocations.put(getOutput(key), readContent(entry.getValue()));
76+
if (key.startsWith(PREFIX_ANNOTATION)) {
77+
addConfigMapEntryFromFile(configMapBuilder, getOutput(key), entry.getValue());
7578
it.remove();
7679
}
7780
}
78-
79-
return configMapFileLocations;
8081
}
8182

82-
private String readContent(String location) throws IOException {
83-
return new String(Files.readAllBytes(Paths.get(location)));
83+
private void addConfigMapEntryFromFile(final ConfigMapBuilder configMapBuilder, final String key, final String filePath) throws IOException {
84+
final byte[] bytes = Files.readAllBytes(Paths.get(filePath));
85+
try {
86+
StandardCharsets.UTF_8.newDecoder()
87+
.onMalformedInput(CodingErrorAction.REPORT)
88+
.onUnmappableCharacter(CodingErrorAction.REPORT)
89+
.decode(ByteBuffer.wrap(bytes));
90+
final String value = new String(bytes);
91+
configMapBuilder.addToData(singletonMap(key, value));
92+
} catch (CharacterCodingException e) {
93+
final String value = Base64.getEncoder().encodeToString(bytes);
94+
configMapBuilder.addToBinaryData(singletonMap(key, value));
95+
}
8496
}
8597

8698
private String getOutput(String key) {
@@ -89,57 +101,51 @@ private String getOutput(String key) {
89101

90102
private void addConfigMapFromXmlConfigurations(KubernetesListBuilder builder) {
91103
io.fabric8.maven.core.config.ConfigMap configMap = getConfigMapFromXmlConfiguration();
92-
final Map<String, String> configMapFromConfiguration;
93104
try {
94-
configMapFromConfiguration = createConfigMapFromConfiguration(configMap);
95-
String configMapName = (configMap == null || configMap.getName() == null || configMap.getName().trim().isEmpty()) ? "xmlconfig" : configMap.getName().trim();
96-
log.debug("configMapName :: ".concat(configMapName));
97-
98-
if(!configMapFromConfiguration.isEmpty() && !checkIfItemExists(builder, configMapName)) {
99-
ConfigMapBuilder element = new ConfigMapBuilder();
100-
element.withNewMetadata().withName(configMapName).endMetadata();
101-
element.addToData(configMapFromConfiguration);
102-
103-
builder.addToConfigMapItems(element.build());
105+
if (configMap == null) {
106+
return;
107+
}
108+
String configMapName = configMap.getName() == null || configMap.getName().trim().isEmpty() ? "xmlconfig" : configMap.getName().trim();
109+
if (checkIfItemExists(builder, configMapName)) {
110+
return;
104111
}
105-
} catch (IOException e) {
106-
throw new IllegalArgumentException(e);
107-
}
108-
}
109-
110-
private boolean checkIfItemExists(KubernetesListBuilder builder, String name) {
111-
return builder.buildItems().stream().filter(item -> item.getKind().equals("ConfigMap")).anyMatch(item -> item.getMetadata().getName().equals(name));
112-
}
113-
114-
private io.fabric8.maven.core.config.ConfigMap getConfigMapFromXmlConfiguration() {
115-
ResourceConfig resourceConfig = getConfiguration().getResource().orElse(null);
116-
if(resourceConfig != null && resourceConfig.getConfigMap() != null) {
117-
return resourceConfig.getConfigMap();
118-
}
119-
return null;
120-
}
121112

122-
private Map<String, String> createConfigMapFromConfiguration(io.fabric8.maven.core.config.ConfigMap configMap) throws IOException {
123-
final Map<String, String> configMapData = new HashMap<>();
113+
ConfigMapBuilder configMapBuilder = new ConfigMapBuilder();
114+
configMapBuilder.withNewMetadata().withName(configMapName).endMetadata();
124115

125-
if (configMap != null) {
126116
for (ConfigMapEntry configMapEntry : configMap.getEntries()) {
127117
String name = configMapEntry.getName();
128118
final String value = configMapEntry.getValue();
129119
if (name != null && value != null) {
130-
configMapData.put(name, value);
120+
configMapBuilder.addToData(name, value);
131121
} else {
132122
final String file = configMapEntry.getFile();
133123
if (file != null) {
134124
if (name == null) {
135125
name = Paths.get(file).getFileName().toString();
136126
}
137-
configMapData.put(name, readContent(file));
127+
addConfigMapEntryFromFile(configMapBuilder, name, file);
138128
}
139129
}
140130
}
131+
132+
if (!configMapBuilder.getData().isEmpty() || !configMapBuilder.getBinaryData().isEmpty()) {
133+
builder.addToConfigMapItems(configMapBuilder.build());
134+
}
135+
} catch (IOException e) {
136+
throw new IllegalArgumentException(e);
141137
}
142-
return configMapData;
143138
}
144139

140+
private boolean checkIfItemExists(KubernetesListBuilder builder, String name) {
141+
return builder.buildItems().stream().filter(item -> item.getKind().equals("ConfigMap")).anyMatch(item -> item.getMetadata().getName().equals(name));
142+
}
143+
144+
private io.fabric8.maven.core.config.ConfigMap getConfigMapFromXmlConfiguration() {
145+
ResourceConfig resourceConfig = getConfiguration().getResource().orElse(null);
146+
if (resourceConfig != null && resourceConfig.getConfigMap() != null) {
147+
return resourceConfig.getConfigMap();
148+
}
149+
return null;
150+
}
145151
}

enricher/standard/src/test/java/io/fabric8/maven/enricher/standard/ConfigMapEnricherTest.java

Lines changed: 96 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -19,16 +19,22 @@
1919
import io.fabric8.kubernetes.api.model.ConfigMapBuilder;
2020
import io.fabric8.kubernetes.api.model.KubernetesListBuilder;
2121
import io.fabric8.kubernetes.api.model.ObjectMetaBuilder;
22+
import io.fabric8.maven.core.config.ConfigMapEntry;
2223
import io.fabric8.maven.core.config.PlatformMode;
2324
import io.fabric8.maven.core.config.ResourceConfig;
2425
import io.fabric8.maven.core.model.Configuration;
2526
import io.fabric8.maven.enricher.api.MavenEnricherContext;
26-
import java.util.HashMap;
27-
import java.util.Map;
2827
import mockit.Expectations;
2928
import mockit.Mocked;
3029
import org.junit.Test;
3130

31+
import java.io.IOException;
32+
import java.net.URISyntaxException;
33+
import java.nio.file.Files;
34+
import java.nio.file.Paths;
35+
import java.util.HashMap;
36+
import java.util.Map;
37+
3238
import static org.assertj.core.api.Assertions.assertThat;
3339

3440
public class ConfigMapEnricherTest {
@@ -37,47 +43,105 @@ public class ConfigMapEnricherTest {
3743
private MavenEnricherContext context;
3844

3945
@Test
40-
public void should_materialize_file_content_from_annotation() {
41-
42-
// Given
46+
public void should_materialize_file_content_from_annotation() throws Exception {
47+
final ConfigMap baseConfigMap = createAnnotationConfigMap("test-application.properties", "src/test/resources/test-application.properties");
48+
final KubernetesListBuilder builder = new KubernetesListBuilder()
49+
.addToConfigMapItems(baseConfigMap);
50+
new ConfigMapEnricher(context).create(PlatformMode.kubernetes, builder);
4351

44-
new Expectations() {
45-
{{
46-
context.getConfiguration();
47-
result = new Configuration.Builder()
48-
.resource(new ResourceConfig())
49-
.build();
50-
}}
52+
final ConfigMap configMap = (ConfigMap) builder.buildFirstItem();
5153

52-
};
54+
final Map<String, String> data = configMap.getData();
55+
assertThat(data)
56+
.containsEntry("test-application.properties", readFileContentsAsString("src/test/resources/test-application.properties"));
5357

54-
final ConfigMapEnricher configMapEnricher =
55-
new ConfigMapEnricher(context);
56-
final KubernetesListBuilder builder = new KubernetesListBuilder();
57-
builder.addToConfigMapItems(createBaseConfigMap());
58+
final Map<String, String> annotations = configMap.getMetadata().getAnnotations();
59+
assertThat(annotations)
60+
.isEmpty();
61+
}
5862

59-
// When
60-
configMapEnricher.create(PlatformMode.kubernetes, builder);
63+
@Test
64+
public void should_materialize_binary_file_content_from_annotation() throws Exception {
65+
final ConfigMap baseConfigMap = createAnnotationConfigMap("test.bin", "src/test/resources/test.bin");
66+
final KubernetesListBuilder builder = new KubernetesListBuilder()
67+
.addToConfigMapItems(baseConfigMap);
68+
new ConfigMapEnricher(context).create(PlatformMode.kubernetes, builder);
6169

62-
// Then
6370
final ConfigMap configMap = (ConfigMap) builder.buildFirstItem();
6471

6572
final Map<String, String> data = configMap.getData();
6673
assertThat(data)
67-
.containsKey("test-application.properties");
74+
.isEmpty();
75+
76+
final Map<String, String> binaryData = configMap.getBinaryData();
77+
assertThat(binaryData)
78+
.containsEntry("test.bin", "wA==");
6879

6980
final Map<String, String> annotations = configMap.getMetadata().getAnnotations();
7081
assertThat(annotations)
7182
.isEmpty();
7283
}
7384

74-
private ConfigMap createBaseConfigMap() {
85+
@Test
86+
public void should_materialize_file_content_from_xml() throws Exception {
87+
final io.fabric8.maven.core.config.ConfigMap baseConfigMap = createXmlConfigMap("src/test/resources/test-application.properties");
88+
final ResourceConfig config = new ResourceConfig.Builder()
89+
.withConfigMap(baseConfigMap)
90+
.build();
91+
new Expectations() {{
92+
context.getConfiguration();
93+
result = new Configuration.Builder().resource(config).build();
94+
}};
95+
96+
final KubernetesListBuilder builder = new KubernetesListBuilder();
97+
new ConfigMapEnricher(context).create(PlatformMode.kubernetes, builder);
98+
99+
final ConfigMap configMap = (ConfigMap) builder.buildFirstItem();
100+
101+
final Map<String, String> data = configMap.getData();
102+
assertThat(data)
103+
.containsEntry("test-application.properties", readFileContentsAsString("src/test/resources/test-application.properties"));
104+
}
105+
106+
@Test
107+
public void should_materialize_binary_file_content_from_xml() throws Exception {
108+
final io.fabric8.maven.core.config.ConfigMap baseConfigMap = createXmlConfigMap("src/test/resources/test.bin");
109+
final ResourceConfig config = new ResourceConfig.Builder()
110+
.withConfigMap(baseConfigMap)
111+
.build();
112+
new Expectations() {{
113+
context.getConfiguration();
114+
result = new Configuration.Builder().resource(config).build();
115+
}};
116+
117+
final KubernetesListBuilder builder = new KubernetesListBuilder();
118+
new ConfigMapEnricher(context).create(PlatformMode.kubernetes, builder);
119+
120+
final ConfigMap configMap = (ConfigMap) builder.buildFirstItem();
121+
122+
final Map<String, String> data = configMap.getData();
123+
assertThat(data)
124+
.isEmpty();
125+
126+
final Map<String, String> binaryData = configMap.getBinaryData();
127+
assertThat(binaryData)
128+
.containsEntry("test.bin", "wA==");
129+
}
130+
131+
private io.fabric8.maven.core.config.ConfigMap createXmlConfigMap(final String file) {
132+
final ConfigMapEntry configMapEntry = new ConfigMapEntry();
133+
configMapEntry.setFile(file);
134+
final io.fabric8.maven.core.config.ConfigMap configMap = new io.fabric8.maven.core.config.ConfigMap();
135+
configMap.addEntry(configMapEntry);
136+
return configMap;
137+
}
138+
139+
private ConfigMap createAnnotationConfigMap(final String key, final String file) {
75140
ObjectMetaBuilder metaBuilder = new ObjectMetaBuilder()
76141
.withNamespace("default");
77142

78143
Map<String, String> annotations = new HashMap<>();
79-
annotations.put(ConfigMapEnricher.PREFIX_ANNOTATION + "test-application.properties",
80-
"src/test/resources/test-application.properties");
144+
annotations.put(ConfigMapEnricher.PREFIX_ANNOTATION + key, file);
81145
metaBuilder = metaBuilder.withAnnotations(annotations);
82146

83147
Map<String, String> data = new HashMap<>();
@@ -86,4 +150,12 @@ private ConfigMap createBaseConfigMap() {
86150
.withMetadata(metaBuilder.build())
87151
.build();
88152
}
153+
154+
private String readFileContentsAsString(final String filePath) throws URISyntaxException, IOException {
155+
return new String(readFileContentAsBytes(filePath));
156+
}
157+
158+
private byte[] readFileContentAsBytes(final String filePath) throws IOException, URISyntaxException {
159+
return Files.readAllBytes(Paths.get(filePath));
160+
}
89161
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+

0 commit comments

Comments
 (0)