This is an automated email from the ASF dual-hosted git repository.
jamesnetherton pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel-quarkus.git
The following commit(s) were added to refs/heads/main by this push:
new 3c8f0eec8f Fixes #8884. Add integration test coverage for CyberArk
Vault property placeholder, dynamic headers, and secret versioning
3c8f0eec8f is described below
commit 3c8f0eec8f2e1bc4667fb24170b15298bc7d7f8b
Author: JiriOndrusek <[email protected]>
AuthorDate: Wed Jul 22 08:18:30 2026 +0200
Fixes #8884. Add integration test coverage for CyberArk Vault property
placeholder, dynamic headers, and secret versioning
- Add testPropertyPlaceholder using PropertiesComponent.resolveProperty()
- Add testGetSecretByHeader exercising CyberArkVaultConstants.SECRET_ID
header
- Add testGetSecretVersion with dedicated versionVar to isolate version
numbering
- Configure camel.vault.cyberark.* properties in test resource
- Consolidate createSecret REST endpoint to accept dynamic secretId
- Bump nginx test container image from 1.29.4 to 1.30.3
Co-authored-by: Claude Opus 4.6 <[email protected]>
---
.../cyberark/vault/it/CyberArkRoutes.java | 22 ++++++-
.../cyberark/vault/it/CyberarkVaultResource.java | 37 +++++++++++-
.../cyberark/vault/it/CyberarkVaultTest.java | 68 +++++++++++++++++++++-
.../vault/it/CyberarkVaultTestResource.java | 9 ++-
.../src/test/resources/conf/policy/BotApp.yml | 9 +++
pom.xml | 2 +-
6 files changed, 138 insertions(+), 9 deletions(-)
diff --git
a/integration-tests/cyberark-vault/src/main/java/org/apache/camel/quarkus/component/cyberark/vault/it/CyberArkRoutes.java
b/integration-tests/cyberark-vault/src/main/java/org/apache/camel/quarkus/component/cyberark/vault/it/CyberArkRoutes.java
index afc84ade70..e6360adb1f 100644
---
a/integration-tests/cyberark-vault/src/main/java/org/apache/camel/quarkus/component/cyberark/vault/it/CyberArkRoutes.java
+++
b/integration-tests/cyberark-vault/src/main/java/org/apache/camel/quarkus/component/cyberark/vault/it/CyberArkRoutes.java
@@ -18,6 +18,7 @@ package org.apache.camel.quarkus.component.cyberark.vault.it;
import jakarta.enterprise.context.ApplicationScoped;
import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.spi.PropertiesComponent;
import org.eclipse.microprofile.config.inject.ConfigProperty;
@ApplicationScoped
@@ -40,12 +41,12 @@ public class CyberArkRoutes extends RouteBuilder {
public void configure() throws Exception {
from("direct:createSecret")
-
.toF("cyberark-vault:secret?operation=createSecret&secretId=BotApp/secretVar&url=%s&account=%s&username=%s&apiKey=%s",
+
.toF("cyberark-vault:secret?operation=createSecret&url=%s&account=%s&username=%s&apiKey=%s",
url, account, writeUsername, writeApiKey)
.log("Secret created/updated");
from("direct:createSecretUnauthorized")
-
.toF("cyberark-vault:secret?operation=createSecret&secretId=BotApp/secretVar&url=%s&account=%s&username=%s&apiKey=%s",
+
.toF("cyberark-vault:secret?operation=createSecret&url=%s&account=%s&username=%s&apiKey=%s",
url, account, readUsername, readApiKey)
.log("Secret created/updated");
@@ -54,5 +55,22 @@ public class CyberArkRoutes extends RouteBuilder {
url, account, readUsername, readApiKey)
.log("Retrieved secret: ${body}");
+ from("direct:getSecretByHeader")
+
.toF("cyberark-vault:secret?url=%s&account=%s&username=%s&apiKey=%s",
+ url, account, readUsername, readApiKey);
+
+ from("direct:getSecretVersion")
+
.toF("cyberark-vault:secret?secretId=BotApp/versionVar&url=%s&account=%s&username=%s&apiKey=%s",
+ url, account, readUsername, readApiKey);
+
+ // Programmatic equivalent of {{cyberark:BotApp/secretVar}}
placeholder — resolved at runtime since the secret doesn't exist at route build
time
+ from("direct:propertyPlaceholder")
+ .process(exchange -> {
+ PropertiesComponent component =
exchange.getContext().getPropertiesComponent();
+
component.resolveProperty("cyberark:BotApp/secretVar").ifPresent(value -> {
+ exchange.getMessage().setBody(value);
+ });
+ });
+
}
}
diff --git
a/integration-tests/cyberark-vault/src/main/java/org/apache/camel/quarkus/component/cyberark/vault/it/CyberarkVaultResource.java
b/integration-tests/cyberark-vault/src/main/java/org/apache/camel/quarkus/component/cyberark/vault/it/CyberarkVaultResource.java
index d6eb9aad5d..34b30aaf18 100644
---
a/integration-tests/cyberark-vault/src/main/java/org/apache/camel/quarkus/component/cyberark/vault/it/CyberarkVaultResource.java
+++
b/integration-tests/cyberark-vault/src/main/java/org/apache/camel/quarkus/component/cyberark/vault/it/CyberarkVaultResource.java
@@ -16,6 +16,8 @@
*/
package org.apache.camel.quarkus.component.cyberark.vault.it;
+import java.util.Map;
+
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;
import jakarta.ws.rs.Consumes;
@@ -27,6 +29,7 @@ import jakarta.ws.rs.Produces;
import jakarta.ws.rs.core.MediaType;
import jakarta.ws.rs.core.Response;
import org.apache.camel.ProducerTemplate;
+import org.apache.camel.component.cyberark.vault.CyberArkVaultConstants;
import org.jboss.logging.Logger;
@Path("/cyberark-vault")
@@ -38,12 +41,15 @@ public class CyberarkVaultResource {
@Inject
ProducerTemplate producerTemplate;
- @Path("/createSecret/{authorized}")
+ @Path("/createSecret/{authorized}/{policy}/{secret}")
@POST
@Consumes(MediaType.TEXT_PLAIN)
- public Response createSecret(String secret, @PathParam("authorized")
boolean authorized) {
+ public Response createSecret(String body, @PathParam("authorized") boolean
authorized,
+ @PathParam("policy") String policy, @PathParam("secret") String
secret) {
try {
- producerTemplate.requestBody("direct:createSecret" + (authorized ?
"" : "Unauthorized"), secret, String.class);
+ producerTemplate.requestBodyAndHeader(
+ "direct:createSecret" + (authorized ? "" :
"Unauthorized"), body,
+ CyberArkVaultConstants.SECRET_ID, policy + "/" + secret,
String.class);
} catch (RuntimeException e) {
return
Response.serverError().entity(e.getCause().getCause().getMessage()).build();
}
@@ -56,4 +62,29 @@ public class CyberarkVaultResource {
public String getSecret() {
return producerTemplate.requestBody("direct:getSecret", "",
String.class);
}
+
+ @Path("/getSecretByHeader/{policy}/{secret}")
+ @GET
+ @Produces(MediaType.TEXT_PLAIN)
+ public String getSecretByHeader(@PathParam("policy") String policy,
@PathParam("secret") String secret) {
+ return producerTemplate.requestBodyAndHeader(
+ "direct:getSecretByHeader", "",
CyberArkVaultConstants.SECRET_ID, policy + "/" + secret, String.class);
+ }
+
+ @Path("/getSecretVersion/{version}")
+ @GET
+ @Produces(MediaType.TEXT_PLAIN)
+ public String getSecretVersion(@PathParam("version") int version) {
+ return producerTemplate.requestBodyAndHeaders(
+ "direct:getSecretVersion", "",
+ Map.of(CyberArkVaultConstants.SECRET_VERSION, version),
+ String.class);
+ }
+
+ @Path("/propertyPlaceholder")
+ @GET
+ @Produces(MediaType.TEXT_PLAIN)
+ public String propertyPlaceholder() {
+ return producerTemplate.requestBody("direct:propertyPlaceholder", "",
String.class);
+ }
}
diff --git
a/integration-tests/cyberark-vault/src/test/java/org/apache/camel/quarkus/component/cyberark/vault/it/CyberarkVaultTest.java
b/integration-tests/cyberark-vault/src/test/java/org/apache/camel/quarkus/component/cyberark/vault/it/CyberarkVaultTest.java
index e28eca38c8..96a06907cc 100644
---
a/integration-tests/cyberark-vault/src/test/java/org/apache/camel/quarkus/component/cyberark/vault/it/CyberarkVaultTest.java
+++
b/integration-tests/cyberark-vault/src/test/java/org/apache/camel/quarkus/component/cyberark/vault/it/CyberarkVaultTest.java
@@ -41,7 +41,7 @@ class CyberarkVaultTest {
//create secret
RestAssured.given()
.body(secret)
- .post("/cyberark-vault/createSecret/false")
+ .post("/cyberark-vault/createSecret/false/BotApp/secretVar")
.then()
.statusCode(500)
.body(containsString("403"));
@@ -49,7 +49,7 @@ class CyberarkVaultTest {
//create secret
RestAssured.given()
.body(secret)
- .post("/cyberark-vault/createSecret/true")
+ .post("/cyberark-vault/createSecret/true/BotApp/secretVar")
.then()
.statusCode(200);
@@ -60,4 +60,68 @@ class CyberarkVaultTest {
.statusCode(200)
.body(is(secret));
}
+
+ @Test
+ void testPropertyPlaceholder() {
+ String secret = UUID.randomUUID().toString();
+
+ RestAssured.given()
+ .body(secret)
+ .post("/cyberark-vault/createSecret/true/BotApp/secretVar")
+ .then()
+ .statusCode(200);
+
+ RestAssured
+ .get("/cyberark-vault/propertyPlaceholder")
+ .then()
+ .statusCode(200)
+ .body(is(secret));
+ }
+
+ @Test
+ void testGetSecretByHeader() {
+ String secret = UUID.randomUUID().toString();
+
+ RestAssured.given()
+ .body(secret)
+ .post("/cyberark-vault/createSecret/true/BotApp/secretVar")
+ .then()
+ .statusCode(200);
+
+ RestAssured
+ .get("/cyberark-vault/getSecretByHeader/BotApp/secretVar")
+ .then()
+ .statusCode(200)
+ .body(is(secret));
+ }
+
+ @Test
+ void testGetSecretVersion() {
+ String secretV1 = UUID.randomUUID().toString();
+ String secretV2 = UUID.randomUUID().toString();
+
+ RestAssured.given()
+ .body(secretV1)
+ .post("/cyberark-vault/createSecret/true/BotApp/versionVar")
+ .then()
+ .statusCode(200);
+
+ RestAssured.given()
+ .body(secretV2)
+ .post("/cyberark-vault/createSecret/true/BotApp/versionVar")
+ .then()
+ .statusCode(200);
+
+ RestAssured
+ .get("/cyberark-vault/getSecretVersion/1")
+ .then()
+ .statusCode(200)
+ .body(is(secretV1));
+
+ RestAssured
+ .get("/cyberark-vault/getSecretVersion/2")
+ .then()
+ .statusCode(200)
+ .body(is(secretV2));
+ }
}
diff --git
a/integration-tests/cyberark-vault/src/test/java/org/apache/camel/quarkus/component/cyberark/vault/it/CyberarkVaultTestResource.java
b/integration-tests/cyberark-vault/src/test/java/org/apache/camel/quarkus/component/cyberark/vault/it/CyberarkVaultTestResource.java
index 6cd46328f3..d17263c483 100644
---
a/integration-tests/cyberark-vault/src/test/java/org/apache/camel/quarkus/component/cyberark/vault/it/CyberarkVaultTestResource.java
+++
b/integration-tests/cyberark-vault/src/test/java/org/apache/camel/quarkus/component/cyberark/vault/it/CyberarkVaultTestResource.java
@@ -122,8 +122,15 @@ public class CyberarkVaultTestResource implements
QuarkusTestResourceLifecycleMa
throw new RuntimeException("Failed to start Conjur test
environment", e);
}
+ String conjurUrl = "http://localhost:" +
conjurContainer.getMappedPort(80);
+
result.put("conjur.account", CONJUR_ACCOUNT);
- result.put("conjur.url", "http://localhost:" +
conjurContainer.getMappedPort(80));
+ result.put("conjur.url", conjurUrl);
+
+ result.put("camel.vault.cyberark.url", conjurUrl);
+ result.put("camel.vault.cyberark.account", CONJUR_ACCOUNT);
+ result.put("camel.vault.cyberark.username",
result.get("conjur.read.username"));
+ result.put("camel.vault.cyberark.apiKey",
result.get("conjur.read.apiKey"));
return result;
}
diff --git
a/integration-tests/cyberark-vault/src/test/resources/conf/policy/BotApp.yml
b/integration-tests/cyberark-vault/src/test/resources/conf/policy/BotApp.yml
index 307db3a1f2..a60f30fe24 100644
--- a/integration-tests/cyberark-vault/src/test/resources/conf/policy/BotApp.yml
+++ b/integration-tests/cyberark-vault/src/test/resources/conf/policy/BotApp.yml
@@ -22,6 +22,7 @@
- !user Dave
- !host myDemoApp
- !variable secretVar
+ - !variable versionVar
- !permit
# Give permissions to the human user to update the secret and fetch the
secret.
role: !user Dave
@@ -32,3 +33,11 @@
role: !host myDemoApp
privileges: [read, execute]
resource: !variable secretVar
+ - !permit
+ role: !user Dave
+ privileges: [read, update, execute]
+ resource: !variable versionVar
+ - !permit
+ role: !host myDemoApp
+ privileges: [read, execute]
+ resource: !variable versionVar
diff --git a/pom.xml b/pom.xml
index 6fed3f0c87..b4980c36f3 100644
--- a/pom.xml
+++ b/pom.xml
@@ -241,7 +241,7 @@
<couchdb.container.image>mirror.gcr.io/couchdb:3.5.0</couchdb.container.image>
<cyberark-conjur.container.image>mirror.gcr.io/cyberark/conjur:1.24.0</cyberark-conjur.container.image>
<cyberark-conjur-cli.container.image>mirror.gcr.io/cyberark/conjur-cli:9</cyberark-conjur-cli.container.image>
-
<cyberark-nginx.container.image>mirror.gcr.io/nginx:1.29.4-alpine3.23-perl</cyberark-nginx.container.image>
+
<cyberark-nginx.container.image>mirror.gcr.io/nginx:1.30.3-alpine3.23-perl</cyberark-nginx.container.image>
<db2.container.image>icr.io/db2_community/db2:12.1.0.0</db2.container.image>
<docling.container.image>quay.io/docling-project/docling-serve:v1.9.0</docling.container.image>
<eclipse-mosquitto.container.image>mirror.gcr.io/eclipse-mosquitto:2.0.18</eclipse-mosquitto.container.image>