This is an automated email from the ASF dual-hosted git repository.

ppalaga pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/camel-quarkus.git

commit 99630f23021fd09156df9312084779c778101223
Author: Peter Palaga <ppal...@redhat.com>
AuthorDate: Tue Feb 23 15:51:33 2021 +0100

    Test AWS 2 CloudWatch
---
 integration-tests-aws2/aws2-cw/pom.xml             | 146 +++++++++++++++++++++
 .../component/aws2/cw/it/Aws2CwResource.java       |  64 +++++++++
 .../src/main/resources/application.properties      |  20 +++
 .../quarkus/component/aws2/cw/it/Aws2CwIT.java     |  27 ++++
 .../quarkus/component/aws2/cw/it/Aws2CwTest.java   |  96 ++++++++++++++
 .../aws2/cw/it/Aws2CwTestEnvCustomizer.java        |  34 +++++
 ...quarkus.test.support.aws2.Aws2TestEnvCustomizer |   1 +
 integration-tests-aws2/pom.xml                     |   1 +
 .../quarkus/test/support/aws2/Aws2Client.java      |  35 +++++
 .../test/support/aws2/Aws2TestEnvContext.java      |  27 ++++
 .../test/support/aws2/Aws2TestResource.java        |  24 ++++
 integration-tests/aws2-grouped/pom.xml             |  21 +++
 12 files changed, 496 insertions(+)

