This is an automated email from the ASF dual-hosted git repository. ilgrosso pushed a commit to branch 2_1_X in repository https://gitbox.apache.org/repos/asf/syncope.git
The following commit(s) were added to refs/heads/2_1_X by this push: new aa4c361 Upgrading Elasticsearch aa4c361 is described below commit aa4c36141ea68b3c637a0388455e54270c3c5867 Author: Francesco Chicchiriccò <ilgro...@apache.org> AuthorDate: Wed Nov 21 08:50:59 2018 +0100 Upgrading Elasticsearch --- .../elasticsearch/client/ElasticsearchUtils.java | 7 +- .../java/job/ElasticsearchReindex.java | 136 +++++++++------------ .../syncope/core/logic/init/ElasticsearchInit.java | 5 +- .../fit/core/reference/ITImplementationLookup.java | 1 - pom.xml | 4 +- .../workingwithapachesyncope/customization.adoc | 12 +- 6 files changed, 67 insertions(+), 98 deletions(-) diff --git a/ext/elasticsearch/client-elasticsearch/src/main/java/org/apache/syncope/ext/elasticsearch/client/ElasticsearchUtils.java b/ext/elasticsearch/client-elasticsearch/src/main/java/org/apache/syncope/ext/elasticsearch/client/ElasticsearchUtils.java index f5b69be..464d94e 100644 --- a/ext/elasticsearch/client-elasticsearch/src/main/java/org/apache/syncope/ext/elasticsearch/client/ElasticsearchUtils.java +++ b/ext/elasticsearch/client-elasticsearch/src/main/java/org/apache/syncope/ext/elasticsearch/client/ElasticsearchUtils.java @@ -186,11 +186,6 @@ public class ElasticsearchUtils { } public String getContextDomainName(final AnyTypeKind kind) { - return AuthContextUtils.getDomain().toLowerCase() - + (kind.equals(AnyTypeKind.USER) - ? "_user" - : (kind.equals(AnyTypeKind.GROUP) - ? "_group" - : "_anyobject")); + return AuthContextUtils.getDomain().toLowerCase() + "_" + kind.name().toLowerCase(); } } diff --git a/ext/elasticsearch/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/ElasticsearchReindex.java b/ext/elasticsearch/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/ElasticsearchReindex.java index 1a3331f..b2e1a43 100644 --- a/ext/elasticsearch/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/ElasticsearchReindex.java +++ b/ext/elasticsearch/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/ElasticsearchReindex.java @@ -18,6 +18,7 @@ */ package org.apache.syncope.core.provisioning.java.job; +import java.io.IOException; import java.util.concurrent.ExecutionException; import org.apache.syncope.common.lib.types.AnyTypeKind; import org.apache.syncope.core.persistence.api.dao.AnyDAO; @@ -66,72 +67,16 @@ public class ElasticsearchReindex extends AbstractSchedTaskJobDelegate { @Override protected String doExecute(final boolean dryRun) throws JobExecutionException { if (!dryRun) { + LOG.debug("Start rebuilding indexes"); + try { - checkExistsIndexResponse(AnyTypeKind.USER); - checkExistsIndexResponse(AnyTypeKind.GROUP); - checkExistsIndexResponse(AnyTypeKind.ANY_OBJECT); - - XContentBuilder settings = XContentFactory.jsonBuilder(). - startObject(). - startObject("analysis"). - startObject("analyzer"). - startObject("string_lowercase"). - field("type", "custom"). - field("tokenizer", "standard"). - field("filter"). - startArray(). - value("lowercase"). - endArray(). - endObject(). - endObject(). - endObject(). - endObject(); - XContentBuilder mappingUser = XContentFactory.jsonBuilder(). - startObject(). - startArray("dynamic_templates"). - startObject(). - startObject("strings"). - field("match_mapping_type", "string"). - startObject("mapping"). - field("type", "keyword"). - field("analyzer", "string_lowercase"). - endObject(). - endObject(). - endObject(). - endArray(). - endObject(); - XContentBuilder mappingGroup = XContentFactory.jsonBuilder(). - startObject(). - startArray("dynamic_templates"). - startObject(). - startObject("strings"). - field("match_mapping_type", "string"). - startObject("mapping"). - field("type", "keyword"). - field("analyzer", "string_lowercase"). - endObject(). - endObject(). - endObject(). - endArray(). - endObject(); - XContentBuilder mappingAnyobject = XContentFactory.jsonBuilder(). - startObject(). - startArray("dynamic_templates"). - startObject(). - startObject("strings"). - field("match_mapping_type", "string"). - startObject("mapping"). - field("type", "keyword"). - field("analyzer", "string_lowercase"). - endObject(). - endObject(). - endObject(). - endArray(). - endObject(); - - createIndexResponse(AnyTypeKind.USER, settings, mappingUser); - createIndexResponse(AnyTypeKind.GROUP, settings, mappingGroup); - createIndexResponse(AnyTypeKind.ANY_OBJECT, settings, mappingAnyobject); + removeIndexIfExists(AnyTypeKind.USER); + removeIndexIfExists(AnyTypeKind.GROUP); + removeIndexIfExists(AnyTypeKind.ANY_OBJECT); + + createIndex(AnyTypeKind.USER); + createIndex(AnyTypeKind.GROUP); + createIndex(AnyTypeKind.ANY_OBJECT); LOG.debug("Indexing users..."); for (int page = 1; page <= (userDAO.count() / AnyDAO.DEFAULT_PAGE_SIZE) + 1; page++) { @@ -145,6 +90,7 @@ public class ElasticsearchReindex extends AbstractSchedTaskJobDelegate { LOG.debug("Index successfully created for {}: {}", user, response); } } + LOG.debug("Indexing groups..."); for (int page = 1; page <= (groupDAO.count() / AnyDAO.DEFAULT_PAGE_SIZE) + 1; page++) { for (Group group : groupDAO.findAll(page, AnyDAO.DEFAULT_PAGE_SIZE)) { @@ -157,6 +103,7 @@ public class ElasticsearchReindex extends AbstractSchedTaskJobDelegate { LOG.debug("Index successfully created for {}: {}", group, response); } } + LOG.debug("Indexing any objects..."); for (int page = 1; page <= (anyObjectDAO.count() / AnyDAO.DEFAULT_PAGE_SIZE) + 1; page++) { for (AnyObject anyObject : anyObjectDAO.findAll(page, AnyDAO.DEFAULT_PAGE_SIZE)) { @@ -170,19 +117,18 @@ public class ElasticsearchReindex extends AbstractSchedTaskJobDelegate { } } - LOG.debug("Rebuild index {} successfully completed", AuthContextUtils.getDomain().toLowerCase()); + LOG.debug("Rebuild indexes for domain {} successfully completed", AuthContextUtils.getDomain()); } catch (Exception e) { - throw new JobExecutionException( - "While rebuilding index " + AuthContextUtils.getDomain().toLowerCase(), e); + throw new JobExecutionException("While rebuilding index for domain " + AuthContextUtils.getDomain(), e); } } return "SUCCESS"; } - private void checkExistsIndexResponse(final AnyTypeKind kind) throws InterruptedException, ExecutionException { - LOG.debug("Start rebuild index {}", - elasticsearchUtils.getContextDomainName(kind)); + private void removeIndexIfExists(final AnyTypeKind kind) + throws InterruptedException, ExecutionException { + IndicesExistsResponse existsIndexResponse = client.admin().indices(). exists(new IndicesExistsRequest(elasticsearchUtils.getContextDomainName(kind))). get(); @@ -195,17 +141,45 @@ public class ElasticsearchReindex extends AbstractSchedTaskJobDelegate { } } - private void createIndexResponse(final AnyTypeKind kind, - final XContentBuilder settings, - final XContentBuilder mapping) throws InterruptedException, ExecutionException { - - CreateIndexResponse createIndexResponseUser = client.admin().indices(). - create(new CreateIndexRequest(elasticsearchUtils.getContextDomainName(kind)). - settings(settings). - mapping(kind.name(), mapping)). - get(); + private void createIndex(final AnyTypeKind kind) + throws InterruptedException, ExecutionException, IOException { + + XContentBuilder settings = XContentFactory.jsonBuilder(). + startObject(). + startObject("analysis"). + startObject("analyzer"). + startObject("string_lowercase"). + field("type", "custom"). + field("tokenizer", "standard"). + field("filter"). + startArray(). + value("lowercase"). + endArray(). + endObject(). + endObject(). + endObject(). + endObject(); + + XContentBuilder mapping = XContentFactory.jsonBuilder(). + startObject(). + startArray("dynamic_templates"). + startObject(). + startObject("strings"). + field("match_mapping_type", "string"). + startObject("mapping"). + field("type", "keyword"). + field("analyzer", "string_lowercase"). + endObject(). + endObject(). + endObject(). + endArray(). + endObject(); + + CreateIndexResponse response = client.admin().indices(). + create(new CreateIndexRequest(elasticsearchUtils.getContextDomainName(kind)).settings(settings). + mapping(kind.name(), mapping)).get(); LOG.debug("Successfully created {} for {}: {}", - elasticsearchUtils.getContextDomainName(kind), kind.name(), createIndexResponseUser); + elasticsearchUtils.getContextDomainName(kind), kind.name(), response); } @Override diff --git a/fit/core-reference/src/main/java/org/apache/syncope/core/logic/init/ElasticsearchInit.java b/fit/core-reference/src/main/java/org/apache/syncope/core/logic/init/ElasticsearchInit.java index 60d1893..404f789 100644 --- a/fit/core-reference/src/main/java/org/apache/syncope/core/logic/init/ElasticsearchInit.java +++ b/fit/core-reference/src/main/java/org/apache/syncope/core/logic/init/ElasticsearchInit.java @@ -33,6 +33,8 @@ import org.springframework.transaction.annotation.Transactional; @Component public class ElasticsearchInit { + private static final String ES_REINDEX = "org.apache.syncope.core.provisioning.java.job.ElasticsearchReindex"; + @Autowired private ImplementationDAO implementationDAO; @@ -42,8 +44,6 @@ public class ElasticsearchInit { @Autowired private TaskLogic taskLogic; - private static final String ES_REINDEX = "org.apache.syncope.core.provisioning.java.job.ElasticsearchReindex"; - @Transactional public void init() { Implementation reindex = implementationDAO.find(ImplementationType.TASKJOB_DELEGATE). @@ -67,5 +67,4 @@ public class ElasticsearchInit { taskLogic.execute(task.getKey(), null, false); } - } diff --git a/fit/core-reference/src/main/java/org/apache/syncope/fit/core/reference/ITImplementationLookup.java b/fit/core-reference/src/main/java/org/apache/syncope/fit/core/reference/ITImplementationLookup.java index c8c2a5e..3ab13c9 100644 --- a/fit/core-reference/src/main/java/org/apache/syncope/fit/core/reference/ITImplementationLookup.java +++ b/fit/core-reference/src/main/java/org/apache/syncope/fit/core/reference/ITImplementationLookup.java @@ -252,7 +252,6 @@ public class ITImplementationLookup implements ImplementationLookup { for (Map.Entry<String, DataSource> entry : domainsHolder.getDomains().entrySet()) { AuthContextUtils.execWithAuthContext(entry.getKey(), () -> { elasticsearchInit.init(); - return null; }); } diff --git a/pom.xml b/pom.xml index 7a0d82c..9b6e899 100644 --- a/pom.xml +++ b/pom.xml @@ -415,7 +415,7 @@ under the License. <slf4j.version>1.7.25</slf4j.version> <opensaml.version>3.3.0</opensaml.version> - <elasticsearch.version>6.5.0</elasticsearch.version> + <elasticsearch.version>6.5.1</elasticsearch.version> <log4j.version>2.11.1</log4j.version> <disruptor.version>3.4.2</disruptor.version> @@ -2326,7 +2326,7 @@ under the License. <link>https://docs.spring.io/spring-security/site/docs/5.0.x/api/</link> <link>http://www.flowable.org/docs/javadocs/</link> <link>https://build.shibboleth.net/nexus/content/sites/site/java-opensaml/3.3.0/apidocs/</link> - <link>https://artifacts.elastic.co/javadoc/org/elasticsearch/elasticsearch/6.5.0/index.html</link> + <link>https://artifacts.elastic.co/javadoc/org/elasticsearch/elasticsearch/6.5.1/index.html</link> <link>http://docs.swagger.io/swagger-core/v2.0.5/apidocs/</link> </links> </configuration> diff --git a/src/main/asciidoc/reference-guide/workingwithapachesyncope/customization.adoc b/src/main/asciidoc/reference-guide/workingwithapachesyncope/customization.adoc index 11104fd..5ec39c3 100644 --- a/src/main/asciidoc/reference-guide/workingwithapachesyncope/customization.adoc +++ b/src/main/asciidoc/reference-guide/workingwithapachesyncope/customization.adoc @@ -487,12 +487,14 @@ classpath*:/provisioning*Context.xml classpath*:/workflow*Context.xml .... -It is also required to initialize the Elasticsearch indexes. +It is also required to initialize the Elasticsearch indexes: add a new Java <<implementations,implementation>> for +`TASKJOB_DELEGATE` and use `org.apache.syncope.core.provisioning.java.job.ElasticsearchReindex` as class. + +Then, create a new <<tasks-custom, custom task>>, select the implementation just created as job delegate and execute it. -Add a new Java <<implementations,implementation>> for `TASKJOB_DELEGATE` and use -`org.apache.syncope.core.provisioning.java.job.ElasticsearchReindex` as class. - -Then, create a new <<tasks-custom, Custom task>>, select the implementation just created as job delegate and execute it. +[TIP] +The `org.apache.syncope.core.provisioning.java.job.ElasticsearchReindex` custom task created above is not meant for +scheduled execution; rather, it can be run every time you want to blank and re-create the Elasticsearch indexes +starting from Syncope's users, groups and any objects. [discrete] ===== Enable the <<SCIM>> extension