From 664805e5a4f9ed66f23c49ab12a33a4341ac2476 Mon Sep 17 00:00:00 2001 From: brucemelo Date: Sat, 20 Jul 2024 20:58:19 -0300 Subject: [PATCH 1/2] add minio support --- gradle/libs.versions.toml | 1 + settings.gradle | 1 + test-resources-minio/build.gradle | 16 ++++ .../minio/MinioTestResourceProvider.java | 92 +++++++++++++++++++ ...t.testresources.core.TestResourcesResolver | 1 + .../minio/MinioStartedTest.groovy | 37 ++++++++ .../src/test/resources/logback.xml | 14 +++ 7 files changed, 162 insertions(+) create mode 100644 test-resources-minio/build.gradle create mode 100644 test-resources-minio/src/main/java/io/micronaut/testresources/minio/MinioTestResourceProvider.java create mode 100644 test-resources-minio/src/main/resources/META-INF/services/io.micronaut.testresources.core.TestResourcesResolver create mode 100644 test-resources-minio/src/test/groovy/io/micronaut/testresources/minio/MinioStartedTest.groovy create mode 100644 test-resources-minio/src/test/resources/logback.xml diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 390bab198..3b7ca0e78 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -77,6 +77,7 @@ managed-testcontainers-oracle-free = { module = "org.testcontainers:oracle-free" managed-testcontainers-postgres = { module = "org.testcontainers:postgresql", version.ref = "managed-testcontainers" } managed-testcontainers-rabbitmq = { module = "org.testcontainers:rabbitmq", version.ref = "managed-testcontainers" } managed-testcontainers-redis = { module = "com.redis.testcontainers:testcontainers-redis", version.ref = "managed-testcontainers-redis" } +managed-testcontainers-minio = { module = "org.testcontainers:minio", version.ref = "managed-testcontainers" } managed-testcontainers-r2dbc = { module = "org.testcontainers:r2dbc", version.ref = "managed-testcontainers" } managed-testcontainers-vault = { module = "org.testcontainers:vault", version.ref = "managed-testcontainers" } diff --git a/settings.gradle b/settings.gradle index da0e8dc5e..db35150a1 100644 --- a/settings.gradle +++ b/settings.gradle @@ -70,6 +70,7 @@ include 'test-resources-elasticsearch' include 'test-resources-embedded' include 'test-resources-hivemq' include 'test-resources-kafka' +include 'test-resources-minio' include 'test-resources-mongodb' include 'test-resources-neo4j' include 'test-resources-opensearch' diff --git a/test-resources-minio/build.gradle b/test-resources-minio/build.gradle new file mode 100644 index 000000000..9b4795af9 --- /dev/null +++ b/test-resources-minio/build.gradle @@ -0,0 +1,16 @@ +plugins { + id 'io.micronaut.build.internal.test-resources-module' +} + +description = """ +Provides support for launching a MinIO test container. +""" + +dependencies { + api(project(':micronaut-test-resources-core')) + api(project(':micronaut-test-resources-testcontainers')) + api(libs.managed.testcontainers.minio) + + testImplementation(project(":micronaut-test-resources-embedded")) + testImplementation(testFixtures(project(":micronaut-test-resources-testcontainers"))) +} diff --git a/test-resources-minio/src/main/java/io/micronaut/testresources/minio/MinioTestResourceProvider.java b/test-resources-minio/src/main/java/io/micronaut/testresources/minio/MinioTestResourceProvider.java new file mode 100644 index 000000000..cbcbd5e03 --- /dev/null +++ b/test-resources-minio/src/main/java/io/micronaut/testresources/minio/MinioTestResourceProvider.java @@ -0,0 +1,92 @@ +/* + * Copyright 2017-2021 original authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package io.micronaut.testresources.minio; + +import io.micronaut.testresources.testcontainers.AbstractTestContainersProvider; +import org.testcontainers.containers.MinIOContainer; +import org.testcontainers.utility.DockerImageName; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.Optional; + + +/** + * A test resource provider which will spawn a MinIO test container. + */ +public class MinioTestResourceProvider extends AbstractTestContainersProvider { + + public static final String MINIO_URL = "minio.url"; + public static final String MINIO_ACCESS_KEY = "minio.access-key"; + public static final String MINIO_SECRET_KEY = "minio.secret-key"; + + public static final List RESOLVABLE_PROPERTIES = List.of( + MINIO_URL, + MINIO_ACCESS_KEY, + MINIO_SECRET_KEY + ); + + public static final String DEFAULT_IMAGE = "minio/minio"; + public static final String SIMPLE_NAME = "minio"; + public static final String DISPLAY_NAME = "MinIO"; + + + @Override + public String getDisplayName() { + return DISPLAY_NAME; + } + + @Override + protected String getSimpleName() { + return SIMPLE_NAME; + } + + @Override + protected String getDefaultImageName() { + return DEFAULT_IMAGE; + } + + @Override + protected MinIOContainer createContainer(DockerImageName imageName, Map requestedProperties, Map testResourcesConfig) { + return new MinIOContainer(imageName); + } + + @Override + protected Optional resolveProperty(String propertyName, MinIOContainer container) { + if (MINIO_URL.equals(propertyName)) { + return Optional.of(container.getS3URL()); + } + if (MINIO_ACCESS_KEY.equals(propertyName)) { + return Optional.of(container.getUserName()); + } + if (MINIO_SECRET_KEY.equals(propertyName)) { + return Optional.of(container.getPassword()); + } + return Optional.empty(); + } + + @Override + public List getResolvableProperties(Map> propertyEntries, Map testResourcesConfig) { + return RESOLVABLE_PROPERTIES; + } + + @Override + protected boolean shouldAnswer(String propertyName, Map requestedProperties, Map testResourcesConfig) { + return RESOLVABLE_PROPERTIES.contains(propertyName); + } + +} diff --git a/test-resources-minio/src/main/resources/META-INF/services/io.micronaut.testresources.core.TestResourcesResolver b/test-resources-minio/src/main/resources/META-INF/services/io.micronaut.testresources.core.TestResourcesResolver new file mode 100644 index 000000000..f1242d8e4 --- /dev/null +++ b/test-resources-minio/src/main/resources/META-INF/services/io.micronaut.testresources.core.TestResourcesResolver @@ -0,0 +1 @@ +io.micronaut.testresources.minio.MinioTestResourceProvider diff --git a/test-resources-minio/src/test/groovy/io/micronaut/testresources/minio/MinioStartedTest.groovy b/test-resources-minio/src/test/groovy/io/micronaut/testresources/minio/MinioStartedTest.groovy new file mode 100644 index 000000000..fdd1a1fea --- /dev/null +++ b/test-resources-minio/src/test/groovy/io/micronaut/testresources/minio/MinioStartedTest.groovy @@ -0,0 +1,37 @@ +package io.micronaut.testresources.minio + +import io.micronaut.context.annotation.Value +import io.micronaut.test.extensions.spock.annotation.MicronautTest +import io.micronaut.testresources.testcontainers.AbstractTestContainersSpec +import org.testcontainers.DockerClientFactory + +@MicronautTest +class MinioStartedTest extends AbstractTestContainersSpec { + + @Value('${minio.url}') + String url + + @Value('${minio.access-key}') + String accessKey + + @Value('${minio.access-key}') + String secretKey + + @Override + String getScopeName() { + 'minio' + } + + def "automatically starts a MinIO container"() { + given: + def dockerHost = DockerClientFactory.instance().dockerHostIpAddress() + + expect: + dockerHost in ["localhost", "127.0.0.1"] + listContainers().size() == 1 + url.contains(dockerHost) + accessKey == "minioadmin" + secretKey == "minioadmin" + } + +} diff --git a/test-resources-minio/src/test/resources/logback.xml b/test-resources-minio/src/test/resources/logback.xml new file mode 100644 index 000000000..44b79c40d --- /dev/null +++ b/test-resources-minio/src/test/resources/logback.xml @@ -0,0 +1,14 @@ + + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + From 3a23c966bf6f9cd11322e4472c407372b79ddbe9 Mon Sep 17 00:00:00 2001 From: Bruce Melo Date: Mon, 22 Jul 2024 09:35:15 -0300 Subject: [PATCH 2/2] minio support module docs --- src/main/docs/guide/modules-minio.adoc | 8 ++++++++ src/main/docs/guide/toc.yml | 2 ++ 2 files changed, 10 insertions(+) create mode 100644 src/main/docs/guide/modules-minio.adoc diff --git a/src/main/docs/guide/modules-minio.adoc b/src/main/docs/guide/modules-minio.adoc new file mode 100644 index 000000000..44f979290 --- /dev/null +++ b/src/main/docs/guide/modules-minio.adoc @@ -0,0 +1,8 @@ +MinIO support will automatically start a https://min.io[MinIO] container via https://java.testcontainers.org/modules/minio/[Testcontainers] and provide the value of the `minio.url` property. + +The default image can be overwritten by setting the `test-resources.containers.minio.image-name` property. + +In addition, the following properties will be resolved by test resources: + +- `minio.access-key` +- `minio.secret-key` diff --git a/src/main/docs/guide/toc.yml b/src/main/docs/guide/toc.yml index d1581fe66..8f769ad8d 100644 --- a/src/main/docs/guide/toc.yml +++ b/src/main/docs/guide/toc.yml @@ -19,6 +19,8 @@ modules: title: Kafka modules-localstack: title: Localstack + modules-minio: + title: MinIO modules-mongodb: title: MongoDB modules-mqtt: