You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by fm...@apache.org on 2025/01/14 15:17:31 UTC
(camel) 01/02: Execute test-infra services via Camel JBang
This is an automated email from the ASF dual-hosted git repository.
fmariani pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel.git
commit 2e8f169a398cf538c33e66db0ecfef73fe331105
Author: Croway <fe...@gmail.com>
AuthorDate: Tue Nov 19 11:53:53 2024 +0100
Execute test-infra services via Camel JBang
Add non-test-jar dependency for component test-infra
Signed-off-by: Tom Cunningham <tc...@redhat.com>
Revert "Add non-test-jar dependency for component test-infra"
This reverts commit 954da18afa17140d6302e42549b695db2318dc63.
Add non-test-jar dependency for component test-infra
CAMEL-21452 Changes to xmpp/zookeeper
CAMEL-21452 Decouple the infrastructure from the testing API
CAMEL-21452 Decouple the infrastructure from the testing API
aws
azure
cassandra
chatscript
consul
couchbase
couchdb
elasticsearch
etcd3
fhir
ftp
jms/artemis
Create a test-jar that contain main and test classes
Align all components
let camel compile
Fix langchain4j compilation
Revert Jetty test-infra
Rebase
Execute test-infra with camel jbang
Add Camel JBang command
Fix camel jbang infra run
let mvnd compile
Sort import
Remove yaml output in favor of json/table
Add javadoc
Use Camel standard workflow for generated sources
test-infra JUnit decouple documentation
Add Camel JBang Infra Docs
test infra metadata json
Use LinkedHashSet for ordering
---
components/camel-mongodb/pom.xml | 6 -
components/camel-solr/pom.xml | 1 +
components/camel-tahu/pom.xml | 6 -
.../java/org/apache/camel/test/AvailablePort.java | 52 ++
.../org/apache/camel/test/AvailablePortFinder.java | 28 +-
.../apache/camel/spi/annotations/InfraService.java | 63 +++
.../modules/ROOT/pages/camel-jbang.adoc | 78 +++
.../user-manual/modules/ROOT/pages/test-infra.adoc | 25 +-
dsl/camel-jbang/camel-jbang-core/pom.xml | 11 +
.../dsl/jbang/core/commands/CamelJBangMain.java | 6 +
.../jbang/core/commands/infra/InfraCommand.java | 55 ++
.../dsl/jbang/core/commands/infra/InfraList.java | 107 ++++
.../dsl/jbang/core/commands/infra/InfraRun.java | 149 ++++++
pom.xml | 1 +
test-infra/camel-test-infra-all/pom.xml | 563 +++++++++++++++++++++
.../resources/META-INF/test-infra-metadata.json | 1 +
.../ArangoDBLocalContainerInfraService.java | 2 +
.../artemis/services/ArtemisAMQPInfraService.java | 2 +
.../artemis/services/ArtemisMQTTInfraService.java | 2 +
.../services/ArtemisPersistentVMInfraService.java | 2 +
.../artemis/services/ArtemisVMInfraService.java | 2 +
.../AWSCloudWatchLocalContainerInfraService.java | 4 +
.../AWSConfigLocalContainerInfraService.java | 4 +
.../AWSDynamodbLocalContainerInfraService.java | 4 +
.../services/AWSEC2LocalContainerInfraService.java | 4 +
.../AWSEventBridgeLocalContainerInfraService.java | 4 +
.../services/AWSIAMLocalContainerInfraService.java | 4 +
.../services/AWSKMSLocalContainerInfraService.java | 4 +
.../AWSKinesisLocalContainerInfraService.java | 3 +
.../AWSLambdaLocalContainerInfraService.java | 4 +
.../services/AWSS3LocalContainerInfraService.java | 3 +
.../services/AWSSNSLocalContainerInfraService.java | 4 +
.../services/AWSSQSLocalContainerInfraService.java | 4 +
.../services/AWSSTSLocalContainerInfraService.java | 4 +
...WSSecretsManagerLocalContainerInfraService.java | 4 +
...AzureStorageBlobLocalContainerInfraService.java | 4 +
...zureStorageQueueLocalContainerInfraService.java | 4 +
.../CassandraLocalContainerInfraService.java | 2 +
.../ChatScriptLocalContainerInfraService.java | 2 +
.../services/ConsulLocalContainerInfraService.java | 2 +
.../CouchbaseLocalContainerInfraService.java | 2 +
.../CouchDbLocalContainerInfraService.java | 2 +
.../ElasticSearchLocalContainerInfraService.java | 2 +
.../services/Etcd3LocalContainerInfraService.java | 2 +
.../services/FhirLocalContainerInfraService.java | 2 +
.../services/embedded/FtpEmbeddedInfraService.java | 2 +
.../embedded/FtpsEmbeddedInfraService.java | 12 +-
.../embedded/SftpEmbeddedInfraService.java | 2 +
.../GooglePubSubLocalContainerInfraService.java | 3 +
.../HashicorpVaultLocalContainerInfraService.java | 3 +
.../services/HazelcastEmbeddedInfraService.java | 2 +
.../hivemq/services/LocalHiveMQInfraService.java | 2 +
.../LocalHiveMQSparkplugTCKInfraService.java | 3 +
.../services/IgniteEmbeddedInfraService.java | 2 +
.../InfinispanLocalContainerInfraService.java | 2 +
.../services/ContainerLocalKafkaInfraService.java | 2 +
.../infra/kafka/services/RedpandaInfraService.java | 2 +
.../RedpandaTransactionsEnabledContainer.java | 4 +-
.../infra/kafka/services/StrimziInfraService.java | 2 +
.../MicroprofileLRALocalContainerInfraService.java | 3 +
.../services/MilvusLocalContainerInfraService.java | 2 +
.../services/MinioLocalContainerInfraService.java | 2 +
.../MongoDBLocalContainerInfraService.java | 2 +
.../MosquittoLocalContainerInfraService.java | 2 +
.../services/NatsLocalContainerInfraService.java | 2 +
.../services/OllamaLocalContainerInfraService.java | 2 +
.../OpenldapLocalContainerInfraService.java | 2 +
.../PostgresLocalContainerInfraService.java | 6 +-
.../services/PulsarLocalContainerInfraService.java | 2 +
.../services/QdrantLocalContainerInfraService.java | 2 +
.../RabbitMQLocalContainerInfraService.java | 2 +
.../services/RedisLocalContainerInfraService.java | 2 +
.../services/RocketMQContainerInfraService.java | 2 +
.../services/SmbLocalContainerInfraService.java | 2 +
.../services/SolrLocalContainerInfraService.java | 2 +
.../TorchServeLocalContainerInfraService.java | 2 +
.../services/XmppLocalContainerInfraService.java | 2 +
.../ZooKeeperLocalContainerInfraService.java | 2 +
test-infra/pom.xml | 8 +
.../camel/itest/security/GreeterClientTest.java | 4 +-
tooling/maven/camel-package-maven-plugin/pom.xml | 5 +
.../CamelTestInfraGenerateMetadataMojo.java | 142 ++++++
.../apache/camel/spi/annotations/InfraService.java | 63 +++
83 files changed, 1496 insertions(+), 52 deletions(-)
diff --git a/components/camel-mongodb/pom.xml b/components/camel-mongodb/pom.xml
index e250c53bc1e..1d8de1ae825 100644
--- a/components/camel-mongodb/pom.xml
+++ b/components/camel-mongodb/pom.xml
@@ -66,12 +66,6 @@
</dependency>
<!-- test infra -->
- <dependency>
- <groupId>org.apache.camel</groupId>
- <artifactId>camel-test-infra-core</artifactId>
- <version>${project.version}</version>
- <scope>test</scope>
- </dependency>
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-test-infra-core</artifactId>
diff --git a/components/camel-solr/pom.xml b/components/camel-solr/pom.xml
index 0ada6d793b7..699a861a980 100644
--- a/components/camel-solr/pom.xml
+++ b/components/camel-solr/pom.xml
@@ -31,6 +31,7 @@
<description>Camel Solr Support</description>
<properties>
+ <skipITs.ppc64le>true</skipITs.ppc64le>
</properties>
<dependencies>
diff --git a/components/camel-tahu/pom.xml b/components/camel-tahu/pom.xml
index ff4005a4f8e..55c4d92eda7 100644
--- a/components/camel-tahu/pom.xml
+++ b/components/camel-tahu/pom.xml
@@ -172,12 +172,6 @@
</dependency>
<!-- test infra -->
- <dependency>
- <groupId>org.apache.camel</groupId>
- <artifactId>camel-test-infra-core</artifactId>
- <version>${project.version}</version>
- <scope>test</scope>
- </dependency>
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-test-infra-core</artifactId>
diff --git a/components/camel-test/camel-test-junit5/src/main/java/org/apache/camel/test/AvailablePort.java b/components/camel-test/camel-test-junit5/src/main/java/org/apache/camel/test/AvailablePort.java
new file mode 100644
index 00000000000..5140766b31c
--- /dev/null
+++ b/components/camel-test/camel-test-junit5/src/main/java/org/apache/camel/test/AvailablePort.java
@@ -0,0 +1,52 @@
+/*
+ * 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.test;
+
+import java.io.IOException;
+import java.net.InetAddress;
+import java.net.InetSocketAddress;
+import java.net.ServerSocket;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class AvailablePort {
+ private static final Logger LOG = LoggerFactory.getLogger(AvailablePort.class);
+
+ /**
+ * Probe a port to see if it is free
+ *
+ * @param port an integer port number to be tested. If port is 0, then the next available port is
+ * returned.
+ * @throws IllegalStateException if the port is not free or, in case of port 0, if there are no ports available at
+ * all.
+ * @return the port number itself if the port is free or, in case of port 0, the first
+ * available port number.
+ */
+ public static int probePort(InetAddress address, int port) {
+
+ try (ServerSocket ss = new ServerSocket()) {
+ ss.setReuseAddress(true);
+ ss.bind(new InetSocketAddress(address, port), 1);
+ int probedPort = ss.getLocalPort();
+ LOG.info("Available port is -> {}", probedPort);
+ return probedPort;
+ } catch (IOException e) {
+ throw new IllegalStateException("Cannot find free port", e);
+ }
+ }
+}
diff --git a/components/camel-test/camel-test-junit5/src/main/java/org/apache/camel/test/AvailablePortFinder.java b/components/camel-test/camel-test-junit5/src/main/java/org/apache/camel/test/AvailablePortFinder.java
index 08d266309fc..459a1155e2c 100644
--- a/components/camel-test/camel-test-junit5/src/main/java/org/apache/camel/test/AvailablePortFinder.java
+++ b/components/camel-test/camel-test-junit5/src/main/java/org/apache/camel/test/AvailablePortFinder.java
@@ -16,10 +16,6 @@
*/
package org.apache.camel.test;
-import java.io.IOException;
-import java.net.InetAddress;
-import java.net.InetSocketAddress;
-import java.net.ServerSocket;
import java.util.Map;
import java.util.Random;
import java.util.concurrent.ConcurrentHashMap;
@@ -201,29 +197,7 @@ public final class AvailablePortFinder {
* available port number.
*/
public static int probePort(int port) {
- return probePort(null, port);
- }
-
- /**
- * Probe a port to see if it is free
- *
- * @param port an integer port number to be tested. If port is 0, then the next available port is
- * returned.
- * @throws IllegalStateException if the port is not free or, in case of port 0, if there are no ports available at
- * all.
- * @return the port number itself if the port is free or, in case of port 0, the first
- * available port number.
- */
- public static int probePort(InetAddress address, int port) {
- try (ServerSocket ss = new ServerSocket()) {
- ss.setReuseAddress(true);
- ss.bind(new InetSocketAddress(address, port), 1);
- int probedPort = ss.getLocalPort();
- LOG.info("Available port is -> {}", probedPort);
- return probedPort;
- } catch (IOException e) {
- throw new IllegalStateException("Cannot find free port", e);
- }
+ return AvailablePort.probePort(null, port);
}
}
diff --git a/core/camel-api/src/generated/java/org/apache/camel/spi/annotations/InfraService.java b/core/camel-api/src/generated/java/org/apache/camel/spi/annotations/InfraService.java
new file mode 100644
index 00000000000..354fcce94c4
--- /dev/null
+++ b/core/camel-api/src/generated/java/org/apache/camel/spi/annotations/InfraService.java
@@ -0,0 +1,63 @@
+/*
+ * 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.spi.annotations;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Marks a class as a Service that can be used by Camel JBang infra
+ *
+ * The marked class is analyzed by the mojo CamelTestInfraGenerateMetadataMojo
+ *
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+@Target({ ElementType.TYPE })
+public @interface InfraService {
+
+ /**
+ * Interface that extends InfrastructureService
+ *
+ * the interface is used by Camel JBang infra run to retrieve testing information like port, endpoint, username...
+ *
+ * @return
+ */
+ Class service();
+
+ /**
+ * List of names that can be used to run the service
+ *
+ * @return
+ */
+ String[] serviceAlias();
+
+ /**
+ * Additional and optional Service name, in case of multiple Service implementations
+ *
+ * For example kafka has 3 implementations
+ *
+ * kafka - uses apache/kafka image as implementation kafka redpanda - uses redpandadata/redpanda image as
+ * implementation kafka strimzi - uses strimzi/kafka as image implementation
+ *
+ * @return
+ */
+ String[] serviceImplementationAlias() default {};
+}
diff --git a/docs/user-manual/modules/ROOT/pages/camel-jbang.adoc b/docs/user-manual/modules/ROOT/pages/camel-jbang.adoc
index 566bc1c61c0..ff79297617e 100644
--- a/docs/user-manual/modules/ROOT/pages/camel-jbang.adoc
+++ b/docs/user-manual/modules/ROOT/pages/camel-jbang.adoc
@@ -3977,3 +3977,81 @@ are downloaded to your local Maven repository `~/.m2`.
So if you find problems with running Camel JBang using what is seems like an outdated JAR, then you can
try to delete these directories or parts of it.
+
+== Infrastructure
+
+Camel JBang `infra` command can be used to `list` and `run` external services that can be used for fast prototyping and testing.
+Apache Camel test-infra Services are exposed via the `infra` command, in this way, the same infrastructure that is used to test
+Apache Camel itself, is exposed via Camel JBang, and services that are already proved to work with Apache Camel can be easily used.
+
+=== List Services
+
+Supported external services can be listed with the following command:
+
+[source,bash]
+----
+camel infra list
+----
+
+Following is the output for the above-mentioned configuration.
+
+[source,bash]
+----
+ALIAS IMPLEMENTATION
+ ignite
+ azure storage-queue
+ openldap
+ event-bridge
+ xmpp
+ kinesis
+ redis
+ ...
+----
+
+=== Run Service
+
+Supported external services can be run with the following command (Docker or Podman is required for most of the service):
+
+[source,bash]
+----
+camel infra run $SERVICE ($OPTIONAL_SERVICE_IMPLEMENTATION)
+----
+
+Once the service is up and running, information about the service are printed as json that can be easily used in the Camel Routes,
+for example:
+
+[source,bash]
+----
+$ camel infra run ftp
+
+Starting service ftp
+{
+ "getPort" : 52472,
+ "getFtpRootDir" : "file://path/to/current/directory/target/ftp/camel-test-infra-test-directory/camel-test-infra-configuration-test-directory"
+}
+To stop the execution press q
+----
+
+[source,bash]
+----
+$ camel infra run kafka redpanda
+
+Starting service kafka with implementation redpanda
+{
+ "getBootstrapServers" : "localhost:32771"
+}
+To stop the execution press q
+----
+
+[source,bash]
+----
+$ camel infra run openldap
+
+Starting service openldap
+{
+ "getPort" : 32774,
+ "getSslPort" : 32775,
+ "getHost" : "localhost"
+}
+To stop the execution press q
+----
\ No newline at end of file
diff --git a/docs/user-manual/modules/ROOT/pages/test-infra.adoc b/docs/user-manual/modules/ROOT/pages/test-infra.adoc
index b1befa79242..2b2cc134def 100644
--- a/docs/user-manual/modules/ROOT/pages/test-infra.adoc
+++ b/docs/user-manual/modules/ROOT/pages/test-infra.adoc
@@ -106,13 +106,15 @@ maintenance.
==== Recommended Structure for Test Infrastructure Modules
-The service should provide an interface, named after the infrastructure being implemented, and this interface should
-extend the https://github.com/apache/camel/blob/main/test-infra/camel-test-infra-common/src/test/java/org/apache/camel/test/infra/common/services/TestService.java[TestService]
-interface. The services should try to minimize the test execution time and resource usage when running. As such,
-the https://junit.org/junit5/docs/5.1.1/api/org/junit/jupiter/api/extension/BeforeAllCallback.html[BeforeAllCallback]
-and https://junit.org/junit5/docs/5.1.1/api/org/junit/jupiter/api/extension/AfterAllCallback.html[AfterAllCallback]
-should be the preferred extensions whenever possible because they allow the instance of the infrastructure to be static
-throughout the test execution.
+The actual Service interface and implementation should be added under `src/main`, while the actual integration with JUnit
+can be added to `src/test`, in this way the classes needed to run the service (most of them, with testcontainers) are decoupled
+by JUnit and can be run separately.
+
+===== Main Sources
+
+The service should provide an interface, named after the infrastructure being implemented, and this interface should extend the
+https://github.com/apache/camel/blob/main/test-infra/camel-test-infra-common/src/main/java/org/apache/camel/test/infra/common/services/InfrastructureService.java[InfrastructureService]
+interface.
[NOTE]
====
@@ -141,6 +143,15 @@ service to choose between running as a local container or as remote instance, a
as `<name>.<parameter>`. More complex services may use the builder available through the factory classes to compose
the service accordingly.
+===== Test Sources
+
+Once the main sources are implemented, https://github.com/apache/camel/blob/main/test-infra/camel-test-infra-common/src/test/java/org/apache/camel/test/infra/common/services/TestService.java[TestService]
+interface can be used to integrate the actual Service implementation with JUnit and its lifecycle.
+The services should try to minimize the test execution time and resource usage when running. As such,
+the https://junit.org/junit5/docs/5.1.1/api/org/junit/jupiter/api/extension/BeforeAllCallback.html[BeforeAllCallback]
+and https://junit.org/junit5/docs/5.1.1/api/org/junit/jupiter/api/extension/AfterAllCallback.html[AfterAllCallback]
+should be the preferred extensions whenever possible because they allow the instance of the infrastructure to be static
+throughout the test execution.
==== Registering Properties
diff --git a/dsl/camel-jbang/camel-jbang-core/pom.xml b/dsl/camel-jbang/camel-jbang-core/pom.xml
index 8c29c6775c9..223607f1b03 100644
--- a/dsl/camel-jbang/camel-jbang-core/pom.xml
+++ b/dsl/camel-jbang/camel-jbang-core/pom.xml
@@ -146,6 +146,17 @@
<version>${jansi-version}</version>
</dependency>
+ <!-- test infra run -->
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-test-infra-all</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>com.fasterxml.jackson.datatype</groupId>
+ <artifactId>jackson-datatype-jdk8</artifactId>
+ </dependency>
+
<dependency>
<groupId>org.codehaus.plexus</groupId>
<artifactId>plexus-xml</artifactId>
diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/CamelJBangMain.java b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/CamelJBangMain.java
index 9d470e9e0e7..05494fdcb0c 100644
--- a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/CamelJBangMain.java
+++ b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/CamelJBangMain.java
@@ -37,6 +37,9 @@ import org.apache.camel.dsl.jbang.core.commands.config.ConfigList;
import org.apache.camel.dsl.jbang.core.commands.config.ConfigSet;
import org.apache.camel.dsl.jbang.core.commands.config.ConfigUnset;
import org.apache.camel.dsl.jbang.core.commands.exceptionhandler.MissingPluginParameterExceptionHandler;
+import org.apache.camel.dsl.jbang.core.commands.infra.InfraCommand;
+import org.apache.camel.dsl.jbang.core.commands.infra.InfraList;
+import org.apache.camel.dsl.jbang.core.commands.infra.InfraRun;
import org.apache.camel.dsl.jbang.core.commands.plugin.PluginAdd;
import org.apache.camel.dsl.jbang.core.commands.plugin.PluginCommand;
import org.apache.camel.dsl.jbang.core.commands.plugin.PluginDelete;
@@ -161,6 +164,9 @@ public class CamelJBangMain implements Callable<Integer> {
.addSubcommand("get", new CommandLine(new VersionGet(main)))
.addSubcommand("set", new CommandLine(new VersionSet(main)))
.addSubcommand("list", new CommandLine(new VersionList(main))))
+ .addSubcommand("infra", new CommandLine(new InfraCommand(main))
+ .addSubcommand("list", new CommandLine(new InfraList(main)))
+ .addSubcommand("run", new CommandLine(new InfraRun(main))))
.setParameterExceptionHandler(new MissingPluginParameterExceptionHandler());
PluginHelper.addPlugins(commandLine, main, args);
diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/infra/InfraCommand.java b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/infra/InfraCommand.java
new file mode 100644
index 00000000000..9369d9a4a76
--- /dev/null
+++ b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/infra/InfraCommand.java
@@ -0,0 +1,55 @@
+/*
+ * 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.dsl.jbang.core.commands.infra;
+
+import java.util.List;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.SerializationFeature;
+import com.fasterxml.jackson.datatype.jdk8.Jdk8Module;
+import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
+import org.apache.camel.dsl.jbang.core.commands.CamelCommand;
+import org.apache.camel.dsl.jbang.core.commands.CamelJBangMain;
+import picocli.CommandLine;
+
+@CommandLine.Command(name = "infra",
+ description = "List and Run external services for testing and prototyping")
+public class InfraCommand extends CamelCommand {
+
+ static final ObjectMapper JSON_MAPPER = new ObjectMapper();
+
+ {
+ JSON_MAPPER.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
+ JSON_MAPPER.registerModule(new JavaTimeModule());
+ JSON_MAPPER.registerModule(new Jdk8Module());
+ JSON_MAPPER.enable(SerializationFeature.INDENT_OUTPUT);
+ }
+
+ public InfraCommand(CamelJBangMain main) {
+ super(main);
+ }
+
+ @Override
+ public Integer doCall() throws Exception {
+ // defaults to list
+ new CommandLine(new InfraList(getMain())).execute();
+ return 0;
+ }
+
+ record TestInfraService(String service, String implementation, List<String> alias, List<String> aliasImplementation) {
+ }
+}
diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/infra/InfraList.java b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/infra/InfraList.java
new file mode 100644
index 00000000000..e73a3ede419
--- /dev/null
+++ b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/infra/InfraList.java
@@ -0,0 +1,107 @@
+/*
+ * 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.dsl.jbang.core.commands.infra;
+
+import java.io.InputStream;
+import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.github.freva.asciitable.AsciiTable;
+import com.github.freva.asciitable.Column;
+import com.github.freva.asciitable.HorizontalAlign;
+import org.apache.camel.dsl.jbang.core.commands.CamelCommand;
+import org.apache.camel.dsl.jbang.core.commands.CamelJBangMain;
+import org.apache.camel.util.json.Jsoner;
+import picocli.CommandLine;
+
+@CommandLine.Command(name = "list", description = "Displays available external services", sortOptions = false,
+ showDefaultValues = true)
+public class InfraList extends CamelCommand {
+
+ @CommandLine.Option(names = { "--json" },
+ description = "Output in JSON Format")
+ boolean jsonOutput;
+
+ public InfraList(CamelJBangMain main) {
+ super(main);
+ }
+
+ @Override
+ public Integer doCall() throws Exception {
+ Map<String, Set<String>> services = new HashMap<>();
+
+ List<InfraCommand.TestInfraService> metadata;
+
+ try (InputStream is
+ = this.getClass().getClassLoader().getResourceAsStream("META-INF/test-infra-metadata.json")) {
+ String json = new String(is.readAllBytes(), StandardCharsets.UTF_8);
+
+ metadata = InfraCommand.JSON_MAPPER.readValue(json, new TypeReference<List<InfraCommand.TestInfraService>>() {
+ });
+ }
+
+ List<Row> rows = new ArrayList<>(metadata.size());
+
+ for (InfraCommand.TestInfraService service : metadata) {
+ for (String alias : service.alias()) {
+ if (!services.containsKey(alias)) {
+ services.put(alias, new HashSet<>());
+ }
+
+ if (service.aliasImplementation() != null) {
+ for (String aliasImplementation : service.aliasImplementation()) {
+ services.get(alias).add(aliasImplementation);
+ }
+ }
+ }
+ }
+
+ int width = 0;
+ for (Map.Entry<String, Set<String>> entry : services.entrySet()) {
+ width = Math.max(width, entry.getKey().length());
+ rows.add(new Row(entry.getKey(), String.join(", ", entry.getValue())));
+ }
+
+ if (jsonOutput) {
+ printer().println(
+ Jsoner.serialize(
+ rows.stream().map(row -> Map.of(
+ "alias", row.alias(),
+ "aliasImplementation", row.aliasImplementation()))
+ .collect(Collectors.toList())));
+ } else {
+ printer().println(AsciiTable.getTable(AsciiTable.NO_BORDERS, rows, Arrays.asList(
+ new Column().header("ALIAS").minWidth(width + 5).dataAlign(HorizontalAlign.LEFT)
+ .with(r -> r.alias()),
+ new Column().header("IMPLEMENTATION").dataAlign(HorizontalAlign.LEFT).with(r -> r.aliasImplementation()))));
+ }
+
+ return 0;
+ }
+
+ record Row(String alias, String aliasImplementation) {
+ }
+
+}
diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/infra/InfraRun.java b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/infra/InfraRun.java
new file mode 100644
index 00000000000..e201f86e8ea
--- /dev/null
+++ b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/infra/InfraRun.java
@@ -0,0 +1,149 @@
+/*
+ * 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.dsl.jbang.core.commands.infra;
+
+import java.io.InputStream;
+import java.lang.reflect.Method;
+import java.nio.charset.StandardCharsets;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Scanner;
+
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.google.common.base.Strings;
+import org.apache.camel.dsl.jbang.core.commands.CamelCommand;
+import org.apache.camel.dsl.jbang.core.commands.CamelJBangMain;
+import org.apache.camel.test.infra.common.services.InfrastructureService;
+import picocli.CommandLine;
+
+@CommandLine.Command(name = "run",
+ description = "Run an external service")
+public class InfraRun extends CamelCommand {
+
+ @CommandLine.Parameters(description = "Service name", arity = "1")
+ private List<String> serviceName;
+
+ @CommandLine.Option(names = { "--json" },
+ description = "Output in JSON Format")
+ boolean jsonOutput;
+
+ public InfraRun(CamelJBangMain main) {
+ super(main);
+ }
+
+ @Override
+ public Integer doCall() throws Exception {
+ if (serviceName == null || serviceName.isEmpty()) {
+ return 0;
+ }
+
+ String service = serviceName.get(0);
+ String serviceImplementation = serviceName.size() > 1 ? serviceName.get(1) : null;
+
+ run(service, serviceImplementation);
+
+ return 0;
+ }
+
+ private void run(String testService, String testServiceImplementation) throws Exception {
+ List<InfraCommand.TestInfraService> metadata;
+
+ try (InputStream is
+ = this.getClass().getClassLoader().getResourceAsStream("META-INF/test-infra-metadata.json")) {
+ String json = new String(is.readAllBytes(), StandardCharsets.UTF_8);
+
+ metadata = InfraCommand.JSON_MAPPER.readValue(json, new TypeReference<List<InfraCommand.TestInfraService>>() {
+ });
+ }
+
+ List<InfraCommand.TestInfraService> services = metadata;
+
+ InfraCommand.TestInfraService testInfraService = services
+ .stream()
+ .filter(service -> {
+ if (testServiceImplementation != null && !testServiceImplementation.isEmpty()
+ && service.aliasImplementation() != null) {
+ return service.alias().contains(testService)
+ && service.aliasImplementation().contains(testServiceImplementation);
+ } else if (testServiceImplementation == null) {
+ return service.alias().contains(testService)
+ && (service.aliasImplementation() == null || service.aliasImplementation().isEmpty());
+ }
+
+ return false;
+ })
+ .findFirst()
+ .orElseThrow(() -> {
+ String message = ", use the list command for the available services";
+ if (testServiceImplementation != null) {
+ return new IllegalArgumentException(
+ "service " + testService + " with implementation " + testServiceImplementation + " not found"
+ + message);
+ }
+
+ return new IllegalArgumentException("service " + testService + " not found" + message);
+ });
+
+ String serviceInterface = testInfraService.service();
+ String serviceImpl = testInfraService.implementation();
+
+ if (!jsonOutput) {
+ String prefix = "";
+ if (!Strings.isNullOrEmpty(testServiceImplementation)) {
+ prefix = " with implementation " + testServiceImplementation;
+ }
+ printer().println("Starting service " + testService + prefix);
+ }
+
+ InfrastructureService actualService = (InfrastructureService) Class.forName(serviceImpl)
+ .getDeclaredConstructor(null)
+ .newInstance(null);
+
+ Runtime.getRuntime().addShutdownHook(new Thread(() -> {
+ if (actualService != null) {
+ try {
+ actualService.shutdown();
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ }
+ }));
+
+ actualService.initialize();
+
+ Method[] serviceMethods = Class.forName(serviceInterface).getDeclaredMethods();
+ HashMap properties = new HashMap();
+ for (Method method : serviceMethods) {
+ if (method.getParameterCount() == 0 && !method.getName().contains("registerProperties")) {
+ Object value = method.invoke(actualService);
+ properties.put(method.getName(), method.invoke(actualService));
+ }
+ }
+
+ printer().println(InfraCommand.JSON_MAPPER.writeValueAsString(properties));
+
+ if (!jsonOutput) {
+ printer().println("To stop the execution press q");
+ }
+ Scanner sc = new Scanner(System.in).useDelimiter("\n");
+
+ if (sc.nextLine().equals("q")) {
+ actualService.shutdown();
+ sc.close();
+ }
+ }
+}
diff --git a/pom.xml b/pom.xml
index 83683b71d71..7a87c2f02b8 100644
--- a/pom.xml
+++ b/pom.xml
@@ -346,6 +346,7 @@
<exclude>**/FileSplitXPathCharsetTest-input.xml</exclude>
<exclude>**/.camel-jbang-run/**</exclude>
<exclude>**/camel-jbang-run.properties</exclude>
+ <exclude>**/javax.annotations.processing.Processor</exclude>
</excludes>
</licenseSet>
</licenseSets>
diff --git a/test-infra/camel-test-infra-all/pom.xml b/test-infra/camel-test-infra-all/pom.xml
new file mode 100644
index 00000000000..22ec93474db
--- /dev/null
+++ b/test-infra/camel-test-infra-all/pom.xml
@@ -0,0 +1,563 @@
+<?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</groupId>
+ <artifactId>test-infra</artifactId>
+ <version>4.10.0-SNAPSHOT</version>
+ </parent>
+
+ <artifactId>camel-test-infra-all</artifactId>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-test-infra-kafka</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-test-infra-aws-v2</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-test-infra-cassandra</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-test-infra-elasticsearch</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-test-infra-couchbase</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-test-infra-mongodb</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-test-infra-rabbitmq</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-test-infra-azure-storage-blob</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-test-infra-azure-storage-datalake</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-test-infra-azure-storage-queue</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-test-infra-artemis</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-test-infra-dispatch-router</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-test-infra-arangodb</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-test-infra-google-pubsub</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-test-infra-infinispan</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-test-infra-microprofile-lra</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-test-infra-minio</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-test-infra-nats</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-test-infra-pulsar</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-test-infra-redis</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-test-infra-rocketmq</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-test-infra-solr</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-test-infra-xmpp</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-test-infra-zookeeper</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-test-infra-postgres</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-test-infra-couchdb</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-test-infra-ftp</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-test-infra-fhir</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-test-infra-mosquitto</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-test-infra-chatscript</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-test-infra-openldap</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-test-infra-ignite</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-test-infra-hashicorp-vault</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-test-infra-jetty</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-test-infra-etcd3</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-test-infra-opensearch</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-test-infra-smb</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-test-infra-qdrant</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-test-infra-ollama</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-test-infra-milvus</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-test-infra-hazelcast</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-test-infra-hivemq</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-test-infra-torchserve</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-test-infra-tensorflow-serving</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ </dependencies>
+
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>io.smallrye</groupId>
+ <artifactId>jandex-maven-plugin</artifactId>
+ <version>${jandex-version}</version>
+ <executions>
+ <execution>
+ <id>make-index</id>
+ <goals>
+ <goal>jandex</goal>
+ </goals>
+ <phase>generate-resources</phase>
+ <configuration>
+ <fileSets>
+ <fileSet>
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-test-infra-arangodb</artifactId>
+ </dependency>
+ </fileSet>
+ <fileSet>
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-test-infra-kafka</artifactId>
+ </dependency>
+ </fileSet>
+ <fileSet>
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-test-infra-aws-v2</artifactId>
+ </dependency>
+ </fileSet>
+ <fileSet>
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-test-infra-cassandra</artifactId>
+ </dependency>
+ </fileSet>
+ <fileSet>
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-test-infra-elasticsearch</artifactId>
+ </dependency>
+ </fileSet>
+ <fileSet>
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-test-infra-couchbase</artifactId>
+ </dependency>
+ </fileSet>
+ <fileSet>
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-test-infra-mongodb</artifactId>
+ </dependency>
+ </fileSet>
+ <fileSet>
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-test-infra-rabbitmq</artifactId>
+ </dependency>
+ </fileSet>
+ <fileSet>
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-test-infra-azure-storage-blob</artifactId>
+ </dependency>
+ </fileSet>
+ <fileSet>
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-test-infra-azure-storage-datalake</artifactId>
+ </dependency>
+ </fileSet>
+ <fileSet>
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-test-infra-azure-storage-queue</artifactId>
+ </dependency>
+ </fileSet>
+ <fileSet>
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-test-infra-artemis</artifactId>
+ </dependency>
+ </fileSet>
+ <fileSet>
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-test-infra-google-pubsub</artifactId>
+ </dependency>
+ </fileSet>
+ <fileSet>
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-test-infra-infinispan</artifactId>
+ </dependency>
+ </fileSet>
+ <fileSet>
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-test-infra-microprofile-lra</artifactId>
+ </dependency>
+ </fileSet>
+ <fileSet>
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-test-infra-minio</artifactId>
+ </dependency>
+ </fileSet>
+ <fileSet>
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-test-infra-nats</artifactId>
+ </dependency>
+ </fileSet>
+ <fileSet>
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-test-infra-pulsar</artifactId>
+ </dependency>
+ </fileSet>
+ <fileSet>
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-test-infra-redis</artifactId>
+ </dependency>
+ </fileSet>
+ <fileSet>
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-test-infra-rocketmq</artifactId>
+ </dependency>
+ </fileSet>
+ <fileSet>
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-test-infra-solr</artifactId>
+ </dependency>
+ </fileSet>
+ <fileSet>
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-test-infra-xmpp</artifactId>
+ </dependency>
+ </fileSet>
+ <fileSet>
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-test-infra-zookeeper</artifactId>
+ </dependency>
+ </fileSet>
+ <fileSet>
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-test-infra-postgres</artifactId>
+ </dependency>
+ </fileSet>
+ <fileSet>
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-test-infra-couchdb</artifactId>
+ </dependency>
+ </fileSet>
+ <fileSet>
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-test-infra-ftp</artifactId>
+ </dependency>
+ </fileSet>
+ <fileSet>
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-test-infra-fhir</artifactId>
+ </dependency>
+ </fileSet>
+ <fileSet>
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-test-infra-mosquitto</artifactId>
+ </dependency>
+ </fileSet>
+ <fileSet>
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-test-infra-chatscript</artifactId>
+ </dependency>
+ </fileSet>
+ <fileSet>
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-test-infra-openldap</artifactId>
+ </dependency>
+ </fileSet>
+ <fileSet>
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-test-infra-ignite</artifactId>
+ </dependency>
+ </fileSet>
+ <fileSet>
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-test-infra-hashicorp-vault</artifactId>
+ </dependency>
+ </fileSet>
+ <fileSet>
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-test-infra-etcd3</artifactId>
+ </dependency>
+ </fileSet>
+ <fileSet>
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-test-infra-opensearch</artifactId>
+ </dependency>
+ </fileSet>
+ <fileSet>
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-test-infra-smb</artifactId>
+ </dependency>
+ </fileSet>
+ <fileSet>
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-test-infra-qdrant</artifactId>
+ </dependency>
+ </fileSet>
+ <fileSet>
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-test-infra-ollama</artifactId>
+ </dependency>
+ </fileSet>
+ <fileSet>
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-test-infra-milvus</artifactId>
+ </dependency>
+ </fileSet>
+ <fileSet>
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-test-infra-milvus</artifactId>
+ </dependency>
+ </fileSet>
+ <fileSet>
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-test-infra-hazelcast</artifactId>
+ </dependency>
+ </fileSet>
+ <fileSet>
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-test-infra-torchserve</artifactId>
+ </dependency>
+ </fileSet>
+ <fileSet>
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-test-infra-hivemq</artifactId>
+ </dependency>
+ </fileSet>
+ </fileSets>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-package-maven-plugin</artifactId>
+ <version>${project.version}</version>
+ <executions>
+ <execution>
+ <id>test-infra-generate-metadata</id>
+ <goals>
+ <goal>test-infra-generate-metadata</goal>
+ </goals>
+ <phase>generate-resources</phase>
+ </execution>
+ </executions>
+ </plugin>
+ <plugin>
+ <groupId>org.codehaus.mojo</groupId>
+ <artifactId>build-helper-maven-plugin</artifactId>
+ <executions>
+ <execution>
+ <phase>generate-sources</phase>
+ <goals>
+ <goal>add-resource</goal>
+ </goals>
+ <configuration>
+ <resources>
+ <resource>
+ <directory>src/generated/resources</directory>
+ </resource>
+ </resources>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+
+</project>
\ No newline at end of file
diff --git a/test-infra/camel-test-infra-all/src/generated/resources/META-INF/test-infra-metadata.json b/test-infra/camel-test-infra-all/src/generated/resources/META-INF/test-infra-metadata.json
new file mode 100644
index 00000000000..ff2c7f144fe
--- /dev/null
+++ b/test-infra/camel-test-infra-all/src/generated/resources/META-INF/test-infra-metadata.json
@@ -0,0 +1 @@
+[{"service":"org.apache.camel.test.infra.milvus.services.MilvusInfraService","implementation":"org.apache.camel.test.infra.milvus.services.MilvusLocalContainerInfraService","alias":["milvus"],"aliasImplementation":[]},{"service":"org.apache.camel.test.infra.aws.common.services.AWSInfraService","implementation":"org.apache.camel.test.infra.aws2.services.AWSKinesisLocalContainerInfraService","alias":["kinesis","aws-kinesis"],"aliasImplementation":[]},{"service":"org.apache.camel.test.infra [...]
\ No newline at end of file
diff --git a/test-infra/camel-test-infra-arangodb/src/main/java/org/apache/camel/test/infra/arangodb/services/ArangoDBLocalContainerInfraService.java b/test-infra/camel-test-infra-arangodb/src/main/java/org/apache/camel/test/infra/arangodb/services/ArangoDBLocalContainerInfraService.java
index c7f787a1602..5ba269b5df5 100644
--- a/test-infra/camel-test-infra-arangodb/src/main/java/org/apache/camel/test/infra/arangodb/services/ArangoDBLocalContainerInfraService.java
+++ b/test-infra/camel-test-infra-arangodb/src/main/java/org/apache/camel/test/infra/arangodb/services/ArangoDBLocalContainerInfraService.java
@@ -16,6 +16,7 @@
*/
package org.apache.camel.test.infra.arangodb.services;
+import org.apache.camel.spi.annotations.InfraService;
import org.apache.camel.test.infra.arangodb.common.ArangoDBProperties;
import org.apache.camel.test.infra.common.LocalPropertyResolver;
import org.apache.camel.test.infra.common.services.ContainerEnvironmentUtil;
@@ -23,6 +24,7 @@ import org.apache.camel.test.infra.common.services.ContainerService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+@InfraService(service = ArangoDBInfraService.class, serviceAlias = "arangodb")
public class ArangoDBLocalContainerInfraService implements ArangoDBInfraService, ContainerService<ArangoDbContainer> {
private static final Logger LOG = LoggerFactory.getLogger(ArangoDBLocalContainerInfraService.class);
diff --git a/test-infra/camel-test-infra-artemis/src/main/java/org/apache/camel/test/infra/artemis/services/ArtemisAMQPInfraService.java b/test-infra/camel-test-infra-artemis/src/main/java/org/apache/camel/test/infra/artemis/services/ArtemisAMQPInfraService.java
index a1e1827464e..fbdd20cc3f6 100644
--- a/test-infra/camel-test-infra-artemis/src/main/java/org/apache/camel/test/infra/artemis/services/ArtemisAMQPInfraService.java
+++ b/test-infra/camel-test-infra-artemis/src/main/java/org/apache/camel/test/infra/artemis/services/ArtemisAMQPInfraService.java
@@ -29,9 +29,11 @@ import org.apache.activemq.artemis.core.settings.impl.AddressSettings;
import org.apache.activemq.artemis.spi.core.security.ActiveMQJAASSecurityManager;
import org.apache.activemq.artemis.spi.core.security.ActiveMQSecurityManager;
import org.apache.activemq.artemis.spi.core.security.jaas.InVMLoginModule;
+import org.apache.camel.spi.annotations.InfraService;
import org.apache.camel.test.infra.artemis.common.ArtemisProperties;
import org.apache.camel.test.infra.artemis.common.ArtemisRunException;
+@InfraService(service = ArtemisInfraService.class, serviceAlias = "artemis", serviceImplementationAlias = "amqp")
public class ArtemisAMQPInfraService extends AbstractArtemisEmbeddedService {
private String brokerURL;
diff --git a/test-infra/camel-test-infra-artemis/src/main/java/org/apache/camel/test/infra/artemis/services/ArtemisMQTTInfraService.java b/test-infra/camel-test-infra-artemis/src/main/java/org/apache/camel/test/infra/artemis/services/ArtemisMQTTInfraService.java
index cf61668f32f..05a6aff6327 100644
--- a/test-infra/camel-test-infra-artemis/src/main/java/org/apache/camel/test/infra/artemis/services/ArtemisMQTTInfraService.java
+++ b/test-infra/camel-test-infra-artemis/src/main/java/org/apache/camel/test/infra/artemis/services/ArtemisMQTTInfraService.java
@@ -19,8 +19,10 @@ package org.apache.camel.test.infra.artemis.services;
import org.apache.activemq.artemis.core.config.Configuration;
import org.apache.activemq.artemis.core.settings.impl.AddressFullMessagePolicy;
import org.apache.activemq.artemis.core.settings.impl.AddressSettings;
+import org.apache.camel.spi.annotations.InfraService;
import org.apache.camel.test.infra.artemis.common.ArtemisRunException;
+@InfraService(service = ArtemisInfraService.class, serviceAlias = "artemis", serviceImplementationAlias = "mqtt")
public class ArtemisMQTTInfraService extends AbstractArtemisEmbeddedService {
private String brokerURL;
diff --git a/test-infra/camel-test-infra-artemis/src/main/java/org/apache/camel/test/infra/artemis/services/ArtemisPersistentVMInfraService.java b/test-infra/camel-test-infra-artemis/src/main/java/org/apache/camel/test/infra/artemis/services/ArtemisPersistentVMInfraService.java
index 8fdf1ceb310..bc2b65721c0 100644
--- a/test-infra/camel-test-infra-artemis/src/main/java/org/apache/camel/test/infra/artemis/services/ArtemisPersistentVMInfraService.java
+++ b/test-infra/camel-test-infra-artemis/src/main/java/org/apache/camel/test/infra/artemis/services/ArtemisPersistentVMInfraService.java
@@ -21,8 +21,10 @@ import org.apache.activemq.artemis.core.config.Configuration;
import org.apache.activemq.artemis.core.server.JournalType;
import org.apache.activemq.artemis.core.settings.impl.AddressFullMessagePolicy;
import org.apache.activemq.artemis.core.settings.impl.AddressSettings;
+import org.apache.camel.spi.annotations.InfraService;
import org.apache.camel.test.infra.artemis.common.ArtemisRunException;
+@InfraService(service = ArtemisInfraService.class, serviceAlias = "artemis", serviceImplementationAlias = "persistent")
public class ArtemisPersistentVMInfraService extends AbstractArtemisEmbeddedService {
private String brokerURL;
diff --git a/test-infra/camel-test-infra-artemis/src/main/java/org/apache/camel/test/infra/artemis/services/ArtemisVMInfraService.java b/test-infra/camel-test-infra-artemis/src/main/java/org/apache/camel/test/infra/artemis/services/ArtemisVMInfraService.java
index d28631ba4ff..e020aec6cd7 100644
--- a/test-infra/camel-test-infra-artemis/src/main/java/org/apache/camel/test/infra/artemis/services/ArtemisVMInfraService.java
+++ b/test-infra/camel-test-infra-artemis/src/main/java/org/apache/camel/test/infra/artemis/services/ArtemisVMInfraService.java
@@ -20,10 +20,12 @@ import org.apache.activemq.artemis.api.core.SimpleString;
import org.apache.activemq.artemis.core.config.Configuration;
import org.apache.activemq.artemis.core.settings.impl.AddressFullMessagePolicy;
import org.apache.activemq.artemis.core.settings.impl.AddressSettings;
+import org.apache.camel.spi.annotations.InfraService;
import org.apache.camel.test.infra.artemis.common.ArtemisRunException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+@InfraService(service = ArtemisInfraService.class, serviceAlias = "artemis")
public class ArtemisVMInfraService extends AbstractArtemisEmbeddedService {
private static final Logger LOG = LoggerFactory.getLogger(ArtemisVMInfraService.class);
diff --git a/test-infra/camel-test-infra-aws-v2/src/main/java/org/apache/camel/test/infra/aws2/services/AWSCloudWatchLocalContainerInfraService.java b/test-infra/camel-test-infra-aws-v2/src/main/java/org/apache/camel/test/infra/aws2/services/AWSCloudWatchLocalContainerInfraService.java
index 0dd22aa32cc..6378345af99 100644
--- a/test-infra/camel-test-infra-aws-v2/src/main/java/org/apache/camel/test/infra/aws2/services/AWSCloudWatchLocalContainerInfraService.java
+++ b/test-infra/camel-test-infra-aws-v2/src/main/java/org/apache/camel/test/infra/aws2/services/AWSCloudWatchLocalContainerInfraService.java
@@ -17,6 +17,10 @@
package org.apache.camel.test.infra.aws2.services;
+import org.apache.camel.spi.annotations.InfraService;
+import org.apache.camel.test.infra.aws.common.services.AWSInfraService;
+
+@InfraService(service = AWSInfraService.class, serviceAlias = { "cloud-watch", "aws-cloud-watch" })
public class AWSCloudWatchLocalContainerInfraService extends AWSLocalContainerInfraService {
public AWSCloudWatchLocalContainerInfraService() {
super(Service.CLOUD_WATCH);
diff --git a/test-infra/camel-test-infra-aws-v2/src/main/java/org/apache/camel/test/infra/aws2/services/AWSConfigLocalContainerInfraService.java b/test-infra/camel-test-infra-aws-v2/src/main/java/org/apache/camel/test/infra/aws2/services/AWSConfigLocalContainerInfraService.java
index eb1aa190502..444d6a45b3e 100644
--- a/test-infra/camel-test-infra-aws-v2/src/main/java/org/apache/camel/test/infra/aws2/services/AWSConfigLocalContainerInfraService.java
+++ b/test-infra/camel-test-infra-aws-v2/src/main/java/org/apache/camel/test/infra/aws2/services/AWSConfigLocalContainerInfraService.java
@@ -17,6 +17,10 @@
package org.apache.camel.test.infra.aws2.services;
+import org.apache.camel.spi.annotations.InfraService;
+import org.apache.camel.test.infra.aws.common.services.AWSInfraService;
+
+@InfraService(service = AWSInfraService.class, serviceAlias = { "aws-config" })
public class AWSConfigLocalContainerInfraService extends AWSLocalContainerInfraService {
public AWSConfigLocalContainerInfraService() {
super(Service.CONFIG);
diff --git a/test-infra/camel-test-infra-aws-v2/src/main/java/org/apache/camel/test/infra/aws2/services/AWSDynamodbLocalContainerInfraService.java b/test-infra/camel-test-infra-aws-v2/src/main/java/org/apache/camel/test/infra/aws2/services/AWSDynamodbLocalContainerInfraService.java
index 4f929663717..db80b28dc7a 100644
--- a/test-infra/camel-test-infra-aws-v2/src/main/java/org/apache/camel/test/infra/aws2/services/AWSDynamodbLocalContainerInfraService.java
+++ b/test-infra/camel-test-infra-aws-v2/src/main/java/org/apache/camel/test/infra/aws2/services/AWSDynamodbLocalContainerInfraService.java
@@ -17,6 +17,10 @@
package org.apache.camel.test.infra.aws2.services;
+import org.apache.camel.spi.annotations.InfraService;
+import org.apache.camel.test.infra.aws.common.services.AWSInfraService;
+
+@InfraService(service = AWSInfraService.class, serviceAlias = { "dynamodb", "aws-dynamo-db", "dynamo-db" })
public class AWSDynamodbLocalContainerInfraService extends AWSLocalContainerInfraService {
public AWSDynamodbLocalContainerInfraService() {
diff --git a/test-infra/camel-test-infra-aws-v2/src/main/java/org/apache/camel/test/infra/aws2/services/AWSEC2LocalContainerInfraService.java b/test-infra/camel-test-infra-aws-v2/src/main/java/org/apache/camel/test/infra/aws2/services/AWSEC2LocalContainerInfraService.java
index 23c132f6db0..5a6bae4c830 100644
--- a/test-infra/camel-test-infra-aws-v2/src/main/java/org/apache/camel/test/infra/aws2/services/AWSEC2LocalContainerInfraService.java
+++ b/test-infra/camel-test-infra-aws-v2/src/main/java/org/apache/camel/test/infra/aws2/services/AWSEC2LocalContainerInfraService.java
@@ -17,6 +17,10 @@
package org.apache.camel.test.infra.aws2.services;
+import org.apache.camel.spi.annotations.InfraService;
+import org.apache.camel.test.infra.aws.common.services.AWSInfraService;
+
+@InfraService(service = AWSInfraService.class, serviceAlias = { "ec2", "aws-ec2" })
public class AWSEC2LocalContainerInfraService extends AWSLocalContainerInfraService {
public AWSEC2LocalContainerInfraService() {
super(Service.EC2);
diff --git a/test-infra/camel-test-infra-aws-v2/src/main/java/org/apache/camel/test/infra/aws2/services/AWSEventBridgeLocalContainerInfraService.java b/test-infra/camel-test-infra-aws-v2/src/main/java/org/apache/camel/test/infra/aws2/services/AWSEventBridgeLocalContainerInfraService.java
index d06e103c87d..9a294ec67e2 100644
--- a/test-infra/camel-test-infra-aws-v2/src/main/java/org/apache/camel/test/infra/aws2/services/AWSEventBridgeLocalContainerInfraService.java
+++ b/test-infra/camel-test-infra-aws-v2/src/main/java/org/apache/camel/test/infra/aws2/services/AWSEventBridgeLocalContainerInfraService.java
@@ -17,6 +17,10 @@
package org.apache.camel.test.infra.aws2.services;
+import org.apache.camel.spi.annotations.InfraService;
+import org.apache.camel.test.infra.aws.common.services.AWSInfraService;
+
+@InfraService(service = AWSInfraService.class, serviceAlias = { "event-bridge", "aws-event-bridge" })
public class AWSEventBridgeLocalContainerInfraService extends AWSLocalContainerInfraService {
public AWSEventBridgeLocalContainerInfraService() {
diff --git a/test-infra/camel-test-infra-aws-v2/src/main/java/org/apache/camel/test/infra/aws2/services/AWSIAMLocalContainerInfraService.java b/test-infra/camel-test-infra-aws-v2/src/main/java/org/apache/camel/test/infra/aws2/services/AWSIAMLocalContainerInfraService.java
index 18d7ac62a4b..aa76aa0aeff 100644
--- a/test-infra/camel-test-infra-aws-v2/src/main/java/org/apache/camel/test/infra/aws2/services/AWSIAMLocalContainerInfraService.java
+++ b/test-infra/camel-test-infra-aws-v2/src/main/java/org/apache/camel/test/infra/aws2/services/AWSIAMLocalContainerInfraService.java
@@ -16,6 +16,10 @@
*/
package org.apache.camel.test.infra.aws2.services;
+import org.apache.camel.spi.annotations.InfraService;
+import org.apache.camel.test.infra.aws.common.services.AWSInfraService;
+
+@InfraService(service = AWSInfraService.class, serviceAlias = { "aws-iam" })
public class AWSIAMLocalContainerInfraService extends AWSLocalContainerInfraService {
public AWSIAMLocalContainerInfraService() {
super(Service.IAM);
diff --git a/test-infra/camel-test-infra-aws-v2/src/main/java/org/apache/camel/test/infra/aws2/services/AWSKMSLocalContainerInfraService.java b/test-infra/camel-test-infra-aws-v2/src/main/java/org/apache/camel/test/infra/aws2/services/AWSKMSLocalContainerInfraService.java
index 490af2bf547..492a2c50bc7 100644
--- a/test-infra/camel-test-infra-aws-v2/src/main/java/org/apache/camel/test/infra/aws2/services/AWSKMSLocalContainerInfraService.java
+++ b/test-infra/camel-test-infra-aws-v2/src/main/java/org/apache/camel/test/infra/aws2/services/AWSKMSLocalContainerInfraService.java
@@ -17,6 +17,10 @@
package org.apache.camel.test.infra.aws2.services;
+import org.apache.camel.spi.annotations.InfraService;
+import org.apache.camel.test.infra.aws.common.services.AWSInfraService;
+
+@InfraService(service = AWSInfraService.class, serviceAlias = { "aws-kms" })
public class AWSKMSLocalContainerInfraService extends AWSLocalContainerInfraService {
public AWSKMSLocalContainerInfraService() {
super(Service.KMS);
diff --git a/test-infra/camel-test-infra-aws-v2/src/main/java/org/apache/camel/test/infra/aws2/services/AWSKinesisLocalContainerInfraService.java b/test-infra/camel-test-infra-aws-v2/src/main/java/org/apache/camel/test/infra/aws2/services/AWSKinesisLocalContainerInfraService.java
index 253d5c2c227..e46872181e5 100644
--- a/test-infra/camel-test-infra-aws-v2/src/main/java/org/apache/camel/test/infra/aws2/services/AWSKinesisLocalContainerInfraService.java
+++ b/test-infra/camel-test-infra-aws-v2/src/main/java/org/apache/camel/test/infra/aws2/services/AWSKinesisLocalContainerInfraService.java
@@ -17,10 +17,13 @@
package org.apache.camel.test.infra.aws2.services;
+import org.apache.camel.spi.annotations.InfraService;
+import org.apache.camel.test.infra.aws.common.services.AWSInfraService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import software.amazon.awssdk.core.SdkSystemSetting;
+@InfraService(service = AWSInfraService.class, serviceAlias = { "kinesis", "aws-kinesis" })
public class AWSKinesisLocalContainerInfraService extends AWSLocalContainerInfraService {
private static final Logger LOG = LoggerFactory.getLogger(AWSKinesisLocalContainerInfraService.class);
diff --git a/test-infra/camel-test-infra-aws-v2/src/main/java/org/apache/camel/test/infra/aws2/services/AWSLambdaLocalContainerInfraService.java b/test-infra/camel-test-infra-aws-v2/src/main/java/org/apache/camel/test/infra/aws2/services/AWSLambdaLocalContainerInfraService.java
index d8518d7d87d..69feb90e07b 100644
--- a/test-infra/camel-test-infra-aws-v2/src/main/java/org/apache/camel/test/infra/aws2/services/AWSLambdaLocalContainerInfraService.java
+++ b/test-infra/camel-test-infra-aws-v2/src/main/java/org/apache/camel/test/infra/aws2/services/AWSLambdaLocalContainerInfraService.java
@@ -17,6 +17,10 @@
package org.apache.camel.test.infra.aws2.services;
+import org.apache.camel.spi.annotations.InfraService;
+import org.apache.camel.test.infra.aws.common.services.AWSInfraService;
+
+@InfraService(service = AWSInfraService.class, serviceAlias = { "lambda", "aws-lambda" })
public class AWSLambdaLocalContainerInfraService extends AWSLocalContainerInfraService {
public AWSLambdaLocalContainerInfraService() {
super(Service.LAMBDA);
diff --git a/test-infra/camel-test-infra-aws-v2/src/main/java/org/apache/camel/test/infra/aws2/services/AWSS3LocalContainerInfraService.java b/test-infra/camel-test-infra-aws-v2/src/main/java/org/apache/camel/test/infra/aws2/services/AWSS3LocalContainerInfraService.java
index 4548812e7b3..c7aa0c262b9 100644
--- a/test-infra/camel-test-infra-aws-v2/src/main/java/org/apache/camel/test/infra/aws2/services/AWSS3LocalContainerInfraService.java
+++ b/test-infra/camel-test-infra-aws-v2/src/main/java/org/apache/camel/test/infra/aws2/services/AWSS3LocalContainerInfraService.java
@@ -17,9 +17,12 @@
package org.apache.camel.test.infra.aws2.services;
+import org.apache.camel.spi.annotations.InfraService;
+import org.apache.camel.test.infra.aws.common.services.AWSInfraService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+@InfraService(service = AWSInfraService.class, serviceAlias = { "s3", "aws-s3" })
public class AWSS3LocalContainerInfraService extends AWSLocalContainerInfraService {
private static final Logger LOG = LoggerFactory.getLogger(AWSS3LocalContainerInfraService.class);
diff --git a/test-infra/camel-test-infra-aws-v2/src/main/java/org/apache/camel/test/infra/aws2/services/AWSSNSLocalContainerInfraService.java b/test-infra/camel-test-infra-aws-v2/src/main/java/org/apache/camel/test/infra/aws2/services/AWSSNSLocalContainerInfraService.java
index 1f6d55e53b2..34bfc4014ea 100644
--- a/test-infra/camel-test-infra-aws-v2/src/main/java/org/apache/camel/test/infra/aws2/services/AWSSNSLocalContainerInfraService.java
+++ b/test-infra/camel-test-infra-aws-v2/src/main/java/org/apache/camel/test/infra/aws2/services/AWSSNSLocalContainerInfraService.java
@@ -17,6 +17,10 @@
package org.apache.camel.test.infra.aws2.services;
+import org.apache.camel.spi.annotations.InfraService;
+import org.apache.camel.test.infra.aws.common.services.AWSInfraService;
+
+@InfraService(service = AWSInfraService.class, serviceAlias = { "aws-sns" })
public class AWSSNSLocalContainerInfraService extends AWSLocalContainerInfraService {
public AWSSNSLocalContainerInfraService() {
diff --git a/test-infra/camel-test-infra-aws-v2/src/main/java/org/apache/camel/test/infra/aws2/services/AWSSQSLocalContainerInfraService.java b/test-infra/camel-test-infra-aws-v2/src/main/java/org/apache/camel/test/infra/aws2/services/AWSSQSLocalContainerInfraService.java
index 9e8d725531f..70d54ea9238 100644
--- a/test-infra/camel-test-infra-aws-v2/src/main/java/org/apache/camel/test/infra/aws2/services/AWSSQSLocalContainerInfraService.java
+++ b/test-infra/camel-test-infra-aws-v2/src/main/java/org/apache/camel/test/infra/aws2/services/AWSSQSLocalContainerInfraService.java
@@ -17,6 +17,10 @@
package org.apache.camel.test.infra.aws2.services;
+import org.apache.camel.spi.annotations.InfraService;
+import org.apache.camel.test.infra.aws.common.services.AWSInfraService;
+
+@InfraService(service = AWSInfraService.class, serviceAlias = { "aws-sqs" })
public class AWSSQSLocalContainerInfraService extends AWSLocalContainerInfraService {
public AWSSQSLocalContainerInfraService() {
diff --git a/test-infra/camel-test-infra-aws-v2/src/main/java/org/apache/camel/test/infra/aws2/services/AWSSTSLocalContainerInfraService.java b/test-infra/camel-test-infra-aws-v2/src/main/java/org/apache/camel/test/infra/aws2/services/AWSSTSLocalContainerInfraService.java
index 82399f4244c..4ad73162ce9 100644
--- a/test-infra/camel-test-infra-aws-v2/src/main/java/org/apache/camel/test/infra/aws2/services/AWSSTSLocalContainerInfraService.java
+++ b/test-infra/camel-test-infra-aws-v2/src/main/java/org/apache/camel/test/infra/aws2/services/AWSSTSLocalContainerInfraService.java
@@ -17,6 +17,10 @@
package org.apache.camel.test.infra.aws2.services;
+import org.apache.camel.spi.annotations.InfraService;
+import org.apache.camel.test.infra.aws.common.services.AWSInfraService;
+
+@InfraService(service = AWSInfraService.class, serviceAlias = { "aws-sts" })
public class AWSSTSLocalContainerInfraService extends AWSLocalContainerInfraService {
public AWSSTSLocalContainerInfraService() {
super(Service.STS);
diff --git a/test-infra/camel-test-infra-aws-v2/src/main/java/org/apache/camel/test/infra/aws2/services/AWSSecretsManagerLocalContainerInfraService.java b/test-infra/camel-test-infra-aws-v2/src/main/java/org/apache/camel/test/infra/aws2/services/AWSSecretsManagerLocalContainerInfraService.java
index d2f319e7cea..a76fb015f74 100644
--- a/test-infra/camel-test-infra-aws-v2/src/main/java/org/apache/camel/test/infra/aws2/services/AWSSecretsManagerLocalContainerInfraService.java
+++ b/test-infra/camel-test-infra-aws-v2/src/main/java/org/apache/camel/test/infra/aws2/services/AWSSecretsManagerLocalContainerInfraService.java
@@ -17,6 +17,10 @@
package org.apache.camel.test.infra.aws2.services;
+import org.apache.camel.spi.annotations.InfraService;
+import org.apache.camel.test.infra.aws.common.services.AWSInfraService;
+
+@InfraService(service = AWSInfraService.class, serviceAlias = { "aws-secrets-manager" })
public class AWSSecretsManagerLocalContainerInfraService extends AWSLocalContainerInfraService {
public AWSSecretsManagerLocalContainerInfraService() {
diff --git a/test-infra/camel-test-infra-azure-storage-blob/src/main/java/org/apache/camel/test/infra/azure/storage/blob/services/AzureStorageBlobLocalContainerInfraService.java b/test-infra/camel-test-infra-azure-storage-blob/src/main/java/org/apache/camel/test/infra/azure/storage/blob/services/AzureStorageBlobLocalContainerInfraService.java
index 39e8af092ec..8e0152f0471 100644
--- a/test-infra/camel-test-infra-azure-storage-blob/src/main/java/org/apache/camel/test/infra/azure/storage/blob/services/AzureStorageBlobLocalContainerInfraService.java
+++ b/test-infra/camel-test-infra-azure-storage-blob/src/main/java/org/apache/camel/test/infra/azure/storage/blob/services/AzureStorageBlobLocalContainerInfraService.java
@@ -17,11 +17,15 @@
package org.apache.camel.test.infra.azure.storage.blob.services;
+import org.apache.camel.spi.annotations.InfraService;
import org.apache.camel.test.infra.azure.common.AzureConfigs;
import org.apache.camel.test.infra.azure.common.AzureCredentialsHolder;
+import org.apache.camel.test.infra.azure.common.services.AzureInfraService;
import org.apache.camel.test.infra.azure.common.services.AzureServices;
import org.apache.camel.test.infra.azure.common.services.AzureStorageInfraService;
+@InfraService(service = AzureInfraService.class, serviceAlias = { "azure-storage-blob", "azure" },
+ serviceImplementationAlias = "storage-blob")
public class AzureStorageBlobLocalContainerInfraService extends AzureStorageInfraService {
@Override
diff --git a/test-infra/camel-test-infra-azure-storage-queue/src/main/java/org/apache/camel/test/infra/azure/storage/queue/services/AzureStorageQueueLocalContainerInfraService.java b/test-infra/camel-test-infra-azure-storage-queue/src/main/java/org/apache/camel/test/infra/azure/storage/queue/services/AzureStorageQueueLocalContainerInfraService.java
index 6e005fe9750..61d7f3f48de 100644
--- a/test-infra/camel-test-infra-azure-storage-queue/src/main/java/org/apache/camel/test/infra/azure/storage/queue/services/AzureStorageQueueLocalContainerInfraService.java
+++ b/test-infra/camel-test-infra-azure-storage-queue/src/main/java/org/apache/camel/test/infra/azure/storage/queue/services/AzureStorageQueueLocalContainerInfraService.java
@@ -17,11 +17,15 @@
package org.apache.camel.test.infra.azure.storage.queue.services;
+import org.apache.camel.spi.annotations.InfraService;
import org.apache.camel.test.infra.azure.common.AzureConfigs;
import org.apache.camel.test.infra.azure.common.AzureCredentialsHolder;
+import org.apache.camel.test.infra.azure.common.services.AzureInfraService;
import org.apache.camel.test.infra.azure.common.services.AzureServices;
import org.apache.camel.test.infra.azure.common.services.AzureStorageInfraService;
+@InfraService(service = AzureInfraService.class, serviceAlias = { "azure-storage-queue", "azure" },
+ serviceImplementationAlias = "storage-queue")
public class AzureStorageQueueLocalContainerInfraService extends AzureStorageInfraService {
@Override
diff --git a/test-infra/camel-test-infra-cassandra/src/main/java/org/apache/camel/test/infra/cassandra/services/CassandraLocalContainerInfraService.java b/test-infra/camel-test-infra-cassandra/src/main/java/org/apache/camel/test/infra/cassandra/services/CassandraLocalContainerInfraService.java
index 79dd472f5d8..0f881ef8b27 100644
--- a/test-infra/camel-test-infra-cassandra/src/main/java/org/apache/camel/test/infra/cassandra/services/CassandraLocalContainerInfraService.java
+++ b/test-infra/camel-test-infra-cassandra/src/main/java/org/apache/camel/test/infra/cassandra/services/CassandraLocalContainerInfraService.java
@@ -16,6 +16,7 @@
*/
package org.apache.camel.test.infra.cassandra.services;
+import org.apache.camel.spi.annotations.InfraService;
import org.apache.camel.test.infra.cassandra.common.CassandraProperties;
import org.apache.camel.test.infra.common.LocalPropertyResolver;
import org.apache.camel.test.infra.common.services.ContainerService;
@@ -27,6 +28,7 @@ import org.testcontainers.utility.DockerImageName;
/**
* A service for a local instance of Apache Cassandra running with TestContainers
*/
+@InfraService(service = CassandraInfraService.class, serviceAlias = { "cassandra" })
public class CassandraLocalContainerInfraService implements CassandraInfraService, ContainerService<CassandraContainer> {
private static final Logger LOG = LoggerFactory.getLogger(CassandraLocalContainerInfraService.class);
diff --git a/test-infra/camel-test-infra-chatscript/src/main/java/org/apache/camel/test/infra/chatscript/services/ChatScriptLocalContainerInfraService.java b/test-infra/camel-test-infra-chatscript/src/main/java/org/apache/camel/test/infra/chatscript/services/ChatScriptLocalContainerInfraService.java
index 7caf76f06aa..02213f3bddb 100644
--- a/test-infra/camel-test-infra-chatscript/src/main/java/org/apache/camel/test/infra/chatscript/services/ChatScriptLocalContainerInfraService.java
+++ b/test-infra/camel-test-infra-chatscript/src/main/java/org/apache/camel/test/infra/chatscript/services/ChatScriptLocalContainerInfraService.java
@@ -16,6 +16,7 @@
*/
package org.apache.camel.test.infra.chatscript.services;
+import org.apache.camel.spi.annotations.InfraService;
import org.apache.camel.test.infra.chatscript.common.ChatScriptProperties;
import org.apache.camel.test.infra.common.LocalPropertyResolver;
import org.apache.camel.test.infra.common.services.ContainerService;
@@ -23,6 +24,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.testcontainers.containers.GenericContainer;
+@InfraService(service = ChatScriptInfraService.class, serviceAlias = { "chatscript", "chat-script" })
public class ChatScriptLocalContainerInfraService implements ChatScriptInfraService, ContainerService<GenericContainer> {
private static final Logger LOG = LoggerFactory.getLogger(ChatScriptLocalContainerInfraService.class);
private static final int SERVICE_PORT = 1024;
diff --git a/test-infra/camel-test-infra-consul/src/main/java/org/apache/camel/test/infra/consul/services/ConsulLocalContainerInfraService.java b/test-infra/camel-test-infra-consul/src/main/java/org/apache/camel/test/infra/consul/services/ConsulLocalContainerInfraService.java
index e8a5daa72ef..adc85a2b3ef 100644
--- a/test-infra/camel-test-infra-consul/src/main/java/org/apache/camel/test/infra/consul/services/ConsulLocalContainerInfraService.java
+++ b/test-infra/camel-test-infra-consul/src/main/java/org/apache/camel/test/infra/consul/services/ConsulLocalContainerInfraService.java
@@ -16,6 +16,7 @@
*/
package org.apache.camel.test.infra.consul.services;
+import org.apache.camel.spi.annotations.InfraService;
import org.apache.camel.test.infra.common.LocalPropertyResolver;
import org.apache.camel.test.infra.common.services.ContainerService;
import org.apache.camel.test.infra.consul.common.ConsulProperties;
@@ -25,6 +26,7 @@ import org.slf4j.LoggerFactory;
import org.testcontainers.containers.GenericContainer;
import org.testcontainers.containers.wait.strategy.Wait;
+@InfraService(service = ConsulInfraService.class, serviceAlias = { "consul" })
public class ConsulLocalContainerInfraService implements ConsulInfraService, ContainerService<GenericContainer> {
public static final String CONTAINER_NAME = "consul";
diff --git a/test-infra/camel-test-infra-couchbase/src/main/java/org/apache/camel/test/infra/couchbase/services/CouchbaseLocalContainerInfraService.java b/test-infra/camel-test-infra-couchbase/src/main/java/org/apache/camel/test/infra/couchbase/services/CouchbaseLocalContainerInfraService.java
index 4df4d3fe6ee..a892ce9ad2a 100644
--- a/test-infra/camel-test-infra-couchbase/src/main/java/org/apache/camel/test/infra/couchbase/services/CouchbaseLocalContainerInfraService.java
+++ b/test-infra/camel-test-infra-couchbase/src/main/java/org/apache/camel/test/infra/couchbase/services/CouchbaseLocalContainerInfraService.java
@@ -17,6 +17,7 @@
package org.apache.camel.test.infra.couchbase.services;
+import org.apache.camel.spi.annotations.InfraService;
import org.apache.camel.test.infra.common.LocalPropertyResolver;
import org.apache.camel.test.infra.common.services.ContainerService;
import org.apache.camel.test.infra.couchbase.common.CouchbaseProperties;
@@ -25,6 +26,7 @@ import org.slf4j.LoggerFactory;
import org.testcontainers.couchbase.CouchbaseContainer;
import org.testcontainers.utility.DockerImageName;
+@InfraService(service = CouchbaseInfraService.class, serviceAlias = { "couchbase" })
public class CouchbaseLocalContainerInfraService implements CouchbaseInfraService, ContainerService<CouchbaseContainer> {
/*
diff --git a/test-infra/camel-test-infra-couchdb/src/main/java/org/apache/camel/test/infra/couchdb/services/CouchDbLocalContainerInfraService.java b/test-infra/camel-test-infra-couchdb/src/main/java/org/apache/camel/test/infra/couchdb/services/CouchDbLocalContainerInfraService.java
index 036b72437d7..ff0541c1b95 100644
--- a/test-infra/camel-test-infra-couchdb/src/main/java/org/apache/camel/test/infra/couchdb/services/CouchDbLocalContainerInfraService.java
+++ b/test-infra/camel-test-infra-couchdb/src/main/java/org/apache/camel/test/infra/couchdb/services/CouchDbLocalContainerInfraService.java
@@ -16,6 +16,7 @@
*/
package org.apache.camel.test.infra.couchdb.services;
+import org.apache.camel.spi.annotations.InfraService;
import org.apache.camel.test.infra.common.LocalPropertyResolver;
import org.apache.camel.test.infra.common.services.ContainerService;
import org.apache.camel.test.infra.couchdb.common.CouchDbProperties;
@@ -25,6 +26,7 @@ import org.testcontainers.containers.GenericContainer;
import org.testcontainers.containers.wait.strategy.Wait;
import org.testcontainers.utility.DockerImageName;
+@InfraService(service = CouchDbInfraService.class, serviceAlias = { "couchdb" })
public class CouchDbLocalContainerInfraService implements CouchDbInfraService, ContainerService<GenericContainer> {
public static final String CONTAINER_NAME = "couchdb";
diff --git a/test-infra/camel-test-infra-elasticsearch/src/main/java/org/apache/camel/test/infra/elasticsearch/services/ElasticSearchLocalContainerInfraService.java b/test-infra/camel-test-infra-elasticsearch/src/main/java/org/apache/camel/test/infra/elasticsearch/services/ElasticSearchLocalContainerInfraService.java
index dcbf471892b..55d598e6503 100644
--- a/test-infra/camel-test-infra-elasticsearch/src/main/java/org/apache/camel/test/infra/elasticsearch/services/ElasticSearchLocalContainerInfraService.java
+++ b/test-infra/camel-test-infra-elasticsearch/src/main/java/org/apache/camel/test/infra/elasticsearch/services/ElasticSearchLocalContainerInfraService.java
@@ -26,6 +26,7 @@ import java.util.Optional;
import javax.net.ssl.SSLContext;
+import org.apache.camel.spi.annotations.InfraService;
import org.apache.camel.test.infra.common.LocalPropertyResolver;
import org.apache.camel.test.infra.common.services.ContainerEnvironmentUtil;
import org.apache.camel.test.infra.common.services.ContainerService;
@@ -35,6 +36,7 @@ import org.slf4j.LoggerFactory;
import org.testcontainers.containers.wait.strategy.LogMessageWaitStrategy;
import org.testcontainers.elasticsearch.ElasticsearchContainer;
+@InfraService(service = ElasticSearchInfraService.class, serviceAlias = { "elasticsearch", "elastic-search" })
public class ElasticSearchLocalContainerInfraService
implements ElasticSearchInfraService, ContainerService<ElasticsearchContainer> {
private static final Logger LOG = LoggerFactory.getLogger(ElasticSearchLocalContainerInfraService.class);
diff --git a/test-infra/camel-test-infra-etcd3/src/main/java/org/apache/camel/test/infra/etcd3/services/Etcd3LocalContainerInfraService.java b/test-infra/camel-test-infra-etcd3/src/main/java/org/apache/camel/test/infra/etcd3/services/Etcd3LocalContainerInfraService.java
index f2828ee0fcb..cd69c8c3675 100644
--- a/test-infra/camel-test-infra-etcd3/src/main/java/org/apache/camel/test/infra/etcd3/services/Etcd3LocalContainerInfraService.java
+++ b/test-infra/camel-test-infra-etcd3/src/main/java/org/apache/camel/test/infra/etcd3/services/Etcd3LocalContainerInfraService.java
@@ -20,6 +20,7 @@ import java.util.List;
import java.util.UUID;
import io.etcd.jetcd.launcher.EtcdContainer;
+import org.apache.camel.spi.annotations.InfraService;
import org.apache.camel.test.infra.common.LocalPropertyResolver;
import org.apache.camel.test.infra.common.services.ContainerService;
import org.apache.camel.test.infra.etcd3.common.Etcd3Properties;
@@ -27,6 +28,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.testcontainers.containers.wait.strategy.Wait;
+@InfraService(service = Etcd3InfraService.class, serviceAlias = { "etcd3" })
public class Etcd3LocalContainerInfraService implements Etcd3InfraService, ContainerService<EtcdContainer> {
public static final String CONTAINER_NAME = "etcd";
public static final int ETCD_CLIENT_PORT = 2379;
diff --git a/test-infra/camel-test-infra-fhir/src/main/java/org/apache/camel/test/infra/fhir/services/FhirLocalContainerInfraService.java b/test-infra/camel-test-infra-fhir/src/main/java/org/apache/camel/test/infra/fhir/services/FhirLocalContainerInfraService.java
index 7be625650cd..b59e60cc772 100644
--- a/test-infra/camel-test-infra-fhir/src/main/java/org/apache/camel/test/infra/fhir/services/FhirLocalContainerInfraService.java
+++ b/test-infra/camel-test-infra-fhir/src/main/java/org/apache/camel/test/infra/fhir/services/FhirLocalContainerInfraService.java
@@ -18,6 +18,7 @@ package org.apache.camel.test.infra.fhir.services;
import java.time.Duration;
+import org.apache.camel.spi.annotations.InfraService;
import org.apache.camel.test.infra.common.LocalPropertyResolver;
import org.apache.camel.test.infra.common.services.ContainerService;
import org.apache.camel.test.infra.fhir.common.FhirProperties;
@@ -26,6 +27,7 @@ import org.slf4j.LoggerFactory;
import org.testcontainers.containers.GenericContainer;
import org.testcontainers.containers.wait.strategy.Wait;
+@InfraService(service = FhirInfraService.class, serviceAlias = { "fhir" })
public class FhirLocalContainerInfraService implements FhirInfraService, ContainerService<GenericContainer> {
// needs https://github.com/hapifhir/hapi-fhir-jpaserver-starter/commit/54120f374eea5084634830d34c99a9137b22a310
public static final String CONTAINER_NAME = "fhir";
diff --git a/test-infra/camel-test-infra-ftp/src/main/java/org/apache/camel/test/infra/ftp/services/embedded/FtpEmbeddedInfraService.java b/test-infra/camel-test-infra-ftp/src/main/java/org/apache/camel/test/infra/ftp/services/embedded/FtpEmbeddedInfraService.java
index 1827047ffb5..d8353764326 100644
--- a/test-infra/camel-test-infra-ftp/src/main/java/org/apache/camel/test/infra/ftp/services/embedded/FtpEmbeddedInfraService.java
+++ b/test-infra/camel-test-infra-ftp/src/main/java/org/apache/camel/test/infra/ftp/services/embedded/FtpEmbeddedInfraService.java
@@ -24,6 +24,7 @@ import java.util.Map;
import java.util.Set;
import java.util.function.BiConsumer;
+import org.apache.camel.spi.annotations.InfraService;
import org.apache.camel.test.infra.common.services.AbstractService;
import org.apache.camel.test.infra.ftp.common.FtpProperties;
import org.apache.camel.test.infra.ftp.services.FtpInfraService;
@@ -45,6 +46,7 @@ import org.apache.ftpserver.usermanager.impl.WritePermission;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+@InfraService(service = FtpInfraService.class, serviceAlias = { "ftp" })
public class FtpEmbeddedInfraService extends AbstractService implements FtpInfraService {
protected static final String DEFAULT_LISTENER = "default";
private static final Logger LOG = LoggerFactory.getLogger(FtpEmbeddedInfraService.class);
diff --git a/test-infra/camel-test-infra-ftp/src/main/java/org/apache/camel/test/infra/ftp/services/embedded/FtpsEmbeddedInfraService.java b/test-infra/camel-test-infra-ftp/src/main/java/org/apache/camel/test/infra/ftp/services/embedded/FtpsEmbeddedInfraService.java
index 0eb7b6420a9..4ef888d57f9 100644
--- a/test-infra/camel-test-infra-ftp/src/main/java/org/apache/camel/test/infra/ftp/services/embedded/FtpsEmbeddedInfraService.java
+++ b/test-infra/camel-test-infra-ftp/src/main/java/org/apache/camel/test/infra/ftp/services/embedded/FtpsEmbeddedInfraService.java
@@ -19,13 +19,21 @@ package org.apache.camel.test.infra.ftp.services.embedded;
import java.io.File;
+import org.apache.camel.spi.annotations.InfraService;
+import org.apache.camel.test.infra.ftp.services.FtpInfraService;
import org.apache.ftpserver.FtpServerFactory;
import org.apache.ftpserver.listener.ListenerFactory;
import org.apache.ftpserver.ssl.SslConfigurationFactory;
+@InfraService(service = FtpInfraService.class, serviceAlias = { "ftps" })
public class FtpsEmbeddedInfraService extends FtpEmbeddedInfraService {
- public FtpsEmbeddedInfraService(EmbeddedConfigurationBuilder embeddedConfigurationBuilder) {
- super(EmbeddedConfigurationBuilder.defaultFtpsConfigurationTemplate());
+
+ /**
+ * Use a default constructor with a default security configuration for camel jbang
+ */
+ public FtpsEmbeddedInfraService() {
+ super(EmbeddedConfigurationBuilder.defaultFtpsConfigurationTemplate()
+ .withSecurityConfiguration(false, "TLSv1.3", true));
}
public FtpsEmbeddedInfraService(EmbeddedConfiguration.SecurityConfiguration securityConfiguration) {
diff --git a/test-infra/camel-test-infra-ftp/src/main/java/org/apache/camel/test/infra/ftp/services/embedded/SftpEmbeddedInfraService.java b/test-infra/camel-test-infra-ftp/src/main/java/org/apache/camel/test/infra/ftp/services/embedded/SftpEmbeddedInfraService.java
index 016d6609c79..f81e6522cac 100644
--- a/test-infra/camel-test-infra-ftp/src/main/java/org/apache/camel/test/infra/ftp/services/embedded/SftpEmbeddedInfraService.java
+++ b/test-infra/camel-test-infra-ftp/src/main/java/org/apache/camel/test/infra/ftp/services/embedded/SftpEmbeddedInfraService.java
@@ -27,6 +27,7 @@ import java.util.Collections;
import java.util.List;
import java.util.function.BiConsumer;
+import org.apache.camel.spi.annotations.InfraService;
import org.apache.camel.test.infra.common.services.AbstractService;
import org.apache.camel.test.infra.ftp.common.FtpProperties;
import org.apache.camel.test.infra.ftp.services.FtpInfraService;
@@ -43,6 +44,7 @@ import org.apache.sshd.sftp.server.SftpSubsystemFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+@InfraService(service = FtpInfraService.class, serviceAlias = { "sftp" })
public class SftpEmbeddedInfraService extends AbstractService implements FtpInfraService {
private static final Logger LOG = LoggerFactory.getLogger(SftpEmbeddedInfraService.class);
diff --git a/test-infra/camel-test-infra-google-pubsub/src/main/java/org/apache/camel/test/infra/google/pubsub/services/GooglePubSubLocalContainerInfraService.java b/test-infra/camel-test-infra-google-pubsub/src/main/java/org/apache/camel/test/infra/google/pubsub/services/GooglePubSubLocalContainerInfraService.java
index 4d0677fa3c2..6cb160ad70c 100644
--- a/test-infra/camel-test-infra-google-pubsub/src/main/java/org/apache/camel/test/infra/google/pubsub/services/GooglePubSubLocalContainerInfraService.java
+++ b/test-infra/camel-test-infra-google-pubsub/src/main/java/org/apache/camel/test/infra/google/pubsub/services/GooglePubSubLocalContainerInfraService.java
@@ -16,6 +16,7 @@
*/
package org.apache.camel.test.infra.google.pubsub.services;
+import org.apache.camel.spi.annotations.InfraService;
import org.apache.camel.test.infra.common.LocalPropertyResolver;
import org.apache.camel.test.infra.common.services.ContainerService;
import org.apache.camel.test.infra.google.pubsub.common.GooglePubSubProperties;
@@ -24,6 +25,8 @@ import org.slf4j.LoggerFactory;
import org.testcontainers.containers.PubSubEmulatorContainer;
import org.testcontainers.utility.DockerImageName;
+@InfraService(service = GooglePubSubInfraService.class, serviceAlias = { "google", "google-pub-sub" },
+ serviceImplementationAlias = "pub-sub")
public class GooglePubSubLocalContainerInfraService
implements GooglePubSubInfraService, ContainerService<PubSubEmulatorContainer> {
diff --git a/test-infra/camel-test-infra-hashicorp-vault/src/main/java/org/apache/camel/test/infra/hashicorp/vault/services/HashicorpVaultLocalContainerInfraService.java b/test-infra/camel-test-infra-hashicorp-vault/src/main/java/org/apache/camel/test/infra/hashicorp/vault/services/HashicorpVaultLocalContainerInfraService.java
index 9b959ad6228..d92e39ba2d0 100644
--- a/test-infra/camel-test-infra-hashicorp-vault/src/main/java/org/apache/camel/test/infra/hashicorp/vault/services/HashicorpVaultLocalContainerInfraService.java
+++ b/test-infra/camel-test-infra-hashicorp-vault/src/main/java/org/apache/camel/test/infra/hashicorp/vault/services/HashicorpVaultLocalContainerInfraService.java
@@ -34,6 +34,7 @@ package org.apache.camel.test.infra.hashicorp.vault.services;
import java.util.function.Consumer;
+import org.apache.camel.spi.annotations.InfraService;
import org.apache.camel.test.infra.common.LocalPropertyResolver;
import org.apache.camel.test.infra.common.services.ContainerService;
import org.apache.camel.test.infra.hashicorp.vault.common.HashicorpVaultProperties;
@@ -44,6 +45,8 @@ import org.testcontainers.containers.output.OutputFrame;
import org.testcontainers.containers.output.Slf4jLogConsumer;
import org.testcontainers.containers.wait.strategy.Wait;
+@InfraService(service = HashicorpVaultInfraService.class, serviceAlias = { "hashicorp-vault", "hashicorp" },
+ serviceImplementationAlias = "vault")
public class HashicorpVaultLocalContainerInfraService
implements HashicorpVaultInfraService, ContainerService<GenericContainer<?>> {
public static final String CONTAINER_NAME = "hashicorp-vault";
diff --git a/test-infra/camel-test-infra-hazelcast/src/main/java/org/apache/camel/test/infra/hazelcast/services/HazelcastEmbeddedInfraService.java b/test-infra/camel-test-infra-hazelcast/src/main/java/org/apache/camel/test/infra/hazelcast/services/HazelcastEmbeddedInfraService.java
index 53ce2392fa9..6a3ae550dc6 100644
--- a/test-infra/camel-test-infra-hazelcast/src/main/java/org/apache/camel/test/infra/hazelcast/services/HazelcastEmbeddedInfraService.java
+++ b/test-infra/camel-test-infra-hazelcast/src/main/java/org/apache/camel/test/infra/hazelcast/services/HazelcastEmbeddedInfraService.java
@@ -18,7 +18,9 @@
package org.apache.camel.test.infra.hazelcast.services;
import com.hazelcast.config.Config;
+import org.apache.camel.spi.annotations.InfraService;
+@InfraService(service = HazelcastInfraService.class, serviceAlias = { "hazelcast" })
public class HazelcastEmbeddedInfraService implements HazelcastInfraService {
@Override
diff --git a/test-infra/camel-test-infra-hivemq/src/main/java/org/apache/camel/test/infra/hivemq/services/LocalHiveMQInfraService.java b/test-infra/camel-test-infra-hivemq/src/main/java/org/apache/camel/test/infra/hivemq/services/LocalHiveMQInfraService.java
index 694966d9f81..2506c38eda9 100644
--- a/test-infra/camel-test-infra-hivemq/src/main/java/org/apache/camel/test/infra/hivemq/services/LocalHiveMQInfraService.java
+++ b/test-infra/camel-test-infra-hivemq/src/main/java/org/apache/camel/test/infra/hivemq/services/LocalHiveMQInfraService.java
@@ -16,11 +16,13 @@
*/
package org.apache.camel.test.infra.hivemq.services;
+import org.apache.camel.spi.annotations.InfraService;
import org.apache.camel.test.infra.common.LocalPropertyResolver;
import org.apache.camel.test.infra.hivemq.common.HiveMQProperties;
import org.testcontainers.hivemq.HiveMQContainer;
import org.testcontainers.utility.DockerImageName;
+@InfraService(service = HiveMQInfraService.class, serviceAlias = { "hivemq", "hive-mq" })
public class LocalHiveMQInfraService extends AbstractLocalHiveMQService<LocalHiveMQInfraService> {
LocalHiveMQInfraService() {
diff --git a/test-infra/camel-test-infra-hivemq/src/main/java/org/apache/camel/test/infra/hivemq/services/LocalHiveMQSparkplugTCKInfraService.java b/test-infra/camel-test-infra-hivemq/src/main/java/org/apache/camel/test/infra/hivemq/services/LocalHiveMQSparkplugTCKInfraService.java
index afa19f0acb8..7ee36e269fc 100644
--- a/test-infra/camel-test-infra-hivemq/src/main/java/org/apache/camel/test/infra/hivemq/services/LocalHiveMQSparkplugTCKInfraService.java
+++ b/test-infra/camel-test-infra-hivemq/src/main/java/org/apache/camel/test/infra/hivemq/services/LocalHiveMQSparkplugTCKInfraService.java
@@ -16,12 +16,15 @@
*/
package org.apache.camel.test.infra.hivemq.services;
+import org.apache.camel.spi.annotations.InfraService;
import org.apache.camel.test.infra.common.LocalPropertyResolver;
import org.apache.camel.test.infra.hivemq.common.HiveMQProperties;
import org.testcontainers.hivemq.HiveMQContainer;
import org.testcontainers.images.builder.ImageFromDockerfile;
import org.testcontainers.utility.DockerImageName;
+@InfraService(service = HiveMQInfraService.class, serviceAlias = { "hivemq", "hive-mq" },
+ serviceImplementationAlias = "sparkplug")
public class LocalHiveMQSparkplugTCKInfraService extends AbstractLocalHiveMQService<LocalHiveMQSparkplugTCKInfraService> {
LocalHiveMQSparkplugTCKInfraService() {
diff --git a/test-infra/camel-test-infra-ignite/src/main/java/org/apache/camel/test/infra/ignite/services/IgniteEmbeddedInfraService.java b/test-infra/camel-test-infra-ignite/src/main/java/org/apache/camel/test/infra/ignite/services/IgniteEmbeddedInfraService.java
index 90b6524cac8..d7428389178 100644
--- a/test-infra/camel-test-infra-ignite/src/main/java/org/apache/camel/test/infra/ignite/services/IgniteEmbeddedInfraService.java
+++ b/test-infra/camel-test-infra-ignite/src/main/java/org/apache/camel/test/infra/ignite/services/IgniteEmbeddedInfraService.java
@@ -20,6 +20,7 @@ package org.apache.camel.test.infra.ignite.services;
import java.util.Collections;
import java.util.UUID;
+import org.apache.camel.spi.annotations.InfraService;
import org.apache.ignite.Ignite;
import org.apache.ignite.IgniteCheckedException;
import org.apache.ignite.configuration.IgniteConfiguration;
@@ -31,6 +32,7 @@ import org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+@InfraService(service = IgniteInfraService.class, serviceAlias = { "ignite" })
public class IgniteEmbeddedInfraService implements IgniteInfraService {
private static final Logger LOG = LoggerFactory.getLogger(IgniteEmbeddedInfraService.class);
diff --git a/test-infra/camel-test-infra-infinispan/src/main/java/org/apache/camel/test/infra/infinispan/services/InfinispanLocalContainerInfraService.java b/test-infra/camel-test-infra-infinispan/src/main/java/org/apache/camel/test/infra/infinispan/services/InfinispanLocalContainerInfraService.java
index 555e96ff481..9baad3c9053 100644
--- a/test-infra/camel-test-infra-infinispan/src/main/java/org/apache/camel/test/infra/infinispan/services/InfinispanLocalContainerInfraService.java
+++ b/test-infra/camel-test-infra-infinispan/src/main/java/org/apache/camel/test/infra/infinispan/services/InfinispanLocalContainerInfraService.java
@@ -18,6 +18,7 @@ package org.apache.camel.test.infra.infinispan.services;
import java.util.function.Consumer;
+import org.apache.camel.spi.annotations.InfraService;
import org.apache.camel.test.infra.common.LocalPropertyResolver;
import org.apache.camel.test.infra.common.services.ContainerService;
import org.apache.camel.test.infra.infinispan.common.InfinispanProperties;
@@ -29,6 +30,7 @@ import org.testcontainers.containers.output.OutputFrame;
import org.testcontainers.containers.output.Slf4jLogConsumer;
import org.testcontainers.containers.wait.strategy.Wait;
+@InfraService(service = InfinispanInfraService.class, serviceAlias = { "infinispan" })
public class InfinispanLocalContainerInfraService implements InfinispanInfraService, ContainerService<GenericContainer<?>> {
public static final String CONTAINER_NAME = "infinispan";
private static final String DEFAULT_USERNAME = "admin";
diff --git a/test-infra/camel-test-infra-kafka/src/main/java/org/apache/camel/test/infra/kafka/services/ContainerLocalKafkaInfraService.java b/test-infra/camel-test-infra-kafka/src/main/java/org/apache/camel/test/infra/kafka/services/ContainerLocalKafkaInfraService.java
index 0d7e48ce72c..ef7569d49e9 100644
--- a/test-infra/camel-test-infra-kafka/src/main/java/org/apache/camel/test/infra/kafka/services/ContainerLocalKafkaInfraService.java
+++ b/test-infra/camel-test-infra-kafka/src/main/java/org/apache/camel/test/infra/kafka/services/ContainerLocalKafkaInfraService.java
@@ -17,6 +17,7 @@
package org.apache.camel.test.infra.kafka.services;
+import org.apache.camel.spi.annotations.InfraService;
import org.apache.camel.test.infra.common.LocalPropertyResolver;
import org.apache.camel.test.infra.common.services.ContainerService;
import org.apache.camel.test.infra.kafka.common.KafkaProperties;
@@ -25,6 +26,7 @@ import org.slf4j.LoggerFactory;
import org.testcontainers.kafka.KafkaContainer;
import org.testcontainers.utility.DockerImageName;
+@InfraService(service = KafkaInfraService.class, serviceAlias = "kafka")
public class ContainerLocalKafkaInfraService implements KafkaInfraService, ContainerService<KafkaContainer> {
public static final String KAFKA3_IMAGE_NAME = LocalPropertyResolver.getProperty(
ContainerLocalKafkaInfraService.class,
diff --git a/test-infra/camel-test-infra-kafka/src/main/java/org/apache/camel/test/infra/kafka/services/RedpandaInfraService.java b/test-infra/camel-test-infra-kafka/src/main/java/org/apache/camel/test/infra/kafka/services/RedpandaInfraService.java
index fb0a97e97bc..677e8b8c9a6 100644
--- a/test-infra/camel-test-infra-kafka/src/main/java/org/apache/camel/test/infra/kafka/services/RedpandaInfraService.java
+++ b/test-infra/camel-test-infra-kafka/src/main/java/org/apache/camel/test/infra/kafka/services/RedpandaInfraService.java
@@ -16,6 +16,7 @@
*/
package org.apache.camel.test.infra.kafka.services;
+import org.apache.camel.spi.annotations.InfraService;
import org.apache.camel.test.infra.common.TestUtils;
import org.apache.camel.test.infra.common.services.ContainerService;
import org.apache.camel.test.infra.kafka.common.KafkaProperties;
@@ -24,6 +25,7 @@ import org.slf4j.LoggerFactory;
import org.testcontainers.containers.Network;
import org.testcontainers.redpanda.RedpandaContainer;
+@InfraService(service = KafkaInfraService.class, serviceAlias = "kafka", serviceImplementationAlias = "redpanda")
public class RedpandaInfraService implements KafkaInfraService, ContainerService<RedpandaContainer> {
private static final Logger LOG = LoggerFactory.getLogger(RedpandaInfraService.class);
diff --git a/test-infra/camel-test-infra-kafka/src/main/java/org/apache/camel/test/infra/kafka/services/RedpandaTransactionsEnabledContainer.java b/test-infra/camel-test-infra-kafka/src/main/java/org/apache/camel/test/infra/kafka/services/RedpandaTransactionsEnabledContainer.java
index 91d2adc9850..51b543d2486 100644
--- a/test-infra/camel-test-infra-kafka/src/main/java/org/apache/camel/test/infra/kafka/services/RedpandaTransactionsEnabledContainer.java
+++ b/test-infra/camel-test-infra-kafka/src/main/java/org/apache/camel/test/infra/kafka/services/RedpandaTransactionsEnabledContainer.java
@@ -21,6 +21,7 @@ import org.apache.camel.test.infra.common.LocalPropertyResolver;
import org.apache.camel.test.infra.kafka.common.KafkaProperties;
import org.testcontainers.images.builder.Transferable;
import org.testcontainers.redpanda.RedpandaContainer;
+import org.testcontainers.utility.DockerImageName;
public class RedpandaTransactionsEnabledContainer extends RedpandaContainer {
public static final String REDPANDA_CONTAINER = LocalPropertyResolver.getProperty(
@@ -29,7 +30,8 @@ public class RedpandaTransactionsEnabledContainer extends RedpandaContainer {
public static final int REDPANDA_PORT = 9092;
public RedpandaTransactionsEnabledContainer(String image) {
- super(image);
+ super(DockerImageName.parse(System.getProperty(KafkaProperties.REDPANDA_CONTAINER, REDPANDA_CONTAINER))
+ .asCompatibleSubstituteFor("redpandadata/redpanda"));
}
protected void containerIsStarting(InspectContainerResponse containerInfo) {
diff --git a/test-infra/camel-test-infra-kafka/src/main/java/org/apache/camel/test/infra/kafka/services/StrimziInfraService.java b/test-infra/camel-test-infra-kafka/src/main/java/org/apache/camel/test/infra/kafka/services/StrimziInfraService.java
index 4334b73a20c..3803bfac220 100644
--- a/test-infra/camel-test-infra-kafka/src/main/java/org/apache/camel/test/infra/kafka/services/StrimziInfraService.java
+++ b/test-infra/camel-test-infra-kafka/src/main/java/org/apache/camel/test/infra/kafka/services/StrimziInfraService.java
@@ -17,6 +17,7 @@
package org.apache.camel.test.infra.kafka.services;
+import org.apache.camel.spi.annotations.InfraService;
import org.apache.camel.test.infra.common.TestUtils;
import org.apache.camel.test.infra.common.services.ContainerService;
import org.apache.camel.test.infra.kafka.common.KafkaProperties;
@@ -24,6 +25,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.testcontainers.containers.Network;
+@InfraService(service = KafkaInfraService.class, serviceAlias = "kafka", serviceImplementationAlias = "strimzi")
public class StrimziInfraService implements KafkaInfraService, ContainerService<StrimziContainer> {
private static final Logger LOG = LoggerFactory.getLogger(StrimziInfraService.class);
diff --git a/test-infra/camel-test-infra-microprofile-lra/src/main/java/org/apache/camel/test/infra/microprofile/lra/services/MicroprofileLRALocalContainerInfraService.java b/test-infra/camel-test-infra-microprofile-lra/src/main/java/org/apache/camel/test/infra/microprofile/lra/services/MicroprofileLRALocalContainerInfraService.java
index e4f4db3d62f..066fdeb21b5 100644
--- a/test-infra/camel-test-infra-microprofile-lra/src/main/java/org/apache/camel/test/infra/microprofile/lra/services/MicroprofileLRALocalContainerInfraService.java
+++ b/test-infra/camel-test-infra-microprofile-lra/src/main/java/org/apache/camel/test/infra/microprofile/lra/services/MicroprofileLRALocalContainerInfraService.java
@@ -17,6 +17,7 @@
package org.apache.camel.test.infra.microprofile.lra.services;
import com.github.dockerjava.api.model.Network;
+import org.apache.camel.spi.annotations.InfraService;
import org.apache.camel.test.infra.common.LocalPropertyResolver;
import org.apache.camel.test.infra.common.services.ContainerService;
import org.apache.camel.test.infra.microprofile.lra.common.MicroprofileLRAProperties;
@@ -26,6 +27,8 @@ import org.testcontainers.containers.GenericContainer;
import org.testcontainers.containers.wait.strategy.Wait;
import org.testcontainers.utility.DockerImageName;
+@InfraService(service = MicroprofileLRAInfraService.class, serviceAlias = { "microprofile-lra", "microprofile" },
+ serviceImplementationAlias = "lra")
public class MicroprofileLRALocalContainerInfraService
implements MicroprofileLRAInfraService, ContainerService<GenericContainer> {
public static final String CONTAINER_NAME = "microprofile-lra";
diff --git a/test-infra/camel-test-infra-milvus/src/main/java/org/apache/camel/test/infra/milvus/services/MilvusLocalContainerInfraService.java b/test-infra/camel-test-infra-milvus/src/main/java/org/apache/camel/test/infra/milvus/services/MilvusLocalContainerInfraService.java
index 7d0af0663d3..c580931c1cc 100644
--- a/test-infra/camel-test-infra-milvus/src/main/java/org/apache/camel/test/infra/milvus/services/MilvusLocalContainerInfraService.java
+++ b/test-infra/camel-test-infra-milvus/src/main/java/org/apache/camel/test/infra/milvus/services/MilvusLocalContainerInfraService.java
@@ -20,6 +20,7 @@ import java.net.MalformedURLException;
import java.net.URL;
import java.time.Duration;
+import org.apache.camel.spi.annotations.InfraService;
import org.apache.camel.test.infra.common.LocalPropertyResolver;
import org.apache.camel.test.infra.common.services.ContainerService;
import org.apache.camel.test.infra.milvus.common.MilvusProperties;
@@ -28,6 +29,7 @@ import org.slf4j.LoggerFactory;
import org.testcontainers.milvus.MilvusContainer;
import org.testcontainers.utility.DockerImageName;
+@InfraService(service = MilvusInfraService.class, serviceAlias = { "milvus" })
public class MilvusLocalContainerInfraService implements MilvusInfraService, ContainerService<MilvusContainer> {
private static final Logger LOG = LoggerFactory.getLogger(MilvusLocalContainerInfraService.class);
diff --git a/test-infra/camel-test-infra-minio/src/main/java/org/apache/camel/test/infra/minio/services/MinioLocalContainerInfraService.java b/test-infra/camel-test-infra-minio/src/main/java/org/apache/camel/test/infra/minio/services/MinioLocalContainerInfraService.java
index ed9417fb85a..2e7b0fb2f09 100644
--- a/test-infra/camel-test-infra-minio/src/main/java/org/apache/camel/test/infra/minio/services/MinioLocalContainerInfraService.java
+++ b/test-infra/camel-test-infra-minio/src/main/java/org/apache/camel/test/infra/minio/services/MinioLocalContainerInfraService.java
@@ -18,6 +18,7 @@ package org.apache.camel.test.infra.minio.services;
import java.time.Duration;
+import org.apache.camel.spi.annotations.InfraService;
import org.apache.camel.test.infra.common.LocalPropertyResolver;
import org.apache.camel.test.infra.common.services.ContainerService;
import org.apache.camel.test.infra.minio.common.MinioProperties;
@@ -26,6 +27,7 @@ import org.slf4j.LoggerFactory;
import org.testcontainers.containers.GenericContainer;
import org.testcontainers.containers.wait.strategy.HttpWaitStrategy;
+@InfraService(service = MinioInfraService.class, serviceAlias = { "minio" })
public class MinioLocalContainerInfraService implements MinioInfraService, ContainerService<GenericContainer> {
public static final String CONTAINER_NAME = "minio";
private static final String ACCESS_KEY;
diff --git a/test-infra/camel-test-infra-mongodb/src/main/java/org/apache/camel/test/infra/mongodb/services/MongoDBLocalContainerInfraService.java b/test-infra/camel-test-infra-mongodb/src/main/java/org/apache/camel/test/infra/mongodb/services/MongoDBLocalContainerInfraService.java
index 07b19490a69..15bbd95d00f 100644
--- a/test-infra/camel-test-infra-mongodb/src/main/java/org/apache/camel/test/infra/mongodb/services/MongoDBLocalContainerInfraService.java
+++ b/test-infra/camel-test-infra-mongodb/src/main/java/org/apache/camel/test/infra/mongodb/services/MongoDBLocalContainerInfraService.java
@@ -17,6 +17,7 @@
package org.apache.camel.test.infra.mongodb.services;
+import org.apache.camel.spi.annotations.InfraService;
import org.apache.camel.test.infra.common.LocalPropertyResolver;
import org.apache.camel.test.infra.common.services.ContainerService;
import org.apache.camel.test.infra.mongodb.common.MongoDBProperties;
@@ -25,6 +26,7 @@ import org.slf4j.LoggerFactory;
import org.testcontainers.containers.MongoDBContainer;
import org.testcontainers.utility.DockerImageName;
+@InfraService(service = MongoDBInfraService.class, serviceAlias = { "mongodb" })
public class MongoDBLocalContainerInfraService implements MongoDBInfraService, ContainerService<MongoDBContainer> {
private static final Logger LOG = LoggerFactory.getLogger(MongoDBLocalContainerInfraService.class);
private static final int DEFAULT_MONGODB_PORT = 27017;
diff --git a/test-infra/camel-test-infra-mosquitto/src/main/java/org/apache/camel/test/infra/mosquitto/services/MosquittoLocalContainerInfraService.java b/test-infra/camel-test-infra-mosquitto/src/main/java/org/apache/camel/test/infra/mosquitto/services/MosquittoLocalContainerInfraService.java
index 961aaddd23e..2d0bde91a0c 100644
--- a/test-infra/camel-test-infra-mosquitto/src/main/java/org/apache/camel/test/infra/mosquitto/services/MosquittoLocalContainerInfraService.java
+++ b/test-infra/camel-test-infra-mosquitto/src/main/java/org/apache/camel/test/infra/mosquitto/services/MosquittoLocalContainerInfraService.java
@@ -16,6 +16,7 @@
*/
package org.apache.camel.test.infra.mosquitto.services;
+import org.apache.camel.spi.annotations.InfraService;
import org.apache.camel.test.infra.common.LocalPropertyResolver;
import org.apache.camel.test.infra.common.services.ContainerService;
import org.apache.camel.test.infra.mosquitto.common.MosquittoProperties;
@@ -26,6 +27,7 @@ import org.testcontainers.containers.FixedHostPortGenericContainer;
import org.testcontainers.containers.GenericContainer;
import org.testcontainers.containers.wait.strategy.Wait;
+@InfraService(service = MosquittoInfraService.class, serviceAlias = { "mosquitto" })
public class MosquittoLocalContainerInfraService implements MosquittoInfraService, ContainerService<GenericContainer> {
public static final String CONTAINER_NAME = "mosquitto";
public static final int CONTAINER_PORT = 1883;
diff --git a/test-infra/camel-test-infra-nats/src/main/java/org/apache/camel/test/infra/nats/services/NatsLocalContainerInfraService.java b/test-infra/camel-test-infra-nats/src/main/java/org/apache/camel/test/infra/nats/services/NatsLocalContainerInfraService.java
index 26744ab451a..b1939327cdf 100644
--- a/test-infra/camel-test-infra-nats/src/main/java/org/apache/camel/test/infra/nats/services/NatsLocalContainerInfraService.java
+++ b/test-infra/camel-test-infra-nats/src/main/java/org/apache/camel/test/infra/nats/services/NatsLocalContainerInfraService.java
@@ -16,6 +16,7 @@
*/
package org.apache.camel.test.infra.nats.services;
+import org.apache.camel.spi.annotations.InfraService;
import org.apache.camel.test.infra.common.LocalPropertyResolver;
import org.apache.camel.test.infra.common.services.ContainerService;
import org.apache.camel.test.infra.nats.common.NatsProperties;
@@ -24,6 +25,7 @@ import org.slf4j.LoggerFactory;
import org.testcontainers.containers.GenericContainer;
import org.testcontainers.containers.wait.strategy.Wait;
+@InfraService(service = NatsInfraService.class, serviceAlias = { "nats" })
public class NatsLocalContainerInfraService implements NatsInfraService, ContainerService<GenericContainer> {
public static final String CONTAINER_NAME = "nats";
private static final int PORT = 4222;
diff --git a/test-infra/camel-test-infra-ollama/src/main/java/org/apache/camel/test/infra/ollama/services/OllamaLocalContainerInfraService.java b/test-infra/camel-test-infra-ollama/src/main/java/org/apache/camel/test/infra/ollama/services/OllamaLocalContainerInfraService.java
index 9e3d206ecc2..a53aeac2cc4 100644
--- a/test-infra/camel-test-infra-ollama/src/main/java/org/apache/camel/test/infra/ollama/services/OllamaLocalContainerInfraService.java
+++ b/test-infra/camel-test-infra-ollama/src/main/java/org/apache/camel/test/infra/ollama/services/OllamaLocalContainerInfraService.java
@@ -18,6 +18,7 @@ package org.apache.camel.test.infra.ollama.services;
import java.io.IOException;
+import org.apache.camel.spi.annotations.InfraService;
import org.apache.camel.test.infra.common.LocalPropertyResolver;
import org.apache.camel.test.infra.common.services.ContainerService;
import org.apache.camel.test.infra.ollama.commons.OllamaProperties;
@@ -26,6 +27,7 @@ import org.slf4j.LoggerFactory;
import org.testcontainers.ollama.OllamaContainer;
import org.testcontainers.utility.DockerImageName;
+@InfraService(service = OllamaInfraService.class, serviceAlias = { "ollama" })
public class OllamaLocalContainerInfraService implements OllamaInfraService, ContainerService<OllamaContainer> {
private static class DefaultServiceConfiguration implements OllamaServiceConfiguration {
diff --git a/test-infra/camel-test-infra-openldap/src/main/java/org/apache/camel/test/infra/openldap/services/OpenldapLocalContainerInfraService.java b/test-infra/camel-test-infra-openldap/src/main/java/org/apache/camel/test/infra/openldap/services/OpenldapLocalContainerInfraService.java
index edef96a0d1f..f3b2e3689b6 100644
--- a/test-infra/camel-test-infra-openldap/src/main/java/org/apache/camel/test/infra/openldap/services/OpenldapLocalContainerInfraService.java
+++ b/test-infra/camel-test-infra-openldap/src/main/java/org/apache/camel/test/infra/openldap/services/OpenldapLocalContainerInfraService.java
@@ -16,11 +16,13 @@
*/
package org.apache.camel.test.infra.openldap.services;
+import org.apache.camel.spi.annotations.InfraService;
import org.apache.camel.test.infra.common.services.ContainerService;
import org.apache.camel.test.infra.openldap.common.OpenldapProperties;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+@InfraService(service = OpenldapInfraService.class, serviceAlias = { "openldap" })
public class OpenldapLocalContainerInfraService implements OpenldapInfraService, ContainerService<OpenLdapContainer> {
public static final int CONTAINER_PORT_LDAP = 389;
public static final int CONTAINER_PORT_LDAP_OVER_SSL = 636;
diff --git a/test-infra/camel-test-infra-postgres/src/main/java/org/apache/camel/test/infra/postgres/services/PostgresLocalContainerInfraService.java b/test-infra/camel-test-infra-postgres/src/main/java/org/apache/camel/test/infra/postgres/services/PostgresLocalContainerInfraService.java
index 1a7e80e0e94..9ff3e51c73e 100644
--- a/test-infra/camel-test-infra-postgres/src/main/java/org/apache/camel/test/infra/postgres/services/PostgresLocalContainerInfraService.java
+++ b/test-infra/camel-test-infra-postgres/src/main/java/org/apache/camel/test/infra/postgres/services/PostgresLocalContainerInfraService.java
@@ -16,13 +16,16 @@
*/
package org.apache.camel.test.infra.postgres.services;
+import org.apache.camel.spi.annotations.InfraService;
import org.apache.camel.test.infra.common.LocalPropertyResolver;
import org.apache.camel.test.infra.common.services.ContainerService;
import org.apache.camel.test.infra.postgres.common.PostgresProperties;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.testcontainers.containers.PostgreSQLContainer;
+import org.testcontainers.utility.DockerImageName;
+@InfraService(service = PostgresInfraService.class, serviceAlias = { "postgres" })
public class PostgresLocalContainerInfraService implements PostgresInfraService, ContainerService<PostgreSQLContainer> {
public static final String DEFAULT_POSTGRES_CONTAINER
= LocalPropertyResolver.getProperty(PostgresLocalContainerInfraService.class,
@@ -43,7 +46,8 @@ public class PostgresLocalContainerInfraService implements PostgresInfraService,
}
protected PostgreSQLContainer initContainer(String imageName) {
- return new PostgreSQLContainer(imageName);
+ return new PostgreSQLContainer(
+ DockerImageName.parse(imageName).asCompatibleSubstituteFor("postgres"));
}
@Override
diff --git a/test-infra/camel-test-infra-pulsar/src/main/java/org/apache/camel/test/infra/pulsar/services/PulsarLocalContainerInfraService.java b/test-infra/camel-test-infra-pulsar/src/main/java/org/apache/camel/test/infra/pulsar/services/PulsarLocalContainerInfraService.java
index 5db0f51aac1..62946d75acf 100644
--- a/test-infra/camel-test-infra-pulsar/src/main/java/org/apache/camel/test/infra/pulsar/services/PulsarLocalContainerInfraService.java
+++ b/test-infra/camel-test-infra-pulsar/src/main/java/org/apache/camel/test/infra/pulsar/services/PulsarLocalContainerInfraService.java
@@ -18,6 +18,7 @@ package org.apache.camel.test.infra.pulsar.services;
import java.time.Duration;
+import org.apache.camel.spi.annotations.InfraService;
import org.apache.camel.test.infra.common.LocalPropertyResolver;
import org.apache.camel.test.infra.common.services.ContainerService;
import org.apache.camel.test.infra.pulsar.common.PulsarProperties;
@@ -26,6 +27,7 @@ import org.slf4j.LoggerFactory;
import org.testcontainers.containers.PulsarContainer;
import org.testcontainers.utility.DockerImageName;
+@InfraService(service = PulsarInfraService.class, serviceAlias = { "pulsar" })
public class PulsarLocalContainerInfraService implements PulsarInfraService, ContainerService<PulsarContainer> {
private static final Logger LOG = LoggerFactory.getLogger(PulsarLocalContainerInfraService.class);
diff --git a/test-infra/camel-test-infra-qdrant/src/main/java/org/apache/camel/test/infra/qdrant/services/QdrantLocalContainerInfraService.java b/test-infra/camel-test-infra-qdrant/src/main/java/org/apache/camel/test/infra/qdrant/services/QdrantLocalContainerInfraService.java
index e0a24980d7d..4998f3830d5 100644
--- a/test-infra/camel-test-infra-qdrant/src/main/java/org/apache/camel/test/infra/qdrant/services/QdrantLocalContainerInfraService.java
+++ b/test-infra/camel-test-infra-qdrant/src/main/java/org/apache/camel/test/infra/qdrant/services/QdrantLocalContainerInfraService.java
@@ -16,6 +16,7 @@
*/
package org.apache.camel.test.infra.qdrant.services;
+import org.apache.camel.spi.annotations.InfraService;
import org.apache.camel.test.infra.common.LocalPropertyResolver;
import org.apache.camel.test.infra.common.services.ContainerService;
import org.apache.camel.test.infra.qdrant.common.QdrantProperties;
@@ -25,6 +26,7 @@ import org.testcontainers.containers.output.Slf4jLogConsumer;
import org.testcontainers.qdrant.QdrantContainer;
import org.testcontainers.utility.DockerImageName;
+@InfraService(service = QdrantInfraService.class, serviceAlias = { "qdrant" })
public class QdrantLocalContainerInfraService implements QdrantInfraService, ContainerService<QdrantContainer> {
public static final int HTTP_PORT = 6333;
public static final int GRPC_PORT = 6334;
diff --git a/test-infra/camel-test-infra-rabbitmq/src/main/java/org/apache/camel/test/infra/rabbitmq/services/RabbitMQLocalContainerInfraService.java b/test-infra/camel-test-infra-rabbitmq/src/main/java/org/apache/camel/test/infra/rabbitmq/services/RabbitMQLocalContainerInfraService.java
index 6fab9036efb..8212e757de7 100644
--- a/test-infra/camel-test-infra-rabbitmq/src/main/java/org/apache/camel/test/infra/rabbitmq/services/RabbitMQLocalContainerInfraService.java
+++ b/test-infra/camel-test-infra-rabbitmq/src/main/java/org/apache/camel/test/infra/rabbitmq/services/RabbitMQLocalContainerInfraService.java
@@ -17,6 +17,7 @@
package org.apache.camel.test.infra.rabbitmq.services;
+import org.apache.camel.spi.annotations.InfraService;
import org.apache.camel.test.infra.common.LocalPropertyResolver;
import org.apache.camel.test.infra.common.services.ContainerService;
import org.apache.camel.test.infra.rabbitmq.common.RabbitMQProperties;
@@ -25,6 +26,7 @@ import org.slf4j.LoggerFactory;
import org.testcontainers.containers.RabbitMQContainer;
import org.testcontainers.utility.DockerImageName;
+@InfraService(service = RabbitMQInfraService.class, serviceAlias = { "rabbitmq" })
public class RabbitMQLocalContainerInfraService implements RabbitMQInfraService, ContainerService<RabbitMQContainer> {
private static final Logger LOG = LoggerFactory.getLogger(RabbitMQLocalContainerInfraService.class);
diff --git a/test-infra/camel-test-infra-redis/src/main/java/org/apache/camel/test/infra/redis/services/RedisLocalContainerInfraService.java b/test-infra/camel-test-infra-redis/src/main/java/org/apache/camel/test/infra/redis/services/RedisLocalContainerInfraService.java
index 1954a22b521..41a061e5e8e 100644
--- a/test-infra/camel-test-infra-redis/src/main/java/org/apache/camel/test/infra/redis/services/RedisLocalContainerInfraService.java
+++ b/test-infra/camel-test-infra-redis/src/main/java/org/apache/camel/test/infra/redis/services/RedisLocalContainerInfraService.java
@@ -16,11 +16,13 @@
*/
package org.apache.camel.test.infra.redis.services;
+import org.apache.camel.spi.annotations.InfraService;
import org.apache.camel.test.infra.common.services.ContainerService;
import org.apache.camel.test.infra.redis.common.RedisProperties;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+@InfraService(service = RedisInfraService.class, serviceAlias = { "redis" })
public class RedisLocalContainerInfraService implements RedisInfraService, ContainerService<RedisContainer> {
private static final Logger LOG = LoggerFactory.getLogger(RedisLocalContainerInfraService.class);
diff --git a/test-infra/camel-test-infra-rocketmq/src/main/java/org/apache/camel/test/infra/rocketmq/services/RocketMQContainerInfraService.java b/test-infra/camel-test-infra-rocketmq/src/main/java/org/apache/camel/test/infra/rocketmq/services/RocketMQContainerInfraService.java
index 84c0f8dd5d7..b406c6124cd 100644
--- a/test-infra/camel-test-infra-rocketmq/src/main/java/org/apache/camel/test/infra/rocketmq/services/RocketMQContainerInfraService.java
+++ b/test-infra/camel-test-infra-rocketmq/src/main/java/org/apache/camel/test/infra/rocketmq/services/RocketMQContainerInfraService.java
@@ -19,6 +19,7 @@ package org.apache.camel.test.infra.rocketmq.services;
import java.io.IOException;
import java.util.concurrent.TimeUnit;
+import org.apache.camel.spi.annotations.InfraService;
import org.apache.camel.test.infra.common.LocalPropertyResolver;
import org.apache.camel.test.infra.common.services.ContainerService;
import org.apache.camel.test.infra.rocketmq.common.RocketMQProperties;
@@ -28,6 +29,7 @@ import org.slf4j.LoggerFactory;
import org.testcontainers.containers.Container;
import org.testcontainers.containers.Network;
+@InfraService(service = RocketMQInfraService.class, serviceAlias = { "rocketmq" })
public class RocketMQContainerInfraService implements RocketMQInfraService, ContainerService<RocketMQNameserverContainer> {
private static final Logger LOG = LoggerFactory.getLogger(RocketMQContainerInfraService.class);
public static final String ROCKETMQ_VERSION = LocalPropertyResolver.getProperty(
diff --git a/test-infra/camel-test-infra-smb/src/main/java/org/apache/camel/test/infra/smb/services/SmbLocalContainerInfraService.java b/test-infra/camel-test-infra-smb/src/main/java/org/apache/camel/test/infra/smb/services/SmbLocalContainerInfraService.java
index 241ec0c8533..d96763be8df 100644
--- a/test-infra/camel-test-infra-smb/src/main/java/org/apache/camel/test/infra/smb/services/SmbLocalContainerInfraService.java
+++ b/test-infra/camel-test-infra-smb/src/main/java/org/apache/camel/test/infra/smb/services/SmbLocalContainerInfraService.java
@@ -16,10 +16,12 @@
*/
package org.apache.camel.test.infra.smb.services;
+import org.apache.camel.spi.annotations.InfraService;
import org.apache.camel.util.IOHelper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+@InfraService(service = SmbLocalContainerInfraService.class, serviceAlias = { "smb" })
public class SmbLocalContainerInfraService implements SmbInfraService {
protected static final Logger LOG = LoggerFactory.getLogger(SmbLocalContainerInfraService.class);
protected final SmbContainer container = new SmbContainer();
diff --git a/test-infra/camel-test-infra-solr/src/main/java/org/apache/camel/test/infra/solr/services/SolrLocalContainerInfraService.java b/test-infra/camel-test-infra-solr/src/main/java/org/apache/camel/test/infra/solr/services/SolrLocalContainerInfraService.java
index cca2af6ddf8..ca3b5ac8569 100644
--- a/test-infra/camel-test-infra-solr/src/main/java/org/apache/camel/test/infra/solr/services/SolrLocalContainerInfraService.java
+++ b/test-infra/camel-test-infra-solr/src/main/java/org/apache/camel/test/infra/solr/services/SolrLocalContainerInfraService.java
@@ -16,11 +16,13 @@
*/
package org.apache.camel.test.infra.solr.services;
+import org.apache.camel.spi.annotations.InfraService;
import org.apache.camel.test.infra.common.services.ContainerService;
import org.apache.camel.test.infra.solr.common.SolrProperties;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+@InfraService(service = SolrInfraService.class, serviceAlias = { "solr" })
public class SolrLocalContainerInfraService implements SolrInfraService, ContainerService<SolrContainer> {
private static final Logger LOG = LoggerFactory.getLogger(SolrLocalContainerInfraService.class);
diff --git a/test-infra/camel-test-infra-torchserve/src/main/java/org/apache/camel/test/infra/torchserve/services/TorchServeLocalContainerInfraService.java b/test-infra/camel-test-infra-torchserve/src/main/java/org/apache/camel/test/infra/torchserve/services/TorchServeLocalContainerInfraService.java
index 84f43a3011d..9fd8a68392f 100644
--- a/test-infra/camel-test-infra-torchserve/src/main/java/org/apache/camel/test/infra/torchserve/services/TorchServeLocalContainerInfraService.java
+++ b/test-infra/camel-test-infra-torchserve/src/main/java/org/apache/camel/test/infra/torchserve/services/TorchServeLocalContainerInfraService.java
@@ -16,6 +16,7 @@
*/
package org.apache.camel.test.infra.torchserve.services;
+import org.apache.camel.spi.annotations.InfraService;
import org.apache.camel.test.infra.common.LocalPropertyResolver;
import org.apache.camel.test.infra.common.services.ContainerService;
import org.apache.camel.test.infra.torchserve.common.TorchServeProperties;
@@ -26,6 +27,7 @@ import org.testcontainers.containers.wait.strategy.Wait;
import org.testcontainers.utility.DockerImageName;
import org.testcontainers.utility.MountableFile;
+@InfraService(service = TorchServeInfraService.class, serviceAlias = { "torch-serve" })
public class TorchServeLocalContainerInfraService implements TorchServeInfraService, ContainerService<GenericContainer<?>> {
private static final Logger LOG = LoggerFactory.getLogger(TorchServeLocalContainerInfraService.class);
diff --git a/test-infra/camel-test-infra-xmpp/src/main/java/org/apache/camel/test/infra/xmpp/services/XmppLocalContainerInfraService.java b/test-infra/camel-test-infra-xmpp/src/main/java/org/apache/camel/test/infra/xmpp/services/XmppLocalContainerInfraService.java
index aa93199d38b..b76a27bc982 100644
--- a/test-infra/camel-test-infra-xmpp/src/main/java/org/apache/camel/test/infra/xmpp/services/XmppLocalContainerInfraService.java
+++ b/test-infra/camel-test-infra-xmpp/src/main/java/org/apache/camel/test/infra/xmpp/services/XmppLocalContainerInfraService.java
@@ -16,12 +16,14 @@
*/
package org.apache.camel.test.infra.xmpp.services;
+import org.apache.camel.spi.annotations.InfraService;
import org.apache.camel.test.infra.common.LocalPropertyResolver;
import org.apache.camel.test.infra.common.services.ContainerService;
import org.apache.camel.test.infra.xmpp.common.XmppProperties;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+@InfraService(service = XmppInfraService.class, serviceAlias = { "xmpp" })
public class XmppLocalContainerInfraService implements XmppInfraService, ContainerService<XmppServerContainer> {
private static final Logger LOG = LoggerFactory.getLogger(XmppLocalContainerInfraService.class);
diff --git a/test-infra/camel-test-infra-zookeeper/src/main/java/org/apache/camel/test/infra/zookeeper/services/ZooKeeperLocalContainerInfraService.java b/test-infra/camel-test-infra-zookeeper/src/main/java/org/apache/camel/test/infra/zookeeper/services/ZooKeeperLocalContainerInfraService.java
index d35ffe9361f..dd22dcf4b82 100644
--- a/test-infra/camel-test-infra-zookeeper/src/main/java/org/apache/camel/test/infra/zookeeper/services/ZooKeeperLocalContainerInfraService.java
+++ b/test-infra/camel-test-infra-zookeeper/src/main/java/org/apache/camel/test/infra/zookeeper/services/ZooKeeperLocalContainerInfraService.java
@@ -16,12 +16,14 @@
*/
package org.apache.camel.test.infra.zookeeper.services;
+import org.apache.camel.spi.annotations.InfraService;
import org.apache.camel.test.infra.common.LocalPropertyResolver;
import org.apache.camel.test.infra.common.services.ContainerService;
import org.apache.camel.test.infra.zookeeper.common.ZooKeeperProperties;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+@InfraService(service = ZooKeeperInfraService.class, serviceAlias = { "zookeeper" })
public class ZooKeeperLocalContainerInfraService implements ZooKeeperInfraService, ContainerService<ZooKeeperContainer> {
private static final Logger LOG = LoggerFactory.getLogger(ZooKeeperLocalContainerInfraService.class);
diff --git a/test-infra/pom.xml b/test-infra/pom.xml
index 5a25e97b2d6..6b8e7e08d1f 100644
--- a/test-infra/pom.xml
+++ b/test-infra/pom.xml
@@ -89,8 +89,16 @@
<module>camel-test-infra-hivemq</module>
<module>camel-test-infra-torchserve</module>
<module>camel-test-infra-tensorflow-serving</module>
+ <module>camel-test-infra-all</module>
</modules>
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>spi-annotations</artifactId>
+ </dependency>
+ </dependencies>
+
<build>
<plugins>
<plugin>
diff --git a/tests/camel-itest/src/test/java/org/apache/camel/itest/security/GreeterClientTest.java b/tests/camel-itest/src/test/java/org/apache/camel/itest/security/GreeterClientTest.java
index 903a9728d76..995aaeff783 100644
--- a/tests/camel-itest/src/test/java/org/apache/camel/itest/security/GreeterClientTest.java
+++ b/tests/camel-itest/src/test/java/org/apache/camel/itest/security/GreeterClientTest.java
@@ -27,7 +27,7 @@ import jakarta.xml.ws.soap.SOAPFaultException;
import javax.xml.namespace.QName;
import org.apache.camel.CamelContext;
-import org.apache.camel.test.AvailablePortFinder;
+import org.apache.camel.test.AvailablePort;
import org.apache.camel.test.spring.junit5.CamelSpringTest;
import org.apache.cxf.endpoint.Client;
import org.apache.cxf.frontend.ClientProxy;
@@ -129,7 +129,7 @@ public class GreeterClientTest {
public static boolean isPortAvailable() {
try {
- AvailablePortFinder.probePort(InetAddress.getByName("localhost"), 9000);
+ AvailablePort.probePort(InetAddress.getByName("localhost"), 9000);
} catch (IllegalStateException | UnknownHostException e) {
return false;
}
diff --git a/tooling/maven/camel-package-maven-plugin/pom.xml b/tooling/maven/camel-package-maven-plugin/pom.xml
index 9f592b91abb..6bb7fb14a1f 100644
--- a/tooling/maven/camel-package-maven-plugin/pom.xml
+++ b/tooling/maven/camel-package-maven-plugin/pom.xml
@@ -154,6 +154,11 @@
<version>${velocity-version}</version>
</dependency>
+ <dependency>
+ <groupId>com.fasterxml.jackson.core</groupId>
+ <artifactId>jackson-databind</artifactId>
+ </dependency>
+
<!-- logging -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/CamelTestInfraGenerateMetadataMojo.java b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/CamelTestInfraGenerateMetadataMojo.java
new file mode 100644
index 00000000000..63d8866e437
--- /dev/null
+++ b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/CamelTestInfraGenerateMetadataMojo.java
@@ -0,0 +1,142 @@
+/*
+ * 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.maven.packaging;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Set;
+
+import javax.inject.Inject;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.apache.camel.maven.packaging.generics.PackagePluginUtils;
+import org.apache.camel.spi.annotations.InfraService;
+import org.apache.camel.tooling.util.FileUtil;
+import org.apache.maven.plugin.MojoExecutionException;
+import org.apache.maven.plugin.MojoFailureException;
+import org.apache.maven.plugins.annotations.LifecyclePhase;
+import org.apache.maven.plugins.annotations.Mojo;
+import org.apache.maven.plugins.annotations.Parameter;
+import org.apache.maven.plugins.annotations.ResolutionScope;
+import org.apache.maven.project.MavenProject;
+import org.apache.maven.project.MavenProjectHelper;
+import org.codehaus.plexus.build.BuildContext;
+import org.jboss.jandex.AnnotationInstance;
+import org.jboss.jandex.AnnotationValue;
+import org.jboss.jandex.DotName;
+
+/**
+ * Gather all classes annotated with @InfraService and create a JSON file containing all the metadata.
+ *
+ * The JSON can be used to retrieve the test-infra information and run the services (via Camel JBang for example)
+ */
+@Mojo(name = "test-infra-generate-metadata", threadSafe = true,
+ requiresDependencyResolution = ResolutionScope.COMPILE, defaultPhase = LifecyclePhase.PROCESS_CLASSES)
+public class CamelTestInfraGenerateMetadataMojo extends AbstractGeneratorMojo {
+
+ @Parameter(property = "project", required = true, readonly = true)
+ protected MavenProject project;
+ @Parameter(defaultValue = "${project.basedir}/src/generated/resources")
+ protected File generatedResourcesOutputDir;
+
+ public static final DotName INFRA_SERVICE = DotName.createSimple(InfraService.class.getName());
+
+ @Inject
+ protected CamelTestInfraGenerateMetadataMojo(MavenProjectHelper projectHelper, BuildContext buildContext) {
+ super(projectHelper, buildContext);
+ }
+
+ @Override
+ public void execute() throws MojoExecutionException, MojoFailureException {
+ Set<InfrastructureServiceModel> models = new LinkedHashSet<>();
+
+ for (AnnotationInstance ai : PackagePluginUtils.readJandexIndexQuietly(project).getAnnotations(INFRA_SERVICE)) {
+
+ InfrastructureServiceModel infrastructureServiceModel = new InfrastructureServiceModel();
+
+ infrastructureServiceModel.setImplementation(ai.target().toString());
+ for (AnnotationValue av : ai.values()) {
+ if (av.name().equals("service")) {
+ infrastructureServiceModel.setService(av.asString());
+ } else if (av.name().equals("serviceAlias")) {
+ infrastructureServiceModel.setAlias(Arrays.asList(av.asStringArray()));
+ } else if (av.name().equals("serviceImplementationAlias")) {
+ infrastructureServiceModel.getAliasImplementation().addAll(Arrays.asList(av.asStringArray()));
+ }
+ }
+
+ models.add(infrastructureServiceModel);
+ }
+
+ try {
+ String modelsAsJson = new ObjectMapper().writeValueAsString(models);
+
+ if (generatedResourcesOutputDir == null) {
+ generatedResourcesOutputDir = new File(project.getBasedir(), "src/generated/java");
+ }
+
+ FileUtil.updateFile(generatedResourcesOutputDir.toPath()
+ .resolve("META-INF")
+ .resolve("test-infra-metadata.json"), modelsAsJson);
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ private class InfrastructureServiceModel {
+ private String service;
+ private String implementation;
+ private List<String> alias = new ArrayList<>();
+ private List<String> aliasImplementation = new ArrayList<>();
+
+ public String getService() {
+ return service;
+ }
+
+ public void setService(String service) {
+ this.service = service;
+ }
+
+ public String getImplementation() {
+ return implementation;
+ }
+
+ public void setImplementation(String implementation) {
+ this.implementation = implementation;
+ }
+
+ public List<String> getAlias() {
+ return alias;
+ }
+
+ public void setAlias(List<String> alias) {
+ this.alias = alias;
+ }
+
+ public List<String> getAliasImplementation() {
+ return aliasImplementation;
+ }
+
+ public void setAliasImplementation(List<String> aliasImplementation) {
+ this.aliasImplementation = aliasImplementation;
+ }
+ }
+}
diff --git a/tooling/spi-annotations/src/main/java/org/apache/camel/spi/annotations/InfraService.java b/tooling/spi-annotations/src/main/java/org/apache/camel/spi/annotations/InfraService.java
new file mode 100644
index 00000000000..354fcce94c4
--- /dev/null
+++ b/tooling/spi-annotations/src/main/java/org/apache/camel/spi/annotations/InfraService.java
@@ -0,0 +1,63 @@
+/*
+ * 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.spi.annotations;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Marks a class as a Service that can be used by Camel JBang infra
+ *
+ * The marked class is analyzed by the mojo CamelTestInfraGenerateMetadataMojo
+ *
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+@Target({ ElementType.TYPE })
+public @interface InfraService {
+
+ /**
+ * Interface that extends InfrastructureService
+ *
+ * the interface is used by Camel JBang infra run to retrieve testing information like port, endpoint, username...
+ *
+ * @return
+ */
+ Class service();
+
+ /**
+ * List of names that can be used to run the service
+ *
+ * @return
+ */
+ String[] serviceAlias();
+
+ /**
+ * Additional and optional Service name, in case of multiple Service implementations
+ *
+ * For example kafka has 3 implementations
+ *
+ * kafka - uses apache/kafka image as implementation kafka redpanda - uses redpandadata/redpanda image as
+ * implementation kafka strimzi - uses strimzi/kafka as image implementation
+ *
+ * @return
+ */
+ String[] serviceImplementationAlias() default {};
+}