diff options
Diffstat (limited to 'catalog-dao/src/main/java/org/openecomp/sdc/be/dao/es/ElasticSearchClient.java')
-rw-r--r-- | catalog-dao/src/main/java/org/openecomp/sdc/be/dao/es/ElasticSearchClient.java | 226 |
1 files changed, 226 insertions, 0 deletions
diff --git a/catalog-dao/src/main/java/org/openecomp/sdc/be/dao/es/ElasticSearchClient.java b/catalog-dao/src/main/java/org/openecomp/sdc/be/dao/es/ElasticSearchClient.java new file mode 100644 index 0000000000..1c3ba1107f --- /dev/null +++ b/catalog-dao/src/main/java/org/openecomp/sdc/be/dao/es/ElasticSearchClient.java @@ -0,0 +1,226 @@ +/*- + * ============LICENSE_START======================================================= + * SDC + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.openecomp.sdc.be.dao.es; + +import java.net.InetSocketAddress; +import java.net.MalformedURLException; +import java.net.URISyntaxException; +import java.net.URL; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.Arrays; + +import javax.annotation.PostConstruct; +import javax.annotation.PreDestroy; + +import org.apache.commons.lang.SystemUtils; +import org.elasticsearch.action.admin.cluster.health.ClusterHealthAction; +import org.elasticsearch.action.admin.cluster.health.ClusterHealthRequestBuilder; +import org.elasticsearch.action.admin.cluster.health.ClusterHealthResponse; +import org.elasticsearch.client.Client; +import org.elasticsearch.client.transport.TransportClient; +import org.elasticsearch.common.settings.Settings; +import org.elasticsearch.common.transport.InetSocketTransportAddress; +import org.elasticsearch.common.unit.TimeValue; +import org.elasticsearch.node.Node; +import org.elasticsearch.node.NodeBuilder; +import org.elasticsearch.shield.ShieldPlugin; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +/** + * Prepare the node to work with elastic search. + * + * @author luc boutier + */ +@Component("elasticsearch-client") +public class ElasticSearchClient { + + private static Logger log = LoggerFactory.getLogger(ElasticSearchClient.class.getName()); + + private Node node; + private boolean isLocal; + private String clusterName; + private Client client; + + String serverHost; + String serverPort; + + ArrayList<String> nodes = new ArrayList<String>(); + + private boolean isTransportClient; + + @PostConstruct + public void initialize() throws URISyntaxException { + + URL url = null; + Settings settings = null; + URL systemResourceElasticsearchPath = ClassLoader.getSystemResource("elasticsearch.yml"); + + if (systemResourceElasticsearchPath != null) { + log.debug("try to create URI for {}", systemResourceElasticsearchPath.toString()); + Path classpathConfig = Paths.get(systemResourceElasticsearchPath.toURI()); + settings = Settings.settingsBuilder().loadFromPath(classpathConfig).build(); + } + String configHome = System.getProperty("config.home"); + if (configHome != null && false == configHome.isEmpty()) { + try { + if (SystemUtils.IS_OS_WINDOWS) { + url = new URL("file:///" + configHome + "/elasticsearch.yml"); + } else { + url = new URL("file:" + configHome + "/elasticsearch.yml"); + } + + log.debug("URL {}", url); + settings = Settings.settingsBuilder().loadFromPath(Paths.get(url.toURI())).build(); + } catch (MalformedURLException | URISyntaxException e1) { + log.error("Failed to create URL in order to load elasticsearch yml"); + System.err.println("Failed to create URL in order to load elasticsearch yml from " + configHome); + } + } + if (settings == null) { + log.error("Failed to find settings of elasticsearch yml"); + System.err.println("Failed to create URL in order to load elasticsearch yml from " + configHome); + } + if (isTransportClient()) { + log.info("******* ElasticSearchClient type is Transport Client *****"); + TransportClient transportClient = TransportClient.builder().addPlugin(ShieldPlugin.class).settings(settings) + .build(); + + String[] nodesArray = transportClient.settings().getAsArray("transport.client.initial_nodes"); + for (String host : nodesArray) { + int port = 9300; + + // or parse it from the host string... + String[] splitHost = host.split(":", 2); + if (splitHost.length == 2) { + host = splitHost[0]; + port = Integer.parseInt(splitHost[1]); + } + + transportClient.addTransportAddress(new InetSocketTransportAddress(new InetSocketAddress(host, port))); + + } + this.client = transportClient; + serverHost = Arrays.toString(nodesArray); + + } else { + log.info("******* ElasticSearchClient type is Node Client *****"); + this.node = NodeBuilder.nodeBuilder().settings(settings).client(!isLocal).clusterName(this.clusterName) + .local(isLocal).node(); + this.client = node.client(); + + serverHost = this.client.settings().get("discovery.zen.ping.unicast.hosts"); + if (serverHost == null) { + serverHost = "['localhost:9200']"; + } + + } + + serverPort = this.client.settings().get("http.port"); + if (serverPort == null) { + serverPort = "9200"; + } + + log.info("Initialized ElasticSearch client for cluster <{}> with nodes: {}", this.clusterName, serverHost); + } + + @PreDestroy + public void close() { + if (client != null) { + client.close(); + } + if (node != null) { + node.close(); + } + log.info("Closed ElasticSearch client for cluster <" + this.clusterName + ">"); + } + + /** + * Get the elastic search client. + * + * @return The elastic search client. + */ + public Client getClient() { + return this.client; + } + + public String getServerHost() { + return serverHost; + } + + public String getServerPort() { + return serverPort; + } + + /** + * Wait for green status for the given indices. + * + * @param indices + * The indices to wait for. + * @return A {@link ClusterHealthResponse} that contains the cluster health + * after waiting maximum 5 minutes for green status. + */ + public ClusterHealthResponse waitForGreenStatus(String... indices) { + ClusterHealthAction healthAction = ClusterHealthAction.INSTANCE; + + ClusterHealthRequestBuilder builder = healthAction.newRequestBuilder(this.client.admin().cluster()); + builder.setIndices(indices); + builder.setWaitForGreenStatus(); + builder.setTimeout(TimeValue.timeValueSeconds(30)); + ClusterHealthResponse response = builder.execute().actionGet(); + log.debug("getStatus : {}", response.getStatus()); + log.debug("getActivePrimaryShards : {}", response.getActivePrimaryShards()); + log.debug("getActiveShards : {}", response.getActiveShards()); + log.debug("getInitializingShards : {}", response.getInitializingShards()); + log.debug("getNumberOfDataNodes : {}", response.getNumberOfDataNodes()); + log.debug("getNumberOfNodes : {}", response.getNumberOfNodes()); + log.debug("getRelocatingShards : {}", response.getRelocatingShards()); + log.debug("getUnassignedShards : {}", response.getUnassignedShards()); + log.debug("getAllValidationFailures : {}", response.getAllValidationFailures()); + return response; + } + + @Value("#{elasticsearchConfig['cluster.name']}") + public void setClusterName(final String clusterName) { + this.clusterName = clusterName; + } + + @Value("#{elasticsearchConfig['elasticSearch.local']}") + public void setLocal(final String strIsLocal) { + if (strIsLocal != null && !strIsLocal.isEmpty()) + this.isLocal = Boolean.parseBoolean(strIsLocal); + } + + public boolean isTransportClient() { + return isTransportClient; + } + + @Value("#{elasticsearchConfig['elasticSearch.transportclient']}") + public void setTransportClient(final String strIsTransportclient) { + if (strIsTransportclient != null && !strIsTransportclient.isEmpty()) + this.isTransportClient = Boolean.parseBoolean(strIsTransportclient); + } + +} |