You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by bt...@apache.org on 2018/07/05 02:01:35 UTC
[13/13] james-project git commit: JAMES-2441 Run parallely (and
statically when possible) docker containers and other heavy tasks.
JAMES-2441 Run parallely (and statically when possible) docker containers and other heavy tasks.
Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/9d023bea
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/9d023bea
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/9d023bea
Branch: refs/heads/master
Commit: 9d023beae924f0d2b49ee1919e8160da840d45c2
Parents: 26df561
Author: benwa <bt...@linagora.com>
Authored: Wed Jul 4 14:50:12 2018 +0700
Committer: benwa <bt...@linagora.com>
Committed: Thu Jul 5 09:00:27 2018 +0700
----------------------------------------------------------------------
.../backends/es/EmbeddedElasticSearch.java | 2 +-
.../java/org/apache/james/util/Runnables.java | 40 ++++++++++++++++++++
.../james/user/ldap/LdapGenericContainer.java | 10 +++++
.../ldap/ReadOnlyUsersLDAPRepositoryTest.java | 25 ++++--------
.../jmap/cassandra/CassandraJmapExtension.java | 15 ++++++--
server/queue/queue-rabbitmq/pom.xml | 7 +++-
.../DockerClusterRabbitMQExtension.java | 30 +++++++++------
7 files changed, 94 insertions(+), 35 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/james-project/blob/9d023bea/backends-common/elasticsearch/src/test/java/org/apache/james/backends/es/EmbeddedElasticSearch.java
----------------------------------------------------------------------
diff --git a/backends-common/elasticsearch/src/test/java/org/apache/james/backends/es/EmbeddedElasticSearch.java b/backends-common/elasticsearch/src/test/java/org/apache/james/backends/es/EmbeddedElasticSearch.java
index b2146ab..19002b5 100644
--- a/backends-common/elasticsearch/src/test/java/org/apache/james/backends/es/EmbeddedElasticSearch.java
+++ b/backends-common/elasticsearch/src/test/java/org/apache/james/backends/es/EmbeddedElasticSearch.java
@@ -69,7 +69,7 @@ public class EmbeddedElasticSearch extends ExternalResource {
}
@Override
- public void before() throws IOException {
+ public void before() {
node = nodeBuilder().local(true)
.settings(Settings.builder()
.put("path.home", folder.get().toAbsolutePath())
http://git-wip-us.apache.org/repos/asf/james-project/blob/9d023bea/server/container/util-java8/src/main/java/org/apache/james/util/Runnables.java
----------------------------------------------------------------------
diff --git a/server/container/util-java8/src/main/java/org/apache/james/util/Runnables.java b/server/container/util-java8/src/main/java/org/apache/james/util/Runnables.java
new file mode 100644
index 0000000..c199f31
--- /dev/null
+++ b/server/container/util-java8/src/main/java/org/apache/james/util/Runnables.java
@@ -0,0 +1,40 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one *
+ * or more contributor license agreements. See the NOTICE file *
+ * distributed with this work for additional information *
+ * regarding copyright ownership. The ASF licenses this file *
+ * to you under the Apache License, Version 2.0 (the *
+ * "License"); you may not use this file except in compliance *
+ * with the License. You may obtain a copy of the License at *
+ * *
+ * http://www.apache.org/licenses/LICENSE-2.0 *
+ * *
+ * Unless required by applicable law or agreed to in writing, *
+ * software distributed under the License is distributed on an *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY *
+ * KIND, either express or implied. See the License for the *
+ * specific language governing permissions and limitations *
+ * under the License. *
+ ****************************************************************/
+
+package org.apache.james.util;
+
+import java.util.Arrays;
+import java.util.concurrent.CompletableFuture;
+import java.util.function.Supplier;
+
+public class Runnables {
+ public static void runParallel(Runnable... runnables) {
+ FluentFutureStream.of(
+ Arrays.stream(runnables)
+ .map(runnable -> CompletableFuture.supplyAsync(toVoidSupplier(runnable))))
+ .join();
+ }
+
+ private static Supplier<Void> toVoidSupplier(Runnable runnable) {
+ return () -> {
+ runnable.run();
+ return null;
+ };
+ }
+}
http://git-wip-us.apache.org/repos/asf/james-project/blob/9d023bea/server/data/data-ldap-integration-testing/src/test/java/org/apache/james/user/ldap/LdapGenericContainer.java
----------------------------------------------------------------------
diff --git a/server/data/data-ldap-integration-testing/src/test/java/org/apache/james/user/ldap/LdapGenericContainer.java b/server/data/data-ldap-integration-testing/src/test/java/org/apache/james/user/ldap/LdapGenericContainer.java
index 992b4bf..74e62d9 100644
--- a/server/data/data-ldap-integration-testing/src/test/java/org/apache/james/user/ldap/LdapGenericContainer.java
+++ b/server/data/data-ldap-integration-testing/src/test/java/org/apache/james/user/ldap/LdapGenericContainer.java
@@ -78,6 +78,16 @@ public class LdapGenericContainer extends ExternalResource {
this.container = container;
}
+ @Override
+ protected void before() {
+ start();
+ }
+
+ @Override
+ protected void after() {
+ stop();
+ }
+
public void start() {
container.start();
}
http://git-wip-us.apache.org/repos/asf/james-project/blob/9d023bea/server/data/data-ldap-integration-testing/src/test/java/org/apache/james/user/ldap/ReadOnlyUsersLDAPRepositoryTest.java
----------------------------------------------------------------------
diff --git a/server/data/data-ldap-integration-testing/src/test/java/org/apache/james/user/ldap/ReadOnlyUsersLDAPRepositoryTest.java b/server/data/data-ldap-integration-testing/src/test/java/org/apache/james/user/ldap/ReadOnlyUsersLDAPRepositoryTest.java
index e78f976..2fdbe54 100644
--- a/server/data/data-ldap-integration-testing/src/test/java/org/apache/james/user/ldap/ReadOnlyUsersLDAPRepositoryTest.java
+++ b/server/data/data-ldap-integration-testing/src/test/java/org/apache/james/user/ldap/ReadOnlyUsersLDAPRepositoryTest.java
@@ -25,8 +25,8 @@ import org.apache.commons.configuration.HierarchicalConfiguration;
import org.apache.commons.configuration.plist.PropertyListConfiguration;
import org.apache.james.core.MailAddress;
import org.apache.james.domainlist.api.DomainList;
-import org.junit.After;
import org.junit.Before;
+import org.junit.ClassRule;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -42,24 +42,20 @@ public class ReadOnlyUsersLDAPRepositoryTest {
private static final String PASSWORD = "secret";
private static final String BAD_PASSWORD = "badpassword";
- private LdapGenericContainer ldapContainer;
+ @ClassRule
+ public static LdapGenericContainer ldapContainer = LdapGenericContainer.builder()
+ .domain(DOMAIN)
+ .password(ADMIN_PASSWORD)
+ .build();
+
private ReadOnlyUsersLDAPRepository ldapRepository;
private DomainList domainList;
@Before
public void setup() {
- startLdapContainer();
domainList = mock(DomainList.class);
}
- private void startLdapContainer() {
- ldapContainer = LdapGenericContainer.builder()
- .domain(DOMAIN)
- .password(ADMIN_PASSWORD)
- .build();
- ldapContainer.start();
- }
-
private void startUsersRepository(HierarchicalConfiguration ldapRepositoryConfiguration) throws Exception {
ldapRepository = new ReadOnlyUsersLDAPRepository(domainList);
ldapRepository.configure(ldapRepositoryConfiguration);
@@ -97,13 +93,6 @@ public class ReadOnlyUsersLDAPRepositoryTest {
return configuration;
}
- @After
- public void tearDown() {
- if (ldapContainer != null) {
- ldapContainer.stop();
- }
- }
-
@Test
public void knownUserShouldBeAbleToLogInWhenPasswordIsCorrect() throws Exception {
startUsersRepository(ldapRepositoryConfiguration());
http://git-wip-us.apache.org/repos/asf/james-project/blob/9d023bea/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraJmapExtension.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraJmapExtension.java b/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraJmapExtension.java
index 5a0dd48..8a0b0cd 100644
--- a/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraJmapExtension.java
+++ b/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraJmapExtension.java
@@ -34,6 +34,7 @@ import org.apache.james.modules.TestESMetricReporterModule;
import org.apache.james.modules.TestElasticSearchModule;
import org.apache.james.modules.TestJMAPServerModule;
import org.apache.james.server.core.configuration.Configuration;
+import org.apache.james.util.Runnables;
import org.apache.james.util.scanner.SpamAssassinExtension;
import org.junit.jupiter.api.extension.AfterAllCallback;
import org.junit.jupiter.api.extension.AfterEachCallback;
@@ -45,6 +46,8 @@ import org.junit.jupiter.api.extension.ParameterResolutionException;
import org.junit.jupiter.api.extension.ParameterResolver;
import org.junit.rules.TemporaryFolder;
+import com.github.fge.lambdas.Throwing;
+
public class CassandraJmapExtension implements BeforeAllCallback, AfterAllCallback,
BeforeEachCallback, AfterEachCallback, ParameterResolver {
@@ -83,15 +86,19 @@ public class CassandraJmapExtension implements BeforeAllCallback, AfterAllCallba
@Override
public void beforeAll(ExtensionContext context) throws Exception {
temporaryFolder.create();
- cassandra.start();
- elasticSearch.before();
+
+ Runnables.runParallel(
+ cassandra::start,
+ elasticSearch::before);
}
@Override
public void afterAll(ExtensionContext context) {
elasticSearch.after();
- cassandra.stop();
- temporaryFolder.delete();
+
+ Runnables.runParallel(
+ cassandra::stop,
+ elasticSearch::after);
}
@Override
http://git-wip-us.apache.org/repos/asf/james-project/blob/9d023bea/server/queue/queue-rabbitmq/pom.xml
----------------------------------------------------------------------
diff --git a/server/queue/queue-rabbitmq/pom.xml b/server/queue/queue-rabbitmq/pom.xml
index c2fff5b..06ba537 100644
--- a/server/queue/queue-rabbitmq/pom.xml
+++ b/server/queue/queue-rabbitmq/pom.xml
@@ -34,7 +34,12 @@
<dependencies>
<dependency>
- <groupId>org.apache.james</groupId>
+ <groupId>${project.groupId}</groupId>
+ <artifactId>james-server-util-java8</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>${project.groupId}</groupId>
<artifactId>james-server-util-java8</artifactId>
<type>test-jar</type>
<scope>test</scope>
http://git-wip-us.apache.org/repos/asf/james-project/blob/9d023bea/server/queue/queue-rabbitmq/src/test/java/org/apache/james/queue/rabbitmq/DockerClusterRabbitMQExtension.java
----------------------------------------------------------------------
diff --git a/server/queue/queue-rabbitmq/src/test/java/org/apache/james/queue/rabbitmq/DockerClusterRabbitMQExtension.java b/server/queue/queue-rabbitmq/src/test/java/org/apache/james/queue/rabbitmq/DockerClusterRabbitMQExtension.java
index 000fef6..1f8cc0f 100644
--- a/server/queue/queue-rabbitmq/src/test/java/org/apache/james/queue/rabbitmq/DockerClusterRabbitMQExtension.java
+++ b/server/queue/queue-rabbitmq/src/test/java/org/apache/james/queue/rabbitmq/DockerClusterRabbitMQExtension.java
@@ -19,6 +19,7 @@
package org.apache.james.queue.rabbitmq;
import org.apache.commons.codec.digest.DigestUtils;
+import org.apache.james.util.Runnables;
import org.junit.jupiter.api.extension.AfterEachCallback;
import org.junit.jupiter.api.extension.BeforeEachCallback;
import org.junit.jupiter.api.extension.ExtensionContext;
@@ -27,6 +28,7 @@ import org.junit.jupiter.api.extension.ParameterResolutionException;
import org.junit.jupiter.api.extension.ParameterResolver;
import org.testcontainers.containers.Network;
+import com.github.fge.lambdas.Throwing;
import com.google.common.collect.ImmutableList;
import com.rabbitmq.client.Address;
@@ -39,7 +41,7 @@ public class DockerClusterRabbitMQExtension implements BeforeEachCallback, After
private Network network;
@Override
- public void beforeEach(ExtensionContext context) throws Exception {
+ public void beforeEach(ExtensionContext context) {
String cookie = DigestUtils.sha1Hex("secret cookie here");
network = Network.NetworkImpl.builder()
@@ -51,15 +53,20 @@ public class DockerClusterRabbitMQExtension implements BeforeEachCallback, After
DockerRabbitMQ rabbitMQ2 = DockerRabbitMQ.withCookieAndNodeName(RABBIT_2, cookie, "rabbit@rabbit2", network);
DockerRabbitMQ rabbitMQ3 = DockerRabbitMQ.withCookieAndNodeName(RABBIT_3, cookie, "rabbit@rabbit3", network);
- rabbitMQ1.start();
- rabbitMQ2.start();
- rabbitMQ3.start();
+ Runnables.runParallel(
+ rabbitMQ1::start,
+ rabbitMQ2::start,
+ rabbitMQ3::start);
- rabbitMQ2.join(rabbitMQ1);
- rabbitMQ3.join(rabbitMQ1);
+ Runnables.runParallel(
+ Throwing.runnable(() -> rabbitMQ2.join(rabbitMQ1)),
+ Throwing.runnable(() -> rabbitMQ3.join(rabbitMQ1)));
- rabbitMQ2.startApp();
- rabbitMQ3.startApp();
+
+
+ Runnables.runParallel(
+ Throwing.runnable(rabbitMQ2::startApp),
+ Throwing.runnable(rabbitMQ3::startApp));
cluster = new DockerRabbitMQCluster(rabbitMQ1, rabbitMQ2, rabbitMQ3);
}
@@ -93,9 +100,10 @@ public class DockerClusterRabbitMQExtension implements BeforeEachCallback, After
}
public void stop() {
- rabbitMQ1.stop();
- rabbitMQ2.stop();
- rabbitMQ3.stop();
+ Runnables.runParallel(
+ rabbitMQ1::stop,
+ rabbitMQ2::stop,
+ rabbitMQ3::stop);
}
public DockerRabbitMQ getRabbitMQ1() {
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org