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

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


The following commit(s) were added to refs/heads/camel-quarkus-main by this 
push:
     new 27d992da Migrate aws-s3 project from Localstack to Floci
27d992da is described below

commit 27d992da1c94f6323964587f379216276dfa7180
Author: James Netherton <[email protected]>
AuthorDate: Fri Jun 26 15:31:25 2026 +0100

    Migrate aws-s3 project from Localstack to Floci
---
 aws2-s3/pom.xml                                    |  2 +-
 aws2-s3/src/main/resources/application.properties  |  2 +-
 .../java/org/acme/aws2/s3/Aws2S3TestResource.java  | 52 +++++++++++++---------
 3 files changed, 32 insertions(+), 24 deletions(-)

diff --git a/aws2-s3/pom.xml b/aws2-s3/pom.xml
index 34d49e40..ef7529b9 100644
--- a/aws2-s3/pom.xml
+++ b/aws2-s3/pom.xml
@@ -100,7 +100,7 @@
         </dependency>
         <dependency>
             <groupId>org.testcontainers</groupId>
-            <artifactId>testcontainers-localstack</artifactId>
+            <artifactId>testcontainers</artifactId>
         </dependency>
     </dependencies>
 
diff --git a/aws2-s3/src/main/resources/application.properties 
b/aws2-s3/src/main/resources/application.properties
index 716e7041..1993467a 100644
--- a/aws2-s3/src/main/resources/application.properties
+++ b/aws2-s3/src/main/resources/application.properties
@@ -24,4 +24,4 @@ camel.component.aws2-s3.region=${AWS_REGION}
 cq.aws2-s3.example.bucketName=${AWS_BUCKET_NAME}
 
 #docker image for mocked tests
-localstack.container.image=mirror.gcr.io/localstack/localstack:4.13.0
+floci.container.image=mirror.gcr.io/floci/floci:1.5.28
diff --git a/aws2-s3/src/test/java/org/acme/aws2/s3/Aws2S3TestResource.java 
b/aws2-s3/src/test/java/org/acme/aws2/s3/Aws2S3TestResource.java
index 20d93bd4..20011102 100644
--- a/aws2-s3/src/test/java/org/acme/aws2/s3/Aws2S3TestResource.java
+++ b/aws2-s3/src/test/java/org/acme/aws2/s3/Aws2S3TestResource.java
@@ -16,6 +16,7 @@
  */
 package org.acme.aws2.s3;
 
+import java.net.URI;
 import java.util.Collections;
 import java.util.Locale;
 import java.util.Map;
@@ -27,8 +28,9 @@ import org.eclipse.microprofile.config.Config;
 import org.eclipse.microprofile.config.ConfigProvider;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.testcontainers.containers.GenericContainer;
 import org.testcontainers.containers.output.Slf4jLogConsumer;
-import org.testcontainers.localstack.LocalStackContainer;
+import org.testcontainers.containers.wait.strategy.Wait;
 import org.testcontainers.utility.DockerImageName;
 import software.amazon.awssdk.auth.credentials.AwsBasicCredentials;
 import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider;
@@ -39,8 +41,12 @@ import 
software.amazon.awssdk.services.s3.model.CreateBucketRequest;
 
 public class Aws2S3TestResource implements QuarkusTestResourceLifecycleManager 
{
     private static final Logger LOG = 
LoggerFactory.getLogger(Aws2S3TestResource.class);
+    private static final int FLOCI_PORT = 4566;
+    private static final String ACCESS_KEY = "testAccessKeyId";
+    private static final String SECRET_KEY = "testSecretKeyId";
+    private static final String REGION = "us-east-1";
 
-    private LocalStackContainer localstack;
+    private GenericContainer<?> floci;
 
     @Override
     public Map<String, String> start() {
@@ -54,7 +60,6 @@ public class Aws2S3TestResource implements 
QuarkusTestResourceLifecycleManager {
         final boolean realCredentialsProvided = accessKey.isPresent() && 
secretKey.isPresent() && region.isPresent()
                 && bucketName.isPresent();
 
-        //do not start a localstack, when real credentials are provided
         if (realCredentialsProvided) {
             LOG.info("Real backend will be used");
             return Collections.emptyMap();
@@ -62,31 +67,34 @@ public class Aws2S3TestResource implements 
QuarkusTestResourceLifecycleManager {
         LOG.info("Mock backend will be used");
 
         DockerImageName imageName = DockerImageName
-                .parse(config.getValue("localstack.container.image", 
String.class))
-                .asCompatibleSubstituteFor("localstack/localstack");
-        localstack = new LocalStackContainer(imageName)
-                .withServices("s3")
-                .withEnv("LS_LOG", "info")
-                .withEnv("AWS_ACCESS_KEY_ID", "testAccessKeyId")
-                .withEnv("AWS_SECRET_ACCESS_KEY", "testSecretKeyId")
+                .parse(config.getValue("floci.container.image", String.class));
+        floci = new GenericContainer<>(imageName)
+                .withExposedPorts(FLOCI_PORT)
+                .waitingFor(Wait.forHttp("/_floci/health").forPort(FLOCI_PORT))
+                .withEnv("AWS_ACCESS_KEY_ID", ACCESS_KEY)
+                .withEnv("AWS_SECRET_ACCESS_KEY", SECRET_KEY)
                 .withLogConsumer(new Slf4jLogConsumer(LOG));
-        localstack.start();
+        floci.start();
 
-        return Map.of("camel.component.aws2-s3.accessKey", 
localstack.getAccessKey(),
-                "camel.component.aws2-s3.secretKey", localstack.getSecretKey(),
-                "camel.component.aws2-s3.region", localstack.getRegion(),
+        String endpoint = String.format("http://%s:%d";, floci.getHost(), 
floci.getMappedPort(FLOCI_PORT));
+
+        return Map.of("camel.component.aws2-s3.accessKey", ACCESS_KEY,
+                "camel.component.aws2-s3.secretKey", SECRET_KEY,
+                "camel.component.aws2-s3.region", REGION,
                 "camel.component.aws2-s3.override-endpoint", "true",
-                "camel.component.aws2-s3.uri-endpoint-override", 
localstack.getEndpoint().toString(),
-                "cq.aws2-s3.example.bucketName", createBucket());
+                "camel.component.aws2-s3.uri-endpoint-override", endpoint,
+                "camel.component.aws2-s3.force-path-style", "true",
+                "cq.aws2-s3.example.bucketName", createBucket(endpoint));
     }
 
-    private String createBucket() {
+    private String createBucket(String endpoint) {
         S3ClientBuilder clientBuilder = S3Client.builder();
         clientBuilder
                 .credentialsProvider(StaticCredentialsProvider
-                        
.create(AwsBasicCredentials.create(localstack.getAccessKey(), 
localstack.getSecretKey())))
-                .endpointOverride(localstack.getEndpoint())
-                .region(Region.of(localstack.getRegion()));
+                        .create(AwsBasicCredentials.create(ACCESS_KEY, 
SECRET_KEY)))
+                .endpointOverride(URI.create(endpoint))
+                .forcePathStyle(true)
+                .region(Region.of(REGION));
         final S3Client s3Client = clientBuilder.build();
 
         final String bucketName = "camel-quarkus-" + 
RandomStringUtils.secure().nextAlphanumeric(49).toLowerCase(Locale.ROOT);
@@ -96,8 +104,8 @@ public class Aws2S3TestResource implements 
QuarkusTestResourceLifecycleManager {
 
     @Override
     public void stop() {
-        if (localstack != null) {
-            localstack.stop();
+        if (floci != null) {
+            floci.stop();
         }
     }
 }

Reply via email to