diff --git a/pom.xml b/pom.xml
index 065dac5..9d82f36 100644
--- a/pom.xml
+++ b/pom.xml
@@ -91,11 +91,6 @@
1.2.3
test
-
- com.github.docker-java
- docker-java
- 3.2.13
-
diff --git a/src/main/java/org/testcontainers/containers/TarantoolCartridgeContainer.java b/src/main/java/org/testcontainers/containers/TarantoolCartridgeContainer.java
index 86e39ef..41772e3 100644
--- a/src/main/java/org/testcontainers/containers/TarantoolCartridgeContainer.java
+++ b/src/main/java/org/testcontainers/containers/TarantoolCartridgeContainer.java
@@ -7,12 +7,13 @@
import java.net.URL;
import java.util.Arrays;
import java.util.Collections;
+import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
-import java.util.concurrent.Future;
import java.util.concurrent.TimeoutException;
+import java.util.function.Supplier;
import static org.testcontainers.containers.PathUtils.normalizePath;
@@ -102,8 +103,11 @@ public class TarantoolCartridgeContainer extends GenericContainer buildArgs) {
- this(withArguments(buildImage(dockerFile, buildImageName), instancesFile, buildArgs),
- instancesFile, topologyConfigurationFile);
+ this(buildImage(dockerFile, buildImageName), instancesFile, topologyConfigurationFile, buildArgs);
}
+ private TarantoolCartridgeContainer(ImageFromDockerfile image, String instancesFile, String topologyConfigurationFile,
+ Map buildArgs) {
+ super(withBuildArgs(image, buildArgs));
+
+ TARANTOOL_RUN_DIR = mergeBuildArguments(buildArgs).getOrDefault(ENV_TARANTOOL_RUNDIR, "/tmp/run");
- private TarantoolCartridgeContainer(Future image, String instancesFile, String topologyConfigurationFile) {
- super(image);
if (instancesFile == null || instancesFile.isEmpty()) {
throw new IllegalArgumentException("Instance file name must not be null or empty");
}
if (topologyConfigurationFile == null || topologyConfigurationFile.isEmpty()) {
throw new IllegalArgumentException("Topology configuration file must not be null or empty");
}
- String fileType = topologyConfigurationFile.substring(topologyConfigurationFile.lastIndexOf('.') + 1);
- if (fileType.equals("lua")) {
- this.topologyConfigurationFile = topologyConfigurationFile;
- }else{
- this.replicasetsFileName = topologyConfigurationFile.substring(topologyConfigurationFile.lastIndexOf('/')+1);
- }
+ this.topologyConfigurationFile = topologyConfigurationFile;
this.instanceFileParser = new CartridgeConfigParser(instancesFile);
this.clientHelper = new TarantoolContainerClientHelper(this);
}
- private static Future withArguments(ImageFromDockerfile image, String instancesFile,
- final Map buildArgs) {
- if (!buildArgs.isEmpty()) {
- image.withBuildArgs(buildArgs);
+ private static ImageFromDockerfile withBuildArgs(ImageFromDockerfile image, Map buildArgs) {
+ Map args = mergeBuildArguments(buildArgs);
+
+ if (!args.isEmpty()) {
+ image.withBuildArgs(args);
}
+ return image;
+ }
+
+ private static Map mergeBuildArguments(Map buildArgs) {
+ Map args = new HashMap<>(buildArgs);
+
for (String envVariable : Arrays.asList(
ENV_TARANTOOL_VERSION,
ENV_TARANTOOL_SERVER_USER,
@@ -222,11 +229,11 @@ private static Future withArguments(ImageFromDockerfile image, String in
ENV_TARANTOOL_INSTANCES_FILE
)) {
String variableValue = System.getenv(envVariable);
- if (variableValue != null) {
- image.withBuildArg(envVariable, variableValue);
+ if (variableValue != null && !args.containsKey(envVariable)) {
+ args.put(envVariable, variableValue);
}
}
- return image;
+ return args;
}
private static ImageFromDockerfile buildImage(String dockerFile, String buildImageName) {
@@ -458,38 +465,25 @@ protected void containerIsStarting(InspectContainerResponse containerInfo) {
}
private boolean setupTopology() {
- if (topologyConfigurationFile == null) {
- String runDirPath = null;
- try {
- Container.ExecResult envVariablesContainer = this.execInContainer("env");
- String stdout = envVariablesContainer.getStdout();
- int exitCode = envVariablesContainer.getExitCode();
- if (exitCode != 0) {
- logger().error("Failed to bootstrap replica sets topology: {}", stdout);
- }
- int startInd = stdout.lastIndexOf(ENV_TARANTOOL_RUNDIR + "=");
- try {
- runDirPath = stdout.substring(startInd,
- stdout.indexOf('\n', startInd)).split("=")[1];
- } catch (Exception e) {
- logger().error("Missing dir-run environment variable: {}", e.getMessage());
- }
+ String fileType = topologyConfigurationFile.substring(topologyConfigurationFile.lastIndexOf('.') + 1);
- } catch (Exception e) {
- logger().error("Failed to get environment variables: {}", e.getMessage());
- }
+ if (fileType.equals("yml")) {
+ String replicasetsFileName = topologyConfigurationFile
+ .substring(topologyConfigurationFile.lastIndexOf('/') + 1);
try {
- Container.ExecResult lsResult = this.execInContainer("cartridge", "replicasets", "--run-dir=" + runDirPath,
- "--file=" + this.replicasetsFileName, "setup", "--bootstrap-vshard");
- String stdout = lsResult.getStdout();
- int exitCode = lsResult.getExitCode();
- if (exitCode != 0) {
- logger().error("Failed to bootstrap replica sets topology: {}", stdout);
+ Container.ExecResult result = execInContainer("cartridge",
+ "replicasets",
+ "--run-dir=" + TARANTOOL_RUN_DIR,
+ "--file=" + replicasetsFileName, "setup", "--bootstrap-vshard");
+ if (result.getExitCode() != 0) {
+ throw new RuntimeException("Failed to change the app topology via cartridge CLI: "
+ + result.getStdout());
}
} catch (Exception e) {
- logger().error("Failed to bootstrap replica sets topology: {}", e.getMessage());
+ throw new RuntimeException("Failed to change the app topology: " + e.getMessage());
}
+
} else {
try {
executeScript(topologyConfigurationFile).get();
@@ -539,7 +533,10 @@ private void bootstrapVshard() {
protected void containerIsStarted(InspectContainerResponse containerInfo, boolean reused) {
super.containerIsStarted(containerInfo, reused);
+ waitUntilRouterIsUp(60);
retryingSetupTopology();
+ // wait until Roles are configured
+ waitUntilCartridgeIsHealthy(10);
bootstrapVshard();
logger().info("Tarantool Cartridge cluster is started");
@@ -547,6 +544,54 @@ protected void containerIsStarted(InspectContainerResponse containerInfo, boolea
logger().info("Tarantool Cartridge HTTP API is available at {}:{}", getAPIHost(), getAPIPort());
}
+ private void waitUntilRouterIsUp(int secondsToWait) {
+ waitUntilTrue(secondsToWait, this::routerIsUp);
+ }
+
+ private void waitUntilCartridgeIsHealthy(int secondsToWait) {
+ waitUntilTrue(secondsToWait, this::isCartridgeHealthy);
+ }
+
+ private void waitUntilTrue(int secondsToWait, Supplier waitFunc) {
+ int secondsPassed = 0;
+ boolean result = waitFunc.get();
+ while (!result && secondsPassed < secondsToWait) {
+ result = waitFunc.get();
+ try {
+ Thread.sleep(1000);
+ } catch (InterruptedException e) {
+ break;
+ }
+ }
+ if (!result) {
+ throw new RuntimeException("Failed to change the app topology after retry");
+ }
+ }
+
+ private boolean routerIsUp() {
+ String healthyCmd = " local cartridge = package.loaded['cartridge']" +
+ " return assert(cartridge ~= nil)";
+ try {
+ List> result = executeCommand(healthyCmd).get();
+ return (Boolean) result.get(0);
+ } catch (Exception e) {
+ logger().warn("Error while waiting for router instance to be up: " + e.getMessage());
+ return false;
+ }
+ }
+
+ private boolean isCartridgeHealthy() {
+ String healthyCmd = " local cartridge = package.loaded['cartridge']" +
+ " return assert(cartridge) and assert(cartridge.is_healthy())";
+ try {
+ List> result = executeCommand(healthyCmd).get();
+ return (Boolean) result.get(0);
+ } catch (Exception e) {
+ logger().warn("Error while waiting for cartridge healthy state: " + e.getMessage());
+ return false;
+ }
+ }
+
@Override
public CompletableFuture> executeScript(String scriptResourcePath) throws Exception {
return clientHelper.executeScript(scriptResourcePath);
diff --git a/src/main/java/org/testcontainers/containers/TarantoolContainerClientHelper.java b/src/main/java/org/testcontainers/containers/TarantoolContainerClientHelper.java
index 6cf1272..bd4f12b 100644
--- a/src/main/java/org/testcontainers/containers/TarantoolContainerClientHelper.java
+++ b/src/main/java/org/testcontainers/containers/TarantoolContainerClientHelper.java
@@ -37,9 +37,9 @@ private TarantoolClient> createC
.withCredentials(container.getUsername(), container.getPassword())
.withAddress(container.getHost(), container.getPort())
.withRequestTimeout(5000)
- .withRetryingByNumberOfAttempts(10,
- TarantoolRequestRetryPolicies.retryNetworkErrors()
- .or(TarantoolRequestRetryPolicies.retryNetworkErrors()), b -> b.withDelay(100))
+ .withRetryingByNumberOfAttempts(15,
+ TarantoolRequestRetryPolicies.retryNetworkErrors(),
+ b -> b.withDelay(100))
.build();
}
diff --git a/src/main/java/org/testcontainers/containers/TarantoolContainerImageHelper.java b/src/main/java/org/testcontainers/containers/TarantoolContainerImageHelper.java
index bfab354..a42a29d 100644
--- a/src/main/java/org/testcontainers/containers/TarantoolContainerImageHelper.java
+++ b/src/main/java/org/testcontainers/containers/TarantoolContainerImageHelper.java
@@ -4,8 +4,7 @@
import com.github.dockerjava.api.command.BuildImageCmd;
import com.github.dockerjava.api.command.BuildImageResultCallback;
import com.github.dockerjava.api.model.Image;
-import com.github.dockerjava.core.DockerClientBuilder;
-import org.apache.commons.lang3.StringUtils;
+import org.testcontainers.DockerClientFactory;
import java.util.Arrays;
import java.util.Collection;
@@ -21,8 +20,6 @@
*/
class TarantoolContainerImageHelper {
- private static final DockerClient dockerClient = DockerClientBuilder.getInstance().build();
-
private TarantoolContainerImageHelper() {
}
@@ -35,7 +32,7 @@ private TarantoolContainerImageHelper() {
static String getImage(TarantoolImageParams imageParams) {
final String tag = imageParams.getTag();
- if (StringUtils.isEmpty(tag)) {
+ if (tag == null || tag.isEmpty()) {
throw new IllegalArgumentException("Image tag is null or empty!");
}
@@ -52,7 +49,7 @@ static String getImage(TarantoolImageParams imageParams) {
* @param imageParams parameters for building tarantool image
*/
private static void buildImage(TarantoolImageParams imageParams) {
- final BuildImageCmd buildImageCmd = dockerClient.buildImageCmd(imageParams.getDockerfile());
+ final BuildImageCmd buildImageCmd = getDockerClient().buildImageCmd(imageParams.getDockerfile());
final Map buildArgs = imageParams.getBuildArgs();
for (Map.Entry entry : buildArgs.entrySet()) {
@@ -71,11 +68,16 @@ private static void buildImage(TarantoolImageParams imageParams) {
* @return true if image exist and false if not
*/
private static boolean hasImage(String tag) {
- final List images = dockerClient.listImagesCmd().exec();
+ final List images = getDockerClient().listImagesCmd().exec();
return images.stream()
.map(Image::getRepoTags)
.map(Arrays::asList)
.flatMap(Collection::stream)
.anyMatch(repoTag -> repoTag.equals(tag));
}
+
+
+ private static DockerClient getDockerClient() {
+ return DockerClientFactory.instance().client();
+ }
}
diff --git a/src/main/resources/Dockerfile b/src/main/resources/Dockerfile
index 7e33c16..d25d795 100644
--- a/src/main/resources/Dockerfile
+++ b/src/main/resources/Dockerfile
@@ -1,9 +1,7 @@
FROM centos:7 AS tarantool-base
ARG TARANTOOL_VERSION=2.8
-ARG TARANTOOL_SERVER_USER="tarantool"
-ARG TARANTOOL_SERVER_UID=1000
-ARG TARANTOOL_SERVER_GROUP="tarantool"
-ARG TARANTOOL_SERVER_GID=1000
+ARG TARANTOOL_SERVER_USER="root"
+ARG TARANTOOL_SERVER_GROUP="root"
ARG TARANTOOL_WORKDIR="/app"
ARG TARANTOOL_RUNDIR="/tmp/run"
ARG TARANTOOL_DATADIR="/tmp/data"
@@ -15,9 +13,7 @@ ENV TARANTOOL_INSTANCES_FILE=$TARANTOOL_INSTANCES_FILE
RUN curl -L https://tarantool.io/installer.sh | VER=$TARANTOOL_VERSION /bin/bash -s -- --repo-only && \
yum -y install cmake make gcc gcc-c++ git unzip tarantool tarantool-devel cartridge-cli && \
yum clean all
-RUN groupadd -g $TARANTOOL_SERVER_GID $TARANTOOL_SERVER_GROUP && \
- useradd -u $TARANTOOL_SERVER_UID -g $TARANTOOL_SERVER_GID -m -s /bin/bash $TARANTOOL_SERVER_USER \
- || true
+RUN groupadd $TARANTOOL_SERVER_GROUP && useradd -m -s /bin/bash $TARANTOOL_SERVER_USER || true
USER $TARANTOOL_SERVER_USER:$TARANTOOL_SERVER_GROUP
RUN cartridge version
diff --git a/src/test/java/org/testcontainers/containers/TarantoolCartridgeBootstrapFromLuaWithFixedPortsTest.java b/src/test/java/org/testcontainers/containers/TarantoolCartridgeBootstrapFromLuaWithFixedPortsTest.java
new file mode 100644
index 0000000..cacd8b0
--- /dev/null
+++ b/src/test/java/org/testcontainers/containers/TarantoolCartridgeBootstrapFromLuaWithFixedPortsTest.java
@@ -0,0 +1,37 @@
+package org.testcontainers.containers;
+
+import org.junit.jupiter.api.Test;
+import org.slf4j.LoggerFactory;
+import org.testcontainers.containers.output.Slf4jLogConsumer;
+import org.testcontainers.junit.jupiter.Container;
+import org.testcontainers.junit.jupiter.Testcontainers;
+import org.testcontainers.utility.MountableFile;
+
+import java.time.Duration;
+
+/**
+ * @author Alexey Kuzin
+ */
+@Testcontainers
+public class TarantoolCartridgeBootstrapFromLuaWithFixedPortsTest {
+
+ @Container
+ private static final TarantoolCartridgeContainer container =
+ new TarantoolCartridgeContainer(
+ "Dockerfile",
+ "cartridge/instances_fixedport.yml",
+ "cartridge/topology_fixedport.lua")
+ .withCopyFileToContainer(MountableFile.forClasspathResource("cartridge"), "/app")
+ .withCopyFileToContainer(MountableFile.forClasspathResource("cartridge/instances_fixedport.yml"),"/app/instances.yml")
+ .withStartupTimeout(Duration.ofSeconds(300))
+ .withUseFixedPorts(true)
+ .withAPIPort(18081)
+ .withRouterPort(13301)
+ .withLogConsumer(new Slf4jLogConsumer(
+ LoggerFactory.getLogger(TarantoolCartridgeBootstrapFromLuaWithFixedPortsTest.class)));
+
+ @Test
+ public void test_StaticClusterContainer_StartsSuccessfully_ifFilesAreCopied() throws Exception {
+ CartridgeContainerTestUtils.executeProfileReplaceSmokeTest(container);
+ }
+}
diff --git a/src/test/java/org/testcontainers/containers/TarantoolCartridgeStaticContainerTest.java b/src/test/java/org/testcontainers/containers/TarantoolCartridgeBootstrapFromYamlTest.java
similarity index 58%
rename from src/test/java/org/testcontainers/containers/TarantoolCartridgeStaticContainerTest.java
rename to src/test/java/org/testcontainers/containers/TarantoolCartridgeBootstrapFromYamlTest.java
index 090667a..c13ceb6 100644
--- a/src/test/java/org/testcontainers/containers/TarantoolCartridgeStaticContainerTest.java
+++ b/src/test/java/org/testcontainers/containers/TarantoolCartridgeBootstrapFromYamlTest.java
@@ -1,32 +1,42 @@
package org.testcontainers.containers;
+import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.slf4j.LoggerFactory;
import org.testcontainers.containers.output.Slf4jLogConsumer;
import org.testcontainers.junit.jupiter.Container;
import org.testcontainers.junit.jupiter.Testcontainers;
+import org.testcontainers.utility.MountableFile;
import java.time.Duration;
+import java.util.List;
/**
* @author Alexey Kuzin
*/
@Testcontainers
-public class TarantoolCartridgeStaticContainerTest {
+public class TarantoolCartridgeBootstrapFromYamlTest {
@Container
private static final TarantoolCartridgeContainer container =
new TarantoolCartridgeContainer(
"Dockerfile",
"cartridge/instances.yml",
- "cartridge/topology.lua")
- .withDirectoryBinding("cartridge")
+ "cartridge/replicasets.yml")
+ .withCopyFileToContainer(MountableFile.forClasspathResource("cartridge"), "/app")
.withStartupTimeout(Duration.ofSeconds(300))
.withLogConsumer(new Slf4jLogConsumer(
- LoggerFactory.getLogger(TarantoolCartridgeStaticContainerTest.class)));
+ LoggerFactory.getLogger(TarantoolCartridgeBootstrapFromYamlTest.class)));
@Test
- public void test_StaticClusterContainer_StartsSuccessfully_ifDirectoryBindingIsUsed() throws Exception {
+ public void test_StaticClusterContainer_StartsSuccessfully_ifFilesAreCopied() throws Exception {
CartridgeContainerTestUtils.executeProfileReplaceSmokeTest(container);
}
+
+
+ @Test
+ public void test_migrator_executesOk() throws Exception {
+ List> result = container.executeCommand("return require('migrator').up()").get();
+ Assertions.assertEquals("001_ddl.lua", ((List>)result.get(0)).get(0));
+ }
}
diff --git a/src/test/java/org/testcontainers/containers/TarantoolCartridgeContainerReplicasetsTest.java b/src/test/java/org/testcontainers/containers/TarantoolCartridgeContainerReplicasetsTest.java
deleted file mode 100644
index 2efbb2c..0000000
--- a/src/test/java/org/testcontainers/containers/TarantoolCartridgeContainerReplicasetsTest.java
+++ /dev/null
@@ -1,41 +0,0 @@
-package org.testcontainers.containers;
-
-import org.junit.jupiter.api.Test;
-import org.slf4j.LoggerFactory;
-import org.testcontainers.containers.output.Slf4jLogConsumer;
-import org.testcontainers.utility.MountableFile;
-
-import java.time.Duration;
-import java.util.HashMap;
-import java.util.Map;
-
-public class TarantoolCartridgeContainerReplicasetsTest {
-
- @Test
- public void test_ClusterContainer_StartsSuccessfully_ifFilesAreCopiedUnderRoot() throws Exception {
- Map buildArgs = new HashMap() {
- {
- put("TARANTOOL_SERVER_USER", "root");
- put("TARANTOOL_SERVER_UID", "0");
- put("TARANTOOL_SERVER_GROUP", "root");
- put("TARANTOOL_SERVER_GID", "0");
- }
- };
- TarantoolCartridgeContainer container =
- new TarantoolCartridgeContainer(
- "Dockerfile",
- "testcontainers-java-tarantool:test",
- "cartridge/instances.yml",
- "cartridge/replicasets.yml",
- buildArgs)
- .withCopyFileToContainer(MountableFile.forClasspathResource("cartridge"), "/app")
- .withStartupTimeout(Duration.ofSeconds(300))
- .withLogConsumer(new Slf4jLogConsumer(
- LoggerFactory.getLogger(TarantoolCartridgeContainerReplicasetsTest.class)));
-
- container.start();
- CartridgeContainerTestUtils.executeProfileReplaceSmokeTest(container);
- if (container.isRunning())
- container.stop();
- }
-}
diff --git a/src/test/java/org/testcontainers/containers/TarantoolCartridgeContainerTest.java b/src/test/java/org/testcontainers/containers/TarantoolCartridgeContainerTest.java
deleted file mode 100644
index 14a79a1..0000000
--- a/src/test/java/org/testcontainers/containers/TarantoolCartridgeContainerTest.java
+++ /dev/null
@@ -1,81 +0,0 @@
-package org.testcontainers.containers;
-
-import org.junit.jupiter.api.Test;
-import org.slf4j.LoggerFactory;
-import org.testcontainers.containers.output.Slf4jLogConsumer;
-import org.testcontainers.containers.wait.strategy.Wait;
-import org.testcontainers.utility.MountableFile;
-
-import java.time.Duration;
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * @author Vladimir Rogach
- */
-public class TarantoolCartridgeContainerTest {
-
- @Test
- public void test_ClusterContainer_StartsSuccessfully_ifFilesAreCopiedUnderRoot() throws Exception {
- Map buildArgs = new HashMap() {
- {
- put("TARANTOOL_SERVER_USER", "root");
- put("TARANTOOL_SERVER_UID", "0");
- put("TARANTOOL_SERVER_GROUP", "root");
- put("TARANTOOL_SERVER_GID", "0");
- }
- };
- TarantoolCartridgeContainer container =
- new TarantoolCartridgeContainer(
- "Dockerfile",
- "testcontainers-java-tarantool:test",
- "cartridge/instances.yml",
- "cartridge/topology.lua",
- buildArgs)
- .withCopyFileToContainer(MountableFile.forClasspathResource("cartridge"), "/app")
- .withStartupTimeout(Duration.ofSeconds(300))
- .withLogConsumer(new Slf4jLogConsumer(
- LoggerFactory.getLogger(TarantoolCartridgeContainerTest.class)));
-
- container.start();
- CartridgeContainerTestUtils.executeProfileReplaceSmokeTest(container);
- if(container.isRunning())
- container.stop();
- }
-
- @Test
- public void test_ClusterContainer_StartsSuccessfully_ifFixedPortsAreConfigured() throws Exception {
- Map buildArgs = new HashMap() {
- {
- put("TARANTOOL_SERVER_USER", "root");
- put("TARANTOOL_SERVER_UID", "0");
- put("TARANTOOL_SERVER_GROUP", "root");
- put("TARANTOOL_SERVER_GID", "0");
- }
- };
-
- TarantoolCartridgeContainer container =
- new TarantoolCartridgeContainer(
- "Dockerfile",
- "testcontainers-java-tarantool-fixport:test",
- "cartridge/instances_fixedport.yml",
- "cartridge/topology_fixedport.lua",
- buildArgs)
- .withCopyFileToContainer(MountableFile.forClasspathResource("cartridge"), "/app")
- .withCopyFileToContainer(MountableFile.forClasspathResource("cartridge/instances_fixedport.yml"),"/app/instances.yml")
- .withStartupTimeout(Duration.ofSeconds(300))
- .withUseFixedPorts(true)
- .withAPIPort(18081)
- .withRouterPort(13301)
- .waitingFor(
- Wait.forLogMessage(".*Listening HTTP on.*", 2)
- )
- .withLogConsumer(new Slf4jLogConsumer(
- LoggerFactory.getLogger(TarantoolCartridgeContainerTest.class)));
-
- container.start();
- CartridgeContainerTestUtils.executeProfileReplaceSmokeTest(container);
- if(container.isRunning())
- container.stop();
- }
-}
diff --git a/src/test/java/org/testcontainers/containers/TarantoolCartridgeMigrationsTest.java b/src/test/java/org/testcontainers/containers/TarantoolCartridgeMigrationsTest.java
deleted file mode 100644
index da54cc3..0000000
--- a/src/test/java/org/testcontainers/containers/TarantoolCartridgeMigrationsTest.java
+++ /dev/null
@@ -1,124 +0,0 @@
-package org.testcontainers.containers;
-
-import org.junit.Assert;
-import org.junit.jupiter.api.AfterAll;
-import org.junit.jupiter.api.BeforeAll;
-import org.junit.jupiter.api.Test;
-import org.slf4j.LoggerFactory;
-import org.testcontainers.containers.output.Slf4jLogConsumer;
-import org.testcontainers.junit.jupiter.Container;
-import org.testcontainers.junit.jupiter.Testcontainers;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.io.OutputStream;
-import java.net.HttpURLConnection;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.nio.charset.StandardCharsets;
-import java.time.Duration;
-import java.util.HashMap;
-import java.util.Map;
-
-@Testcontainers
-public class TarantoolCartridgeMigrationsTest {
-
- @Container
- private static final TarantoolCartridgeContainer container =
- new TarantoolCartridgeContainer(
- "Dockerfile",
- "cartridge/instances.yml",
- "cartridge/topology.lua")
- .withDirectoryBinding("cartridge")
- .withStartupTimeout(Duration.ofSeconds(300))
- .withLogConsumer(new Slf4jLogConsumer(
- LoggerFactory.getLogger(TarantoolCartridgeStaticContainerTest.class)));
-
- @BeforeAll
- public static void test_start_container() {
- if (!container.isRunning()) {
- try {
- container.start();
- } catch (Exception e) {
- throw new RuntimeException(e);
- }
- }
- }
-
- @AfterAll
- public static void clear_stop_container() {
- if (container.isRunning()) {
- container.stop();
- }
- }
-
- @Test
- public void test_migrations_migrator() throws Exception {
- container.executeCommand("require('migrator').up()").get();
- }
-
- @Test
- public void test_migrations_curl() throws IOException, InterruptedException {
-
- String urlStr = "http://" + container.getRouterHost() + ":" + "8081" + "/migrations/up";
- int code = -1;
- org.testcontainers.containers.Container.ExecResult answer = container.execInContainer("curl", "-X", "POST", urlStr);
- code = answer.getExitCode();
- Assert.assertEquals(0, code);
- }
-
- @Test
- public void test_migrations_http() throws Exception {
-
- HttpURLConnection connection;
- OutputStream os = null;
- InputStreamReader inputStreamReader = null;
- BufferedReader bfR = null;
- StringBuilder strBuilder = new StringBuilder();
-
- Map bodyHttpPostRequest = new HashMap<>();
- byte[] outSteamByte = bodyHttpPostRequest.toString().getBytes(StandardCharsets.UTF_8);
-
- try {
- String urlStr = "http://" + container.getRouterHost() + ":" + container.getAPIPort() + "/migrations/up";
- connection = createConnection(urlStr);
- os = connection.getOutputStream();
- os.write(outSteamByte);
-
- if (connection.getResponseCode() == HttpURLConnection.HTTP_OK) {
- inputStreamReader = new InputStreamReader(connection.getInputStream());
- bfR = new BufferedReader(inputStreamReader);
- String line;
- while ((line = bfR.readLine()) != null) {
- strBuilder.append(line);
- }
- }
-
- } catch (MalformedURLException ex) {
- } catch (IOException e) {
- } finally {
- inputStreamReader.close();
- os.close();
- bfR.close();
- }
- Assert.assertTrue(strBuilder.toString().contains("applied"));
- }
-
- public HttpURLConnection createConnection(String urlStr) throws IOException {
- HttpURLConnection connection = null;
- URL url = new URL(urlStr);
-
- connection = (HttpURLConnection) url.openConnection();
- connection.setRequestMethod("POST");
- connection.setDoOutput(true);
- connection.setDoInput(true);
- connection.setRequestProperty("Content-Type", "application/json");
- connection.setConnectTimeout(200);
- connection.setReadTimeout(200);
- connection.connect();
-
- return connection;
- }
-
-}
diff --git a/src/test/resources/cartridge/app/roles/api_storage.lua b/src/test/resources/cartridge/app/roles/api_storage.lua
index 109e204..e3a7e36 100644
--- a/src/test/resources/cartridge/app/roles/api_storage.lua
+++ b/src/test/resources/cartridge/app/roles/api_storage.lua
@@ -28,33 +28,6 @@ local function init_space()
unique = false,
if_not_exists = true,
})
-
- local test_space = box.schema.space.create(
- 'test_space', -- имя спейса для хранения профилей
- {
- -- формат хранимых кортежей
- format = {
- {'id', 'unsigned'},
- {'bucket_id', 'unsigned'},
- {'field1', 'string'},
- {'field2', 'unsigned'},
- },
- -- создадим спейс, только если его не было
- if_not_exists = true,
- }
- )
-
- -- создадим индекс по id профиля
- test_space:create_index('id', {
- parts = {'id'},
- if_not_exists = true,
- })
-
- test_space:create_index('bucket_id', {
- parts = {'bucket_id'},
- unique = false,
- if_not_exists = true,
- })
end
local function profile_storage_select(id)
diff --git a/src/test/resources/cartridge/migrations/001_ddl.lua b/src/test/resources/cartridge/migrations/001_ddl.lua
new file mode 100644
index 0000000..2909bab
--- /dev/null
+++ b/src/test/resources/cartridge/migrations/001_ddl.lua
@@ -0,0 +1,23 @@
+return{
+ up = function()
+ local space = box.schema.space.create('test_space', { if_not_exists = true })
+ space:format({
+ { name = 'bucket_id', type = 'unsigned', is_nullable = false },
+ { name = 'test_id', type = 'integer' },
+ { name = 'test_data', type = 'string' },
+ })
+
+ space:create_index('primary', { parts = { { field = 'test_id' } },
+ unique = true,
+ if_not_exists = true })
+
+ space:create_index('bucket_id', {
+ parts = { 'bucket_id' },
+ unique = false,
+ if_not_exists = true
+ })
+
+ require('migrator.utils').register_sharding_key('test_space', { 'test_id' })
+ return true
+ end
+}
diff --git "a/src/test/resources/cartridge/migrations/001_spa\321\201e_test.lua" "b/src/test/resources/cartridge/migrations/001_spa\321\201e_test.lua"
deleted file mode 100644
index 89dc336..0000000
--- "a/src/test/resources/cartridge/migrations/001_spa\321\201e_test.lua"
+++ /dev/null
@@ -1,31 +0,0 @@
-return{
-
- up = function()
- local utils = require('migrator.utils')
-
- local spaceTest = box.schema.space.create('spaceTest', { if_not_exists = true })
- spaceTest:format({
- { name = 'sessionId', type = 'string' },
- { name = 'data', type = 'map', is_nullable = true },
- { name = 'ts', type = 'number' },
-
- -- vshard bucket id
- { name = 'bucket_id', type = 'unsigned', is_nullable = false },
- })
-
- spaceTest:create_index('primary', { parts = { { field = 'sessionId' } },
- unique = true,
- if_not_exists = true })
-
- spaceTest:create_index('bucket_id', {
- parts = { 'bucket_id' },
- unique = false,
- if_not_exists = true
- })
-
- utils.register_sharding_key('spaceTest', { 'sessionId' })
-
- return true
-
- end
-}
diff --git a/src/test/resources/cartridge/testapp-scm-1.rockspec b/src/test/resources/cartridge/testapp-scm-1.rockspec
index 62fe199..7fb36b6 100644
--- a/src/test/resources/cartridge/testapp-scm-1.rockspec
+++ b/src/test/resources/cartridge/testapp-scm-1.rockspec
@@ -7,9 +7,10 @@ source = {
dependencies = {
'tarantool',
'lua >= 5.1',
+ -- Be careful when updating to 2.7.4. Tarantool doesn't bind ports before roles are configured.
'cartridge == 2.7.3-1',
- 'crud == 0.10.0-1',
- 'migrations == 0.4.1-1',
+ 'crud == 0.11.1-1',
+ 'migrations == 0.4.2-1',
}
build = {
type = 'none';