From ce51a72d16b81c27fb76a6ebe467aaebe0b650b2 Mon Sep 17 00:00:00 2001 From: Robert Stupp Date: Wed, 24 Sep 2025 10:50:38 +0200 Subject: [PATCH] Minio testcontainer: allow setting a specific region ... to remove the need to derive it via the AWS-SDK default mechanism requiring a system property or environment variable. --- .../org/apache/polaris/test/minio/Minio.java | 3 +++ .../polaris/test/minio/MinioAccess.java | 3 +++ .../polaris/test/minio/MinioContainer.java | 24 +++++++++++-------- .../polaris/test/minio/MinioExtension.java | 3 ++- 4 files changed, 22 insertions(+), 11 deletions(-) diff --git a/tools/minio-testcontainer/src/main/java/org/apache/polaris/test/minio/Minio.java b/tools/minio-testcontainer/src/main/java/org/apache/polaris/test/minio/Minio.java index be8b10eb75..f5ad582ad7 100644 --- a/tools/minio-testcontainer/src/main/java/org/apache/polaris/test/minio/Minio.java +++ b/tools/minio-testcontainer/src/main/java/org/apache/polaris/test/minio/Minio.java @@ -39,5 +39,8 @@ /** Optional, use this bucket instead of a random one. */ String bucket() default DEFAULT; + /** Optional, use this region. */ + String region() default DEFAULT; + String DEFAULT = "minio_default_value__"; } diff --git a/tools/minio-testcontainer/src/main/java/org/apache/polaris/test/minio/MinioAccess.java b/tools/minio-testcontainer/src/main/java/org/apache/polaris/test/minio/MinioAccess.java index 44f5649c10..86e0a68f44 100644 --- a/tools/minio-testcontainer/src/main/java/org/apache/polaris/test/minio/MinioAccess.java +++ b/tools/minio-testcontainer/src/main/java/org/apache/polaris/test/minio/MinioAccess.java @@ -21,6 +21,7 @@ import java.net.URI; import java.util.Map; +import java.util.Optional; import software.amazon.awssdk.core.sync.RequestBody; import software.amazon.awssdk.services.s3.S3Client; @@ -43,6 +44,8 @@ public interface MinioAccess { String bucket(); + Optional region(); + /** HTTP protocol endpoint. */ String s3endpoint(); diff --git a/tools/minio-testcontainer/src/main/java/org/apache/polaris/test/minio/MinioContainer.java b/tools/minio-testcontainer/src/main/java/org/apache/polaris/test/minio/MinioContainer.java index 9c8ee210bd..6d49de0bff 100644 --- a/tools/minio-testcontainer/src/main/java/org/apache/polaris/test/minio/MinioContainer.java +++ b/tools/minio-testcontainer/src/main/java/org/apache/polaris/test/minio/MinioContainer.java @@ -27,6 +27,7 @@ import java.util.HashMap; import java.util.Locale; import java.util.Map; +import java.util.Optional; import org.apache.polaris.containerspec.ContainerSpecHelper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -122,15 +123,16 @@ private static String validateBucketHost(String bucketName) { private String hostPort; private String s3endpoint; private S3Client s3; - private String region; + private Optional region; @SuppressWarnings("unused") public MinioContainer() { - this(null, null, null, null); + this(null, null, null, null, null); } @SuppressWarnings("resource") - public MinioContainer(String image, String accessKey, String secretKey, String bucket) { + public MinioContainer( + String image, String accessKey, String secretKey, String bucket, String region) { super( ContainerSpecHelper.containerSpecHelper("minio", MinioContainer.class) .dockerImageName(image)); @@ -143,6 +145,7 @@ public MinioContainer(String image, String accessKey, String secretKey, String b bucket != null ? validateBucketHost(bucket) : (FIXED_BUCKET_NAME != null ? FIXED_BUCKET_NAME : randomString("bucket")); + this.region = Optional.ofNullable(region); withEnv(MINIO_ACCESS_KEY, this.accessKey); withEnv(MINIO_SECRET_KEY, this.secretKey); // S3 SDK encodes bucket names in host names - need to tell Minio which domain to use @@ -156,7 +159,7 @@ public MinioContainer(String image, String accessKey, String secretKey, String b } public MinioContainer withRegion(String region) { - this.region = region; + this.region = Optional.of(region); return this; } @@ -185,6 +188,11 @@ public String bucket() { return bucket; } + @Override + public Optional region() { + return region; + } + @Override public String s3endpoint() { Preconditions.checkState(s3endpoint != null, "Container not yet started"); @@ -204,6 +212,7 @@ public Map icebergProperties() { props.put("s3.secret-access-key", secretKey()); props.put("s3.endpoint", s3endpoint()); props.put("http-client.type", "urlconnection"); + region().ifPresent(r -> props.put("client.region", r)); return props; } @@ -259,12 +268,7 @@ private S3Client createS3Client() { return S3Client.builder() .httpClientBuilder(UrlConnectionHttpClient.builder()) .applyMutation(builder -> builder.endpointOverride(URI.create(s3endpoint()))) - .applyMutation( - builder -> { - if (region != null) { - builder.region(Region.of(region)); - } - }) + .applyMutation(builder -> region.ifPresent(r -> builder.region(Region.of(r)))) // .serviceConfiguration(s3Configuration(s3PathStyleAccess, s3UseArnRegionEnabled)) // credentialsProvider(s3AccessKeyId, s3SecretAccessKey, s3SessionToken) .credentialsProvider( diff --git a/tools/minio-testcontainer/src/main/java/org/apache/polaris/test/minio/MinioExtension.java b/tools/minio-testcontainer/src/main/java/org/apache/polaris/test/minio/MinioExtension.java index f1cdb7fb59..3a6bcd51c4 100644 --- a/tools/minio-testcontainer/src/main/java/org/apache/polaris/test/minio/MinioExtension.java +++ b/tools/minio-testcontainer/src/main/java/org/apache/polaris/test/minio/MinioExtension.java @@ -128,8 +128,9 @@ private MinioAccess createContainer(Minio minio) { String accessKey = nonDefault(minio.accessKey()); String secretKey = nonDefault(minio.secretKey()); String bucket = nonDefault(minio.bucket()); + String region = nonDefault(minio.region()); MinioContainer container = - new MinioContainer(null, accessKey, secretKey, bucket).withStartupAttempts(5); + new MinioContainer(null, accessKey, secretKey, bucket, region).withStartupAttempts(5); container.start(); return container; }