summaryrefslogtreecommitdiffstats
path: root/src/main/java/org/openecomp/sparky/dal/elasticsearch
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/org/openecomp/sparky/dal/elasticsearch')
-rw-r--r--src/main/java/org/openecomp/sparky/dal/elasticsearch/ElasticSearchAdapter.java165
-rw-r--r--src/main/java/org/openecomp/sparky/dal/elasticsearch/ElasticSearchDataProvider.java66
-rw-r--r--src/main/java/org/openecomp/sparky/dal/elasticsearch/ElasticSearchEntityStatistics.java274
-rw-r--r--src/main/java/org/openecomp/sparky/dal/elasticsearch/HashQueryResponse.java59
-rw-r--r--src/main/java/org/openecomp/sparky/dal/elasticsearch/SearchAdapter.java122
-rw-r--r--src/main/java/org/openecomp/sparky/dal/elasticsearch/config/ElasticSearchConfig.java543
6 files changed, 1229 insertions, 0 deletions
diff --git a/src/main/java/org/openecomp/sparky/dal/elasticsearch/ElasticSearchAdapter.java b/src/main/java/org/openecomp/sparky/dal/elasticsearch/ElasticSearchAdapter.java
new file mode 100644
index 0000000..f2df3ab
--- /dev/null
+++ b/src/main/java/org/openecomp/sparky/dal/elasticsearch/ElasticSearchAdapter.java
@@ -0,0 +1,165 @@
+/**
+ * ============LICENSE_START===================================================
+ * SPARKY (AAI UI service)
+ * ============================================================================
+ * Copyright © 2017 AT&T Intellectual Property.
+ * Copyright © 2017 Amdocs
+ * 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=====================================================
+ *
+ * ECOMP and OpenECOMP are trademarks
+ * and service marks of AT&T Intellectual Property.
+ */
+
+package org.openecomp.sparky.dal.elasticsearch;
+
+import org.openecomp.sparky.dal.elasticsearch.config.ElasticSearchConfig;
+import org.openecomp.sparky.dal.rest.HttpMethod;
+import org.openecomp.sparky.dal.rest.OperationResult;
+import org.openecomp.sparky.dal.rest.RestDataProvider;
+import org.openecomp.sparky.dal.rest.RestfulDataAccessor;
+
+/**
+ * The Class ElasticSearchAdapter.
+ *
+ * @author davea.
+ */
+public class ElasticSearchAdapter implements ElasticSearchDataProvider {
+
+ private static final String BULK_IMPORT_INDEX_TEMPLATE =
+ "{\"index\":{\"_index\":\"%s\",\"_type\":\"%s\",\"_id\":\"%s\", \"_version\":\"%s\"}}\n";
+
+ private final RestDataProvider restDataProvider;
+ private final ElasticSearchConfig esConfig;
+
+ /**
+ * Instantiates a new elastic search adapter.
+ *
+ * @param provider the provider
+ */
+ public ElasticSearchAdapter(RestDataProvider provider, ElasticSearchConfig esConfig) {
+ this.restDataProvider = provider;
+ this.esConfig = esConfig;
+ }
+
+ /* (non-Javadoc)
+ * @see org.openecomp.sparky.dal.rest.RestDataProvider#doGet(java.lang.String, java.lang.String)
+ */
+ @Override
+ public OperationResult doGet(String url, String acceptContentType) {
+ return restDataProvider.doGet(url, acceptContentType);
+ }
+
+ /* (non-Javadoc)
+ * @see org.openecomp.sparky.dal.rest.RestDataProvider#doDelete(java.lang.String, java.lang.String)
+ */
+ @Override
+ public OperationResult doDelete(String url, String acceptContentType) {
+ return restDataProvider.doDelete(url, acceptContentType);
+ }
+
+ /* (non-Javadoc)
+ * @see org.openecomp.sparky.dal.rest.RestDataProvider#doPost(java.lang.String, java.lang.String, java.lang.String)
+ */
+ @Override
+ public OperationResult doPost(String url, String jsonPayload, String acceptContentType) {
+ return restDataProvider.doPost(url, jsonPayload, acceptContentType);
+ }
+
+ /* (non-Javadoc)
+ * @see org.openecomp.sparky.dal.rest.RestDataProvider#doPut(java.lang.String, java.lang.String, java.lang.String)
+ */
+ @Override
+ public OperationResult doPut(String url, String jsonPayload, String acceptContentType) {
+ return restDataProvider.doPut(url, jsonPayload, acceptContentType);
+ }
+
+ /* (non-Javadoc)
+ * @see org.openecomp.sparky.dal.rest.RestDataProvider#doPatch(java.lang.String, java.lang.String, java.lang.String)
+ */
+ @Override
+ public OperationResult doPatch(String url, String jsonPayload, String acceptContentType) {
+ return restDataProvider.doPatch(url, jsonPayload, acceptContentType);
+ }
+
+ /* (non-Javadoc)
+ * @see org.openecomp.sparky.dal.rest.RestDataProvider#doHead(java.lang.String, java.lang.String)
+ */
+ @Override
+ public OperationResult doHead(String url, String acceptContentType) {
+ return restDataProvider.doHead(url, acceptContentType);
+ }
+
+ /* (non-Javadoc)
+ * @see org.openecomp.sparky.dal.rest.RestDataProvider#clearCache()
+ */
+ @Override
+ public void clearCache() {
+ restDataProvider.clearCache();
+ }
+
+ /* (non-Javadoc)
+ * @see org.openecomp.sparky.dal.elasticsearch.ElasticSearchDataProvider#doBulkOperation(java.lang.String, java.lang.String)
+ */
+ @Override
+ public OperationResult doBulkOperation(String url, String payload) {
+
+ return doRestfulOperation(HttpMethod.PUT, url, payload,
+ RestfulDataAccessor.APPLICATION_X_WWW_FORM_URL_ENCODED,
+ RestfulDataAccessor.APPLICATION_JSON);
+ }
+
+ /* (non-Javadoc)
+ * @see org.openecomp.sparky.dal.elasticsearch.ElasticSearchDataProvider#shutdown()
+ */
+ @Override
+ public void shutdown() {
+ restDataProvider.shutdown();
+ }
+
+ /* (non-Javadoc)
+ * @see org.openecomp.sparky.dal.rest.RestDataProvider#doRestfulOperation(org.openecomp.sparky.dal.rest.HttpMethod, java.lang.String, java.lang.String, java.lang.String, java.lang.String)
+ */
+ @Override
+ public OperationResult doRestfulOperation(HttpMethod method, String url, String payload,
+ String payloadType, String acceptContentType) {
+ return restDataProvider.doRestfulOperation(method, url, payload, payloadType,
+ acceptContentType);
+ }
+
+ /* (non-Javadoc)
+ * @see org.openecomp.sparky.dal.elasticsearch.ElasticSearchDataProvider#buildBulkImportOperationRequest(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String)
+ */
+ @Override
+ public String buildBulkImportOperationRequest(String index, String type, String id,
+ String version, String payload) {
+
+ StringBuilder requestPayload = new StringBuilder(128);
+
+ requestPayload.append(String.format(BULK_IMPORT_INDEX_TEMPLATE, index, type, id, version));
+ requestPayload.append(payload).append("\n");
+
+ return requestPayload.toString();
+
+ }
+
+ @Override
+ public OperationResult retrieveEntityById(String entityId) throws Exception {
+
+ String url = esConfig.getElasticFullUrl("/" +entityId);
+ return doGet( url, "application/json");
+ }
+
+}
diff --git a/src/main/java/org/openecomp/sparky/dal/elasticsearch/ElasticSearchDataProvider.java b/src/main/java/org/openecomp/sparky/dal/elasticsearch/ElasticSearchDataProvider.java
new file mode 100644
index 0000000..97c4f4d
--- /dev/null
+++ b/src/main/java/org/openecomp/sparky/dal/elasticsearch/ElasticSearchDataProvider.java
@@ -0,0 +1,66 @@
+/**
+ * ============LICENSE_START===================================================
+ * SPARKY (AAI UI service)
+ * ============================================================================
+ * Copyright © 2017 AT&T Intellectual Property.
+ * Copyright © 2017 Amdocs
+ * 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=====================================================
+ *
+ * ECOMP and OpenECOMP are trademarks
+ * and service marks of AT&T Intellectual Property.
+ */
+
+package org.openecomp.sparky.dal.elasticsearch;
+
+import org.openecomp.sparky.dal.rest.OperationResult;
+import org.openecomp.sparky.dal.rest.RestDataProvider;
+
+/**
+ * The Interface ElasticSearchDataProvider.
+ */
+public interface ElasticSearchDataProvider extends RestDataProvider {
+
+ /**
+ * Builds the bulk import operation request.
+ *
+ * @param index the index
+ * @param type the type
+ * @param id the id
+ * @param version the version
+ * @param payload the payload
+ * @return the string
+ */
+ String buildBulkImportOperationRequest(String index, String type, String id, String version,
+ String payload);
+
+ /**
+ * Do bulk operation.
+ *
+ * @param url the url
+ * @param payload the payload
+ * @return the operation result
+ */
+ OperationResult doBulkOperation(String url, String payload);
+
+ OperationResult retrieveEntityById(String entityId) throws Exception;
+
+ /* (non-Javadoc)
+ * @see org.openecomp.sparky.dal.rest.RestDataProvider#shutdown()
+ */
+ @Override
+ void shutdown();
+
+}
diff --git a/src/main/java/org/openecomp/sparky/dal/elasticsearch/ElasticSearchEntityStatistics.java b/src/main/java/org/openecomp/sparky/dal/elasticsearch/ElasticSearchEntityStatistics.java
new file mode 100644
index 0000000..6194027
--- /dev/null
+++ b/src/main/java/org/openecomp/sparky/dal/elasticsearch/ElasticSearchEntityStatistics.java
@@ -0,0 +1,274 @@
+/**
+ * ============LICENSE_START===================================================
+ * SPARKY (AAI UI service)
+ * ============================================================================
+ * Copyright © 2017 AT&T Intellectual Property.
+ * Copyright © 2017 Amdocs
+ * 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=====================================================
+ *
+ * ECOMP and OpenECOMP are trademarks
+ * and service marks of AT&T Intellectual Property.
+ */
+
+package org.openecomp.sparky.dal.elasticsearch;
+
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeMap;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import org.openecomp.sparky.config.oxm.OxmEntityDescriptor;
+import org.openecomp.sparky.config.oxm.OxmModelLoader;
+import org.openecomp.sparky.dal.NetworkTransaction;
+import org.openecomp.sparky.dal.rest.HttpMethod;
+import org.openecomp.sparky.dal.rest.OperationResult;
+
+/**
+ * The Class ElasticSearchEntityStatistics.
+ */
+public class ElasticSearchEntityStatistics {
+
+ private static final String TOTAL = "Total";
+ private static final String CREATED = "Created";
+ private static final String MODIFIED = "Modified";
+ private static final String OTHERSUCCESS = "OTHERSUCCESS";
+ private static final String DELETED = "DELETED";
+ private static final String ERROR = "ERROR";
+
+ private Map<String, HashMap<String, AtomicInteger>> entityStatistics;
+ private OxmModelLoader loader;
+
+ /**
+ * Creates the entity op stats.
+ *
+ * @return the hash map
+ */
+ private HashMap<String, AtomicInteger> createEntityOpStats() {
+
+ HashMap<String, AtomicInteger> opStats = new HashMap<String, AtomicInteger>();
+
+ opStats.put(TOTAL, new AtomicInteger());
+ opStats.put(CREATED, new AtomicInteger());
+ opStats.put(MODIFIED, new AtomicInteger());
+ opStats.put(OTHERSUCCESS, new AtomicInteger());
+ opStats.put(DELETED, new AtomicInteger());
+ opStats.put(ERROR, new AtomicInteger());
+
+ return opStats;
+
+ }
+
+ /*
+ * private void createActiveInventoryEntityStatistics() {
+ *
+ * Map<String,OxmEntityDescriptor> descriptors = loader.getSearchableEntityDescriptors();
+ *
+ * if(descriptors == null) { return; }
+ *
+ * OxmEntityDescriptor d = null; for ( String key : descriptors.keySet() ) { d =
+ * descriptors.get(key); entityStatistics.put(d.getEntityName(), createEntityOpStats()); }
+ *
+ * }
+ */
+
+ /**
+ * Initializecreate active inventory entity statistics.
+ */
+ private void initializecreateActiveInventoryEntityStatistics() {
+ Set<String> keys = entityStatistics.keySet();
+
+ Set<String> opStatKeySet = null;
+ Map<String, AtomicInteger> opStats = null;
+
+ for (String k : keys) {
+
+ opStats = entityStatistics.get(k);
+
+ opStatKeySet = opStats.keySet();
+
+ for (String opStatKey : opStatKeySet) {
+ opStats.get(opStatKey).set(0);
+ }
+ }
+ }
+
+ /**
+ * Instantiates a new elastic search entity statistics.
+ *
+ * @param loader the loader
+ */
+ public ElasticSearchEntityStatistics(OxmModelLoader loader) {
+ this.loader = loader;
+ entityStatistics = new HashMap<String, HashMap<String, AtomicInteger>>();
+ // createActiveInventoryEntityStatistics();
+ reset();
+ }
+
+ /**
+ * Initialize counters from oxm entity descriptors.
+ *
+ * @param descriptors the descriptors
+ */
+ public void initializeCountersFromOxmEntityDescriptors(
+ Map<String, OxmEntityDescriptor> descriptors) {
+
+ if (descriptors == null) {
+ return;
+ }
+
+ OxmEntityDescriptor descriptor = null;
+ for (String key : descriptors.keySet()) {
+ descriptor = descriptors.get(key);
+ entityStatistics.put(descriptor.getEntityName(), createEntityOpStats());
+ }
+ }
+
+ /**
+ * Reset.
+ */
+ public void reset() {
+ initializecreateActiveInventoryEntityStatistics();
+ }
+
+ /**
+ * Gets the result code.
+ *
+ * @param txn the txn
+ * @return the result code
+ */
+ private int getResultCode(NetworkTransaction txn) {
+
+
+ if (txn == null) {
+ return -1;
+ }
+
+ OperationResult or = txn.getOperationResult();
+
+ if (or == null) {
+ return -1;
+ }
+
+ return or.getResultCode();
+
+ }
+
+ /**
+ * Update elastic search entity counters.
+ *
+ * @param txn the txn
+ */
+ private void updateElasticSearchEntityCounters(NetworkTransaction txn) {
+
+ if (txn == null) {
+ return;
+ }
+
+ Map<String, AtomicInteger> entityOpStats = entityStatistics.get(txn.getEntityType());
+
+ int resultCode = getResultCode(txn);
+
+ if (txn.getOperationType() == HttpMethod.PUT) {
+
+ entityOpStats.get(TOTAL).incrementAndGet();
+
+ if (resultCode == 201) {
+ entityOpStats.get(CREATED).incrementAndGet();
+ } else if (resultCode == 200) {
+ entityOpStats.get(MODIFIED).incrementAndGet();
+ } else if (202 <= resultCode && resultCode <= 299) {
+ entityOpStats.get(OTHERSUCCESS).incrementAndGet();
+ } else {
+ entityOpStats.get(ERROR).incrementAndGet();
+ }
+
+ } else if (txn.getOperationType() == HttpMethod.DELETE) {
+
+ entityOpStats.get(TOTAL).incrementAndGet();
+
+ if (200 <= resultCode && resultCode <= 299) {
+ entityOpStats.get(DELETED).incrementAndGet();
+ } else {
+ entityOpStats.get(ERROR).incrementAndGet();
+ }
+ }
+
+ }
+
+ /**
+ * Update counters.
+ *
+ * @param txn the txn
+ */
+ public void updateCounters(NetworkTransaction txn) {
+
+ updateElasticSearchEntityCounters(txn);
+
+ }
+
+ public String getStatisticsReport() {
+
+ StringBuilder sb = new StringBuilder(128);
+
+ /*
+ * sort entities, then sort nested op codes
+ */
+
+ TreeMap<String, HashMap<String, AtomicInteger>> elasticEntitySortedTreeMap =
+ new TreeMap<String, HashMap<String, AtomicInteger>>(new Comparator<String>() {
+
+ @Override
+ public int compare(String o1, String o2) {
+ return o1.toLowerCase().compareTo(o2.toLowerCase());
+ }
+ });
+
+ elasticEntitySortedTreeMap.putAll(entityStatistics);
+
+ for (String counterEntityKey : elasticEntitySortedTreeMap.keySet()) {
+
+ HashMap<String, AtomicInteger> entityCounters =
+ elasticEntitySortedTreeMap.get(counterEntityKey);
+
+ AtomicInteger total = entityCounters.get(TOTAL);
+ AtomicInteger created = entityCounters.get(CREATED);
+ AtomicInteger modified = entityCounters.get(MODIFIED);
+ AtomicInteger otherSuccess = entityCounters.get(OTHERSUCCESS);
+ AtomicInteger deleted = entityCounters.get(DELETED);
+ AtomicInteger error = entityCounters.get(ERROR);
+
+ int totalValue = (total == null) ? 0 : total.get();
+ int createdValue = (created == null) ? 0 : created.get();
+ int modifiedValue = (modified == null) ? 0 : modified.get();
+ int otherSuccessValue = (otherSuccess == null) ? 0 : otherSuccess.get();
+ int deletedValue = (deleted == null) ? 0 : deleted.get();
+ int errorValue = (error == null) ? 0 : error.get();
+
+ sb.append("\n ")
+ .append(String.format(
+ "%-30s TOTAL: %-12d CREATED: %-12d MODIFIED:"
+ + " %-12d OTHER_2XX: %-12d DELETED: %-12d ERROR: %-12d",
+ counterEntityKey, totalValue, createdValue, modifiedValue, otherSuccessValue,
+ deletedValue, errorValue));
+ }
+ return sb.toString();
+ }
+
+
+
+}
diff --git a/src/main/java/org/openecomp/sparky/dal/elasticsearch/HashQueryResponse.java b/src/main/java/org/openecomp/sparky/dal/elasticsearch/HashQueryResponse.java
new file mode 100644
index 0000000..a376add
--- /dev/null
+++ b/src/main/java/org/openecomp/sparky/dal/elasticsearch/HashQueryResponse.java
@@ -0,0 +1,59 @@
+/**
+ * ============LICENSE_START===================================================
+ * SPARKY (AAI UI service)
+ * ============================================================================
+ * Copyright © 2017 AT&T Intellectual Property.
+ * Copyright © 2017 Amdocs
+ * 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=====================================================
+ *
+ * ECOMP and OpenECOMP are trademarks
+ * and service marks of AT&T Intellectual Property.
+ */
+package org.openecomp.sparky.dal.elasticsearch;
+
+import org.json.JSONObject;
+import org.openecomp.sparky.dal.rest.OperationResult;
+
+public class HashQueryResponse {
+ private String jsonPayload = null;
+ private OperationResult opResult = null;
+
+ public HashQueryResponse() {
+ this(null, null);
+ }
+
+ public HashQueryResponse(String jsonPayload, OperationResult opResult) {
+ this.jsonPayload = jsonPayload;
+ this.opResult = opResult;
+ }
+
+ public String getJsonPayload() {
+ return jsonPayload;
+ }
+ public void setJsonPayload(String jsonPayload) {
+ this.jsonPayload = jsonPayload;
+ }
+ public OperationResult getOpResult() {
+ return opResult;
+ }
+ public void setOpResult(OperationResult opResult) {
+ this.opResult = opResult;
+ }
+ @Override
+ public String toString() {
+ return "HashQueryResponse [jsonPayload=" + jsonPayload + ", opResult=" + opResult + "]";
+ }
+}
diff --git a/src/main/java/org/openecomp/sparky/dal/elasticsearch/SearchAdapter.java b/src/main/java/org/openecomp/sparky/dal/elasticsearch/SearchAdapter.java
new file mode 100644
index 0000000..9479a8f
--- /dev/null
+++ b/src/main/java/org/openecomp/sparky/dal/elasticsearch/SearchAdapter.java
@@ -0,0 +1,122 @@
+/**
+ * ============LICENSE_START===================================================
+ * SPARKY (AAI UI service)
+ * ============================================================================
+ * Copyright © 2017 AT&T Intellectual Property.
+ * Copyright © 2017 Amdocs
+ * 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=====================================================
+ *
+ * ECOMP and OpenECOMP are trademarks
+ * and service marks of AT&T Intellectual Property.
+ */
+
+package org.openecomp.sparky.dal.elasticsearch;
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.ws.rs.core.MediaType;
+
+import org.openecomp.cl.api.Logger;
+import org.openecomp.cl.eelf.LoggerFactory;
+import org.openecomp.sparky.dal.rest.OperationResult;
+import org.openecomp.sparky.dal.sas.config.SearchServiceConfig;
+import org.openecomp.sparky.util.Encryptor;
+import org.openecomp.sparky.viewandinspect.config.TierSupportUiConstants;
+import org.slf4j.MDC;
+
+import org.openecomp.restclient.client.RestClient;
+import org.openecomp.restclient.enums.RestAuthenticationMode;
+import org.openecomp.restclient.client.Headers;
+import org.openecomp.cl.mdc.MdcContext;
+
+import org.openecomp.cl.mdc.MdcContext;
+
+/**
+ * The Class SearchAdapter.
+ */
+public class SearchAdapter {
+
+ private static final Logger LOG = LoggerFactory.getInstance().getLogger(SearchAdapter.class);
+
+ private RestClient client;
+
+ private Map<String, List<String>> commonHeaders;
+ private SearchServiceConfig sasConfig;
+
+ /**
+ * Instantiates a new search adapter.
+ * @throws Exception
+ */
+ public SearchAdapter() throws Exception {
+ sasConfig = SearchServiceConfig.getConfig();
+ Encryptor encryptor = new Encryptor();
+ client = new RestClient().authenticationMode(RestAuthenticationMode.SSL_CERT)
+ .validateServerHostname(false).validateServerCertChain(false)
+ .clientCertFile(TierSupportUiConstants.CONFIG_AUTH_LOCATION + sasConfig.getCertName())
+ .clientCertPassword(encryptor.decryptValue(sasConfig.getKeystorePassword()))
+ .trustStore(TierSupportUiConstants.CONFIG_AUTH_LOCATION + sasConfig.getKeystore());
+
+ commonHeaders = new HashMap<String, List<String>>();
+ commonHeaders.put("Accept", Arrays.asList("application/json"));
+ commonHeaders.put(Headers.FROM_APP_ID, Arrays.asList("AAI-UI"));
+ }
+
+ public SearchServiceConfig getSasConfig() {
+ return sasConfig;
+ }
+
+ public void setSasConfig(SearchServiceConfig sasConfig) {
+ this.sasConfig = sasConfig;
+ }
+
+ public OperationResult doPost(String url, String jsonPayload, String acceptContentType) {
+ org.openecomp.restclient.client.OperationResult or = client.post(url, jsonPayload, getTxnHeader(),
+ MediaType.APPLICATION_JSON_TYPE, MediaType.APPLICATION_JSON_TYPE);
+ return new OperationResult(or.getResultCode(), or.getResult());
+ }
+
+ public OperationResult doGet(String url, String acceptContentType) {
+ org.openecomp.restclient.client.OperationResult or =
+ client.get(url, getTxnHeader(), MediaType.APPLICATION_JSON_TYPE);
+ return new OperationResult(or.getResultCode(), or.getResult());
+ }
+
+ public OperationResult doPut(String url, String payload, String acceptContentType) {
+ org.openecomp.restclient.client.OperationResult or = client.put(url, payload, getTxnHeader(),
+ MediaType.APPLICATION_JSON_TYPE, MediaType.APPLICATION_JSON_TYPE);
+ return new OperationResult(or.getResultCode(), or.getResult());
+ }
+
+ public OperationResult doDelete(String url, String acceptContentType) {
+
+ org.openecomp.restclient.client.OperationResult or =
+ client.delete(url, getTxnHeader(), MediaType.APPLICATION_JSON_TYPE);
+ return new OperationResult(or.getResultCode(), or.getResult());
+ }
+
+ public Map<String, List<String>> getTxnHeader() {
+ Map headers = new HashMap<String, List<String>>();
+ headers.putAll(this.commonHeaders);
+ headers.put("X-TransactionId", Arrays.asList(MDC.get(MdcContext.MDC_REQUEST_ID)));
+ headers.put("X-FromAppId", Arrays.asList(MDC.get(MdcContext.MDC_PARTNER_NAME)));
+ return headers;
+ }
+
+
+}
diff --git a/src/main/java/org/openecomp/sparky/dal/elasticsearch/config/ElasticSearchConfig.java b/src/main/java/org/openecomp/sparky/dal/elasticsearch/config/ElasticSearchConfig.java
new file mode 100644
index 0000000..3f2cf7a
--- /dev/null
+++ b/src/main/java/org/openecomp/sparky/dal/elasticsearch/config/ElasticSearchConfig.java
@@ -0,0 +1,543 @@
+/**
+ * ============LICENSE_START===================================================
+ * SPARKY (AAI UI service)
+ * ============================================================================
+ * Copyright © 2017 AT&T Intellectual Property.
+ * Copyright © 2017 Amdocs
+ * 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=====================================================
+ *
+ * ECOMP and OpenECOMP are trademarks
+ * and service marks of AT&T Intellectual Property.
+ */
+
+package org.openecomp.sparky.dal.elasticsearch.config;
+
+import java.io.BufferedReader;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.Properties;
+
+import org.openecomp.sparky.dal.exception.ElasticSearchOperationException;
+import org.openecomp.sparky.synchronizer.config.TaskProcessorConfig;
+import org.openecomp.sparky.util.ConfigHelper;
+import org.openecomp.sparky.viewandinspect.config.TierSupportUiConstants;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+
+
+/**
+ * The Class ElasticSearchConfig.
+ */
+public class ElasticSearchConfig {
+
+ public static final String CONFIG_FILE =
+ TierSupportUiConstants.DYNAMIC_CONFIG_APP_LOCATION + "elasticsearch.properties";
+
+ private static ElasticSearchConfig instance;
+
+ private String ipAddress;
+
+ private String httpPort;
+
+ private String javaApiPort;
+
+ private String indexName;
+
+ private String type;
+
+ private String clusterName;
+
+ private String mappingsFileName;
+
+ private String settingsFileName;
+
+ private int syncAdapterMaxConcurrentWorkers;
+
+ private String auditIndexName;
+
+ private String topographicalSearchIndex;
+
+ private String entityCountHistoryIndex;
+
+ private String autosuggestIndexname;
+
+ private String entityCountHistoryMappingsFileName;
+
+ private String autoSuggestSettingsFileName;
+
+ private String autoSuggestMappingsFileName;
+
+ private String dynamicMappingsFileName;
+
+ private static final String IP_ADDRESS_DEFAULT = "localhost";
+
+ private static final String HTTP_PORT_DEFAULT = "9200";
+
+ private static final String JAVA_API_PORT_DEFAULT = "9300";
+
+ private static final String TYPE_DEFAULT = "aaiEntities";
+
+ private static final String CLUSTER_NAME_DEFAULT = "elasticsearch";
+
+ private static final String INDEX_NAME_DEFAULT = "entitySearchIndex";
+
+ private static final String AUDIT_INDEX_NAME_DEFAULT = "auditdataindex";
+
+ private static final String TOPOGRAPHICAL_INDEX_NAME_DEFAULT = "topographicalSearchIndex";
+
+ private static final String ENTITY_COUNT_HISTORY_INDEX_NAME_DEFAULT = "entityCountHistory";
+
+ private static final String ENTITY_AUTO_SUGGEST_INDEX_NAME_DEFAULT =
+ TierSupportUiConstants.ENTITY_AUTO_SUGGEST_INDEX_NAME_DEFAULT;
+
+ private static final String ENTITY_AUTO_SUGGEST_SETTINGS_FILE_DEFAULT =
+ TierSupportUiConstants.ENTITY_AUTO_SUGGEST_SETTINGS_FILE_DEFAULT;
+
+ private static final String ENTITY_AUTO_SUGGEST_MAPPINGS_FILE_DEFAULT =
+ TierSupportUiConstants.ENTITY_AUTO_SUGGEST_SETTINGS_FILE_DEFAULT;
+
+ private static final String ENTITY_DYNAMIC_MAPPINGS_FILE_DEFAULT =
+ TierSupportUiConstants.ENTITY_DYNAMIC_MAPPINGS_FILE_DEFAULT;
+
+ private static final String BULK_API = "_bulk";
+
+ private TaskProcessorConfig processorConfig;
+
+ public TaskProcessorConfig getProcessorConfig() {
+ return processorConfig;
+ }
+
+ public void setProcessorConfig(TaskProcessorConfig processorConfig) {
+ this.processorConfig = processorConfig;
+ }
+
+ public static ElasticSearchConfig getConfig() throws Exception {
+
+ if (instance == null) {
+ instance = new ElasticSearchConfig();
+ instance.initializeProperties();
+ }
+
+ return instance;
+ }
+
+ public static void setConfig(ElasticSearchConfig config) {
+ /*
+ * Explicitly allow setting the configuration singleton. This will be useful for automation.
+ */
+
+ ElasticSearchConfig.instance = config;
+ }
+
+ /**
+ * Instantiates a new elastic search config.
+ */
+ public ElasticSearchConfig() {
+ // test method
+ }
+
+ public String getElasticFullUrl(String resourceUrl, String indexName, String indexType)
+ throws Exception {
+ final String host = getIpAddress();
+ final String port = getHttpPort();
+ return String.format("http://%s:%s/%s/%s%s", host, port, indexName, indexType, resourceUrl);
+ }
+
+ public String getElasticFullUrl(String resourceUrl, String indexName) throws Exception {
+ final String host = getIpAddress();
+ final String port = getHttpPort();
+ return String.format("http://%s:%s/%s/%s%s", host, port, indexName,
+ ElasticSearchConfig.getConfig().getType(), resourceUrl);
+ }
+
+ public String getElasticFullUrl(String resourceUrl) throws Exception {
+ final String host = getIpAddress();
+ final String port = getHttpPort();
+ final String indexName = getIndexName();
+ return String.format("http://%s:%s/%s/%s%s", host, port, indexName, getType(), resourceUrl);
+ }
+
+ /**
+ * Initialize properties.
+ */
+ private void initializeProperties() {
+ Properties props = ConfigHelper.loadConfigFromExplicitPath(CONFIG_FILE);
+
+ ipAddress = props.getProperty("elasticsearch.ipAddress", IP_ADDRESS_DEFAULT);
+ httpPort = props.getProperty("elasticsearch.httpPort", "" + HTTP_PORT_DEFAULT);
+ javaApiPort = props.getProperty("elasticsearch.javaApiPort", "" + JAVA_API_PORT_DEFAULT);
+ type = props.getProperty("elasticsearch.type", TYPE_DEFAULT);
+ clusterName = props.getProperty("elasticsearch.clusterName", CLUSTER_NAME_DEFAULT);
+ indexName = props.getProperty("elasticsearch.indexName", INDEX_NAME_DEFAULT);
+ mappingsFileName = props.getProperty("elasticsearch.mappingsFileName");
+ settingsFileName = props.getProperty("elasticsearch.settingsFileName");
+ auditIndexName = props.getProperty("elasticsearch.auditIndexName", AUDIT_INDEX_NAME_DEFAULT);
+ topographicalSearchIndex =
+ props.getProperty("elasticsearch.topographicalIndexName", TOPOGRAPHICAL_INDEX_NAME_DEFAULT);
+ entityCountHistoryIndex = props.getProperty("elasticsearch.entityCountHistoryIndexName",
+ ENTITY_COUNT_HISTORY_INDEX_NAME_DEFAULT);
+ entityCountHistoryMappingsFileName =
+ props.getProperty("elasticsearch.entityCountHistoryMappingsFileName");
+
+ autosuggestIndexname = props.getProperty("elasticsearch.autosuggestIndexname",
+ ENTITY_AUTO_SUGGEST_INDEX_NAME_DEFAULT);
+ autoSuggestSettingsFileName = props.getProperty("elasticsearch.autosuggestSettingsFileName",
+ ENTITY_AUTO_SUGGEST_SETTINGS_FILE_DEFAULT);
+ autoSuggestMappingsFileName = props.getProperty("elasticsearch.autosuggestMappingsFileName",
+ ENTITY_AUTO_SUGGEST_MAPPINGS_FILE_DEFAULT);
+ dynamicMappingsFileName = props.getProperty("elasticsearch.dynamicMappingsFileName",
+ ENTITY_DYNAMIC_MAPPINGS_FILE_DEFAULT);
+
+ syncAdapterMaxConcurrentWorkers =
+ Integer.parseInt(props.getProperty("elasticsearch.syncAdapter.maxConcurrentWorkers", "5"));
+
+ processorConfig = new TaskProcessorConfig();
+ processorConfig.initializeFromProperties(
+ ConfigHelper.getConfigWithPrefix("elasticsearch.taskProcessor", props));
+
+ }
+
+ public String getIpAddress() {
+ return ipAddress;
+ }
+
+ public void setIpAddress(String ipAddress) {
+ this.ipAddress = ipAddress;
+ }
+
+ public String getHttpPort() {
+ return httpPort;
+ }
+
+ public void setHttpPort(String httpPort) {
+ this.httpPort = httpPort;
+ }
+
+ public String getJavaApiPort() {
+ return javaApiPort;
+ }
+
+ public void setJavaApiPort(String javaApiPort) {
+ this.javaApiPort = javaApiPort;
+ }
+
+ public String getIndexName() {
+ return indexName;
+ }
+
+ public void setIndexName(String indexName) {
+ this.indexName = indexName;
+ }
+
+ public String getType() {
+ return type;
+ }
+
+ public void setType(String type) {
+ this.type = type;
+ }
+
+ public String getClusterName() {
+ return clusterName;
+ }
+
+ public void setClusterName(String clusterName) {
+ this.clusterName = clusterName;
+ }
+
+ public String getMappingsFileName() {
+ return mappingsFileName;
+ }
+
+ public void setMappingsFileName(String mappingsFileName) {
+ this.mappingsFileName = mappingsFileName;
+ }
+
+ public String getSettingsFileName() {
+ return settingsFileName;
+ }
+
+ public int getSyncAdapterMaxConcurrentWorkers() {
+ return syncAdapterMaxConcurrentWorkers;
+ }
+
+ public void setSyncAdapterMaxConcurrentWorkers(int syncAdapterMaxConcurrentWorkers) {
+ this.syncAdapterMaxConcurrentWorkers = syncAdapterMaxConcurrentWorkers;
+ }
+
+ public void setSettingsFileName(String settingsFileName) {
+ this.settingsFileName = settingsFileName;
+ }
+
+ public String getAuditIndexName() {
+ return auditIndexName;
+ }
+
+ public void setAuditIndexName(String auditIndexName) {
+ this.auditIndexName = auditIndexName;
+ }
+
+ public String getTopographicalSearchIndex() {
+ return topographicalSearchIndex;
+ }
+
+ public void setTopographicalSearchIndex(String topographicalSearchIndex) {
+ this.topographicalSearchIndex = topographicalSearchIndex;
+ }
+
+ public String getEntityCountHistoryIndex() {
+ return entityCountHistoryIndex;
+ }
+
+ public void setEntityCountHistoryIndex(String entityCountHistoryIndex) {
+ this.entityCountHistoryIndex = entityCountHistoryIndex;
+ }
+
+
+ public String getEntityCountHistoryMappingsFileName() {
+ return entityCountHistoryMappingsFileName;
+ }
+
+ public void setEntityCountHistoryMappingsFileName(String entityCountHistoryMappingsFileName) {
+ this.entityCountHistoryMappingsFileName = entityCountHistoryMappingsFileName;
+ }
+
+ public String getBulkUrl() {
+ String url = this.getIpAddress();
+ String port = this.getHttpPort();
+ return String.format("http://%s:%s/%s", url, port, BULK_API);
+ }
+
+ public String getConfigAsString(String configItem, String configFileName)
+ throws ElasticSearchOperationException {
+ String indexConfig = null;
+
+ try {
+ indexConfig = ConfigHelper.getFileContents(configFileName);
+ } catch (IOException exc) {
+ throw new ElasticSearchOperationException(
+ "Failed to read index " + configItem + " from file = " + configFileName + ".", exc);
+ }
+
+ if (indexConfig == null) {
+ throw new ElasticSearchOperationException(
+ "Failed to load index " + configItem + " with filename = " + configFileName + ".");
+ }
+ return indexConfig;
+ }
+
+ public String getElasticSearchSettings() throws ElasticSearchOperationException {
+ return getConfigAsString("settings",
+ TierSupportUiConstants.getConfigPath(this.getSettingsFileName()));
+ }
+
+ public String getDynamicMappings() throws ElasticSearchOperationException{
+ return getConfigAsString("mapping",
+ TierSupportUiConstants.getConfigPath(this.getDynamicMappingsFileName()));
+ }
+ public String getElasticSearchMappings() throws ElasticSearchOperationException {
+ return getConfigAsString("mapping",
+ TierSupportUiConstants.getConfigPath(this.getMappingsFileName()));
+ }
+
+ public String getElasticSearchEntityCountHistoryMappings()
+ throws ElasticSearchOperationException {
+ return getConfigAsString("mapping",
+ TierSupportUiConstants.getConfigPath(this.getEntityCountHistoryMappingsFileName()));
+ }
+
+ public String getAutosuggestIndexSettings() throws ElasticSearchOperationException {
+ return getConfigAsString("setting",
+ TierSupportUiConstants.getConfigPath(this.getAutoSuggestSettingsFileName()));
+ }
+
+ public String getAutosuggestIndexMappings() throws ElasticSearchOperationException {
+ return getConfigAsString("mapping",
+ TierSupportUiConstants.getConfigPath(this.getAutoSuggestMappingsFileName()));
+ }
+
+ public String getAutosuggestIndexname() {
+ return autosuggestIndexname;
+ }
+
+ public void setAutosuggestIndexname(String autosuggestIndexname) {
+ this.autosuggestIndexname = autosuggestIndexname;
+ }
+
+ public String getAutoSuggestSettingsFileName() {
+ return autoSuggestSettingsFileName;
+ }
+
+ public void setAutoSuggestSettingsFileName(String autoSuggestSettingsFileName) {
+ this.autoSuggestSettingsFileName = autoSuggestSettingsFileName;
+ }
+
+ public String getAutoSuggestMappingsFileName() {
+ return autoSuggestMappingsFileName;
+ }
+
+ public void setAutoSuggestMappingsFileName(String autoSuggestMappingsFileName) {
+ this.autoSuggestMappingsFileName = autoSuggestMappingsFileName;
+ }
+
+ public String getDynamicMappingsFileName() {
+ return dynamicMappingsFileName;
+ }
+
+ public void setDynamicMappingsFileName(String dynamicMappingsFileName) {
+ this.dynamicMappingsFileName = dynamicMappingsFileName;
+ }
+
+ /**
+ * Builds the elastic search table config.
+ *
+ * @return the string
+ * @throws ElasticSearchOperationException the elastic search operation exception
+ */
+ public String buildElasticSearchTableConfig() throws ElasticSearchOperationException {
+
+ JsonNode esSettingsNode;
+ JsonNode esMappingsNodes;
+ ObjectMapper mapper = new ObjectMapper();
+
+ try {
+ esSettingsNode = mapper.readTree(getElasticSearchSettings());
+ esMappingsNodes = mapper.readTree(getElasticSearchMappings());
+ } catch (IOException e1) {
+ throw new ElasticSearchOperationException("Caught an exception building initial ES index");
+ }
+
+ ObjectNode esConfig = (ObjectNode) mapper.createObjectNode().set("settings", esSettingsNode);
+ ObjectNode mappings = (ObjectNode) mapper.createObjectNode().set(getType(), esMappingsNodes);
+
+ esConfig.set("mappings", mappings);
+
+ try {
+ return mapper.writeValueAsString(esConfig);
+ } catch (JsonProcessingException exc) {
+ throw new ElasticSearchOperationException("Error getting object node as string", exc);
+ }
+
+ }
+
+ /**
+ * Builds the elastic search entity count history table config.
+ *
+ * @return the string
+ * @throws ElasticSearchOperationException the elastic search operation exception
+ */
+ public String buildElasticSearchEntityCountHistoryTableConfig()
+ throws ElasticSearchOperationException {
+
+ JsonNode esSettingsNode;
+ JsonNode esMappingsNodes;
+ ObjectMapper mapper = new ObjectMapper();
+
+ try {
+ esSettingsNode = mapper.readTree(getElasticSearchSettings());
+ esMappingsNodes = mapper.readTree(getElasticSearchEntityCountHistoryMappings());
+ } catch (IOException e1) {
+ throw new ElasticSearchOperationException("Caught an exception building initial ES index");
+ }
+
+ ObjectNode esConfig = (ObjectNode) mapper.createObjectNode().set("settings", esSettingsNode);
+ ObjectNode mappings = (ObjectNode) mapper.createObjectNode().set(getType(), esMappingsNodes);
+
+ esConfig.set("mappings", mappings);
+
+ try {
+ return mapper.writeValueAsString(esConfig);
+ } catch (JsonProcessingException exc) {
+ throw new ElasticSearchOperationException("Error getting object node as string", exc);
+ }
+
+ }
+
+ public String buildAggregationTableConfig() throws ElasticSearchOperationException {
+
+ JsonNode esMappingsNodes;
+ ObjectMapper mapper = new ObjectMapper();
+
+ try {
+ esMappingsNodes = mapper.readTree(this.getDynamicMappings());
+ } catch (IOException e1) {
+ throw new ElasticSearchOperationException(
+ "Caught an exception building Aggreagation ES index");
+ }
+
+ ObjectNode mappings = (ObjectNode) mapper.createObjectNode().set(getType(), esMappingsNodes);
+
+ ObjectNode indexConfig = (ObjectNode) mapper.createObjectNode().set("mappings", mappings);
+
+ try {
+ return mapper.writeValueAsString(indexConfig);
+ } catch (JsonProcessingException exc) {
+ throw new ElasticSearchOperationException("Error getting object node as string", exc);
+ }
+
+ }
+
+ public String buildAutosuggestionTableConfig() throws ElasticSearchOperationException {
+
+ JsonNode esSettingsNode;
+ JsonNode esMappingsNodes;
+ ObjectMapper mapper = new ObjectMapper();
+
+ try {
+ esSettingsNode = mapper.readTree(this.getAutosuggestIndexSettings());
+ esMappingsNodes = mapper.readTree(this.getAutosuggestIndexMappings());
+ } catch (IOException e1) {
+ throw new ElasticSearchOperationException(
+ "Caught an exception building Autosuggestion ES index");
+ }
+
+ ObjectNode indexConfig = (ObjectNode) mapper.createObjectNode().set("settings", esSettingsNode);
+ ObjectNode mappings = (ObjectNode) mapper.createObjectNode().set(getType(), esMappingsNodes);
+
+ indexConfig.set("mappings", mappings);
+
+ try {
+ return mapper.writeValueAsString(indexConfig);
+ } catch (JsonProcessingException exc) {
+ throw new ElasticSearchOperationException("Error getting object node as string", exc);
+ }
+
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see java.lang.Object#toString()
+ */
+ @Override
+ public String toString() {
+ return "ElasticSearchConfig [ipAddress=" + ipAddress + ", httpPort=" + httpPort
+ + ", javaApiPort=" + javaApiPort + ", indexName=" + indexName + ", type=" + type
+ + ", clusterName=" + clusterName + ", mappingsFileName=" + mappingsFileName
+ + ", settingsFileName=" + settingsFileName + ", syncAdapterMaxConcurrentWorkers="
+ + syncAdapterMaxConcurrentWorkers + ", auditIndexName=" + auditIndexName
+ + ", topographicalSearchIndex=" + topographicalSearchIndex + ", entityCountHistoryIndex="
+ + entityCountHistoryIndex + ", autosuggestIndexname=" + autosuggestIndexname
+ + ", entityCountHistoryMappingsFileName=" + entityCountHistoryMappingsFileName
+ + ", autoSuggestSettingsFileName=" + autoSuggestSettingsFileName
+ + ", autoSuggestMappingsFileName=" + autoSuggestMappingsFileName
+ + ", dynamicMappingsFileName=" + dynamicMappingsFileName + ", processorConfig="
+ + processorConfig + "]";
+ }
+}