This is an automated email from the ASF dual-hosted git repository.
ilgrosso pushed a commit to branch 4_0_X
in repository https://gitbox.apache.org/repos/asf/syncope.git
The following commit(s) were added to refs/heads/4_0_X by this push:
new 836619ea19 Upgrading Elasticsearch and OpenSearch
836619ea19 is described below
commit 836619ea197f4c7003f0c83cdfacfd260e63243e
Author: Francesco Chicchiriccò <[email protected]>
AuthorDate: Wed Jun 25 08:44:54 2025 +0200
Upgrading Elasticsearch and OpenSearch
---
.../opensearch/client/OpenSearchClientContext.java | 20 ++++++++--
.../client/OpenSearchClientFactoryBean.java | 43 ++++++++++------------
.../opensearch/client/OpenSearchIndexManager.java | 8 ++--
.../opensearch/client/OpenSearchProperties.java | 12 +++---
.../opensearch/dao/OpenSearchRealmSearchDAO.java | 5 ++-
pom.xml | 6 +--
6 files changed, 52 insertions(+), 42 deletions(-)
diff --git
a/ext/opensearch/client-opensearch/src/main/java/org/apache/syncope/ext/opensearch/client/OpenSearchClientContext.java
b/ext/opensearch/client-opensearch/src/main/java/org/apache/syncope/ext/opensearch/client/OpenSearchClientContext.java
index df8ce70a99..3a36aaf107 100644
---
a/ext/opensearch/client-opensearch/src/main/java/org/apache/syncope/ext/opensearch/client/OpenSearchClientContext.java
+++
b/ext/opensearch/client-opensearch/src/main/java/org/apache/syncope/ext/opensearch/client/OpenSearchClientContext.java
@@ -18,12 +18,16 @@
*/
package org.apache.syncope.ext.opensearch.client;
-import org.apache.http.HttpHost;
+import java.net.URISyntaxException;
+import java.util.Objects;
+import org.apache.hc.core5.http.HttpHost;
import org.apache.syncope.core.persistence.api.dao.AnyObjectDAO;
import org.apache.syncope.core.persistence.api.dao.GroupDAO;
import org.apache.syncope.core.persistence.api.dao.UserDAO;
import org.identityconnectors.common.CollectionUtil;
import org.opensearch.client.opensearch.OpenSearchClient;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import org.springframework.boot.actuate.health.HealthContributor;
import
org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import
org.springframework.boot.context.properties.EnableConfigurationProperties;
@@ -35,12 +39,20 @@ import org.springframework.context.annotation.Lazy;
@Configuration(proxyBeanMethods = false)
public class OpenSearchClientContext {
+ protected static final Logger LOG =
LoggerFactory.getLogger(OpenSearchClientContext.class);
+
@ConditionalOnMissingBean
@Bean
public OpenSearchClientFactoryBean openSearchClientFactoryBean(final
OpenSearchProperties props) {
- return new OpenSearchClientFactoryBean(
- CollectionUtil.nullAsEmpty(props.getHosts()).stream().
- map(HttpHost::create).toList());
+ return new
OpenSearchClientFactoryBean(CollectionUtil.nullAsEmpty(props.getHosts()).stream().
+ map(host -> {
+ try {
+ return HttpHost.create(host);
+ } catch (URISyntaxException e) {
+ LOG.error("Invalid host: {}", host, e);
+ return null;
+ }
+ }).filter(Objects::nonNull).toList());
}
@ConditionalOnMissingBean
diff --git
a/ext/opensearch/client-opensearch/src/main/java/org/apache/syncope/ext/opensearch/client/OpenSearchClientFactoryBean.java
b/ext/opensearch/client-opensearch/src/main/java/org/apache/syncope/ext/opensearch/client/OpenSearchClientFactoryBean.java
index 0aa40aeaad..cfdb392a66 100644
---
a/ext/opensearch/client-opensearch/src/main/java/org/apache/syncope/ext/opensearch/client/OpenSearchClientFactoryBean.java
+++
b/ext/opensearch/client-opensearch/src/main/java/org/apache/syncope/ext/opensearch/client/OpenSearchClientFactoryBean.java
@@ -23,19 +23,14 @@ import com.fasterxml.jackson.databind.json.JsonMapper;
import java.nio.charset.StandardCharsets;
import java.util.Base64;
import java.util.List;
-import org.apache.http.Header;
-import org.apache.http.HttpHeaders;
-import org.apache.http.HttpHost;
-import org.apache.http.auth.AuthScope;
-import org.apache.http.auth.UsernamePasswordCredentials;
-import org.apache.http.client.CredentialsProvider;
-import org.apache.http.impl.client.BasicCredentialsProvider;
-import org.apache.http.message.BasicHeader;
-import org.opensearch.client.RestClient;
-import org.opensearch.client.RestClientBuilder;
+import org.apache.hc.core5.http.Header;
+import org.apache.hc.core5.http.HttpHeaders;
+import org.apache.hc.core5.http.HttpHost;
+import org.apache.hc.core5.http.message.BasicHeader;
import org.opensearch.client.json.jackson.JacksonJsonpMapper;
import org.opensearch.client.opensearch.OpenSearchClient;
-import org.opensearch.client.transport.rest_client.RestClientTransport;
+import org.opensearch.client.transport.httpclient5.ApacheHttpClient5Transport;
+import
org.opensearch.client.transport.httpclient5.ApacheHttpClient5TransportBuilder;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.FactoryBean;
@@ -56,7 +51,7 @@ public class OpenSearchClientFactoryBean implements
FactoryBean<OpenSearchClient
private String apiKeySecret;
- private RestClient restClient;
+ private ApacheHttpClient5Transport transport;
private OpenSearchClient client;
@@ -100,12 +95,15 @@ public class OpenSearchClientFactoryBean implements
FactoryBean<OpenSearchClient
public OpenSearchClient getObject() {
synchronized (this) {
if (client == null) {
- RestClientBuilder builder =
RestClient.builder(hosts.toArray(HttpHost[]::new));
+ ApacheHttpClient5TransportBuilder builder =
ApacheHttpClient5TransportBuilder.
+ builder(hosts.toArray(HttpHost[]::new)).
+ setMapper(new JacksonJsonpMapper(JsonMapper.builder().
+
findAndAddModules().disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS).build()));
if (username != null && password != null) {
- CredentialsProvider credentialsProvider = new
BasicCredentialsProvider();
- credentialsProvider.setCredentials(
- AuthScope.ANY, new
UsernamePasswordCredentials(username, password));
- builder.setHttpClientConfigCallback(b ->
b.setDefaultCredentialsProvider(credentialsProvider));
+ String encodedAuth = Base64.getEncoder().
+ encodeToString((username + ":" +
password).getBytes(StandardCharsets.UTF_8));
+ builder.setDefaultHeaders(
+ new Header[] { new
BasicHeader(HttpHeaders.AUTHORIZATION, "Bearer " + encodedAuth) });
} else if (serviceToken != null) {
builder.setDefaultHeaders(
new Header[] { new
BasicHeader(HttpHeaders.AUTHORIZATION, "Bearer " + serviceToken) });
@@ -116,11 +114,8 @@ public class OpenSearchClientFactoryBean implements
FactoryBean<OpenSearchClient
new Header[] { new
BasicHeader(HttpHeaders.AUTHORIZATION, "ApiKey " + apiKeyAuth) });
}
- restClient = builder.build();
- client = new OpenSearchClient(new RestClientTransport(
- restClient,
- new JacksonJsonpMapper(JsonMapper.builder().
-
findAndAddModules().disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS).build())));
+ transport = builder.build();
+ client = new OpenSearchClient(transport);
}
}
return client;
@@ -133,8 +128,8 @@ public class OpenSearchClientFactoryBean implements
FactoryBean<OpenSearchClient
@Override
public void destroy() throws Exception {
- if (restClient != null) {
- restClient.close();
+ if (transport != null) {
+ transport.close();
}
}
}
diff --git
a/ext/opensearch/client-opensearch/src/main/java/org/apache/syncope/ext/opensearch/client/OpenSearchIndexManager.java
b/ext/opensearch/client-opensearch/src/main/java/org/apache/syncope/ext/opensearch/client/OpenSearchIndexManager.java
index f47d310315..d499b5c297 100644
---
a/ext/opensearch/client-opensearch/src/main/java/org/apache/syncope/ext/opensearch/client/OpenSearchIndexManager.java
+++
b/ext/opensearch/client-opensearch/src/main/java/org/apache/syncope/ext/opensearch/client/OpenSearchIndexManager.java
@@ -65,15 +65,15 @@ public class OpenSearchIndexManager {
protected final OpenSearchUtils openSearchUtils;
- protected final String numberOfShards;
+ protected final Integer numberOfShards;
- protected final String numberOfReplicas;
+ protected final Integer numberOfReplicas;
public OpenSearchIndexManager(
final OpenSearchClient client,
final OpenSearchUtils ppenSearchUtils,
- final String numberOfShards,
- final String numberOfReplicas) {
+ final Integer numberOfShards,
+ final Integer numberOfReplicas) {
this.client = client;
this.openSearchUtils = ppenSearchUtils;
diff --git
a/ext/opensearch/client-opensearch/src/main/java/org/apache/syncope/ext/opensearch/client/OpenSearchProperties.java
b/ext/opensearch/client-opensearch/src/main/java/org/apache/syncope/ext/opensearch/client/OpenSearchProperties.java
index 78bf78e641..d77d69e863 100644
---
a/ext/opensearch/client-opensearch/src/main/java/org/apache/syncope/ext/opensearch/client/OpenSearchProperties.java
+++
b/ext/opensearch/client-opensearch/src/main/java/org/apache/syncope/ext/opensearch/client/OpenSearchProperties.java
@@ -29,9 +29,9 @@ public class OpenSearchProperties {
private int indexMaxResultWindow = 10000;
- private String numberOfShards = "1";
+ private int numberOfShards = 1;
- private String numberOfReplicas = "1";
+ private int numberOfReplicas = 1;
public List<String> getHosts() {
return hosts;
@@ -49,19 +49,19 @@ public class OpenSearchProperties {
this.indexMaxResultWindow = indexMaxResultWindow;
}
- public String getNumberOfShards() {
+ public int getNumberOfShards() {
return numberOfShards;
}
- public void setNumberOfShards(final String numberOfShards) {
+ public void setNumberOfShards(final int numberOfShards) {
this.numberOfShards = numberOfShards;
}
- public String getNumberOfReplicas() {
+ public int getNumberOfReplicas() {
return numberOfReplicas;
}
- public void setNumberOfReplicas(final String numberOfReplicas) {
+ public void setNumberOfReplicas(final int numberOfReplicas) {
this.numberOfReplicas = numberOfReplicas;
}
}
diff --git
a/ext/opensearch/persistence/src/main/java/org/apache/syncope/core/persistence/opensearch/dao/OpenSearchRealmSearchDAO.java
b/ext/opensearch/persistence/src/main/java/org/apache/syncope/core/persistence/opensearch/dao/OpenSearchRealmSearchDAO.java
index 243b3ab716..46d8f4cc6c 100644
---
a/ext/opensearch/persistence/src/main/java/org/apache/syncope/core/persistence/opensearch/dao/OpenSearchRealmSearchDAO.java
+++
b/ext/opensearch/persistence/src/main/java/org/apache/syncope/core/persistence/opensearch/dao/OpenSearchRealmSearchDAO.java
@@ -31,7 +31,9 @@ import org.apache.syncope.core.persistence.api.entity.Realm;
import org.apache.syncope.core.spring.security.AuthContextUtils;
import org.apache.syncope.ext.opensearch.client.OpenSearchUtils;
import org.opensearch.client.opensearch.OpenSearchClient;
+import org.opensearch.client.opensearch._types.BuiltinScriptLanguage;
import org.opensearch.client.opensearch._types.FieldValue;
+import org.opensearch.client.opensearch._types.ScriptLanguage;
import org.opensearch.client.opensearch._types.ScriptSortType;
import org.opensearch.client.opensearch._types.SearchType;
import org.opensearch.client.opensearch._types.SortOptions;
@@ -53,7 +55,8 @@ public class OpenSearchRealmSearchDAO implements
RealmSearchDAO {
protected static final List<SortOptions> REALM_SORT_OPTIONS = List.of(
new SortOptions.Builder().
script(s -> s.type(ScriptSortType.Number).
- script(t -> t.inline(i -> i.lang("painless").
+ script(t -> t.inline(i -> i.lang(ScriptLanguage.builder().
+ builtin(BuiltinScriptLanguage.Painless).build()).
source("doc['fullPath'].value.chars().filter(ch -> ch ==
'/').count()"))).
order(SortOrder.Asc)).
build());
diff --git a/pom.xml b/pom.xml
index a08ad60bf9..2934d174d0 100644
--- a/pom.xml
+++ b/pom.xml
@@ -429,9 +429,9 @@ under the License.
<disruptor.version>4.0.0</disruptor.version>
- <elasticsearch.version>9.0.2</elasticsearch.version>
- <opensearch.version>2.19.2</opensearch.version>
- <opensearch-java.version>2.25.0</opensearch-java.version>
+ <elasticsearch.version>9.0.3</elasticsearch.version>
+ <opensearch.version>3.1.0</opensearch.version>
+ <opensearch-java.version>3.1.0</opensearch-java.version>
<openfga.version>v1</openfga.version>