Skip to content

Commit 3c8f0ee

Browse files
JiriOndrusekclaude
andauthored
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 <noreply@anthropic.com>
1 parent 7414e72 commit 3c8f0ee

6 files changed

Lines changed: 138 additions & 9 deletions

File tree

integration-tests/cyberark-vault/src/main/java/org/apache/camel/quarkus/component/cyberark/vault/it/CyberArkRoutes.java

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
import jakarta.enterprise.context.ApplicationScoped;
2020
import org.apache.camel.builder.RouteBuilder;
21+
import org.apache.camel.spi.PropertiesComponent;
2122
import org.eclipse.microprofile.config.inject.ConfigProperty;
2223

2324
@ApplicationScoped
@@ -40,12 +41,12 @@ public class CyberArkRoutes extends RouteBuilder {
4041
public void configure() throws Exception {
4142

4243
from("direct:createSecret")
43-
.toF("cyberark-vault:secret?operation=createSecret&secretId=BotApp/secretVar&url=%s&account=%s&username=%s&apiKey=%s",
44+
.toF("cyberark-vault:secret?operation=createSecret&url=%s&account=%s&username=%s&apiKey=%s",
4445
url, account, writeUsername, writeApiKey)
4546
.log("Secret created/updated");
4647

4748
from("direct:createSecretUnauthorized")
48-
.toF("cyberark-vault:secret?operation=createSecret&secretId=BotApp/secretVar&url=%s&account=%s&username=%s&apiKey=%s",
49+
.toF("cyberark-vault:secret?operation=createSecret&url=%s&account=%s&username=%s&apiKey=%s",
4950
url, account, readUsername, readApiKey)
5051
.log("Secret created/updated");
5152

@@ -54,5 +55,22 @@ public void configure() throws Exception {
5455
url, account, readUsername, readApiKey)
5556
.log("Retrieved secret: ${body}");
5657

58+
from("direct:getSecretByHeader")
59+
.toF("cyberark-vault:secret?url=%s&account=%s&username=%s&apiKey=%s",
60+
url, account, readUsername, readApiKey);
61+
62+
from("direct:getSecretVersion")
63+
.toF("cyberark-vault:secret?secretId=BotApp/versionVar&url=%s&account=%s&username=%s&apiKey=%s",
64+
url, account, readUsername, readApiKey);
65+
66+
// Programmatic equivalent of {{cyberark:BotApp/secretVar}} placeholder — resolved at runtime since the secret doesn't exist at route build time
67+
from("direct:propertyPlaceholder")
68+
.process(exchange -> {
69+
PropertiesComponent component = exchange.getContext().getPropertiesComponent();
70+
component.resolveProperty("cyberark:BotApp/secretVar").ifPresent(value -> {
71+
exchange.getMessage().setBody(value);
72+
});
73+
});
74+
5775
}
5876
}

integration-tests/cyberark-vault/src/main/java/org/apache/camel/quarkus/component/cyberark/vault/it/CyberarkVaultResource.java

Lines changed: 34 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616
*/
1717
package org.apache.camel.quarkus.component.cyberark.vault.it;
1818

19+
import java.util.Map;
20+
1921
import jakarta.enterprise.context.ApplicationScoped;
2022
import jakarta.inject.Inject;
2123
import jakarta.ws.rs.Consumes;
@@ -27,6 +29,7 @@
2729
import jakarta.ws.rs.core.MediaType;
2830
import jakarta.ws.rs.core.Response;
2931
import org.apache.camel.ProducerTemplate;
32+
import org.apache.camel.component.cyberark.vault.CyberArkVaultConstants;
3033
import org.jboss.logging.Logger;
3134

3235
@Path("/cyberark-vault")
@@ -38,12 +41,15 @@ public class CyberarkVaultResource {
3841
@Inject
3942
ProducerTemplate producerTemplate;
4043

41-
@Path("/createSecret/{authorized}")
44+
@Path("/createSecret/{authorized}/{policy}/{secret}")
4245
@POST
4346
@Consumes(MediaType.TEXT_PLAIN)
44-
public Response createSecret(String secret, @PathParam("authorized") boolean authorized) {
47+
public Response createSecret(String body, @PathParam("authorized") boolean authorized,
48+
@PathParam("policy") String policy, @PathParam("secret") String secret) {
4549
try {
46-
producerTemplate.requestBody("direct:createSecret" + (authorized ? "" : "Unauthorized"), secret, String.class);
50+
producerTemplate.requestBodyAndHeader(
51+
"direct:createSecret" + (authorized ? "" : "Unauthorized"), body,
52+
CyberArkVaultConstants.SECRET_ID, policy + "/" + secret, String.class);
4753
} catch (RuntimeException e) {
4854
return Response.serverError().entity(e.getCause().getCause().getMessage()).build();
4955
}
@@ -56,4 +62,29 @@ public Response createSecret(String secret, @PathParam("authorized") boolean aut
5662
public String getSecret() {
5763
return producerTemplate.requestBody("direct:getSecret", "", String.class);
5864
}
65+
66+
@Path("/getSecretByHeader/{policy}/{secret}")
67+
@GET
68+
@Produces(MediaType.TEXT_PLAIN)
69+
public String getSecretByHeader(@PathParam("policy") String policy, @PathParam("secret") String secret) {
70+
return producerTemplate.requestBodyAndHeader(
71+
"direct:getSecretByHeader", "", CyberArkVaultConstants.SECRET_ID, policy + "/" + secret, String.class);
72+
}
73+
74+
@Path("/getSecretVersion/{version}")
75+
@GET
76+
@Produces(MediaType.TEXT_PLAIN)
77+
public String getSecretVersion(@PathParam("version") int version) {
78+
return producerTemplate.requestBodyAndHeaders(
79+
"direct:getSecretVersion", "",
80+
Map.of(CyberArkVaultConstants.SECRET_VERSION, version),
81+
String.class);
82+
}
83+
84+
@Path("/propertyPlaceholder")
85+
@GET
86+
@Produces(MediaType.TEXT_PLAIN)
87+
public String propertyPlaceholder() {
88+
return producerTemplate.requestBody("direct:propertyPlaceholder", "", String.class);
89+
}
5990
}

integration-tests/cyberark-vault/src/test/java/org/apache/camel/quarkus/component/cyberark/vault/it/CyberarkVaultTest.java

Lines changed: 66 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,15 +41,15 @@ void testRetrieveSecret() {
4141
//create secret
4242
RestAssured.given()
4343
.body(secret)
44-
.post("/cyberark-vault/createSecret/false")
44+
.post("/cyberark-vault/createSecret/false/BotApp/secretVar")
4545
.then()
4646
.statusCode(500)
4747
.body(containsString("403"));
4848

4949
//create secret
5050
RestAssured.given()
5151
.body(secret)
52-
.post("/cyberark-vault/createSecret/true")
52+
.post("/cyberark-vault/createSecret/true/BotApp/secretVar")
5353
.then()
5454
.statusCode(200);
5555

@@ -60,4 +60,68 @@ void testRetrieveSecret() {
6060
.statusCode(200)
6161
.body(is(secret));
6262
}
63+
64+
@Test
65+
void testPropertyPlaceholder() {
66+
String secret = UUID.randomUUID().toString();
67+
68+
RestAssured.given()
69+
.body(secret)
70+
.post("/cyberark-vault/createSecret/true/BotApp/secretVar")
71+
.then()
72+
.statusCode(200);
73+
74+
RestAssured
75+
.get("/cyberark-vault/propertyPlaceholder")
76+
.then()
77+
.statusCode(200)
78+
.body(is(secret));
79+
}
80+
81+
@Test
82+
void testGetSecretByHeader() {
83+
String secret = UUID.randomUUID().toString();
84+
85+
RestAssured.given()
86+
.body(secret)
87+
.post("/cyberark-vault/createSecret/true/BotApp/secretVar")
88+
.then()
89+
.statusCode(200);
90+
91+
RestAssured
92+
.get("/cyberark-vault/getSecretByHeader/BotApp/secretVar")
93+
.then()
94+
.statusCode(200)
95+
.body(is(secret));
96+
}
97+
98+
@Test
99+
void testGetSecretVersion() {
100+
String secretV1 = UUID.randomUUID().toString();
101+
String secretV2 = UUID.randomUUID().toString();
102+
103+
RestAssured.given()
104+
.body(secretV1)
105+
.post("/cyberark-vault/createSecret/true/BotApp/versionVar")
106+
.then()
107+
.statusCode(200);
108+
109+
RestAssured.given()
110+
.body(secretV2)
111+
.post("/cyberark-vault/createSecret/true/BotApp/versionVar")
112+
.then()
113+
.statusCode(200);
114+
115+
RestAssured
116+
.get("/cyberark-vault/getSecretVersion/1")
117+
.then()
118+
.statusCode(200)
119+
.body(is(secretV1));
120+
121+
RestAssured
122+
.get("/cyberark-vault/getSecretVersion/2")
123+
.then()
124+
.statusCode(200)
125+
.body(is(secretV2));
126+
}
63127
}

integration-tests/cyberark-vault/src/test/java/org/apache/camel/quarkus/component/cyberark/vault/it/CyberarkVaultTestResource.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,8 +122,15 @@ public Map<String, String> start() {
122122
throw new RuntimeException("Failed to start Conjur test environment", e);
123123
}
124124

125+
String conjurUrl = "http://localhost:" + conjurContainer.getMappedPort(80);
126+
125127
result.put("conjur.account", CONJUR_ACCOUNT);
126-
result.put("conjur.url", "http://localhost:" + conjurContainer.getMappedPort(80));
128+
result.put("conjur.url", conjurUrl);
129+
130+
result.put("camel.vault.cyberark.url", conjurUrl);
131+
result.put("camel.vault.cyberark.account", CONJUR_ACCOUNT);
132+
result.put("camel.vault.cyberark.username", result.get("conjur.read.username"));
133+
result.put("camel.vault.cyberark.apiKey", result.get("conjur.read.apiKey"));
127134

128135
return result;
129136
}

integration-tests/cyberark-vault/src/test/resources/conf/policy/BotApp.yml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
- !user Dave
2323
- !host myDemoApp
2424
- !variable secretVar
25+
- !variable versionVar
2526
- !permit
2627
# Give permissions to the human user to update the secret and fetch the secret.
2728
role: !user Dave
@@ -32,3 +33,11 @@
3233
role: !host myDemoApp
3334
privileges: [read, execute]
3435
resource: !variable secretVar
36+
- !permit
37+
role: !user Dave
38+
privileges: [read, update, execute]
39+
resource: !variable versionVar
40+
- !permit
41+
role: !host myDemoApp
42+
privileges: [read, execute]
43+
resource: !variable versionVar

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -241,7 +241,7 @@
241241
<couchdb.container.image>mirror.gcr.io/couchdb:3.5.0</couchdb.container.image>
242242
<cyberark-conjur.container.image>mirror.gcr.io/cyberark/conjur:1.24.0</cyberark-conjur.container.image>
243243
<cyberark-conjur-cli.container.image>mirror.gcr.io/cyberark/conjur-cli:9</cyberark-conjur-cli.container.image>
244-
<cyberark-nginx.container.image>mirror.gcr.io/nginx:1.29.4-alpine3.23-perl</cyberark-nginx.container.image>
244+
<cyberark-nginx.container.image>mirror.gcr.io/nginx:1.30.3-alpine3.23-perl</cyberark-nginx.container.image>
245245
<db2.container.image>icr.io/db2_community/db2:12.1.0.0</db2.container.image>
246246
<docling.container.image>quay.io/docling-project/docling-serve:v1.9.0</docling.container.image>
247247
<eclipse-mosquitto.container.image>mirror.gcr.io/eclipse-mosquitto:2.0.18</eclipse-mosquitto.container.image>

0 commit comments

Comments
 (0)