This is an automated email from the ASF dual-hosted git repository.
snazy pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/polaris.git
The following commit(s) were added to refs/heads/main by this push:
new 2e4afa8db Minio testcontainer: allow setting a specific region (#2664)
2e4afa8db is described below
commit 2e4afa8db6fa5cf8a6474f259c958c8643b44823
Author: Robert Stupp <[email protected]>
AuthorDate: Wed Sep 24 18:20:49 2025 +0200
Minio testcontainer: allow setting a specific region (#2664)
... to remove the need to derive it via the AWS-SDK default mechanism
requiring a system property or environment variable.
---
.../java/org/apache/polaris/test/minio/Minio.java | 3 +++
.../org/apache/polaris/test/minio/MinioAccess.java | 3 +++
.../apache/polaris/test/minio/MinioContainer.java | 24 +++++++++++++---------
.../apache/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 be8b10eb7..f5ad582ad 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 @@ public @interface Minio {
/** 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 44f5649c1..86e0a68f4 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 @@ package org.apache.polaris.test.minio;
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<String> 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 9c8ee210b..6d49de0bf 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.time.Duration;
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 @@ public final class MinioContainer extends
GenericContainer<MinioContainer>
private String hostPort;
private String s3endpoint;
private S3Client s3;
- private String region;
+ private Optional<String> 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 final class MinioContainer extends
GenericContainer<MinioContainer>
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 final class MinioContainer extends
GenericContainer<MinioContainer>
}
public MinioContainer withRegion(String region) {
- this.region = region;
+ this.region = Optional.of(region);
return this;
}
@@ -185,6 +188,11 @@ public final class MinioContainer extends
GenericContainer<MinioContainer>
return bucket;
}
+ @Override
+ public Optional<String> region() {
+ return region;
+ }
+
@Override
public String s3endpoint() {
Preconditions.checkState(s3endpoint != null, "Container not yet started");
@@ -204,6 +212,7 @@ public final class MinioContainer extends
GenericContainer<MinioContainer>
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 @@ public final class MinioContainer extends
GenericContainer<MinioContainer>
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 f1cdb7fb5..3a6bcd51c 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 @@ public class MinioExtension
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;
}