From 25580dde4891938a2af1e07889bf7f0a55dc2b70 Mon Sep 17 00:00:00 2001 From: Owais Kazi Date: Mon, 9 Jan 2023 11:30:03 -0800 Subject: [PATCH] Added High Level Rest Client for SDK (#306) * Added High Level Rest Client for SDK Signed-off-by: Owais Kazi * Updates method name Signed-off-by: Owais Kazi * Addressed PR Comments Signed-off-by: Owais Kazi * Implements Closeable for SDKClients Signed-off-by: Owais Kazi Signed-off-by: Owais Kazi --- build.gradle | 1 + .../java/org/opensearch/sdk/SDKClient.java | 62 +++++++++++++++---- .../org/opensearch/sdk/TestSDKClient.java | 23 ++++++- 3 files changed, 72 insertions(+), 14 deletions(-) diff --git a/build.gradle b/build.gradle index 3350f9ae2..2d678e9bc 100644 --- a/build.gradle +++ b/build.gradle @@ -79,6 +79,7 @@ dependencies { implementation("org.opensearch:opensearch:${opensearchVersion}") implementation("org.apache.logging.log4j:log4j-api:${log4jVersion}") implementation("org.apache.logging.log4j:log4j-core:${log4jVersion}") + implementation("org.opensearch.client:opensearch-rest-high-level-client:${opensearchVersion}") implementation("org.opensearch.client:opensearch-rest-client:${opensearchVersion}") implementation("org.opensearch.client:opensearch-java:${opensearchVersion}") implementation("org.opensearch.plugin:transport-netty4-client:${opensearchVersion}") diff --git a/src/main/java/org/opensearch/sdk/SDKClient.java b/src/main/java/org/opensearch/sdk/SDKClient.java index cdd998bb9..f5873eddd 100644 --- a/src/main/java/org/opensearch/sdk/SDKClient.java +++ b/src/main/java/org/opensearch/sdk/SDKClient.java @@ -9,6 +9,7 @@ package org.opensearch.sdk; +import java.io.Closeable; import java.io.IOException; import com.fasterxml.jackson.annotation.JsonTypeInfo; @@ -28,6 +29,7 @@ import org.apache.hc.core5.ssl.SSLContextBuilder; import org.opensearch.client.RestClient; import org.opensearch.client.RestClientBuilder; +import org.opensearch.client.RestHighLevelClient; import org.opensearch.client.json.jackson.JacksonJsonpMapper; import org.opensearch.client.opensearch.OpenSearchClient; import org.opensearch.client.transport.OpenSearchTransport; @@ -38,17 +40,12 @@ /** * This class creates SDKClient for an extension to make requests to OpenSearch */ -public class SDKClient { +public class SDKClient implements Closeable { private OpenSearchClient javaClient; - private RestClient restClient = null; + private RestClient restClient; + private RestHighLevelClient highLevelClient; - /** - * Creates OpenSearchClient for SDK. It also creates a restClient as a wrapper around Java OpenSearchClient - * @param hostAddress The address of OpenSearch cluster, client can connect to - * @param port The port of OpenSearch cluster - * @return SDKClient which is internally an OpenSearchClient. The user is responsible for calling {@link #doCloseRestClient()} when finished with the client - */ - public OpenSearchClient initializeClient(String hostAddress, int port) { + private RestClientBuilder builder(String hostAddress, int port) { RestClientBuilder builder = RestClient.builder(new HttpHost(hostAddress, port)); builder.setStrictDeprecationMode(true); builder.setHttpClientConfigCallback(httpClientBuilder -> { @@ -74,6 +71,17 @@ public TlsDetails create(final SSLEngine sslEngine) { throw new RuntimeException(e); } }); + return builder; + } + + /** + * Creates OpenSearchClient for SDK. It also creates a restClient as a wrapper around Java OpenSearchClient + * @param hostAddress The address of OpenSearch cluster, client can connect to + * @param port The port of OpenSearch cluster + * @return The SDKClient implementation of OpenSearchClient. The user is responsible for calling {@link #doCloseJavaClient()} when finished with the client + */ + public OpenSearchClient initializeJavaClient(String hostAddress, int port) { + RestClientBuilder builder = builder(hostAddress, port); restClient = builder.build(); @@ -91,13 +99,45 @@ public TlsDetails create(final SSLEngine sslEngine) { } /** - * Close this client. + * @deprecated Provided for compatibility with existing plugins to permit migration. New development should not use this client + * Creates High Level Rest Client for SDK. + * @param hostAddress The address of OpenSearch cluster, client can connect to + * @param port The port of OpenSearch cluster + * @return The SDKClient implementation of RestHighLevelClient. The user is responsible for calling {@link #doCloseHighLevelClient()} when finished with the client + */ + @Deprecated + public RestHighLevelClient initializeRestClient(String hostAddress, int port) { + RestClientBuilder builder = builder(hostAddress, port); + + highLevelClient = new RestHighLevelClient(builder); + return highLevelClient; + } + + /** + * Close java client. * * @throws IOException if closing the restClient fails */ - public void doCloseRestClient() throws IOException { + public void doCloseJavaClient() throws IOException { if (restClient != null) { restClient.close(); } } + + /** + * Close high level rest client. + * + * @throws IOException if closing the highLevelClient fails + */ + public void doCloseHighLevelClient() throws IOException { + if (highLevelClient != null) { + highLevelClient.close(); + } + } + + @Override + public void close() throws IOException { + doCloseJavaClient(); + doCloseHighLevelClient(); + } } diff --git a/src/test/java/org/opensearch/sdk/TestSDKClient.java b/src/test/java/org/opensearch/sdk/TestSDKClient.java index e037fa826..19c9e7cf3 100644 --- a/src/test/java/org/opensearch/sdk/TestSDKClient.java +++ b/src/test/java/org/opensearch/sdk/TestSDKClient.java @@ -10,6 +10,8 @@ package org.opensearch.sdk; import org.junit.jupiter.api.Test; +import org.opensearch.client.RequestOptions; +import org.opensearch.client.RestHighLevelClient; import org.opensearch.client.opensearch.OpenSearchClient; import org.opensearch.client.opensearch.indices.Alias; import org.opensearch.client.opensearch.indices.CreateIndexRequest; @@ -23,9 +25,9 @@ public class TestSDKClient extends OpenSearchTestCase { SDKClient sdkClient = new SDKClient(); @Test - public void testCreateClient() throws Exception { + public void testCreateJavaClient() throws Exception { - OpenSearchClient testClient = sdkClient.initializeClient("localhost", 9200); + OpenSearchClient testClient = sdkClient.initializeJavaClient("localhost", 9200); assertInstanceOf(OpenSearchClient.class, testClient); assertThrows( @@ -38,7 +40,22 @@ public void testCreateClient() throws Exception { ) ); - sdkClient.doCloseRestClient(); + sdkClient.doCloseJavaClient(); + } + + @Test + public void testCreateHighLevelRestClient() throws Exception { + RestHighLevelClient testClient = sdkClient.initializeRestClient("localhost", 9200); + + // Using the package name here as Java uses package name if the filename from different packages are same + org.opensearch.client.indices.CreateIndexRequest createIndexRequest = new org.opensearch.client.indices.CreateIndexRequest( + "my-index" + ); + + assertThrows(ConnectException.class, () -> testClient.indices().create(createIndexRequest, RequestOptions.DEFAULT)); + + sdkClient.doCloseHighLevelClient(); + } }