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..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 @@ -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,10 +44,12 @@ 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.Network; import org.testcontainers.containers.TarantoolCartridgeContainer; -import org.testcontainers.containers.TarantoolContainerOperations; 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; @@ -86,7 +87,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 +103,8 @@ 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; + 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; @@ -133,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-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-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/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-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', 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..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 @@ -11,24 +11,26 @@ 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.Network; import org.testcontainers.containers.TarantoolCartridgeContainer; -import org.testcontainers.containers.TarantoolContainerOperations; 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; 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 Network NETWORK = Network.newNetwork(); private static final String dockerRegistry = System.getenv().getOrDefault("TESTCONTAINERS_HUB_IMAGE_NAME_PREFIX", ""); @@ -43,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-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..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 @@ -11,24 +11,26 @@ 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.Network; import org.testcontainers.containers.TarantoolCartridgeContainer; -import org.testcontainers.containers.TarantoolContainerOperations; 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; 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 Network NETWORK = Network.newNetwork(); private static final String dockerRegistry = System.getenv().getOrDefault("TESTCONTAINERS_HUB_IMAGE_NAME_PREFIX", ""); @@ -43,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/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..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 @@ -11,24 +11,26 @@ 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.Network; import org.testcontainers.containers.TarantoolCartridgeContainer; -import org.testcontainers.containers.TarantoolContainerOperations; 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; 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 Network NETWORK = Network.newNetwork(); private static final String dockerRegistry = System.getenv().getOrDefault("TESTCONTAINERS_HUB_IMAGE_NAME_PREFIX", ""); @@ -43,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/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..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 @@ -11,24 +11,26 @@ 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.Network; import org.testcontainers.containers.TarantoolCartridgeContainer; -import org.testcontainers.containers.TarantoolContainerOperations; 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; 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 Network NETWORK = Network.newNetwork(); private static final String dockerRegistry = System.getenv().getOrDefault("TESTCONTAINERS_HUB_IMAGE_NAME_PREFIX", ""); @@ -43,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/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..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 @@ -11,24 +11,26 @@ 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.Network; import org.testcontainers.containers.TarantoolCartridgeContainer; -import org.testcontainers.containers.TarantoolContainerOperations; 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; 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 Network NETWORK = Network.newNetwork(); private static final String dockerRegistry = System.getenv().getOrDefault("TESTCONTAINERS_HUB_IMAGE_NAME_PREFIX", ""); @@ -43,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/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..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 @@ -11,24 +11,26 @@ 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.Network; import org.testcontainers.containers.TarantoolCartridgeContainer; -import org.testcontainers.containers.TarantoolContainerOperations; 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; 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 Network NETWORK = Network.newNetwork(); private static final String dockerRegistry = System.getenv().getOrDefault("TESTCONTAINERS_HUB_IMAGE_NAME_PREFIX", ""); @@ -43,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/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..67ed709c 100644 --- a/testcontainers/src/main/java/org/testcontainers/containers/VshardClusterContainer.java +++ b/testcontainers/src/main/java/org/testcontainers/containers/VshardClusterContainer.java @@ -7,28 +7,27 @@ 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.containers.wait.strategy.WaitStrategy; 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 +51,9 @@ public class VshardClusterContainer extends GenericContainer mergeBuildArguments(Map buildArgs) { Map args = new HashMap<>(buildArgs); @@ -189,34 +195,24 @@ protected static ImageFromDockerfile buildImage( : buildArgs.get("CLUSTER_SRC_DIR")); } - public int getRouterPort() { - if (useFixedPorts) { - return routerPort; - } - return getMappedPort(routerPort); - } - @Override public String getHost() { - return getRouterHost(); + return super.getHost(); } @Override - public int getPort() { - return getRouterPort(); + public Integer getMappedPort(int originalPort) { + return super.getMappedPort(originalPort); } @Override - public String getUsername() { - return getRouterUsername(); - } - - @Override - public String getPassword() { - return getRouterPassword(); + public int getPort() { + if (useFixedPorts) { + return routerPort; + } + return getMappedPort(routerPort); } - @Override public String getDirectoryBinding() { return directoryResourcePath; } @@ -227,16 +223,10 @@ public VshardClusterContainer withInstanceDir(String instanceDir) { return this; } - @Override public String getInstanceDir() { return instanceDir; } - @Override - public int getInternalPort() { - return routerPort; - } - public String getAPIHost() { return routerHost; } @@ -316,10 +306,7 @@ protected void containerIsStarted(InspectContainerResponse containerInfo, boolea logger().info("Tarantool vshard cluster cluster is started"); logger() - .info( - "Tarantool vshard cluster router is listening at {}:{}", - getRouterHost(), - getRouterPort()); + .info("Tarantool vshard cluster router is listening at {}:{}", getRouterHost(), getPort()); } protected void waitUntilCrudIsUp(int secondsToWait) { @@ -345,9 +332,17 @@ protected boolean waitUntilTrue(int secondsToWait, Supplier 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 +351,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 +401,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 +418,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()); - } }