This is an automated email from the ASF dual-hosted git repository. orpiske pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/camel.git
The following commit(s) were added to refs/heads/master by this push: new 501eae5 Added test infra for AWS v2 Cloud Watch (#4626) 501eae5 is described below commit 501eae53faabd92283e8ad5018984cca9fa83976 Author: Otavio Rodolfo Piske <orpi...@users.noreply.github.com> AuthorDate: Wed Nov 18 20:13:31 2020 +0100 Added test infra for AWS v2 Cloud Watch (#4626) Also migrates the camel-aws2-cw tests to the new test infra --- components/camel-aws2-cw/pom.xml | 22 +++- .../aws2/cw/localstack/Aws2CwBaseTest.java | 54 ++------- test-infra/camel-test-infra-aws-v2/pom.xml | 6 + .../test/infra/aws2/clients/AWSSDKClientUtils.java | 129 +++++++++------------ ...ava => AWSCloudWatchLocalContainerService.java} | 11 +- .../services/AWSKinesisLocalContainerService.java | 5 + .../infra/aws2/services/AWSServiceFactory.java | 69 ++++------- .../camel/test/infra/aws2/services/Service.java | 3 +- 8 files changed, 122 insertions(+), 177 deletions(-) diff --git a/components/camel-aws2-cw/pom.xml b/components/camel-aws2-cw/pom.xml index 0bc9a8d..ebae6b0 100644 --- a/components/camel-aws2-cw/pom.xml +++ b/components/camel-aws2-cw/pom.xml @@ -67,9 +67,29 @@ <artifactId>log4j-slf4j-impl</artifactId> <scope>test</scope> </dependency> + + <!-- test infra --> + <dependency> + <groupId>org.apache.camel</groupId> + <artifactId>camel-test-infra-common</artifactId> + <version>${project.version}</version> + <type>test-jar</type> + <scope>test</scope> + </dependency> + + <dependency> + <groupId>org.apache.camel</groupId> + <artifactId>camel-test-infra-aws-common</artifactId> + <version>${project.version}</version> + <type>test-jar</type> + <scope>test</scope> + </dependency> + <dependency> <groupId>org.apache.camel</groupId> - <artifactId>camel-testcontainers-junit5</artifactId> + <artifactId>camel-test-infra-aws-v2</artifactId> + <version>${project.version}</version> + <type>test-jar</type> <scope>test</scope> </dependency> </dependencies> diff --git a/components/camel-aws2-cw/src/test/java/org/apache/camel/component/aws2/cw/localstack/Aws2CwBaseTest.java b/components/camel-aws2-cw/src/test/java/org/apache/camel/component/aws2/cw/localstack/Aws2CwBaseTest.java index 255ac23..cf9ec2d 100644 --- a/components/camel-aws2-cw/src/test/java/org/apache/camel/component/aws2/cw/localstack/Aws2CwBaseTest.java +++ b/components/camel-aws2-cw/src/test/java/org/apache/camel/component/aws2/cw/localstack/Aws2CwBaseTest.java @@ -16,61 +16,25 @@ */ package org.apache.camel.component.aws2.cw.localstack; -import java.net.URI; - import org.apache.camel.CamelContext; import org.apache.camel.component.aws2.cw.Cw2Component; -import org.apache.camel.test.testcontainers.junit5.ContainerAwareTestSupport; -import org.apache.camel.test.testcontainers.junit5.Wait; +import org.apache.camel.test.infra.aws.common.services.AWSService; +import org.apache.camel.test.infra.aws2.clients.AWSSDKClientUtils; +import org.apache.camel.test.infra.aws2.services.AWSServiceFactory; +import org.apache.camel.test.junit5.CamelTestSupport; import org.junit.jupiter.api.TestInstance; -import org.testcontainers.containers.GenericContainer; -import software.amazon.awssdk.auth.credentials.AwsBasicCredentials; -import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider; -import software.amazon.awssdk.regions.Region; -import software.amazon.awssdk.services.cloudwatch.CloudWatchClient; +import org.junit.jupiter.api.extension.RegisterExtension; @TestInstance(TestInstance.Lifecycle.PER_CLASS) -public class Aws2CwBaseTest extends ContainerAwareTestSupport { - - public static final String CONTAINER_IMAGE = "localstack/localstack:0.12.2"; - public static final String CONTAINER_NAME = "cloudwatch"; - - @Override - protected GenericContainer<?> createContainer() { - return localstackContainer(); - } - - public static GenericContainer localstackContainer() { - return new GenericContainer(CONTAINER_IMAGE) - .withNetworkAliases(CONTAINER_NAME) - .withEnv("SERVICES", "cloudwatch") - .withExposedPorts(4566) - .waitingFor(Wait.forListeningPort()) - .waitingFor(Wait.forLogMessageContaining("Ready.", 1)); - } - - public String getEventbridgeUrl() { - return String.format( - "%s:%d", - getContainerHost(CONTAINER_NAME), - getContainerPort(CONTAINER_NAME, 4566)); - } - - public CloudWatchClient getCwClient() { - CloudWatchClient eventbridgeClient = CloudWatchClient - .builder() - .endpointOverride(URI.create("http://" + getEventbridgeUrl())) - .credentialsProvider(StaticCredentialsProvider.create(AwsBasicCredentials.create("xxx", "yyy"))) - .region(Region.EU_WEST_1) - .build(); - return eventbridgeClient; - } +public class Aws2CwBaseTest extends CamelTestSupport { + @RegisterExtension + public static AWSService service = AWSServiceFactory.createCloudWatchService(); @Override protected CamelContext createCamelContext() throws Exception { CamelContext context = super.createCamelContext(); Cw2Component cwComponent = context.getComponent("aws2-cw", Cw2Component.class); - cwComponent.getConfiguration().setAmazonCwClient(getCwClient()); + cwComponent.getConfiguration().setAmazonCwClient(AWSSDKClientUtils.newCloudWatchClient()); return context; } } diff --git a/test-infra/camel-test-infra-aws-v2/pom.xml b/test-infra/camel-test-infra-aws-v2/pom.xml index 383284f..cb63c9d 100644 --- a/test-infra/camel-test-infra-aws-v2/pom.xml +++ b/test-infra/camel-test-infra-aws-v2/pom.xml @@ -78,6 +78,12 @@ <dependency> <groupId>software.amazon.awssdk</groupId> + <artifactId>cloudwatch</artifactId> + <version>${aws-java-sdk2-version}</version> + </dependency> + + <dependency> + <groupId>software.amazon.awssdk</groupId> <artifactId>apache-client</artifactId> <version>${aws-java-sdk2-version}</version> </dependency> diff --git a/test-infra/camel-test-infra-aws-v2/src/test/java/org/apache/camel/test/infra/aws2/clients/AWSSDKClientUtils.java b/test-infra/camel-test-infra-aws-v2/src/test/java/org/apache/camel/test/infra/aws2/clients/AWSSDKClientUtils.java index 82f985e..fac841c 100644 --- a/test-infra/camel-test-infra-aws-v2/src/test/java/org/apache/camel/test/infra/aws2/clients/AWSSDKClientUtils.java +++ b/test-infra/camel-test-infra-aws-v2/src/test/java/org/apache/camel/test/infra/aws2/clients/AWSSDKClientUtils.java @@ -19,21 +19,21 @@ package org.apache.camel.test.infra.aws2.clients; import java.net.URI; import java.net.URISyntaxException; +import java.util.function.Supplier; import org.apache.camel.test.infra.aws.common.AWSConfigs; import org.apache.camel.test.infra.aws2.common.SystemPropertiesAWSCredentialsProvider; import org.apache.camel.test.infra.aws2.common.TestAWSCredentialsProvider; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import software.amazon.awssdk.awscore.client.builder.AwsClientBuilder; +import software.amazon.awssdk.core.SdkClient; import software.amazon.awssdk.regions.Region; +import software.amazon.awssdk.services.cloudwatch.CloudWatchClient; import software.amazon.awssdk.services.kinesis.KinesisClient; -import software.amazon.awssdk.services.kinesis.KinesisClientBuilder; import software.amazon.awssdk.services.s3.S3Client; -import software.amazon.awssdk.services.s3.S3ClientBuilder; import software.amazon.awssdk.services.sns.SnsClient; -import software.amazon.awssdk.services.sns.SnsClientBuilder; import software.amazon.awssdk.services.sqs.SqsClient; -import software.amazon.awssdk.services.sqs.SqsClientBuilder; public final class AWSSDKClientUtils { private static final Logger LOG = LoggerFactory.getLogger(AWSSDKClientUtils.class); @@ -60,12 +60,25 @@ public final class AWSSDKClientUtils { return awsInstanceType == null || awsInstanceType.equals("local-aws-container"); } - public static KinesisClient newKinesisClient() { - LOG.debug("Creating a new AWS v2 Kinesis client"); - - String awsInstanceType = System.getProperty("aws-service.kinesis.instance.type"); - - KinesisClientBuilder clientBuilder = KinesisClient.builder(); + /** + * Generic AWS v2 client builder + * + * @param property the system property used to figure out if it's local service or not + * @param name the service name + * @param clientBuilderSupplier A supplier type for creating the builder class + * @param yClass The client type to be generated + * @param <T> + * @param <Y> + * @return A new client of the given type + */ + private static <T extends AwsClientBuilder, Y extends SdkClient> Y newClient( + String property, String name, + Supplier<T> clientBuilderSupplier, Class<Y> yClass) { + T clientBuilder = clientBuilderSupplier.get(); + + LOG.debug("Creating a new AWS v2 {} client", name); + + String awsInstanceType = System.getProperty(property); clientBuilder.region(Region.US_EAST_1); @@ -82,80 +95,48 @@ public final class AWSSDKClientUtils { clientBuilder.credentialsProvider(new SystemPropertiesAWSCredentialsProvider()); } - return clientBuilder.build(); - } - - public static SqsClient newSQSClient() { - LOG.debug("Creating a new AWS v2 SQS client"); - - String awsInstanceType = System.getProperty("aws-service.instance.type"); - - SqsClientBuilder clientBuilder = SqsClient.builder(); - - clientBuilder.region(Region.US_EAST_1); - - URI endpoint = getEndpoint(); - - if (isLocalContainer(awsInstanceType) || endpoint != null) { - clientBuilder.endpointOverride(endpoint); + Object o = clientBuilder.build(); + if (yClass.isInstance(o)) { + return (Y) o; } - if (isLocalContainer(awsInstanceType)) { - clientBuilder.credentialsProvider(TestAWSCredentialsProvider.CONTAINER_LOCAL_DEFAULT_PROVIDER); - - } else { - clientBuilder.credentialsProvider(new SystemPropertiesAWSCredentialsProvider()); - } - - return clientBuilder.build(); + throw new UnsupportedOperationException("Invalid class type for AWS client"); } - public static S3Client newS3Client() { - LOG.debug("Creating a new S3 client"); - S3ClientBuilder clientBuilder = S3Client.builder(); - - String awsInstanceType = System.getProperty("aws-service.instance.type"); - - clientBuilder.region(Region.US_EAST_1); - - URI endpoint = getEndpoint(); - - if (isLocalContainer(awsInstanceType) || endpoint != null) { - clientBuilder.endpointOverride(endpoint); - } + /** + * Generic AWS v2 client builder + * + * @param name the service name + * @param clientBuilderSupplier A supplier type for creating the builder class + * @param yClass The client type to be generated + * @param <T> + * @param <Y> + * @return A new client of the given type + */ + private static <T extends AwsClientBuilder, Y extends SdkClient> Y newClient( + String name, + Supplier<T> clientBuilderSupplier, Class<Y> yClass) { + return newClient("aws-service.instance.type", name, clientBuilderSupplier, yClass); + } - if (isLocalContainer(awsInstanceType)) { - clientBuilder.credentialsProvider(TestAWSCredentialsProvider.CONTAINER_LOCAL_DEFAULT_PROVIDER); + public static KinesisClient newKinesisClient() { + return newClient("aws-service.kinesis.instance.type", "Kinesis", KinesisClient::builder, + KinesisClient.class); + } - } else { - clientBuilder.credentialsProvider(new SystemPropertiesAWSCredentialsProvider()); - } + public static SqsClient newSQSClient() { + return newClient("SQS", SqsClient::builder, SqsClient.class); + } - return clientBuilder.build(); + public static S3Client newS3Client() { + return newClient("S3", S3Client::builder, S3Client.class); } public static SnsClient newSNSClient() { - LOG.debug("Creating a new SNS client"); - - String awsInstanceType = System.getProperty("aws-service.instance.type"); - - SnsClientBuilder clientBuilder = SnsClient.builder(); - - clientBuilder.region(Region.US_EAST_1); - - URI endpoint = getEndpoint(); - - if (isLocalContainer(awsInstanceType) || endpoint != null) { - clientBuilder.endpointOverride(endpoint); - } - - if (isLocalContainer(awsInstanceType)) { - clientBuilder.credentialsProvider(TestAWSCredentialsProvider.CONTAINER_LOCAL_DEFAULT_PROVIDER); - - } else { - clientBuilder.credentialsProvider(new SystemPropertiesAWSCredentialsProvider()); - } + return newClient("SNS", SnsClient::builder, SnsClient.class); + } - return clientBuilder.build(); + public static CloudWatchClient newCloudWatchClient() { + return newClient("Cloud Watch", CloudWatchClient::builder, CloudWatchClient.class); } } diff --git a/test-infra/camel-test-infra-aws-v2/src/test/java/org/apache/camel/test/infra/aws2/services/AWSKinesisLocalContainerService.java b/test-infra/camel-test-infra-aws-v2/src/test/java/org/apache/camel/test/infra/aws2/services/AWSCloudWatchLocalContainerService.java similarity index 72% copy from test-infra/camel-test-infra-aws-v2/src/test/java/org/apache/camel/test/infra/aws2/services/AWSKinesisLocalContainerService.java copy to test-infra/camel-test-infra-aws-v2/src/test/java/org/apache/camel/test/infra/aws2/services/AWSCloudWatchLocalContainerService.java index 6dfac7c..0f5f8bf 100644 --- a/test-infra/camel-test-infra-aws-v2/src/test/java/org/apache/camel/test/infra/aws2/services/AWSKinesisLocalContainerService.java +++ b/test-infra/camel-test-infra-aws-v2/src/test/java/org/apache/camel/test/infra/aws2/services/AWSCloudWatchLocalContainerService.java @@ -17,13 +17,8 @@ package org.apache.camel.test.infra.aws2.services; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class AWSKinesisLocalContainerService extends AWSLocalContainerService { - private static final Logger LOG = LoggerFactory.getLogger(AWSKinesisLocalContainerService.class); - - public AWSKinesisLocalContainerService() { - super(Service.KINESIS); +public class AWSCloudWatchLocalContainerService extends AWSLocalContainerService { + public AWSCloudWatchLocalContainerService() { + super(Service.CLOUD_WATCH); } } diff --git a/test-infra/camel-test-infra-aws-v2/src/test/java/org/apache/camel/test/infra/aws2/services/AWSKinesisLocalContainerService.java b/test-infra/camel-test-infra-aws-v2/src/test/java/org/apache/camel/test/infra/aws2/services/AWSKinesisLocalContainerService.java index 6dfac7c..3e5506e 100644 --- a/test-infra/camel-test-infra-aws-v2/src/test/java/org/apache/camel/test/infra/aws2/services/AWSKinesisLocalContainerService.java +++ b/test-infra/camel-test-infra-aws-v2/src/test/java/org/apache/camel/test/infra/aws2/services/AWSKinesisLocalContainerService.java @@ -19,10 +19,15 @@ package org.apache.camel.test.infra.aws2.services; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import software.amazon.awssdk.core.SdkSystemSetting; public class AWSKinesisLocalContainerService extends AWSLocalContainerService { private static final Logger LOG = LoggerFactory.getLogger(AWSKinesisLocalContainerService.class); + static { + System.setProperty(SdkSystemSetting.CBOR_ENABLED.property(), "false"); + } + public AWSKinesisLocalContainerService() { super(Service.KINESIS); } diff --git a/test-infra/camel-test-infra-aws-v2/src/test/java/org/apache/camel/test/infra/aws2/services/AWSServiceFactory.java b/test-infra/camel-test-infra-aws-v2/src/test/java/org/apache/camel/test/infra/aws2/services/AWSServiceFactory.java index b757c91..9a34090 100644 --- a/test-infra/camel-test-infra-aws-v2/src/test/java/org/apache/camel/test/infra/aws2/services/AWSServiceFactory.java +++ b/test-infra/camel-test-infra-aws-v2/src/test/java/org/apache/camel/test/infra/aws2/services/AWSServiceFactory.java @@ -17,10 +17,11 @@ package org.apache.camel.test.infra.aws2.services; +import java.util.function.Supplier; + import org.apache.camel.test.infra.aws.common.services.AWSService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import software.amazon.awssdk.core.SdkSystemSetting; public final class AWSServiceFactory { private static final Logger LOG = LoggerFactory.getLogger(AWSServiceFactory.class); @@ -33,15 +34,13 @@ public final class AWSServiceFactory { return awsInstanceType == null ? "default" : awsInstanceType; } - public static AWSService createKinesisService() { - String awsInstanceType = System.getProperty("aws-service.kinesis.instance.type"); - LOG.info("Creating a {} AWS kinesis instance", getInstanceTypeName(awsInstanceType)); + private static < + T extends AWSLocalContainerService> AWSService createService(String property, String name, Supplier<T> supplier) { + String awsInstanceType = System.getProperty(property); + LOG.info("Creating a {} {} instance", name, getInstanceTypeName(awsInstanceType)); if (awsInstanceType == null || awsInstanceType.equals("local-aws-container")) { - - System.setProperty(SdkSystemSetting.CBOR_ENABLED.property(), "false"); - - return new AWSKinesisLocalContainerService(); + return supplier.get(); } if (awsInstanceType.equals("remote")) { @@ -53,54 +52,28 @@ public final class AWSServiceFactory { throw new UnsupportedOperationException("Invalid AWS instance type"); } - public static AWSService createSQSService() { - String awsInstanceType = System.getProperty("aws-service.instance.type"); - LOG.info("Creating a {} AWS SQS instance", getInstanceTypeName(awsInstanceType)); - - if (awsInstanceType == null || awsInstanceType.equals("local-aws-container")) { - return new AWSSQSLocalContainerService(); - } + private static <T extends AWSLocalContainerService> AWSService createService(String name, Supplier<T> supplier) { + return createService("aws-service.instance.type", name, supplier); + } - if (awsInstanceType.equals("remote")) { - return new AWSRemoteService(); - } + public static AWSService createKinesisService() { + return createService("aws-service.kinesis.instance.type", "AWS Kinesis", + AWSKinesisLocalContainerService::new); + } - LOG.error("Invalid AWS instance type: {}. Must be either 'remote' or 'local-aws-container'", - awsInstanceType); - throw new UnsupportedOperationException("Invalid AWS instance type"); + public static AWSService createSQSService() { + return createService("AWS SQS", AWSSQSLocalContainerService::new); } public static AWSService createS3Service() { - String awsInstanceType = System.getProperty("aws-service.instance.type"); - LOG.info("Creating a {} AWS S3 instance", awsInstanceType); - - if (awsInstanceType == null || awsInstanceType.equals("local-aws-container")) { - return new AWSS3LocalContainerService(); - } - - if (awsInstanceType.equals("remote")) { - return new AWSRemoteService(); - } - - LOG.error("Invalid AWS instance type: {}. Must be either 'remote' or 'local-aws-container'", - awsInstanceType); - throw new UnsupportedOperationException("Invalid AWS instance type"); + return createService("AWS S3", AWSS3LocalContainerService::new); } public static AWSService createSNSService() { - String awsInstanceType = System.getProperty("aws-service.instance.type"); - LOG.info("Creating a {} AWS SNS instance", awsInstanceType); - - if (awsInstanceType == null || awsInstanceType.equals("local-aws-container")) { - return new AWSSNSLocalContainerService(); - } - - if (awsInstanceType.equals("remote")) { - return new AWSRemoteService(); - } + return createService("AWS SNS", AWSSNSLocalContainerService::new); + } - LOG.error("Invalid AWS instance type: {}. Must be either 'remote' or 'local-aws-container'", - awsInstanceType); - throw new UnsupportedOperationException("Invalid AWS instance type"); + public static AWSService createCloudWatchService() { + return createService("AWS Cloud Watch", AWSCloudWatchLocalContainerService::new); } } diff --git a/test-infra/camel-test-infra-aws-v2/src/test/java/org/apache/camel/test/infra/aws2/services/Service.java b/test-infra/camel-test-infra-aws-v2/src/test/java/org/apache/camel/test/infra/aws2/services/Service.java index 1145399..7458de6 100644 --- a/test-infra/camel-test-infra-aws-v2/src/test/java/org/apache/camel/test/infra/aws2/services/Service.java +++ b/test-infra/camel-test-infra-aws-v2/src/test/java/org/apache/camel/test/infra/aws2/services/Service.java @@ -21,7 +21,8 @@ public enum Service { KINESIS("kinesis"), SQS("sqs"), S3("s3"), - SNS("sns"); + SNS("sns"), + CLOUD_WATCH("cloudwatch"); private final String serviceName;