Skip to content
Snippets Groups Projects
Commit e6b87e65 authored by Riabokon Stanislav(EPAM)[GCP]'s avatar Riabokon Stanislav(EPAM)[GCP]
Browse files

Update ElasticClientHandler.java

parent 624e2f7e
No related branches found
No related tags found
3 merge requests!46GCP fix swagger (GONRG-1022),!41GCP implement index cleanup (GONRG-856),!36Support for self-signed certificates for ElasticSearch connection(GONRG-776, GONRG-539)
package org.opengroup.osdu.indexer.util; package org.opengroup.osdu.indexer.util;
import java.security.KeyManagementException; import java.security.KeyManagementException;
import java.security.KeyStoreException; import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException; import java.security.NoSuchAlgorithmException;
import java.util.Base64; import java.util.Base64;
import java.util.Objects; import java.util.Objects;
import javax.net.ssl.SSLContext; import javax.net.ssl.SSLContext;
import lombok.extern.java.Log; import lombok.extern.java.Log;
import org.apache.http.Header; import org.apache.http.Header;
import org.apache.http.HttpHost; import org.apache.http.HttpHost;
import org.apache.http.HttpStatus; import org.apache.http.HttpStatus;
import org.apache.http.conn.ssl.NoopHostnameVerifier; import org.apache.http.conn.ssl.NoopHostnameVerifier;
import org.apache.http.conn.ssl.TrustSelfSignedStrategy; import org.apache.http.conn.ssl.TrustSelfSignedStrategy;
import org.apache.http.impl.nio.client.HttpAsyncClientBuilder; import org.apache.http.impl.nio.client.HttpAsyncClientBuilder;
import org.apache.http.message.BasicHeader; import org.apache.http.message.BasicHeader;
import org.apache.http.ssl.SSLContextBuilder; import org.apache.http.ssl.SSLContextBuilder;
import org.elasticsearch.client.RestClient; import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestClientBuilder; import org.elasticsearch.client.RestClientBuilder;
import org.elasticsearch.client.RestHighLevelClient; import org.elasticsearch.client.RestHighLevelClient;
import org.opengroup.osdu.core.common.model.http.AppException; import org.opengroup.osdu.core.common.model.http.AppException;
import org.opengroup.osdu.core.common.model.indexer.IElasticSettingService; import org.opengroup.osdu.core.common.model.indexer.IElasticSettingService;
import org.opengroup.osdu.core.common.model.search.ClusterSettings; import org.opengroup.osdu.core.common.model.search.ClusterSettings;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@Component @Component
@Log @Log
public class ElasticClientHandler { public class ElasticClientHandler {
// Elastic cluster Rest client settings // Elastic cluster Rest client settings
private static final int CLOUD_REST_CLIENT_PORT = 9243; private static final int CLOUD_REST_CLIENT_PORT = 9243;
private static final int REST_CLIENT_CONNECT_TIMEOUT = 60000; private static final int REST_CLIENT_CONNECT_TIMEOUT = 60000;
private static final int REST_CLIENT_SOCKET_TIMEOUT = 60000; private static final int REST_CLIENT_SOCKET_TIMEOUT = 60000;
private static final int REST_CLIENT_RETRY_TIMEOUT = 60000; private static final int REST_CLIENT_RETRY_TIMEOUT = 60000;
@Value("#{new Boolean('${security.https.certificate.trust:false}')}") @Value("#{new Boolean('${security.https.certificate.trust}')}")
private Boolean isSecurityHttpsCertificateTrust; private Boolean isSecurityHttpsCertificateTrust;
@Autowired @Autowired
private IElasticSettingService elasticSettingService; private IElasticSettingService elasticSettingService;
public RestHighLevelClient createRestClient() { public RestHighLevelClient createRestClient() {
return getCloudRestClient(elasticSettingService.getElasticClusterInformation()); return getCloudRestClient(elasticSettingService.getElasticClusterInformation());
} }
// TODO: Remove this temporary implementation when ECE CCS is utilized // TODO: Remove this temporary implementation when ECE CCS is utilized
public RestHighLevelClient createRestClient(final ClusterSettings clusterSettings) { public RestHighLevelClient createRestClient(final ClusterSettings clusterSettings) {
return getCloudRestClient(clusterSettings); return getCloudRestClient(clusterSettings);
} }
private RestHighLevelClient getCloudRestClient(final ClusterSettings clusterSettings) { private RestHighLevelClient getCloudRestClient(final ClusterSettings clusterSettings) {
String cluster = null; String cluster = null;
String host = null; String host = null;
int port = CLOUD_REST_CLIENT_PORT; int port = CLOUD_REST_CLIENT_PORT;
String protocolScheme = "https"; String protocolScheme = "https";
String tls = "true"; String tls = "true";
try { try {
cluster = clusterSettings.getHost(); cluster = clusterSettings.getHost();
host = clusterSettings.getHost(); host = clusterSettings.getHost();
port = clusterSettings.getPort(); port = clusterSettings.getPort();
if (!clusterSettings.isHttps()) { if (!clusterSettings.isHttps()) {
protocolScheme = "http"; protocolScheme = "http";
} }
if (!clusterSettings.isTls()) { if (!clusterSettings.isTls()) {
tls = "false"; tls = "false";
} }
String basicEncoded = Base64 String basicEncoded = Base64
.getEncoder().encodeToString(clusterSettings.getUserNameAndPassword().getBytes()); .getEncoder().encodeToString(clusterSettings.getUserNameAndPassword().getBytes());
String basicAuthenticationHeaderVal = String.format("Basic %s", basicEncoded); String basicAuthenticationHeaderVal = String.format("Basic %s", basicEncoded);
RestClientBuilder builder = createClientBuilder(host, basicAuthenticationHeaderVal, port, RestClientBuilder builder = createClientBuilder(host, basicAuthenticationHeaderVal, port,
protocolScheme, tls); protocolScheme, tls);
return new RestHighLevelClient(builder); return new RestHighLevelClient(builder);
} catch (AppException e) { } catch (AppException e) {
throw e; throw e;
} catch (Exception e) { } catch (Exception e) {
throw new AppException( throw new AppException(
HttpStatus.SC_INTERNAL_SERVER_ERROR, HttpStatus.SC_INTERNAL_SERVER_ERROR,
"search client error", "search client error",
"error creating search client", "error creating search client",
String String
.format("Elastic client connection params, cluster: %s, host: %s, port: %s", cluster, .format("Elastic client connection params, cluster: %s, host: %s, port: %s", cluster,
host, port), host, port),
e); e);
} }
} }
public RestClientBuilder createClientBuilder(String host, String basicAuthenticationHeaderVal, public RestClientBuilder createClientBuilder(String host, String basicAuthenticationHeaderVal,
int port, String protocolScheme, String tls) { int port, String protocolScheme, String tls) {
RestClientBuilder builder = RestClient.builder(new HttpHost(host, port, protocolScheme)); RestClientBuilder builder = RestClient.builder(new HttpHost(host, port, protocolScheme));
builder.setRequestConfigCallback( builder.setRequestConfigCallback(
requestConfigBuilder -> requestConfigBuilder.setConnectTimeout(REST_CLIENT_CONNECT_TIMEOUT) requestConfigBuilder -> requestConfigBuilder.setConnectTimeout(REST_CLIENT_CONNECT_TIMEOUT)
.setSocketTimeout(REST_CLIENT_SOCKET_TIMEOUT)); .setSocketTimeout(REST_CLIENT_SOCKET_TIMEOUT));
builder.setMaxRetryTimeoutMillis(REST_CLIENT_RETRY_TIMEOUT); builder.setMaxRetryTimeoutMillis(REST_CLIENT_RETRY_TIMEOUT);
Header[] defaultHeaders = new Header[]{ Header[] defaultHeaders = new Header[]{
new BasicHeader("client.transport.nodes_sampler_interval", "30s"), new BasicHeader("client.transport.nodes_sampler_interval", "30s"),
new BasicHeader("client.transport.ping_timeout", "30s"), new BasicHeader("client.transport.ping_timeout", "30s"),
new BasicHeader("client.transport.sniff", "false"), new BasicHeader("client.transport.sniff", "false"),
new BasicHeader("request.headers.X-Found-Cluster", host), new BasicHeader("request.headers.X-Found-Cluster", host),
new BasicHeader("cluster.name", host), new BasicHeader("cluster.name", host),
new BasicHeader("xpack.security.transport.ssl.enabled", tls), new BasicHeader("xpack.security.transport.ssl.enabled", tls),
new BasicHeader("Authorization", basicAuthenticationHeaderVal), new BasicHeader("Authorization", basicAuthenticationHeaderVal),
}; };
log.info(String.format( log.info(String.format(
"Elastic client connection uses protocolScheme = %s with a flag " "Elastic client connection uses protocolScheme = %s with a flag "
+ "'security.https.certificate.trust' = %s", + "'security.https.certificate.trust' = %s",
protocolScheme, isSecurityHttpsCertificateTrust)); protocolScheme, isSecurityHttpsCertificateTrust));
if ("https".equals(protocolScheme) && isSecurityHttpsCertificateTrust) { if ("https".equals(protocolScheme) && isSecurityHttpsCertificateTrust) {
log.warning("Elastic client connection uses TrustSelfSignedStrategy()"); log.warning("Elastic client connection uses TrustSelfSignedStrategy()");
SSLContext sslContext = createSSLContext(); SSLContext sslContext = createSSLContext();
builder.setHttpClientConfigCallback(httpClientBuilder -> builder.setHttpClientConfigCallback(httpClientBuilder ->
{ {
HttpAsyncClientBuilder httpAsyncClientBuilder = httpClientBuilder.setSSLContext(sslContext) HttpAsyncClientBuilder httpAsyncClientBuilder = httpClientBuilder.setSSLContext(sslContext)
.setSSLHostnameVerifier( .setSSLHostnameVerifier(
NoopHostnameVerifier.INSTANCE); NoopHostnameVerifier.INSTANCE);
return httpAsyncClientBuilder; return httpAsyncClientBuilder;
}); });
} }
builder.setDefaultHeaders(defaultHeaders); builder.setDefaultHeaders(defaultHeaders);
return builder; return builder;
} }
private SSLContext createSSLContext() { private SSLContext createSSLContext() {
SSLContextBuilder sslContextBuilder = new SSLContextBuilder(); SSLContextBuilder sslContextBuilder = new SSLContextBuilder();
try { try {
sslContextBuilder.loadTrustMaterial(null, new TrustSelfSignedStrategy()); sslContextBuilder.loadTrustMaterial(null, new TrustSelfSignedStrategy());
return sslContextBuilder.build(); return sslContextBuilder.build();
} catch (NoSuchAlgorithmException e) { } catch (NoSuchAlgorithmException e) {
log.severe(e.getMessage()); log.severe(e.getMessage());
} catch (KeyStoreException e) { } catch (KeyStoreException e) {
log.severe(e.getMessage()); log.severe(e.getMessage());
} catch (KeyManagementException e) { } catch (KeyManagementException e) {
log.severe(e.getMessage()); log.severe(e.getMessage());
} }
return null; return null;
} }
public Boolean isSecurityHttpsCertificateTrust() { public Boolean isSecurityHttpsCertificateTrust() {
return isSecurityHttpsCertificateTrust; return isSecurityHttpsCertificateTrust;
} }
public void setSecurityHttpsCertificateTrust(Boolean isSecurityHttpsCertificateTrust) { public void setSecurityHttpsCertificateTrust(Boolean isSecurityHttpsCertificateTrust) {
this.isSecurityHttpsCertificateTrust = isSecurityHttpsCertificateTrust; this.isSecurityHttpsCertificateTrust = isSecurityHttpsCertificateTrust;
} }
} }
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment