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 2017/11/01 11:00:03 UTC
[05/15] james-project git commit: JAMES-2202 Add an Alias in
ElasticSearch
JAMES-2202 Add an Alias in ElasticSearch
Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/deb93a72
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/deb93a72
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/deb93a72
Branch: refs/heads/master
Commit: deb93a722db3f35a0acb4423fbede5e12959ed98
Parents: aebca5f
Author: benwa <bt...@linagora.com>
Authored: Wed Oct 25 10:53:22 2017 +0700
Committer: benwa <bt...@linagora.com>
Committed: Wed Nov 1 17:54:21 2017 +0700
----------------------------------------------------------------------
.../org/apache/james/backends/es/AliasName.java | 49 +++++++++++++
.../james/backends/es/IndexCreationFactory.java | 42 ++++++++---
.../backends/es/IndexCreationFactoryTest.java | 51 +++++++++++++
.../backends/es/NodeMappingFactoryTest.java | 76 ++++++++++++++++++++
.../backends/es/search/ScrollIterableTest.java | 4 +-
.../MailboxElasticsearchConstants.java | 2 +
.../ElasticSearchIntegrationTest.java | 5 +-
.../host/ElasticSearchHostSystem.java | 5 +-
.../mailbox/ElasticSearchMailboxModule.java | 32 +++++++--
.../james/modules/TestElasticSearchModule.java | 4 +-
.../mailbox/ElasticSearchMailboxModuleTest.java | 39 ++++++++++
src/site/xdoc/server/config-elasticsearch.xml | 5 +-
12 files changed, 293 insertions(+), 21 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/james-project/blob/deb93a72/backends-common/elasticsearch/src/main/java/org/apache/james/backends/es/AliasName.java
----------------------------------------------------------------------
diff --git a/backends-common/elasticsearch/src/main/java/org/apache/james/backends/es/AliasName.java b/backends-common/elasticsearch/src/main/java/org/apache/james/backends/es/AliasName.java
new file mode 100644
index 0000000..80e934a
--- /dev/null
+++ b/backends-common/elasticsearch/src/main/java/org/apache/james/backends/es/AliasName.java
@@ -0,0 +1,49 @@
+/****************************************************************
+ * 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.backends.es;
+
+import java.util.Objects;
+
+public class AliasName {
+ private final String value;
+
+ public AliasName(String value) {
+ this.value = value;
+ }
+
+ public String getValue() {
+ return value;
+ }
+
+ @Override
+ public final boolean equals(Object o) {
+ if (o instanceof AliasName) {
+ AliasName aliasName = (AliasName) o;
+
+ return Objects.equals(this.value, aliasName.value);
+ }
+ return false;
+ }
+
+ @Override
+ public final int hashCode() {
+ return Objects.hash(value);
+ }
+}
http://git-wip-us.apache.org/repos/asf/james-project/blob/deb93a72/backends-common/elasticsearch/src/main/java/org/apache/james/backends/es/IndexCreationFactory.java
----------------------------------------------------------------------
diff --git a/backends-common/elasticsearch/src/main/java/org/apache/james/backends/es/IndexCreationFactory.java b/backends-common/elasticsearch/src/main/java/org/apache/james/backends/es/IndexCreationFactory.java
index 9797ba2..2eb9e1b 100644
--- a/backends-common/elasticsearch/src/main/java/org/apache/james/backends/es/IndexCreationFactory.java
+++ b/backends-common/elasticsearch/src/main/java/org/apache/james/backends/es/IndexCreationFactory.java
@@ -23,6 +23,8 @@ import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder;
import java.io.IOException;
+import org.elasticsearch.action.admin.indices.alias.IndicesAliasesRequest;
+import org.elasticsearch.action.admin.indices.alias.get.GetAliasesRequest;
import org.elasticsearch.client.Client;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.indices.IndexAlreadyExistsException;
@@ -36,31 +38,55 @@ public class IndexCreationFactory {
private static final int DEFAULT_NB_REPLICA = 0;
public static final String CASE_INSENSITIVE = "case_insensitive";
- public static Client createIndex(Client client, IndexName name, int nbShards, int nbReplica) {
+ public static Client createIndexAndAlias(Client client, IndexName indexName, AliasName aliasName, int nbShards, int nbReplica) {
try {
- return createIndex(client, name, generateSetting(nbShards, nbReplica));
+ return createIndexAndAlias(client, indexName, aliasName, generateSetting(nbShards, nbReplica));
} catch (IOException e) {
LOGGER.error("Error while creating index : ", e);
return client;
}
}
- public static Client createIndex(Client client, IndexName name) {
- return createIndex(client, name, DEFAULT_NB_SHARDS, DEFAULT_NB_REPLICA);
+ public static Client createIndexAndAlias(Client client, IndexName indexName, AliasName aliasName) {
+ return createIndexAndAlias(client, indexName, aliasName, DEFAULT_NB_SHARDS, DEFAULT_NB_REPLICA);
}
- private static Client createIndex(Client client, IndexName name, XContentBuilder settings) {
+ private static Client createIndexAndAlias(Client client, IndexName indexName, AliasName aliasName, XContentBuilder settings) {
+ createIndexIfNeeded(client, indexName, settings);
+ createAliasIfNeeded(client, indexName, aliasName);
+ return client;
+ }
+
+ private static void createAliasIfNeeded(Client client, IndexName indexName, AliasName aliasName) {
+ if (!aliasExist(client, aliasName)) {
+ client.admin()
+ .indices()
+ .aliases( new IndicesAliasesRequest()
+ .addAlias(aliasName.getValue(), indexName.getValue()))
+ .actionGet();
+ }
+ }
+
+ private static boolean aliasExist(Client client, AliasName aliasName) {
+ return client.admin()
+ .indices()
+ .aliasesExist(new GetAliasesRequest()
+ .aliases(aliasName.getValue()))
+ .actionGet()
+ .exists();
+ }
+
+ private static void createIndexIfNeeded(Client client, IndexName indexName, XContentBuilder settings) {
try {
client.admin()
.indices()
- .prepareCreate(name.getValue())
+ .prepareCreate(indexName.getValue())
.setSettings(settings)
.execute()
.actionGet();
} catch (IndexAlreadyExistsException exception) {
- LOGGER.info("Index [" + name + "] already exist");
+ LOGGER.info("Index [" + indexName + "] already exist");
}
- return client;
}
private static XContentBuilder generateSetting(int nbShards, int nbReplica) throws IOException {
http://git-wip-us.apache.org/repos/asf/james-project/blob/deb93a72/backends-common/elasticsearch/src/test/java/org/apache/james/backends/es/IndexCreationFactoryTest.java
----------------------------------------------------------------------
diff --git a/backends-common/elasticsearch/src/test/java/org/apache/james/backends/es/IndexCreationFactoryTest.java b/backends-common/elasticsearch/src/test/java/org/apache/james/backends/es/IndexCreationFactoryTest.java
new file mode 100644
index 0000000..dee1142
--- /dev/null
+++ b/backends-common/elasticsearch/src/test/java/org/apache/james/backends/es/IndexCreationFactoryTest.java
@@ -0,0 +1,51 @@
+/****************************************************************
+ * 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.backends.es;
+
+import org.apache.james.backends.es.utils.TestingClientProvider;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.RuleChain;
+import org.junit.rules.TemporaryFolder;
+
+public class IndexCreationFactoryTest {
+ public static final IndexName INDEX_NAME = new IndexName("index");
+ public static final AliasName ALIAS_NAME = new AliasName("alias");
+
+ private TemporaryFolder temporaryFolder = new TemporaryFolder();
+ private EmbeddedElasticSearch embeddedElasticSearch= new EmbeddedElasticSearch(temporaryFolder, INDEX_NAME);
+
+ @Rule
+ public RuleChain ruleChain = RuleChain.outerRule(temporaryFolder).around(embeddedElasticSearch);
+
+ private ClientProvider clientProvider;
+
+ @Before
+ public void setUp() {
+ clientProvider = new TestingClientProvider(embeddedElasticSearch.getNode());
+ IndexCreationFactory.createIndexAndAlias(clientProvider.get(), INDEX_NAME, ALIAS_NAME);
+ }
+
+ @Test
+ public void createIndexAndAliasShouldNotThrowWhenCalledSeveralTime() {
+ IndexCreationFactory.createIndexAndAlias(clientProvider.get(), INDEX_NAME, ALIAS_NAME);
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/james-project/blob/deb93a72/backends-common/elasticsearch/src/test/java/org/apache/james/backends/es/NodeMappingFactoryTest.java
----------------------------------------------------------------------
diff --git a/backends-common/elasticsearch/src/test/java/org/apache/james/backends/es/NodeMappingFactoryTest.java b/backends-common/elasticsearch/src/test/java/org/apache/james/backends/es/NodeMappingFactoryTest.java
new file mode 100644
index 0000000..6aca8d7
--- /dev/null
+++ b/backends-common/elasticsearch/src/test/java/org/apache/james/backends/es/NodeMappingFactoryTest.java
@@ -0,0 +1,76 @@
+/****************************************************************
+ * 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.backends.es;
+
+import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder;
+
+import org.apache.james.backends.es.utils.TestingClientProvider;
+import org.elasticsearch.common.xcontent.XContentBuilder;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.RuleChain;
+import org.junit.rules.TemporaryFolder;
+
+public class NodeMappingFactoryTest {
+ public static final String MESSAGE = "message";
+ public static final IndexName INDEX_NAME = new IndexName("index");
+ public static final AliasName ALIAS_NAME = new AliasName("alias");
+ public static final TypeName TYPE_NAME = new TypeName("type");
+
+ private TemporaryFolder temporaryFolder = new TemporaryFolder();
+ private EmbeddedElasticSearch embeddedElasticSearch = new EmbeddedElasticSearch(temporaryFolder, INDEX_NAME);
+
+ @Rule
+ public RuleChain ruleChain = RuleChain.outerRule(temporaryFolder).around(embeddedElasticSearch);
+
+ private ClientProvider clientProvider;
+
+ @Before
+ public void setUp() throws Exception {
+ clientProvider = new TestingClientProvider(embeddedElasticSearch.getNode());
+ IndexCreationFactory.createIndexAndAlias(clientProvider.get(), INDEX_NAME, ALIAS_NAME);
+ NodeMappingFactory.applyMapping(clientProvider.get(),
+ INDEX_NAME,
+ TYPE_NAME,
+ getMappingsSources());
+ }
+
+ @Test
+ public void applyMappingShouldNotThrowWhenCalledSeveralTime() throws Exception {
+ NodeMappingFactory.applyMapping(clientProvider.get(),
+ INDEX_NAME,
+ TYPE_NAME,
+ getMappingsSources());
+ }
+
+ private XContentBuilder getMappingsSources() throws Exception {
+ return jsonBuilder()
+ .startObject()
+ .startObject(TYPE_NAME.getValue())
+ .startObject(NodeMappingFactory.PROPERTIES)
+ .startObject(MESSAGE)
+ .field(NodeMappingFactory.TYPE, NodeMappingFactory.STRING)
+ .endObject()
+ .endObject()
+ .endObject()
+ .endObject();
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/james-project/blob/deb93a72/backends-common/elasticsearch/src/test/java/org/apache/james/backends/es/search/ScrollIterableTest.java
----------------------------------------------------------------------
diff --git a/backends-common/elasticsearch/src/test/java/org/apache/james/backends/es/search/ScrollIterableTest.java b/backends-common/elasticsearch/src/test/java/org/apache/james/backends/es/search/ScrollIterableTest.java
index 121b8b7..4515f96 100644
--- a/backends-common/elasticsearch/src/test/java/org/apache/james/backends/es/search/ScrollIterableTest.java
+++ b/backends-common/elasticsearch/src/test/java/org/apache/james/backends/es/search/ScrollIterableTest.java
@@ -28,6 +28,7 @@ import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
+import org.apache.james.backends.es.AliasName;
import org.apache.james.backends.es.ClientProvider;
import org.apache.james.backends.es.EmbeddedElasticSearch;
import org.apache.james.backends.es.IndexCreationFactory;
@@ -52,6 +53,7 @@ public class ScrollIterableTest {
public static final int SIZE = 2;
public static final String MESSAGE = "message";
public static final IndexName INDEX_NAME = new IndexName("index");
+ public static final AliasName ALIAS_NAME = new AliasName("alias");
public static final TypeName TYPE_NAME = new TypeName("messages");
private TemporaryFolder temporaryFolder = new TemporaryFolder();
@@ -65,7 +67,7 @@ public class ScrollIterableTest {
@Before
public void setUp() throws Exception {
clientProvider = new TestingClientProvider(embeddedElasticSearch.getNode());
- IndexCreationFactory.createIndex(clientProvider.get(), INDEX_NAME);
+ IndexCreationFactory.createIndexAndAlias(clientProvider.get(), INDEX_NAME, ALIAS_NAME);
embeddedElasticSearch.awaitForElasticSearch();
NodeMappingFactory.applyMapping(clientProvider.get(), INDEX_NAME, TYPE_NAME, getMappingsSources());
}
http://git-wip-us.apache.org/repos/asf/james-project/blob/deb93a72/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/MailboxElasticsearchConstants.java
----------------------------------------------------------------------
diff --git a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/MailboxElasticsearchConstants.java b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/MailboxElasticsearchConstants.java
index 9539e53..fb89b8e 100644
--- a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/MailboxElasticsearchConstants.java
+++ b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/MailboxElasticsearchConstants.java
@@ -19,10 +19,12 @@
package org.apache.james.mailbox.elasticsearch;
+import org.apache.james.backends.es.AliasName;
import org.apache.james.backends.es.IndexName;
import org.apache.james.backends.es.TypeName;
public interface MailboxElasticsearchConstants {
+ AliasName DEFAULT_MAILBOX_ALIAS = new AliasName("mailboxAlias");
IndexName DEFAULT_MAILBOX_INDEX = new IndexName("mailbox");
TypeName MESSAGE_TYPE = new TypeName("message");
}
http://git-wip-us.apache.org/repos/asf/james-project/blob/deb93a72/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIntegrationTest.java
----------------------------------------------------------------------
diff --git a/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIntegrationTest.java b/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIntegrationTest.java
index eaf7764..cab06e5 100644
--- a/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIntegrationTest.java
+++ b/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIntegrationTest.java
@@ -110,9 +110,10 @@ public class ElasticSearchIntegrationTest extends AbstractMessageSearchIndexTest
@Override
protected void initializeMailboxManager() throws Exception {
Client client = NodeMappingFactory.applyMapping(
- IndexCreationFactory.createIndex(
+ IndexCreationFactory.createIndexAndAlias(
new TestingClientProvider(embeddedElasticSearch.getNode()).get(),
- MailboxElasticsearchConstants.DEFAULT_MAILBOX_INDEX),
+ MailboxElasticsearchConstants.DEFAULT_MAILBOX_INDEX,
+ MailboxElasticsearchConstants.DEFAULT_MAILBOX_ALIAS),
MailboxElasticsearchConstants.DEFAULT_MAILBOX_INDEX,
MailboxElasticsearchConstants.MESSAGE_TYPE,
MailboxMappingFactory.getMappingContent());
http://git-wip-us.apache.org/repos/asf/james-project/blob/deb93a72/mpt/impl/imap-mailbox/elasticsearch/src/test/java/org/apache/james/mpt/imapmailbox/elasticsearch/host/ElasticSearchHostSystem.java
----------------------------------------------------------------------
diff --git a/mpt/impl/imap-mailbox/elasticsearch/src/test/java/org/apache/james/mpt/imapmailbox/elasticsearch/host/ElasticSearchHostSystem.java b/mpt/impl/imap-mailbox/elasticsearch/src/test/java/org/apache/james/mpt/imapmailbox/elasticsearch/host/ElasticSearchHostSystem.java
index 948acd8..2a90a99 100644
--- a/mpt/impl/imap-mailbox/elasticsearch/src/test/java/org/apache/james/mpt/imapmailbox/elasticsearch/host/ElasticSearchHostSystem.java
+++ b/mpt/impl/imap-mailbox/elasticsearch/src/test/java/org/apache/james/mpt/imapmailbox/elasticsearch/host/ElasticSearchHostSystem.java
@@ -95,7 +95,10 @@ public class ElasticSearchHostSystem extends JamesImapHostSystem {
private void initFields() {
Client client = NodeMappingFactory.applyMapping(
- IndexCreationFactory.createIndex(new TestingClientProvider(embeddedElasticSearch.getNode()).get(), MailboxElasticsearchConstants.DEFAULT_MAILBOX_INDEX),
+ IndexCreationFactory.createIndexAndAlias(
+ new TestingClientProvider(embeddedElasticSearch.getNode()).get(),
+ MailboxElasticsearchConstants.DEFAULT_MAILBOX_INDEX,
+ MailboxElasticsearchConstants.DEFAULT_MAILBOX_ALIAS),
MailboxElasticsearchConstants.DEFAULT_MAILBOX_INDEX,
MailboxElasticsearchConstants.MESSAGE_TYPE,
MailboxMappingFactory.getMappingContent());
http://git-wip-us.apache.org/repos/asf/james-project/blob/deb93a72/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/ElasticSearchMailboxModule.java
----------------------------------------------------------------------
diff --git a/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/ElasticSearchMailboxModule.java b/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/ElasticSearchMailboxModule.java
index dee84b5..ea59317 100644
--- a/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/ElasticSearchMailboxModule.java
+++ b/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/ElasticSearchMailboxModule.java
@@ -28,6 +28,7 @@ import javax.inject.Singleton;
import org.apache.commons.configuration.ConfigurationException;
import org.apache.commons.configuration.PropertiesConfiguration;
+import org.apache.james.backends.es.AliasName;
import org.apache.james.backends.es.ClientProviderImpl;
import org.apache.james.backends.es.IndexCreationFactory;
import org.apache.james.backends.es.IndexName;
@@ -75,7 +76,8 @@ public class ElasticSearchMailboxModule extends AbstractModule {
}
@Provides
- protected IndexName provideIndexName(ElasticSearchConfiguration elasticSearchConfiguration) throws ConfigurationException {
+ protected IndexName provideIndexName(ElasticSearchConfiguration elasticSearchConfiguration)
+ throws ConfigurationException {
try {
return Optional.ofNullable(elasticSearchConfiguration.getConfiguration()
.getString("elasticsearch.index.name"))
@@ -88,22 +90,37 @@ public class ElasticSearchMailboxModule extends AbstractModule {
}
@Provides
+ protected AliasName provideAliasName(ElasticSearchConfiguration elasticSearchConfiguration)
+ throws ConfigurationException {
+ try {
+ return Optional.ofNullable(elasticSearchConfiguration.getConfiguration()
+ .getString("elasticsearch.alias.name"))
+ .map(AliasName::new)
+ .orElse(MailboxElasticsearchConstants.DEFAULT_MAILBOX_ALIAS);
+ } catch (FileNotFoundException e) {
+ LOGGER.info("Could not find ElasticSearch configuration file. Using default alias {}", MailboxElasticsearchConstants.DEFAULT_MAILBOX_INDEX.getValue());
+ return MailboxElasticsearchConstants.DEFAULT_MAILBOX_ALIAS;
+ }
+ }
+
+ @Provides
@Singleton
protected Client provideClientProvider(ElasticSearchConfiguration elasticSearchConfiguration,
- IndexName indexName,
+ IndexName indexName, AliasName aliasName,
AsyncRetryExecutor executor) throws ConfigurationException, FileNotFoundException, ExecutionException, InterruptedException {
PropertiesConfiguration propertiesReader = elasticSearchConfiguration.getConfiguration();
int maxRetries = propertiesReader.getInt("elasticsearch.retryConnection.maxRetries", DEFAULT_CONNECTION_MAX_RETRIES);
int minDelay = propertiesReader.getInt("elasticsearch.retryConnection.minDelay", DEFAULT_CONNECTION_MIN_DELAY);
return RetryExecutorUtil.retryOnExceptions(executor, maxRetries, minDelay, NoNodeAvailableException.class)
- .getWithRetry(context -> connectToCluster(propertiesReader, indexName))
+ .getWithRetry(context -> connectToCluster(propertiesReader, indexName, aliasName))
.get();
}
- private Client createIndexAndMapping(Client client, IndexName indexName, PropertiesConfiguration propertiesReader) {
- IndexCreationFactory.createIndex(client,
+ private Client createIndexAndMapping(Client client, IndexName indexName, AliasName aliasName, PropertiesConfiguration propertiesReader) {
+ IndexCreationFactory.createIndexAndAlias(client,
indexName,
+ aliasName,
propertiesReader.getInt(ELASTICSEARCH_CONFIGURATION_NAME + ".nb.shards", DEFAULT_NB_SHARDS),
propertiesReader.getInt(ELASTICSEARCH_CONFIGURATION_NAME + ".nb.replica", DEFAULT_NB_REPLICA));
NodeMappingFactory.applyMapping(client,
@@ -113,10 +130,11 @@ public class ElasticSearchMailboxModule extends AbstractModule {
return client;
}
- private Client connectToCluster(PropertiesConfiguration propertiesReader, IndexName indexName) throws ConfigurationException {
+ private Client connectToCluster(PropertiesConfiguration propertiesReader, IndexName indexName, AliasName aliasName)
+ throws ConfigurationException {
LOGGER.info("Trying to connect to ElasticSearch service at {}", LocalDateTime.now());
- return createIndexAndMapping(createClient(propertiesReader), indexName, propertiesReader);
+ return createIndexAndMapping(createClient(propertiesReader), indexName, aliasName, propertiesReader);
}
@Provides
http://git-wip-us.apache.org/repos/asf/james-project/blob/deb93a72/server/container/guice/cassandra-guice/src/test/java/org/apache/james/modules/TestElasticSearchModule.java
----------------------------------------------------------------------
diff --git a/server/container/guice/cassandra-guice/src/test/java/org/apache/james/modules/TestElasticSearchModule.java b/server/container/guice/cassandra-guice/src/test/java/org/apache/james/modules/TestElasticSearchModule.java
index 7a984ec..2b6b272 100644
--- a/server/container/guice/cassandra-guice/src/test/java/org/apache/james/modules/TestElasticSearchModule.java
+++ b/server/container/guice/cassandra-guice/src/test/java/org/apache/james/modules/TestElasticSearchModule.java
@@ -49,7 +49,9 @@ public class TestElasticSearchModule extends AbstractModule{
@Singleton
protected Client provideClientProvider() {
Client client = new TestingClientProvider(embeddedElasticSearch.getNode()).get();
- IndexCreationFactory.createIndex(client, MailboxElasticsearchConstants.DEFAULT_MAILBOX_INDEX);
+ IndexCreationFactory.createIndexAndAlias(client,
+ MailboxElasticsearchConstants.DEFAULT_MAILBOX_INDEX,
+ MailboxElasticsearchConstants.DEFAULT_MAILBOX_ALIAS);
return NodeMappingFactory.applyMapping(client,
MailboxElasticsearchConstants.DEFAULT_MAILBOX_INDEX,
MailboxElasticsearchConstants.MESSAGE_TYPE,
http://git-wip-us.apache.org/repos/asf/james-project/blob/deb93a72/server/container/guice/cassandra-guice/src/test/java/org/apache/james/modules/mailbox/ElasticSearchMailboxModuleTest.java
----------------------------------------------------------------------
diff --git a/server/container/guice/cassandra-guice/src/test/java/org/apache/james/modules/mailbox/ElasticSearchMailboxModuleTest.java b/server/container/guice/cassandra-guice/src/test/java/org/apache/james/modules/mailbox/ElasticSearchMailboxModuleTest.java
index dc590a9..41108e7 100644
--- a/server/container/guice/cassandra-guice/src/test/java/org/apache/james/modules/mailbox/ElasticSearchMailboxModuleTest.java
+++ b/server/container/guice/cassandra-guice/src/test/java/org/apache/james/modules/mailbox/ElasticSearchMailboxModuleTest.java
@@ -29,6 +29,7 @@ import java.util.Optional;
import org.apache.commons.configuration.ConfigurationException;
import org.apache.commons.configuration.PropertiesConfiguration;
+import org.apache.james.backends.es.AliasName;
import org.apache.james.backends.es.IndexName;
import org.apache.james.mailbox.elasticsearch.IndexAttachments;
import org.apache.james.mailbox.elasticsearch.MailboxElasticsearchConstants;
@@ -80,6 +81,44 @@ public class ElasticSearchMailboxModuleTest {
}
@Test
+ public void provideAliasNameShouldRetrievedConfiguredAliasName() throws ConfigurationException {
+ PropertiesConfiguration configuration = new PropertiesConfiguration();
+ String name = "name";
+ configuration.addProperty("elasticsearch.alias.name", name);
+
+ ElasticSearchMailboxModule testee = new ElasticSearchMailboxModule();
+
+ AliasName indexName = testee.provideAliasName(() -> configuration);
+
+ assertThat(indexName)
+ .isEqualTo(new AliasName(name));
+ }
+
+ @Test
+ public void provideAliasNameShouldReturnDefaultAliasNameWhenNone() throws ConfigurationException {
+ PropertiesConfiguration configuration = new PropertiesConfiguration();
+
+ ElasticSearchMailboxModule testee = new ElasticSearchMailboxModule();
+
+ AliasName aliasName = testee.provideAliasName(() -> configuration);
+
+ assertThat(aliasName)
+ .isEqualTo(MailboxElasticsearchConstants.DEFAULT_MAILBOX_ALIAS);
+ }
+
+ @Test
+ public void provideAliasNameShouldReturnDefaultAliasNameWhenError() throws ConfigurationException {
+ ElasticSearchMailboxModule testee = new ElasticSearchMailboxModule();
+
+ AliasName aliasName = testee.provideAliasName(() -> {
+ throw new FileNotFoundException();
+ });
+
+ assertThat(aliasName)
+ .isEqualTo(MailboxElasticsearchConstants.DEFAULT_MAILBOX_ALIAS);
+ }
+
+ @Test
public void provideIndexAttachmentsShouldReturnTrueWhenIndexAttachmentsIsTrueInConfiguration() {
PropertiesConfiguration configuration = new PropertiesConfiguration();
configuration.addProperty("elasticsearch.indexAttachments", true);
http://git-wip-us.apache.org/repos/asf/james-project/blob/deb93a72/src/site/xdoc/server/config-elasticsearch.xml
----------------------------------------------------------------------
diff --git a/src/site/xdoc/server/config-elasticsearch.xml b/src/site/xdoc/server/config-elasticsearch.xml
index 94420c2..2b9ad23 100644
--- a/src/site/xdoc/server/config-elasticsearch.xml
+++ b/src/site/xdoc/server/config-elasticsearch.xml
@@ -57,7 +57,10 @@
<dt><strong>elasticsearch.nb.replica</strong></dt>
<dd>Number of replica for index provisionned by James</dd>
<dt><strong>elasticsearch.index.name</strong></dt>
- <dd>Name of the index to use with Apache James. It will be created if missing.</dd>
+ <dd>Name of the index backed by the alias. It will be created if missing.</dd>
+ <dt><strong>elasticsearch.alias.name</strong></dt>
+ <dd>Name of the alias to use with Apache James. It will be created if missing.
+ The target of the alias is the index name configured above.</dd>
<dt><strong>elasticsearch.retryConnection.maxRetries</strong></dt>
<dd>Number of retries when connecting the cluster</dd>
<dt><strong>elasticsearch.retryConnection.minDelay</strong></dt>
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org