JAMES-2334 arbitrary name for each rabbit docker cluster container

In cluster environment, there is a relationship between rabbitmq nodename
suffix (domain part) and rabbitmq container hostname. If they are not the same,
rabbitmq docker cannot start.

- arbitrary rabbit docker name by adding an UUID string at the suffix.
- force docker rabbit mq docker's name & hostname & nodename suffix use same 
value.
Eg `my-rabbit-07f1a987-1704-4a48-b77d-02fef7e6162a` and 
`rabbit@my-rabbit-07f1a987-1704-4a48-b77d-02fef7e6162a`
- always set rabbitmq node name env. It doesn't hurt at all to set rabbitmq
node name env on both single rabbit and cluster rabbit tests. This make docker 
rabbit
node name setup simpler and could remove a parameter from constructor


Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/0c4c3672
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/0c4c3672
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/0c4c3672

Branch: refs/heads/master
Commit: 0c4c3672488b193d5020f641faeac984e31a0583
Parents: bc6eb25
Author: duc <dt...@linagora.com>
Authored: Fri Oct 19 21:44:00 2018 +0700
Committer: Benoit Tellier <btell...@linagora.com>
Committed: Wed Oct 24 08:48:24 2018 +0700

----------------------------------------------------------------------
 .../DockerClusterRabbitMQExtension.java         | 21 ++++----
 .../james/backend/rabbitmq/DockerRabbitMQ.java  | 50 +++++++++++---------
 .../backend/rabbitmq/RabbitMQClusterTest.java   |  6 +--
 3 files changed, 40 insertions(+), 37 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/0c4c3672/backends-common/rabbitmq/src/test/java/org/apache/james/backend/rabbitmq/DockerClusterRabbitMQExtension.java
----------------------------------------------------------------------
diff --git 
a/backends-common/rabbitmq/src/test/java/org/apache/james/backend/rabbitmq/DockerClusterRabbitMQExtension.java
 
b/backends-common/rabbitmq/src/test/java/org/apache/james/backend/rabbitmq/DockerClusterRabbitMQExtension.java
index 81f62a5..b787239 100644
--- 
a/backends-common/rabbitmq/src/test/java/org/apache/james/backend/rabbitmq/DockerClusterRabbitMQExtension.java
+++ 
b/backends-common/rabbitmq/src/test/java/org/apache/james/backend/rabbitmq/DockerClusterRabbitMQExtension.java
@@ -19,6 +19,7 @@
 package org.apache.james.backend.rabbitmq;
 
 import java.nio.charset.StandardCharsets;
+import java.util.UUID;
 
 import org.apache.james.util.Runnables;
 import org.junit.jupiter.api.extension.AfterAllCallback;
@@ -38,12 +39,9 @@ import com.rabbitmq.client.Address;
 
 public class DockerClusterRabbitMQExtension implements BeforeAllCallback, 
