From 2e1358e59d374c4a521a902d99cd19764d651f93 Mon Sep 17 00:00:00 2001 From: "CMX\\vlutsenko" Date: Mon, 18 Apr 2022 12:38:20 +0500 Subject: [PATCH 01/13] Maven dependen --- pom.xml | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index add9853..d3dc322 100644 --- a/pom.xml +++ b/pom.xml @@ -53,6 +53,8 @@ UTF-8 ${project.basedir}/src/test/resources/logback-test.xml debug + 2.13.2 + 2.13.2.2 @@ -91,6 +93,23 @@ 1.2.3 test + + io.tarantool + testcontainers-java-tarantool + 0.4.7 + + + + + com.fasterxml.jackson.dataformat + jackson-dataformat-yaml + ${version.jackson.dataformat} + + + com.fasterxml.jackson.core + jackson-databind + ${version.jackson.databind} + @@ -263,4 +282,4 @@ https://oss.sonatype.org/service/local/staging/deploy/maven2/ - \ No newline at end of file + From 6bae67651baad1759ccfe1ccb9a4a2ba39337af3 Mon Sep 17 00:00:00 2001 From: "CMX\\vlutsenko" Date: Tue, 19 Apr 2022 11:10:16 +0500 Subject: [PATCH 02/13] Add command cartridge setup replicasets bootstrap-vshard --- pom.xml | 22 +++--- .../containers/CartridgeTopologyParser.java | 68 +++++++++++++++++++ .../TarantoolCartridgeContainer.java | 47 +++++++------ 3 files changed, 106 insertions(+), 31 deletions(-) create mode 100644 src/main/java/org/testcontainers/containers/CartridgeTopologyParser.java diff --git a/pom.xml b/pom.xml index d3dc322..b75258d 100644 --- a/pom.xml +++ b/pom.xml @@ -99,17 +99,17 @@ 0.4.7 - - - com.fasterxml.jackson.dataformat - jackson-dataformat-yaml - ${version.jackson.dataformat} - - - com.fasterxml.jackson.core - jackson-databind - ${version.jackson.databind} - + + + + + + + + + + + diff --git a/src/main/java/org/testcontainers/containers/CartridgeTopologyParser.java b/src/main/java/org/testcontainers/containers/CartridgeTopologyParser.java new file mode 100644 index 0000000..60cf99d --- /dev/null +++ b/src/main/java/org/testcontainers/containers/CartridgeTopologyParser.java @@ -0,0 +1,68 @@ +package org.testcontainers.containers; + +import org.yaml.snakeyaml.Yaml; +import sun.invoke.empty.Empty; + +import java.io.InputStream; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.concurrent.atomic.AtomicReference; +import java.util.regex.Pattern; +import java.util.stream.Collectors; + +public class CartridgeTopologyParser { + + private final AtomicReference>> instances = new AtomicReference<>(); + + public CartridgeTopologyParser(String replicasetsFileName) { + Yaml yaml = new Yaml(); + InputStream inputStream = this.getClass() + .getClassLoader() + .getResourceAsStream(replicasetsFileName); + instances.set(Collections.unmodifiableMap(yaml.load(inputStream))); + } + + public void getInstancesName(){ + List> nods = instances.get().values().stream() + .map(Noda::new) + .map(Noda::getRolesNod) + .filter(Objects::nonNull) + .collect(Collectors.toList()); + } + + static class Noda{ + private final String regxStrRouter = "^router"; + private final String regexStrStorage = "^s."; + private final Pattern patternRouter = Pattern.compile(regxStrRouter, Pattern.CASE_INSENSITIVE); + private final Pattern patternStorage = Pattern.compile(regexStrStorage, Pattern.CASE_INSENSITIVE); + private String noda; + private String[] instances; + private String[] roles; + private Integer weight; + private boolean allRW; + private String vshardGroup; + + public Noda(Map map){ + + this.noda = (map.get(patternRouter) != null) ? (String) map.get(patternRouter): (String) map.get(patternStorage); + if(patternStorage.matcher(this.noda).matches()){ + this.weight = (Integer) map.get(""); + } + this.instances = (String[]) map.get("instances"); + this.roles = (String[]) map.get("roles"); + this.allRW = (boolean) map.get("all_rw"); + this.vshardGroup = (String) map.get("vshard_group"); + } + + public HashMap getRolesNod(){ + HashMap map = new HashMap(); + map.put(noda, roles); + return map; + } + + } + +} diff --git a/src/main/java/org/testcontainers/containers/TarantoolCartridgeContainer.java b/src/main/java/org/testcontainers/containers/TarantoolCartridgeContainer.java index c2c82f6..3de701d 100644 --- a/src/main/java/org/testcontainers/containers/TarantoolCartridgeContainer.java +++ b/src/main/java/org/testcontainers/containers/TarantoolCartridgeContainer.java @@ -1,5 +1,6 @@ package org.testcontainers.containers; +import com.github.dockerjava.api.command.CreateContainerCmd; import com.github.dockerjava.api.command.InspectContainerResponse; import io.tarantool.driver.exceptions.TarantoolConnectionException; import org.testcontainers.images.builder.ImageFromDockerfile; @@ -90,6 +91,7 @@ public class TarantoolCartridgeContainer extends GenericContainer image, String instancesFile, String topologyConfigurationFile) { + private TarantoolCartridgeContainer(Future image, String instancesFile, String topologyreolicaSetsFile) { super(image); if (instancesFile == null || instancesFile.isEmpty()) { throw new IllegalArgumentException("Instance file name must not be null or empty"); } this.instanceFileParser = new CartridgeConfigParser(instancesFile); - this.topologyConfigurationFile = topologyConfigurationFile; + this.reolicaSetsTopologyParser = new CartridgeTopologyParser(topologyreolicaSetsFile); +// this.topologyConfigurationFile = topologyConfigurationFile; this.clientHelper = new TarantoolContainerClientHelper(this); } @@ -451,23 +455,26 @@ protected void containerIsStarting(InspectContainerResponse containerInfo) { } private boolean setupTopology() { - try { - executeScript(topologyConfigurationFile).get(); - // The client connection will be closed after that command - } catch (Exception e) { - if (e instanceof ExecutionException) { - if (e.getCause() instanceof TimeoutException) { - return true; - // Do nothing, the cluster is reloading - } else if (e.getCause() instanceof TarantoolConnectionException) { - // Probably cluster is not ready - logger().error("Failed to setup topology: {}", e.getMessage()); - return false; - } - } else { - throw new RuntimeException("Failed to change the app topology", e); - } - } + String dockerImageName = getDockerImageName(); + CreateContainerCmd createCommand = dockerClient.createContainerCmd(dockerImageName); + createCommand.withCmd(REPLICASETS_BOOTSTRAP_VSHARD_COMMAND); +// try { +// executeScript(topologyConfigurationFile).get(); +// // The client connection will be closed after that command +// } catch (Exception e) { +// if (e instanceof ExecutionException) { +// if (e.getCause() instanceof TimeoutException) { +// return true; +// // Do nothing, the cluster is reloading +// } else if (e.getCause() instanceof TarantoolConnectionException) { +// // Probably cluster is not ready +// logger().error("Failed to setup topology: {}", e.getMessage()); +// return false; +// } +// } else { +// throw new RuntimeException("Failed to change the app topology", e); +// } +// } return true; } From 0f5ace375dd8c261d92f6bc92fe6ec2acab022d1 Mon Sep 17 00:00:00 2001 From: "CMX\\vlutsenko" Date: Wed, 20 Apr 2022 17:11:31 +0500 Subject: [PATCH 03/13] Add command cartridge setup replicasets bootstrap-vshard --- pom.xml | 11 +++ .../TarantoolCartridgeContainer.java | 28 +++++-- ...toolCartridgeContainerReplicasetsTest.java | 81 +++++++++++++++++++ src/test/resources/cartridge/replicasets.yml | 18 +++++ .../cartridge/replicasets_fixedport.yml | 18 +++++ 5 files changed, 148 insertions(+), 8 deletions(-) create mode 100644 src/test/java/org/testcontainers/containers/TarantoolCartridgeContainerReplicasetsTest.java create mode 100644 src/test/resources/cartridge/replicasets.yml create mode 100644 src/test/resources/cartridge/replicasets_fixedport.yml diff --git a/pom.xml b/pom.xml index b75258d..d230ff9 100644 --- a/pom.xml +++ b/pom.xml @@ -62,6 +62,17 @@ org.testcontainers testcontainers ${testcontainers.version} + + + junit + junit + + + + + junit + junit + 4.12 io.tarantool diff --git a/src/main/java/org/testcontainers/containers/TarantoolCartridgeContainer.java b/src/main/java/org/testcontainers/containers/TarantoolCartridgeContainer.java index 3de701d..54e7b51 100644 --- a/src/main/java/org/testcontainers/containers/TarantoolCartridgeContainer.java +++ b/src/main/java/org/testcontainers/containers/TarantoolCartridgeContainer.java @@ -91,7 +91,7 @@ public class TarantoolCartridgeContainer extends GenericContainer image, String instancesFile, String topologyreolicaSetsFile) { + private TarantoolCartridgeContainer(Future image, String instancesFile, String topology) { super(image); if (instancesFile == null || instancesFile.isEmpty()) { throw new IllegalArgumentException("Instance file name must not be null or empty"); } this.instanceFileParser = new CartridgeConfigParser(instancesFile); - this.reolicaSetsTopologyParser = new CartridgeTopologyParser(topologyreolicaSetsFile); -// this.topologyConfigurationFile = topologyConfigurationFile; + if(topology.contains("replicasets")){ + this.reolicaSetsTopologyParser = new CartridgeTopologyParser(topology); + this.topologyConfigurationFile = ""; + } + else{ + this.reolicaSetsTopologyParser = null; + this.topologyConfigurationFile = topology; + } this.clientHelper = new TarantoolContainerClientHelper(this); } @@ -455,9 +461,15 @@ protected void containerIsStarting(InspectContainerResponse containerInfo) { } private boolean setupTopology() { - String dockerImageName = getDockerImageName(); - CreateContainerCmd createCommand = dockerClient.createContainerCmd(dockerImageName); - createCommand.withCmd(REPLICASETS_BOOTSTRAP_VSHARD_COMMAND); + CreateContainerCmd createCommand = dockerClient.createContainerCmd(getDockerImageName()); + try{ + createCommand.withCmd(REPLICASETS_BOOTSTRAP_VSHARD_COMMAND); + createCommand.exec(); + createCommand.close(); + }catch (Exception e){ + logger().error("Failed to bootstrap replica sets topology: {}",e.getMessage()); + } + // try { // executeScript(topologyConfigurationFile).get(); // // The client connection will be closed after that command diff --git a/src/test/java/org/testcontainers/containers/TarantoolCartridgeContainerReplicasetsTest.java b/src/test/java/org/testcontainers/containers/TarantoolCartridgeContainerReplicasetsTest.java new file mode 100644 index 0000000..d88dd03 --- /dev/null +++ b/src/test/java/org/testcontainers/containers/TarantoolCartridgeContainerReplicasetsTest.java @@ -0,0 +1,81 @@ +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 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(); + } + +// @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/replicasets_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(TarantoolCartridgeContainerReplicasetsTest.class))); +// +// container.start(); +// CartridgeContainerTestUtils.executeProfileReplaceSmokeTest(container); +// if(container.isRunning()) +// container.stop(); +// } +} diff --git a/src/test/resources/cartridge/replicasets.yml b/src/test/resources/cartridge/replicasets.yml new file mode 100644 index 0000000..18fcb20 --- /dev/null +++ b/src/test/resources/cartridge/replicasets.yml @@ -0,0 +1,18 @@ +router: + instances: + - router + roles: + - failover-coordinator + - vshard-router + - app.roles.custom + - app.roles.api_router + all_rw: false +s-1: + instances: + - s1-master + roles: + - vshard-storage + - app.roles.api_storage + weight: 1 + all_rw: false + vshard_group: default diff --git a/src/test/resources/cartridge/replicasets_fixedport.yml b/src/test/resources/cartridge/replicasets_fixedport.yml new file mode 100644 index 0000000..18fcb20 --- /dev/null +++ b/src/test/resources/cartridge/replicasets_fixedport.yml @@ -0,0 +1,18 @@ +router: + instances: + - router + roles: + - failover-coordinator + - vshard-router + - app.roles.custom + - app.roles.api_router + all_rw: false +s-1: + instances: + - s1-master + roles: + - vshard-storage + - app.roles.api_storage + weight: 1 + all_rw: false + vshard_group: default From 713395ece57b9eb79a4417d68412a340471b1781 Mon Sep 17 00:00:00 2001 From: "CMX\\vlutsenko" Date: Wed, 20 Apr 2022 17:29:49 +0500 Subject: [PATCH 04/13] Add cmd command cartridge setup replicasets bootstrap-vshard --- .../TarantoolCartridgeContainer.java | 54 ++++++++++--------- ...toolCartridgeContainerReplicasetsTest.java | 38 ------------- 2 files changed, 28 insertions(+), 64 deletions(-) diff --git a/src/main/java/org/testcontainers/containers/TarantoolCartridgeContainer.java b/src/main/java/org/testcontainers/containers/TarantoolCartridgeContainer.java index 54e7b51..7308465 100644 --- a/src/main/java/org/testcontainers/containers/TarantoolCartridgeContainer.java +++ b/src/main/java/org/testcontainers/containers/TarantoolCartridgeContainer.java @@ -197,7 +197,7 @@ private TarantoolCartridgeContainer(Future image, String instancesFile, this.instanceFileParser = new CartridgeConfigParser(instancesFile); if(topology.contains("replicasets")){ this.reolicaSetsTopologyParser = new CartridgeTopologyParser(topology); - this.topologyConfigurationFile = ""; + this.topologyConfigurationFile = null; } else{ this.reolicaSetsTopologyParser = null; @@ -461,32 +461,34 @@ protected void containerIsStarting(InspectContainerResponse containerInfo) { } private boolean setupTopology() { - CreateContainerCmd createCommand = dockerClient.createContainerCmd(getDockerImageName()); - try{ - createCommand.withCmd(REPLICASETS_BOOTSTRAP_VSHARD_COMMAND); - createCommand.exec(); - createCommand.close(); - }catch (Exception e){ - logger().error("Failed to bootstrap replica sets topology: {}",e.getMessage()); + if(topologyConfigurationFile == null) { + CreateContainerCmd createCommand = dockerClient.createContainerCmd(getDockerImageName()); + try { + createCommand.withCmd(REPLICASETS_BOOTSTRAP_VSHARD_COMMAND); + createCommand.exec(); + createCommand.close(); + } catch (Exception e) { + logger().error("Failed to bootstrap replica sets topology: {}", e.getMessage()); + } + }else { + try { + executeScript(topologyConfigurationFile).get(); + // The client connection will be closed after that command + } catch (Exception e) { + if (e instanceof ExecutionException) { + if (e.getCause() instanceof TimeoutException) { + return true; + // Do nothing, the cluster is reloading + } else if (e.getCause() instanceof TarantoolConnectionException) { + // Probably cluster is not ready + logger().error("Failed to setup topology: {}", e.getMessage()); + return false; + } + } else { + throw new RuntimeException("Failed to change the app topology", e); + } + } } - -// try { -// executeScript(topologyConfigurationFile).get(); -// // The client connection will be closed after that command -// } catch (Exception e) { -// if (e instanceof ExecutionException) { -// if (e.getCause() instanceof TimeoutException) { -// return true; -// // Do nothing, the cluster is reloading -// } else if (e.getCause() instanceof TarantoolConnectionException) { -// // Probably cluster is not ready -// logger().error("Failed to setup topology: {}", e.getMessage()); -// return false; -// } -// } else { -// throw new RuntimeException("Failed to change the app topology", e); -// } -// } return true; } diff --git a/src/test/java/org/testcontainers/containers/TarantoolCartridgeContainerReplicasetsTest.java b/src/test/java/org/testcontainers/containers/TarantoolCartridgeContainerReplicasetsTest.java index d88dd03..4999574 100644 --- a/src/test/java/org/testcontainers/containers/TarantoolCartridgeContainerReplicasetsTest.java +++ b/src/test/java/org/testcontainers/containers/TarantoolCartridgeContainerReplicasetsTest.java @@ -10,9 +10,6 @@ import java.util.HashMap; import java.util.Map; -/** - * @author Vladimir Rogach - */ public class TarantoolCartridgeContainerReplicasetsTest { @Test @@ -43,39 +40,4 @@ public void test_ClusterContainer_StartsSuccessfully_ifFilesAreCopiedUnderRoot() 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/replicasets_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(TarantoolCartridgeContainerReplicasetsTest.class))); -// -// container.start(); -// CartridgeContainerTestUtils.executeProfileReplaceSmokeTest(container); -// if(container.isRunning()) -// container.stop(); -// } } From 865e2d59d7366b81cef44aa885f48a7f1617f83b Mon Sep 17 00:00:00 2001 From: "CMX\\vlutsenko" Date: Wed, 20 Apr 2022 17:32:36 +0500 Subject: [PATCH 05/13] Clear pom.xml --- pom.xml | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/pom.xml b/pom.xml index d230ff9..7c0cb07 100644 --- a/pom.xml +++ b/pom.xml @@ -53,8 +53,6 @@ UTF-8 ${project.basedir}/src/test/resources/logback-test.xml debug - 2.13.2 - 2.13.2.2 @@ -109,18 +107,6 @@ testcontainers-java-tarantool 0.4.7 - - - - - - - - - - - - From ba4ab9b1cbdd9434282e148f7e67147e308ee0d8 Mon Sep 17 00:00:00 2001 From: "CMX\\vlutsenko" Date: Wed, 20 Apr 2022 17:41:10 +0500 Subject: [PATCH 06/13] Clear pom.xml --- pom.xml | 5 ----- 1 file changed, 5 deletions(-) diff --git a/pom.xml b/pom.xml index 7c0cb07..ffb6536 100644 --- a/pom.xml +++ b/pom.xml @@ -102,11 +102,6 @@ 1.2.3 test - - io.tarantool - testcontainers-java-tarantool - 0.4.7 - From cd74ac88eed9a3994d88f668f7bfac008eaa44c3 Mon Sep 17 00:00:00 2001 From: "CMX\\vlutsenko" Date: Wed, 20 Apr 2022 17:45:21 +0500 Subject: [PATCH 07/13] Code typo fix --- .../containers/TarantoolCartridgeContainer.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/testcontainers/containers/TarantoolCartridgeContainer.java b/src/main/java/org/testcontainers/containers/TarantoolCartridgeContainer.java index 7308465..72d95da 100644 --- a/src/main/java/org/testcontainers/containers/TarantoolCartridgeContainer.java +++ b/src/main/java/org/testcontainers/containers/TarantoolCartridgeContainer.java @@ -114,7 +114,7 @@ public class TarantoolCartridgeContainer extends GenericContainer image, String instancesFile, } this.instanceFileParser = new CartridgeConfigParser(instancesFile); if(topology.contains("replicasets")){ - this.reolicaSetsTopologyParser = new CartridgeTopologyParser(topology); + this.replicaSetsTopologyParser = new CartridgeTopologyParser(topology); this.topologyConfigurationFile = null; } else{ - this.reolicaSetsTopologyParser = null; + this.replicaSetsTopologyParser = null; this.topologyConfigurationFile = topology; } this.clientHelper = new TarantoolContainerClientHelper(this); From 8bd246758c2f01044a250fde124bd418a635e189 Mon Sep 17 00:00:00 2001 From: "CMX\\vlutsenko" Date: Thu, 21 Apr 2022 16:42:10 +0500 Subject: [PATCH 08/13] Change execute command bootstrap topology --- .../containers/TarantoolCartridgeContainer.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/testcontainers/containers/TarantoolCartridgeContainer.java b/src/main/java/org/testcontainers/containers/TarantoolCartridgeContainer.java index 72d95da..566cb7d 100644 --- a/src/main/java/org/testcontainers/containers/TarantoolCartridgeContainer.java +++ b/src/main/java/org/testcontainers/containers/TarantoolCartridgeContainer.java @@ -462,11 +462,13 @@ protected void containerIsStarting(InspectContainerResponse containerInfo) { private boolean setupTopology() { if(topologyConfigurationFile == null) { - CreateContainerCmd createCommand = dockerClient.createContainerCmd(getDockerImageName()); try { - createCommand.withCmd(REPLICASETS_BOOTSTRAP_VSHARD_COMMAND); - createCommand.exec(); - createCommand.close(); + Container.ExecResult lsResult = this.execInContainer(REPLICASETS_BOOTSTRAP_VSHARD_COMMAND); + String stdout = lsResult.getStdout(); + int exitCode = lsResult.getExitCode(); + if(exitCode != 0){ + logger().error("Failed to bootstrap replica sets topology"); + } } catch (Exception e) { logger().error("Failed to bootstrap replica sets topology: {}", e.getMessage()); } From 85f5c9b681f3307271b29714e723d3d9b349ac69 Mon Sep 17 00:00:00 2001 From: "CMX\\vlutsenko" Date: Mon, 25 Apr 2022 19:08:09 +0500 Subject: [PATCH 09/13] Works --- .../containers/CartridgeTopologyParser.java | 41 ++++++----- .../TarantoolCartridgeContainer.java | 71 +++++++++++++++---- ...toolCartridgeContainerReplicasetsTest.java | 36 +++++++++- 3 files changed, 115 insertions(+), 33 deletions(-) diff --git a/src/main/java/org/testcontainers/containers/CartridgeTopologyParser.java b/src/main/java/org/testcontainers/containers/CartridgeTopologyParser.java index 60cf99d..64b3d69 100644 --- a/src/main/java/org/testcontainers/containers/CartridgeTopologyParser.java +++ b/src/main/java/org/testcontainers/containers/CartridgeTopologyParser.java @@ -1,14 +1,16 @@ package org.testcontainers.containers; import org.yaml.snakeyaml.Yaml; -import sun.invoke.empty.Empty; import java.io.InputStream; +import java.util.Arrays; import java.util.Collections; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.Set; import java.util.concurrent.atomic.AtomicReference; import java.util.regex.Pattern; import java.util.stream.Collectors; @@ -25,41 +27,42 @@ public CartridgeTopologyParser(String replicasetsFileName) { instances.set(Collections.unmodifiableMap(yaml.load(inputStream))); } - public void getInstancesName(){ - List> nods = instances.get().values().stream() + public List>> getInstancesName(){ + List>> nods = instances.get().values().stream() .map(Noda::new) - .map(Noda::getRolesNod) + .map(Noda::getRolesInstances) .filter(Objects::nonNull) .collect(Collectors.toList()); + return nods; } static class Noda{ private final String regxStrRouter = "^router"; - private final String regexStrStorage = "^s."; private final Pattern patternRouter = Pattern.compile(regxStrRouter, Pattern.CASE_INSENSITIVE); - private final Pattern patternStorage = Pattern.compile(regexStrStorage, Pattern.CASE_INSENSITIVE); - private String noda; - private String[] instances; - private String[] roles; + private boolean router; + private Set instances; + private List roles; private Integer weight; private boolean allRW; private String vshardGroup; public Noda(Map map){ - - this.noda = (map.get(patternRouter) != null) ? (String) map.get(patternRouter): (String) map.get(patternStorage); - if(patternStorage.matcher(this.noda).matches()){ - this.weight = (Integer) map.get(""); + List x = (List) map.get("instances"); + this.instances = new HashSet(x); + this.router = this.instances.stream().filter(i -> patternRouter.matcher(i).matches()).count() > 0 ? true : false; + if(!this.router){ + this.weight = (Integer) map.get("weight"); + this.vshardGroup = (String) map.get("vshard_group"); } - this.instances = (String[]) map.get("instances"); - this.roles = (String[]) map.get("roles"); + this.roles = (List) map.get("roles"); this.allRW = (boolean) map.get("all_rw"); - this.vshardGroup = (String) map.get("vshard_group"); } - public HashMap getRolesNod(){ - HashMap map = new HashMap(); - map.put(noda, roles); + public HashMap> getRolesInstances(){ + HashMap> map = new HashMap>(); + for(String instan : this.instances){ + map.put(instan,this.roles); + } return map; } diff --git a/src/main/java/org/testcontainers/containers/TarantoolCartridgeContainer.java b/src/main/java/org/testcontainers/containers/TarantoolCartridgeContainer.java index 566cb7d..c1c3d67 100644 --- a/src/main/java/org/testcontainers/containers/TarantoolCartridgeContainer.java +++ b/src/main/java/org/testcontainers/containers/TarantoolCartridgeContainer.java @@ -8,8 +8,10 @@ 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.Set; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; @@ -91,9 +93,9 @@ public class TarantoolCartridgeContainer extends GenericContainer buildArgs) { + this(withArguments(buildImage(dockerFile, buildImageName), instancesFile, buildArgs), + instancesFile); + } + private TarantoolCartridgeContainer(Future image, String instancesFile, String topology) { super(image); if (instancesFile == null || instancesFile.isEmpty()) { throw new IllegalArgumentException("Instance file name must not be null or empty"); } this.instanceFileParser = new CartridgeConfigParser(instancesFile); - if(topology.contains("replicasets")){ - this.replicaSetsTopologyParser = new CartridgeTopologyParser(topology); - this.topologyConfigurationFile = null; - } - else{ - this.replicaSetsTopologyParser = null; - this.topologyConfigurationFile = topology; + this.replicaSetsTopologyParser = new CartridgeTopologyParser(REPLICASETS_FILE); + this.topologyConfigurationFile = topology; + this.clientHelper = new TarantoolContainerClientHelper(this); + } + + /** + * + * @param image Describe image + * @param instancesFile URL resource path to instances.yml relative in the classpath + */ + private TarantoolCartridgeContainer(Future image, String instancesFile) { + super(image); + if (instancesFile == null || instancesFile.isEmpty()) { + throw new IllegalArgumentException("Instance file name must not be null or empty"); } + this.replicaSetsTopologyParser = new CartridgeTopologyParser(REPLICASETS_FILE); + this.instanceFileParser = new CartridgeConfigParser(instancesFile); this.clientHelper = new TarantoolContainerClientHelper(this); } @@ -462,12 +487,32 @@ 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()); + } + + }catch (Exception e){ + logger().error("Failed to get environment variables: {}", e.getMessage()); + } + try { - Container.ExecResult lsResult = this.execInContainer(REPLICASETS_BOOTSTRAP_VSHARD_COMMAND); + Container.ExecResult lsResult = this.execInContainer("cartridge", "replicasets", "--run-dir="+runDirPath, "setup", "--bootstrap-vshard"); String stdout = lsResult.getStdout(); int exitCode = lsResult.getExitCode(); if(exitCode != 0){ - logger().error("Failed to bootstrap replica sets topology"); + logger().error("Failed to bootstrap replica sets topology: {}", stdout); } } catch (Exception e) { logger().error("Failed to bootstrap replica sets topology: {}", e.getMessage()); diff --git a/src/test/java/org/testcontainers/containers/TarantoolCartridgeContainerReplicasetsTest.java b/src/test/java/org/testcontainers/containers/TarantoolCartridgeContainerReplicasetsTest.java index 4999574..ff3ecb3 100644 --- a/src/test/java/org/testcontainers/containers/TarantoolCartridgeContainerReplicasetsTest.java +++ b/src/test/java/org/testcontainers/containers/TarantoolCartridgeContainerReplicasetsTest.java @@ -27,7 +27,6 @@ public void test_ClusterContainer_StartsSuccessfully_ifFilesAreCopiedUnderRoot() "Dockerfile", "testcontainers-java-tarantool:test", "cartridge/instances.yml", - "cartridge/replicasets.yml", buildArgs) .withCopyFileToContainer(MountableFile.forClasspathResource("cartridge"), "/app") .withStartupTimeout(Duration.ofSeconds(300)) @@ -40,4 +39,39 @@ public void test_ClusterContainer_StartsSuccessfully_ifFilesAreCopiedUnderRoot() 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", + 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(); + } + } From 6970826d72f0fd30ced1713227c59329131c561b Mon Sep 17 00:00:00 2001 From: "CMX\\vlutsenko" Date: Tue, 26 Apr 2022 16:27:16 +0500 Subject: [PATCH 10/13] Refactoring --- ...logyParser.java => ReplicasetsParser.java} | 33 +++++---- .../TarantoolCartridgeContainer.java | 70 ++++++------------- ...toolCartridgeContainerReplicasetsTest.java | 37 +--------- .../cartridge/replicasets_fixedport.yml | 18 ----- 4 files changed, 37 insertions(+), 121 deletions(-) rename src/main/java/org/testcontainers/containers/{CartridgeTopologyParser.java => ReplicasetsParser.java} (75%) delete mode 100644 src/test/resources/cartridge/replicasets_fixedport.yml diff --git a/src/main/java/org/testcontainers/containers/CartridgeTopologyParser.java b/src/main/java/org/testcontainers/containers/ReplicasetsParser.java similarity index 75% rename from src/main/java/org/testcontainers/containers/CartridgeTopologyParser.java rename to src/main/java/org/testcontainers/containers/ReplicasetsParser.java index 64b3d69..7a7b138 100644 --- a/src/main/java/org/testcontainers/containers/CartridgeTopologyParser.java +++ b/src/main/java/org/testcontainers/containers/ReplicasetsParser.java @@ -3,7 +3,6 @@ import org.yaml.snakeyaml.Yaml; import java.io.InputStream; -import java.util.Arrays; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; @@ -15,11 +14,11 @@ import java.util.regex.Pattern; import java.util.stream.Collectors; -public class CartridgeTopologyParser { +public class ReplicasetsParser { private final AtomicReference>> instances = new AtomicReference<>(); - public CartridgeTopologyParser(String replicasetsFileName) { + public ReplicasetsParser(String replicasetsFileName) { Yaml yaml = new Yaml(); InputStream inputStream = this.getClass() .getClassLoader() @@ -27,30 +26,30 @@ public CartridgeTopologyParser(String replicasetsFileName) { instances.set(Collections.unmodifiableMap(yaml.load(inputStream))); } - public List>> getInstancesName(){ + public List>> getInstancesName() { List>> nods = instances.get().values().stream() - .map(Noda::new) - .map(Noda::getRolesInstances) + .map(Replicaset::new) + .map(Replicaset::getRolesInstances) .filter(Objects::nonNull) .collect(Collectors.toList()); return nods; } - static class Noda{ + static class Replicaset { private final String regxStrRouter = "^router"; private final Pattern patternRouter = Pattern.compile(regxStrRouter, Pattern.CASE_INSENSITIVE); - private boolean router; - private Set instances; - private List roles; + private final boolean router; + private final Set instances; + private final List roles; private Integer weight; - private boolean allRW; + private final boolean allRW; private String vshardGroup; - public Noda(Map map){ + public Replicaset(Map map) { List x = (List) map.get("instances"); this.instances = new HashSet(x); - this.router = this.instances.stream().filter(i -> patternRouter.matcher(i).matches()).count() > 0 ? true : false; - if(!this.router){ + this.router = this.instances.stream().filter(i -> patternRouter.matcher(i).matches()).count() > 0; + if (!this.router) { this.weight = (Integer) map.get("weight"); this.vshardGroup = (String) map.get("vshard_group"); } @@ -58,10 +57,10 @@ public Noda(Map map){ this.allRW = (boolean) map.get("all_rw"); } - public HashMap> getRolesInstances(){ + public HashMap> getRolesInstances() { HashMap> map = new HashMap>(); - for(String instan : this.instances){ - map.put(instan,this.roles); + for (String instance : this.instances) { + map.put(instance, this.roles); } return map; } diff --git a/src/main/java/org/testcontainers/containers/TarantoolCartridgeContainer.java b/src/main/java/org/testcontainers/containers/TarantoolCartridgeContainer.java index c1c3d67..1517bd8 100644 --- a/src/main/java/org/testcontainers/containers/TarantoolCartridgeContainer.java +++ b/src/main/java/org/testcontainers/containers/TarantoolCartridgeContainer.java @@ -1,6 +1,5 @@ package org.testcontainers.containers; -import com.github.dockerjava.api.command.CreateContainerCmd; import com.github.dockerjava.api.command.InspectContainerResponse; import io.tarantool.driver.exceptions.TarantoolConnectionException; import org.testcontainers.images.builder.ImageFromDockerfile; @@ -8,10 +7,8 @@ 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.Set; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; @@ -95,7 +92,6 @@ public class TarantoolCartridgeContainer extends GenericContainer buildArgs) { - this(withArguments(buildImage(dockerFile, buildImageName), instancesFile, buildArgs), - instancesFile); - } - private TarantoolCartridgeContainer(Future image, String instancesFile, String topology) { + 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"); } - this.instanceFileParser = new CartridgeConfigParser(instancesFile); - this.replicaSetsTopologyParser = new CartridgeTopologyParser(REPLICASETS_FILE); - this.topologyConfigurationFile = topology; - this.clientHelper = new TarantoolContainerClientHelper(this); - } - - /** - * - * @param image Describe image - * @param instancesFile URL resource path to instances.yml relative in the classpath - */ - private TarantoolCartridgeContainer(Future image, String instancesFile) { - 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 instances = topologyConfigurationFile.substring(topologyConfigurationFile.lastIndexOf('.') + 1); + if (instances.equals("lua")) { + this.topologyConfigurationFile = topologyConfigurationFile; } - this.replicaSetsTopologyParser = new CartridgeTopologyParser(REPLICASETS_FILE); this.instanceFileParser = new CartridgeConfigParser(instancesFile); this.clientHelper = new TarantoolContainerClientHelper(this); } @@ -486,38 +456,38 @@ protected void containerIsStarting(InspectContainerResponse containerInfo) { } private boolean setupTopology() { - if(topologyConfigurationFile == null) { + if (topologyConfigurationFile == null) { String runDirPath = null; - try{ + try { Container.ExecResult envVariablesContainer = this.execInContainer("env"); String stdout = envVariablesContainer.getStdout(); - int exitCode =envVariablesContainer.getExitCode(); - if(exitCode != 0){ + int exitCode = envVariablesContainer.getExitCode(); + if (exitCode != 0) { logger().error("Failed to bootstrap replica sets topology: {}", stdout); } int startInd = stdout.lastIndexOf(ENV_TARANTOOL_RUNDIR + "="); - try{ + try { runDirPath = stdout.substring(startInd, - stdout.indexOf('\n',startInd)).split("=")[1]; - }catch (Exception e){ + stdout.indexOf('\n', startInd)).split("=")[1]; + } catch (Exception e) { logger().error("Missing dir-run environment variable: {}", e.getMessage()); } - }catch (Exception e){ + } catch (Exception e) { logger().error("Failed to get environment variables: {}", e.getMessage()); } try { - Container.ExecResult lsResult = this.execInContainer("cartridge", "replicasets", "--run-dir="+runDirPath, "setup", "--bootstrap-vshard"); + Container.ExecResult lsResult = this.execInContainer("cartridge", "replicasets", "--run-dir=" + runDirPath, "setup", "--bootstrap-vshard"); String stdout = lsResult.getStdout(); int exitCode = lsResult.getExitCode(); - if(exitCode != 0){ + if (exitCode != 0) { logger().error("Failed to bootstrap replica sets topology: {}", stdout); } } catch (Exception e) { logger().error("Failed to bootstrap replica sets topology: {}", e.getMessage()); } - }else { + } else { try { executeScript(topologyConfigurationFile).get(); // The client connection will be closed after that command diff --git a/src/test/java/org/testcontainers/containers/TarantoolCartridgeContainerReplicasetsTest.java b/src/test/java/org/testcontainers/containers/TarantoolCartridgeContainerReplicasetsTest.java index ff3ecb3..aa03637 100644 --- a/src/test/java/org/testcontainers/containers/TarantoolCartridgeContainerReplicasetsTest.java +++ b/src/test/java/org/testcontainers/containers/TarantoolCartridgeContainerReplicasetsTest.java @@ -27,6 +27,7 @@ public void test_ClusterContainer_StartsSuccessfully_ifFilesAreCopiedUnderRoot() "Dockerfile", "testcontainers-java-tarantool:test", "cartridge/instances.yml", + "cartridge/replicasets.yml", buildArgs) .withCopyFileToContainer(MountableFile.forClasspathResource("cartridge"), "/app") .withStartupTimeout(Duration.ofSeconds(300)) @@ -38,40 +39,4 @@ public void test_ClusterContainer_StartsSuccessfully_ifFilesAreCopiedUnderRoot() 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", - 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/resources/cartridge/replicasets_fixedport.yml b/src/test/resources/cartridge/replicasets_fixedport.yml deleted file mode 100644 index 18fcb20..0000000 --- a/src/test/resources/cartridge/replicasets_fixedport.yml +++ /dev/null @@ -1,18 +0,0 @@ -router: - instances: - - router - roles: - - failover-coordinator - - vshard-router - - app.roles.custom - - app.roles.api_router - all_rw: false -s-1: - instances: - - s1-master - roles: - - vshard-storage - - app.roles.api_storage - weight: 1 - all_rw: false - vshard_group: default From 68e4da3e75a9d1f14a5ef0697777dc49be3186c5 Mon Sep 17 00:00:00 2001 From: "CMX\\vlutsenko" Date: Tue, 26 Apr 2022 16:38:14 +0500 Subject: [PATCH 11/13] Refactoring --- .../containers/ReplicasetsParser.java | 70 ------------------- 1 file changed, 70 deletions(-) delete mode 100644 src/main/java/org/testcontainers/containers/ReplicasetsParser.java diff --git a/src/main/java/org/testcontainers/containers/ReplicasetsParser.java b/src/main/java/org/testcontainers/containers/ReplicasetsParser.java deleted file mode 100644 index 7a7b138..0000000 --- a/src/main/java/org/testcontainers/containers/ReplicasetsParser.java +++ /dev/null @@ -1,70 +0,0 @@ -package org.testcontainers.containers; - -import org.yaml.snakeyaml.Yaml; - -import java.io.InputStream; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Set; -import java.util.concurrent.atomic.AtomicReference; -import java.util.regex.Pattern; -import java.util.stream.Collectors; - -public class ReplicasetsParser { - - private final AtomicReference>> instances = new AtomicReference<>(); - - public ReplicasetsParser(String replicasetsFileName) { - Yaml yaml = new Yaml(); - InputStream inputStream = this.getClass() - .getClassLoader() - .getResourceAsStream(replicasetsFileName); - instances.set(Collections.unmodifiableMap(yaml.load(inputStream))); - } - - public List>> getInstancesName() { - List>> nods = instances.get().values().stream() - .map(Replicaset::new) - .map(Replicaset::getRolesInstances) - .filter(Objects::nonNull) - .collect(Collectors.toList()); - return nods; - } - - static class Replicaset { - private final String regxStrRouter = "^router"; - private final Pattern patternRouter = Pattern.compile(regxStrRouter, Pattern.CASE_INSENSITIVE); - private final boolean router; - private final Set instances; - private final List roles; - private Integer weight; - private final boolean allRW; - private String vshardGroup; - - public Replicaset(Map map) { - List x = (List) map.get("instances"); - this.instances = new HashSet(x); - this.router = this.instances.stream().filter(i -> patternRouter.matcher(i).matches()).count() > 0; - if (!this.router) { - this.weight = (Integer) map.get("weight"); - this.vshardGroup = (String) map.get("vshard_group"); - } - this.roles = (List) map.get("roles"); - this.allRW = (boolean) map.get("all_rw"); - } - - public HashMap> getRolesInstances() { - HashMap> map = new HashMap>(); - for (String instance : this.instances) { - map.put(instance, this.roles); - } - return map; - } - - } - -} From afb20f6e1a6fad27d28ab50c982a79e606197ed5 Mon Sep 17 00:00:00 2001 From: "CMX\\vlutsenko" Date: Tue, 26 Apr 2022 16:54:20 +0500 Subject: [PATCH 12/13] Refactoring. Return JUnit --- pom.xml | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/pom.xml b/pom.xml index ffb6536..ad5b812 100644 --- a/pom.xml +++ b/pom.xml @@ -60,17 +60,6 @@ org.testcontainers testcontainers ${testcontainers.version} - - - junit - junit - - - - - junit - junit - 4.12 io.tarantool From e782c729140e3cbdeb93f95a95f69b1bd2b14ee2 Mon Sep 17 00:00:00 2001 From: "CMX\\vlutsenko" Date: Wed, 27 Apr 2022 15:45:56 +0500 Subject: [PATCH 13/13] Refactoring 2 --- .../containers/TarantoolCartridgeContainer.java | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/testcontainers/containers/TarantoolCartridgeContainer.java b/src/main/java/org/testcontainers/containers/TarantoolCartridgeContainer.java index 1517bd8..86e39ef 100644 --- a/src/main/java/org/testcontainers/containers/TarantoolCartridgeContainer.java +++ b/src/main/java/org/testcontainers/containers/TarantoolCartridgeContainer.java @@ -113,6 +113,7 @@ public class TarantoolCartridgeContainer extends GenericContainer image, String instancesFile, if (topologyConfigurationFile == null || topologyConfigurationFile.isEmpty()) { throw new IllegalArgumentException("Topology configuration file must not be null or empty"); } - String instances = topologyConfigurationFile.substring(topologyConfigurationFile.lastIndexOf('.') + 1); - if (instances.equals("lua")) { + String fileType = topologyConfigurationFile.substring(topologyConfigurationFile.lastIndexOf('.') + 1); + if (fileType.equals("lua")) { this.topologyConfigurationFile = topologyConfigurationFile; + }else{ + this.replicasetsFileName = topologyConfigurationFile.substring(topologyConfigurationFile.lastIndexOf('/')+1); } this.instanceFileParser = new CartridgeConfigParser(instancesFile); this.clientHelper = new TarantoolContainerClientHelper(this); @@ -440,7 +443,6 @@ protected void configure() { if (!getDirectoryBinding().isEmpty()) { withFileSystemBind(getDirectoryBinding(), getInstanceDir(), BindMode.READ_WRITE); } - if (useFixedPorts) { for (Integer port : instanceFileParser.getExposablePorts()) { addFixedExposedPort(port, port); @@ -478,7 +480,8 @@ private boolean setupTopology() { } try { - Container.ExecResult lsResult = this.execInContainer("cartridge", "replicasets", "--run-dir=" + runDirPath, "setup", "--bootstrap-vshard"); + 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) {