diff --git a/README.md b/README.md index 97d3d2b3..57142b5e 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,6 @@ ``` postgres -bitnami/kafka apache/kafka confluentinc/kafka clickhouse/clickhouse-server @@ -40,8 +39,6 @@ testcontainers: postgresql: tag: '17' kafka: - bitnami: - tag: '3.8' apache: tag: '3.8.0' confluent: diff --git a/pom.xml b/pom.xml index d92a0cce..89d9f6b8 100644 --- a/pom.xml +++ b/pom.xml @@ -12,7 +12,7 @@ jar testcontainers-annotations - 3.3.2 + 4.0.0 testcontainers-annotations testcontainers-annotations @@ -39,7 +39,7 @@ - 2.0.9 + 2.1.0 0.0.3 1.0.2 1.18.38 @@ -50,30 +50,30 @@ - org.junit - junit-bom - 5.12.2 + org.testcontainers + testcontainers-bom + 2.0.2 pom import - org.testcontainers - testcontainers-bom - 1.21.0 + org.springframework.boot + spring-boot-dependencies + 3.5.4 pom import - com.fasterxml.jackson - jackson-bom - 2.19.0 + org.junit + junit-bom + 5.12.2 pom import - org.springframework.boot - spring-boot-dependencies - 3.5.4 + com.fasterxml.jackson + jackson-bom + 2.19.0 pom import diff --git a/src/main/java/dev/vality/testcontainers/annotations/clickhouse/ClickhouseTestcontainerSingleton.java b/src/main/java/dev/vality/testcontainers/annotations/clickhouse/ClickhouseTestcontainerSingleton.java index a5ce4945..290b2dcd 100644 --- a/src/main/java/dev/vality/testcontainers/annotations/clickhouse/ClickhouseTestcontainerSingleton.java +++ b/src/main/java/dev/vality/testcontainers/annotations/clickhouse/ClickhouseTestcontainerSingleton.java @@ -2,6 +2,7 @@ import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.annotation.DirtiesContext; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; @@ -52,6 +53,7 @@ @Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @ExtendWith(ClickhouseTestcontainerExtension.class) +@DirtiesContext public @interface ClickhouseTestcontainerSingleton { /** diff --git a/src/main/java/dev/vality/testcontainers/annotations/kafka/BitnamiKafkaContainer.java b/src/main/java/dev/vality/testcontainers/annotations/kafka/BitnamiKafkaContainer.java deleted file mode 100644 index 34356aae..00000000 --- a/src/main/java/dev/vality/testcontainers/annotations/kafka/BitnamiKafkaContainer.java +++ /dev/null @@ -1,24 +0,0 @@ -package dev.vality.testcontainers.annotations.kafka; - -import lombok.extern.slf4j.Slf4j; -import org.testcontainers.utility.DockerImageName; - -import java.util.List; - -import static dev.vality.testcontainers.annotations.util.SpringApplicationPropertiesLoader.loadDefaultLibraryProperty; - -@Slf4j -public class BitnamiKafkaContainer extends org.testcontainers.kafka.BitnamiKafkaContainer - implements KafkaContainerExtension { - - private static final String BITNAMI = "bitnami"; - private static final String KAFKA_IMAGE_NAME = BITNAMI + "/kafka"; - private static final String TAG_PROPERTY = "testcontainers.kafka." + BITNAMI + ".tag"; - - public BitnamiKafkaContainer(List topics) { - super(DockerImageName - .parse(KAFKA_IMAGE_NAME) - .withTag(loadDefaultLibraryProperty(TAG_PROPERTY)), - topics); - } -} diff --git a/src/main/java/dev/vality/testcontainers/annotations/kafka/KafkaTestcontainerFactory.java b/src/main/java/dev/vality/testcontainers/annotations/kafka/KafkaTestcontainerFactory.java index cb0d96e2..528e1df3 100644 --- a/src/main/java/dev/vality/testcontainers/annotations/kafka/KafkaTestcontainerFactory.java +++ b/src/main/java/dev/vality/testcontainers/annotations/kafka/KafkaTestcontainerFactory.java @@ -44,11 +44,6 @@ private KafkaContainerExtension getOrCreateSingletonContainer(Provider provider, private KafkaContainerExtension create(Provider provider, List topics) { return switch (provider) { - case BITNAMI -> { - try (var container = new BitnamiKafkaContainer(topics)) { - yield container; - } - } case APACHE -> { try (var container = new ApacheKafkaContainer(topics)) { yield container; diff --git a/src/main/java/dev/vality/testcontainers/annotations/kafka/KafkaTestcontainerSingleton.java b/src/main/java/dev/vality/testcontainers/annotations/kafka/KafkaTestcontainerSingleton.java index 80874ffa..64631080 100644 --- a/src/main/java/dev/vality/testcontainers/annotations/kafka/KafkaTestcontainerSingleton.java +++ b/src/main/java/dev/vality/testcontainers/annotations/kafka/KafkaTestcontainerSingleton.java @@ -8,6 +8,7 @@ import org.apache.kafka.clients.admin.AdminClient; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.annotation.DirtiesContext; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; @@ -107,6 +108,7 @@ @Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @ExtendWith(KafkaTestcontainerExtension.class) +@DirtiesContext public @interface KafkaTestcontainerSingleton { /** diff --git a/src/main/java/dev/vality/testcontainers/annotations/kafka/constants/Provider.java b/src/main/java/dev/vality/testcontainers/annotations/kafka/constants/Provider.java index 3e15c731..f0d00ebe 100644 --- a/src/main/java/dev/vality/testcontainers/annotations/kafka/constants/Provider.java +++ b/src/main/java/dev/vality/testcontainers/annotations/kafka/constants/Provider.java @@ -2,6 +2,5 @@ public enum Provider { APACHE, - BITNAMI, CONFLUENT } diff --git a/src/main/java/dev/vality/testcontainers/annotations/minio/MinioTestcontainerSingleton.java b/src/main/java/dev/vality/testcontainers/annotations/minio/MinioTestcontainerSingleton.java index 68cda350..cc2fb4f2 100644 --- a/src/main/java/dev/vality/testcontainers/annotations/minio/MinioTestcontainerSingleton.java +++ b/src/main/java/dev/vality/testcontainers/annotations/minio/MinioTestcontainerSingleton.java @@ -2,6 +2,7 @@ import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.annotation.DirtiesContext; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; @@ -39,6 +40,7 @@ @Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @ExtendWith(MinioTestcontainerExtension.class) +@DirtiesContext public @interface MinioTestcontainerSingleton { /** diff --git a/src/main/java/dev/vality/testcontainers/annotations/opensearch/OpensearchTestcontainerSingleton.java b/src/main/java/dev/vality/testcontainers/annotations/opensearch/OpensearchTestcontainerSingleton.java index 6e0f740c..b1ad863b 100644 --- a/src/main/java/dev/vality/testcontainers/annotations/opensearch/OpensearchTestcontainerSingleton.java +++ b/src/main/java/dev/vality/testcontainers/annotations/opensearch/OpensearchTestcontainerSingleton.java @@ -2,6 +2,7 @@ import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.annotation.DirtiesContext; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; @@ -11,6 +12,7 @@ @Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @ExtendWith(OpensearchTestcontainerExtension.class) +@DirtiesContext public @interface OpensearchTestcontainerSingleton { /** diff --git a/src/main/java/dev/vality/testcontainers/annotations/postgresql/PostgresqlTestcontainerSingleton.java b/src/main/java/dev/vality/testcontainers/annotations/postgresql/PostgresqlTestcontainerSingleton.java index a324b8d1..b09c5478 100644 --- a/src/main/java/dev/vality/testcontainers/annotations/postgresql/PostgresqlTestcontainerSingleton.java +++ b/src/main/java/dev/vality/testcontainers/annotations/postgresql/PostgresqlTestcontainerSingleton.java @@ -2,6 +2,7 @@ import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.annotation.DirtiesContext; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; @@ -42,6 +43,7 @@ @Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @ExtendWith(PostgresqlTestcontainerExtension.class) +@DirtiesContext public @interface PostgresqlTestcontainerSingleton { /** diff --git a/src/main/java/dev/vality/testcontainers/annotations/util/ValuesGenerator.java b/src/main/java/dev/vality/testcontainers/annotations/util/ValuesGenerator.java index 49329ec5..bab62029 100644 --- a/src/main/java/dev/vality/testcontainers/annotations/util/ValuesGenerator.java +++ b/src/main/java/dev/vality/testcontainers/annotations/util/ValuesGenerator.java @@ -3,7 +3,7 @@ import dev.vality.geck.common.util.TypeUtil; import lombok.AccessLevel; import lombok.NoArgsConstructor; -import org.testcontainers.shaded.org.apache.commons.io.IOUtils; +import org.apache.commons.io.IOUtils; import java.io.IOException; import java.io.InputStream; diff --git a/src/main/java/org/testcontainers/kafka/BitnamiKafkaContainer.java b/src/main/java/org/testcontainers/kafka/BitnamiKafkaContainer.java deleted file mode 100644 index f92f7393..00000000 --- a/src/main/java/org/testcontainers/kafka/BitnamiKafkaContainer.java +++ /dev/null @@ -1,94 +0,0 @@ -package org.testcontainers.kafka; - -import com.github.dockerjava.api.command.InspectContainerResponse; -import dev.vality.testcontainers.annotations.kafka.KafkaContainerExtension; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; -import org.testcontainers.containers.GenericContainer; -import org.testcontainers.containers.Network; -import org.testcontainers.containers.output.WaitingConsumer; -import org.testcontainers.containers.wait.strategy.Wait; -import org.testcontainers.containers.wait.strategy.WaitAllStrategy; -import org.testcontainers.images.builder.Transferable; -import org.testcontainers.utility.DockerImageName; - -import java.time.Duration; -import java.util.ArrayList; -import java.util.List; -import java.util.UUID; -import java.util.concurrent.TimeUnit; - -@Slf4j -@SuppressWarnings("LineLength") -public class BitnamiKafkaContainer extends GenericContainer implements KafkaContainerExtension { - - private static final int KAFKA_PORT = 9092; - private static final int BROKER_PORT = 9093; - private static final int LIMIT = 120; - private final List topics; - - public BitnamiKafkaContainer(DockerImageName dockerImageName, List topics) { - super(dockerImageName); - this.topics = topics; - dockerImageName.assertCompatibleWith(DockerImageName.parse("bitnami/kafka")); - withExposedPorts(KafkaHelper.KAFKA_PORT); - withEnv(KafkaHelper.envVars()); - withEnv("KAFKA_CFG_CONTROLLER_LISTENER_NAMES", "CONTROLLER"); - withEnv("ALLOW_PLAINTEXT_LISTENER", "yes"); - withEnv("KAFKA_CFG_DELETE_TOPIC_ENABLE", "true"); - withEnv("KAFKA_DELETE_TOPIC_ENABLE", "true"); - withEnv("DELETE_TOPIC_ENABLE", "true"); - withEnv("KAFKA_CFG_AUTO_CREATE_TOPICS_ENABLE", "false"); - withEnv("KAFKA_AUTO_CREATE_TOPICS_ENABLE", "false"); - withEnv("KAFKA_CFG_NODE_ID", "1"); - withCommand(KafkaHelper.COMMAND); - waitingFor(new WaitAllStrategy() - .withStrategy(Wait.forLogMessage(".*Welcome to the Bitnami kafka container.*", 1)) - .withStrategy(Wait.forListeningPort()) - .withStartupTimeout(Duration.ofSeconds(LIMIT))); - withNetworkAliases("kafka-" + UUID.randomUUID()); - withNetwork(Network.SHARED); - } - - // copy-paste from org.testcontainers.kafka.KafkaContainer + /tmp/kafka.log WaitingConsumer - @Override - @SneakyThrows - protected void containerIsStarting(InspectContainerResponse containerInfo) { - var brokerAdvertisedListener = String.format( - "BROKER://%s:%s", - containerInfo.getConfig().getHostName(), - BROKER_PORT - ); - var advertisedListeners = new ArrayList(); - advertisedListeners.add("PLAINTEXT://" + getBootstrapServers()); - advertisedListeners.add(brokerAdvertisedListener); - var kafkaAdvertisedListeners = String.join(",", advertisedListeners); - var scriptsPath = "/opt/bitnami/scripts/kafka/"; - var script = String.join("\n", - "#!/bin/bash", - "export KAFKA_CFG_ADVERTISED_LISTENERS=" + kafkaAdvertisedListeners, - scriptsPath + "entrypoint.sh " + scriptsPath + "run.sh > /tmp/kafka.log 2>&1"); - copyFileToContainer(Transferable.of(script.getBytes(), 511), "/start-kafka.sh"); - execInContainer("sh", "-c", "nohup /start-kafka.sh &"); - execInContainer("sh", "-c", "tail -n+1 -f /tmp/kafka.log > /proc/1/fd/1 &"); - var logConsumer = new WaitingConsumer(); - followOutput(logConsumer); - logConsumer.waitUntil(frame -> frame.getUtf8String().contains("Kafka startTimeMs"), LIMIT, TimeUnit.SECONDS); - } - - @Override - public List topics() { - return topics; - } - - @Override - public String getBootstrapServers() { - return getHost() + ":" + getMappedPort(KAFKA_PORT); - } - - @Override - public String execInContainerKafkaTopicsListCommand() { - var kafkaTopicsPath = "/opt/bitnami/kafka/bin/kafka-topics.sh"; - return execInContainerKafkaTopicsListCommandWithPath(kafkaTopicsPath); - } -} diff --git a/src/main/resources/testcontainers-annotations.yml b/src/main/resources/testcontainers-annotations.yml index d08f4ec9..b1823d90 100644 --- a/src/main/resources/testcontainers-annotations.yml +++ b/src/main/resources/testcontainers-annotations.yml @@ -2,8 +2,6 @@ testcontainers: postgresql: tag: '17' kafka: - bitnami: - tag: '3.8' apache: tag: '3.8.0' confluent: