This is an automated email from the ASF dual-hosted git repository. jamesnetherton pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/camel-quarkus-examples.git
commit c22c30cbbf2a77cc3de64e1105b40f70531a1b40 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(); } } }