diff --git a/integration-tests-aws2/aws2-cw/pom.xml 
b/integration-tests-aws2/aws2-cw/pom.xml
new file mode 100644
index 0000000..0d9e9e2
--- /dev/null
+++ b/integration-tests-aws2/aws2-cw/pom.xml
@@ -0,0 +1,146 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0";
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
http://maven.apache.org/xsd/maven-4.0.0.xsd";>
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>org.apache.camel.quarkus</groupId>
+        <artifactId>camel-quarkus-integration-tests-aws2</artifactId>
+        <version>1.8.0-SNAPSHOT</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <artifactId>camel-quarkus-integration-test-aws2-cw</artifactId>
+    <name>Camel Quarkus :: Integration Tests :: AWS 2 CloudWatch</name>
+    <description>Integration tests for Camel Quarkus AWS 2 CloudWatch 
extension</description>
+
+    <dependencyManagement>
+        <dependencies>
+            <dependency>
+                <groupId>org.apache.camel.quarkus</groupId>
+                <artifactId>camel-quarkus-bom-test</artifactId>
+                <version>${project.version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.camel.quarkus</groupId>
+            <artifactId>camel-quarkus-main</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.camel.quarkus</groupId>
+            <artifactId>camel-quarkus-aws2-cw</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>io.quarkus</groupId>
+            <artifactId>quarkus-resteasy</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>io.quarkus</groupId>
+            <artifactId>quarkus-quartz</artifactId>
+        </dependency>
+
+        <!-- test dependencies -->
+        <dependency>
+            <groupId>io.quarkus</groupId>
+            <artifactId>quarkus-junit5</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>io.rest-assured</groupId>
+            <artifactId>rest-assured</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.camel.quarkus</groupId>
+            
<artifactId>camel-quarkus-integration-tests-support-aws2</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.awaitility</groupId>
+            <artifactId>awaitility</artifactId>
+            <scope>test</scope>
+        </dependency>
+
+        <!-- The following dependencies guarantee that this module is built 
after them. You can update them by running `mvn process-resources -Pformat -N` 
from the source tree root directory -->
+        <dependency>
+            <groupId>org.apache.camel.quarkus</groupId>
+            <artifactId>camel-quarkus-aws2-cw-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-main-deployment</artifactId>
+            <version>${project.version}</version>
+            <type>pom</type>
+            <scope>test</scope>
+            <exclusions>
+                <exclusion>
+                    <groupId>*</groupId>
+                    <artifactId>*</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+    </dependencies>
+
+    <profiles>
+        <profile>
+            <id>native</id>
+            <activation>
+                <property>
+                    <name>native</name>
+                </property>
+            </activation>
+            <properties>
+                <quarkus.package.type>native</quarkus.package.type>
+            </properties>
+            <build>
+                <plugins>
+                    <plugin>
+                        <groupId>org.apache.maven.plugins</groupId>
+                        <artifactId>maven-failsafe-plugin</artifactId>
+                        <executions>
+                            <execution>
+                                <goals>
+                                    <goal>integration-test</goal>
+                                    <goal>verify</goal>
+                                </goals>
+                            </execution>
+                        </executions>
+                    </plugin>
+                </plugins>
+            </build>
+        </profile>
+    </profiles>
+
+</project>
diff --git 
a/integration-tests-aws2/aws2-cw/src/main/java/org/apache/camel/quarkus/component/aws2/cw/it/Aws2CwResource.java
 
b/integration-tests-aws2/aws2-cw/src/main/java/org/apache/camel/quarkus/component/aws2/cw/it/Aws2CwResource.java
new file mode 100644
index 0000000..096c2db
--- /dev/null
+++ 
b/integration-tests-aws2/aws2-cw/src/main/java/org/apache/camel/quarkus/component/aws2/cw/it/Aws2CwResource.java
@@ -0,0 +1,64 @@
+/*
+ * 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.aws2.cw.it;
+
+import java.net.URI;
+
+import javax.enterprise.context.ApplicationScoped;
+import javax.inject.Inject;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+
+import io.quarkus.scheduler.Scheduled;
+import org.apache.camel.ProducerTemplate;
+
+@Path("/aws2-cw")
+@ApplicationScoped
+public class Aws2CwResource {
+
+    @Inject
+    ProducerTemplate producerTemplate;
+
+    private volatile String endpointUri;
+
+    @Scheduled(every = "1s")
+    void schedule() {
+        if (endpointUri != null) {
+            producerTemplate.requestBody(endpointUri, null, String.class);
+        }
+    }
+
+    @Path("/send-metric/{namespace}/{metric-name}/{metric-unit}")
+    @POST
+    @Consumes(MediaType.TEXT_PLAIN)
+    @Produces(MediaType.TEXT_PLAIN)
+    public Response post(
+            String value,
+            @PathParam("namespace") String namespace,
+            @PathParam("metric-name") String name,
+            @PathParam("metric-unit") String unit) throws Exception {
+        endpointUri = "aws2-cw://" + namespace + "?name=" + name + "&value=" + 
value + "&unit=" + unit;
+        return Response
+                .created(new URI("https://camel.apache.org/";))
+                .build();
+    }
+}
diff --git 
a/integration-tests-aws2/aws2-cw/src/main/resources/application.properties 
b/integration-tests-aws2/aws2-cw/src/main/resources/application.properties
new file mode 100644
index 0000000..8f24b45
--- /dev/null
+++ b/integration-tests-aws2/aws2-cw/src/main/resources/application.properties
@@ -0,0 +1,20 @@
+## ---------------------------------------------------------------------------
+## 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.
+## ---------------------------------------------------------------------------
+
+camel.component.aws2-cw.access-key=${AWS_ACCESS_KEY}
+camel.component.aws2-cw.secret-key=${AWS_SECRET_KEY}
+camel.component.aws2-cw.region=${AWS_REGION:us-east-1}
diff --git 
a/integration-tests-aws2/aws2-cw/src/test/java/org/apache/camel/quarkus/component/aws2/cw/it/Aws2CwIT.java
 
b/integration-tests-aws2/aws2-cw/src/test/java/org/apache/camel/quarkus/component/aws2/cw/it/Aws2CwIT.java
new file mode 100644
index 0000000..b77875c
--- /dev/null
+++ 
b/integration-tests-aws2/aws2-cw/src/test/java/org/apache/camel/quarkus/component/aws2/cw/it/Aws2CwIT.java
@@ -0,0 +1,27 @@
+/*
+ * 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.aws2.cw.it;
+
+import io.quarkus.test.junit.NativeImageTest;
+import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable;
+
+//TODO disabled because of https://github.com/apache/camel-quarkus/issues/2216
+@EnabledIfEnvironmentVariable(named = "AWS_ACCESS_KEY", matches = 
"[a-zA-Z0-9]+")
+@NativeImageTest
+class Aws2CwIT extends Aws2CwTest {
+
+}
diff --git 
a/integration-tests-aws2/aws2-cw/src/test/java/org/apache/camel/quarkus/component/aws2/cw/it/Aws2CwTest.java
 
b/integration-tests-aws2/aws2-cw/src/test/java/org/apache/camel/quarkus/component/aws2/cw/it/Aws2CwTest.java
new file mode 100644
index 0000000..f5f42d7
--- /dev/null
+++ 
b/integration-tests-aws2/aws2-cw/src/test/java/org/apache/camel/quarkus/component/aws2/cw/it/Aws2CwTest.java
@@ -0,0 +1,96 @@
+/*
+ * 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.aws2.cw.it;
+
+import java.time.Instant;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+
+import io.quarkus.test.common.QuarkusTestResource;
+import io.quarkus.test.junit.QuarkusTest;
+import io.restassured.RestAssured;
+import io.restassured.http.ContentType;
+import org.apache.camel.quarkus.test.support.aws2.Aws2Client;
+import org.apache.camel.quarkus.test.support.aws2.Aws2TestResource;
+import org.awaitility.Awaitility;
+import org.jboss.logging.Logger;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable;
+import org.testcontainers.containers.localstack.LocalStackContainer.Service;
+import software.amazon.awssdk.services.cloudwatch.CloudWatchClient;
+import software.amazon.awssdk.services.cloudwatch.model.Datapoint;
+import 
software.amazon.awssdk.services.cloudwatch.model.GetMetricStatisticsRequest;
+import software.amazon.awssdk.services.cloudwatch.model.Statistic;
+
+//TODO disabled because of https://github.com/apache/camel-quarkus/issues/2216
+@EnabledIfEnvironmentVariable(named = "AWS_ACCESS_KEY", matches = 
"[a-zA-Z0-9]+")
+@QuarkusTest
+@QuarkusTestResource(Aws2TestResource.class)
+class Aws2CwTest {
+    private static final Logger LOG = Logger.getLogger(Aws2CwTest.class);
+
+    @Aws2Client(Service.CLOUDWATCH)
+    CloudWatchClient client;
+
+    @Test
+    public void metric() {
+
+        final Instant startTime = 
Instant.ofEpochMilli(System.currentTimeMillis() - 10000);
+
+        final String namespace = "cq-metrics-" + 
java.util.UUID.randomUUID().toString().replace("-", "");
+        final String metricName = "metricName" + 
java.util.UUID.randomUUID().toString().replace("-", "");
+        final int value = (int) (Math.random() * 10000);
+        RestAssured.given()
+                .contentType(ContentType.TEXT)
+                .body(value)
+                .post("/aws2-cw/send-metric/" + namespace + "/" + metricName + 
"/Count")
+                .then()
+                .statusCode(201);
+
+        final double precision = 0.0001;
+        Awaitility.await().pollInterval(1, TimeUnit.SECONDS).atMost(120, 
TimeUnit.SECONDS).until(
+                () -> {
+
+                    List<Datapoint> datapoints = client.getMetricStatistics(
+                            GetMetricStatisticsRequest.builder()
+                                    .namespace(namespace)
+                                    .metricName(metricName)
+                                    .statistics(Statistic.SAMPLE_COUNT, 
Statistic.MINIMUM, Statistic.MAXIMUM)
+                                    .startTime(startTime)
+                                    
.endTime(Instant.ofEpochMilli(System.currentTimeMillis() + 10000))
+                                    .period(1)
+                                    .build())
+                            .datapoints();
+                    LOG.info("Expecting some datapoints for metric " + 
namespace + "/" + metricName + ", got " + datapoints);
+                    if (datapoints.isEmpty()) {
+                        return false;
+                    }
+
+                    Datapoint dp = datapoints.get(0);
+
+                    if (dp.sampleCount().doubleValue() + precision > 1.0
+                            && Math.abs(dp.minimum().doubleValue() - value) < 
precision
+                            && Math.abs(dp.maximum().doubleValue() - value) < 
precision) {
+                        return true;
+                    }
+                    throw new RuntimeException("Unexpected datapoint " + dp + 
"; expected sampleCount ~ 1 && minimum ~ " + value
+                            + " && maximum ~ " + value);
+                });
+
+    }
+
+}
diff --git 
a/integration-tests-aws2/aws2-cw/src/test/java/org/apache/camel/quarkus/component/aws2/cw/it/Aws2CwTestEnvCustomizer.java
 
b/integration-tests-aws2/aws2-cw/src/test/java/org/apache/camel/quarkus/component/aws2/cw/it/Aws2CwTestEnvCustomizer.java
new file mode 100644
index 0000000..6871824
--- /dev/null
+++ 
b/integration-tests-aws2/aws2-cw/src/test/java/org/apache/camel/quarkus/component/aws2/cw/it/Aws2CwTestEnvCustomizer.java
@@ -0,0 +1,34 @@
+/*
+ * 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.aws2.cw.it;
+
+import org.apache.camel.quarkus.test.support.aws2.Aws2TestEnvContext;
+import org.apache.camel.quarkus.test.support.aws2.Aws2TestEnvCustomizer;
+import org.testcontainers.containers.localstack.LocalStackContainer.Service;
+
+public class Aws2CwTestEnvCustomizer implements Aws2TestEnvCustomizer {
+
+    @Override
+    public Service[] localstackServices() {
+        return new Service[] { Service.CLOUDWATCH };
+    }
+
+    @Override
+    public void customize(Aws2TestEnvContext envContext) {
+
+    }
+}
diff --git 
a/integration-tests-aws2/aws2-cw/src/test/resources/META-INF/services/org.apache.camel.quarkus.test.support.aws2.Aws2TestEnvCustomizer
 
b/integration-tests-aws2/aws2-cw/src/test/resources/META-INF/services/org.apache.camel.quarkus.test.support.aws2.Aws2TestEnvCustomizer
new file mode 100644
index 0000000..b8d10d2
--- /dev/null
+++ 
b/integration-tests-aws2/aws2-cw/src/test/resources/META-INF/services/org.apache.camel.quarkus.test.support.aws2.Aws2TestEnvCustomizer
@@ -0,0 +1 @@
+org.apache.camel.quarkus.component.aws2.cw.it.Aws2CwTestEnvCustomizer
\ No newline at end of file
diff --git a/integration-tests-aws2/pom.xml b/integration-tests-aws2/pom.xml
index 42583a0..c20091f 100644
--- a/integration-tests-aws2/pom.xml
+++ b/integration-tests-aws2/pom.xml
@@ -38,6 +38,7 @@
 
     <modules>
         <!-- extensions a..z; do not remove this comment, it is important when 
sorting via  mvn process-resources -Pformat -->
+        <module>aws2-cw</module>
         <module>aws2-ddb</module>
         <module>aws2-kinesis</module>
         <module>aws2-s3</module>
diff --git 
a/integration-tests-support/aws2/src/main/java/org/apache/camel/quarkus/test/support/aws2/Aws2Client.java
 
b/integration-tests-support/aws2/src/main/java/org/apache/camel/quarkus/test/support/aws2/Aws2Client.java
new file mode 100644
index 0000000..fcebaa3
--- /dev/null
+++ 
b/integration-tests-support/aws2/src/main/java/org/apache/camel/quarkus/test/support/aws2/Aws2Client.java
@@ -0,0 +1,35 @@
+/*
+ * 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.test.support.aws2;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+import org.testcontainers.containers.localstack.LocalStackContainer.Service;
+
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.FIELD)
+public @interface Aws2Client {
+
+    /**
+     *
+     * @return the {@link Service} for which we want a client
+     */
+    Service value();
+}
diff --git 
a/integration-tests-support/aws2/src/main/java/org/apache/camel/quarkus/test/support/aws2/Aws2TestEnvContext.java
 
