Skip to content

Commit

Permalink
Fixes #6976: Aws-secret-manager test coverage for reload with sqs
Browse files Browse the repository at this point in the history
  • Loading branch information
JiriOndrusek authored and jamesnetherton committed Feb 11, 2025
1 parent e961555 commit 33b627c
Show file tree
Hide file tree
Showing 4 changed files with 191 additions and 1 deletion.
17 changes: 17 additions & 0 deletions integration-test-groups/aws2/aws-secrets-manager/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,10 @@
<groupId>org.apache.camel.quarkus</groupId>
<artifactId>camel-quarkus-aws-secrets-manager</artifactId>
</dependency>
<dependency>
<groupId>org.apache.camel.quarkus</groupId>
<artifactId>camel-quarkus-aws2-sqs</artifactId>
</dependency>
<dependency>
<groupId>org.apache.camel.quarkus</groupId>
<artifactId>camel-quarkus-direct</artifactId>
Expand Down Expand Up @@ -121,6 +125,19 @@
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.camel.quarkus</groupId>
<artifactId>camel-quarkus-aws2-sqs-deployment</artifactId>
<version>${project.version}</version>
<type>pom</type>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>*</groupId>
<artifactId>*</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.camel.quarkus</groupId>
<artifactId>camel-quarkus-direct-deployment</artifactId>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,18 +16,23 @@
*/
package org.apache.camel.quarkus.component.aws.secrets.manager.it;

import java.util.Locale;
import java.util.Map;

import org.apache.camel.quarkus.test.mock.backend.MockBackendUtils;
import org.apache.camel.quarkus.test.support.aws2.Aws2TestEnvContext;
import org.apache.camel.quarkus.test.support.aws2.Aws2TestEnvCustomizer;
import org.apache.commons.lang3.RandomStringUtils;
import org.testcontainers.containers.localstack.LocalStackContainer.Service;
import software.amazon.awssdk.services.sqs.SqsClient;
import software.amazon.awssdk.services.sqs.model.CreateQueueRequest;
import software.amazon.awssdk.services.sqs.model.DeleteQueueRequest;

