From 2a7332a174f6f251d5034029400183fb8b531ba0 Mon Sep 17 00:00:00 2001 From: Owais Kazi Date: Fri, 4 Nov 2022 12:00:29 -0700 Subject: [PATCH] Migrate client transports to Apache HttpClient/Core5.x (#231) * Migrate client transports to Apache HttpClient/Core5.x Signed-off-by: Owais Kazi * Removed scheme Signed-off-by: Owais Kazi * Cleanep up compiler warnings Signed-off-by: Owais Kazi * Updated comment Signed-off-by: Owais Kazi * Generalized version numbers to a variable Signed-off-by: Owais Kazi Signed-off-by: Owais Kazi --- build.gradle | 19 ++++++---- .../java/org/opensearch/sdk/SDKClient.java | 38 +++++++++++++++++-- .../handlers/ClusterStateResponseHandler.java | 2 + .../EnvironmentSettingsResponseHandler.java | 2 + 4 files changed, 50 insertions(+), 11 deletions(-) diff --git a/build.gradle b/build.gradle index b1cd9fc1..6a59af5f 100644 --- a/build.gradle +++ b/build.gradle @@ -61,12 +61,16 @@ configurations { } dependencies { - implementation "org.opensearch:opensearch:3.0.0-SNAPSHOT" - implementation "org.opensearch.plugin:transport-netty4-client:3.0.0-SNAPSHOT" + + def jacksonDatabindVersion = "2.12.6.1" + def opensearchVersion = "3.0.0-SNAPSHOT" + + implementation("org.opensearch:opensearch:${opensearchVersion}") + implementation("org.opensearch.plugin:transport-netty4-client:${opensearchVersion}") implementation group: 'org.apache.logging.log4j', name: 'log4j-api', version: '2.17.1' implementation group: 'org.apache.logging.log4j', name: 'log4j-core', version: '2.19.0' - implementation 'org.opensearch.client:opensearch-rest-client:2.0.0' - implementation 'org.opensearch.client:opensearch-java:2.0.0' + implementation("org.opensearch.client:opensearch-rest-client:${opensearchVersion}") + implementation("org.opensearch.client:opensearch-java:${opensearchVersion}") implementation "io.netty:netty-all:4.1.73.Final" implementation "org.apache.lucene:lucene-core:9.4.0-snapshot-ddf0d0a" testCompileOnly ("junit:junit:4.13.2") { @@ -74,11 +78,12 @@ dependencies { exclude module : 'hamcrest-core' } implementation 'javax.xml.bind:jaxb-api:2.2.2' - implementation 'com.fasterxml.jackson.core:jackson-databind: 2.12.6.1' - implementation 'com.fasterxml.jackson.dataformat:jackson-dataformat-yaml: 2.12.6.1' + implementation("com.fasterxml.jackson.core:jackson-databind:${jacksonDatabindVersion}") + implementation("com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:${jacksonDatabindVersion}") + implementation("com.fasterxml.jackson.datatype:jackson-datatype-jsr310:${jacksonDatabindVersion}") testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.2' testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.2' - testImplementation "org.opensearch.test:framework:3.0.0-SNAPSHOT" + testImplementation("org.opensearch.test:framework:${opensearchVersion}") requireJavadoc "org.plumelib:require-javadoc:1.0.4" } diff --git a/src/main/java/org/opensearch/sdk/SDKClient.java b/src/main/java/org/opensearch/sdk/SDKClient.java index 54135663..21076d60 100644 --- a/src/main/java/org/opensearch/sdk/SDKClient.java +++ b/src/main/java/org/opensearch/sdk/SDKClient.java @@ -11,8 +11,17 @@ import java.io.IOException; -import org.apache.http.HttpHost; -import org.apache.http.conn.ssl.NoopHostnameVerifier; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; +import org.apache.hc.core5.function.Factory; +import org.apache.hc.core5.http.HttpHost; +import org.apache.hc.client5.http.ssl.NoopHostnameVerifier; +import org.apache.hc.client5.http.ssl.ClientTlsStrategyBuilder; +import org.apache.hc.client5.http.impl.nio.PoolingAsyncClientConnectionManager; +import org.apache.hc.client5.http.impl.nio.PoolingAsyncClientConnectionManagerBuilder; +import org.apache.hc.core5.http.nio.ssl.TlsStrategy; +import org.apache.hc.core5.reactor.ssl.TlsDetails; +import org.apache.hc.core5.ssl.SSLContextBuilder; import org.opensearch.client.RestClient; import org.opensearch.client.RestClientBuilder; import org.opensearch.client.json.jackson.JacksonJsonpMapper; @@ -20,6 +29,8 @@ import org.opensearch.client.transport.OpenSearchTransport; import org.opensearch.client.transport.rest_client.RestClientTransport; +import javax.net.ssl.SSLEngine; + /** * This class creates SDKClient for an extension to make requests to OpenSearch */ @@ -39,7 +50,23 @@ public OpenSearchClient initializeClient(String hostAddress, int port) throws IO builder.setStrictDeprecationMode(true); builder.setHttpClientConfigCallback(httpClientBuilder -> { try { - return httpClientBuilder.setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE); + final TlsStrategy tlsStrategy = ClientTlsStrategyBuilder.create() + .setSslContext(SSLContextBuilder.create().loadTrustMaterial(null, (chains, authType) -> true).build()) + // disable the certificate since our cluster currently just uses the default security configuration + .setHostnameVerifier(NoopHostnameVerifier.INSTANCE) + // See please https://issues.apache.org/jira/browse/HTTPCLIENT-2219 + .setTlsDetailsFactory(new Factory() { + @Override + public TlsDetails create(final SSLEngine sslEngine) { + return new TlsDetails(sslEngine.getSession(), sslEngine.getApplicationProtocol()); + } + }) + .build(); + + final PoolingAsyncClientConnectionManager connectionManager = PoolingAsyncClientConnectionManagerBuilder.create() + .setTlsStrategy(tlsStrategy) + .build(); + return httpClientBuilder.setConnectionManager(connectionManager); } catch (Exception e) { throw new RuntimeException(e); } @@ -48,7 +75,10 @@ public OpenSearchClient initializeClient(String hostAddress, int port) throws IO restClient = builder.build(); // Create Client - OpenSearchTransport transport = new RestClientTransport(restClient, new JacksonJsonpMapper()); + OpenSearchTransport transport = new RestClientTransport( + restClient, + new JacksonJsonpMapper(new ObjectMapper().registerModule(new JavaTimeModule())) + ); javaClient = new OpenSearchClient(transport); return javaClient; } diff --git a/src/main/java/org/opensearch/sdk/handlers/ClusterStateResponseHandler.java b/src/main/java/org/opensearch/sdk/handlers/ClusterStateResponseHandler.java index 26539cfa..1a3ba5d9 100644 --- a/src/main/java/org/opensearch/sdk/handlers/ClusterStateResponseHandler.java +++ b/src/main/java/org/opensearch/sdk/handlers/ClusterStateResponseHandler.java @@ -68,6 +68,8 @@ public ClusterStateResponse read(StreamInput in) throws IOException { /** * Invokes await on the ClusterStateResponseHandler count down latch + * @throws InterruptedException + * if the response times out */ public void awaitResponse() throws InterruptedException { inProgressLatch.await(ExtensionsOrchestrator.EXTENSION_REQUEST_WAIT_TIMEOUT, TimeUnit.SECONDS); diff --git a/src/main/java/org/opensearch/sdk/handlers/EnvironmentSettingsResponseHandler.java b/src/main/java/org/opensearch/sdk/handlers/EnvironmentSettingsResponseHandler.java index a94c00dd..b59094d7 100644 --- a/src/main/java/org/opensearch/sdk/handlers/EnvironmentSettingsResponseHandler.java +++ b/src/main/java/org/opensearch/sdk/handlers/EnvironmentSettingsResponseHandler.java @@ -68,6 +68,8 @@ public EnvironmentSettingsResponse read(StreamInput in) throws IOException { /** * Invokes await on the EnvironmentSettingsResponseHandler count down latch + * @throws InterruptedException + * if the response times out */ public void awaitResponse() throws InterruptedException { inProgressLatch.await(ExtensionsOrchestrator.EXTENSION_REQUEST_WAIT_TIMEOUT, TimeUnit.SECONDS);