You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by or...@apache.org on 2020/11/18 19:13:56 UTC

[camel] branch master updated: Added test infra for AWS v2 Cloud Watch (#4626)

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 <or...@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;