BeforeEachCallback, AfterEachCallback, AfterAllCallback, ParameterResolver {
 
-    private static final String RABBIT_1_NODE_NAME = "rabbit@rabbit1";
-    private static final String RABBIT_2_NODE_NAME = "rabbit@rabbit2";
-    private static final String RABBIT_3_NODE_NAME = "rabbit@rabbit3";
-    static final String RABBIT_1 = "rabbit1";
-    static final String RABBIT_2 = "rabbit2";
-    static final String RABBIT_3 = "rabbit3";
+    private static final String RABBIT_1 = "rabbit1";
+    private static final String RABBIT_2 = "rabbit2";
+    private static final String RABBIT_3 = "rabbit3";
     private DockerRabbitMQCluster cluster;
     private Network network;
     private DockerRabbitMQ rabbitMQ1;
@@ -59,9 +57,10 @@ public class DockerClusterRabbitMQExtension implements 
BeforeAllCallback, Before
             .createNetworkCmdModifiers(ImmutableList.of())
             .build();
 
-        rabbitMQ1 = DockerRabbitMQ.withCookieAndNodeName(RABBIT_1, cookie, 
RABBIT_1_NODE_NAME, network);
-        rabbitMQ2 = DockerRabbitMQ.withCookieAndNodeName(RABBIT_2, cookie, 
RABBIT_2_NODE_NAME, network);
-        rabbitMQ3 = DockerRabbitMQ.withCookieAndNodeName(RABBIT_3, cookie, 
RABBIT_3_NODE_NAME, network);
+        String clusterIdentity = UUID.randomUUID().toString();
+        rabbitMQ1 = DockerRabbitMQ.withCookieAndHostName(RABBIT_1, 
clusterIdentity, cookie, network);
+        rabbitMQ2 = DockerRabbitMQ.withCookieAndHostName(RABBIT_2, 
clusterIdentity, cookie, network);
+        rabbitMQ3 = DockerRabbitMQ.withCookieAndHostName(RABBIT_3, 
clusterIdentity, cookie, network);
 
         Runnables.runParallel(
             rabbitMQ1::start,
@@ -137,9 +136,9 @@ public class DockerClusterRabbitMQExtension implements 
BeforeAllCallback, Before
 
         public void detach() {
             rabbitMQ3.performIfRunning(DockerRabbitMQ::reset);
-            rabbitMQ1.performIfRunning(rabbitMQ -> 
rabbitMQ.forgetNode(RABBIT_3_NODE_NAME));
+            rabbitMQ1.performIfRunning(rabbitMQ -> 
rabbitMQ.forgetNode(rabbitMQ3.getNodeName()));
             rabbitMQ2.performIfRunning(DockerRabbitMQ::reset);
-            rabbitMQ1.performIfRunning(rabbitMQ -> 
rabbitMQ.forgetNode(RABBIT_2_NODE_NAME));
+            rabbitMQ1.performIfRunning(rabbitMQ -> 
rabbitMQ.forgetNode(rabbitMQ2.getNodeName()));
             rabbitMQ1.performIfRunning(DockerRabbitMQ::reset);
         }
     }

http://git-wip-us.apache.org/repos/asf/james-project/blob/0c4c3672/backends-common/rabbitmq/src/test/java/org/apache/james/backend/rabbitmq/DockerRabbitMQ.java
----------------------------------------------------------------------
diff --git 
a/backends-common/rabbitmq/src/test/java/org/apache/james/backend/rabbitmq/DockerRabbitMQ.java
 
b/backends-common/rabbitmq/src/test/java/org/apache/james/backend/rabbitmq/DockerRabbitMQ.java
index 1b53492..47c99ea 100644
--- 
a/backends-common/rabbitmq/src/test/java/org/apache/james/backend/rabbitmq/DockerRabbitMQ.java
+++ 
b/backends-common/rabbitmq/src/test/java/org/apache/james/backend/rabbitmq/DockerRabbitMQ.java
@@ -44,21 +44,23 @@ import com.rabbitmq.client.ConnectionFactory;
 public class DockerRabbitMQ {
     private static final Logger LOGGER = 
LoggerFactory.getLogger(DockerRabbitMQ.class);
 
-    private static final String DEFAULT_RABBIT_NODE = "my-rabbit";
+    private static final String DEFAULT_RABBIT_HOST_NAME_PREFIX = "my-rabbit";
+    private static final String DEFAULT_RABBIT_NODE_NAME_PREFIX = "rabbit";
     private static final int DEFAULT_RABBITMQ_PORT = 5672;
     private static final int DEFAULT_RABBITMQ_ADMIN_PORT = 15672;
     private static final String DEFAULT_RABBITMQ_USERNAME = "guest";
     private static final String DEFAULT_RABBITMQ_PASSWORD = "guest";
     private static final String RABBITMQ_ERLANG_COOKIE = 
"RABBITMQ_ERLANG_COOKIE";
     private static final String RABBITMQ_NODENAME = "RABBITMQ_NODENAME";
-    private static final Duration TEN_MINUTE_TIMEOUT = Duration.ofMinutes(10);
+    private static final Duration TEN_MINUTES_TIMEOUT = Duration.ofMinutes(10);
 
     private final GenericContainer<?> container;
-    private final Optional<String> nodeName;
+    private final String nodeName;
+    private final String rabbitHostName;
+    private final String hostNameSuffix;
 
-    public static DockerRabbitMQ withCookieAndNodeName(String hostName, String 
erlangCookie, String nodeName, Network network) {
-        return new DockerRabbitMQ(Optional.ofNullable(hostName), 
Optional.ofNullable(erlangCookie), Optional.ofNullable(nodeName),
-            Optional.of(network));
+    public static DockerRabbitMQ withCookieAndHostName(String hostNamePrefix, 
String clusterIdentity, String erlangCookie, Network network) {
+        return new DockerRabbitMQ(Optional.ofNullable(hostNamePrefix), 
Optional.ofNullable(clusterIdentity), Optional.ofNullable(erlangCookie), 
Optional.of(network));
     }
 
     public static DockerRabbitMQ withoutCookie() {
@@ -66,32 +68,34 @@ public class DockerRabbitMQ {
     }
 
     @SuppressWarnings("resource")
-    private DockerRabbitMQ(Optional<String> hostName, Optional<String> 
erlangCookie, Optional<String> nodeName, Optional<Network> net) {
-        container = new GenericContainer<>(Images.RABBITMQ)
-                .withCreateContainerCmdModifier(cmd -> 
cmd.withName(hostName.orElse(randomName())))
-                .withCreateContainerCmdModifier(cmd -> 
cmd.withHostName(hostName.orElse(DEFAULT_RABBIT_NODE)))
+    private DockerRabbitMQ(Optional<String> hostNamePrefix, Optional<String> 
clusterIdentity, Optional<String> erlangCookie, Optional<Network> net) {
+        this.hostNameSuffix = 
clusterIdentity.orElse(UUID.randomUUID().toString());
+        this.rabbitHostName = hostName(hostNamePrefix);
+        this.container = new GenericContainer<>(Images.RABBITMQ)
+                .withCreateContainerCmdModifier(cmd -> 
cmd.withName(this.rabbitHostName))
+                .withCreateContainerCmdModifier(cmd -> 
cmd.withHostName(this.rabbitHostName))
                 .withExposedPorts(DEFAULT_RABBITMQ_PORT, 
DEFAULT_RABBITMQ_ADMIN_PORT)
                 .waitingFor(waitStrategy())
                 .withLogConsumer(frame -> LOGGER.debug(frame.getUtf8String()))
                 .withCreateContainerCmdModifier(cmd -> cmd.getHostConfig()
                     .withTmpFs(ImmutableMap.of("/var/lib/rabbitmq/mnesia", 
"rw,noexec,nosuid,size=100m")));
-        net.ifPresent(container::withNetwork);
-        erlangCookie.ifPresent(cookie -> 
container.withEnv(RABBITMQ_ERLANG_COOKIE, cookie));
-        nodeName.ifPresent(name -> container.withEnv(RABBITMQ_NODENAME, name));
-        this.nodeName = nodeName;
+        net.ifPresent(this.container::withNetwork);
+        erlangCookie.ifPresent(cookie -> 
this.container.withEnv(RABBITMQ_ERLANG_COOKIE, cookie));
+        this.nodeName = DEFAULT_RABBIT_NODE_NAME_PREFIX + "@" + 
this.rabbitHostName;
+        this.container.withEnv(RABBITMQ_NODENAME, this.nodeName);
     }
 
     private WaitStrategy waitStrategy() {
         return new WaitAllStrategy()
             .withStrategy(Wait.forHttp("").forPort(DEFAULT_RABBITMQ_ADMIN_PORT)
                 .withRateLimiter(RateLimiters.TWENTIES_PER_SECOND)
-                .withStartupTimeout(TEN_MINUTE_TIMEOUT))
-            .withStrategy(new RabbitMQWaitStrategy(this, TEN_MINUTE_TIMEOUT))
-            .withStartupTimeout(TEN_MINUTE_TIMEOUT);
+                .withStartupTimeout(TEN_MINUTES_TIMEOUT))
+            .withStrategy(new RabbitMQWaitStrategy(this, TEN_MINUTES_TIMEOUT))
+            .withStartupTimeout(TEN_MINUTES_TIMEOUT);
     }
 
-    private String randomName() {
-        return UUID.randomUUID().toString();
+    private String hostName(Optional<String> hostNamePrefix) {
+        return hostNamePrefix.orElse(DEFAULT_RABBIT_HOST_NAME_PREFIX) + "-" + 
hostNameSuffix;
     }
 
     private String getHostIp() {
@@ -140,8 +144,8 @@ public class DockerRabbitMQ {
         return container;
     }
 
-    public String node() {
-        return nodeName.get();
+    public String getNodeName() {
+        return nodeName;
     }
 
     public void join(DockerRabbitMQ rabbitMQ) throws Exception {
@@ -160,7 +164,7 @@ public class DockerRabbitMQ {
 
     private void joinCluster(DockerRabbitMQ rabbitMQ) throws 
java.io.IOException, InterruptedException {
         String stdout = container()
-            .execInContainer("rabbitmqctl", "join_cluster", rabbitMQ.node())
+            .execInContainer("rabbitmqctl", "join_cluster", 
rabbitMQ.getNodeName())
             .getStdout();
         LOGGER.debug("join_cluster: {}", stdout);
     }
@@ -185,7 +189,7 @@ public class DockerRabbitMQ {
 
     public void forgetNode(String removalClusterNodeName) throws Exception {
         String stdout = container()
-            .execInContainer("rabbitmqctl", "-n", this.nodeName.get(), 
"forget_cluster_node", removalClusterNodeName)
+            .execInContainer("rabbitmqctl", "-n", this.nodeName, 
"forget_cluster_node", removalClusterNodeName)
             .getStdout();
         LOGGER.debug("forget_cluster_node: {}", stdout);
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/0c4c3672/backends-common/rabbitmq/src/test/java/org/apache/james/backend/rabbitmq/RabbitMQClusterTest.java
----------------------------------------------------------------------
diff --git 
a/backends-common/rabbitmq/src/test/java/org/apache/james/backend/rabbitmq/RabbitMQClusterTest.java
 
b/backends-common/rabbitmq/src/test/java/org/apache/james/backend/rabbitmq/RabbitMQClusterTest.java
index bf9a875..5e50b4b 100644
--- 
a/backends-common/rabbitmq/src/test/java/org/apache/james/backend/rabbitmq/RabbitMQClusterTest.java
+++ 
b/backends-common/rabbitmq/src/test/java/org/apache/james/backend/rabbitmq/RabbitMQClusterTest.java
@@ -97,9 +97,9 @@ class RabbitMQClusterTest {
 
             assertThat(stdout)
                 .contains(
-                    DockerClusterRabbitMQExtension.RABBIT_1,
-                    DockerClusterRabbitMQExtension.RABBIT_2,
-                    DockerClusterRabbitMQExtension.RABBIT_3);
+                    cluster.getRabbitMQ1().getNodeName(),
+                    cluster.getRabbitMQ2().getNodeName(),
+                    cluster.getRabbitMQ3().getNodeName());
         }
 
         @Test


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org
For additional commands, e-mail: server-dev-h...@james.apache.org

Reply via email to