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 ma...@apache.org on 2017/09/02 06:00:07 UTC
[05/13] james-project git commit: JAMES-2133 Switch from
cassandraunit to cassandra in docker
http://git-wip-us.apache.org/repos/asf/james-project/blob/a18a4488/mpt/impl/managesieve/cassandra/src/test/java/org/apache/james/mpt/managesieve/cassandra/CassandraNoopTest.java
----------------------------------------------------------------------
diff --git a/mpt/impl/managesieve/cassandra/src/test/java/org/apache/james/mpt/managesieve/cassandra/CassandraNoopTest.java b/mpt/impl/managesieve/cassandra/src/test/java/org/apache/james/mpt/managesieve/cassandra/CassandraNoopTest.java
index 5245878..1663e8b 100644
--- a/mpt/impl/managesieve/cassandra/src/test/java/org/apache/james/mpt/managesieve/cassandra/CassandraNoopTest.java
+++ b/mpt/impl/managesieve/cassandra/src/test/java/org/apache/james/mpt/managesieve/cassandra/CassandraNoopTest.java
@@ -19,21 +19,25 @@
package org.apache.james.mpt.managesieve.cassandra;
+import org.apache.james.backends.cassandra.DockerCassandraRule;
import org.apache.james.mpt.host.ManageSieveHostSystem;
import org.apache.james.mpt.testsuite.NoopTest;
import org.junit.After;
import org.junit.Before;
+import org.junit.ClassRule;
import com.google.inject.Guice;
import com.google.inject.Injector;
public class CassandraNoopTest extends NoopTest {
+ @ClassRule public static DockerCassandraRule cassandraServer = new DockerCassandraRule();
+
private ManageSieveHostSystem system;
@Before
public void setUp() throws Exception {
- Injector injector = Guice.createInjector(new CassandraModule());
+ Injector injector = Guice.createInjector(new CassandraModule(cassandraServer.getIp(), cassandraServer.getBindingPort()));
system = injector.getInstance(ManageSieveHostSystem.class);
system.beforeTest();
super.setUp();
http://git-wip-us.apache.org/repos/asf/james-project/blob/a18a4488/mpt/impl/managesieve/cassandra/src/test/java/org/apache/james/mpt/managesieve/cassandra/CassandraPutScriptTest.java
----------------------------------------------------------------------
diff --git a/mpt/impl/managesieve/cassandra/src/test/java/org/apache/james/mpt/managesieve/cassandra/CassandraPutScriptTest.java b/mpt/impl/managesieve/cassandra/src/test/java/org/apache/james/mpt/managesieve/cassandra/CassandraPutScriptTest.java
index e406fe3..9ba8908 100644
--- a/mpt/impl/managesieve/cassandra/src/test/java/org/apache/james/mpt/managesieve/cassandra/CassandraPutScriptTest.java
+++ b/mpt/impl/managesieve/cassandra/src/test/java/org/apache/james/mpt/managesieve/cassandra/CassandraPutScriptTest.java
@@ -19,21 +19,25 @@
package org.apache.james.mpt.managesieve.cassandra;
+import org.apache.james.backends.cassandra.DockerCassandraRule;
import org.apache.james.mpt.host.ManageSieveHostSystem;
import org.apache.james.mpt.testsuite.PutScriptTest;
import org.junit.After;
import org.junit.Before;
+import org.junit.ClassRule;
import com.google.inject.Guice;
import com.google.inject.Injector;
public class CassandraPutScriptTest extends PutScriptTest {
+ @ClassRule public static DockerCassandraRule cassandraServer = new DockerCassandraRule();
+
private ManageSieveHostSystem system;
@Before
public void setUp() throws Exception {
- Injector injector = Guice.createInjector(new CassandraModule());
+ Injector injector = Guice.createInjector(new CassandraModule(cassandraServer.getIp(), cassandraServer.getBindingPort()));
system = injector.getInstance(ManageSieveHostSystem.class);
system.beforeTest();
super.setUp();
http://git-wip-us.apache.org/repos/asf/james-project/blob/a18a4488/mpt/impl/managesieve/cassandra/src/test/java/org/apache/james/mpt/managesieve/cassandra/CassandraRenameScriptTest.java
----------------------------------------------------------------------
diff --git a/mpt/impl/managesieve/cassandra/src/test/java/org/apache/james/mpt/managesieve/cassandra/CassandraRenameScriptTest.java b/mpt/impl/managesieve/cassandra/src/test/java/org/apache/james/mpt/managesieve/cassandra/CassandraRenameScriptTest.java
index a95f9d1..2ae6162 100644
--- a/mpt/impl/managesieve/cassandra/src/test/java/org/apache/james/mpt/managesieve/cassandra/CassandraRenameScriptTest.java
+++ b/mpt/impl/managesieve/cassandra/src/test/java/org/apache/james/mpt/managesieve/cassandra/CassandraRenameScriptTest.java
@@ -19,21 +19,25 @@
package org.apache.james.mpt.managesieve.cassandra;
+import org.apache.james.backends.cassandra.DockerCassandraRule;
import org.apache.james.mpt.host.ManageSieveHostSystem;
import org.apache.james.mpt.testsuite.RenameScriptTest;
import org.junit.After;
import org.junit.Before;
+import org.junit.ClassRule;
import com.google.inject.Guice;
import com.google.inject.Injector;
public class CassandraRenameScriptTest extends RenameScriptTest {
+ @ClassRule public static DockerCassandraRule cassandraServer = new DockerCassandraRule();
+
private ManageSieveHostSystem system;
@Before
public void setUp() throws Exception {
- Injector injector = Guice.createInjector(new CassandraModule());
+ Injector injector = Guice.createInjector(new CassandraModule(cassandraServer.getIp(), cassandraServer.getBindingPort()));
system = injector.getInstance(ManageSieveHostSystem.class);
system.beforeTest();
super.setUp();
http://git-wip-us.apache.org/repos/asf/james-project/blob/a18a4488/mpt/impl/managesieve/cassandra/src/test/java/org/apache/james/mpt/managesieve/cassandra/CassandraSetActiveTest.java
----------------------------------------------------------------------
diff --git a/mpt/impl/managesieve/cassandra/src/test/java/org/apache/james/mpt/managesieve/cassandra/CassandraSetActiveTest.java b/mpt/impl/managesieve/cassandra/src/test/java/org/apache/james/mpt/managesieve/cassandra/CassandraSetActiveTest.java
index a82b69f..f47b3c6 100644
--- a/mpt/impl/managesieve/cassandra/src/test/java/org/apache/james/mpt/managesieve/cassandra/CassandraSetActiveTest.java
+++ b/mpt/impl/managesieve/cassandra/src/test/java/org/apache/james/mpt/managesieve/cassandra/CassandraSetActiveTest.java
@@ -19,21 +19,25 @@
package org.apache.james.mpt.managesieve.cassandra;
+import org.apache.james.backends.cassandra.DockerCassandraRule;
import org.apache.james.mpt.host.ManageSieveHostSystem;
import org.apache.james.mpt.testsuite.SetActiveTest;
import org.junit.After;
import org.junit.Before;
+import org.junit.ClassRule;
import com.google.inject.Guice;
import com.google.inject.Injector;
public class CassandraSetActiveTest extends SetActiveTest {
+ @ClassRule public static DockerCassandraRule cassandraServer = new DockerCassandraRule();
+
private ManageSieveHostSystem system;
@Before
public void setUp() throws Exception {
- Injector injector = Guice.createInjector(new CassandraModule());
+ Injector injector = Guice.createInjector(new CassandraModule(cassandraServer.getIp(), cassandraServer.getBindingPort()));
system = injector.getInstance(ManageSieveHostSystem.class);
system.beforeTest();
super.setUp();
http://git-wip-us.apache.org/repos/asf/james-project/blob/a18a4488/mpt/impl/managesieve/cassandra/src/test/java/org/apache/james/mpt/managesieve/cassandra/CassandraStartTlsTest.java
----------------------------------------------------------------------
diff --git a/mpt/impl/managesieve/cassandra/src/test/java/org/apache/james/mpt/managesieve/cassandra/CassandraStartTlsTest.java b/mpt/impl/managesieve/cassandra/src/test/java/org/apache/james/mpt/managesieve/cassandra/CassandraStartTlsTest.java
index 15a2a7a..e4506d1 100644
--- a/mpt/impl/managesieve/cassandra/src/test/java/org/apache/james/mpt/managesieve/cassandra/CassandraStartTlsTest.java
+++ b/mpt/impl/managesieve/cassandra/src/test/java/org/apache/james/mpt/managesieve/cassandra/CassandraStartTlsTest.java
@@ -19,21 +19,25 @@
package org.apache.james.mpt.managesieve.cassandra;
+import org.apache.james.backends.cassandra.DockerCassandraRule;
import org.apache.james.mpt.host.ManageSieveHostSystem;
import org.apache.james.mpt.testsuite.StartTlsTest;
import org.junit.After;
import org.junit.Before;
+import org.junit.ClassRule;
import com.google.inject.Guice;
import com.google.inject.Injector;
public class CassandraStartTlsTest extends StartTlsTest {
+ @ClassRule public static DockerCassandraRule cassandraServer = new DockerCassandraRule();
+
private ManageSieveHostSystem system;
@Before
public void setUp() throws Exception {
- Injector injector = Guice.createInjector(new CassandraModule());
+ Injector injector = Guice.createInjector(new CassandraModule(cassandraServer.getIp(), cassandraServer.getBindingPort()));
system = injector.getInstance(ManageSieveHostSystem.class);
system.beforeTest();
super.setUp();
http://git-wip-us.apache.org/repos/asf/james-project/blob/a18a4488/mpt/impl/managesieve/cassandra/src/test/java/org/apache/james/mpt/managesieve/cassandra/CassandraUnauthenticatedTest.java
----------------------------------------------------------------------
diff --git a/mpt/impl/managesieve/cassandra/src/test/java/org/apache/james/mpt/managesieve/cassandra/CassandraUnauthenticatedTest.java b/mpt/impl/managesieve/cassandra/src/test/java/org/apache/james/mpt/managesieve/cassandra/CassandraUnauthenticatedTest.java
index 66b524a..bf3a509 100644
--- a/mpt/impl/managesieve/cassandra/src/test/java/org/apache/james/mpt/managesieve/cassandra/CassandraUnauthenticatedTest.java
+++ b/mpt/impl/managesieve/cassandra/src/test/java/org/apache/james/mpt/managesieve/cassandra/CassandraUnauthenticatedTest.java
@@ -19,21 +19,25 @@
package org.apache.james.mpt.managesieve.cassandra;
+import org.apache.james.backends.cassandra.DockerCassandraRule;
import org.apache.james.mpt.host.ManageSieveHostSystem;
import org.apache.james.mpt.testsuite.UnauthenticatedTest;
import org.junit.After;
import org.junit.Before;
+import org.junit.ClassRule;
import com.google.inject.Guice;
import com.google.inject.Injector;
public class CassandraUnauthenticatedTest extends UnauthenticatedTest {
+ @ClassRule public static DockerCassandraRule cassandraServer = new DockerCassandraRule();
+
private ManageSieveHostSystem system;
@Before
public void setUp() throws Exception {
- Injector injector = Guice.createInjector(new CassandraModule());
+ Injector injector = Guice.createInjector(new CassandraModule(cassandraServer.getIp(), cassandraServer.getBindingPort()));
system = injector.getInstance(ManageSieveHostSystem.class);
system.beforeTest();
super.setUp();
http://git-wip-us.apache.org/repos/asf/james-project/blob/a18a4488/mpt/impl/managesieve/cassandra/src/test/java/org/apache/james/mpt/managesieve/cassandra/host/CassandraHostSystem.java
----------------------------------------------------------------------
diff --git a/mpt/impl/managesieve/cassandra/src/test/java/org/apache/james/mpt/managesieve/cassandra/host/CassandraHostSystem.java b/mpt/impl/managesieve/cassandra/src/test/java/org/apache/james/mpt/managesieve/cassandra/host/CassandraHostSystem.java
index 3b24879..28c89df 100644
--- a/mpt/impl/managesieve/cassandra/src/test/java/org/apache/james/mpt/managesieve/cassandra/host/CassandraHostSystem.java
+++ b/mpt/impl/managesieve/cassandra/src/test/java/org/apache/james/mpt/managesieve/cassandra/host/CassandraHostSystem.java
@@ -19,6 +19,7 @@
package org.apache.james.mpt.managesieve.cassandra.host;
+import org.apache.james.backends.cassandra.CassandraCluster;
import org.apache.james.backends.cassandra.init.CassandraModuleComposite;
import org.apache.james.backends.cassandra.utils.CassandraUtils;
import org.apache.james.mpt.host.JamesManageSieveHostSystem;
@@ -30,34 +31,39 @@ import org.apache.james.sieve.cassandra.CassandraSieveRepositoryModule;
import org.apache.james.sieverepository.api.SieveRepository;
import org.apache.james.user.api.UsersRepository;
import org.apache.james.user.cassandra.CassandraUsersRepository;
-import org.apache.james.backends.cassandra.CassandraCluster;
import org.apache.james.user.cassandra.CassandraUsersRepositoryModule;
public class CassandraHostSystem extends JamesManageSieveHostSystem {
- private static CassandraCluster CASSANDRA_CLUSTER = CassandraCluster.create(new CassandraModuleComposite(
- new CassandraSieveRepositoryModule(),
- new CassandraUsersRepositoryModule()));
+
+ private final String cassandraHost;
+ private final int cassandraPort;
+ private CassandraCluster cassandra;
- public CassandraHostSystem() throws Exception {
- super(createUsersRepository(), createSieveRepository());
+ public CassandraHostSystem(String cassandraHost, int cassandraPort) {
+ this.cassandraHost = cassandraHost;
+ this.cassandraPort = cassandraPort;
+ }
+
+ @Override
+ public void beforeTest() throws Exception {
+ CassandraModuleComposite modules = new CassandraModuleComposite(
+ new CassandraSieveRepositoryModule(),
+ new CassandraUsersRepositoryModule());
+ cassandra = CassandraCluster.create(modules, cassandraHost, cassandraPort);
+ super.beforeTest();
}
- protected static SieveRepository createSieveRepository() throws Exception {
+ protected SieveRepository createSieveRepository() throws Exception {
return new CassandraSieveRepository(
- new CassandraSieveDAO(CASSANDRA_CLUSTER.getConf()),
- new CassandraSieveQuotaDAO(CASSANDRA_CLUSTER.getConf()),
- new CassandraActiveScriptDAO(CASSANDRA_CLUSTER.getConf()));
+ new CassandraSieveDAO(cassandra.getConf()),
+ new CassandraSieveQuotaDAO(cassandra.getConf()),
+ new CassandraActiveScriptDAO(cassandra.getConf()));
}
- protected static UsersRepository createUsersRepository() {
- CassandraUsersRepository cassandraUsersRepository = new CassandraUsersRepository(CASSANDRA_CLUSTER.getConf(), CassandraUtils.WITH_DEFAULT_CONFIGURATION);
+ protected UsersRepository createUsersRepository() {
+ CassandraUsersRepository cassandraUsersRepository = new CassandraUsersRepository(cassandra.getConf(), CassandraUtils.WITH_DEFAULT_CONFIGURATION);
cassandraUsersRepository.setEnableVirtualHosting(false);
return cassandraUsersRepository;
}
- @Override
- protected void resetData() throws Exception {
- CASSANDRA_CLUSTER.clearAllTables();
- }
-
}
http://git-wip-us.apache.org/repos/asf/james-project/blob/a18a4488/mpt/impl/managesieve/core/pom.xml
----------------------------------------------------------------------
diff --git a/mpt/impl/managesieve/core/pom.xml b/mpt/impl/managesieve/core/pom.xml
index b808c33..9773cd1 100644
--- a/mpt/impl/managesieve/core/pom.xml
+++ b/mpt/impl/managesieve/core/pom.xml
@@ -55,6 +55,10 @@
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
</dependency>
+ <dependency>
+ <groupId>org.testcontainers</groupId>
+ <artifactId>testcontainers</artifactId>
+ </dependency>
</dependencies>
<build>
http://git-wip-us.apache.org/repos/asf/james-project/blob/a18a4488/mpt/impl/managesieve/core/src/main/java/org/apache/james/mpt/host/JamesManageSieveHostSystem.java
----------------------------------------------------------------------
diff --git a/mpt/impl/managesieve/core/src/main/java/org/apache/james/mpt/host/JamesManageSieveHostSystem.java b/mpt/impl/managesieve/core/src/main/java/org/apache/james/mpt/host/JamesManageSieveHostSystem.java
index a69e521..5cec736 100644
--- a/mpt/impl/managesieve/core/src/main/java/org/apache/james/mpt/host/JamesManageSieveHostSystem.java
+++ b/mpt/impl/managesieve/core/src/main/java/org/apache/james/mpt/host/JamesManageSieveHostSystem.java
@@ -31,17 +31,26 @@ import org.apache.jsieve.ConfigurationManager;
public abstract class JamesManageSieveHostSystem implements ManageSieveHostSystem {
- private final UsersRepository usersRepository;
- protected final SieveRepository sieveRepository;
- private final ManageSieveProcessor processor;
+ private UsersRepository usersRepository;
+ private SieveRepository sieveRepository;
+ private ManageSieveProcessor processor;
- public JamesManageSieveHostSystem(UsersRepository usersRepository, SieveRepository sieveRepository) throws Exception {
- this.usersRepository = usersRepository;
- this.sieveRepository = sieveRepository;
+ @Override
+ public void beforeTest() throws Exception {
+ this.usersRepository = createUsersRepository();
+ this.sieveRepository = createSieveRepository();
this.processor = new ManageSieveProcessor(new ArgumentParser(new CoreProcessor(sieveRepository, usersRepository, new Parser(new ConfigurationManager()))));
}
@Override
+ public void afterTest() throws Exception {
+ }
+
+ protected abstract SieveRepository createSieveRepository() throws Exception;
+
+ protected abstract UsersRepository createUsersRepository();
+
+ @Override
public boolean addUser(String user, String password) throws Exception {
usersRepository.addUser(user, password);
return true;
@@ -57,19 +66,4 @@ public abstract class JamesManageSieveHostSystem implements ManageSieveHostSyste
return new ManageSieveSession(processor, continuation);
}
- @Override
- public void beforeTests() throws Exception {}
-
- @Override
- public void afterTests() throws Exception {}
-
- @Override
- public void beforeTest() throws Exception {}
-
- @Override
- public void afterTest() throws Exception {
- resetData();
- }
-
- protected abstract void resetData() throws Exception;
}
http://git-wip-us.apache.org/repos/asf/james-project/blob/a18a4488/mpt/impl/managesieve/file/src/test/java/org/apache/james/mpt/managesieve/file/host/FileHostSystem.java
----------------------------------------------------------------------
diff --git a/mpt/impl/managesieve/file/src/test/java/org/apache/james/mpt/managesieve/file/host/FileHostSystem.java b/mpt/impl/managesieve/file/src/test/java/org/apache/james/mpt/managesieve/file/host/FileHostSystem.java
index 7bd28dc..92e218f 100644
--- a/mpt/impl/managesieve/file/src/test/java/org/apache/james/mpt/managesieve/file/host/FileHostSystem.java
+++ b/mpt/impl/managesieve/file/src/test/java/org/apache/james/mpt/managesieve/file/host/FileHostSystem.java
@@ -30,6 +30,7 @@ import org.apache.james.filesystem.api.FileSystem;
import org.apache.james.mpt.host.JamesManageSieveHostSystem;
import org.apache.james.sieverepository.api.SieveRepository;
import org.apache.james.sieverepository.file.SieveFileRepository;
+import org.apache.james.user.api.UsersRepository;
import org.apache.james.user.memory.MemoryUsersRepository;
public class FileHostSystem extends JamesManageSieveHostSystem {
@@ -51,16 +52,19 @@ public class FileHostSystem extends JamesManageSieveHostSystem {
};
}
- protected static SieveRepository createSieveRepository() throws Exception {
- return new SieveFileRepository(fileSystem);
+ @Override
+ protected UsersRepository createUsersRepository() {
+ return MemoryUsersRepository.withoutVirtualHosting();
}
- public FileHostSystem() throws Exception {
- super(MemoryUsersRepository.withoutVirtualHosting(), createSieveRepository());
+ @Override
+ protected SieveRepository createSieveRepository() throws Exception {
+ return new SieveFileRepository(fileSystem);
}
-
+
@Override
- protected void resetData() throws Exception {
+ public void afterTest() throws Exception {
+ super.afterTest();
File root = fileSystem.getFile(SIEVE_ROOT);
// Remove files from the previous test, if any
if (root.exists()) {
http://git-wip-us.apache.org/repos/asf/james-project/blob/a18a4488/mpt/impl/smtp/cassandra/pom.xml
----------------------------------------------------------------------
diff --git a/mpt/impl/smtp/cassandra/pom.xml b/mpt/impl/smtp/cassandra/pom.xml
index 46f9120..f9ded92 100644
--- a/mpt/impl/smtp/cassandra/pom.xml
+++ b/mpt/impl/smtp/cassandra/pom.xml
@@ -94,11 +94,6 @@
<artifactId>guava</artifactId>
</dependency>
<dependency>
- <groupId>org.cassandraunit</groupId>
- <artifactId>cassandra-unit</artifactId>
- <scope>test</scope>
- </dependency>
- <dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
</dependency>
http://git-wip-us.apache.org/repos/asf/james-project/blob/a18a4488/mpt/impl/smtp/cassandra/src/test/java/org/apache/james/mpt/smtp/CassandraForwardSmtpTest.java
----------------------------------------------------------------------
diff --git a/mpt/impl/smtp/cassandra/src/test/java/org/apache/james/mpt/smtp/CassandraForwardSmtpTest.java b/mpt/impl/smtp/cassandra/src/test/java/org/apache/james/mpt/smtp/CassandraForwardSmtpTest.java
index 0cda129..0adbeb0 100644
--- a/mpt/impl/smtp/cassandra/src/test/java/org/apache/james/mpt/smtp/CassandraForwardSmtpTest.java
+++ b/mpt/impl/smtp/cassandra/src/test/java/org/apache/james/mpt/smtp/CassandraForwardSmtpTest.java
@@ -19,19 +19,24 @@
package org.apache.james.mpt.smtp;
+import org.apache.james.backends.cassandra.DockerCassandraRule;
import org.junit.After;
import org.junit.Before;
+import org.junit.ClassRule;
import com.google.inject.Guice;
import com.google.inject.Injector;
public class CassandraForwardSmtpTest extends ForwardSmtpTest {
+ @ClassRule public static DockerCassandraRule cassandraServer = new DockerCassandraRule();
+
private SmtpHostSystem system;
@Before
public void setUp() throws Exception {
- Injector injector = Guice.createInjector(new SmtpTestModule(SmtpTestModule.Port.SMTP));
+ Injector injector = Guice.createInjector(
+ new SmtpTestModule(SmtpTestModule.Port.SMTP, cassandraServer.getIp(), cassandraServer.getBindingPort()));
system = injector.getInstance(SmtpHostSystem.class);
system.beforeTest();
super.setUp();
http://git-wip-us.apache.org/repos/asf/james-project/blob/a18a4488/mpt/impl/smtp/cassandra/src/test/java/org/apache/james/mpt/smtp/CassandraSmtpStarttlsCommandTest.java
----------------------------------------------------------------------
diff --git a/mpt/impl/smtp/cassandra/src/test/java/org/apache/james/mpt/smtp/CassandraSmtpStarttlsCommandTest.java b/mpt/impl/smtp/cassandra/src/test/java/org/apache/james/mpt/smtp/CassandraSmtpStarttlsCommandTest.java
index d807faf..5fa2d7a 100644
--- a/mpt/impl/smtp/cassandra/src/test/java/org/apache/james/mpt/smtp/CassandraSmtpStarttlsCommandTest.java
+++ b/mpt/impl/smtp/cassandra/src/test/java/org/apache/james/mpt/smtp/CassandraSmtpStarttlsCommandTest.java
@@ -19,19 +19,24 @@
package org.apache.james.mpt.smtp;
+import org.apache.james.backends.cassandra.DockerCassandraRule;
import org.junit.After;
import org.junit.Before;
+import org.junit.ClassRule;
import com.google.inject.Guice;
import com.google.inject.Injector;
public class CassandraSmtpStarttlsCommandTest extends SmtpStarttlsCommandTest {
+ @ClassRule public static DockerCassandraRule cassandraServer = new DockerCassandraRule();
+
private SmtpHostSystem system;
@Before
public void setUp() throws Exception {
- Injector injector = Guice.createInjector(new SmtpTestModule(SmtpTestModule.Port.SMTP_START_TTLS));
+ Injector injector = Guice.createInjector(
+ new SmtpTestModule(SmtpTestModule.Port.SMTP_START_TTLS, cassandraServer.getIp(), cassandraServer.getBindingPort()));
system = injector.getInstance(SmtpHostSystem.class);
system.beforeTest();
super.setUp();
http://git-wip-us.apache.org/repos/asf/james-project/blob/a18a4488/mpt/impl/smtp/cassandra/src/test/java/org/apache/james/mpt/smtp/SmtpTestModule.java
----------------------------------------------------------------------
diff --git a/mpt/impl/smtp/cassandra/src/test/java/org/apache/james/mpt/smtp/SmtpTestModule.java b/mpt/impl/smtp/cassandra/src/test/java/org/apache/james/mpt/smtp/SmtpTestModule.java
index e86db9d..d383838 100644
--- a/mpt/impl/smtp/cassandra/src/test/java/org/apache/james/mpt/smtp/SmtpTestModule.java
+++ b/mpt/impl/smtp/cassandra/src/test/java/org/apache/james/mpt/smtp/SmtpTestModule.java
@@ -35,15 +35,19 @@ public class SmtpTestModule extends AbstractModule {
}
}
- private Port smtpPort;
+ private final Port smtpPort;
+ private final String cassandraHost;
+ private final int cassandraPort;
- public SmtpTestModule(Port smtpPort) {
+ public SmtpTestModule(Port smtpPort, String cassandraHost, int cassandraPort) {
this.smtpPort = smtpPort;
+ this.cassandraHost = cassandraHost;
+ this.cassandraPort = cassandraPort;
}
@Override
protected void configure() {
- bind(SmtpHostSystem.class).toInstance(new CassandraJamesSmtpHostSystem(smtpPort.port));
+ bind(SmtpHostSystem.class).toInstance(new CassandraJamesSmtpHostSystem(smtpPort.port, cassandraHost, cassandraPort));
}
}
http://git-wip-us.apache.org/repos/asf/james-project/blob/a18a4488/mpt/impl/smtp/cassandra/src/test/java/org/apache/james/mpt/smtp/host/CassandraJamesSmtpHostSystem.java
----------------------------------------------------------------------
diff --git a/mpt/impl/smtp/cassandra/src/test/java/org/apache/james/mpt/smtp/host/CassandraJamesSmtpHostSystem.java b/mpt/impl/smtp/cassandra/src/test/java/org/apache/james/mpt/smtp/host/CassandraJamesSmtpHostSystem.java
index 82ffba8..5dcb1ae 100644
--- a/mpt/impl/smtp/cassandra/src/test/java/org/apache/james/mpt/smtp/host/CassandraJamesSmtpHostSystem.java
+++ b/mpt/impl/smtp/cassandra/src/test/java/org/apache/james/mpt/smtp/host/CassandraJamesSmtpHostSystem.java
@@ -23,9 +23,9 @@ import java.util.Iterator;
import org.apache.james.CassandraJamesServerMain;
import org.apache.james.GuiceJamesServer;
-import org.apache.james.backends.cassandra.EmbeddedCassandra;
import org.apache.james.backends.es.EmbeddedElasticSearch;
import org.apache.james.dnsservice.api.DNSService;
+import org.apache.james.dnsservice.api.InMemoryDNSService;
import org.apache.james.mailbox.elasticsearch.MailboxElasticsearchConstants;
import org.apache.james.modules.CassandraJmapServerModule;
import org.apache.james.modules.protocols.ProtocolHandlerModule;
@@ -33,7 +33,6 @@ import org.apache.james.modules.protocols.SMTPServerModule;
import org.apache.james.mpt.monitor.SystemLoggingMonitor;
import org.apache.james.mpt.session.ExternalSessionFactory;
import org.apache.james.mpt.smtp.SmtpHostSystem;
-import org.apache.james.dnsservice.api.InMemoryDNSService;
import org.apache.james.utils.DataProbeImpl;
import org.junit.rules.TemporaryFolder;
@@ -43,15 +42,18 @@ import com.google.common.base.Splitter;
public class CassandraJamesSmtpHostSystem extends ExternalSessionFactory implements SmtpHostSystem {
private TemporaryFolder folder;
- private EmbeddedCassandra embeddedCassandra;
private EmbeddedElasticSearch embeddedElasticSearch;
private GuiceJamesServer jamesServer;
private InMemoryDNSService inMemoryDNSService;
+ private final String cassandraHost;
+ private final int cassandraPort;
- public CassandraJamesSmtpHostSystem(int smtpPort) {
+ public CassandraJamesSmtpHostSystem(int smtpPort, String cassandraHost, int cassandraPort) {
super("localhost", smtpPort, new SystemLoggingMonitor(), "220 mydomain.tld smtp");
+ this.cassandraHost = cassandraHost;
+ this.cassandraPort = cassandraPort;
}
@Override
@@ -78,21 +80,12 @@ public class CassandraJamesSmtpHostSystem extends ExternalSessionFactory impleme
}
@Override
- public void beforeTests() throws Exception {
- }
-
- @Override
- public void afterTests() throws Exception {
- }
-
- @Override
public void beforeTest() throws Exception {
inMemoryDNSService = new InMemoryDNSService();
folder = new TemporaryFolder();
folder.create();
embeddedElasticSearch = new EmbeddedElasticSearch(folder.getRoot().toPath(), MailboxElasticsearchConstants.MAILBOX_INDEX);
embeddedElasticSearch.before();
- embeddedCassandra = EmbeddedCassandra.createStartServer();
jamesServer = createJamesServer();
jamesServer.start();
}
@@ -110,7 +103,7 @@ public class CassandraJamesSmtpHostSystem extends ExternalSessionFactory impleme
protected GuiceJamesServer createJamesServer() {
return new GuiceJamesServer()
.combineWith(CassandraJamesServerMain.cassandraServerModule, new SMTPServerModule(), new ProtocolHandlerModule())
- .overrideWith(new CassandraJmapServerModule(folder::getRoot, embeddedElasticSearch, embeddedCassandra),
+ .overrideWith(new CassandraJmapServerModule(folder::getRoot, embeddedElasticSearch, cassandraHost, cassandraPort),
(binder) -> binder.bind(DNSService.class).toInstance(inMemoryDNSService));
}
}
http://git-wip-us.apache.org/repos/asf/james-project/blob/a18a4488/mpt/impl/smtp/core/src/main/java/org/apache/james/mpt/smtp/ForwardSmtpTest.java
----------------------------------------------------------------------
diff --git a/mpt/impl/smtp/core/src/main/java/org/apache/james/mpt/smtp/ForwardSmtpTest.java b/mpt/impl/smtp/core/src/main/java/org/apache/james/mpt/smtp/ForwardSmtpTest.java
index fdc47e7..8510c53 100644
--- a/mpt/impl/smtp/core/src/main/java/org/apache/james/mpt/smtp/ForwardSmtpTest.java
+++ b/mpt/impl/smtp/core/src/main/java/org/apache/james/mpt/smtp/ForwardSmtpTest.java
@@ -35,7 +35,6 @@ import org.junit.rules.RuleChain;
import org.junit.rules.TemporaryFolder;
import com.google.common.base.Charsets;
-import com.google.common.net.InetAddresses;
import com.jayway.restassured.RestAssured;
import com.jayway.restassured.builder.RequestSpecBuilder;
import com.jayway.restassured.http.ContentType;
@@ -49,6 +48,7 @@ public abstract class ForwardSmtpTest {
private final TemporaryFolder folder = new TemporaryFolder();
private final SwarmGenericContainer fakeSmtp = new SwarmGenericContainer("weave/rest-smtp-sink:latest")
+ .withExposedPorts(25)
.withAffinityToContainer();
@Rule
@@ -67,7 +67,7 @@ public abstract class ForwardSmtpTest {
.withLocale(Locale.US)
.withUser(USER_AT_DOMAIN, PASSWORD);
- InetAddress containerIp = InetAddresses.forString(fakeSmtp.getIp());
+ InetAddress containerIp = InetAddress.getByName(fakeSmtp.getContainerIp());
hostSystem.getInMemoryDnsService()
.registerRecord("yopmail.com", containerIp, "yopmail.com");
http://git-wip-us.apache.org/repos/asf/james-project/blob/a18a4488/server/container/guice/cassandra-guice/pom.xml
----------------------------------------------------------------------
diff --git a/server/container/guice/cassandra-guice/pom.xml b/server/container/guice/cassandra-guice/pom.xml
index 6f8123d..53f397c 100644
--- a/server/container/guice/cassandra-guice/pom.xml
+++ b/server/container/guice/cassandra-guice/pom.xml
@@ -43,6 +43,7 @@
<groupId>${project.groupId}</groupId>
<artifactId>apache-james-backends-cassandra</artifactId>
<type>test-jar</type>
+ <scope>test</scope>
</dependency>
<dependency>
<groupId>${project.groupId}</groupId>
@@ -205,11 +206,6 @@
<scope>test</scope>
</dependency>
<dependency>
- <groupId>org.cassandraunit</groupId>
- <artifactId>cassandra-unit</artifactId>
- <scope>test</scope>
- </dependency>
- <dependency>
<groupId>org.hdrhistogram</groupId>
<artifactId>HdrHistogram</artifactId>
<version>2.1.4</version>
http://git-wip-us.apache.org/repos/asf/james-project/blob/a18a4488/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraSessionConfiguration.java
----------------------------------------------------------------------
diff --git a/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraSessionConfiguration.java b/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraSessionConfiguration.java
deleted file mode 100644
index 33c755c..0000000
--- a/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraSessionConfiguration.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/****************************************************************
- * 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.modules.mailbox;
-
-import org.apache.commons.configuration.ConfigurationException;
-import org.apache.commons.configuration.PropertiesConfiguration;
-
-public interface CassandraSessionConfiguration {
-
- PropertiesConfiguration getConfiguration() throws ConfigurationException;
-
-}
http://git-wip-us.apache.org/repos/asf/james-project/blob/a18a4488/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraSessionModule.java
----------------------------------------------------------------------
diff --git a/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraSessionModule.java b/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraSessionModule.java
index 144d5d3..885e39a 100644
--- a/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraSessionModule.java
+++ b/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraSessionModule.java
@@ -19,24 +19,18 @@
package org.apache.james.modules.mailbox;
import java.io.FileNotFoundException;
-import java.time.LocalDateTime;
-import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import java.util.Set;
-import java.util.concurrent.ExecutionException;
import java.util.concurrent.ScheduledExecutorService;
-import java.util.concurrent.TimeUnit;
import org.apache.commons.configuration.ConfigurationException;
import org.apache.commons.configuration.PropertiesConfiguration;
-import org.apache.james.backends.cassandra.CassandraConfiguration;
import org.apache.james.backends.cassandra.components.CassandraModule;
+import org.apache.james.backends.cassandra.init.CassandraConfiguration;
import org.apache.james.backends.cassandra.init.CassandraModuleComposite;
+import org.apache.james.backends.cassandra.init.CassandraSessionConfiguration;
import org.apache.james.backends.cassandra.init.CassandraZonedDateTimeModule;
-import org.apache.james.backends.cassandra.init.ClusterBuilder;
-import org.apache.james.backends.cassandra.init.ClusterWithKeyspaceCreatedFactory;
-import org.apache.james.backends.cassandra.init.QueryLoggerConfiguration;
import org.apache.james.backends.cassandra.init.SessionWithInitializedTablesFactory;
import org.apache.james.backends.cassandra.utils.CassandraUtils;
import org.apache.james.backends.cassandra.versions.CassandraSchemaVersionDAO;
@@ -45,21 +39,13 @@ import org.apache.james.backends.cassandra.versions.CassandraSchemaVersionManage
import org.apache.james.backends.cassandra.versions.CassandraSchemaVersionModule;
import org.apache.james.lifecycle.api.Configurable;
import org.apache.james.mailbox.store.BatchSizes;
-import org.apache.james.util.Host;
import org.apache.james.utils.ConfigurationPerformer;
import org.apache.james.utils.PropertiesProvider;
-import org.apache.james.utils.RetryExecutorUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.datastax.driver.core.Cluster;
-import com.datastax.driver.core.HostDistance;
-import com.datastax.driver.core.PerHostPercentileTracker;
-import com.datastax.driver.core.PoolingOptions;
-import com.datastax.driver.core.QueryLogger;
import com.datastax.driver.core.Session;
-import com.datastax.driver.core.exceptions.NoHostAvailableException;
-import com.github.steveash.guavate.Guavate;
import com.google.common.annotations.VisibleForTesting;
import com.google.common.collect.ImmutableList;
import com.google.inject.AbstractModule;
@@ -69,21 +55,12 @@ import com.google.inject.Scopes;
import com.google.inject.Singleton;
import com.google.inject.multibindings.Multibinder;
import com.nurkiewicz.asyncretry.AsyncRetryExecutor;
-import com.nurkiewicz.asyncretry.function.RetryCallable;
public class CassandraSessionModule extends AbstractModule {
private static final Logger LOGGER = LoggerFactory.getLogger(CassandraSessionModule.class);
- private static final int DEFAULT_CONNECTION_MAX_RETRIES = 10;
- private static final int DEFAULT_CONNECTION_MIN_DELAY = 5000;
- private static final long CASSANDRA_HIGHEST_TRACKABLE_LATENCY_MILLIS = TimeUnit.SECONDS.toMillis(10);
- private static final int DEFAULT_REPLICATION_FACTOR = 1;
- private static final String DEFAULT_KEYSPACE = "apache_james";
- private static final String CASSANDRA_NODES = "cassandra.nodes";
private static final String LOCALHOST = "127.0.0.1";
- private static final int DEFAULT_READ_TIMEOUT_MILLIS = 5000;
- private static final int DEFAULT_CONNECT_TIMEOUT_MILLIS = 5000;
private static final String BATCHSIZES_FILE_NAME = "batchsizes";
private static final String MAILBOX_MAX_RETRY_ACL = "mailbox.max.retry.acl";
private static final String MAILBOX_MAX_RETRY_MODSEQ = "mailbox.max.retry.modseq";
@@ -95,11 +72,14 @@ public class CassandraSessionModule extends AbstractModule {
private static final String CHUNK_SIZE_MESSAGE_READ = "chunk.size.message.read";
private static final String CHUNK_SIZE_EXPUNGE = "chunk.size.expunge";
private static final String BLOB_PART_SIZE = "mailbox.blob.part.size";
+ private static final String CASSANDRA_NODES = "cassandra.nodes";
@Override
protected void configure() {
bind(ScheduledExecutorService.class).toProvider(ScheduledExecutorServiceProvider.class);
bind(CassandraUtils.class).in(Scopes.SINGLETON);
+ bind(Session.class).toProvider(SessionWithInitializedTablesFactory.class);
+ bind(Cluster.class).toProvider(ResilientClusterProvider.class);
Multibinder<CassandraModule> cassandraDataDefinitions = Multibinder.newSetBinder(binder(), CassandraModule.class);
cassandraDataDefinitions.addBinding().to(CassandraZonedDateTimeModule.class);
@@ -119,14 +99,6 @@ public class CassandraSessionModule extends AbstractModule {
@Provides
@Singleton
- Session provideSession(CassandraSessionConfiguration configuration, Cluster cluster, CassandraModule cassandraModule)
- throws FileNotFoundException, ConfigurationException{
- String keyspace = configuration.getConfiguration().getString("cassandra.keyspace", DEFAULT_KEYSPACE);
- return new SessionWithInitializedTablesFactory(cassandraModule).createSession(cluster, keyspace);
- }
-
- @Provides
- @Singleton
CassandraSessionConfiguration getCassandraSessionConfiguration(PropertiesProvider propertiesProvider) {
return () -> getConfiguration(propertiesProvider);
}
@@ -152,115 +124,6 @@ public class CassandraSessionModule extends AbstractModule {
}
}
- @Provides
- @Singleton
- Cluster provideCluster(CassandraSessionConfiguration cassandraSessionConfiguration, AsyncRetryExecutor executor) throws ConfigurationException, ExecutionException, InterruptedException {
- PropertiesConfiguration configuration = cassandraSessionConfiguration.getConfiguration();
- List<Host> servers = listCassandraServers(configuration);
- QueryLoggerConfiguration queryLoggerConfiguration = getCassandraQueryLoggerConf(configuration);
-
- int maxRetries = configuration.getInt("cassandra.retryConnection.maxRetries", DEFAULT_CONNECTION_MAX_RETRIES);
- int minDelay = configuration.getInt("cassandra.retryConnection.minDelay", DEFAULT_CONNECTION_MIN_DELAY);
-
- return RetryExecutorUtil.retryOnExceptions(executor, maxRetries, minDelay, NoHostAvailableException.class)
- .getWithRetry(getClusterRetryCallable(configuration, servers, queryLoggerConfiguration))
- .get();
- }
-
- private RetryCallable<Cluster> getClusterRetryCallable(PropertiesConfiguration configuration, List<Host> servers, QueryLoggerConfiguration queryLoggerConfiguration) {
- LOGGER.info("Trying to connect to Cassandra service at {}", LocalDateTime.now());
-
- return context -> ClusterWithKeyspaceCreatedFactory
- .config(ClusterBuilder.builder()
- .servers(servers)
- .poolingOptions(readPoolingOptions(configuration))
- .queryLoggerConfiguration(queryLoggerConfiguration)
- .readTimeoutMillis(configuration.getInt("cassandra.readTimeoutMillis", DEFAULT_READ_TIMEOUT_MILLIS))
- .connectTimeoutMillis(configuration.getInt("cassandra.connectTimeoutMillis", DEFAULT_CONNECT_TIMEOUT_MILLIS))
- .build(),
- configuration.getString("cassandra.keyspace", DEFAULT_KEYSPACE))
- .replicationFactor(configuration.getInt("cassandra.replication.factor", DEFAULT_REPLICATION_FACTOR))
- .clusterWithInitializedKeyspace();
- }
-
- private Optional<PoolingOptions> readPoolingOptions(PropertiesConfiguration configuration) {
-
- Optional<Integer> maxConnections = Optional.ofNullable(configuration.getInteger("cassandra.pooling.local.max.connections", null));
- Optional<Integer> maxRequests = Optional.ofNullable(configuration.getInteger("cassandra.pooling.local.max.requests", null));
- Optional<Integer> poolingTimeout = Optional.ofNullable(configuration.getInteger("cassandra.pooling.timeout", null));
- Optional<Integer> heartbeatTimeout = Optional.ofNullable(configuration.getInteger("cassandra.pooling.heartbeat.timeout", null));
-
- if (!maxConnections.isPresent()
- && !maxRequests.isPresent()
- && !poolingTimeout.isPresent()
- && !heartbeatTimeout.isPresent()) {
- return Optional.empty();
- }
- PoolingOptions result = new PoolingOptions();
-
- maxConnections.ifPresent(value -> {
- result.setMaxConnectionsPerHost(HostDistance.LOCAL, value);
- result.setMaxConnectionsPerHost(HostDistance.REMOTE, value);
- });
- maxRequests.ifPresent(value -> {
- result.setMaxRequestsPerConnection(HostDistance.LOCAL, value);
- result.setMaxRequestsPerConnection(HostDistance.REMOTE, value);
- });
- poolingTimeout.ifPresent(result::setPoolTimeoutMillis);
- heartbeatTimeout.ifPresent(result::setHeartbeatIntervalSeconds);
-
- return Optional.of(result);
- }
-
- private List<Host> listCassandraServers(PropertiesConfiguration configuration) {
- String[] ipAndPorts = configuration.getStringArray(CASSANDRA_NODES);
-
- return Arrays.stream(ipAndPorts)
- .map(string -> Host.parseConfString(string, ClusterBuilder.DEFAULT_CASSANDRA_PORT))
- .collect(Guavate.toImmutableList());
- }
-
- private Optional<Integer> getOptionalIntegerFromConf(PropertiesConfiguration configuration, String key) {
- return Optional.ofNullable(configuration.getInteger(key, null));
- }
-
- private Optional<Double> getOptionalDoubleFromConf(PropertiesConfiguration configuration, String key) {
- return Optional.ofNullable(configuration.getDouble(key, null));
- }
-
- private QueryLoggerConfiguration getCassandraQueryLoggerConf(PropertiesConfiguration configuration) {
- QueryLoggerConfiguration.Builder builder = QueryLoggerConfiguration.builder();
-
- Optional<Long> constantThreshold = getOptionalIntegerFromConf(configuration, "cassandra.query.logger.constant.threshold")
- .map(Long::valueOf);
-
- constantThreshold.ifPresent(builder::withConstantThreshold);
-
- getOptionalIntegerFromConf(configuration, "cassandra.query.logger.max.logged.parameters")
- .ifPresent(builder::withMaxLoggedParameters);
-
- getOptionalIntegerFromConf(configuration, "cassandra.query.logger.max.query.string.length")
- .ifPresent(builder::withMaxQueryStringLength);
-
- getOptionalIntegerFromConf(configuration, "cassandra.query.logger.max.parameter.value.length")
- .ifPresent(builder::withMaxParameterValueLength);
-
- Optional<Double> percentileLatencyConf = getOptionalDoubleFromConf(configuration, "cassandra.query.slow.query.latency.threshold.percentile");
-
- if (!percentileLatencyConf.isPresent() && !constantThreshold.isPresent()) {
- percentileLatencyConf = Optional.of(QueryLogger.DEFAULT_SLOW_QUERY_THRESHOLD_PERCENTILE);
- }
-
- percentileLatencyConf.ifPresent(slowQueryLatencyThresholdPercentile -> {
- PerHostPercentileTracker tracker = PerHostPercentileTracker
- .builder(CASSANDRA_HIGHEST_TRACKABLE_LATENCY_MILLIS)
- .build();
-
- builder.withDynamicThreshold(tracker, slowQueryLatencyThresholdPercentile);
- });
-
- return builder.build();
- }
@Provides
private AsyncRetryExecutor provideAsyncRetryExecutor(ScheduledExecutorService scheduler) {
http://git-wip-us.apache.org/repos/asf/james-project/blob/a18a4488/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/ResilientClusterProvider.java
----------------------------------------------------------------------
diff --git a/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/ResilientClusterProvider.java b/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/ResilientClusterProvider.java
new file mode 100644
index 0000000..c8be620
--- /dev/null
+++ b/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/ResilientClusterProvider.java
@@ -0,0 +1,178 @@
+package org.apache.james.modules.mailbox;
+
+import java.time.LocalDateTime;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Optional;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.TimeUnit;
+
+import javax.annotation.PreDestroy;
+import javax.inject.Inject;
+import javax.inject.Provider;
+import javax.inject.Singleton;
+
+import org.apache.commons.configuration.ConfigurationException;
+import org.apache.commons.configuration.PropertiesConfiguration;
+import org.apache.james.backends.cassandra.init.CassandraSessionConfiguration;
+import org.apache.james.backends.cassandra.init.ClusterBuilder;
+import org.apache.james.backends.cassandra.init.ClusterWithKeyspaceCreatedFactory;
+import org.apache.james.backends.cassandra.init.QueryLoggerConfiguration;
+import org.apache.james.util.Host;
+import org.apache.james.utils.RetryExecutorUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.datastax.driver.core.Cluster;
+import com.datastax.driver.core.HostDistance;
+import com.datastax.driver.core.PerHostPercentileTracker;
+import com.datastax.driver.core.PoolingOptions;
+import com.datastax.driver.core.QueryLogger;
+import com.datastax.driver.core.exceptions.NoHostAvailableException;
+import com.github.steveash.guavate.Guavate;
+import com.nurkiewicz.asyncretry.AsyncRetryExecutor;
+import com.nurkiewicz.asyncretry.function.RetryCallable;
+
+@Singleton
+public class ResilientClusterProvider implements Provider<Cluster> {
+
+ private static final int DEFAULT_CONNECTION_MAX_RETRIES = 10;
+ private static final int DEFAULT_CONNECTION_MIN_DELAY = 5000;
+ private static final long CASSANDRA_HIGHEST_TRACKABLE_LATENCY_MILLIS = TimeUnit.SECONDS.toMillis(10);
+ private static final int DEFAULT_REPLICATION_FACTOR = 1;
+ private static final String DEFAULT_KEYSPACE = "apache_james";
+ private static final int DEFAULT_READ_TIMEOUT_MILLIS = 5000;
+ private static final int DEFAULT_CONNECT_TIMEOUT_MILLIS = 5000;
+ private static final String CASSANDRA_NODES = "cassandra.nodes";
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(ResilientClusterProvider.class);
+ private final Cluster cluster;
+
+ @Inject
+ private ResilientClusterProvider(CassandraSessionConfiguration cassandraSessionConfiguration, AsyncRetryExecutor executor) throws ConfigurationException, ExecutionException, InterruptedException {
+ PropertiesConfiguration configuration = cassandraSessionConfiguration.getConfiguration();
+ List<Host> servers = listCassandraServers(configuration);
+ LOGGER.warn("CASSANDRA NODES : {}", servers);
+ QueryLoggerConfiguration queryLoggerConfiguration = getCassandraQueryLoggerConf(configuration);
+
+ int maxRetries = configuration.getInt("cassandra.retryConnection.maxRetries", DEFAULT_CONNECTION_MAX_RETRIES);
+ int minDelay = configuration.getInt("cassandra.retryConnection.minDelay", DEFAULT_CONNECTION_MIN_DELAY);
+
+ cluster = RetryExecutorUtil.retryOnExceptions(executor, maxRetries, minDelay, NoHostAvailableException.class)
+ .getWithRetry(getClusterRetryCallable(configuration, servers, queryLoggerConfiguration))
+ .get();
+ }
+
+ private RetryCallable<Cluster> getClusterRetryCallable(PropertiesConfiguration configuration, List<Host> servers, QueryLoggerConfiguration queryLoggerConfiguration) {
+ LOGGER.info("Trying to connect to Cassandra service at {} (list {})", LocalDateTime.now(), servers);
+
+ return context -> {
+ Cluster cluster = ClusterBuilder.builder()
+ .servers(servers)
+ .poolingOptions(readPoolingOptions(configuration))
+ .queryLoggerConfiguration(queryLoggerConfiguration)
+ .readTimeoutMillis(configuration.getInt("cassandra.readTimeoutMillis", DEFAULT_READ_TIMEOUT_MILLIS))
+ .connectTimeoutMillis(configuration.getInt("cassandra.connectTimeoutMillis", DEFAULT_CONNECT_TIMEOUT_MILLIS))
+ .build();
+ try {
+ return ClusterWithKeyspaceCreatedFactory
+ .config(cluster,
+ configuration.getString("cassandra.keyspace", DEFAULT_KEYSPACE))
+ .replicationFactor(configuration.getInt("cassandra.replication.factor", DEFAULT_REPLICATION_FACTOR))
+ .clusterWithInitializedKeyspace();
+ } catch (Exception e) {
+ cluster.close();
+ throw e;
+ }
+ };
+ }
+
+ private Optional<PoolingOptions> readPoolingOptions(PropertiesConfiguration configuration) {
+
+ Optional<Integer> maxConnections = Optional.ofNullable(configuration.getInteger("cassandra.pooling.local.max.connections", null));
+ Optional<Integer> maxRequests = Optional.ofNullable(configuration.getInteger("cassandra.pooling.local.max.requests", null));
+ Optional<Integer> poolingTimeout = Optional.ofNullable(configuration.getInteger("cassandra.pooling.timeout", null));
+ Optional<Integer> heartbeatTimeout = Optional.ofNullable(configuration.getInteger("cassandra.pooling.heartbeat.timeout", null));
+
+ if (!maxConnections.isPresent()
+ && !maxRequests.isPresent()
+ && !poolingTimeout.isPresent()
+ && !heartbeatTimeout.isPresent()) {
+ return Optional.empty();
+ }
+ PoolingOptions result = new PoolingOptions();
+
+ maxConnections.ifPresent(value -> {
+ result.setMaxConnectionsPerHost(HostDistance.LOCAL, value);
+ result.setMaxConnectionsPerHost(HostDistance.REMOTE, value);
+ });
+ maxRequests.ifPresent(value -> {
+ result.setMaxRequestsPerConnection(HostDistance.LOCAL, value);
+ result.setMaxRequestsPerConnection(HostDistance.REMOTE, value);
+ });
+ poolingTimeout.ifPresent(result::setPoolTimeoutMillis);
+ heartbeatTimeout.ifPresent(result::setHeartbeatIntervalSeconds);
+
+ return Optional.of(result);
+ }
+
+ private List<Host> listCassandraServers(PropertiesConfiguration configuration) {
+ String[] ipAndPorts = configuration.getStringArray(CASSANDRA_NODES);
+
+ return Arrays.stream(ipAndPorts)
+ .map(string -> Host.parseConfString(string, ClusterBuilder.DEFAULT_CASSANDRA_PORT))
+ .collect(Guavate.toImmutableList());
+ }
+
+ private Optional<Integer> getOptionalIntegerFromConf(PropertiesConfiguration configuration, String key) {
+ return Optional.ofNullable(configuration.getInteger(key, null));
+ }
+
+ private Optional<Double> getOptionalDoubleFromConf(PropertiesConfiguration configuration, String key) {
+ return Optional.ofNullable(configuration.getDouble(key, null));
+ }
+
+ private QueryLoggerConfiguration getCassandraQueryLoggerConf(PropertiesConfiguration configuration) {
+ QueryLoggerConfiguration.Builder builder = QueryLoggerConfiguration.builder();
+
+ Optional<Long> constantThreshold = getOptionalIntegerFromConf(configuration, "cassandra.query.logger.constant.threshold")
+ .map(Long::valueOf);
+
+ constantThreshold.ifPresent(builder::withConstantThreshold);
+
+ getOptionalIntegerFromConf(configuration, "cassandra.query.logger.max.logged.parameters")
+ .ifPresent(builder::withMaxLoggedParameters);
+
+ getOptionalIntegerFromConf(configuration, "cassandra.query.logger.max.query.string.length")
+ .ifPresent(builder::withMaxQueryStringLength);
+
+ getOptionalIntegerFromConf(configuration, "cassandra.query.logger.max.parameter.value.length")
+ .ifPresent(builder::withMaxParameterValueLength);
+
+ Optional<Double> percentileLatencyConf = getOptionalDoubleFromConf(configuration, "cassandra.query.slow.query.latency.threshold.percentile");
+
+ if (!percentileLatencyConf.isPresent() && !constantThreshold.isPresent()) {
+ percentileLatencyConf = Optional.of(QueryLogger.DEFAULT_SLOW_QUERY_THRESHOLD_PERCENTILE);
+ }
+
+ percentileLatencyConf.ifPresent(slowQueryLatencyThresholdPercentile -> {
+ PerHostPercentileTracker tracker = PerHostPercentileTracker
+ .builder(CASSANDRA_HIGHEST_TRACKABLE_LATENCY_MILLIS)
+ .build();
+
+ builder.withDynamicThreshold(tracker, slowQueryLatencyThresholdPercentile);
+ });
+
+ return builder.build();
+ }
+
+ public Cluster get() {
+ return cluster;
+ }
+
+ @PreDestroy
+ public void stop() {
+ cluster.closeAsync();
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/james-project/blob/a18a4488/server/container/guice/cassandra-guice/src/test/java/org/apache/james/CassandraJamesServerTest.java
----------------------------------------------------------------------
diff --git a/server/container/guice/cassandra-guice/src/test/java/org/apache/james/CassandraJamesServerTest.java b/server/container/guice/cassandra-guice/src/test/java/org/apache/james/CassandraJamesServerTest.java
index b15491e..5b4dbd6 100644
--- a/server/container/guice/cassandra-guice/src/test/java/org/apache/james/CassandraJamesServerTest.java
+++ b/server/container/guice/cassandra-guice/src/test/java/org/apache/james/CassandraJamesServerTest.java
@@ -19,16 +19,20 @@
package org.apache.james;
+import org.junit.ClassRule;
import org.junit.Rule;
public class CassandraJamesServerTest extends AbstractJmapJamesServerTest {
+ @ClassRule
+ public static DockerCassandraRule cassandra = new DockerCassandraRule();
+
@Rule
public CassandraJmapTestRule cassandraJmap = CassandraJmapTestRule.defaultTestRule();
@Override
protected GuiceJamesServer createJamesServer() {
- return cassandraJmap.jmapServer();
+ return cassandraJmap.jmapServer(cassandra.getModule());
}
@Override
http://git-wip-us.apache.org/repos/asf/james-project/blob/a18a4488/server/container/guice/cassandra-guice/src/test/java/org/apache/james/CassandraJmapTestRule.java
----------------------------------------------------------------------
diff --git a/server/container/guice/cassandra-guice/src/test/java/org/apache/james/CassandraJmapTestRule.java b/server/container/guice/cassandra-guice/src/test/java/org/apache/james/CassandraJmapTestRule.java
index d57d171..5b031a4 100644
--- a/server/container/guice/cassandra-guice/src/test/java/org/apache/james/CassandraJmapTestRule.java
+++ b/server/container/guice/cassandra-guice/src/test/java/org/apache/james/CassandraJmapTestRule.java
@@ -34,8 +34,7 @@ public class CassandraJmapTestRule implements TestRule {
private static final int LIMIT_TO_3_MESSAGES = 3;
public static CassandraJmapTestRule defaultTestRule() {
- return new CassandraJmapTestRule(
- AggregateGuiceModuleTestRule.of(new EmbeddedElasticSearchRule(), new EmbeddedCassandraRule()));
+ return new CassandraJmapTestRule(new EmbeddedElasticSearchRule());
}
private GuiceModuleTestRule guiceModuleTestRule;
http://git-wip-us.apache.org/repos/asf/james-project/blob/a18a4488/server/container/guice/cassandra-guice/src/test/java/org/apache/james/CassandraLogConfigurationTest.java
----------------------------------------------------------------------
diff --git a/server/container/guice/cassandra-guice/src/test/java/org/apache/james/CassandraLogConfigurationTest.java b/server/container/guice/cassandra-guice/src/test/java/org/apache/james/CassandraLogConfigurationTest.java
index 659453e..090c1ff 100644
--- a/server/container/guice/cassandra-guice/src/test/java/org/apache/james/CassandraLogConfigurationTest.java
+++ b/server/container/guice/cassandra-guice/src/test/java/org/apache/james/CassandraLogConfigurationTest.java
@@ -27,7 +27,7 @@ import java.nio.channels.SocketChannel;
import java.nio.charset.Charset;
import org.apache.commons.configuration.PropertiesConfiguration;
-import org.apache.james.modules.mailbox.CassandraSessionConfiguration;
+import org.apache.james.backends.cassandra.init.CassandraSessionConfiguration;
import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
@@ -69,7 +69,7 @@ public class CassandraLogConfigurationTest {
public void serverShouldStartWithMinimalConfigAboutAConstantThresholdSlowQueryLogger() throws Exception {
jamesServer = cassandraJmapTestRule.jmapServer(
(binder) -> binder.bind(CassandraSessionConfiguration.class).toInstance(() -> {
- PropertiesConfiguration configuration = dockerCassandraRule.getCassandraConfigurationForDocker();
+ PropertiesConfiguration configuration = dockerCassandraRule.getCassandraConfigurationForDocker("keyspace1");
configuration.addProperty("cassandra.query.logger.constant.threshold", 100);
@@ -84,7 +84,7 @@ public class CassandraLogConfigurationTest {
jamesServer = cassandraJmapTestRule.jmapServer(
(binder) ->
binder.bind(CassandraSessionConfiguration.class).toInstance(() -> {
- PropertiesConfiguration configuration = dockerCassandraRule.getCassandraConfigurationForDocker();
+ PropertiesConfiguration configuration = dockerCassandraRule.getCassandraConfigurationForDocker("keyspace2");
configuration.addProperty("cassandra.query.slow.query.latency.threshold.percentile", 90);
configuration.addProperty("cassandra.query.logger.max.logged.parameters", 9);
@@ -104,7 +104,7 @@ public class CassandraLogConfigurationTest {
jamesServer = cassandraJmapTestRule.jmapServer(
(binder) ->
binder.bind(CassandraSessionConfiguration.class).toInstance(() -> {
- PropertiesConfiguration configuration = dockerCassandraRule.getCassandraConfigurationForDocker();
+ PropertiesConfiguration configuration = dockerCassandraRule.getCassandraConfigurationForDocker("keyspace3");
configuration.addProperty("cassandra.query.slow.query.latency.threshold.percentile", 90);
configuration.addProperty("cassandra.query.logger.constant.threshold", 100);
http://git-wip-us.apache.org/repos/asf/james-project/blob/a18a4488/server/container/guice/cassandra-guice/src/test/java/org/apache/james/CassandraMessageIdManagerInjectionTest.java
----------------------------------------------------------------------
diff --git a/server/container/guice/cassandra-guice/src/test/java/org/apache/james/CassandraMessageIdManagerInjectionTest.java b/server/container/guice/cassandra-guice/src/test/java/org/apache/james/CassandraMessageIdManagerInjectionTest.java
index e8395cb..b88289a 100644
--- a/server/container/guice/cassandra-guice/src/test/java/org/apache/james/CassandraMessageIdManagerInjectionTest.java
+++ b/server/container/guice/cassandra-guice/src/test/java/org/apache/james/CassandraMessageIdManagerInjectionTest.java
@@ -30,6 +30,7 @@ import org.apache.james.mailbox.MessageIdManager;
import org.apache.james.utils.ConfigurationPerformer;
import org.junit.After;
import org.junit.Before;
+import org.junit.ClassRule;
import org.junit.Rule;
import org.junit.Test;
@@ -40,8 +41,12 @@ import com.google.inject.multibindings.Multibinder;
public class CassandraMessageIdManagerInjectionTest {
+ @ClassRule
+ public static DockerCassandraRule cassandra = new DockerCassandraRule();
+
@Rule
public CassandraJmapTestRule cassandraJmap = CassandraJmapTestRule.defaultTestRule();
+
private GuiceJamesServer server;
@Before
@@ -52,7 +57,7 @@ public class CassandraMessageIdManagerInjectionTest {
Multibinder.newSetBinder(binder(), ConfigurationPerformer.class).addBinding().to(CallMe.class);
}
};
- server = cassandraJmap.jmapServer(module);
+ server = cassandraJmap.jmapServer(module, cassandra.getModule());
server.start();
}
http://git-wip-us.apache.org/repos/asf/james-project/blob/a18a4488/server/container/guice/cassandra-guice/src/test/java/org/apache/james/CassandraNodeConfTest.java
----------------------------------------------------------------------
diff --git a/server/container/guice/cassandra-guice/src/test/java/org/apache/james/CassandraNodeConfTest.java b/server/container/guice/cassandra-guice/src/test/java/org/apache/james/CassandraNodeConfTest.java
index 9bc6de5..1124382 100644
--- a/server/container/guice/cassandra-guice/src/test/java/org/apache/james/CassandraNodeConfTest.java
+++ b/server/container/guice/cassandra-guice/src/test/java/org/apache/james/CassandraNodeConfTest.java
@@ -27,15 +27,18 @@ import java.nio.channels.SocketChannel;
import java.nio.charset.Charset;
import org.apache.commons.configuration.PropertiesConfiguration;
-import org.apache.james.modules.mailbox.CassandraSessionConfiguration;
+import org.apache.james.backends.cassandra.init.CassandraSessionConfiguration;
import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.testcontainers.DockerClientFactory;
+import com.google.common.base.Joiner;
+
public class CassandraNodeConfTest {
+ private static final int CASSANDRA_PORT = 9042;
private static final int IMAP_PORT = 1143;
private static String getDockerHostIp() {
@@ -74,7 +77,10 @@ public class CassandraNodeConfTest {
@Test
public void serverShouldStartWhenOneCassandraNodeIsUnreachable() throws Exception {
String unreachableNode = "10.2.3.42";
- PropertiesConfiguration configuration = getCassandraConfigurationForDocker(unreachableNode + "," + dockerCassandraRule.getIp());
+ PropertiesConfiguration configuration = getCassandraConfigurationForDocker(
+ Joiner.on(',')
+ .join(unreachableNode,
+ dockerCassandraRule.getIp() + ":" + dockerCassandraRule.getMappedPort(CASSANDRA_PORT)));
jamesServer = cassandraJmapTestRule.jmapServer(
(binder) -> binder.bind(CassandraSessionConfiguration.class).toInstance(() -> configuration));
@@ -84,7 +90,7 @@ public class CassandraNodeConfTest {
@Test
public void configShouldWorkWithNonDefaultPort() throws Exception {
- PropertiesConfiguration configuration = getCassandraConfigurationForDocker(getDockerHostIp() + ":" + dockerCassandraRule.getBindingPort());
+ PropertiesConfiguration configuration = getCassandraConfigurationForDocker(getDockerHostIp() + ":" + dockerCassandraRule.getMappedPort(CASSANDRA_PORT));
jamesServer = cassandraJmapTestRule.jmapServer(
(binder) -> binder.bind(CassandraSessionConfiguration.class).toInstance(() -> configuration));
http://git-wip-us.apache.org/repos/asf/james-project/blob/a18a4488/server/container/guice/cassandra-guice/src/test/java/org/apache/james/CassandraVersionCheckingTest.java
----------------------------------------------------------------------
diff --git a/server/container/guice/cassandra-guice/src/test/java/org/apache/james/CassandraVersionCheckingTest.java b/server/container/guice/cassandra-guice/src/test/java/org/apache/james/CassandraVersionCheckingTest.java
index f66c7bb..9e71aa6 100644
--- a/server/container/guice/cassandra-guice/src/test/java/org/apache/james/CassandraVersionCheckingTest.java
+++ b/server/container/guice/cassandra-guice/src/test/java/org/apache/james/CassandraVersionCheckingTest.java
@@ -34,6 +34,7 @@ import org.apache.james.backends.cassandra.versions.CassandraSchemaVersionDAO;
import org.apache.james.backends.cassandra.versions.CassandraSchemaVersionManager;
import org.junit.After;
import org.junit.Before;
+import org.junit.ClassRule;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
@@ -45,6 +46,10 @@ public class CassandraVersionCheckingTest {
private static final int MIN_VERSION = 2;
private static final int MAX_VERSION = 4;
+
+ @ClassRule
+ public static DockerCassandraRule cassandra = new DockerCassandraRule();
+
@Rule
public CassandraJmapTestRule cassandraJmapTestRule = CassandraJmapTestRule.defaultTestRule();
@@ -75,6 +80,7 @@ public class CassandraVersionCheckingTest {
.thenReturn(CompletableFuture.completedFuture(Optional.of(MAX_VERSION)));
jamesServer = cassandraJmapTestRule.jmapServer(
+ cassandra.getModule(),
binder -> binder.bind(CassandraSchemaVersionDAO.class)
.toInstance(versionDAO),
binder -> binder.bind(CassandraSchemaVersionManager.class)
@@ -89,6 +95,7 @@ public class CassandraVersionCheckingTest {
.thenReturn(CompletableFuture.completedFuture(Optional.of(MIN_VERSION + 1)));
jamesServer = cassandraJmapTestRule.jmapServer(
+ cassandra.getModule(),
binder -> binder.bind(CassandraSchemaVersionDAO.class)
.toInstance(versionDAO),
binder -> binder.bind(CassandraSchemaVersionManager.class)
@@ -103,6 +110,7 @@ public class CassandraVersionCheckingTest {
.thenReturn(CompletableFuture.completedFuture(Optional.of(MIN_VERSION)));
jamesServer = cassandraJmapTestRule.jmapServer(
+ cassandra.getModule(),
binder -> binder.bind(CassandraSchemaVersionDAO.class)
.toInstance(versionDAO),
binder -> binder.bind(CassandraSchemaVersionManager.class)
@@ -117,6 +125,7 @@ public class CassandraVersionCheckingTest {
.thenReturn(CompletableFuture.completedFuture(Optional.of(MIN_VERSION - 1)));
jamesServer = cassandraJmapTestRule.jmapServer(
+ cassandra.getModule(),
binder -> binder.bind(CassandraSchemaVersionDAO.class)
.toInstance(versionDAO),
binder -> binder.bind(CassandraSchemaVersionManager.class)
@@ -133,6 +142,7 @@ public class CassandraVersionCheckingTest {
.thenReturn(CompletableFuture.completedFuture(Optional.of(MAX_VERSION + 1)));
jamesServer = cassandraJmapTestRule.jmapServer(
+ cassandra.getModule(),
binder -> binder.bind(CassandraSchemaVersionDAO.class)
.toInstance(versionDAO),
binder -> binder.bind(CassandraSchemaVersionManager.class)
http://git-wip-us.apache.org/repos/asf/james-project/blob/a18a4488/server/container/guice/cassandra-guice/src/test/java/org/apache/james/CassandraWithTikaTest.java
----------------------------------------------------------------------
diff --git a/server/container/guice/cassandra-guice/src/test/java/org/apache/james/CassandraWithTikaTest.java b/server/container/guice/cassandra-guice/src/test/java/org/apache/james/CassandraWithTikaTest.java
index 5894933..479a82d 100644
--- a/server/container/guice/cassandra-guice/src/test/java/org/apache/james/CassandraWithTikaTest.java
+++ b/server/container/guice/cassandra-guice/src/test/java/org/apache/james/CassandraWithTikaTest.java
@@ -29,7 +29,7 @@ public class CassandraWithTikaTest extends AbstractJmapJamesServerTest {
public CassandraJmapTestRule cassandraJmap = new CassandraJmapTestRule(
AggregateGuiceModuleTestRule.of(
new EmbeddedElasticSearchRule(),
- new EmbeddedCassandraRule(),
+ new DockerCassandraRule(),
guiceTikaRule));
@Override
http://git-wip-us.apache.org/repos/asf/james-project/blob/a18a4488/server/container/guice/cassandra-guice/src/test/java/org/apache/james/DefaultCassandraJamesServerTest.java
----------------------------------------------------------------------
diff --git a/server/container/guice/cassandra-guice/src/test/java/org/apache/james/DefaultCassandraJamesServerTest.java b/server/container/guice/cassandra-guice/src/test/java/org/apache/james/DefaultCassandraJamesServerTest.java
index 4c41e12..c2960e4 100644
--- a/server/container/guice/cassandra-guice/src/test/java/org/apache/james/DefaultCassandraJamesServerTest.java
+++ b/server/container/guice/cassandra-guice/src/test/java/org/apache/james/DefaultCassandraJamesServerTest.java
@@ -27,11 +27,15 @@ import org.apache.james.utils.FailingPropertiesProvider;
import org.apache.james.utils.PropertiesProvider;
import org.junit.After;
import org.junit.Before;
+import org.junit.ClassRule;
import org.junit.Rule;
import org.junit.Test;
public class DefaultCassandraJamesServerTest {
+ @ClassRule
+ public static DockerCassandraRule cassandra = new DockerCassandraRule();
+
@Rule
public CassandraJmapTestRule cassandraJmap = CassandraJmapTestRule.defaultTestRule();
@@ -39,7 +43,7 @@ public class DefaultCassandraJamesServerTest {
@Before
public void setUp() {
- guiceJamesServer = cassandraJmap.jmapServer()
+ guiceJamesServer = cassandraJmap.jmapServer(cassandra.getModule())
.overrideWith(binder -> binder.bind(PropertiesProvider.class).to(FailingPropertiesProvider.class))
.overrideWith(binder -> binder.bind(ConfigurationProvider.class).toInstance(s -> new HierarchicalConfiguration()));
}
http://git-wip-us.apache.org/repos/asf/james-project/blob/a18a4488/server/container/guice/cassandra-guice/src/test/java/org/apache/james/DockerCassandraRule.java
----------------------------------------------------------------------
diff --git a/server/container/guice/cassandra-guice/src/test/java/org/apache/james/DockerCassandraRule.java b/server/container/guice/cassandra-guice/src/test/java/org/apache/james/DockerCassandraRule.java
index 232c57b..dc7c199 100644
--- a/server/container/guice/cassandra-guice/src/test/java/org/apache/james/DockerCassandraRule.java
+++ b/server/container/guice/cassandra-guice/src/test/java/org/apache/james/DockerCassandraRule.java
@@ -18,33 +18,25 @@
****************************************************************/
package org.apache.james;
-import java.util.Arrays;
-
import org.apache.commons.configuration.PropertiesConfiguration;
-import org.apache.james.modules.mailbox.CassandraSessionConfiguration;
-import org.apache.james.util.streams.SwarmGenericContainer;
+import org.apache.commons.lang3.RandomStringUtils;
+import org.apache.james.backends.cassandra.init.CassandraSessionConfiguration;
import org.junit.runner.Description;
import org.junit.runners.model.Statement;
+import org.testcontainers.containers.GenericContainer;
-import com.github.dockerjava.api.model.ExposedPort;
-import com.github.dockerjava.api.model.Ports;
import com.google.inject.Module;
public class DockerCassandraRule implements GuiceModuleTestRule {
- private static final int CASSANDRA_PORT = 9042;
-
- private static boolean isBindingToEveryThing(Ports.Binding binding) {
- String bindingIp = binding.getHostIp();
- return bindingIp == null || bindingIp.equals("0.0.0.0");
- }
-
- public PropertiesConfiguration getCassandraConfigurationForDocker() {
+ private org.apache.james.backends.cassandra.DockerCassandraRule cassandraContainer = new org.apache.james.backends.cassandra.DockerCassandraRule();
+
+ public PropertiesConfiguration getCassandraConfigurationForDocker(String keyspace) {
PropertiesConfiguration configuration = new PropertiesConfiguration();
- configuration.addProperty("cassandra.nodes", getIp() + ":" + CASSANDRA_PORT);
- configuration.addProperty("cassandra.keyspace", "apache_james");
+ configuration.addProperty("cassandra.nodes", cassandraContainer.getIp() + ":" + cassandraContainer.getBindingPort());
+ configuration.addProperty("cassandra.keyspace", keyspace);
configuration.addProperty("cassandra.replication.factor", 1);
configuration.addProperty("cassandra.retryConnection.maxRetries", 20);
configuration.addProperty("cassandra.retryConnection.minDelay", 5000);
@@ -52,9 +44,6 @@ public class DockerCassandraRule implements GuiceModuleTestRule {
return configuration;
}
- private SwarmGenericContainer cassandraContainer = new SwarmGenericContainer("cassandra:2.2")
- .withExposedPorts(CASSANDRA_PORT);
-
@Override
public Statement apply(Statement base, Description description) {
return cassandraContainer.apply(base, description);
@@ -66,29 +55,36 @@ public class DockerCassandraRule implements GuiceModuleTestRule {
@Override
public Module getModule() {
- return (binder) -> binder.bind(CassandraSessionConfiguration.class).toInstance(this::getCassandraConfigurationForDocker);
+ String keyspace = RandomStringUtils.randomAlphabetic(12);
+ return (binder) -> binder.bind(CassandraSessionConfiguration.class).toInstance(() -> getCassandraConfigurationForDocker(keyspace));
}
public String getIp() {
return cassandraContainer.getIp();
}
- public int getBindingPort() {
- Ports.Binding[] bindings = cassandraContainer
- .getContainerInfo()
- .getNetworkSettings()
- .getPorts()
- .getBindings()
- .get(ExposedPort.tcp(CASSANDRA_PORT));
-
- return Integer.valueOf(
- Arrays.stream(bindings)
- .filter(DockerCassandraRule::isBindingToEveryThing)
- .map(Ports.Binding::getHostPortSpec)
- .findFirst().get());
+ public Integer getMappedPort(int originalPort) {
+ return cassandraContainer.getBindingPort();
+ }
+
+ public void start() {
+ cassandraContainer.start();
}
- public SwarmGenericContainer getCassandraContainer() {
- return cassandraContainer;
+ public void stop() {
+ cassandraContainer.stop();
}
+
+ public GenericContainer<?> getRawContainer() {
+ return cassandraContainer.getRawContainer();
+ }
+
+ public void pause() {
+ cassandraContainer.pause();
+ }
+
+ public void unpause() {
+ cassandraContainer.unpause();
+ }
+
}
http://git-wip-us.apache.org/repos/asf/james-project/blob/a18a4488/server/container/guice/cassandra-guice/src/test/java/org/apache/james/DockerElasticSearchRule.java
----------------------------------------------------------------------
diff --git a/server/container/guice/cassandra-guice/src/test/java/org/apache/james/DockerElasticSearchRule.java b/server/container/guice/cassandra-guice/src/test/java/org/apache/james/DockerElasticSearchRule.java
index 4cd4186..75fe4a3 100644
--- a/server/container/guice/cassandra-guice/src/test/java/org/apache/james/DockerElasticSearchRule.java
+++ b/server/container/guice/cassandra-guice/src/test/java/org/apache/james/DockerElasticSearchRule.java
@@ -37,7 +37,7 @@ public class DockerElasticSearchRule implements GuiceModuleTestRule {
PropertiesConfiguration configuration = new PropertiesConfiguration();
configuration.addProperty("elasticsearch.masterHost", getIp());
- configuration.addProperty("elasticsearch.port", ELASTIC_SEARCH_PORT);
+ configuration.addProperty("elasticsearch.port", elasticSearchContainer.getMappedPort(ELASTIC_SEARCH_PORT));
configuration.addProperty("elasticsearch.nb.shards", 1);
configuration.addProperty("elasticsearch.nb.replica", 0);
@@ -45,7 +45,7 @@ public class DockerElasticSearchRule implements GuiceModuleTestRule {
configuration.addProperty("elasticsearch.retryConnection.minDelay", 3000);
configuration.addProperty("elasticsearch.indexAttachments", false);
configuration.addProperty("elasticsearch.http.host", getIp());
- configuration.addProperty("elasticsearch.http.port", ELASTIC_SEARCH_HTTP_PORT);
+ configuration.addProperty("elasticsearch.http.port", elasticSearchContainer.getMappedPort(ELASTIC_SEARCH_HTTP_PORT));
configuration.addProperty("elasticsearch.metrics.reports.enabled", true);
configuration.addProperty("elasticsearch.metrics.reports.period", 30);
configuration.addProperty("elasticsearch.metrics.reports.index", "james-metrics");
@@ -71,10 +71,18 @@ public class DockerElasticSearchRule implements GuiceModuleTestRule {
}
public String getIp() {
- return elasticSearchContainer.getIp();
+ return elasticSearchContainer.getHostIp();
}
public SwarmGenericContainer getElasticSearchContainer() {
return elasticSearchContainer;
}
+
+ public void pause() {
+ elasticSearchContainer.pause();
+ }
+
+ public void unpause() {
+ elasticSearchContainer.unpause();
+ }
}
http://git-wip-us.apache.org/repos/asf/james-project/blob/a18a4488/server/container/guice/cassandra-guice/src/test/java/org/apache/james/ESReporterTest.java
----------------------------------------------------------------------
diff --git a/server/container/guice/cassandra-guice/src/test/java/org/apache/james/ESReporterTest.java b/server/container/guice/cassandra-guice/src/test/java/org/apache/james/ESReporterTest.java
index 2cc679d..2e46abf 100644
--- a/server/container/guice/cassandra-guice/src/test/java/org/apache/james/ESReporterTest.java
+++ b/server/container/guice/cassandra-guice/src/test/java/org/apache/james/ESReporterTest.java
@@ -68,7 +68,7 @@ public class ESReporterTest {
private Timer timer;
@Rule
- public CassandraJmapTestRule cassandraJmap = new CassandraJmapTestRule(embeddedElasticSearchRule, new EmbeddedCassandraRule());
+ public CassandraJmapTestRule cassandraJmap = new CassandraJmapTestRule(embeddedElasticSearchRule, new DockerCassandraRule());
private GuiceJamesServer server;
private AccessToken accessToken;
http://git-wip-us.apache.org/repos/asf/james-project/blob/a18a4488/server/container/guice/cassandra-guice/src/test/java/org/apache/james/EmbeddedCassandraRule.java
----------------------------------------------------------------------
diff --git a/server/container/guice/cassandra-guice/src/test/java/org/apache/james/EmbeddedCassandraRule.java b/server/container/guice/cassandra-guice/src/test/java/org/apache/james/EmbeddedCassandraRule.java
deleted file mode 100644
index c9a65a7..0000000
--- a/server/container/guice/cassandra-guice/src/test/java/org/apache/james/EmbeddedCassandraRule.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/****************************************************************
- * 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;
-import javax.inject.Inject;
-import javax.inject.Provider;
-
-import org.apache.james.backends.cassandra.CassandraCluster;
-import org.apache.james.backends.cassandra.EmbeddedCassandra;
-import org.junit.runner.Description;
-import org.junit.runners.model.Statement;
-
-import com.datastax.driver.core.Session;
-import com.google.inject.Module;
-import com.google.inject.Scopes;
-import com.google.inject.util.Modules;
-
-
-public class EmbeddedCassandraRule implements GuiceModuleTestRule {
-
- public static class SessionProvider implements Provider<Session> {
-
- private final Session session;
-
- @Inject
- private SessionProvider(CassandraCluster cluster) {
- session = cluster.getConf();
- }
-
- @Override
- public Session get() {
- return session;
- }
- }
-
- private EmbeddedCassandra cassandra;
-
- @Override
- public Statement apply(Statement base, Description description) {
- return new Statement() {
- @Override
- public void evaluate() throws Throwable {
- cassandra = EmbeddedCassandra.createStartServer();
- base.evaluate();
- }
- };
- }
-
- @Override
- public void await() {
- }
-
- @Override
- public Module getModule() {
- return Modules.combine(
- (binder) -> binder.bind(EmbeddedCassandra.class).toInstance(cassandra),
- (binder) -> binder.bind(Session.class).toProvider(SessionProvider.class).in(Scopes.SINGLETON));
- }
-}
http://git-wip-us.apache.org/repos/asf/james-project/blob/a18a4488/server/container/guice/cassandra-guice/src/test/java/org/apache/james/JamesCapabilitiesServerTest.java
----------------------------------------------------------------------
diff --git a/server/container/guice/cassandra-guice/src/test/java/org/apache/james/JamesCapabilitiesServerTest.java b/server/container/guice/cassandra-guice/src/test/java/org/apache/james/JamesCapabilitiesServerTest.java
index 3dbce73..5fee8a5 100644
--- a/server/container/guice/cassandra-guice/src/test/java/org/apache/james/JamesCapabilitiesServerTest.java
+++ b/server/container/guice/cassandra-guice/src/test/java/org/apache/james/JamesCapabilitiesServerTest.java
@@ -26,8 +26,6 @@ import java.util.EnumSet;
import org.apache.activemq.store.PersistenceAdapter;
import org.apache.activemq.store.memory.MemoryPersistenceAdapter;
-import org.apache.james.backends.cassandra.CassandraCluster;
-import org.apache.james.backends.cassandra.components.CassandraModule;
import org.apache.james.backends.es.EmbeddedElasticSearch;
import org.apache.james.jmap.methods.GetMessageListMethod;
import org.apache.james.mailbox.MailboxManager;
@@ -41,24 +39,22 @@ import org.junit.Test;
import org.junit.rules.RuleChain;
import org.junit.rules.TemporaryFolder;
-import com.datastax.driver.core.Session;
-import com.google.inject.AbstractModule;
import com.google.inject.Module;
-import com.google.inject.Provides;
-import com.google.inject.Singleton;
public class JamesCapabilitiesServerTest {
private GuiceJamesServer server;
private TemporaryFolder temporaryFolder = new TemporaryFolder();
private EmbeddedElasticSearch embeddedElasticSearch = new EmbeddedElasticSearch(temporaryFolder, MailboxElasticsearchConstants.MAILBOX_INDEX);
-
+ private DockerCassandraRule cassandraServer = new DockerCassandraRule();
+
@Rule
- public RuleChain chain = RuleChain.outerRule(temporaryFolder).around(embeddedElasticSearch);
+ public RuleChain chain = RuleChain.outerRule(temporaryFolder).around(embeddedElasticSearch).around(cassandraServer);
@After
public void teardown() {
server.stop();
+
}
private GuiceJamesServer createCassandraJamesServer(final MailboxManager mailboxManager) {
@@ -69,22 +65,9 @@ public class JamesCapabilitiesServerTest {
.overrideWith((binder) -> binder.bind(PersistenceAdapter.class).to(MemoryPersistenceAdapter.class))
.overrideWith(new TestElasticSearchModule(embeddedElasticSearch),
new TestFilesystemModule(temporaryFolder),
+ cassandraServer.getModule(),
new TestJMAPServerModule(GetMessageListMethod.DEFAULT_MAXIMUM_LIMIT),
- mockMailboxManager,
- new AbstractModule() {
-
- @Override
- protected void configure() {
- }
-
- @Provides
- @Singleton
- Session provideSession(CassandraModule cassandraModule) {
- CassandraCluster cassandra = CassandraCluster.create(cassandraModule);
- return cassandra.getConf();
- }
-
- });
+ mockMailboxManager);
}
@Test
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org