This is an automated email from the ASF dual-hosted git repository.
acosentino pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel.git
The following commit(s) were added to refs/heads/main by this push:
new 468c699f65a CAMEL-20789: Download binary content of Secret or Config
Map in property resolver (#14195)
468c699f65a is described below
commit 468c699f65aed8597fc6e1daf68b7485808dbce7
Author: Marco Carletti <[email protected]>
AuthorDate: Tue May 21 06:29:09 2024 +0200
CAMEL-20789: Download binary content of Secret or Config Map in property
resolver (#14195)
---
.../camel/properties-function/configmap-binary | 2 +
.../apache/camel/properties-function/secret-binary | 2 +
...n.java => BaseConfigMapPropertiesFunction.java} | 10 +----
.../properties/BasePropertiesFunction.java | 24 +++++++++-
...tion.java => BaseSecretPropertiesFunction.java} | 12 ++---
.../ConfigMapBinaryPropertiesFunction.java | 29 ++++++++++++
.../properties/ConfigMapPropertiesFunction.java | 44 +-----------------
.../properties/SecretBinaryPropertiesFunction.java | 29 ++++++++++++
.../properties/SecretPropertiesFunction.java | 44 +-----------------
.../kubernetes/KubernetesTestSupport.java | 5 +++
...ConfigMapBinaryMountPropertiesFunctionTest.java | 49 +++++++++++++++++++++
.../ConfigMapPropertiesFunctionLocalModeTest.java | 17 +++++++
.../ConfigMapPropertiesFunctionRouteTest.java | 23 +++++++++-
.../ConfigMapPropertiesFunctionTest.java | 2 +-
.../SecretBinaryMountPropertiesFunctionTest.java | 48 ++++++++++++++++++++
.../SecretPropertiesFunctionRouteTest.java | 18 +++++++-
.../src/test/resources/binary-example/binary.bin | Bin 0 -> 256 bytes
.../ROOT/pages/using-propertyplaceholder.adoc | 15 ++++++-
18 files changed, 265 insertions(+), 108 deletions(-)
diff --git
a/components/camel-kubernetes/src/generated/resources/META-INF/services/org/apache/camel/properties-function/configmap-binary
b/components/camel-kubernetes/src/generated/resources/META-INF/services/org/apache/camel/properties-function/configmap-binary
new file mode 100644
index 00000000000..7262cf7a0e1
--- /dev/null
+++
b/components/camel-kubernetes/src/generated/resources/META-INF/services/org/apache/camel/properties-function/configmap-binary
@@ -0,0 +1,2 @@
+# Generated by camel build tools - do NOT edit this file!
+class=org.apache.camel.component.kubernetes.properties.ConfigMapBinaryPropertiesFunction
diff --git
a/components/camel-kubernetes/src/generated/resources/META-INF/services/org/apache/camel/properties-function/secret-binary
b/components/camel-kubernetes/src/generated/resources/META-INF/services/org/apache/camel/properties-function/secret-binary
new file mode 100644
index 00000000000..f2669ea07a8
--- /dev/null
+++
b/components/camel-kubernetes/src/generated/resources/META-INF/services/org/apache/camel/properties-function/secret-binary
@@ -0,0 +1,2 @@
+# Generated by camel build tools - do NOT edit this file!
+class=org.apache.camel.component.kubernetes.properties.SecretBinaryPropertiesFunction
diff --git
a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/properties/ConfigMapPropertiesFunction.java
b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/properties/BaseConfigMapPropertiesFunction.java
similarity index 88%
copy from
components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/properties/ConfigMapPropertiesFunction.java
copy to
components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/properties/BaseConfigMapPropertiesFunction.java
index 45c557c2333..4c537125d9c 100644
---
a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/properties/ConfigMapPropertiesFunction.java
+++
b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/properties/BaseConfigMapPropertiesFunction.java
@@ -26,13 +26,7 @@ import org.apache.camel.spi.PropertiesFunction;
/**
* A {@link PropertiesFunction} that can lookup from Kubernetes configmaps.
*/
[email protected]("configmap")
-public class ConfigMapPropertiesFunction extends BasePropertiesFunction {
-
- @Override
- public String getName() {
- return "configmap";
- }
+abstract class BaseConfigMapPropertiesFunction extends BasePropertiesFunction {
@Override
Path getMountPath() {
@@ -55,7 +49,7 @@ public class ConfigMapPropertiesFunction extends
BasePropertiesFunction {
// need to decode base64
byte[] data = Base64.getDecoder().decode(answer);
if (data != null) {
- answer = new String(data);
+ answer = handleData(key, data);
}
}
}
diff --git
a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/properties/BasePropertiesFunction.java
b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/properties/BasePropertiesFunction.java
index 9c003005031..4b27ec00127 100644
---
a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/properties/BasePropertiesFunction.java
+++
b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/properties/BasePropertiesFunction.java
@@ -245,7 +245,11 @@ abstract class BasePropertiesFunction extends
ServiceSupport implements Properti
Path file = root.resolve(name.toLowerCase(Locale.US)).resolve(key);
if (Files.exists(file) && !Files.isDirectory(file)) {
try {
- answer = Files.readString(file, StandardCharsets.UTF_8);
+ if (isBinaryProperty()) {
+ answer =
writeDataToTempFile(file.getFileName().toString(), Files.readAllBytes(file));
+ } else {
+ answer = Files.readString(file,
StandardCharsets.UTF_8);
+ }
} catch (IOException e) {
// ignore
}
@@ -265,4 +269,22 @@ abstract class BasePropertiesFunction extends
ServiceSupport implements Properti
abstract Path getMountPath();
abstract String lookup(String name, String key, String defaultValue);
+
+ protected String handleData(String key, byte[] raw) {
+ return isBinaryProperty() ? writeDataToTempFile(key, raw) : new
String(raw);
+ }
+
+ private boolean isBinaryProperty() {
+ return getName().endsWith("-binary");
+ }
+
+ protected String writeDataToTempFile(String fileName, byte[] data) {
+ try {
+ final Path filePath =
Files.createTempDirectory("camel").resolve(fileName);
+ Files.write(filePath, data);
+ return filePath.toAbsolutePath().toString();
+ } catch (IOException e) {
+ throw new RuntimeException(e.getMessage(), e);
+ }
+ }
}
diff --git
a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/properties/SecretPropertiesFunction.java
b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/properties/BaseSecretPropertiesFunction.java
similarity index 88%
copy from
components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/properties/SecretPropertiesFunction.java
copy to
components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/properties/BaseSecretPropertiesFunction.java
index 1dc32727705..452458960db 100644
---
a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/properties/SecretPropertiesFunction.java
+++
b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/properties/BaseSecretPropertiesFunction.java
@@ -24,15 +24,9 @@ import io.fabric8.kubernetes.api.model.Secret;
import org.apache.camel.spi.PropertiesFunction;
/**
- * A {@link PropertiesFunction} that can lookup from Kubernetes secret.
+ * A {@link PropertiesFunction} that can lookup from Kubernetes secrets.
*/
[email protected]("secret")
-public class SecretPropertiesFunction extends BasePropertiesFunction {
-
- @Override
- public String getName() {
- return "secret";
- }
+abstract class BaseSecretPropertiesFunction extends BasePropertiesFunction {
@Override
Path getMountPath() {
@@ -55,7 +49,7 @@ public class SecretPropertiesFunction extends
BasePropertiesFunction {
if (answer != null) {
byte[] data = Base64.getDecoder().decode(answer);
if (data != null) {
- answer = new String(data);
+ answer = handleData(key, data);
}
}
}
diff --git
a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/properties/ConfigMapBinaryPropertiesFunction.java
b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/properties/ConfigMapBinaryPropertiesFunction.java
new file mode 100644
index 00000000000..bcf4ecc977a
--- /dev/null
+++
b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/properties/ConfigMapBinaryPropertiesFunction.java
@@ -0,0 +1,29 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.kubernetes.properties;
+
+/**
+ * Resolves binary type configmap keys .
+ */
[email protected]("configmap-binary")
+public class ConfigMapBinaryPropertiesFunction extends
BaseConfigMapPropertiesFunction {
+
+ @Override
+ public String getName() {
+ return "configmap-binary";
+ }
+}
diff --git
a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/properties/ConfigMapPropertiesFunction.java
b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/properties/ConfigMapPropertiesFunction.java
index 45c557c2333..9f0df564235 100644
---
a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/properties/ConfigMapPropertiesFunction.java
+++
b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/properties/ConfigMapPropertiesFunction.java
@@ -16,54 +16,14 @@
*/
package org.apache.camel.component.kubernetes.properties;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.util.Base64;
-
-import io.fabric8.kubernetes.api.model.ConfigMap;
-import org.apache.camel.spi.PropertiesFunction;
-
/**
- * A {@link PropertiesFunction} that can lookup from Kubernetes configmaps.
+ * Resolves String type configmap keys .
*/
@org.apache.camel.spi.annotations.PropertiesFunction("configmap")
-public class ConfigMapPropertiesFunction extends BasePropertiesFunction {
+public class ConfigMapPropertiesFunction extends
BaseConfigMapPropertiesFunction {
@Override
public String getName() {
return "configmap";
}
-
- @Override
- Path getMountPath() {
- if (getMountPathConfigMaps() != null) {
- return Paths.get(getMountPathConfigMaps());
- }
- return null;
- }
-
- @Override
- String lookup(String name, String key, String defaultValue) {
- String answer = null;
- ConfigMap cm = getClient().configMaps().withName(name).get();
- if (cm != null) {
- answer = cm.getData() != null ? cm.getData().get(key) : null;
- if (answer == null) {
- // maybe a binary data
- answer = cm.getBinaryData() != null ?
cm.getBinaryData().get(key) : null;
- if (answer != null) {
- // need to decode base64
- byte[] data = Base64.getDecoder().decode(answer);
- if (data != null) {
- answer = new String(data);
- }
- }
- }
- }
- if (answer == null) {
- return defaultValue;
- }
-
- return answer;
- }
}
diff --git
a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/properties/SecretBinaryPropertiesFunction.java
b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/properties/SecretBinaryPropertiesFunction.java
new file mode 100644
index 00000000000..52f06565908
--- /dev/null
+++
b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/properties/SecretBinaryPropertiesFunction.java
@@ -0,0 +1,29 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.kubernetes.properties;
+
+/**
+ * Resolves binary type secret keys .
+ */
[email protected]("secret-binary")
+public class SecretBinaryPropertiesFunction extends
BaseSecretPropertiesFunction {
+
+ @Override
+ public String getName() {
+ return "secret-binary";
+ }
+}
diff --git
a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/properties/SecretPropertiesFunction.java
b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/properties/SecretPropertiesFunction.java
index 1dc32727705..1c8e66e6760 100644
---
a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/properties/SecretPropertiesFunction.java
+++
b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/properties/SecretPropertiesFunction.java
@@ -16,54 +16,14 @@
*/
package org.apache.camel.component.kubernetes.properties;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.util.Base64;
-
-import io.fabric8.kubernetes.api.model.Secret;
-import org.apache.camel.spi.PropertiesFunction;
-
/**
- * A {@link PropertiesFunction} that can lookup from Kubernetes secret.
+ * Resolves String type secret keys .
*/
@org.apache.camel.spi.annotations.PropertiesFunction("secret")
-public class SecretPropertiesFunction extends BasePropertiesFunction {
+public class SecretPropertiesFunction extends BaseSecretPropertiesFunction {
@Override
public String getName() {
return "secret";
}
-
- @Override
- Path getMountPath() {
- if (getMountPathSecrets() != null) {
- return Paths.get(getMountPathSecrets());
- }
- return null;
- }
-
- @Override
- String lookup(String name, String key, String defaultValue) {
- String answer = null;
- Secret sec = getClient().secrets().withName(name).get();
- if (sec != null) {
- // string data can be used as-is
- answer = sec.getStringData() != null ?
sec.getStringData().get(key) : null;
- if (answer == null) {
- // need to base64 decode from data
- answer = sec.getData() != null ? sec.getData().get(key) : null;
- if (answer != null) {
- byte[] data = Base64.getDecoder().decode(answer);
- if (data != null) {
- answer = new String(data);
- }
- }
- }
- }
- if (answer == null) {
- return defaultValue;
- }
-
- return answer;
- }
}
diff --git
a/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/KubernetesTestSupport.java
b/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/KubernetesTestSupport.java
index 37135c894dc..3a82aae1b09 100644
---
a/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/KubernetesTestSupport.java
+++
b/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/KubernetesTestSupport.java
@@ -16,6 +16,7 @@
*/
package org.apache.camel.component.kubernetes;
+import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
@@ -52,4 +53,8 @@ public class KubernetesTestSupport extends CamelTestSupport {
public static String toUrlEncoded(String str) throws
UnsupportedEncodingException {
return URLEncoder.encode(str, StandardCharsets.UTF_8);
}
+
+ protected byte[] readExampleBinaryFile() throws IOException {
+ return
getClass().getResourceAsStream("/binary-example/binary.bin").readAllBytes();
+ }
}
diff --git
a/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/properties/ConfigMapBinaryMountPropertiesFunctionTest.java
b/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/properties/ConfigMapBinaryMountPropertiesFunctionTest.java
new file mode 100644
index 00000000000..8ba9c95c123
--- /dev/null
+++
b/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/properties/ConfigMapBinaryMountPropertiesFunctionTest.java
@@ -0,0 +1,49 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.kubernetes.properties;
+
+import java.io.File;
+import java.nio.file.Files;
+import java.nio.file.Path;
+
+import org.apache.camel.component.kubernetes.KubernetesTestSupport;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.MethodOrderer;
+import org.junit.jupiter.api.Order;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.TestMethodOrder;
+
+@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
+public class ConfigMapBinaryMountPropertiesFunctionTest extends
KubernetesTestSupport {
+
+ @Test
+ @Order(1)
+ public void configMapMountPropertiesFunction() throws Exception {
+ try (ConfigMapBinaryPropertiesFunction cmf = new
ConfigMapBinaryPropertiesFunction()) {
+ cmf.setMountPathConfigMaps("src/test/resources/");
+ cmf.setClientEnabled(false);
+ cmf.setCamelContext(context);
+ cmf.start();
+
+ String out = cmf.apply("binary-example/binary.bin");
+ Assertions.assertTrue(new File(out).exists());
+
Assertions.assertArrayEquals(getClass().getResourceAsStream("/binary-example/binary.bin").readAllBytes(),
+ Files.readAllBytes(Path.of(out)));
+ }
+ }
+
+}
diff --git
a/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/properties/ConfigMapPropertiesFunctionLocalModeTest.java
b/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/properties/ConfigMapPropertiesFunctionLocalModeTest.java
index 51b715f9d86..6880a561a99 100644
---
a/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/properties/ConfigMapPropertiesFunctionLocalModeTest.java
+++
b/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/properties/ConfigMapPropertiesFunctionLocalModeTest.java
@@ -16,6 +16,10 @@
*/
package org.apache.camel.component.kubernetes.properties;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+
import org.apache.camel.CamelContext;
import org.apache.camel.RoutesBuilder;
import org.apache.camel.builder.RouteBuilder;
@@ -33,6 +37,8 @@ public class ConfigMapPropertiesFunctionLocalModeTest extends
KubernetesTestSupp
public void configure() throws Exception {
from("direct:start")
.transform().simple("Hello ${body} we are at
{{configmap:myconfig/bar.txt}}");
+ from("direct:binary")
+ .transform().simple("File saved to
{{configmap-binary:myconfig/binary.bin}}");
}
};
}
@@ -42,6 +48,8 @@ public class ConfigMapPropertiesFunctionLocalModeTest extends
KubernetesTestSupp
CamelContext context = super.createCamelContext();
context.getPropertiesComponent().addInitialProperty(ConfigMapPropertiesFunction.LOCAL_MODE,
"true");
context.getPropertiesComponent().addInitialProperty("myconfig/bar.txt", "The
Local Bar");
+
context.getPropertiesComponent().addInitialProperty("myconfig/binary.bin",
+
Path.of(getClass().getResource("/binary-example/binary.bin").toURI()).toAbsolutePath().toString());
return context;
}
@@ -52,4 +60,13 @@ public class ConfigMapPropertiesFunctionLocalModeTest
extends KubernetesTestSupp
Assertions.assertEquals("Hello Jack we are at The Local Bar", out);
}
+ @Test
+ @Order(2)
+ public void configMapLocalModeUsingBinary() throws IOException {
+ String out = template.requestBody("direct:binary", null, String.class);
+ Assertions.assertTrue(out.matches("File saved to .*binary.bin"));
+ Path filePath = Path.of(out.substring("File saved to ".length()));
+ Assertions.assertArrayEquals(readExampleBinaryFile(),
+ Files.readAllBytes(filePath));
+ }
}
diff --git
a/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/properties/ConfigMapPropertiesFunctionRouteTest.java
b/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/properties/ConfigMapPropertiesFunctionRouteTest.java
index ed49a865c2a..82b962eb3ad 100644
---
a/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/properties/ConfigMapPropertiesFunctionRouteTest.java
+++
b/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/properties/ConfigMapPropertiesFunctionRouteTest.java
@@ -16,6 +16,10 @@
*/
package org.apache.camel.component.kubernetes.properties;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.Base64;
import java.util.Map;
import io.fabric8.kubernetes.api.model.ConfigMap;
@@ -53,6 +57,8 @@ public class ConfigMapPropertiesFunctionRouteTest extends
KubernetesTestSupport
public void configure() throws Exception {
from("direct:start")
.transform().simple("Hello ${body} we are at
{{configmap:myconfig/bar.txt}}");
+ from("direct:binary")
+ .transform().simple("File saved to
{{configmap-binary:myconfig/binary.dat}}");
}
};
}
@@ -67,8 +73,11 @@ public class ConfigMapPropertiesFunctionRouteTest extends
KubernetesTestSupport
client = new
KubernetesClientBuilder().withConfig(builder.build()).build();
context.getRegistry().bind("KubernetesClient", client);
- Map<String, String> data = Map.of("foo", "123", "bar", "Moes Bar");
- ConfigMap cm = new
ConfigMapBuilder().editOrNewMetadata().withName("myconfig").endMetadata().withData(data).build();
+ Map<String, String> data = Map.of("bar.txt", "Moes Bar");
+ Map<String, String> binData = Map.of("binary.dat",
+ Base64.getEncoder().encodeToString(readExampleBinaryFile()));
+ ConfigMap cm = new
ConfigMapBuilder().editOrNewMetadata().withName("myconfig").endMetadata().withData(data)
+ .withBinaryData(binData).build();
this.cm = client.resource(cm).serverSideApply();
return context;
@@ -94,4 +103,14 @@ public class ConfigMapPropertiesFunctionRouteTest extends
KubernetesTestSupport
Assertions.assertEquals("Hello Jack we are at Moes Bar", out);
}
+ @Test
+ @Order(2)
+ public void binarySecretPropertiesFunction() throws IOException {
+ String out = template.requestBody("direct:binary", null, String.class);
+ Assertions.assertTrue(out.matches("File saved to .*binary.dat"));
+ Path filePath = Path.of(out.substring("File saved to ".length()));
+ Assertions.assertArrayEquals(readExampleBinaryFile(),
+ Files.readAllBytes(filePath));
+ Files.deleteIfExists(filePath);
+ }
}
diff --git
a/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/properties/ConfigMapPropertiesFunctionTest.java
b/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/properties/ConfigMapPropertiesFunctionTest.java
index 1ae5067b6c1..8b7798b02d9 100644
---
a/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/properties/ConfigMapPropertiesFunctionTest.java
+++
b/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/properties/ConfigMapPropertiesFunctionTest.java
@@ -49,7 +49,7 @@ public class ConfigMapPropertiesFunctionTest extends
KubernetesTestSupport {
KubernetesClient client = new
KubernetesClientBuilder().withConfig(builder.build()).build();
- Map<String, String> data = Map.of("foo", "123", "bar", "Moes Bar");
+ Map<String, String> data = Map.of("foo.txt", "123", "bar.txt", "Moes
Bar");
ConfigMap cm = new
ConfigMapBuilder().editOrNewMetadata().withName("myconfig").endMetadata().withData(data).build();
client.resource(cm).serverSideApply();
diff --git
a/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/properties/SecretBinaryMountPropertiesFunctionTest.java
b/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/properties/SecretBinaryMountPropertiesFunctionTest.java
new file mode 100644
index 00000000000..3b753c84b64
--- /dev/null
+++
b/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/properties/SecretBinaryMountPropertiesFunctionTest.java
@@ -0,0 +1,48 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.kubernetes.properties;
+
+import java.io.File;
+import java.nio.file.Files;
+import java.nio.file.Path;
+
+import org.apache.camel.component.kubernetes.KubernetesTestSupport;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.MethodOrderer;
+import org.junit.jupiter.api.Order;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.TestMethodOrder;
+
+@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
+public class SecretBinaryMountPropertiesFunctionTest extends
KubernetesTestSupport {
+
+ @Test
+ @Order(1)
+ public void secretMountPropertiesFunction() throws Exception {
+ try (SecretBinaryPropertiesFunction cmf = new
SecretBinaryPropertiesFunction()) {
+ cmf.setMountPathSecrets("src/test/resources/");
+ cmf.setClientEnabled(false);
+ cmf.setCamelContext(context);
+ cmf.start();
+
+ String out = cmf.apply("binary-example/binary.bin");
+ Assertions.assertTrue(new File(out).exists());
+
Assertions.assertArrayEquals(getClass().getResourceAsStream("/binary-example/binary.bin").readAllBytes(),
+ Files.readAllBytes(Path.of(out)));
+ }
+ }
+}
diff --git
a/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/properties/SecretPropertiesFunctionRouteTest.java
b/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/properties/SecretPropertiesFunctionRouteTest.java
index b233216ef7f..63edbcd721a 100644
---
a/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/properties/SecretPropertiesFunctionRouteTest.java
+++
b/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/properties/SecretPropertiesFunctionRouteTest.java
@@ -16,7 +16,10 @@
*/
package org.apache.camel.component.kubernetes.properties;
+import java.io.IOException;
import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Path;
import java.util.Base64;
import java.util.Map;
@@ -55,6 +58,8 @@ public class SecretPropertiesFunctionRouteTest extends
KubernetesTestSupport {
public void configure() throws Exception {
from("direct:start")
.transform().simple("Connect with
{{secret:mysecret/myuser}}:{{secret:mysecret/mypass}}");
+ from("direct:binary")
+ .transform().simple("File saved to
{{secret-binary:mysecret/binary.dat}}");
}
};
}
@@ -71,7 +76,8 @@ public class SecretPropertiesFunctionRouteTest extends
KubernetesTestSupport {
Map<String, String> data
= Map.of("myuser",
Base64.getEncoder().encodeToString("scott".getBytes(StandardCharsets.UTF_8)),
- "mypass",
Base64.getEncoder().encodeToString("tiger".getBytes(StandardCharsets.UTF_8)));
+ "mypass",
Base64.getEncoder().encodeToString("tiger".getBytes(StandardCharsets.UTF_8)),
+ "binary.dat",
Base64.getEncoder().encodeToString(readExampleBinaryFile()));
Secret sec = new
SecretBuilder().editOrNewMetadata().withName("mysecret").endMetadata().withData(data).build();
this.sec = client.resource(sec).serverSideApply();
@@ -98,4 +104,14 @@ public class SecretPropertiesFunctionRouteTest extends
KubernetesTestSupport {
Assertions.assertEquals("Connect with scott:tiger", out);
}
+ @Test
+ @Order(2)
+ public void binarySecretPropertiesFunction() throws IOException {
+ String out = template.requestBody("direct:binary", null, String.class);
+ Assertions.assertTrue(out.matches("File saved to .*binary.dat"));
+ Path filePath = Path.of(out.substring("File saved to ".length()));
+ Assertions.assertArrayEquals(readExampleBinaryFile(),
+ Files.readAllBytes(filePath));
+ Files.deleteIfExists(filePath);
+ }
}
diff --git
a/components/camel-kubernetes/src/test/resources/binary-example/binary.bin
b/components/camel-kubernetes/src/test/resources/binary-example/binary.bin
new file mode 100644
index 00000000000..c86626638e0
Binary files /dev/null and
b/components/camel-kubernetes/src/test/resources/binary-example/binary.bin
differ
diff --git a/docs/user-manual/modules/ROOT/pages/using-propertyplaceholder.adoc
b/docs/user-manual/modules/ROOT/pages/using-propertyplaceholder.adoc
index 4f20e952d98..000d8b86451 100644
--- a/docs/user-manual/modules/ROOT/pages/using-propertyplaceholder.adoc
+++ b/docs/user-manual/modules/ROOT/pages/using-propertyplaceholder.adoc
@@ -527,8 +527,10 @@ IMPORTANT: The method must be a public no-arg method (i.e.
no parameters) and re
The `camel-kubernetes` component include the following functions:
-* `configmap` - A function to lookup the property from Kubernetes ConfigMaps.
-* `secret` - A function to lookup the property from Kubernetes Secrets.
+* `configmap` - A function to lookup the string property from Kubernetes
ConfigMaps.
+* `configmap-binary` - A function to lookup the binary property from
Kubernetes ConfigMaps.
+* `secret` - A function to lookup the string property from Kubernetes Secrets.
+* `secret-binary` - A function to lookup the binary property from Kubernetes
Secrets.
The syntax for both functions are:
@@ -552,6 +554,15 @@ In this example then it would not fail as a default value
is provided:
configmap:mymap/mykey:123
----
+If the value stored in the configmap is in binary format, so it is stored as
`Binary Data`, it will be downloaded in a file, and it returns the absolute
path of the file
+
+[source]
+----
+configmap-binary:mymap/mybinkey
+----
+
+it returns a path like `/tmp/camel11787545916150467474/mybinkey`
+
Before the Kubernetes property placeholder functions can be used they need to
be configured with either (or both)
- path - A _mount path_ that must be mounted to the running pod, to load the
configmaps or secrets from local disk.