public class AwsSecretsManagerTestEnvCustomizer implements Aws2TestEnvCustomizer {

@Override
public Service[] localstackServices() {
return new Service[] { Service.SECRETSMANAGER };
return new Service[] { Service.SECRETSMANAGER, Service.SQS };
}

@Override
Expand All @@ -51,5 +56,32 @@ public void customize(Aws2TestEnvContext envContext) {
envContext.property("camel.vault.aws.secretKey", System.getenv("AWS_SECRET_KEY"));
envContext.property("camel.vault.aws.region", System.getenv("AWS_REGION"));
}

/* SQS */
final String queueName = "cq-secret-manager-sqs-reload-"
+ RandomStringUtils.randomAlphanumeric(49).toLowerCase(Locale.ROOT);

//configure endpoint override for properties function
if (envContext.isLocalStack()) {
envContext.property("camel.vault.aws.override-endpoint",
envContext.getProperties().get("camel.component.aws-secrets-manager.override-endpoint"));
envContext.property("camel.vault.aws.uri-endpoint-override",
envContext.getProperties().get("camel.component.aws-secrets-manager.uri-endpoint-override"));
}

final SqsClient sqsClient = envContext.client(Service.SQS, SqsClient::builder);
{
final String queueUrl = sqsClient.createQueue(
CreateQueueRequest.builder()
.queueName(queueName)
.build())
.queueUrl();
//queue url for the vault configuration
envContext.property("camel.vault.aws.sqsQueueUrl", queueUrl);

envContext.closeable(() -> {
sqsClient.deleteQueue(DeleteQueueRequest.builder().queueUrl(queueUrl).build());
});
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
/*
* 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.quarkus.component.aws.secrets.manager.it;

import java.time.Instant;
import java.util.Collections;
import java.util.UUID;
import java.util.concurrent.TimeUnit;

import io.quarkus.test.common.QuarkusTestResource;
import io.quarkus.test.junit.QuarkusTest;
import io.quarkus.test.junit.TestProfile;
import io.restassured.RestAssured;
import io.restassured.http.ContentType;
import org.apache.camel.component.aws.secretsmanager.SecretsManagerConstants;
import org.apache.camel.component.aws.secretsmanager.SecretsManagerOperations;
import org.apache.camel.quarkus.test.support.aws2.Aws2Client;
import org.apache.camel.quarkus.test.support.aws2.Aws2TestResource;
import org.eclipse.microprofile.config.ConfigProvider;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.testcontainers.containers.localstack.LocalStackContainer;
import org.testcontainers.shaded.org.awaitility.Awaitility;
import software.amazon.awssdk.services.sqs.SqsClient;
import software.amazon.awssdk.services.sqs.model.SendMessageRequest;
import software.amazon.awssdk.services.sqs.model.SendMessageResponse;

import static org.hamcrest.CoreMatchers.is;

@QuarkusTest
@QuarkusTestResource(Aws2TestResource.class)
@TestProfile(ContextSqsReloadTestProfile.class)
public class CamelContextSqsReloadTest {

private static String eventMsg(String secretId) {
return "{\n" +
" \"detail\": {\n" +
" \"eventSource\": \"secretsmanager.amazonaws.com\",\n" +
" \"eventName\" : \"PutSecretValue\",\n" +
" \"requestParameters\" : {\n" +
" \"secretId\" : \"" + secretId + "\"\n" +
" },\n" +
" \"eventTime\" : \"" + Instant.now() + "\"\n" +
" }\n" +
"}";
}

@Aws2Client(LocalStackContainer.Service.SQS)
SqsClient sqsClient;

@Test
public void testCamelContextReloadOnSecretRefresh() {
String secretArn = null;
try {
final String myUniqueSecretValue = "value" + UUID.randomUUID();
//create secret
secretArn = AwsSecretsManagerUtil.createSecret(
ConfigProvider.getConfig().getValue("camel.vault.aws.secrets", String.class),
myUniqueSecretValue);
//update secret
RestAssured.given()
.contentType(ContentType.JSON)
.body(Collections.singletonMap(SecretsManagerConstants.SECRET_ID, secretArn))
.queryParam("body", myUniqueSecretValue + "-updated")
.post("/aws-secrets-manager/operation/" + SecretsManagerOperations.updateSecret)
.then()
.statusCode(201)
.body(is("true"));

//trigger context reload
SendMessageRequest.Builder request = SendMessageRequest.builder()
.queueUrl(ConfigProvider.getConfig().getValue("camel.vault.aws.sqsQueueUrl", String.class));
request.messageBody(eventMsg(secretArn));
SendMessageResponse response = sqsClient.sendMessage(request.build());
Assertions.assertEquals(200, response.sdkHttpResponse().statusCode());

//assert context reload
Awaitility.await().pollInterval(5, TimeUnit.SECONDS).atMost(5, TimeUnit.MINUTES).untilAsserted(
() -> {
RestAssured.get("/aws-secrets-manager/context/reload")
.then()
.statusCode(200)
.body(is("true"));
});
} finally {
if (secretArn != null) {
AwsSecretsManagerUtil.deleteSecretImmediately(secretArn);
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
/*
* 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.quarkus.component.aws.secrets.manager.it;

import java.util.HashMap;
import java.util.Map;

import io.quarkus.test.junit.QuarkusTestProfile;

public class ContextSqsReloadTestProfile implements QuarkusTestProfile {
@Override
public Map<String, String> getConfigOverrides() {
Map<String, String> props = new HashMap<>();
props.put("camel.vault.aws.refreshEnabled", "true");
props.put("camel.vault.aws.refreshPeriod", "5000");
props.put("camel.vault.aws.secrets", "CQTestSecretContextReload" + System.currentTimeMillis());
props.put("camel.main.context-reload-enabled", "true");

props.put("camel.vault.aws.useSqsNotification", "true");
return props;
}
}

0 comments on commit 33b627c

Please sign in to comment.