Skip to content

Commit f59697e

Browse files
committed
Add method withBuckets in org.testcontainers.containers.MinIOContainer that create buckets after container started
1 parent 43c6a97 commit f59697e

File tree

2 files changed

+105
-4
lines changed

2 files changed

+105
-4
lines changed

modules/minio/src/main/java/org/testcontainers/containers/MinIOContainer.java

Lines changed: 50 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,18 @@
11
package org.testcontainers.containers;
22

3+
import com.github.dockerjava.api.command.InspectContainerResponse;
34
import org.testcontainers.containers.wait.strategy.Wait;
45
import org.testcontainers.utility.DockerImageName;
56

7+
import java.io.IOException;
68
import java.time.Duration;
79
import java.time.temporal.ChronoUnit;
10+
import java.util.ArrayList;
11+
import java.util.Arrays;
12+
import java.util.List;
13+
import java.util.stream.Collectors;
14+
15+
import static java.lang.String.format;
816

917
/**
1018
* Testcontainers implementation for MinIO.
@@ -29,12 +37,15 @@ public class MinIOContainer extends GenericContainer<MinIOContainer> {
2937

3038
private static final String DEFAULT_PASSWORD = "minioadmin";
3139

40+
private final List<String> buckets = new ArrayList<>();
41+
3242
private String userName;
3343

3444
private String password;
3545

3646
/**
3747
* Constructs a MinIO container from the dockerImageName
48+
*
3849
* @param dockerImageName the full image name to use
3950
*/
4051
public MinIOContainer(final String dockerImageName) {
@@ -43,6 +54,7 @@ public MinIOContainer(final String dockerImageName) {
4354

4455
/**
4556
* Constructs a MinIO container from the dockerImageName
57+
*
4658
* @param dockerImageName the full image name to use
4759
*/
4860
public MinIOContainer(final DockerImageName dockerImageName) {
@@ -60,6 +72,7 @@ public MinIOContainer(final DockerImageName dockerImageName) {
6072

6173
/**
6274
* Overrides the DEFAULT_USER
75+
*
6376
* @param userName the Root user to override
6477
* @return this
6578
*/
@@ -70,6 +83,7 @@ public MinIOContainer withUserName(String userName) {
7083

7184
/**
7285
* Overrides the DEFAULT_PASSWORD
86+
*
7387
* @param password the Root user's password to override
7488
* @return this
7589
*/
@@ -78,6 +92,17 @@ public MinIOContainer withPassword(String password) {
7892
return this;
7993
}
8094

95+
/**
96+
* Create buckets after container started
97+
*
98+
* @param buckets bucket list
99+
* @return this
100+
*/
101+
public MinIOContainer withBuckets(String... buckets) {
102+
this.buckets.addAll(Arrays.stream(buckets).collect(Collectors.toList()));
103+
return this;
104+
}
105+
81106
/**
82107
* Configures the MinIO container
83108
*/
@@ -99,7 +124,7 @@ public void configure() {
99124
* @return the URL to upload/download objects from
100125
*/
101126
public String getS3URL() {
102-
return String.format("http://%s:%s", this.getHost(), getMappedPort(MINIO_S3_PORT));
127+
return format("http://%s:%s", this.getHost(), getMappedPort(MINIO_S3_PORT));
103128
}
104129

105130
/**
@@ -115,4 +140,28 @@ public String getUserName() {
115140
public String getPassword() {
116141
return this.password;
117142
}
143+
144+
@Override
145+
protected void containerIsStarted(InspectContainerResponse containerInfo) {
146+
if (!buckets.isEmpty()) {
147+
try {
148+
ExecResult setAliasExecResult = execInContainer("mc", "alias", "set", "local", format("http://localhost:%s", MINIO_S3_PORT), userName, password);
149+
if (setAliasExecResult.getExitCode() == 0) {
150+
for (String bucket : buckets) {
151+
ExecResult createBucketExecResult = execInContainer("mc", "mb", format("local/%s", bucket));
152+
if (createBucketExecResult.getExitCode() == 0) {
153+
logger().info("Create bucket {}", bucket);
154+
} else {
155+
logger().error("Cannot create bucket {}: {}", bucket, createBucketExecResult.getStderr());
156+
}
157+
}
158+
} else {
159+
logger().error("Cannot set local alias {}", setAliasExecResult.getStderr());
160+
}
161+
} catch (IOException | InterruptedException e) {
162+
logger().error("Cannot create buckets {}", buckets, e);
163+
}
164+
}
165+
}
166+
118167
}

modules/minio/src/test/java/org/testcontainers/containers/MinIOContainerTest.java

Lines changed: 55 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,19 +6,23 @@
66
import io.minio.StatObjectArgs;
77
import io.minio.StatObjectResponse;
88
import io.minio.UploadObjectArgs;
9+
import io.minio.messages.Bucket;
910
import org.junit.jupiter.api.Test;
1011

1112
import java.net.URL;
13+
import java.util.List;
1214

1315
import static org.assertj.core.api.Assertions.assertThat;
1416

1517
class MinIOContainerTest {
1618

19+
static final String MINIO_DOCKER_IMAGE_NAME = "minio/minio:RELEASE.2023-09-04T19-57-37Z";
20+
1721
@Test
1822
void testBasicUsage() throws Exception {
1923
try (
2024
// minioContainer {
21-
MinIOContainer container = new MinIOContainer("minio/minio:RELEASE.2023-09-04T19-57-37Z");
25+
MinIOContainer container = new MinIOContainer(MINIO_DOCKER_IMAGE_NAME);
2226
// }
2327
) {
2428
container.start();
@@ -58,7 +62,7 @@ void testBasicUsage() throws Exception {
5862

5963
@Test
6064
void testDefaultUserPassword() {
61-
try (MinIOContainer container = new MinIOContainer("minio/minio:RELEASE.2023-09-04T19-57-37Z")) {
65+
try (MinIOContainer container = new MinIOContainer(MINIO_DOCKER_IMAGE_NAME)) {
6266
container.start();
6367
assertThat(container.getUserName()).isEqualTo("minioadmin");
6468
assertThat(container.getPassword()).isEqualTo("minioadmin");
@@ -69,7 +73,7 @@ void testDefaultUserPassword() {
6973
void testOverwriteUserPassword() {
7074
try (
7175
// minioOverrides {
72-
MinIOContainer container = new MinIOContainer("minio/minio:RELEASE.2023-09-04T19-57-37Z")
76+
MinIOContainer container = new MinIOContainer(MINIO_DOCKER_IMAGE_NAME)
7377
.withUserName("testuser")
7478
.withPassword("testpassword");
7579
// }
@@ -79,4 +83,52 @@ void testOverwriteUserPassword() {
7983
assertThat(container.getPassword()).isEqualTo("testpassword");
8084
}
8185
}
86+
87+
@Test
88+
void testWithBuckets() throws Exception {
89+
try (MinIOContainer container = new MinIOContainer(MINIO_DOCKER_IMAGE_NAME)
90+
.withUserName("testuser")
91+
.withPassword("testpassword")
92+
.withBuckets("first", "second")) {
93+
container.start();
94+
95+
MinioClient minioClient = MinioClient
96+
.builder()
97+
.endpoint(container.getS3URL())
98+
.credentials(container.getUserName(), container.getPassword())
99+
.build();
100+
101+
BucketExistsArgs firstBucketArgs = BucketExistsArgs.builder().bucket("first").build();
102+
BucketExistsArgs secondBucketArgs = BucketExistsArgs.builder().bucket("second").build();
103+
104+
List<Bucket> bucketList = minioClient.listBuckets();
105+
106+
assertThat(bucketList).hasSize(2);
107+
assertThat(minioClient.bucketExists(firstBucketArgs)).isTrue();
108+
assertThat(minioClient.bucketExists(secondBucketArgs)).isTrue();
109+
110+
minioClient.close();
111+
}
112+
}
113+
114+
@Test
115+
void testWithBucketsEmpty() throws Exception {
116+
try (MinIOContainer container = new MinIOContainer(MINIO_DOCKER_IMAGE_NAME)
117+
.withUserName("testuser")
118+
.withPassword("testpassword")
119+
.withBuckets()) {
120+
container.start();
121+
122+
MinioClient minioClient = MinioClient
123+
.builder()
124+
.endpoint(container.getS3URL())
125+
.credentials(container.getUserName(), container.getPassword())
126+
.build();
127+
128+
assertThat(minioClient.listBuckets()).isEmpty();
129+
130+
minioClient.close();
131+
}
132+
}
133+
82134
}

0 commit comments

Comments
 (0)