From 519dbbe206842e41773a03d7418561284101dd55 Mon Sep 17 00:00:00 2001 From: Aleksandr Pavlyuk Date: Wed, 4 Mar 2026 12:54:34 +0300 Subject: [PATCH 1/3] feat(testcontainers): refactor vshard and cartridge containers --- .../integration/TarantoolCrudClientTest.java | 6 +- .../TarantoolCrudClientWithRetryTest.java | 2 - .../integration/BaseIntegrationTest.java | 6 +- .../integration/crud/CrudConfigurations.java | 2 - .../integration/BaseIntegrationTest.java | 6 +- .../integration/crud/CrudConfigurations.java | 2 - .../integration/BaseIntegrationTest.java | 6 +- .../integration/crud/CrudConfigurations.java | 2 - .../integration/BaseIntegrationTest.java | 6 +- .../integration/crud/CrudConfigurations.java | 2 - .../integration/BaseIntegrationTest.java | 6 +- .../integration/crud/CrudConfigurations.java | 2 - .../integration/BaseIntegrationTest.java | 6 +- .../integration/crud/CrudConfigurations.java | 2 - .../containers/ClusterContainer.java | 43 ++++++ .../TarantoolCartridgeContainer.java | 145 ++++++++++-------- .../containers/VshardClusterContainer.java | 108 +++++-------- .../utils/TarantoolContainerClientHelper.java | 109 ------------- 18 files changed, 178 insertions(+), 283 deletions(-) create mode 100644 testcontainers/src/main/java/org/testcontainers/containers/ClusterContainer.java diff --git a/tarantool-client/src/test/java/io/tarantool/client/integration/TarantoolCrudClientTest.java b/tarantool-client/src/test/java/io/tarantool/client/integration/TarantoolCrudClientTest.java index c0df21d8..82ee696c 100644 --- a/tarantool-client/src/test/java/io/tarantool/client/integration/TarantoolCrudClientTest.java +++ b/tarantool-client/src/test/java/io/tarantool/client/integration/TarantoolCrudClientTest.java @@ -34,7 +34,6 @@ import com.fasterxml.jackson.core.type.TypeReference; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Timeout; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; @@ -45,8 +44,8 @@ import org.junit.jupiter.params.provider.MethodSource; import org.msgpack.value.ValueFactory; import org.slf4j.LoggerFactory; +import org.testcontainers.containers.ClusterContainer; import org.testcontainers.containers.TarantoolCartridgeContainer; -import org.testcontainers.containers.TarantoolContainerOperations; import org.testcontainers.containers.VshardClusterContainer; import org.testcontainers.containers.output.Slf4jLogConsumer; import org.testcontainers.junit.jupiter.Testcontainers; @@ -86,7 +85,6 @@ import io.tarantool.pool.IProtoClientPool; import io.tarantool.pool.InstanceConnectionGroup; -@Disabled("Refactor TarantoolCartridgeContainer and VshardClusterContainer") @Timeout(value = 10) @Testcontainers public class TarantoolCrudClientTest extends BaseTest { @@ -103,7 +101,7 @@ public class TarantoolCrudClientTest extends BaseTest { public static final Person STUB_PERSON = new Person(0, true, String.valueOf(0)); private static TarantoolCartridgeContainer cartridgeContainer; private static VshardClusterContainer vshardClusterContainer; - private static TarantoolContainerOperations clusterContainer; + private static ClusterContainer clusterContainer; public static final String ROUTER_1 = "ROUTER_1"; public static final String ROUTER_2 = "ROUTER_2"; private static TarantoolCrudClient client; diff --git a/tarantool-client/src/test/java/io/tarantool/client/integration/TarantoolCrudClientWithRetryTest.java b/tarantool-client/src/test/java/io/tarantool/client/integration/TarantoolCrudClientWithRetryTest.java index b9f31030..9157e2e5 100644 --- a/tarantool-client/src/test/java/io/tarantool/client/integration/TarantoolCrudClientWithRetryTest.java +++ b/tarantool-client/src/test/java/io/tarantool/client/integration/TarantoolCrudClientWithRetryTest.java @@ -21,7 +21,6 @@ import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Timeout; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; @@ -36,7 +35,6 @@ import io.tarantool.core.exceptions.BoxError; import io.tarantool.mapping.Tuple; -@Disabled("Refactor TarantoolCartridgeContainer and VshardClusterContainer") @Timeout(value = 5) @Testcontainers public class TarantoolCrudClientWithRetryTest { diff --git a/tarantool-spring-data/tarantool-spring-data-27/src/test/java/io/tarantool/spring/data27/integration/BaseIntegrationTest.java b/tarantool-spring-data/tarantool-spring-data-27/src/test/java/io/tarantool/spring/data27/integration/BaseIntegrationTest.java index 219f104f..c536b03c 100644 --- a/tarantool-spring-data/tarantool-spring-data-27/src/test/java/io/tarantool/spring/data27/integration/BaseIntegrationTest.java +++ b/tarantool-spring-data/tarantool-spring-data-27/src/test/java/io/tarantool/spring/data27/integration/BaseIntegrationTest.java @@ -11,11 +11,10 @@ import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Timeout; import org.slf4j.LoggerFactory; +import org.testcontainers.containers.ClusterContainer; import org.testcontainers.containers.TarantoolCartridgeContainer; -import org.testcontainers.containers.TarantoolContainerOperations; import org.testcontainers.containers.VshardClusterContainer; import org.testcontainers.containers.output.Slf4jLogConsumer; @@ -24,11 +23,10 @@ import static io.tarantool.spring.data27.utils.TarantoolTestSupport.writeTestPropertiesYaml; import io.tarantool.spring.data27.config.properties.TarantoolProperties; -@Disabled("Refactor TarantoolCartridgeContainer and VshardClusterContainer") @Timeout(60) public abstract class BaseIntegrationTest { - protected static TarantoolContainerOperations clusterContainer; + protected static ClusterContainer clusterContainer; private static final String dockerRegistry = System.getenv().getOrDefault("TESTCONTAINERS_HUB_IMAGE_NAME_PREFIX", ""); diff --git a/tarantool-spring-data/tarantool-spring-data-27/src/test/java/io/tarantool/spring/data27/integration/crud/CrudConfigurations.java b/tarantool-spring-data/tarantool-spring-data-27/src/test/java/io/tarantool/spring/data27/integration/crud/CrudConfigurations.java index f304dc4d..cd6363aa 100644 --- a/tarantool-spring-data/tarantool-spring-data-27/src/test/java/io/tarantool/spring/data27/integration/crud/CrudConfigurations.java +++ b/tarantool-spring-data/tarantool-spring-data-27/src/test/java/io/tarantool/spring/data27/integration/crud/CrudConfigurations.java @@ -13,7 +13,6 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; @@ -34,7 +33,6 @@ import io.tarantool.spring.data27.integration.BaseIntegrationTest; import io.tarantool.spring.data27.repository.config.EnableTarantoolRepositories; -@Disabled("Refactor TarantoolCartridgeContainer and VshardClusterContainer") @TestPropertySource(properties = {DEFAULT_PROPERTY_FILE_LOCATION_CLASSPATH}) abstract class CrudConfigurations extends BaseIntegrationTest { diff --git a/tarantool-spring-data/tarantool-spring-data-31/src/test/java/io/tarantool/spring/data31/integration/BaseIntegrationTest.java b/tarantool-spring-data/tarantool-spring-data-31/src/test/java/io/tarantool/spring/data31/integration/BaseIntegrationTest.java index 14a9cd72..5a623ecd 100644 --- a/tarantool-spring-data/tarantool-spring-data-31/src/test/java/io/tarantool/spring/data31/integration/BaseIntegrationTest.java +++ b/tarantool-spring-data/tarantool-spring-data-31/src/test/java/io/tarantool/spring/data31/integration/BaseIntegrationTest.java @@ -11,11 +11,10 @@ import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Timeout; import org.slf4j.LoggerFactory; +import org.testcontainers.containers.ClusterContainer; import org.testcontainers.containers.TarantoolCartridgeContainer; -import org.testcontainers.containers.TarantoolContainerOperations; import org.testcontainers.containers.VshardClusterContainer; import org.testcontainers.containers.output.Slf4jLogConsumer; @@ -24,11 +23,10 @@ import static io.tarantool.spring.data31.utils.TarantoolTestSupport.writeTestPropertiesYaml; import io.tarantool.spring.data31.config.properties.TarantoolProperties; -@Disabled("Refactor TarantoolCartridgeContainer and VshardClusterContainer") @Timeout(60) public abstract class BaseIntegrationTest { - protected static TarantoolContainerOperations clusterContainer; + protected static ClusterContainer clusterContainer; private static final String dockerRegistry = System.getenv().getOrDefault("TESTCONTAINERS_HUB_IMAGE_NAME_PREFIX", ""); diff --git a/tarantool-spring-data/tarantool-spring-data-31/src/test/java/io/tarantool/spring/data31/integration/crud/CrudConfigurations.java b/tarantool-spring-data/tarantool-spring-data-31/src/test/java/io/tarantool/spring/data31/integration/crud/CrudConfigurations.java index 3095faba..9d0914df 100644 --- a/tarantool-spring-data/tarantool-spring-data-31/src/test/java/io/tarantool/spring/data31/integration/crud/CrudConfigurations.java +++ b/tarantool-spring-data/tarantool-spring-data-31/src/test/java/io/tarantool/spring/data31/integration/crud/CrudConfigurations.java @@ -13,7 +13,6 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; @@ -34,7 +33,6 @@ import io.tarantool.spring.data31.integration.BaseIntegrationTest; import io.tarantool.spring.data31.repository.config.EnableTarantoolRepositories; -@Disabled("Refactor TarantoolCartridgeContainer and VshardClusterContainer") @TestPropertySource(properties = {DEFAULT_PROPERTY_FILE_LOCATION_CLASSPATH}) abstract class CrudConfigurations extends BaseIntegrationTest { diff --git a/tarantool-spring-data/tarantool-spring-data-32/src/test/java/io/tarantool/spring/data32/integration/BaseIntegrationTest.java b/tarantool-spring-data/tarantool-spring-data-32/src/test/java/io/tarantool/spring/data32/integration/BaseIntegrationTest.java index 38f94c5d..5452c078 100644 --- a/tarantool-spring-data/tarantool-spring-data-32/src/test/java/io/tarantool/spring/data32/integration/BaseIntegrationTest.java +++ b/tarantool-spring-data/tarantool-spring-data-32/src/test/java/io/tarantool/spring/data32/integration/BaseIntegrationTest.java @@ -11,11 +11,10 @@ import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Timeout; import org.slf4j.LoggerFactory; +import org.testcontainers.containers.ClusterContainer; import org.testcontainers.containers.TarantoolCartridgeContainer; -import org.testcontainers.containers.TarantoolContainerOperations; import org.testcontainers.containers.VshardClusterContainer; import org.testcontainers.containers.output.Slf4jLogConsumer; @@ -24,11 +23,10 @@ import static io.tarantool.spring.data32.utils.TarantoolTestSupport.writeTestPropertiesYaml; import io.tarantool.spring.data32.config.properties.TarantoolProperties; -@Disabled("Refactor TarantoolCartridgeContainer and VshardClusterContainer") @Timeout(60) public abstract class BaseIntegrationTest { - protected static TarantoolContainerOperations clusterContainer; + protected static ClusterContainer clusterContainer; private static final String dockerRegistry = System.getenv().getOrDefault("TESTCONTAINERS_HUB_IMAGE_NAME_PREFIX", ""); diff --git a/tarantool-spring-data/tarantool-spring-data-32/src/test/java/io/tarantool/spring/data32/integration/crud/CrudConfigurations.java b/tarantool-spring-data/tarantool-spring-data-32/src/test/java/io/tarantool/spring/data32/integration/crud/CrudConfigurations.java index 448bfb5b..510cf921 100644 --- a/tarantool-spring-data/tarantool-spring-data-32/src/test/java/io/tarantool/spring/data32/integration/crud/CrudConfigurations.java +++ b/tarantool-spring-data/tarantool-spring-data-32/src/test/java/io/tarantool/spring/data32/integration/crud/CrudConfigurations.java @@ -13,7 +13,6 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; @@ -34,7 +33,6 @@ import io.tarantool.spring.data32.integration.BaseIntegrationTest; import io.tarantool.spring.data32.repository.config.EnableTarantoolRepositories; -@Disabled("Refactor TarantoolCartridgeContainer and VshardClusterContainer") @TestPropertySource(properties = {DEFAULT_PROPERTY_FILE_LOCATION_CLASSPATH}) abstract class CrudConfigurations extends BaseIntegrationTest { diff --git a/tarantool-spring-data/tarantool-spring-data-33/src/test/java/io/tarantool/spring/data33/integration/BaseIntegrationTest.java b/tarantool-spring-data/tarantool-spring-data-33/src/test/java/io/tarantool/spring/data33/integration/BaseIntegrationTest.java index 9bfacbc1..2ea5c439 100644 --- a/tarantool-spring-data/tarantool-spring-data-33/src/test/java/io/tarantool/spring/data33/integration/BaseIntegrationTest.java +++ b/tarantool-spring-data/tarantool-spring-data-33/src/test/java/io/tarantool/spring/data33/integration/BaseIntegrationTest.java @@ -11,11 +11,10 @@ import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Timeout; import org.slf4j.LoggerFactory; +import org.testcontainers.containers.ClusterContainer; import org.testcontainers.containers.TarantoolCartridgeContainer; -import org.testcontainers.containers.TarantoolContainerOperations; import org.testcontainers.containers.VshardClusterContainer; import org.testcontainers.containers.output.Slf4jLogConsumer; @@ -24,11 +23,10 @@ import static io.tarantool.spring.data33.utils.TarantoolTestSupport.writeTestPropertiesYaml; import io.tarantool.spring.data33.config.properties.TarantoolProperties; -@Disabled("Refactor TarantoolCartridgeContainer and VshardClusterContainer") @Timeout(60) public abstract class BaseIntegrationTest { - protected static TarantoolContainerOperations clusterContainer; + protected static ClusterContainer clusterContainer; private static final String dockerRegistry = System.getenv().getOrDefault("TESTCONTAINERS_HUB_IMAGE_NAME_PREFIX", ""); diff --git a/tarantool-spring-data/tarantool-spring-data-33/src/test/java/io/tarantool/spring/data33/integration/crud/CrudConfigurations.java b/tarantool-spring-data/tarantool-spring-data-33/src/test/java/io/tarantool/spring/data33/integration/crud/CrudConfigurations.java index a46ac0d9..e5575911 100644 --- a/tarantool-spring-data/tarantool-spring-data-33/src/test/java/io/tarantool/spring/data33/integration/crud/CrudConfigurations.java +++ b/tarantool-spring-data/tarantool-spring-data-33/src/test/java/io/tarantool/spring/data33/integration/crud/CrudConfigurations.java @@ -13,7 +13,6 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; @@ -34,7 +33,6 @@ import io.tarantool.spring.data33.integration.BaseIntegrationTest; import io.tarantool.spring.data33.repository.config.EnableTarantoolRepositories; -@Disabled("Refactor TarantoolCartridgeContainer and VshardClusterContainer") @TestPropertySource(properties = {DEFAULT_PROPERTY_FILE_LOCATION_CLASSPATH}) abstract class CrudConfigurations extends BaseIntegrationTest { diff --git a/tarantool-spring-data/tarantool-spring-data-34/src/test/java/io/tarantool/spring/data34/integration/BaseIntegrationTest.java b/tarantool-spring-data/tarantool-spring-data-34/src/test/java/io/tarantool/spring/data34/integration/BaseIntegrationTest.java index 2c9d5c66..df3eb68c 100644 --- a/tarantool-spring-data/tarantool-spring-data-34/src/test/java/io/tarantool/spring/data34/integration/BaseIntegrationTest.java +++ b/tarantool-spring-data/tarantool-spring-data-34/src/test/java/io/tarantool/spring/data34/integration/BaseIntegrationTest.java @@ -11,11 +11,10 @@ import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Timeout; import org.slf4j.LoggerFactory; +import org.testcontainers.containers.ClusterContainer; import org.testcontainers.containers.TarantoolCartridgeContainer; -import org.testcontainers.containers.TarantoolContainerOperations; import org.testcontainers.containers.VshardClusterContainer; import org.testcontainers.containers.output.Slf4jLogConsumer; @@ -24,11 +23,10 @@ import static io.tarantool.spring.data34.utils.TarantoolTestSupport.writeTestPropertiesYaml; import io.tarantool.spring.data34.config.properties.TarantoolProperties; -@Disabled("Refactor TarantoolCartridgeContainer and VshardClusterContainer") @Timeout(60) public abstract class BaseIntegrationTest { - protected static TarantoolContainerOperations clusterContainer; + protected static ClusterContainer clusterContainer; private static final String dockerRegistry = System.getenv().getOrDefault("TESTCONTAINERS_HUB_IMAGE_NAME_PREFIX", ""); diff --git a/tarantool-spring-data/tarantool-spring-data-34/src/test/java/io/tarantool/spring/data34/integration/crud/CrudConfigurations.java b/tarantool-spring-data/tarantool-spring-data-34/src/test/java/io/tarantool/spring/data34/integration/crud/CrudConfigurations.java index 504d9867..cbb15317 100644 --- a/tarantool-spring-data/tarantool-spring-data-34/src/test/java/io/tarantool/spring/data34/integration/crud/CrudConfigurations.java +++ b/tarantool-spring-data/tarantool-spring-data-34/src/test/java/io/tarantool/spring/data34/integration/crud/CrudConfigurations.java @@ -13,7 +13,6 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; @@ -34,7 +33,6 @@ import io.tarantool.spring.data34.integration.BaseIntegrationTest; import io.tarantool.spring.data34.repository.config.EnableTarantoolRepositories; -@Disabled("Refactor TarantoolCartridgeContainer and VshardClusterContainer") @TestPropertySource(properties = {DEFAULT_PROPERTY_FILE_LOCATION_CLASSPATH}) abstract class CrudConfigurations extends BaseIntegrationTest { diff --git a/tarantool-spring-data/tarantool-spring-data-35/src/test/java/io/tarantool/spring/data35/integration/BaseIntegrationTest.java b/tarantool-spring-data/tarantool-spring-data-35/src/test/java/io/tarantool/spring/data35/integration/BaseIntegrationTest.java index 2fd20f50..9bef6dfe 100644 --- a/tarantool-spring-data/tarantool-spring-data-35/src/test/java/io/tarantool/spring/data35/integration/BaseIntegrationTest.java +++ b/tarantool-spring-data/tarantool-spring-data-35/src/test/java/io/tarantool/spring/data35/integration/BaseIntegrationTest.java @@ -11,11 +11,10 @@ import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Timeout; import org.slf4j.LoggerFactory; +import org.testcontainers.containers.ClusterContainer; import org.testcontainers.containers.TarantoolCartridgeContainer; -import org.testcontainers.containers.TarantoolContainerOperations; import org.testcontainers.containers.VshardClusterContainer; import org.testcontainers.containers.output.Slf4jLogConsumer; @@ -24,11 +23,10 @@ import static io.tarantool.spring.data35.utils.TarantoolTestSupport.writeTestPropertiesYaml; import io.tarantool.spring.data35.config.properties.TarantoolProperties; -@Disabled("Refactor TarantoolCartridgeContainer and VshardClusterContainer") @Timeout(60) public abstract class BaseIntegrationTest { - protected static TarantoolContainerOperations clusterContainer; + protected static ClusterContainer clusterContainer; private static final String dockerRegistry = System.getenv().getOrDefault("TESTCONTAINERS_HUB_IMAGE_NAME_PREFIX", ""); diff --git a/tarantool-spring-data/tarantool-spring-data-35/src/test/java/io/tarantool/spring/data35/integration/crud/CrudConfigurations.java b/tarantool-spring-data/tarantool-spring-data-35/src/test/java/io/tarantool/spring/data35/integration/crud/CrudConfigurations.java index 1ccf47b5..3639f66c 100644 --- a/tarantool-spring-data/tarantool-spring-data-35/src/test/java/io/tarantool/spring/data35/integration/crud/CrudConfigurations.java +++ b/tarantool-spring-data/tarantool-spring-data-35/src/test/java/io/tarantool/spring/data35/integration/crud/CrudConfigurations.java @@ -13,7 +13,6 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; @@ -34,7 +33,6 @@ import io.tarantool.spring.data35.integration.BaseIntegrationTest; import io.tarantool.spring.data35.repository.config.EnableTarantoolRepositories; -@Disabled("Refactor TarantoolCartridgeContainer and VshardClusterContainer") @TestPropertySource(properties = {DEFAULT_PROPERTY_FILE_LOCATION_CLASSPATH}) abstract class CrudConfigurations extends BaseIntegrationTest { diff --git a/testcontainers/src/main/java/org/testcontainers/containers/ClusterContainer.java b/testcontainers/src/main/java/org/testcontainers/containers/ClusterContainer.java new file mode 100644 index 00000000..bb798ad6 --- /dev/null +++ b/testcontainers/src/main/java/org/testcontainers/containers/ClusterContainer.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2025 VK DIGITAL TECHNOLOGIES LIMITED LIABILITY COMPANY + * All Rights Reserved. + */ + +package org.testcontainers.containers; + +/** + * Common interface for Tarantool cluster containers (vshard-based and cartridge-based). Provides + * access to the router endpoint and command execution. + */ +public interface ClusterContainer { + + /** + * Get the router host. + * + * @return router hostname + */ + String getHost(); + + /** + * Get the mapped router port (default router port 3301). + * + * @return mapped router port + */ + int getPort(); + + /** + * Get the mapped port for the given original container port. + * + * @param originalPort the container-internal port + * @return the mapped host port + */ + Integer getMappedPort(int originalPort); + + /** + * Execute a Lua command inside the cluster router. + * + * @param command a valid Lua command or sequence of Lua commands + * @return command execution result + */ + Container.ExecResult executeCommand(String command); +} diff --git a/testcontainers/src/main/java/org/testcontainers/containers/TarantoolCartridgeContainer.java b/testcontainers/src/main/java/org/testcontainers/containers/TarantoolCartridgeContainer.java index 85e06816..5a8b5099 100644 --- a/testcontainers/src/main/java/org/testcontainers/containers/TarantoolCartridgeContainer.java +++ b/testcontainers/src/main/java/org/testcontainers/containers/TarantoolCartridgeContainer.java @@ -5,7 +5,9 @@ package org.testcontainers.containers; +import java.io.IOException; import java.net.URL; +import java.nio.file.Paths; import java.util.Arrays; import java.util.Collections; import java.util.HashMap; @@ -19,13 +21,12 @@ import com.github.dockerjava.api.command.InspectContainerResponse; import org.apache.commons.lang3.ArrayUtils; import org.testcontainers.containers.utils.CartridgeConfigParser; -import org.testcontainers.containers.utils.SslContext; -import org.testcontainers.containers.utils.TarantoolContainerClientHelper; import org.testcontainers.images.builder.ImageFromDockerfile; +import org.testcontainers.utility.MountableFile; +import org.yaml.snakeyaml.Yaml; -@Deprecated public class TarantoolCartridgeContainer extends GenericContainer - implements TarantoolContainerOperations { + implements ClusterContainer { protected static final String ROUTER_HOST = "localhost"; protected static final int ROUTER_PORT = 3301; @@ -52,6 +53,25 @@ public class TarantoolCartridgeContainer extends GenericContainer /tmp/container-cmd.lua && tarantool /tmp/container-cmd.lua"; + + private static final Yaml yaml = new Yaml(); + protected final CartridgeConfigParser instanceFileParser; protected final String TARANTOOL_RUN_DIR; @@ -65,7 +85,6 @@ public class TarantoolCartridgeContainer extends GenericContainer waitFunc) { } protected boolean routerIsUp() { - ExecResult result; try { - result = executeCommand(healthyCmd); + ExecResult result = executeCommand(healthyCmd); if (result.getExitCode() != 0 && result.getStderr().contains("Connection refused") && result.getStdout().isEmpty()) { @@ -613,9 +600,8 @@ protected boolean routerIsUp() { } protected boolean isCartridgeHealthy() { - ExecResult result; try { - result = executeCommand(healthyCmd); + ExecResult result = executeCommand(healthyCmd); if (result.getExitCode() != 0) { logger() .error( @@ -643,24 +629,57 @@ protected boolean isCartridgeHealthy() { } } - @Override public ExecResult executeScript(String scriptResourcePath) throws Exception { - return TarantoolContainerClientHelper.executeScript(this, scriptResourcePath, this.sslContext); + String scriptName = Paths.get(scriptResourcePath).getFileName().toString(); + String containerPath = normalizePath(Paths.get(TMP_DIR, scriptName)); + copyFileToContainer(MountableFile.forClasspathResource(scriptResourcePath), containerPath); + return executeCommand(String.format("return dofile('%s')", containerPath)); } - @Override public T executeScriptDecoded(String scriptResourcePath) throws Exception { - return TarantoolContainerClientHelper.executeScriptDecoded( - this, scriptResourcePath, this.sslContext); + ExecResult result = executeScript(scriptResourcePath); + + if (result.getExitCode() != 0) { + String message = + String.format( + "Executed script %s with exit code %d, stderr: \"%s\", stdout: \"%s\"", + scriptResourcePath, result.getExitCode(), result.getStderr(), result.getStdout()); + + if (result.getExitCode() == 3 || result.getExitCode() == 1) { + throw new ExecutionException(message, new Throwable()); + } + + throw new IllegalStateException(message); + } + + return yaml.load(result.getStdout()); } @Override - public ExecResult executeCommand(String command) throws Exception { - return TarantoolContainerClientHelper.executeCommand(this, command, this.sslContext); + public ExecResult executeCommand(String command) { + try { + if (!isRunning()) { + throw new IllegalStateException("Cannot execute commands in stopped container"); + } + command = command.replace("\"", "\\\"").replace("\'", "\\\'"); + String bashCommand = + String.format(COMMAND_TEMPLATE, routerPort, routerUsername, routerPassword, command); + return execInContainer("sh", "-c", bashCommand); + } catch (IOException | InterruptedException e) { + throw new RuntimeException(e); + } } - @Override - public T executeCommandDecoded(String command) throws Exception { - return TarantoolContainerClientHelper.executeCommandDecoded(this, command, this.sslContext); + public T executeCommandDecoded(String command) { + ExecResult result = executeCommand(command); + + if (result.getExitCode() != 0) { + throw new IllegalStateException( + String.format( + "Executed command \"%s\" with exit code %d, stderr: \"%s\", stdout: \"%s\"", + command, result.getExitCode(), result.getStderr(), result.getStdout())); + } + + return yaml.load(result.getStdout()); } } diff --git a/testcontainers/src/main/java/org/testcontainers/containers/VshardClusterContainer.java b/testcontainers/src/main/java/org/testcontainers/containers/VshardClusterContainer.java index 43b2dffc..94277b9b 100644 --- a/testcontainers/src/main/java/org/testcontainers/containers/VshardClusterContainer.java +++ b/testcontainers/src/main/java/org/testcontainers/containers/VshardClusterContainer.java @@ -7,28 +7,26 @@ import java.io.IOException; import java.net.URL; +import java.nio.file.Paths; import java.util.Arrays; import java.util.Collections; import java.util.HashMap; import java.util.Map; import java.util.Objects; -import java.util.concurrent.ExecutionException; import java.util.function.Supplier; import static org.testcontainers.containers.utils.PathUtils.normalizePath; import com.github.dockerjava.api.command.InspectContainerResponse; import lombok.Getter; import org.apache.commons.lang3.ArrayUtils; -import org.testcontainers.containers.utils.SslContext; -import org.testcontainers.containers.utils.TarantoolContainerClientHelper; import org.testcontainers.images.builder.ImageFromDockerfile; +import org.testcontainers.utility.MountableFile; /** * @author Artyom Dubinin */ -@Deprecated public class VshardClusterContainer extends GenericContainer - implements TarantoolContainerOperations { + implements ClusterContainer { protected static final String ROUTER_HOST = "localhost"; protected static final int ROUTER_PORT = 3301; @@ -52,6 +50,9 @@ public class VshardClusterContainer extends GenericContainer waitFunc) { } protected boolean crudIsUp() { - ExecResult result; try { - result = TarantoolContainerClientHelper.executeCommand(this, "return crud._VERSION", null); + ExecResult result = + execInContainer( + "/bin/sh", + "-c", + String.format( + ECHO_COMMAND_TEMPLATE, + "return crud._VERSION", + routerUsername, + routerPassword, + routerPort)); if (result.getExitCode() != 0) { logger() .error( @@ -356,48 +345,31 @@ protected boolean crudIsUp() { result.getStdout(), result.getStderr()); return false; - } else { - return true; } + return true; } catch (Exception e) { logger().error(e.getMessage()); return false; } } - @Override public ExecResult executeScript(String scriptResourcePath) { - try { - return TarantoolContainerClientHelper.executeScript( - this, scriptResourcePath, this.sslContext); - } catch (IOException | InterruptedException e) { - throw new RuntimeException(e); - } - } - - @Override - public T executeScriptDecoded(String scriptResourcePath) { - try { - return TarantoolContainerClientHelper.executeScriptDecoded( - this, scriptResourcePath, this.sslContext); - } catch (IOException | InterruptedException | ExecutionException e) { - throw new RuntimeException(e); - } + String scriptName = Paths.get(scriptResourcePath).getFileName().toString(); + String containerPath = normalizePath(Paths.get(TMP_DIR, scriptName)); + copyFileToContainer(MountableFile.forClasspathResource(scriptResourcePath), containerPath); + return executeCommand(String.format("return dofile('%s')", containerPath)); } @Override public ExecResult executeCommand(String command) { try { - return TarantoolContainerClientHelper.executeCommand(this, command, this.sslContext); - } catch (IOException | InterruptedException e) { - throw new RuntimeException(e); - } - } - - @Override - public T executeCommandDecoded(String command) { - try { - return TarantoolContainerClientHelper.executeCommandDecoded(this, command, this.sslContext); + if (!isRunning()) { + throw new IllegalStateException("Cannot execute commands in stopped container"); + } + command = command.replace("\"", "\\\""); + String bashCommand = + String.format(ECHO_COMMAND_TEMPLATE, command, routerUsername, routerPassword, routerPort); + return execInContainer("/bin/sh", "-c", bashCommand); } catch (IOException | InterruptedException e) { throw new RuntimeException(e); } @@ -423,8 +395,7 @@ public boolean equals(Object o) { && directoryResourcePath.equals(that.directoryResourcePath) && instanceDir.equals(that.instanceDir) && configFile.equals(that.configFile) - && instancesFile.equals(that.instancesFile) - && Objects.equals(sslContext, that.sslContext); + && instancesFile.equals(that.instancesFile); } @Override @@ -441,7 +412,6 @@ public int hashCode() { directoryResourcePath, instanceDir, configFile, - instancesFile, - sslContext); + instancesFile); } } diff --git a/testcontainers/src/main/java/org/testcontainers/containers/utils/TarantoolContainerClientHelper.java b/testcontainers/src/main/java/org/testcontainers/containers/utils/TarantoolContainerClientHelper.java index 676a343c..23e080a1 100644 --- a/testcontainers/src/main/java/org/testcontainers/containers/utils/TarantoolContainerClientHelper.java +++ b/testcontainers/src/main/java/org/testcontainers/containers/utils/TarantoolContainerClientHelper.java @@ -24,7 +24,6 @@ import lombok.SneakyThrows; import org.testcontainers.containers.Container; import org.testcontainers.containers.Network; -import org.testcontainers.containers.TarantoolContainerOperations; import org.testcontainers.containers.tarantool.Tarantool2Container; import org.testcontainers.containers.tarantool.Tarantool3Container; import org.testcontainers.containers.tarantool.Tarantool3WaitStrategy; @@ -372,112 +371,4 @@ public static Container.ExecResult execInitScript(TarantoolContainer containe throw new RuntimeException(e); } } - - public static Container.ExecResult executeScript( - TarantoolContainerOperations container, String scriptResourcePath, SslContext sslContext) - throws IOException, InterruptedException { - if (!container.isRunning()) { - throw new IllegalStateException("Cannot execute scripts in stopped container"); - } - - String scriptName = Paths.get(scriptResourcePath).getFileName().toString(); - String containerPath = normalizePath(Paths.get(TMP_DIR, scriptName)); - container.copyFileToContainer( - MountableFile.forClasspathResource(scriptResourcePath), containerPath); - return executeCommand( - container, String.format("return dofile('%s')", containerPath), sslContext); - } - - public static T executeScriptDecoded( - TarantoolContainerOperations container, String scriptResourcePath, SslContext sslContext) - throws IOException, InterruptedException, ExecutionException { - Container.ExecResult result = executeScript(container, scriptResourcePath, sslContext); - - if (result.getExitCode() != 0) { - - if (result.getExitCode() == 3 || result.getExitCode() == 1) { - throw new ExecutionException( - String.format( - EXECUTE_SCRIPT_ERROR_TEMPLATE, - scriptResourcePath, - result.getExitCode(), - result.getStderr(), - result.getStdout()), - new Throwable()); - } - - throw new IllegalStateException( - String.format( - EXECUTE_SCRIPT_ERROR_TEMPLATE, - scriptResourcePath, - result.getExitCode(), - result.getStderr(), - result.getStdout())); - } - - return yaml.load(result.getStdout()); - } - - public static Container.ExecResult executeCommand( - TarantoolContainerOperations container, String command, SslContext sslContext) - throws IOException, InterruptedException { - if (!container.isRunning()) { - throw new IllegalStateException("Cannot execute commands in stopped container"); - } - - command = command.replace("\"", "\\\""); - command = command.replace("\'", "\\\'"); - - String bashCommand; - if (sslContext == null) { // No SSL - bashCommand = - String.format( - COMMAND_TEMPLATE, - container.getHost(), - container.getInternalPort(), - container.getUsername(), - container.getPassword(), - command); - } else if (sslContext.getKeyFile() != null && sslContext.getCertFile() != null) { // mTLS - bashCommand = - String.format( - MTLS_COMMAND_TEMPLATE, - container.getHost(), - container.getInternalPort(), - sslContext.getKeyFile(), - sslContext.getCertFile(), - container.getUsername(), - container.getPassword(), - command); - } else { // SSL - bashCommand = - String.format( - SSL_COMMAND_TEMPLATE, - container.getHost(), - container.getInternalPort(), - container.getUsername(), - container.getPassword(), - command); - } - - return container.execInContainer("sh", "-c", bashCommand); - } - - public static T executeCommandDecoded( - TarantoolContainerOperations container, String command, SslContext sslContext) - throws IOException, InterruptedException { - Container.ExecResult result = executeCommand(container, command, sslContext); - - if (result.getExitCode() != 0) { - throw new IllegalStateException( - String.format( - EXECUTE_COMMAND_ERROR_TEMPLATE, - command, - result.getExitCode(), - result.getStderr(), - result.getStdout())); - } - - return yaml.load(result.getStdout()); - } } From 81234ce8be8566d69577ca9bf91cc9ad5bd68329 Mon Sep 17 00:00:00 2001 From: Aleksandr Pavlyuk Date: Wed, 4 Mar 2026 15:09:29 +0300 Subject: [PATCH 2/3] feat(testcontainers): edit crud_aux.lua --- tarantool-shared-resources/cartridge/app/api/crud_aux.lua | 3 +++ tarantool-shared-resources/vshard_cluster/crud_aux.lua | 3 +++ 2 files changed, 6 insertions(+) diff --git a/tarantool-shared-resources/cartridge/app/api/crud_aux.lua b/tarantool-shared-resources/cartridge/app/api/crud_aux.lua index 0980fbc9..048d19a4 100644 --- a/tarantool-shared-resources/cartridge/app/api/crud_aux.lua +++ b/tarantool-shared-resources/cartridge/app/api/crud_aux.lua @@ -11,8 +11,11 @@ local crud_methods_to_patch = { 'update', 'upsert', 'insert_many', + 'insert_object_many', 'replace_many', + 'replace_object_many', 'upsert_many', + 'upsert_object_many', 'truncate', 'count', 'len', diff --git a/tarantool-shared-resources/vshard_cluster/crud_aux.lua b/tarantool-shared-resources/vshard_cluster/crud_aux.lua index 0980fbc9..048d19a4 100644 --- a/tarantool-shared-resources/vshard_cluster/crud_aux.lua +++ b/tarantool-shared-resources/vshard_cluster/crud_aux.lua @@ -11,8 +11,11 @@ local crud_methods_to_patch = { 'update', 'upsert', 'insert_many', + 'insert_object_many', 'replace_many', + 'replace_object_many', 'upsert_many', + 'upsert_object_many', 'truncate', 'count', 'len', From 8e032bb8b3e751f398038d99f42fccbb9d1d7de5 Mon Sep 17 00:00:00 2001 From: Aleksandr Pavlyuk Date: Wed, 4 Mar 2026 16:09:38 +0300 Subject: [PATCH 3/3] feat(testcontainers): edit vshard --- .../integration/TarantoolCrudClientTest.java | 18 +++++++++++------ .../vshard_cluster/Dockerfile | 2 +- .../integration/BaseIntegrationTest.java | 20 +++++++++++++------ .../integration/BaseIntegrationTest.java | 20 +++++++++++++------ .../integration/BaseIntegrationTest.java | 20 +++++++++++++------ .../integration/BaseIntegrationTest.java | 20 +++++++++++++------ .../integration/BaseIntegrationTest.java | 20 +++++++++++++------ .../integration/BaseIntegrationTest.java | 20 +++++++++++++------ .../containers/VshardClusterContainer.java | 6 ++++++ 9 files changed, 103 insertions(+), 43 deletions(-) diff --git a/tarantool-client/src/test/java/io/tarantool/client/integration/TarantoolCrudClientTest.java b/tarantool-client/src/test/java/io/tarantool/client/integration/TarantoolCrudClientTest.java index 82ee696c..a1160a74 100644 --- a/tarantool-client/src/test/java/io/tarantool/client/integration/TarantoolCrudClientTest.java +++ b/tarantool-client/src/test/java/io/tarantool/client/integration/TarantoolCrudClientTest.java @@ -45,9 +45,11 @@ import org.msgpack.value.ValueFactory; import org.slf4j.LoggerFactory; import org.testcontainers.containers.ClusterContainer; +import org.testcontainers.containers.Network; import org.testcontainers.containers.TarantoolCartridgeContainer; import org.testcontainers.containers.VshardClusterContainer; import org.testcontainers.containers.output.Slf4jLogConsumer; +import org.testcontainers.containers.wait.strategy.HostPortWaitStrategy; import org.testcontainers.junit.jupiter.Testcontainers; import static io.tarantool.client.crud.ConditionOperator.EQ; @@ -102,6 +104,7 @@ public class TarantoolCrudClientTest extends BaseTest { private static TarantoolCartridgeContainer cartridgeContainer; private static VshardClusterContainer vshardClusterContainer; private static ClusterContainer clusterContainer; + private static final Network NETWORK = Network.newNetwork(); public static final String ROUTER_1 = "ROUTER_1"; public static final String ROUTER_2 = "ROUTER_2"; private static TarantoolCrudClient client; @@ -131,16 +134,19 @@ public static void setUp() throws Exception { if (!isCartridgeAvailable()) { vshardClusterContainer = new VshardClusterContainer( - "vshard_cluster/Dockerfile", - dockerRegistry + "vshard-cluster-java", - "vshard_cluster/instances.yaml", - "vshard_cluster/config.yaml", - "tarantool/tarantool"); + "vshard_cluster/Dockerfile", + dockerRegistry + "vshard-cluster-java", + "vshard_cluster/instances.yaml", + "vshard_cluster/config.yaml", + "tarantool/tarantool") + .withNetwork(NETWORK) + .withWaitingStrategy(new HostPortWaitStrategy().forPorts(3301)); if (!vshardClusterContainer.isRunning()) { vshardClusterContainer .withCreateContainerCmdModifier(cmd -> cmd.withUser("root")) - .withPrivilegedMode(true); + .withPrivilegedMode(true) + .withStartupTimeout(Duration.ofMinutes(5)); vshardClusterContainer.start(); } clusterContainer = vshardClusterContainer; diff --git a/tarantool-shared-resources/vshard_cluster/Dockerfile b/tarantool-shared-resources/vshard_cluster/Dockerfile index 8178cd42..9e1bb53e 100644 --- a/tarantool-shared-resources/vshard_cluster/Dockerfile +++ b/tarantool-shared-resources/vshard_cluster/Dockerfile @@ -10,7 +10,7 @@ COPY "cluster" "$TARANTOOL_WORKDIR" # install dependencies RUN apt-get -y update && \ - apt-get -y install build-essential cmake make gcc git unzip cartridge-cli && \ + apt-get -y install build-essential cmake make gcc git unzip && \ apt-get -y clean CMD tt init && tt build && tt start && sleep infinity diff --git a/tarantool-spring-data/tarantool-spring-data-27/src/test/java/io/tarantool/spring/data27/integration/BaseIntegrationTest.java b/tarantool-spring-data/tarantool-spring-data-27/src/test/java/io/tarantool/spring/data27/integration/BaseIntegrationTest.java index c536b03c..628d90a1 100644 --- a/tarantool-spring-data/tarantool-spring-data-27/src/test/java/io/tarantool/spring/data27/integration/BaseIntegrationTest.java +++ b/tarantool-spring-data/tarantool-spring-data-27/src/test/java/io/tarantool/spring/data27/integration/BaseIntegrationTest.java @@ -14,9 +14,11 @@ import org.junit.jupiter.api.Timeout; import org.slf4j.LoggerFactory; import org.testcontainers.containers.ClusterContainer; +import org.testcontainers.containers.Network; import org.testcontainers.containers.TarantoolCartridgeContainer; import org.testcontainers.containers.VshardClusterContainer; import org.testcontainers.containers.output.Slf4jLogConsumer; +import org.testcontainers.containers.wait.strategy.HostPortWaitStrategy; import static io.tarantool.spring.data.utils.Constants.DEFAULT_PROPERTY_FILE_NAME; import static io.tarantool.spring.data27.utils.TarantoolTestSupport.DEFAULT_TEST_PROPERTY_DIR; @@ -28,6 +30,8 @@ public abstract class BaseIntegrationTest { protected static ClusterContainer clusterContainer; + private static final Network NETWORK = Network.newNetwork(); + private static final String dockerRegistry = System.getenv().getOrDefault("TESTCONTAINERS_HUB_IMAGE_NAME_PREFIX", ""); @@ -41,14 +45,18 @@ private static void configureContainer() { if (!isCartridgeAvailable()) { VshardClusterContainer vshardClusterContainer = new VshardClusterContainer( - "vshard_cluster/Dockerfile", - dockerRegistry + "vshard-cluster-java", - "vshard_cluster/instances.yaml", - "vshard_cluster/config.yaml", - "tarantool/tarantool"); + "vshard_cluster/Dockerfile", + dockerRegistry + "vshard-cluster-java", + "vshard_cluster/instances.yaml", + "vshard_cluster/config.yaml", + "tarantool/tarantool") + .withNetwork(NETWORK) + .withWaitingStrategy(new HostPortWaitStrategy().forPorts(3301)); if (!vshardClusterContainer.isRunning()) { - vshardClusterContainer.withPrivilegedMode(true); + vshardClusterContainer + .withPrivilegedMode(true) + .withStartupTimeout(Duration.ofMinutes(5)); vshardClusterContainer.start(); } clusterContainer = vshardClusterContainer; diff --git a/tarantool-spring-data/tarantool-spring-data-31/src/test/java/io/tarantool/spring/data31/integration/BaseIntegrationTest.java b/tarantool-spring-data/tarantool-spring-data-31/src/test/java/io/tarantool/spring/data31/integration/BaseIntegrationTest.java index 5a623ecd..34d073af 100644 --- a/tarantool-spring-data/tarantool-spring-data-31/src/test/java/io/tarantool/spring/data31/integration/BaseIntegrationTest.java +++ b/tarantool-spring-data/tarantool-spring-data-31/src/test/java/io/tarantool/spring/data31/integration/BaseIntegrationTest.java @@ -14,9 +14,11 @@ import org.junit.jupiter.api.Timeout; import org.slf4j.LoggerFactory; import org.testcontainers.containers.ClusterContainer; +import org.testcontainers.containers.Network; import org.testcontainers.containers.TarantoolCartridgeContainer; import org.testcontainers.containers.VshardClusterContainer; import org.testcontainers.containers.output.Slf4jLogConsumer; +import org.testcontainers.containers.wait.strategy.HostPortWaitStrategy; import static io.tarantool.spring.data.utils.Constants.DEFAULT_PROPERTY_FILE_NAME; import static io.tarantool.spring.data31.utils.TarantoolTestSupport.DEFAULT_TEST_PROPERTY_DIR; @@ -28,6 +30,8 @@ public abstract class BaseIntegrationTest { protected static ClusterContainer clusterContainer; + private static final Network NETWORK = Network.newNetwork(); + private static final String dockerRegistry = System.getenv().getOrDefault("TESTCONTAINERS_HUB_IMAGE_NAME_PREFIX", ""); @@ -41,14 +45,18 @@ private static void configureContainer() { if (!isCartridgeAvailable()) { VshardClusterContainer vshardClusterContainer = new VshardClusterContainer( - "vshard_cluster/Dockerfile", - dockerRegistry + "vshard-cluster-java", - "vshard_cluster/instances.yaml", - "vshard_cluster/config.yaml", - "tarantool/tarantool"); + "vshard_cluster/Dockerfile", + dockerRegistry + "vshard-cluster-java", + "vshard_cluster/instances.yaml", + "vshard_cluster/config.yaml", + "tarantool/tarantool") + .withNetwork(NETWORK) + .withWaitingStrategy(new HostPortWaitStrategy().forPorts(3301)); if (!vshardClusterContainer.isRunning()) { - vshardClusterContainer.withPrivilegedMode(true); + vshardClusterContainer + .withPrivilegedMode(true) + .withStartupTimeout(Duration.ofMinutes(5)); vshardClusterContainer.start(); } clusterContainer = vshardClusterContainer; diff --git a/tarantool-spring-data/tarantool-spring-data-32/src/test/java/io/tarantool/spring/data32/integration/BaseIntegrationTest.java b/tarantool-spring-data/tarantool-spring-data-32/src/test/java/io/tarantool/spring/data32/integration/BaseIntegrationTest.java index 5452c078..07fff38b 100644 --- a/tarantool-spring-data/tarantool-spring-data-32/src/test/java/io/tarantool/spring/data32/integration/BaseIntegrationTest.java +++ b/tarantool-spring-data/tarantool-spring-data-32/src/test/java/io/tarantool/spring/data32/integration/BaseIntegrationTest.java @@ -14,9 +14,11 @@ import org.junit.jupiter.api.Timeout; import org.slf4j.LoggerFactory; import org.testcontainers.containers.ClusterContainer; +import org.testcontainers.containers.Network; import org.testcontainers.containers.TarantoolCartridgeContainer; import org.testcontainers.containers.VshardClusterContainer; import org.testcontainers.containers.output.Slf4jLogConsumer; +import org.testcontainers.containers.wait.strategy.HostPortWaitStrategy; import static io.tarantool.spring.data.utils.Constants.DEFAULT_PROPERTY_FILE_NAME; import static io.tarantool.spring.data32.utils.TarantoolTestSupport.DEFAULT_TEST_PROPERTY_DIR; @@ -28,6 +30,8 @@ public abstract class BaseIntegrationTest { protected static ClusterContainer clusterContainer; + private static final Network NETWORK = Network.newNetwork(); + private static final String dockerRegistry = System.getenv().getOrDefault("TESTCONTAINERS_HUB_IMAGE_NAME_PREFIX", ""); @@ -41,14 +45,18 @@ private static void configureContainer() { if (!isCartridgeAvailable()) { VshardClusterContainer vshardClusterContainer = new VshardClusterContainer( - "vshard_cluster/Dockerfile", - dockerRegistry + "vshard-cluster-java", - "vshard_cluster/instances.yaml", - "vshard_cluster/config.yaml", - "tarantool/tarantool"); + "vshard_cluster/Dockerfile", + dockerRegistry + "vshard-cluster-java", + "vshard_cluster/instances.yaml", + "vshard_cluster/config.yaml", + "tarantool/tarantool") + .withNetwork(NETWORK) + .withWaitingStrategy(new HostPortWaitStrategy().forPorts(3301)); if (!vshardClusterContainer.isRunning()) { - vshardClusterContainer.withPrivilegedMode(true); + vshardClusterContainer + .withPrivilegedMode(true) + .withStartupTimeout(Duration.ofMinutes(5)); vshardClusterContainer.start(); } clusterContainer = vshardClusterContainer; diff --git a/tarantool-spring-data/tarantool-spring-data-33/src/test/java/io/tarantool/spring/data33/integration/BaseIntegrationTest.java b/tarantool-spring-data/tarantool-spring-data-33/src/test/java/io/tarantool/spring/data33/integration/BaseIntegrationTest.java index 2ea5c439..a69fbbba 100644 --- a/tarantool-spring-data/tarantool-spring-data-33/src/test/java/io/tarantool/spring/data33/integration/BaseIntegrationTest.java +++ b/tarantool-spring-data/tarantool-spring-data-33/src/test/java/io/tarantool/spring/data33/integration/BaseIntegrationTest.java @@ -14,9 +14,11 @@ import org.junit.jupiter.api.Timeout; import org.slf4j.LoggerFactory; import org.testcontainers.containers.ClusterContainer; +import org.testcontainers.containers.Network; import org.testcontainers.containers.TarantoolCartridgeContainer; import org.testcontainers.containers.VshardClusterContainer; import org.testcontainers.containers.output.Slf4jLogConsumer; +import org.testcontainers.containers.wait.strategy.HostPortWaitStrategy; import static io.tarantool.spring.data.utils.Constants.DEFAULT_PROPERTY_FILE_NAME; import static io.tarantool.spring.data33.utils.TarantoolTestSupport.DEFAULT_TEST_PROPERTY_DIR; @@ -28,6 +30,8 @@ public abstract class BaseIntegrationTest { protected static ClusterContainer clusterContainer; + private static final Network NETWORK = Network.newNetwork(); + private static final String dockerRegistry = System.getenv().getOrDefault("TESTCONTAINERS_HUB_IMAGE_NAME_PREFIX", ""); @@ -41,14 +45,18 @@ private static void configureContainer() { if (!isCartridgeAvailable()) { VshardClusterContainer vshardClusterContainer = new VshardClusterContainer( - "vshard_cluster/Dockerfile", - dockerRegistry + "vshard-cluster-java", - "vshard_cluster/instances.yaml", - "vshard_cluster/config.yaml", - "tarantool/tarantool"); + "vshard_cluster/Dockerfile", + dockerRegistry + "vshard-cluster-java", + "vshard_cluster/instances.yaml", + "vshard_cluster/config.yaml", + "tarantool/tarantool") + .withNetwork(NETWORK) + .withWaitingStrategy(new HostPortWaitStrategy().forPorts(3301)); if (!vshardClusterContainer.isRunning()) { - vshardClusterContainer.withPrivilegedMode(true); + vshardClusterContainer + .withPrivilegedMode(true) + .withStartupTimeout(Duration.ofMinutes(5)); vshardClusterContainer.start(); } clusterContainer = vshardClusterContainer; diff --git a/tarantool-spring-data/tarantool-spring-data-34/src/test/java/io/tarantool/spring/data34/integration/BaseIntegrationTest.java b/tarantool-spring-data/tarantool-spring-data-34/src/test/java/io/tarantool/spring/data34/integration/BaseIntegrationTest.java index df3eb68c..262ce8be 100644 --- a/tarantool-spring-data/tarantool-spring-data-34/src/test/java/io/tarantool/spring/data34/integration/BaseIntegrationTest.java +++ b/tarantool-spring-data/tarantool-spring-data-34/src/test/java/io/tarantool/spring/data34/integration/BaseIntegrationTest.java @@ -14,9 +14,11 @@ import org.junit.jupiter.api.Timeout; import org.slf4j.LoggerFactory; import org.testcontainers.containers.ClusterContainer; +import org.testcontainers.containers.Network; import org.testcontainers.containers.TarantoolCartridgeContainer; import org.testcontainers.containers.VshardClusterContainer; import org.testcontainers.containers.output.Slf4jLogConsumer; +import org.testcontainers.containers.wait.strategy.HostPortWaitStrategy; import static io.tarantool.spring.data.utils.Constants.DEFAULT_PROPERTY_FILE_NAME; import static io.tarantool.spring.data34.utils.TarantoolTestSupport.DEFAULT_TEST_PROPERTY_DIR; @@ -28,6 +30,8 @@ public abstract class BaseIntegrationTest { protected static ClusterContainer clusterContainer; + private static final Network NETWORK = Network.newNetwork(); + private static final String dockerRegistry = System.getenv().getOrDefault("TESTCONTAINERS_HUB_IMAGE_NAME_PREFIX", ""); @@ -41,14 +45,18 @@ private static void configureContainer() { if (!isCartridgeAvailable()) { VshardClusterContainer vshardClusterContainer = new VshardClusterContainer( - "vshard_cluster/Dockerfile", - dockerRegistry + "vshard-cluster-java", - "vshard_cluster/instances.yaml", - "vshard_cluster/config.yaml", - "tarantool/tarantool"); + "vshard_cluster/Dockerfile", + dockerRegistry + "vshard-cluster-java", + "vshard_cluster/instances.yaml", + "vshard_cluster/config.yaml", + "tarantool/tarantool") + .withNetwork(NETWORK) + .withWaitingStrategy(new HostPortWaitStrategy().forPorts(3301)); if (!vshardClusterContainer.isRunning()) { - vshardClusterContainer.withPrivilegedMode(true); + vshardClusterContainer + .withPrivilegedMode(true) + .withStartupTimeout(Duration.ofMinutes(5)); vshardClusterContainer.start(); } clusterContainer = vshardClusterContainer; diff --git a/tarantool-spring-data/tarantool-spring-data-35/src/test/java/io/tarantool/spring/data35/integration/BaseIntegrationTest.java b/tarantool-spring-data/tarantool-spring-data-35/src/test/java/io/tarantool/spring/data35/integration/BaseIntegrationTest.java index 9bef6dfe..617018c4 100644 --- a/tarantool-spring-data/tarantool-spring-data-35/src/test/java/io/tarantool/spring/data35/integration/BaseIntegrationTest.java +++ b/tarantool-spring-data/tarantool-spring-data-35/src/test/java/io/tarantool/spring/data35/integration/BaseIntegrationTest.java @@ -14,9 +14,11 @@ import org.junit.jupiter.api.Timeout; import org.slf4j.LoggerFactory; import org.testcontainers.containers.ClusterContainer; +import org.testcontainers.containers.Network; import org.testcontainers.containers.TarantoolCartridgeContainer; import org.testcontainers.containers.VshardClusterContainer; import org.testcontainers.containers.output.Slf4jLogConsumer; +import org.testcontainers.containers.wait.strategy.HostPortWaitStrategy; import static io.tarantool.spring.data.utils.Constants.DEFAULT_PROPERTY_FILE_NAME; import static io.tarantool.spring.data35.utils.TarantoolTestSupport.DEFAULT_TEST_PROPERTY_DIR; @@ -28,6 +30,8 @@ public abstract class BaseIntegrationTest { protected static ClusterContainer clusterContainer; + private static final Network NETWORK = Network.newNetwork(); + private static final String dockerRegistry = System.getenv().getOrDefault("TESTCONTAINERS_HUB_IMAGE_NAME_PREFIX", ""); @@ -41,14 +45,18 @@ private static void configureContainer() { if (!isCartridgeAvailable()) { VshardClusterContainer vshardClusterContainer = new VshardClusterContainer( - "vshard_cluster/Dockerfile", - dockerRegistry + "vshard-cluster-java", - "vshard_cluster/instances.yaml", - "vshard_cluster/config.yaml", - "tarantool/tarantool"); + "vshard_cluster/Dockerfile", + dockerRegistry + "vshard-cluster-java", + "vshard_cluster/instances.yaml", + "vshard_cluster/config.yaml", + "tarantool/tarantool") + .withNetwork(NETWORK) + .withWaitingStrategy(new HostPortWaitStrategy().forPorts(3301)); if (!vshardClusterContainer.isRunning()) { - vshardClusterContainer.withPrivilegedMode(true); + vshardClusterContainer + .withPrivilegedMode(true) + .withStartupTimeout(Duration.ofMinutes(5)); vshardClusterContainer.start(); } clusterContainer = vshardClusterContainer; diff --git a/testcontainers/src/main/java/org/testcontainers/containers/VshardClusterContainer.java b/testcontainers/src/main/java/org/testcontainers/containers/VshardClusterContainer.java index 94277b9b..67ed709c 100644 --- a/testcontainers/src/main/java/org/testcontainers/containers/VshardClusterContainer.java +++ b/testcontainers/src/main/java/org/testcontainers/containers/VshardClusterContainer.java @@ -19,6 +19,7 @@ import com.github.dockerjava.api.command.InspectContainerResponse; import lombok.Getter; import org.apache.commons.lang3.ArrayUtils; +import org.testcontainers.containers.wait.strategy.WaitStrategy; import org.testcontainers.images.builder.ImageFromDockerfile; import org.testcontainers.utility.MountableFile; @@ -148,6 +149,11 @@ public VshardClusterContainer withExposedPort(Integer port) { return this; } + public VshardClusterContainer withWaitingStrategy(WaitStrategy waitStrategy) { + waitingFor(waitStrategy); + return this; + } + protected static Map mergeBuildArguments(Map buildArgs) { Map args = new HashMap<>(buildArgs);