b/integration-tests-support/aws2/src/main/java/org/apache/camel/quarkus/test/support/aws2/Aws2TestEnvContext.java
index 0b66ab2..6167883 100644
--- 
a/integration-tests-support/aws2/src/main/java/org/apache/camel/quarkus/test/support/aws2/Aws2TestEnvContext.java
+++ 
b/integration-tests-support/aws2/src/main/java/org/apache/camel/quarkus/test/support/aws2/Aws2TestEnvContext.java
@@ -16,13 +16,16 @@
  */
 package org.apache.camel.quarkus.test.support.aws2;
 
+import java.lang.reflect.InvocationTargetException;
 import java.net.URI;
 import java.util.ArrayList;
 import java.util.Collections;
+import java.util.EnumMap;
 import java.util.LinkedHashMap;
 import java.util.ListIterator;
 import java.util.Locale;
 import java.util.Map;
+import java.util.Map.Entry;
 import java.util.Optional;
 import java.util.function.Supplier;
 
@@ -41,6 +44,7 @@ import software.amazon.awssdk.regions.Region;
 public class Aws2TestEnvContext {
     private static final Logger LOG = 
Logger.getLogger(Aws2TestEnvContext.class);
     private final ArrayList<AutoCloseable> closeables = new ArrayList<>();
+    private final Map<Service, ? extends SdkClient> clients = new 
EnumMap<>(Service.class);
     private final Map<String, String> properties = new LinkedHashMap<>();
     private final String accessKey;
     private final String secretKey;
@@ -67,6 +71,7 @@ public class Aws2TestEnvContext {
                     case SNS:
                     case DYNAMODB:
                     case DYNAMODB_STREAMS:
+                    case CLOUDWATCH:
                         // TODO 
https://github.com/apache/camel-quarkus/issues/2216
                         break;
                     default:
@@ -117,6 +122,10 @@ public class Aws2TestEnvContext {
         ListIterator<AutoCloseable> it = 
closeables.listIterator(closeables.size());
         while (it.hasPrevious()) {
             AutoCloseable c = it.previous();
+            if (c instanceof SdkClient) {
+                clients.entrySet().stream().filter(en -> c == 
en.getValue()).map(Entry::getKey).findFirst()
+                        .map(clients::remove);
+            }
             try {
                 c.close();
             } catch (Exception e) {
@@ -157,6 +166,22 @@ public class Aws2TestEnvContext {
         return client;
     }
 
+    @SuppressWarnings({ "unchecked", "rawtypes" })
+    SdkClient client(Service service, Class<?> clientType) {
+        SdkClient result = clients.get(service);
+        if (result != null) {
+            return result;
+        }
+        return client(service, () -> {
+            try {
+                return (AwsClientBuilder) 
clientType.getDeclaredMethod("builder").invoke(null);
+            } catch (IllegalAccessException | IllegalArgumentException | 
InvocationTargetException | NoSuchMethodException
+                    | SecurityException e) {
+                throw new RuntimeException("Could not call " + 
clientType.getName() + ".builder()", e);
+            }
+        });
+    }
+
     private static String camelServiceAcronym(Service service) {
         switch (service) {
         case DYNAMODB:
@@ -165,6 +190,8 @@ public class Aws2TestEnvContext {
             return "ddbstream";
         case FIREHOSE:
             return "kinesis-firehose";
+        case CLOUDWATCH:
+            return "cw";
         default:
             return service.name().toLowerCase(Locale.ROOT);
         }
diff --git 
a/integration-tests-support/aws2/src/main/java/org/apache/camel/quarkus/test/support/aws2/Aws2TestResource.java
 
b/integration-tests-support/aws2/src/main/java/org/apache/camel/quarkus/test/support/aws2/Aws2TestResource.java
index f1be06f..803bfbc 100644
--- 
a/integration-tests-support/aws2/src/main/java/org/apache/camel/quarkus/test/support/aws2/Aws2TestResource.java
+++ 
b/integration-tests-support/aws2/src/main/java/org/apache/camel/quarkus/test/support/aws2/Aws2TestResource.java
@@ -16,6 +16,7 @@
  */
 package org.apache.camel.quarkus.test.support.aws2;
 
+import java.lang.reflect.Field;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
@@ -29,6 +30,7 @@ import org.jboss.logging.Logger;
 import org.testcontainers.containers.localstack.LocalStackContainer;
 import org.testcontainers.containers.localstack.LocalStackContainer.Service;
 import org.testcontainers.utility.DockerImageName;
+import software.amazon.awssdk.core.SdkClient;
 
 public final class Aws2TestResource implements 
ContainerResourceLifecycleManager {
     private static final Logger LOG = Logger.getLogger(Aws2TestResource.class);
@@ -93,4 +95,26 @@ public final class Aws2TestResource implements 
ContainerResourceLifecycleManager
         envContext.close();
     }
 
+    @Override
+    public void inject(Object testInstance) {
+        Class<?> c = testInstance.getClass();
+        while (c != Object.class) {
+            for (Field f : c.getDeclaredFields()) {
+                Aws2Client clientAnnot = f.getAnnotation(Aws2Client.class);
+                if (clientAnnot != null) {
+                    Service service = clientAnnot.value();
+                    f.setAccessible(true);
+                    SdkClient client = envContext.client(service, f.getType());
+                    try {
+                        f.set(testInstance, client);
+                    } catch (IllegalArgumentException | IllegalAccessException 
e) {
+                        throw new RuntimeException("Could not set " + 
c.getName() + "." + f.getName(), e);
+                    }
+                }
+            }
+            c = c.getSuperclass();
+        }
+
+    }
+
 }
diff --git a/integration-tests/aws2-grouped/pom.xml 
b/integration-tests/aws2-grouped/pom.xml
index 787f499..52051e1 100644
--- a/integration-tests/aws2-grouped/pom.xml
+++ b/integration-tests/aws2-grouped/pom.xml
@@ -45,6 +45,10 @@
     <dependencies>
         <dependency>
             <groupId>io.quarkus</groupId>
+            <artifactId>quarkus-quartz</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>io.quarkus</groupId>
             <artifactId>quarkus-resteasy</artifactId>
         </dependency>
         <dependency>
@@ -53,6 +57,10 @@
         </dependency>
         <dependency>
             <groupId>org.apache.camel.quarkus</groupId>
+            <artifactId>camel-quarkus-aws2-cw</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.camel.quarkus</groupId>
             <artifactId>camel-quarkus-aws2-ddb</artifactId>
         </dependency>
         <dependency>
@@ -104,6 +112,19 @@
         <!-- The following dependencies guarantee that this module is built 
after them. You can update them by running `mvn process-resources -Pformat -N` 
from the source tree root directory -->
         <dependency>
             <groupId>org.apache.camel.quarkus</groupId>
+            <artifactId>camel-quarkus-aws2-cw-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-aws2-ddb-deployment</artifactId>
             <version>${project.version}</version>
             <type>pom</type>

Reply via email to