
gov.nasa.pds.registry.common.connection.aws.RestClientWrapper Maven / Gradle / Ivy
package gov.nasa.pds.registry.common.connection.aws;
import java.io.IOException;
import java.security.KeyManagementException;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import javax.net.ssl.SSLContext;
import org.apache.hc.client5.http.impl.nio.PoolingAsyncClientConnectionManager;
import org.apache.hc.client5.http.impl.nio.PoolingAsyncClientConnectionManagerBuilder;
import org.apache.hc.client5.http.ssl.ClientTlsStrategyBuilder;
import org.apache.hc.core5.http.nio.ssl.TlsStrategy;
import org.apache.hc.core5.ssl.SSLContextBuilder;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.opensearch.client.opensearch.OpenSearchClient;
import org.opensearch.client.opensearch._types.OpenSearchException;
import org.opensearch.client.opensearch.core.BulkRequest;
import org.opensearch.client.opensearch.core.CountRequest;
import org.opensearch.client.opensearch.core.DeleteRequest;
import org.opensearch.client.opensearch.core.GetRequest;
import org.opensearch.client.opensearch.core.MgetRequest;
import org.opensearch.client.opensearch.core.SearchRequest;
import org.opensearch.client.opensearch.core.SearchResponse;
import org.opensearch.client.opensearch.core.search.Hit;
import org.opensearch.client.opensearch.indices.CreateIndexRequest;
import org.opensearch.client.opensearch.indices.DeleteIndexRequest;
import org.opensearch.client.opensearch.indices.ExistsRequest;
import org.opensearch.client.opensearch.indices.GetIndicesSettingsRequest;
import org.opensearch.client.opensearch.indices.GetMappingRequest;
import org.opensearch.client.opensearch.indices.PutMappingRequest;
import org.opensearch.client.transport.aws.AwsSdk2Transport;
import org.opensearch.client.transport.aws.AwsSdk2TransportOptions;
import org.opensearch.client.transport.httpclient5.ApacheHttpClient5TransportBuilder;
import gov.nasa.pds.registry.common.ConnectionFactory;
import gov.nasa.pds.registry.common.Request;
import software.amazon.awssdk.http.SdkHttpClient;
import software.amazon.awssdk.http.apache.ApacheHttpClient;
import software.amazon.awssdk.regions.Region;
import gov.nasa.pds.registry.common.Response;
import gov.nasa.pds.registry.common.ResponseException;
import gov.nasa.pds.registry.common.RestClient;
public class RestClientWrapper implements RestClient {
private abstract class Retryable {
abstract public R perform (T arg) throws IOException, ResponseException;
public R retry (T arg) throws IOException, ResponseException {
int retries = 0, retry_limit = 3;
while (true) {
try { return this.perform(arg); }
catch (OpenSearchException ose) {
if (ose.response().status() == 403) {
retries++;
if (retries < retry_limit) {
try { conFact.reconnect(); }
catch (InterruptedException ie) { throw new RuntimeException ("How did this happen??", ie); }
client = buildClient();
} else {
log.error ("Tried " + retry_limit + " to re-establish connection but cannot.");
throw ose;
}
} else {
throw ose;
}
}
}
}
}
final private boolean isServerless;
final private ConnectionFactory conFact;
final private Logger log;
final private SdkHttpClient httpClient;
private OpenSearchClient client;
public RestClientWrapper(ConnectionFactory conFact, boolean isServerless) {
this.conFact = conFact;
this.httpClient = ApacheHttpClient.builder().build();
this.isServerless = isServerless;
this.log = LogManager.getLogger(this.getClass());
this.client = this.buildClient();
}
private OpenSearchClient buildClient() {
OpenSearchClient client = null;
if (isServerless) {
client = new OpenSearchClient(
new AwsSdk2Transport(
this.httpClient,
this.conFact.getHostName(),
"aoss",
Region.US_WEST_2, // signing service region that we should probably get from host name??
AwsSdk2TransportOptions.builder().build()
)
);
} else {
try {
SSLContext sslcontext = SSLContextBuilder
.create()
.loadTrustMaterial((chains, authType) -> true)
.build();
final ApacheHttpClient5TransportBuilder builder = ApacheHttpClient5TransportBuilder.builder(this.conFact.getHost5());
builder.setHttpClientConfigCallback(httpClientBuilder -> {
final TlsStrategy tlsStrategy = ClientTlsStrategyBuilder.create()
.setSslContext(sslcontext)
.build();
final PoolingAsyncClientConnectionManager connectionManager = PoolingAsyncClientConnectionManagerBuilder
.create()
.setTlsStrategy(tlsStrategy)
.build();
return httpClientBuilder
.setDefaultCredentialsProvider(conFact.getCredentials5())
.setConnectionManager(connectionManager);
});
client = new OpenSearchClient(builder.build());
} catch (KeyManagementException | NoSuchAlgorithmException | KeyStoreException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return client;
}
@Override
public void close() throws IOException {
this.client.shutdown();
this.httpClient.close();
}
@Override
public Response.CreatedIndex create(String indexName, String configAsJson) throws IOException, ResponseException {
return new CreateIndexRespWrap(this.client.indices().create(CreateIndexConfigWrap.update(new CreateIndexRequest.Builder(), configAsJson).index(indexName).build()));
}
@Override
public Request.Bulk createBulkRequest() {
return new BulkImpl(this.isServerless);
}
@Override
public Request.Count createCountRequest() {
return new CountImpl();
}
@Override
public Request.Delete createDelete() {
return new DeleteImpl();
}
@Override
public Request.DeleteByQuery createDeleteByQuery() {
return new DBQImpl();
}
@Override
public Request.Get createGetRequest() {
return new GetImpl();
}
@Override
public Request.Mapping createMappingRequest() {
return new MappingImpl();
}
@Override
public Request.MGet createMGetRequest() {
return new MGetImpl();
}
@Override
public Request.Search createSearchRequest() {
return new SearchImpl();
}
@Override
public Request.Setting createSettingRequest() {
return new SettingImpl();
}
@Override
public void delete(String indexName) throws IOException, ResponseException {
new Retryable
© 2015 - 2025 Weber Informatics LLC | Privacy Policy