aboutsummaryrefslogtreecommitdiffstats
path: root/aai-traversal/src
diff options
context:
space:
mode:
authorLamont, William (wl2432) <wl2432@att.com>2018-01-15 13:15:33 -0500
committerLamont, William (wl2432) <wl2432@att.com>2018-01-15 13:16:09 -0500
commit55e085c6b8fbac94207e0f69ac2b17c561dbc203 (patch)
treed1a677faf36f7241cc8a35d9249e712d33559092 /aai-traversal/src
parent78c96d11932a849a1702ab134391918a723f01ef (diff)
Add ability to do optional params for custom query
Change-Id: I1e61bbee2def41db5e7064ad3a3e916b7afcc299 Issue-ID: AAI-652 Signed-off-by: Lamont, William (wl2432) <wl2432@att.com>
Diffstat (limited to 'aai-traversal/src')
-rw-r--r--aai-traversal/src/main/java/org/onap/aai/rest/QueryConsumer.java91
-rw-r--r--aai-traversal/src/main/java/org/onap/aai/rest/search/CustomQueryConfig.java34
-rw-r--r--aai-traversal/src/main/java/org/onap/aai/rest/search/GenericQueryProcessor.java31
-rw-r--r--aai-traversal/src/main/java/org/onap/aai/rest/search/GetCustomQueryConfig.java159
-rw-r--r--aai-traversal/src/main/java/org/onap/aai/rest/search/GremlinServerSingleton.java67
-rw-r--r--aai-traversal/src/main/java/org/onap/aai/rest/util/ConvertQueryPropertiesToJson.java112
-rw-r--r--aai-traversal/src/test/java/org/onap/aai/HttpTestUtil.java369
-rw-r--r--aai-traversal/src/test/java/org/onap/aai/PayloadUtil.java113
-rw-r--r--aai-traversal/src/test/java/org/onap/aai/dbgraphmap/SearchGraphNamedQueryTest.java406
-rw-r--r--aai-traversal/src/test/java/org/onap/aai/rest/search/GetCustomQueryConfigTest.java62
-rw-r--r--aai-traversal/src/test/java/org/onap/aai/rest/search/QueryTest.java2
-rw-r--r--aai-traversal/src/test/java/org/onap/aai/rest/util/ConvertQueryPropertiesToJsonTest.java31
-rw-r--r--aai-traversal/src/test/resources/payloads/named-queries/cloud-region.ComponentList-1.2.json4
-rw-r--r--aai-traversal/src/test/resources/payloads/named-queries/cloud-region.closed-loop-named-query-1.0.json4
-rw-r--r--aai-traversal/src/test/resources/payloads/named-queries/cloud-region2.closed-loop-named-query-1.0.json4
-rw-r--r--aai-traversal/src/test/resources/payloads/named-queries/customer.ComponentList-1.2.json18
-rw-r--r--aai-traversal/src/test/resources/payloads/named-queries/customer.SvcSubscriberModelInfo-1.0.json13
-rw-r--r--aai-traversal/src/test/resources/payloads/named-queries/customer.closed-loop-named-query-1.0.json32
-rw-r--r--aai-traversal/src/test/resources/payloads/named-queries/generic-vnf.ComponentList-1.2.json27
-rw-r--r--aai-traversal/src/test/resources/payloads/named-queries/generic-vnf.closed-loop-named-query-1.0.json131
-rw-r--r--aai-traversal/src/test/resources/payloads/named-queries/logical-link.DHVLogicalLinkByCircuitId-1.0.json5
-rw-r--r--aai-traversal/src/test/resources/payloads/named-queries/model.ComponentList-1.2.json22
-rw-r--r--aai-traversal/src/test/resources/payloads/named-queries/model.SvcSubscriberModelInfo-1.0.json10
-rw-r--r--aai-traversal/src/test/resources/payloads/named-queries/model.closed-loop-named-query-1.0.json22
-rw-r--r--aai-traversal/src/test/resources/payloads/named-queries/query-payload.ComponentList-1.2.json23
-rw-r--r--aai-traversal/src/test/resources/payloads/named-queries/query-payload.DHVLogicalLinkByCircuitId-1.0.json16
-rw-r--r--aai-traversal/src/test/resources/payloads/named-queries/query-payload.SvcSubscriberModelInfo-1.0.json20
-rw-r--r--aai-traversal/src/test/resources/payloads/named-queries/query-payload.closed-loop-named-query-1.0.json29
-rw-r--r--aai-traversal/src/test/resources/payloads/named-queries/tenant.ComponentList-1.2.json5
-rw-r--r--aai-traversal/src/test/resources/payloads/named-queries/tenant.closed-loop-named-query-1.0.json5
-rw-r--r--aai-traversal/src/test/resources/payloads/named-queries/tenant2.closed-loop-named-query-1.0.json5
-rw-r--r--aai-traversal/src/test/resources/payloads/named-queries/vf-module.ComponentList-1.2.json6
-rw-r--r--aai-traversal/src/test/resources/payloads/named-queries/vserver.ComponentList-1.2.json22
-rw-r--r--aai-traversal/src/test/resources/payloads/named-queries/vserver.closed-loop-named-query-1.0.json7
-rw-r--r--aai-traversal/src/test/resources/payloads/named-queries/vserver2.closed-loop-named-query-1.0.json7
35 files changed, 1874 insertions, 40 deletions
diff --git a/aai-traversal/src/main/java/org/onap/aai/rest/QueryConsumer.java b/aai-traversal/src/main/java/org/onap/aai/rest/QueryConsumer.java
index b5f2658..3218396 100644
--- a/aai-traversal/src/main/java/org/onap/aai/rest/QueryConsumer.java
+++ b/aai-traversal/src/main/java/org/onap/aai/rest/QueryConsumer.java
@@ -23,6 +23,7 @@ package org.onap.aai.rest;
import java.net.URI;
import java.util.ArrayList;
+import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
@@ -49,9 +50,12 @@ import org.onap.aai.dbmap.DBConnectionType;
import org.onap.aai.exceptions.AAIException;
import org.onap.aai.introspection.ModelType;
import org.onap.aai.introspection.Version;
+import org.onap.aai.logging.ErrorLogHelper;
import org.onap.aai.parsers.query.QueryParser;
import org.onap.aai.rest.db.HttpEntry;
+import org.onap.aai.rest.search.CustomQueryConfig;
import org.onap.aai.rest.search.GenericQueryProcessor;
+import org.onap.aai.rest.search.GremlinServerSingleton;
import org.onap.aai.rest.search.QueryProcessorType;
import org.onap.aai.restcore.HttpMethod;
import org.onap.aai.restcore.RESTAPI;
@@ -121,7 +125,6 @@ public class QueryConsumer extends RESTAPI {
startURIs.add(new URI(startElement.getAsString()));
}
}
-
if (queryElement != null) {
queryURI = queryElement.getAsString();
}
@@ -129,6 +132,18 @@ public class QueryConsumer extends RESTAPI {
gremlin = gremlinElement.getAsString();
}
URI queryURIObj = new URI(queryURI);
+
+ CustomQueryConfig customQueryConfig = getCustomQueryConfig(queryURIObj);
+ if ( customQueryConfig != null ) {
+ List<String> missingRequiredQueryParameters = checkForMissingQueryParameters( customQueryConfig.getQueryRequiredProperties(), URITools.getQueryMap(queryURIObj));
+ if ( !missingRequiredQueryParameters.isEmpty() ) {
+ return( createMessageMissingQueryRequiredParameters( missingRequiredQueryParameters, headers, info, req));
+ }
+ } else if ( queryElement != null ) {
+ return( createMessageInvalidQuerySection( queryURI, headers, info, req));
+ }
+
+
GenericQueryProcessor processor = null;
if (!startURIs.isEmpty()) {
@@ -193,5 +208,79 @@ public class QueryConsumer extends RESTAPI {
}
+
+ private List<String> checkForMissingQueryParameters( List<String> requiredParameters, MultivaluedMap<String, String> queryParams ) {
+ List<String> result = new ArrayList<>();
+ Iterator it = requiredParameters.iterator();
+ String param;
+ while(it.hasNext()) {
+ param = (String)it.next();
+ if ( !queryParams.containsKey(param)) {
+ result.add(param);
+ }
+ }
+ return result;
+ }
+
+ private CustomQueryConfig getCustomQueryConfig(URI uriObj ) {
+
+ GremlinServerSingleton gremlinServerSingleton;
+ CustomQueryConfig customQueryConfig;
+ String path = uriObj.getPath();
+
+ String[] parts = path.split("/");
+ boolean hasQuery = false;
+ for ( String part:parts ) {
+ if ( hasQuery) {
+ gremlinServerSingleton = GremlinServerSingleton.getInstance();
+ return gremlinServerSingleton.getCustomQueryConfig(part);
+ }
+ if ( "query".equals(part)) {
+ hasQuery = true;
+ }
+ }
+
+ return null;
+
+ }
+
+ private Response createMessageMissingQueryRequiredParameters(List<String> missingRequiredQueryParams, HttpHeaders headers, UriInfo info, HttpServletRequest req) {
+ AAIException e = new AAIException("AAI_3013");
+
+ ArrayList<String> templateVars = new ArrayList<>();
+
+ if (templateVars.isEmpty()) {
+ templateVars.add(missingRequiredQueryParams.toString());
+ }
+ Status s = e.getErrorObject().getHTTPResponseCode();
+ String errorResponse = ErrorLogHelper.getRESTAPIErrorResponse(headers.getAcceptableMediaTypes(), e,
+ templateVars);
+ Response response = Response.status(s).entity(errorResponse).build();
+ /*
+ Response response = Response
+ .status(e.getErrorObject().getHTTPResponseCode())
+ .entity(ErrorLogHelper.getRESTAPIErrorResponse(headers.getAcceptableMediaTypes(), e,
+ templateVars)).build();
+ */
+ return response;
+ }
+
+ private Response createMessageInvalidQuerySection(String invalidQuery, HttpHeaders headers, UriInfo info, HttpServletRequest req) {
+ AAIException e = new AAIException("AAI_3014");
+
+ ArrayList<String> templateVars = new ArrayList<>();
+
+ if (templateVars.isEmpty()) {
+ templateVars.add(invalidQuery);
+ }
+
+ Response response = Response
+ .status(e.getErrorObject().getHTTPResponseCode())
+ .entity(ErrorLogHelper.getRESTAPIErrorResponse(headers.getAcceptableMediaTypes(), e,
+ templateVars)).build();
+
+ return response;
+ }
+
}
diff --git a/aai-traversal/src/main/java/org/onap/aai/rest/search/CustomQueryConfig.java b/aai-traversal/src/main/java/org/onap/aai/rest/search/CustomQueryConfig.java
new file mode 100644
index 0000000..ada67c7
--- /dev/null
+++ b/aai-traversal/src/main/java/org/onap/aai/rest/search/CustomQueryConfig.java
@@ -0,0 +1,34 @@
+package org.onap.aai.rest.search;
+
+import java.util.List;
+
+public class CustomQueryConfig {
+ public CustomQueryConfig() {
+ // used by GetCustomQueryConfig
+ }
+
+
+ private String query;
+ private List<String> queryOptionalProperties;
+ private List<String> queryRequiredProperties;
+
+ public void setQuery(String query) {
+ this.query = query;
+ }
+ public String getQuery() {
+ return this.query;
+ }
+
+ public void setQueryOptionalProperties( List<String> queryOptionalProperties) {
+ this.queryOptionalProperties = queryOptionalProperties;
+ }
+ public List<String> getQueryOptionalProperties( ) {
+ return queryOptionalProperties;
+ }
+ public void setQueryRequiredProperties( List<String> queryRequiredProperties) {
+ this.queryRequiredProperties = queryRequiredProperties;
+ }
+ public List<String> getQueryRequiredProperties( ) {
+ return queryRequiredProperties;
+ }
+}
diff --git a/aai-traversal/src/main/java/org/onap/aai/rest/search/GenericQueryProcessor.java b/aai-traversal/src/main/java/org/onap/aai/rest/search/GenericQueryProcessor.java
index 9f6f3aa..14e218f 100644
--- a/aai-traversal/src/main/java/org/onap/aai/rest/search/GenericQueryProcessor.java
+++ b/aai-traversal/src/main/java/org/onap/aai/rest/search/GenericQueryProcessor.java
@@ -2,7 +2,7 @@
* ============LICENSE_START=======================================================
* org.onap.aai
* ================================================================================
- * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+ * 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.
@@ -25,6 +25,7 @@ import java.io.FileNotFoundException;
import java.net.URI;
import java.util.ArrayList;
import java.util.Collection;
+import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -42,6 +43,7 @@ import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__;
import org.apache.tinkerpop.gremlin.structure.Graph;
import org.apache.tinkerpop.gremlin.structure.Vertex;
import org.javatuples.Pair;
+import org.onap.aai.query.builder.MissingOptionalParameter;
import org.onap.aai.restcore.util.URITools;
import org.onap.aai.serialization.engines.TransactionalGraphEngine;
import org.onap.aai.serialization.queryformats.SubGraphStyle;
@@ -117,28 +119,41 @@ public abstract class GenericQueryProcessor {
if (!this.isGremlin) {
Matcher m = p.matcher(uri.get().getPath());
String queryName = "";
+ List<String> optionalParameters = Collections.emptyList();
if (m.find()) {
queryName = m.group(1);
+ CustomQueryConfig queryConfig = gremlinServerSingleton.getCustomQueryConfig(queryName);
+ if ( queryConfig != null ) {
+ query = queryConfig.getQuery();
+ optionalParameters = queryConfig.getQueryOptionalProperties();
+ }
}
-
+
for (String key : queryParams.keySet()) {
params.put(key, queryParams.getFirst(key));
+ if ( optionalParameters.contains(key) ){
+ optionalParameters.remove(key);
+ }
}
- query = gremlinServerSingleton.getStoredQuery(queryName);
- if (query == null) {
- query = "";
- } else {
- query = queryBuilderSingleton.executeTraversal(dbEngine, query, params);
+ if (!optionalParameters.isEmpty()){
+ MissingOptionalParameter missingParameter = MissingOptionalParameter.getInstance();
+ for ( String key : optionalParameters ) {
+ params.put(key, missingParameter);
+ }
}
-
List<Object> ids = new ArrayList<>();
if (vertices.isPresent() && !vertices.get().isEmpty()) {
for (Vertex v : vertices.get()) {
ids.add(v.id());
}
+ if (query == null) {
+ query = "";
+ } else {
+ query = queryBuilderSingleton.executeTraversal(dbEngine, query, params);
+ }
StringBuilder sb = new StringBuilder();
sb.append("[");
sb.append(Joiner.on(",").join(ids));
diff --git a/aai-traversal/src/main/java/org/onap/aai/rest/search/GetCustomQueryConfig.java b/aai-traversal/src/main/java/org/onap/aai/rest/search/GetCustomQueryConfig.java
new file mode 100644
index 0000000..9ea0b1d
--- /dev/null
+++ b/aai-traversal/src/main/java/org/onap/aai/rest/search/GetCustomQueryConfig.java
@@ -0,0 +1,159 @@
+package org.onap.aai.rest.search;
+
+/*-
+ * ============LICENSE_START=======================================================
+ * org.onap.aai
+ * ================================================================================
+ * 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=========================================================
+ */
+
+import java.io.IOException;
+import java.lang.reflect.Type;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.util.List;
+
+import org.onap.aai.util.AAIConstants;
+
+import com.google.gson.Gson;
+import com.google.gson.JsonArray;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+import com.google.gson.reflect.TypeToken;
+
+public class GetCustomQueryConfig {
+
+ private JsonArray storedQueries = null;
+ private CustomQueryConfig customQueryConfig;
+
+
+ private final static String QUERY_CONFIG = "query";
+ private final static String REQUIRED_CONFIG = "required-properties";
+ private final static String OPTIONAL_CONFIG = "optional-properties";
+ private final static String STORED_QUERIES_CONFIG = "stored-queries";
+ private final static String STORED_QUERY_CONFIG = "stored-query";
+
+ public static final String AAI_HOME_ETC_QUERY_JSON = AAIConstants.AAI_HOME_ETC + "query" + AAIConstants.AAI_FILESEP + "stored-queries.json";
+
+ public GetCustomQueryConfig(String customQueryJson ) {
+ init(customQueryJson);
+ }
+
+ private void init( String customQueryJson) {
+ JsonParser parser = new JsonParser();
+ JsonObject queriesObject = parser.parse(customQueryJson).getAsJsonObject();
+ if (queriesObject.has(STORED_QUERIES_CONFIG)) {
+
+ storedQueries = queriesObject.getAsJsonArray(STORED_QUERIES_CONFIG);
+ }
+ }
+
+ private List<String> toStringList(JsonArray array) {
+ Gson converter = new Gson();
+ Type listType = new TypeToken<List<String>>() {}.getType();
+ return converter.fromJson(array, listType);
+ }
+
+ private List<String> getPropertyList(JsonObject configObject, String config ) {
+ JsonElement subqueryConfig;
+ JsonArray props;
+
+ if ( configObject.has(config)) {
+ subqueryConfig = configObject.get(config);
+ if ( subqueryConfig != null && !subqueryConfig.isJsonNull() ) {
+ props = subqueryConfig.getAsJsonArray();
+ if ( props != null ) {
+ return toStringList(props);
+ }
+ }
+ }
+ return toStringList(null);
+ }
+
+ private String getPropertyString(JsonObject configObject, String config) {
+ JsonElement subqueryConfig;
+
+ if ( configObject.has(config)) {
+ subqueryConfig = configObject.get(config);
+ if ( subqueryConfig != null && !subqueryConfig.isJsonNull() ) {
+ return subqueryConfig.getAsString();
+ }
+ }
+ return null;
+ }
+
+ private void getStoredQueryBlock( JsonObject configObject, String config ) {
+ if ( !configObject.has(config)) {
+ return;
+ }
+
+ JsonElement queryConfig;
+ JsonObject subObject;
+ String multipleStartNodes;
+ List<String> propertyList;
+
+ queryConfig = configObject.get(config);
+ subObject = queryConfig.getAsJsonObject();
+ propertyList = getPropertyList(subObject, REQUIRED_CONFIG);
+ if ( QUERY_CONFIG.equals(config)) {
+ customQueryConfig.setQueryRequiredProperties( propertyList );
+ } else {
+ customQueryConfig.setQueryRequiredProperties( null );
+ }
+
+ propertyList = getPropertyList(subObject, OPTIONAL_CONFIG);
+ if ( QUERY_CONFIG.equals(config)) {
+ customQueryConfig.setQueryOptionalProperties( propertyList );
+ } else {
+ customQueryConfig.setQueryOptionalProperties( null );
+ }
+
+ }
+
+
+ public CustomQueryConfig getStoredQuery(String queryName ) {
+
+ customQueryConfig = null;
+ JsonObject configObject;
+ JsonElement query;
+ JsonElement queryConfig;
+ String queryString;
+
+ for (JsonElement storedQuery : storedQueries) {
+ if (storedQuery.isJsonObject()) {
+ JsonObject queryObject = storedQuery.getAsJsonObject();
+ query = queryObject.get(queryName);
+ if ( query != null ) {
+ customQueryConfig = new CustomQueryConfig();
+ configObject = query.getAsJsonObject();
+ getStoredQueryBlock(configObject, QUERY_CONFIG);
+ if ( configObject.has(STORED_QUERY_CONFIG)) {
+ queryConfig = configObject.get(STORED_QUERY_CONFIG);
+ customQueryConfig.setQuery(queryConfig.getAsString());
+ }
+ break;
+ }
+ }
+ }
+
+ return customQueryConfig;
+
+ }
+
+
+
+}
diff --git a/aai-traversal/src/main/java/org/onap/aai/rest/search/GremlinServerSingleton.java b/aai-traversal/src/main/java/org/onap/aai/rest/search/GremlinServerSingleton.java
index e4ac815..2265680 100644
--- a/aai-traversal/src/main/java/org/onap/aai/rest/search/GremlinServerSingleton.java
+++ b/aai-traversal/src/main/java/org/onap/aai/rest/search/GremlinServerSingleton.java
@@ -31,6 +31,9 @@ import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
import java.util.Date;
import java.util.Properties;
import java.util.Timer;
@@ -43,7 +46,10 @@ public class GremlinServerSingleton {
private Cluster cluster;
private boolean timerSet;
private Timer timer;
- private Properties properties;
+
+
+ private GetCustomQueryConfig queryConfig;
+
private static class Helper {
private static final GremlinServerSingleton INSTANCE = new GremlinServerSingleton();
@@ -68,8 +74,6 @@ public class GremlinServerSingleton {
*/
private void init() {
- properties = new Properties();
-
try {
cluster = Cluster.build(new File(AAIConstants.AAI_HOME_ETC_APP_PROPERTIES + "gremlin-server-config.yaml"))
.maxContentLength(6537920)
@@ -78,27 +82,29 @@ public class GremlinServerSingleton {
logger.error("Unable to find the file: " + e);
}
- File queryFile = new File(AAIConstants.AAI_HOME_ETC_QUERY);
+ try {
+ String filepath = GetCustomQueryConfig.AAI_HOME_ETC_QUERY_JSON;
+ Path path = Paths.get(filepath);
+ String customQueryConfigJson = new String(Files.readAllBytes(path));
+
- try (FileInputStream fis = new FileInputStream(queryFile)){
- properties.load(fis);
- } catch (IOException e) {
- logger.error("Error occurred during the processing of query file: " + e);
- }
+ queryConfig = new GetCustomQueryConfig(customQueryConfigJson);
+ } catch (IOException e) {
+ logger.error("Error occurred during the processing of query json file: " + e);
+ }
- TimerTask task = new FileWatcher(new File(AAIConstants.AAI_HOME_ETC_QUERY)) {
+ TimerTask task = new FileWatcher(new File(GetCustomQueryConfig.AAI_HOME_ETC_QUERY_JSON)) {
@Override
protected void onChange(File file) {
- File queryFile = new File(AAIConstants.AAI_HOME_ETC_QUERY);
- try (FileInputStream fis = new FileInputStream(queryFile)){
- properties.load(fis);
- logger.debug("File: " + file + " was changed so the cluster is rebuild for gremlin server");
- } catch (FileNotFoundException e) {
- logger.error("Unable to find the file: " + e);
- } catch (IOException e) {
- logger.error("Error occurred during the processing of query file: " + e);
- }
+ try {
+ String filepath = GetCustomQueryConfig.AAI_HOME_ETC_QUERY_JSON;
+ Path path = Paths.get(filepath);
+ String customQueryConfigJson = new String(Files.readAllBytes(path));
+ queryConfig = new GetCustomQueryConfig(customQueryConfigJson);
+ } catch (IOException e) {
+ logger.error("Error occurred during the processing of query json file: " + e);
+ }
}
};
@@ -113,19 +119,20 @@ public class GremlinServerSingleton {
public Cluster getCluster(){
return cluster;
}
-
+
/**
- * Gets the key if the properties contains that key
- *
- * Purposely not checking if the property exists due
- * to if you check for the property and then get the property
- * Then you are going to have to synchronize the method
- *
- * @param key the query to check if it exists in the file
- * @return string if the key exists or null if it doesn't
+ * Gets the query using CustomQueryConfig
+ * @param key
+ * @return
*/
- public String getStoredQuery(String key){
- return (String) properties.get(key);
+ public String getStoredQueryFromConfig(String key){
+ CustomQueryConfig customQueryConfig = queryConfig.getStoredQuery(key);
+ return customQueryConfig.getQuery();
}
+
+ public CustomQueryConfig getCustomQueryConfig(String key) {
+ return queryConfig.getStoredQuery(key);
+ }
+
}
diff --git a/aai-traversal/src/main/java/org/onap/aai/rest/util/ConvertQueryPropertiesToJson.java b/aai-traversal/src/main/java/org/onap/aai/rest/util/ConvertQueryPropertiesToJson.java
new file mode 100644
index 0000000..780a5de
--- /dev/null
+++ b/aai-traversal/src/main/java/org/onap/aai/rest/util/ConvertQueryPropertiesToJson.java
@@ -0,0 +1,112 @@
+package org.onap.aai.rest.util;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Enumeration;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Properties;
+
+
+import org.onap.aai.util.AAIConstants;
+
+public class ConvertQueryPropertiesToJson {
+
+ private final static int maxfilesize = 256000;
+
+ private void addStart( StringBuilder sb ) {
+ sb.append("{\n \"stored-queries\":[{\n");
+ }
+
+ private void addRequiredQueryProperties( StringBuilder sb, List<String> rqd ) {
+ Iterator it = rqd.iterator();
+ sb.append(" \"query\":{\n \"required-properties\":[");
+ while( it.hasNext()) {
+ sb.append("\"" + it.next() + "\"");
+ if ( it.hasNext()) {
+ sb.append(",");
+ }
+ }
+ sb.append("]\n },\n");
+ }
+
+ private void addAnotherQuery( StringBuilder sb, String queryName, String query, List<String> rqd ) {
+ sb.append(" \"" + queryName + "\":{\n");
+ if ( !rqd.isEmpty()) {
+ addRequiredQueryProperties( sb, rqd);
+ }
+ sb.append(" \"stored-query\":\"" + query + "\"\n }\n },{\n");
+ }
+
+ private void addLastQuery( StringBuilder sb, String queryName, String query, List<String> rqd ) {
+ sb.append(" \"" + queryName + "\":{\n");
+ if ( !rqd.isEmpty() ) {
+ addRequiredQueryProperties( sb, rqd);
+ }
+ sb.append(" \"stored-query\":\"" + query + "\"\n }\n }]\n}\n");
+ }
+
+ private String get2ndParameter( String paramString) {
+ String endParams = paramString.substring(0, paramString.indexOf(')'));
+ String result = endParams.substring(endParams.indexOf(',') + 1 );
+ String lastParam = result.trim();
+ if ( lastParam.startsWith("\\") || lastParam.startsWith("'") || lastParam.startsWith("new ") ){
+ return null;
+ }
+
+ return lastParam;
+ }
+
+ private List<String> findRqdProperties( String query) {
+ String[] parts = query.split("getVerticesByProperty");
+ List<String> result = new ArrayList<String>();
+ if ( parts.length == 1 )
+ return result;
+ int count = 0;
+ String foundRqdProperty;
+ while ( count++ < parts.length - 1 ) {
+ foundRqdProperty = get2ndParameter(parts[count]);
+ if ( foundRqdProperty != null && !result.contains(foundRqdProperty)) {
+ result.add(foundRqdProperty);
+ }
+ }
+ return result;
+ }
+
+ public String convertProperties( Properties props ) {
+ Enumeration<?> e = props.propertyNames();
+ StringBuilder sb = new StringBuilder(maxfilesize);
+ String queryName;
+ String query;
+ addStart( sb );
+ List<String> rqd;
+ while ( e.hasMoreElements()) {
+ queryName = (String)e.nextElement();
+ query = props.getProperty(queryName).trim().replace("\"", "\\\"");
+ rqd = findRqdProperties( query);
+ if ( e.hasMoreElements()) {
+ addAnotherQuery( sb, queryName, query, rqd);
+ } else {
+ addLastQuery( sb, queryName, query, rqd);
+ }
+ }
+
+ return sb.toString();
+ }
+ public static void main(String[] args) {
+ File queryFile = new File(AAIConstants.AAI_HOME_ETC_QUERY);
+ Properties properties = new Properties();
+ try (FileInputStream fis = new FileInputStream(queryFile)){
+ properties.load(fis);
+ } catch (IOException e) {
+ e.printStackTrace();
+ System.out.println("Error occurred during the processing of query file: " + e);
+ }
+ ConvertQueryPropertiesToJson c = new ConvertQueryPropertiesToJson();
+ String json = c.convertProperties(properties);
+ System.out.println("returned json:\n" + json);
+ }
+
+}
diff --git a/aai-traversal/src/test/java/org/onap/aai/HttpTestUtil.java b/aai-traversal/src/test/java/org/onap/aai/HttpTestUtil.java
new file mode 100644
index 0000000..1ec1a05
--- /dev/null
+++ b/aai-traversal/src/test/java/org/onap/aai/HttpTestUtil.java
@@ -0,0 +1,369 @@
+/**
+ * ============LICENSE_START=======================================================
+ * org.onap.aai
+ * ================================================================================
+ * Copyright © 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=========================================================
+ *
+ * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ */
+package org.onap.aai;
+
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+import org.javatuples.Pair;
+import org.mockito.Mockito;
+import org.onap.aai.dbmap.DBConnectionType;
+import org.onap.aai.exceptions.AAIException;
+import org.onap.aai.introspection.Introspector;
+import org.onap.aai.introspection.Loader;
+import org.onap.aai.introspection.ModelType;
+import org.onap.aai.introspection.Version;
+import org.onap.aai.parsers.query.QueryParser;
+import org.onap.aai.parsers.uri.URIToObject;
+import org.onap.aai.rest.db.DBRequest;
+import org.onap.aai.rest.db.HttpEntry;
+import org.onap.aai.restcore.HttpMethod;
+import org.onap.aai.restcore.RESTAPI;
+import org.onap.aai.serialization.engines.QueryStyle;
+import org.onap.aai.serialization.engines.TransactionalGraphEngine;
+
+import javax.ws.rs.core.*;
+import java.io.UnsupportedEncodingException;
+import java.net.URI;
+import java.util.*;
+
+import static org.mockito.Matchers.anyObject;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.when;
+
+public class HttpTestUtil extends RESTAPI {
+
+ private static final EELFLogger logger = EELFManager.getInstance().getLogger(HttpTestUtil.class);
+
+ protected static final MediaType APPLICATION_JSON = MediaType.valueOf("application/json");
+
+ private static final String EMPTY = "";
+
+ protected HttpHeaders httpHeaders;
+ protected UriInfo uriInfo;
+
+ protected MultivaluedMap<String, String> headersMultiMap;
+ protected MultivaluedMap<String, String> queryParameters;
+
+ protected List<String> aaiRequestContextList;
+ protected List<MediaType> outputMediaTypes;
+
+ public void init(){
+
+ httpHeaders = Mockito.mock(HttpHeaders.class);
+ uriInfo = Mockito.mock(UriInfo.class);
+
+ headersMultiMap = new MultivaluedHashMap<>();
+ queryParameters = Mockito.spy(new MultivaluedHashMap<>());
+
+ headersMultiMap.add("X-FromAppId", "JUNIT");
+ headersMultiMap.add("X-TransactionId", UUID.randomUUID().toString());
+ headersMultiMap.add("Real-Time", "true");
+ headersMultiMap.add("Accept", "application/json");
+ headersMultiMap.add("aai-request-context", "");
+
+ outputMediaTypes = new ArrayList<>();
+ outputMediaTypes.add(APPLICATION_JSON);
+
+ aaiRequestContextList = new ArrayList<>();
+ aaiRequestContextList.add("");
+
+ when(httpHeaders.getRequestHeaders()).thenReturn(headersMultiMap);
+ when(httpHeaders.getAcceptableMediaTypes()).thenReturn(outputMediaTypes);
+
+ when(httpHeaders.getRequestHeader("aai-request-context")).thenReturn(aaiRequestContextList);
+
+ when(uriInfo.getQueryParameters()).thenReturn(queryParameters);
+ when(uriInfo.getQueryParameters(false)).thenReturn(queryParameters);
+
+ doReturn(null).when(queryParameters).remove(anyObject());
+ when(httpHeaders.getMediaType()).thenReturn(APPLICATION_JSON);
+ }
+
+ public Response doPut(String uri, String payload) throws UnsupportedEncodingException, AAIException {
+
+ this.init();
+ Response response = null;
+ boolean success = true;
+ TransactionalGraphEngine dbEngine = null;
+
+ try {
+
+ uri = uri.replaceAll("/aai/", "");
+ logger.info("Starting the put request for the uri {} with payload {}", uri, payload);
+
+ String [] arr = uri.split("/");
+
+ Version version = null;
+
+ if(arr != null && arr.length > 1){
+ if(arr[0].matches("^v\\d+")){
+ version = Version.valueOf(arr[0]);
+ uri = uri.replaceAll("^v\\d+", "");
+ }
+ }
+
+ if(version == null){
+ version = Version.getLatest();
+ }
+ Mockito.when(uriInfo.getPath()).thenReturn(uri);
+
+ DBConnectionType type = DBConnectionType.REALTIME;
+ HttpEntry httpEntry = new HttpEntry(version, ModelType.MOXY, QueryStyle.TRAVERSAL, type);
+ Loader loader = httpEntry.getLoader();
+ dbEngine = httpEntry.getDbEngine();
+
+ URI uriObject = UriBuilder.fromPath(uri).build();
+ URIToObject uriToObject = new URIToObject(loader, uriObject);
+
+ String objType = uriToObject.getEntityName();
+ QueryParser uriQuery = dbEngine.getQueryBuilder().createQueryFromURI(uriObject);
+
+
+ logger.info("Unmarshalling the payload to this {}", objType);
+
+ Introspector obj;
+ HttpMethod httpMethod;
+ if(uri.contains("/relationship-list/relationship")){
+ obj = loader.unmarshal("relationship", payload, org.onap.aai.restcore.MediaType.getEnum("application/json"));
+ httpMethod = HttpMethod.PUT_EDGE;
+ } else {
+ obj = loader.unmarshal(objType, payload, org.onap.aai.restcore.MediaType.getEnum("application/json"));
+ httpMethod = HttpMethod.PUT;
+ this.validateIntrospector(obj, loader, uriObject, httpMethod);
+ }
+
+
+ DBRequest dbRequest =
+ new DBRequest.Builder(httpMethod, uriObject, uriQuery, obj, httpHeaders, uriInfo, "JUNIT-TRANSACTION")
+ .rawRequestContent(payload).build();
+
+ List<DBRequest> dbRequestList = new ArrayList<>();
+ dbRequestList.add(dbRequest);
+
+ Pair<Boolean, List<Pair<URI, Response>>> responsesTuple = httpEntry.process(dbRequestList, "JUNIT");
+ response = responsesTuple.getValue1().get(0).getValue1();
+
+ } catch (AAIException e) {
+ response = this.consumerExceptionResponseGenerator(httpHeaders, uriInfo, HttpMethod.PUT, e);
+ success = false;
+ } catch(Exception e){
+ AAIException ex = new AAIException("AAI_4000", e);
+ response = this.consumerExceptionResponseGenerator(httpHeaders, uriInfo, HttpMethod.PUT, ex);
+ success = false;
+ } finally {
+ if(success){
+ if(response != null){
+ if((response.getStatus() / 100) == 2){
+ logger.info("Successfully completed the PUT request with status {} and committing it to DB", response.getStatus());
+ } else {
+ logFailure(HttpMethod.PUT, response);
+ }
+ }
+ dbEngine.commit();
+ } else {
+ if(response != null) {
+ logFailure(HttpMethod.PUT, response);
+ }
+ dbEngine.rollback();
+ }
+ }
+
+ return response;
+ }
+
+ public Response doGet(String uri) throws UnsupportedEncodingException, AAIException {
+
+ this.init();
+ Response response = null;
+ boolean success = true;
+ TransactionalGraphEngine dbEngine = null;
+
+ try {
+
+ uri = uri.replaceAll("/aai/", "");
+ logger.info("Starting the GET request for the uri {} with depth {}", uri, "all");
+
+ String [] arr = uri.split("/");
+
+ Version version = null;
+
+ if(arr != null && arr.length > 1){
+ if(arr[0].matches("^v\\d+")){
+ version = Version.valueOf(arr[0]);
+ uri = uri.replaceAll("^v\\d+", "");
+ }
+ }
+
+ if(version == null){
+ version = Version.getLatest();
+ }
+
+ DBConnectionType type = DBConnectionType.REALTIME;
+ HttpEntry httpEntry = new HttpEntry(version, ModelType.MOXY, QueryStyle.TRAVERSAL, type);
+ Loader loader = httpEntry.getLoader();
+ dbEngine = httpEntry.getDbEngine();
+
+ URI uriObject = UriBuilder.fromPath(uri).build();
+ URIToObject uriToObject = new URIToObject(loader, uriObject);
+
+ String objType = uriToObject.getEntityName();
+ queryParameters.add("depth", "all");
+ QueryParser uriQuery = dbEngine.getQueryBuilder().createQueryFromURI(uriObject, queryParameters);
+
+ Mockito.when(uriInfo.getPath()).thenReturn(uri);
+
+ logger.info("Unmarshalling the payload to this {}", objType);
+
+ Introspector obj = loader.introspectorFromName(objType);
+
+ DBRequest dbRequest =
+ new DBRequest.Builder(HttpMethod.GET, uriObject, uriQuery, obj, httpHeaders, uriInfo, "JUNIT-TRANSACTION")
+ .build();
+
+ List<DBRequest> dbRequestList = new ArrayList<>();
+ dbRequestList.add(dbRequest);
+
+ Pair<Boolean, List<Pair<URI, Response>>> responsesTuple = httpEntry.process(dbRequestList, "JUNIT");
+ response = responsesTuple.getValue1().get(0).getValue1();
+
+ } catch (AAIException e) {
+ response = this.consumerExceptionResponseGenerator(httpHeaders, uriInfo, HttpMethod.PUT, e);
+ success = false;
+ } catch(Exception e){
+ AAIException ex = new AAIException("AAI_4000", e);
+ response = this.consumerExceptionResponseGenerator(httpHeaders, uriInfo, HttpMethod.PUT, ex);
+ success = false;
+ } finally {
+ if(success){
+ if(response != null){
+ if((response.getStatus() / 100) == 2){
+ logger.info("Successfully completed the GET request with status {} and committing it to DB", response.getStatus());
+ } else {
+ logFailure(HttpMethod.GET, response);
+ }
+ }
+ dbEngine.commit();
+ } else {
+ logFailure(HttpMethod.GET, response);
+ dbEngine.rollback();
+ }
+ }
+
+ return response;
+ }
+
+ public Response doDelete(String uri, String resourceVersion) throws UnsupportedEncodingException, AAIException {
+
+ this.init();
+ Response response = null;
+ boolean success = true;
+ TransactionalGraphEngine dbEngine = null;
+
+ try {
+
+ uri = uri.replaceAll("/aai/", "");
+ logger.info("Starting the delete request for the uri {} with resource version {}", uri, resourceVersion);
+
+ String [] arr = uri.split("/");
+
+ Version version = null;
+
+ if(arr != null && arr.length > 1){
+ if(arr[0].matches("^v\\d+")){
+ version = Version.valueOf(arr[0]);
+ if(!uri.contains("relationship-list/relationship")){
+ uri = uri.replaceAll("^v\\d+", "");
+ }
+ }
+ }
+
+ if(version == null){
+ version = Version.getLatest();
+ }
+
+ Mockito.when(uriInfo.getPath()).thenReturn(uri);
+ DBConnectionType type = DBConnectionType.REALTIME;
+ HttpEntry httpEntry = new HttpEntry(version, ModelType.MOXY, QueryStyle.TRAVERSAL, type);
+ Loader loader = httpEntry.getLoader();
+ dbEngine = httpEntry.getDbEngine();
+
+ URI uriObject = UriBuilder.fromPath(uri).build();
+ URIToObject uriToObject = new URIToObject(loader, uriObject);
+
+ String objType = uriToObject.getEntityName();
+ queryParameters.add("resource-version", resourceVersion);
+ QueryParser uriQuery = dbEngine.getQueryBuilder().createQueryFromURI(uriObject, queryParameters);
+
+ logger.info("Unmarshalling the payload to this {}", objType);
+
+ Introspector obj;
+ HttpMethod httpMethod;
+ if(uri.contains("/relationship-list/relationship")){
+ obj = loader.introspectorFromName("relationship");
+ httpMethod = HttpMethod.DELETE_EDGE;
+ } else {
+ obj = loader.introspectorFromName(objType);
+ httpMethod = HttpMethod.DELETE;
+ }
+
+ DBRequest dbRequest =
+ new DBRequest.Builder(httpMethod, uriObject, uriQuery, obj, httpHeaders, uriInfo, "JUNIT-TRANSACTION")
+ .build();
+
+ List<DBRequest> dbRequestList = new ArrayList<>();
+ dbRequestList.add(dbRequest);
+
+ Pair<Boolean, List<Pair<URI, Response>>> responsesTuple = httpEntry.process(dbRequestList, "JUNIT");
+ response = responsesTuple.getValue1().get(0).getValue1();
+
+ } catch (AAIException e) {
+ response = this.consumerExceptionResponseGenerator(httpHeaders, uriInfo, HttpMethod.PUT, e);
+ success = false;
+ } catch(Exception e){
+ AAIException ex = new AAIException("AAI_4000", e);
+ response = this.consumerExceptionResponseGenerator(httpHeaders, uriInfo, HttpMethod.PUT, ex);
+ success = false;
+ } finally {
+ if(success){
+ if(response != null){
+ if((response.getStatus() / 100) == 2){
+ logger.info("Successfully completed the DELETE request with status {} and committing it to DB", response.getStatus());
+ } else {
+ logFailure(HttpMethod.DELETE, response);
+ }
+ }
+ dbEngine.commit();
+ } else {
+ logFailure(HttpMethod.DELETE, response);
+ dbEngine.rollback();
+ }
+ }
+
+ return response;
+ }
+
+ public static void logFailure(HttpMethod httpMethod, Response response){
+ logger.info("Unable to complete the {} request with status {} and rolling back", httpMethod.toString(), response.getStatus());
+ logger.info("Response body of failed request {}", response.getEntity());
+
+ }
+}
diff --git a/aai-traversal/src/test/java/org/onap/aai/PayloadUtil.java b/aai-traversal/src/test/java/org/onap/aai/PayloadUtil.java
new file mode 100644
index 0000000..8925ecd
--- /dev/null
+++ b/aai-traversal/src/test/java/org/onap/aai/PayloadUtil.java
@@ -0,0 +1,113 @@
+/**
+ * ============LICENSE_START=======================================================
+ * org.onap.aai
+ * ================================================================================
+ * Copyright © 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=========================================================
+ *
+ * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ */
+package org.onap.aai;
+
+import org.apache.commons.io.IOUtils;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import static org.junit.Assert.assertNotNull;
+
+public class PayloadUtil {
+
+ private static final Map<String, String> cache = new HashMap<>();
+ private static final Pattern TEMPLATE_PATTERN = Pattern.compile("\\$\\{[^}]+\\}");
+
+ public static String getExpectedPayload(String fileName) throws IOException {
+
+ InputStream inputStream = PayloadUtil.class.getClassLoader().getResourceAsStream("payloads/expected/" + fileName);
+
+ String message = String.format("Unable to find the %s in src/test/resources", fileName);
+ assertNotNull(message, inputStream);
+
+ String resource = IOUtils.toString(inputStream);
+
+ inputStream.close();
+ return resource;
+ }
+
+ public static String getResourcePayload(String fileName) throws IOException {
+
+ InputStream inputStream = PayloadUtil.class.getClassLoader().getResourceAsStream("payloads/resource/" + fileName);
+
+ String message = String.format("Unable to find the %s in src/test/resources", fileName);
+ assertNotNull(message, inputStream);
+
+ String resource = IOUtils.toString(inputStream);
+
+ inputStream.close();
+ return resource;
+ }
+
+ public static String getTemplatePayload(String fileName, Map<String, String> templateValueMap) throws Exception {
+
+ InputStream inputStream = PayloadUtil.class.getClassLoader().getResourceAsStream("payloads/templates/" + fileName);
+
+ String message = String.format("Unable to find the %s in src/test/resources", fileName);
+ assertNotNull(message, inputStream);
+
+ String resource;
+
+ if(cache.containsKey(fileName)){
+ resource = cache.get(fileName);
+ } else {
+ resource = IOUtils.toString(inputStream);
+ cache.put(fileName, resource);
+ }
+
+ Matcher matcher = TEMPLATE_PATTERN.matcher(resource);
+
+ String resourceWithTemplateValues = resource;
+
+ while(matcher.find()){
+ int start = matcher.start() + 2;
+ int end = matcher.end() - 1;
+ String key = resource.substring(start, end);
+ if(templateValueMap.containsKey(key)){
+ resourceWithTemplateValues = resourceWithTemplateValues.replaceAll("\\$\\{" + key +"\\}", templateValueMap.get(key));
+ } else {
+ throw new RuntimeException("Unable to find the key value pair in map for the template processing for key " + key);
+ }
+ }
+
+ inputStream.close();
+ return resourceWithTemplateValues;
+ }
+
+ public static String getNamedQueryPayload(String fileName) throws IOException {
+
+ InputStream inputStream = PayloadUtil.class.getClassLoader().getResourceAsStream("payloads/named-queries/" + fileName);
+
+ String message = String.format("Unable to find the %s in src/test/resources/payloads/named-queries", fileName);
+ assertNotNull(message, inputStream);
+
+ String resource = IOUtils.toString(inputStream);
+
+ inputStream.close();
+ return resource;
+ }
+}
diff --git a/aai-traversal/src/test/java/org/onap/aai/dbgraphmap/SearchGraphNamedQueryTest.java b/aai-traversal/src/test/java/org/onap/aai/dbgraphmap/SearchGraphNamedQueryTest.java
new file mode 100644
index 0000000..552dbe4
--- /dev/null
+++ b/aai-traversal/src/test/java/org/onap/aai/dbgraphmap/SearchGraphNamedQueryTest.java
@@ -0,0 +1,406 @@
+/**
+ * ============LICENSE_START=======================================================
+ * org.onap.aai
+ * ================================================================================
+ * Copyright © 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=========================================================
+ *
+ * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ */
+package org.onap.aai.dbgraphmap;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+
+import org.apache.commons.io.IOUtils;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Mockito;
+import org.onap.aai.HttpTestUtil;
+import org.onap.aai.PayloadUtil;
+import org.onap.aai.dbmap.DBConnectionType;
+import org.onap.aai.exceptions.AAIException;
+import org.onap.aai.extensions.AAIExtensionMap;
+import org.onap.aai.introspection.*;
+import org.onap.aai.serialization.engines.QueryStyle;
+import org.onap.aai.util.AAIApiVersion;
+import org.onap.aai.util.AAIConstants;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.ws.rs.core.*;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.*;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Matchers.anyObject;
+import static org.mockito.Mockito.*;
+
+public class SearchGraphNamedQueryTest {
+
+ private SearchGraph searchGraph;
+
+ protected static final MediaType APPLICATION_JSON = MediaType.valueOf("application/json");
+
+ private static final Set<Integer> VALID_HTTP_STATUS_CODES = new HashSet<>();
+
+ private final static Version version = Version.getLatest();
+ private final static ModelType introspectorFactoryType = ModelType.MOXY;
+ private final static QueryStyle queryStyle = QueryStyle.TRAVERSAL;
+ private final static DBConnectionType type = DBConnectionType.REALTIME;
+
+ static {
+ VALID_HTTP_STATUS_CODES.add(200);
+ VALID_HTTP_STATUS_CODES.add(201);
+ VALID_HTTP_STATUS_CODES.add(204);
+ }
+
+ private HttpHeaders httpHeaders;
+
+ private MultivaluedMap<String, String> headersMultiMap;
+ private MultivaluedMap<String, String> queryParameters;
+
+ private List<String> aaiRequestContextList;
+
+ private List<MediaType> outputMediaTypes;
+
+ private static boolean ranOnce = false;
+
+ private HttpTestUtil httpTestUtil;
+
+
+ private String getJsonValue(String json, String key ) {
+ JsonObject jsonObj = new JsonParser().parse(json).getAsJsonObject();
+ String strValue = "";
+ if ( jsonObj.isJsonObject()) {
+ strValue = jsonObj.get(key).getAsString();
+ }
+ return strValue;
+ }
+
+ private void addWidgets() {
+ String widgetPath = "." + AAIConstants.AAI_FILESEP + "bundleconfig-local" + AAIConstants.AAI_FILESEP + "etc" +
+ AAIConstants.AAI_FILESEP + "scriptdata"+ AAIConstants.AAI_FILESEP + "widget-model-json";
+
+ File dir = new File(widgetPath);
+ File[] files = dir.listFiles();
+ for ( File file : files) {
+ try {
+ Path path = Paths.get(widgetPath + AAIConstants.AAI_FILESEP + file.getName());
+ String widgetPayload = new String(Files.readAllBytes(path));
+ String modelInvariantId = getJsonValue(widgetPayload, "model-invariant-id");
+ String widgetUri = "/aai/v12/service-design-and-creation/models/model/" + modelInvariantId;
+ Response response = httpTestUtil.doPut(widgetUri, widgetPayload);
+ assertEquals("Expected the named-query to be created", 201, response.getStatus());
+ } catch ( AAIException | IOException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+
+ }
+ }
+
+ private void addNamedQueries() {
+ String namedQueryPath = "." + AAIConstants.AAI_FILESEP + "bundleconfig-local" + AAIConstants.AAI_FILESEP + "etc" +
+ AAIConstants.AAI_FILESEP + "scriptdata"+ AAIConstants.AAI_FILESEP + "named-query-json";
+
+ File dir = new File(namedQueryPath);
+ File[] files = dir.listFiles();
+ for ( File file : files) {
+ try {
+ Path path = Paths.get(namedQueryPath + AAIConstants.AAI_FILESEP + file.getName());
+ String namedQueryPayload = new String(Files.readAllBytes(path));
+ String namedQueryUuid = getJsonValue(namedQueryPayload, "named-query-uuid");
+ String namedQueryUri = "/aai/v12/service-design-and-creation/named-queries/named-query/" + namedQueryUuid;
+
+ Response response = httpTestUtil.doPut(namedQueryUri, namedQueryPayload);
+ assertEquals("Expected the named-query to be created", 201, response.getStatus());
+ } catch ( AAIException | IOException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+
+ }
+ }
+
+ private String addVersionToUri(String uri ) {
+ return "/aai/" + Version.getLatest() + "/" + uri;
+ }
+
+ @Before
+ public void setup(){
+
+ httpTestUtil = new HttpTestUtil();
+
+ System.setProperty("AJSC_HOME", ".");
+ System.setProperty("BUNDLECONFIG_DIR", "bundleconfig-local");
+
+
+ searchGraph = new SearchGraph();
+
+ httpHeaders = mock(HttpHeaders.class);
+
+ headersMultiMap = new MultivaluedHashMap<>();
+ queryParameters = Mockito.spy(new MultivaluedHashMap<>());
+
+ headersMultiMap.add("X-FromAppId", "JUNIT");
+ headersMultiMap.add("X-TransactionId", UUID.randomUUID().toString());
+ headersMultiMap.add("Real-Time", "true");
+ headersMultiMap.add("Accept", "application/json");
+ headersMultiMap.add("aai-request-context", "");
+
+ outputMediaTypes = new ArrayList<>();
+ outputMediaTypes.add(APPLICATION_JSON);
+
+ aaiRequestContextList = new ArrayList<>();
+ aaiRequestContextList.add("");
+
+ when(httpHeaders.getAcceptableMediaTypes()).thenReturn(outputMediaTypes);
+ when(httpHeaders.getRequestHeaders()).thenReturn(headersMultiMap);
+ when(httpHeaders.getRequestHeader("X-FromAppId")).thenReturn(Arrays.asList("JUNIT"));
+ when(httpHeaders.getRequestHeader("X-TransactionId")).thenReturn(Arrays.asList("JUNIT"));
+
+ when(httpHeaders.getRequestHeader("aai-request-context")).thenReturn(aaiRequestContextList);
+
+
+ // TODO - Check if this is valid since RemoveDME2QueryParameters seems to be very unreasonable
+ Mockito.doReturn(null).when(queryParameters).remove(anyObject());
+
+ when(httpHeaders.getMediaType()).thenReturn(APPLICATION_JSON);
+
+ if ( !ranOnce ) {
+ ranOnce = true;
+ addWidgets();
+ addNamedQueries();
+ }
+ }
+
+
+ @Test
+ public void getDHVLogicalLinkByCircuitId_1_0_Test() throws Exception {
+
+ AAIExtensionMap aaiExtMap = new AAIExtensionMap();
+ aaiExtMap.setHttpHeaders(httpHeaders);
+ String queryParameters = PayloadUtil.getNamedQueryPayload("query-payload.DHVLogicalLinkByCircuitId-1.0.json");
+ String putPayload = PayloadUtil.getNamedQueryPayload("logical-link.DHVLogicalLinkByCircuitId-1.0.json");
+
+ String linkName = getJsonValue(putPayload, "link-name");
+ String putUri = addVersionToUri("network/logical-links/logical-link/" + linkName);
+
+ Response response = httpTestUtil.doPut(putUri, putPayload);
+ assertEquals("Expected the logical-link to be created", 201, response.getStatus());
+
+ HttpServletRequest request = Mockito.mock(HttpServletRequest.class);
+ Mockito.when(request.getContentType()).thenReturn("application/json");
+
+ aaiExtMap.setUri("/search/named-query");
+ aaiExtMap.setApiVersion(AAIApiVersion.get());
+ aaiExtMap.setServletRequest(request);
+
+ SearchGraph searchGraph = new SearchGraph();
+ response = searchGraph.runNamedQuery("JUNIT", "JUNIT", queryParameters, DBConnectionType.REALTIME, aaiExtMap);
+ System.out.println("response was\n" + response.getEntity().toString());
+ assertEquals("Expected success from query", 200, response.getStatus());
+ boolean hasLinkName = response.getEntity().toString().indexOf(linkName) > 0 ? true : false;
+ assertTrue("Response contains linkName", hasLinkName );
+ }
+
+ @Test
+ public void getSvcSubscriberModelInfo_1_0_Test() throws Exception {
+
+ AAIExtensionMap aaiExtMap = new AAIExtensionMap();
+ aaiExtMap.setHttpHeaders(httpHeaders);
+ String queryParameters = PayloadUtil.getNamedQueryPayload("query-payload.SvcSubscriberModelInfo-1.0.json");
+
+ String putPayload = PayloadUtil.getNamedQueryPayload("model.SvcSubscriberModelInfo-1.0.json");
+ String modelInvariantId = getJsonValue(putPayload, "model-invariant-id");
+ String putUri = addVersionToUri("service-design-and-creation/models/model/" + modelInvariantId);
+ Response response = httpTestUtil.doPut(putUri, putPayload);
+ assertEquals("Expected the model to be created", 201, response.getStatus());
+
+ putPayload = PayloadUtil.getNamedQueryPayload("customer.SvcSubscriberModelInfo-1.0.json");
+ String globalCustomerId = getJsonValue(putPayload, "global-customer-id");
+ putUri = addVersionToUri("business/customers/customer/" + globalCustomerId);
+ response = httpTestUtil.doPut(putUri, putPayload);
+ assertEquals("Expected the customer to be created", 201, response.getStatus());
+
+ HttpServletRequest request = Mockito.mock(HttpServletRequest.class);
+ Mockito.when(request.getContentType()).thenReturn("application/json");
+
+ aaiExtMap.setUri("/search/named-query");
+ aaiExtMap.setApiVersion(AAIApiVersion.get());
+ aaiExtMap.setServletRequest(request);
+
+ SearchGraph searchGraph = new SearchGraph();
+ response = searchGraph.runNamedQuery("JUNIT", "JUNIT", queryParameters, DBConnectionType.REALTIME, aaiExtMap);
+ assertEquals("Expected success from query", 200, response.getStatus());
+ boolean hasModelName = response.getEntity().toString().indexOf("junit-model-name") > 0 ? true : false;
+ assertTrue("Response contains modelName from model-ver", hasModelName );
+ }
+
+ @Test
+ public void getClosedLoopNamedQuery_1_0_Test() throws Exception {
+
+ AAIExtensionMap aaiExtMap = new AAIExtensionMap();
+ aaiExtMap.setHttpHeaders(httpHeaders);
+ String queryParameters = PayloadUtil.getNamedQueryPayload("query-payload.closed-loop-named-query-1.0.json");
+
+ String putPayload = PayloadUtil.getNamedQueryPayload("model.closed-loop-named-query-1.0.json");
+ String modelInvariantId = getJsonValue(putPayload, "model-invariant-id");
+ String putUri = addVersionToUri("service-design-and-creation/models/model/" + modelInvariantId);
+ Response response = httpTestUtil.doPut(putUri, putPayload);
+ assertEquals("Expected the model to be created", 201, response.getStatus());
+
+ putPayload = PayloadUtil.getNamedQueryPayload("cloud-region.closed-loop-named-query-1.0.json");
+ String cloudOwner = getJsonValue(putPayload, "cloud-owner");
+ String cloudRegionId = getJsonValue(putPayload, "cloud-region-id");
+ putUri = addVersionToUri("cloud-infrastructure/cloud-regions/cloud-region/" + cloudOwner + "/" + cloudRegionId);
+ response = httpTestUtil.doPut(putUri, putPayload);
+ assertEquals("Expected the cloud-region to be created", 201, response.getStatus());
+
+ putPayload = PayloadUtil.getNamedQueryPayload("cloud-region2.closed-loop-named-query-1.0.json");
+ String cloudOwner2 = getJsonValue(putPayload, "cloud-owner");
+ String cloudRegionId2 = getJsonValue(putPayload, "cloud-region-id");
+ putUri = addVersionToUri("cloud-infrastructure/cloud-regions/cloud-region/" + cloudOwner2 + "/" + cloudRegionId2);
+ response = httpTestUtil.doPut(putUri, putPayload);
+ assertEquals("Expected the cloud-region2 to be created", 201, response.getStatus());
+
+ putPayload = PayloadUtil.getNamedQueryPayload("tenant.closed-loop-named-query-1.0.json");
+ String tenantId = getJsonValue(putPayload, "tenant-id");
+ putUri = addVersionToUri("cloud-infrastructure/cloud-regions/cloud-region/" + cloudOwner + "/" + cloudRegionId
+ + "/tenants/tenant/" + tenantId);
+ response = httpTestUtil.doPut(putUri, putPayload);
+ assertEquals("Expected the tenant to be created", 201, response.getStatus());
+
+ putPayload = PayloadUtil.getNamedQueryPayload("tenant2.closed-loop-named-query-1.0.json");
+ String tenantId2 = getJsonValue(putPayload, "tenant-id");
+ putUri = addVersionToUri("cloud-infrastructure/cloud-regions/cloud-region/" + cloudOwner2 + "/" + cloudRegionId2
+ + "/tenants/tenant/" + tenantId2);
+ response = httpTestUtil.doPut(putUri, putPayload);
+ assertEquals("Expected the tenant2 to be created", 201, response.getStatus());
+
+ putPayload = PayloadUtil.getNamedQueryPayload("vserver.closed-loop-named-query-1.0.json");
+ String vserverId = getJsonValue(putPayload, "vserver-id");
+ putUri = addVersionToUri("cloud-infrastructure/cloud-regions/cloud-region/" + cloudOwner + "/" + cloudRegionId
+ + "/tenants/tenant/" + tenantId + "/vservers/vserver/" + vserverId);
+ response = httpTestUtil.doPut(putUri, putPayload);
+ assertEquals("Expected the vserver to be created", 201, response.getStatus());
+
+ putPayload = PayloadUtil.getNamedQueryPayload("vserver2.closed-loop-named-query-1.0.json");
+ String vserverId2 = getJsonValue(putPayload, "vserver-id");
+ putUri = addVersionToUri("cloud-infrastructure/cloud-regions/cloud-region/" + cloudOwner2 + "/" + cloudRegionId2
+ + "/tenants/tenant/" + tenantId2 + "/vservers/vserver/" + vserverId2);
+ response = httpTestUtil.doPut(putUri, putPayload);
+ assertEquals("Expected the vserver2 to be created", 201, response.getStatus());
+
+ putPayload = PayloadUtil.getNamedQueryPayload("customer.closed-loop-named-query-1.0.json");
+ String globalCustomerId = getJsonValue(putPayload, "global-customer-id");
+ putUri = addVersionToUri("business/customers/customer/" + globalCustomerId);
+ response = httpTestUtil.doPut(putUri, putPayload);
+ assertEquals("Expected the customer to be created", 201, response.getStatus());
+
+ putPayload = PayloadUtil.getNamedQueryPayload("generic-vnf.closed-loop-named-query-1.0.json");
+ String vnfId = getJsonValue(putPayload, "vnf-id");
+ putUri = addVersionToUri("network/generic-vnfs/generic-vnf/" + vnfId);
+ response = httpTestUtil.doPut(putUri, putPayload);
+ assertEquals("Expected the generic-vnf to be created", 201, response.getStatus());
+
+ HttpServletRequest request = Mockito.mock(HttpServletRequest.class);
+ Mockito.when(request.getContentType()).thenReturn("application/json");
+
+ aaiExtMap.setUri("/search/named-query");
+ aaiExtMap.setApiVersion(AAIApiVersion.get());
+ aaiExtMap.setServletRequest(request);
+
+ SearchGraph searchGraph = new SearchGraph();
+ response = searchGraph.runNamedQuery("JUNIT", "JUNIT", queryParameters, DBConnectionType.REALTIME, aaiExtMap);
+ assertEquals("Expected success from query", 200, response.getStatus());
+ boolean hasModelName = response.getEntity().toString().indexOf("example-model-name-val-closed-loop") > 0 ? true : false;
+ assertTrue("Response contains modelName from model-ver", hasModelName );
+ }
+
+ @Test
+ public void getComponentList_1_2_Test() throws Exception {
+
+ AAIExtensionMap aaiExtMap = new AAIExtensionMap();
+ aaiExtMap.setHttpHeaders(httpHeaders);
+ String queryParameters = PayloadUtil.getNamedQueryPayload("query-payload.ComponentList-1.2.json");
+
+ String putPayload = PayloadUtil.getNamedQueryPayload("model.ComponentList-1.2.json");
+ String modelInvariantId = getJsonValue(putPayload, "model-invariant-id");
+ String putUri = addVersionToUri("service-design-and-creation/models/model/" + modelInvariantId);
+ Response response = httpTestUtil.doPut(putUri, putPayload);
+ assertEquals("Expected the model to be created", 201, response.getStatus());
+
+ putPayload = PayloadUtil.getNamedQueryPayload("customer.ComponentList-1.2.json");
+ String globalCustomerId = getJsonValue(putPayload, "global-customer-id");
+ putUri = addVersionToUri("business/customers/customer/" + globalCustomerId);
+ response = httpTestUtil.doPut(putUri, putPayload);
+ assertEquals("Expected the customer to be created", 201, response.getStatus());
+
+ putPayload = PayloadUtil.getNamedQueryPayload("generic-vnf.ComponentList-1.2.json");
+ String vnfId = getJsonValue(putPayload, "vnf-id");
+ putUri = addVersionToUri("network/generic-vnfs/generic-vnf/" + vnfId);
+ response = httpTestUtil.doPut(putUri, putPayload);
+ assertEquals("Expected the generic-vnf to be created", 201, response.getStatus());
+
+ putPayload = PayloadUtil.getNamedQueryPayload("vf-module.ComponentList-1.2.json");
+ String vfModuleId = getJsonValue(putPayload, "vf-module-id");
+ putUri = addVersionToUri("network/generic-vnfs/generic-vnf/" + vnfId + "/vf-modules/vf-module/" + vfModuleId);
+ response = httpTestUtil.doPut(putUri, putPayload);
+ assertEquals("Expected the vf-module to be created", 201, response.getStatus());
+
+ putPayload = PayloadUtil.getNamedQueryPayload("cloud-region.ComponentList-1.2.json");
+ String cloudOwner = getJsonValue(putPayload, "cloud-owner");
+ String cloudRegionId = getJsonValue(putPayload, "cloud-region-id");
+ putUri = addVersionToUri("cloud-infrastructure/cloud-regions/cloud-region/" + cloudOwner + "/" + cloudRegionId);
+ response = httpTestUtil.doPut(putUri, putPayload);
+ assertEquals("Expected the cloud-region to be created", 201, response.getStatus());
+
+ putPayload = PayloadUtil.getNamedQueryPayload("tenant.ComponentList-1.2.json");
+ String tenantId = getJsonValue(putPayload, "tenant-id");
+ putUri = addVersionToUri("cloud-infrastructure/cloud-regions/cloud-region/" + cloudOwner + "/" + cloudRegionId
+ + "/tenants/tenant/" + tenantId);
+ response = httpTestUtil.doPut(putUri, putPayload);
+ assertEquals("Expected the tenant to be created", 201, response.getStatus());
+
+ putPayload = PayloadUtil.getNamedQueryPayload("vserver.ComponentList-1.2.json");
+ String vserverId = getJsonValue(putPayload, "vserver-id");
+ putUri = addVersionToUri("cloud-infrastructure/cloud-regions/cloud-region/" + cloudOwner + "/" + cloudRegionId
+ + "/tenants/tenant/" + tenantId + "/vservers/vserver/" + vserverId);
+ response = httpTestUtil.doPut(putUri, putPayload);
+ assertEquals("Expected the vserver to be created", 201, response.getStatus());
+
+ HttpServletRequest request = Mockito.mock(HttpServletRequest.class);
+ Mockito.when(request.getContentType()).thenReturn("application/json");
+
+ aaiExtMap.setUri("/search/named-query");
+ aaiExtMap.setApiVersion(AAIApiVersion.get());
+ aaiExtMap.setServletRequest(request);
+
+ SearchGraph searchGraph = new SearchGraph();
+ response = searchGraph.runNamedQuery("JUNIT", "JUNIT", queryParameters, DBConnectionType.REALTIME, aaiExtMap);
+ assertEquals("Expected success from query", 200, response.getStatus());
+ boolean hasModelName = response.getEntity().toString().indexOf("example-model-name-val-component-list") > 0 ? true : false;
+ assertTrue("Response contains modelName from model-ver", hasModelName );
+ }
+} \ No newline at end of file
diff --git a/aai-traversal/src/test/java/org/onap/aai/rest/search/GetCustomQueryConfigTest.java b/aai-traversal/src/test/java/org/onap/aai/rest/search/GetCustomQueryConfigTest.java
new file mode 100644
index 0000000..58c5876
--- /dev/null
+++ b/aai-traversal/src/test/java/org/onap/aai/rest/search/GetCustomQueryConfigTest.java
@@ -0,0 +1,62 @@
+package org.onap.aai.rest.search;
+
+import static org.junit.Assert.*;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import com.google.common.collect.Lists;
+
+public class GetCustomQueryConfigTest {
+
+ private String configJson;
+
+ @Before
+ public void setUp() throws Exception {
+ System.setProperty("AJSC_HOME", ".");
+ System.setProperty("BUNDLECONFIG_DIR", "bundleconfig-local");
+
+
+ configJson = "{\n \"stored-queries\": [{\n" +
+ " \"queryName1\": {\n \"query\": {\n \"required-properties\": [\"prop1\", \"prop2\"],\n \"optional-properties\": [\"prop3\", \"prop4\"]\n },\n \"stored-query\": \"out('blah').has('something','foo')\"\n }\n }, {\n" +
+ " \"queryName2\": {\n \"query\": {\n \"optional-properties\": [\"prop5\"]\n },\n \"stored-query\": \"out('bar').has('stuff','baz')\"\n }\n }, {\n" +
+ " \"queryName3\": {\n \"stored-query\": \"out('bar1').has('stuff','baz1')\"\n }\n }]\n}";
+ }
+
+
+ @Test
+ public void testGetStoredQueryNameWithOptAndReqProps() {
+
+ GetCustomQueryConfig getCustomQueryConfig = new GetCustomQueryConfig(configJson);
+ CustomQueryConfig cqc = getCustomQueryConfig.getStoredQuery("queryName1");
+
+ assertEquals(Lists.newArrayList("prop3", "prop4"), cqc.getQueryOptionalProperties());
+ assertEquals(Lists.newArrayList("prop1", "prop2"), cqc.getQueryRequiredProperties());
+ assertEquals("out('blah').has('something','foo')", cqc.getQuery());
+
+ }
+
+ @Test
+ public void testGetStoredQueryNameWithOptProps() {
+
+ GetCustomQueryConfig getCustomQueryConfig = new GetCustomQueryConfig(configJson);
+ CustomQueryConfig cqc = getCustomQueryConfig.getStoredQuery("queryName2");
+
+ assertEquals(Lists.newArrayList("prop5"), cqc.getQueryOptionalProperties());
+ assertEquals(null, cqc.getQueryRequiredProperties());
+ assertEquals("out('bar').has('stuff','baz')", cqc.getQuery());
+
+ }
+
+ @Test
+ public void testGetStoredQueryNameWithNoProps() {
+
+ GetCustomQueryConfig getCustomQueryConfig = new GetCustomQueryConfig(configJson);
+ CustomQueryConfig cqc = getCustomQueryConfig.getStoredQuery("queryName3");
+
+ assertEquals(null, cqc.getQueryOptionalProperties());
+ assertEquals(null, cqc.getQueryRequiredProperties());
+ assertEquals("out('bar1').has('stuff','baz1')", cqc.getQuery());
+
+ }
+}
diff --git a/aai-traversal/src/test/java/org/onap/aai/rest/search/QueryTest.java b/aai-traversal/src/test/java/org/onap/aai/rest/search/QueryTest.java
index 5457937..a7c8470 100644
--- a/aai-traversal/src/test/java/org/onap/aai/rest/search/QueryTest.java
+++ b/aai-traversal/src/test/java/org/onap/aai/rest/search/QueryTest.java
@@ -73,7 +73,7 @@ public abstract class QueryTest {
public void run() {
- String query = gremlinServerSingleton.getStoredQuery(getQueryName());
+ String query = gremlinServerSingleton.getStoredQueryFromConfig(getQueryName());
Map<String, Object> params = new HashMap<>();
addParam(params);
when(dbEngine.getQueryBuilder(any(QueryStyle.class))).thenReturn(new GremlinTraversal<>(loader, graph.traversal()));
diff --git a/aai-traversal/src/test/java/org/onap/aai/rest/util/ConvertQueryPropertiesToJsonTest.java b/aai-traversal/src/test/java/org/onap/aai/rest/util/ConvertQueryPropertiesToJsonTest.java
new file mode 100644
index 0000000..b324a94
--- /dev/null
+++ b/aai-traversal/src/test/java/org/onap/aai/rest/util/ConvertQueryPropertiesToJsonTest.java
@@ -0,0 +1,31 @@
+package org.onap.aai.rest.util;
+
+import static org.junit.Assert.assertNotNull;
+
+import java.util.Properties;
+
+import org.junit.Test;
+
+public class ConvertQueryPropertiesToJsonTest {
+ @Test
+ public void testRqdProperty(){
+
+ ConvertQueryPropertiesToJson convert = new ConvertQueryPropertiesToJson();
+ Properties props = new Properties();
+ props.setProperty("queryName1", "builder.getVerticesByProperty('rqdProp', rqdPropId).getVerticesByProperty('rqdProp2', rqdPropId2).createEdgeTraversal(EdgeType.TREE, 'node1', 'child-node1')");
+ props.setProperty("lastQueryName", "builder.getVerticesByProperty('notRqdProp', \"OUT\").createEdgeTraversal(EdgeType.TREE, 'node2', 'child-node2')");
+ String json = convert.convertProperties(props);
+ assertNotNull(json);
+ }
+
+ @Test
+ public void testLastQueryRqdProperty(){
+
+ ConvertQueryPropertiesToJson convert = new ConvertQueryPropertiesToJson();
+ Properties props = new Properties();
+ props.setProperty("queryName1", "builder.createEdgeTraversal(EdgeType.TREE, 'node1', 'child-node1')");
+ props.setProperty("lastQueryName", "builder.getVerticesByProperty('rqdProp', rqdPropId).createEdgeTraversal(EdgeType.TREE, 'node2', 'child-node2')");
+ String json = convert.convertProperties(props);
+ assertNotNull(json);
+ }
+}
diff --git a/aai-traversal/src/test/resources/payloads/named-queries/cloud-region.ComponentList-1.2.json b/aai-traversal/src/test/resources/payloads/named-queries/cloud-region.ComponentList-1.2.json
new file mode 100644
index 0000000..13a4552
--- /dev/null
+++ b/aai-traversal/src/test/resources/payloads/named-queries/cloud-region.ComponentList-1.2.json
@@ -0,0 +1,4 @@
+ {
+ "cloud-owner": "cloud-owner-component-list-junit",
+ "cloud-region-id": "cloud-region-id-component-list-junit"
+} \ No newline at end of file
diff --git a/aai-traversal/src/test/resources/payloads/named-queries/cloud-region.closed-loop-named-query-1.0.json b/aai-traversal/src/test/resources/payloads/named-queries/cloud-region.closed-loop-named-query-1.0.json
new file mode 100644
index 0000000..b1ed9fa
--- /dev/null
+++ b/aai-traversal/src/test/resources/payloads/named-queries/cloud-region.closed-loop-named-query-1.0.json
@@ -0,0 +1,4 @@
+ {
+ "cloud-owner": "cloud-owner-closed-loop-junit",
+ "cloud-region-id": "cloud-region-id-closed-loop-junit"
+} \ No newline at end of file
diff --git a/aai-traversal/src/test/resources/payloads/named-queries/cloud-region2.closed-loop-named-query-1.0.json b/aai-traversal/src/test/resources/payloads/named-queries/cloud-region2.closed-loop-named-query-1.0.json
new file mode 100644
index 0000000..b86ffe0
--- /dev/null
+++ b/aai-traversal/src/test/resources/payloads/named-queries/cloud-region2.closed-loop-named-query-1.0.json
@@ -0,0 +1,4 @@
+ {
+ "cloud-owner": "cloud-owner2-closed-loop-junit",
+ "cloud-region-id": "cloud-region-id2-closed-loop-junit"
+} \ No newline at end of file
diff --git a/aai-traversal/src/test/resources/payloads/named-queries/customer.ComponentList-1.2.json b/aai-traversal/src/test/resources/payloads/named-queries/customer.ComponentList-1.2.json
new file mode 100644
index 0000000..bff2f49
--- /dev/null
+++ b/aai-traversal/src/test/resources/payloads/named-queries/customer.ComponentList-1.2.json
@@ -0,0 +1,18 @@
+{
+ "global-customer-id": "customer-component-list-junit",
+ "subscriber-name": "subscriber-name-component-list-junit",
+ "subscriber-type": "subscriber-type-component-list",
+ "service-subscriptions": {
+ "service-subscription": [{
+ "service-type": "service-type-component-list-junit",
+ "service-instances": {
+ "service-instance": [{
+ "service-instance-id": "service-instance-id-component-list-junit",
+ "service-instance-name": "service-instance-name-component-list-junit",
+ "model-invariant-id": "model-invariant-id-component-list-junit",
+ "model-version-id": "model-version-id-component-list-junit"
+ }]
+ }
+ }]
+ }
+} \ No newline at end of file
diff --git a/aai-traversal/src/test/resources/payloads/named-queries/customer.SvcSubscriberModelInfo-1.0.json b/aai-traversal/src/test/resources/payloads/named-queries/customer.SvcSubscriberModelInfo-1.0.json
new file mode 100644
index 0000000..4f010bb
--- /dev/null
+++ b/aai-traversal/src/test/resources/payloads/named-queries/customer.SvcSubscriberModelInfo-1.0.json
@@ -0,0 +1,13 @@
+{
+ "global-customer-id": "junit-global-customer-id",
+ "subscriber-name": "junit-subscriber",
+ "subscriber-type": "CUST",
+ "service-subscriptions": {"service-subscription": [ {
+ "service-type": "junit-service-type",
+ "service-instances": {"service-instance": [ {
+ "service-instance-id": "junit-service-instance-id",
+ "model-invariant-id": "junit-model-invariant-id",
+ "model-version-id": "junit-model-version-id"
+ }]}
+ }]}
+} \ No newline at end of file
diff --git a/aai-traversal/src/test/resources/payloads/named-queries/customer.closed-loop-named-query-1.0.json b/aai-traversal/src/test/resources/payloads/named-queries/customer.closed-loop-named-query-1.0.json
new file mode 100644
index 0000000..21d4468
--- /dev/null
+++ b/aai-traversal/src/test/resources/payloads/named-queries/customer.closed-loop-named-query-1.0.json
@@ -0,0 +1,32 @@
+ {
+ "global-customer-id": "customer-closed-loop-junit",
+ "subscriber-name": "example-subscriber-name-val-closed-loop-junitcustomer-closed-loop-junit",
+ "subscriber-type": "example-subscriber-type-val-closed-loop-junit",
+ "service-subscriptions": {
+ "service-subscription": [
+ {
+ "service-type": "service-type-closed-loop-junit",
+ "temp-ub-sub-account-id": "example-temp-ub-sub-account-id-val-closed-loop-junit",
+ "service-instances": {
+ "service-instance": [
+ {
+ "service-instance-id": "service-instance-closed-loop-junit",
+ "service-instance-name": "example-service-instance-name-val-closed-loop-junit",
+ "model-invariant-id": "model-invariant-id-closed-loop-junit",
+ "model-version-id": "model-version-id-closed-loop-junit",
+ "widget-model-id": "example-widget-model-id-val-closed-loop-junit",
+ "widget-model-version": "example-widget-model-version-val-closed-loop-junit",
+ "bandwidth-total": "example-bandwidth-total-val-closed-loop-junit",
+ "bandwidth-up-wan1": "example-bandwidth-up-wan1-val-closed-loop-junit",
+ "bandwidth-down-wan1": "example-bandwidth-down-wan1-val-closed-loop-junit",
+ "bandwidth-up-wan2": "example-bandwidth-up-wan2-val-closed-loop-junit",
+ "bandwidth-down-wan2": "example-bandwidth-down-wan2-val-closed-loop-junit",
+ "vhn-portal-url": "example-vhn-portal-url-val-closed-loop-junit",
+ "service-instance-location-id": "example-service-instance-location-id-val-closed-loop-junit"
+ }
+ ]
+ }
+ }
+ ]
+ }
+} \ No newline at end of file
diff --git a/aai-traversal/src/test/resources/payloads/named-queries/generic-vnf.ComponentList-1.2.json b/aai-traversal/src/test/resources/payloads/named-queries/generic-vnf.ComponentList-1.2.json
new file mode 100644
index 0000000..e85d7e9
--- /dev/null
+++ b/aai-traversal/src/test/resources/payloads/named-queries/generic-vnf.ComponentList-1.2.json
@@ -0,0 +1,27 @@
+ {
+ "vnf-id": "vnf-id-component-list-junit",
+ "vnf-name": "vnf-id-component-list-junit",
+ "vnf-type": "vnf-type-component-list",
+ "equipment-role": "equipment-role-component-list",
+ "service-id": "service-id-component-list",
+ "prov-status": "prov-status-component-list",
+ "relationship-list": {
+ "relationship": [{
+ "related-to": "service-instance",
+ "relationship-data": [{
+ "relationship-key": "customer.global-customer-id",
+ "relationship-value": "customer-component-list-junit"
+ },
+ {
+ "relationship-key": "service-subscription.service-type",
+ "relationship-value": "service-type-component-list-junit"
+ },
+ {
+ "relationship-key": "service-instance.service-instance-id",
+ "relationship-value": "service-instance-id-component-list-junit"
+ }
+ ]
+ }
+ ]
+ }
+} \ No newline at end of file
diff --git a/aai-traversal/src/test/resources/payloads/named-queries/generic-vnf.closed-loop-named-query-1.0.json b/aai-traversal/src/test/resources/payloads/named-queries/generic-vnf.closed-loop-named-query-1.0.json
new file mode 100644
index 0000000..17c39cd
--- /dev/null
+++ b/aai-traversal/src/test/resources/payloads/named-queries/generic-vnf.closed-loop-named-query-1.0.json
@@ -0,0 +1,131 @@
+{
+ "vnf-id": "generic-vnf-closed-loop-junit",
+ "vnf-name": "example-vnf-name-val-closed-loop",
+ "vnf-name2": "example-vnf-name2-val-closed-loop",
+ "vnf-type": "example-vnf-type-val-closed-loop",
+ "prov-status": "example-prov-status-val-closed-loop",
+ "service-id": "example-service-id-val-closed-loop",
+ "model-invariant-id": "model-invariant-id-closed-loop-junit",
+ "model-version-id": "model-version-id-closed-loop-junit",
+ "regional-resource-zone": "example-regional-resource-zone-val-closed-loop",
+ "license-key": "example-license-key-val-closed-loop",
+ "equipment-role": "example-equipment-role-val-closed-loop",
+ "orchestration-status": "example-orchestration-status-val-closed-loop",
+ "heat-stack-id": "example-heat-stack-id-val-closed-loop",
+ "mso-catalog-key": "example-mso-catalog-key-val-closed-loop",
+ "management-option": "example-management-option-val-closed-loop",
+ "ipv4-oam-address": "example-ipv4-oam-address-val-closed-loop",
+ "ipv4-loopback0-address": "example-ipv4-loopback0-address-val-closed-loop",
+ "nm-lan-v6-address": "example-nm-lan-v6-address-val-closed-loop",
+ "management-v6-address": "example-management-v6-address-val-closed-loop",
+ "vcpu": 7957,
+ "vcpu-units": "example-vcpu-units-val-closed-loop",
+ "vmemory": 168,
+ "vmemory-units": "example-vmemory-units-val-closed-loop",
+ "vdisk": 3227,
+ "vdisk-units": "example-vdisk-units-val-closed-loop",
+ "l-interfaces": {
+ "l-interface": [{
+ "interface-name": "interface-name-generic-vnf-closed-loop-junit",
+ "interface-role": "example-interface-role-val-closed-loop",
+ "v6-wan-link-ip": "example-v6-wan-link-ip-val-closed-loop",
+ "selflink": "example-selflink-val-closed-loop",
+ "interface-id": "example-interface-id-val-closed-loop",
+ "macaddr": "example-macaddr-val-closed-loop",
+ "network-name": "example-network-name-val-closed-loop",
+ "vlans": {
+ "vlan": [{
+ "vlan-interface": "vlan-interface-generic-vnf-closed-loop-junit",
+ "vlan-id-inner": 498,
+ "vlan-id-outer": 2746,
+ "l3-interface-ipv4-address-list": [{
+ "l3-interface-ipv4-address": "1.1.1.1",
+ "l3-interface-ipv4-prefix-length": 3722,
+ "vlan-id-inner": 6519,
+ "vlan-id-outer": 194,
+ "is-floating": true,
+ "neutron-network-id": "1.1.1.1",
+ "neutron-subnet-id": "1.1.1.1"
+ }],
+ "l3-interface-ipv6-address-list": [{
+ "l3-interface-ipv6-address": "1111:4444:2222:3333::5555:7777",
+ "l3-interface-ipv6-prefix-length": 9215,
+ "vlan-id-inner": 9602,
+ "vlan-id-outer": 5177,
+ "is-floating": true,
+ "neutron-network-id": "2.2.2.2",
+ "neutron-subnet-id": "2.2.2.2"
+ }]
+ }]
+ },
+ "l3-interface-ipv4-address-list": [{
+ "l3-interface-ipv4-address": "3.3.3.3",
+ "l3-interface-ipv4-prefix-length": 9797,
+ "vlan-id-inner": 5534,
+ "vlan-id-outer": 8820,
+ "is-floating": true,
+ "neutron-network-id": "3.3.3.3",
+ "neutron-subnet-id": "3.3.3.3"
+ }],
+ "l3-interface-ipv6-address-list": [{
+ "l3-interface-ipv6-address": "1111:4444:2222:3333::5555:6666",
+ "l3-interface-ipv6-prefix-length": 5983,
+ "vlan-id-inner": 747,
+ "vlan-id-outer": 7535,
+ "is-floating": true,
+ "neutron-network-id": "4.4.4.4",
+ "neutron-subnet-id": "4.4.4.4"
+ }]
+ }]
+ },
+ "lag-interfaces": {
+ "lag-interface": [{
+ "interface-name": "interface-name-generic-vnf-closed-loop-junit"
+ }]
+ },
+ "relationship-list": {
+ "relationship": [{
+ "related-to": "service-instance",
+ "relationship-data": [{
+ "relationship-key": "service-instance.service-instance-id",
+ "relationship-value": "service-instance-closed-loop-junit"
+ }, {
+ "relationship-key": "service-subscription.service-type",
+ "relationship-value": "service-type-closed-loop-junit"
+ }, {
+ "relationship-key": "customer.global-customer-id",
+ "relationship-value": "customer-closed-loop-junit"
+ }]
+ }, {
+ "related-to": "vserver",
+ "relationship-data": [{
+ "relationship-key": "vserver.vserver-id",
+ "relationship-value": "vserver-closed-loop-junit"
+ }, {
+ "relationship-key": "tenant.tenant-id",
+ "relationship-value": "tenant-closed-loop-junit"
+ }, {
+ "relationship-key": "cloud-region.cloud-owner",
+ "relationship-value": "cloud-owner-closed-loop-junit"
+ }, {
+ "relationship-key": "cloud-region.cloud-region-id",
+ "relationship-value": "cloud-region-id-closed-loop-junit"
+ }]
+ }, {
+ "related-to": "vserver",
+ "relationship-data": [{
+ "relationship-key": "vserver.vserver-id",
+ "relationship-value": "vserver2-closed-loop-junit"
+ }, {
+ "relationship-key": "tenant.tenant-id",
+ "relationship-value": "tenant2-closed-loop-junit"
+ }, {
+ "relationship-key": "cloud-region.cloud-owner",
+ "relationship-value": "cloud-owner2-closed-loop-junit"
+ }, {
+ "relationship-key": "cloud-region.cloud-region-id",
+ "relationship-value": "cloud-region-id2-closed-loop-junit"
+ }]
+ }]
+ }
+} \ No newline at end of file
diff --git a/aai-traversal/src/test/resources/payloads/named-queries/logical-link.DHVLogicalLinkByCircuitId-1.0.json b/aai-traversal/src/test/resources/payloads/named-queries/logical-link.DHVLogicalLinkByCircuitId-1.0.json
new file mode 100644
index 0000000..ad45b91
--- /dev/null
+++ b/aai-traversal/src/test/resources/payloads/named-queries/logical-link.DHVLogicalLinkByCircuitId-1.0.json
@@ -0,0 +1,5 @@
+{
+ "link-name": "junit-logical-link",
+ "link-type": "junit-link-type",
+ "circuit-id": "junit-circuit-id"
+} \ No newline at end of file
diff --git a/aai-traversal/src/test/resources/payloads/named-queries/model.ComponentList-1.2.json b/aai-traversal/src/test/resources/payloads/named-queries/model.ComponentList-1.2.json
new file mode 100644
index 0000000..6a15af7
--- /dev/null
+++ b/aai-traversal/src/test/resources/payloads/named-queries/model.ComponentList-1.2.json
@@ -0,0 +1,22 @@
+ {
+ "model-invariant-id": "model-invariant-id-component-list-junit",
+ "model-type": "example-model-type-val-component-list",
+ "model-vers": {
+ "model-ver": [
+ {
+ "model-version-id": "model-version-id-component-list-junit",
+ "model-name": "example-model-name-val-component-list",
+ "model-version": "5.0",
+ "model-description": "example-model-description-val-component-list",
+ "metadata": {
+ "metadatum": [
+ {
+ "metaname": "metaname-component-list-junit",
+ "metaval": "example-metaval-val-component-list"
+ }
+ ]
+ }
+ }
+ ]
+ }
+} \ No newline at end of file
diff --git a/aai-traversal/src/test/resources/payloads/named-queries/model.SvcSubscriberModelInfo-1.0.json b/aai-traversal/src/test/resources/payloads/named-queries/model.SvcSubscriberModelInfo-1.0.json
new file mode 100644
index 0000000..63cfdf5
--- /dev/null
+++ b/aai-traversal/src/test/resources/payloads/named-queries/model.SvcSubscriberModelInfo-1.0.json
@@ -0,0 +1,10 @@
+{
+ "model-invariant-id": "junit-model-invariant-id",
+ "model-type": "junit-model-type",
+ "model-vers": {"model-ver": [ {
+ "model-version-id": "junit-model-version-id",
+ "model-name": "junit-model-name",
+ "model-version": "1",
+ "model-description": "junit-model-description"
+ }]}
+} \ No newline at end of file
diff --git a/aai-traversal/src/test/resources/payloads/named-queries/model.closed-loop-named-query-1.0.json b/aai-traversal/src/test/resources/payloads/named-queries/model.closed-loop-named-query-1.0.json
new file mode 100644
index 0000000..f2b95dc
--- /dev/null
+++ b/aai-traversal/src/test/resources/payloads/named-queries/model.closed-loop-named-query-1.0.json
@@ -0,0 +1,22 @@
+ {
+ "model-invariant-id": "model-invariant-id-closed-loop-junit",
+ "model-type": "example-model-type-val-closed-loop",
+ "model-vers": {
+ "model-ver": [
+ {
+ "model-version-id": "model-version-id-closed-loop-junit",
+ "model-name": "example-model-name-val-closed-loop",
+ "model-version": "5.0",
+ "model-description": "example-model-description-val-closed-loop",
+ "metadata": {
+ "metadatum": [
+ {
+ "metaname": "metaname-closed-loop-junit",
+ "metaval": "example-metaval-val-closed-loop"
+ }
+ ]
+ }
+ }
+ ]
+ }
+} \ No newline at end of file
diff --git a/aai-traversal/src/test/resources/payloads/named-queries/query-payload.ComponentList-1.2.json b/aai-traversal/src/test/resources/payloads/named-queries/query-payload.ComponentList-1.2.json
new file mode 100644
index 0000000..685c1c2
--- /dev/null
+++ b/aai-traversal/src/test/resources/payloads/named-queries/query-payload.ComponentList-1.2.json
@@ -0,0 +1,23 @@
+ {
+ "query-parameters": {
+ "named-query": {
+ "named-query-uuid": "2a183f99-2c66-482b-ade5-7962efd801ef"
+ }
+ },
+ "instance-filters": {
+ "instance-filter": [
+ {
+
+ "customer": {
+ "global-customer-id": "customer-component-list-junit"
+ },
+ "service-subscription": {
+ "service-type": "service-type-component-list-junit"
+ },
+ "service-instance": {
+ "service-instance-id": "service-instance-id-component-list-junit"
+ }
+ }
+ ]
+ }
+} \ No newline at end of file
diff --git a/aai-traversal/src/test/resources/payloads/named-queries/query-payload.DHVLogicalLinkByCircuitId-1.0.json b/aai-traversal/src/test/resources/payloads/named-queries/query-payload.DHVLogicalLinkByCircuitId-1.0.json
new file mode 100644
index 0000000..e16d9be
--- /dev/null
+++ b/aai-traversal/src/test/resources/payloads/named-queries/query-payload.DHVLogicalLinkByCircuitId-1.0.json
@@ -0,0 +1,16 @@
+{
+ "query-parameters": {
+ "named-query": {
+ "named-query-uuid": "4028faed-b7d5-4059-9d49-7df06da9ebfb"
+ }
+ },
+ "instance-filters": {
+ "instance-filter": [
+ {
+ "logical-link": {
+ "circuit-id": "junit-circuit-id"
+ }
+ }
+ ]
+ }
+} \ No newline at end of file
diff --git a/aai-traversal/src/test/resources/payloads/named-queries/query-payload.SvcSubscriberModelInfo-1.0.json b/aai-traversal/src/test/resources/payloads/named-queries/query-payload.SvcSubscriberModelInfo-1.0.json
new file mode 100644
index 0000000..9e39c2f
--- /dev/null
+++ b/aai-traversal/src/test/resources/payloads/named-queries/query-payload.SvcSubscriberModelInfo-1.0.json
@@ -0,0 +1,20 @@
+{
+"instance-filters": {
+"instance-filter": [
+{
+"customer": {
+"global-customer-id": "junit-global-customer-id"
+},
+"service-subscription": {
+"service-type": "junit-service-type"
+}
+
+}
+]
+},
+"query-parameters": {
+"named-query": {
+"named-query-uuid": "6e806bc2-8f9b-4534-bb68-be91267ff6c8"
+}
+}
+} \ No newline at end of file
diff --git a/aai-traversal/src/test/resources/payloads/named-queries/query-payload.closed-loop-named-query-1.0.json b/aai-traversal/src/test/resources/payloads/named-queries/query-payload.closed-loop-named-query-1.0.json
new file mode 100644
index 0000000..2aa3f3a
--- /dev/null
+++ b/aai-traversal/src/test/resources/payloads/named-queries/query-payload.closed-loop-named-query-1.0.json
@@ -0,0 +1,29 @@
+ {
+ "query-parameters": {
+ "named-query": {
+ "named-query-uuid": "4ff56a54-9e3f-46b7-a337-07a1d3c6b469"
+ }
+ },
+ "instance-filters": {
+ "instance-filter": [
+ {
+ "vserver": {
+ "vserver-name": "example-vserver-name-val-closed-loopvserver-closed-loop-junit"
+ }
+ }
+ ]
+ },
+ "secondary-filts": {
+ "secondary-filt": [
+ {
+ "cloud-region": {
+ "cloud-owner": "cloud-owner2-closed-loop-junit"
+ },
+ "cloud-region": {
+ "cloud-region-id": "cloud-region-id2-closed-loop-junit"
+ }
+ }
+ ]
+ },
+ "secondary-filter-cut-point": "cloud-region"
+} \ No newline at end of file
diff --git a/aai-traversal/src/test/resources/payloads/named-queries/tenant.ComponentList-1.2.json b/aai-traversal/src/test/resources/payloads/named-queries/tenant.ComponentList-1.2.json
new file mode 100644
index 0000000..7aeed9e
--- /dev/null
+++ b/aai-traversal/src/test/resources/payloads/named-queries/tenant.ComponentList-1.2.json
@@ -0,0 +1,5 @@
+ {
+ "tenant-id": "tenant-component-list-junit",
+ "tenant-name": "tenant-name-component-list",
+ "relationship-list": {}
+} \ No newline at end of file
diff --git a/aai-traversal/src/test/resources/payloads/named-queries/tenant.closed-loop-named-query-1.0.json b/aai-traversal/src/test/resources/payloads/named-queries/tenant.closed-loop-named-query-1.0.json
new file mode 100644
index 0000000..33b9598
--- /dev/null
+++ b/aai-traversal/src/test/resources/payloads/named-queries/tenant.closed-loop-named-query-1.0.json
@@ -0,0 +1,5 @@
+ {
+ "tenant-id": "tenant-closed-loop-junit",
+ "tenant-name": "tenant-name-closed-loop",
+ "relationship-list": {}
+} \ No newline at end of file
diff --git a/aai-traversal/src/test/resources/payloads/named-queries/tenant2.closed-loop-named-query-1.0.json b/aai-traversal/src/test/resources/payloads/named-queries/tenant2.closed-loop-named-query-1.0.json
new file mode 100644
index 0000000..5fa4d18
--- /dev/null
+++ b/aai-traversal/src/test/resources/payloads/named-queries/tenant2.closed-loop-named-query-1.0.json
@@ -0,0 +1,5 @@
+ {
+ "tenant-id": "tenant2-closed-loop-junit",
+ "tenant-name": "tenant-name2-closed-loop",
+ "relationship-list": {}
+} \ No newline at end of file
diff --git a/aai-traversal/src/test/resources/payloads/named-queries/vf-module.ComponentList-1.2.json b/aai-traversal/src/test/resources/payloads/named-queries/vf-module.ComponentList-1.2.json
new file mode 100644
index 0000000..abc27bc
--- /dev/null
+++ b/aai-traversal/src/test/resources/payloads/named-queries/vf-module.ComponentList-1.2.json
@@ -0,0 +1,6 @@
+ {
+ "vf-module-id": "vf-module-id-component-list-junit",
+ "vf-module-name": "vf-module-name-component-list",
+ "orchestration-status": "orchestration-status-component-list",
+ "is-base-vf-module": true
+ } \ No newline at end of file
diff --git a/aai-traversal/src/test/resources/payloads/named-queries/vserver.ComponentList-1.2.json b/aai-traversal/src/test/resources/payloads/named-queries/vserver.ComponentList-1.2.json
new file mode 100644
index 0000000..edeb2a2
--- /dev/null
+++ b/aai-traversal/src/test/resources/payloads/named-queries/vserver.ComponentList-1.2.json
@@ -0,0 +1,22 @@
+ {
+ "vserver-id": "vserver-id-component-list-junit",
+ "vserver-name": "vserver-name-component-list-junit",
+ "vserver-name2": "vserver-name2-component-list",
+ "prov-status": "prov-status-component-list",
+ "vserver-selflink": "vserver-selflink-component-list",
+ "relationship-list": {
+ "relationship": [{
+ "related-to": "vf-module",
+ "relationship-data": [{
+ "relationship-key": "generic-vnf.vnf-id",
+ "relationship-value": "vnf-id-component-list-junit"
+ },
+ {
+ "relationship-key": "vf-module.vf-module-id",
+ "relationship-value": "vf-module-id-component-list-junit"
+ }
+ ]
+ }
+ ]
+ }
+} \ No newline at end of file
diff --git a/aai-traversal/src/test/resources/payloads/named-queries/vserver.closed-loop-named-query-1.0.json b/aai-traversal/src/test/resources/payloads/named-queries/vserver.closed-loop-named-query-1.0.json
new file mode 100644
index 0000000..f78f3d4
--- /dev/null
+++ b/aai-traversal/src/test/resources/payloads/named-queries/vserver.closed-loop-named-query-1.0.json
@@ -0,0 +1,7 @@
+ {
+ "vserver-id": "vserver-closed-loop-junit",
+ "vserver-name": "example-vserver-name-val-closed-loopvserver-closed-loop-junit",
+ "vserver-name2": "example-vserver-name2-val-closed-loop",
+ "prov-status": "example-prov-status-val-closed-loop",
+ "vserver-selflink": "example-vserver-selflink-val-closed-loop"
+} \ No newline at end of file
diff --git a/aai-traversal/src/test/resources/payloads/named-queries/vserver2.closed-loop-named-query-1.0.json b/aai-traversal/src/test/resources/payloads/named-queries/vserver2.closed-loop-named-query-1.0.json
new file mode 100644
index 0000000..e4e131a
--- /dev/null
+++ b/aai-traversal/src/test/resources/payloads/named-queries/vserver2.closed-loop-named-query-1.0.json
@@ -0,0 +1,7 @@
+ {
+ "vserver-id": "vserver2-closed-loop-junit",
+ "vserver-name": "example-vserver-name-val-closed-loopvserver-closed-loop-junit",
+ "vserver-name2": "example-vserver-name2-val-closed-loop",
+ "prov-status": "example-prov-status-val-closed-loop",
+ "vserver-selflink": "example-vserver-selflink-val-closed-loop"
+} \ No newline at end of file