summaryrefslogtreecommitdiffstats
path: root/models-interactions/model-impl/aai/src
diff options
context:
space:
mode:
authorpramod.jamkhedkar <pramod@research.att.com>2019-04-09 14:40:16 -0400
committerpramod.jamkhedkar <pramod@research.att.com>2019-04-10 17:02:16 -0400
commit38c89e3a57f168603faaf2ad4220105b2d54a9c8 (patch)
tree1f9568e77e9999663c89b7ee88655d0eb386a755 /models-interactions/model-impl/aai/src
parente678e5af567040022f23ed7a1ba1723b82434418 (diff)
Custom Query Code
Changes to aai, so, vfc and restmanager to support aai custom queries. updated to latest version of aai schema. Made changes according to latest updates. Issue-ID: POLICY-1278 Change-Id: I255cef17fff4fe7d4ea21344c0e5ccaac52cbe9a Signed-off-by: pramod.jamkhedkar <pramod@research.att.com>
Diffstat (limited to 'models-interactions/model-impl/aai/src')
-rw-r--r--models-interactions/model-impl/aai/src/main/java/org/onap/policy/aai/AaiCqResponse.java478
-rw-r--r--models-interactions/model-impl/aai/src/main/java/org/onap/policy/aai/AaiManager.java155
-rw-r--r--models-interactions/model-impl/aai/src/test/java/org/onap/policy/aai/AaiCqResponseTest.java278
-rw-r--r--models-interactions/model-impl/aai/src/test/java/org/onap/policy/aai/AaiManagerTest.java61
-rw-r--r--models-interactions/model-impl/aai/src/test/resources/org/onap/policy/aai/AaiCqResponse.json673
-rw-r--r--models-interactions/model-impl/aai/src/test/resources/org/onap/policy/aai/AaiMalformedCqResponse.json3
-rw-r--r--models-interactions/model-impl/aai/src/test/resources/org/onap/policy/aai/AaiTenantResponse.json8
7 files changed, 1652 insertions, 4 deletions
diff --git a/models-interactions/model-impl/aai/src/main/java/org/onap/policy/aai/AaiCqResponse.java b/models-interactions/model-impl/aai/src/main/java/org/onap/policy/aai/AaiCqResponse.java
new file mode 100644
index 000000000..8e9c580f4
--- /dev/null
+++ b/models-interactions/model-impl/aai/src/main/java/org/onap/policy/aai/AaiCqResponse.java
@@ -0,0 +1,478 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *
+ * ================================================================================
+ * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.aai;
+
+import com.google.gson.annotations.SerializedName;
+import java.io.StringReader;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import javax.xml.bind.JAXBContext;
+import javax.xml.bind.JAXBException;
+import javax.xml.bind.Unmarshaller;
+import javax.xml.transform.stream.StreamSource;
+import org.eclipse.persistence.jaxb.JAXBContextFactory;
+import org.eclipse.persistence.jaxb.JAXBContextProperties;
+import org.json.JSONArray;
+import org.json.JSONObject;
+import org.onap.aai.domain.yang.CloudRegion;
+import org.onap.aai.domain.yang.GenericVnf;
+import org.onap.aai.domain.yang.Relationship;
+import org.onap.aai.domain.yang.RelationshipData;
+import org.onap.aai.domain.yang.ServiceInstance;
+import org.onap.aai.domain.yang.Tenant;
+import org.onap.aai.domain.yang.VfModule;
+import org.onap.aai.domain.yang.Vserver;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class AaiCqResponse {
+
+ private static final String GENERIC_VNF = "generic-vnf";
+ private static final String VF_MODULE = "vf-module";
+ private static final Logger LOGGER = LoggerFactory.getLogger(AaiCqResponse.class);
+ private static JAXBContext jaxbContext;
+ private static Unmarshaller unmarshaller;
+
+
+ // JABX initial stuff
+ static {
+ Map<String, Object> properties = new HashMap<>();
+ properties.put(JAXBContextProperties.MEDIA_TYPE, "application/json");
+ properties.put(JAXBContextProperties.JSON_INCLUDE_ROOT, false);
+ // Define JAXB context
+ try {
+ jaxbContext = JAXBContextFactory.createContext(new Class[] {Vserver.class, GenericVnf.class, VfModule.class,
+ CloudRegion.class, ServiceInstance.class, Tenant.class}, properties);
+ unmarshaller = jaxbContext.createUnmarshaller();
+ } catch (JAXBException e) {
+ LOGGER.error("Could not initialize JAXBContext", e);
+ LOGGER.info("Problem initiatlizing JAXBContext", e);
+ }
+ }
+
+ @SerializedName("results")
+ private List<Object> inventoryResponseItems = new LinkedList<>();
+
+
+ /**
+ * Constructor creates a custom query response from a valid json string.
+ *
+ * @param jsonString A&AI Custom Query response JSON string
+ */
+ public AaiCqResponse(String jsonString) {
+
+ // Read JSON String and add all AaiObjects
+ JSONObject responseObj = new JSONObject(jsonString);
+ JSONArray resultsArray = new JSONArray();
+ if (responseObj.has("results")) {
+ resultsArray = (JSONArray) responseObj.get("results");
+ }
+ for (int i = 0; i < resultsArray.length(); i++) {
+ // Object is a vserver
+ if (resultsArray.getJSONObject(i).has("vserver")) {
+
+ // Create the StreamSource by creating StringReader using the
+ // JSON input
+ StreamSource json = new StreamSource(
+ new StringReader(resultsArray.getJSONObject(i).getJSONObject("vserver").toString()));
+
+ // Getting the vserver pojo again from the json
+ Vserver vserver = this.getAaiObject(json, Vserver.class);
+ this.inventoryResponseItems.add(vserver);
+ }
+
+ // Object is a Generic VNF
+ if (resultsArray.getJSONObject(i).has(GENERIC_VNF)) {
+ // Create the StreamSource by creating StringReader using the
+ // JSON input
+ StreamSource json = new StreamSource(
+ new StringReader(resultsArray.getJSONObject(i).getJSONObject(GENERIC_VNF).toString()));
+
+ // Getting the generic vnf pojo again from the json
+ GenericVnf genericVnf = this.getAaiObject(json, GenericVnf.class);
+
+ this.inventoryResponseItems.add(genericVnf);
+ }
+
+ // Object is a Service Instance
+ if (resultsArray.getJSONObject(i).has("service-instance")) {
+
+ // Create the StreamSource by creating StringReader using the
+ // JSON input
+ StreamSource json = new StreamSource(
+ new StringReader(resultsArray.getJSONObject(i).getJSONObject("service-instance").toString()));
+
+ // Getting the employee pojo again from the json
+ ServiceInstance serviceInstance = this.getAaiObject(json, ServiceInstance.class);
+
+ this.inventoryResponseItems.add(serviceInstance);
+ }
+
+ // Object is a VF Module
+ if (resultsArray.getJSONObject(i).has(VF_MODULE)) {
+ // Create the StreamSource by creating StringReader using the
+ // JSON input
+ StreamSource json = new StreamSource(
+ new StringReader(resultsArray.getJSONObject(i).getJSONObject(VF_MODULE).toString()));
+
+ // Getting the vf module pojo again from the json
+ VfModule vfModule = this.getAaiObject(json, VfModule.class);
+
+ this.inventoryResponseItems.add(vfModule);
+ }
+
+ // Object is a CloudRegion
+ if (resultsArray.getJSONObject(i).has("cloud-region")) {
+ // Create the StreamSource by creating StringReader using the
+ // JSON input
+ StreamSource json = new StreamSource(
+ new StringReader(resultsArray.getJSONObject(i).getJSONObject("cloud-region").toString()));
+
+ // Getting the cloud region pojo again from the json
+ CloudRegion cloudRegion = this.getAaiObject(json, CloudRegion.class);
+
+ this.inventoryResponseItems.add(cloudRegion);
+ }
+
+ // Object is a Tenant
+ if (resultsArray.getJSONObject(i).has("tenant")) {
+ // Create the StreamSource by creating StringReader using the
+ // JSON input
+ StreamSource json = new StreamSource(
+ new StringReader(resultsArray.getJSONObject(i).getJSONObject("tenant").toString()));
+
+ // Getting the tenant pojo again from the json
+ Tenant tenant = this.getAaiObject(json, Tenant.class);
+
+ this.inventoryResponseItems.add(tenant);
+ }
+
+ }
+
+
+
+ }
+
+
+
+ private <T> T getAaiObject(StreamSource json, final Class<T> classOfResponse) {
+ try {
+ return unmarshaller.unmarshal(json, classOfResponse).getValue();
+ } catch (JAXBException e) {
+ LOGGER.error("JAXBCOntext error", e);
+ return null;
+ }
+ }
+
+ public List<Object> getInventoryResponseItems() {
+ return inventoryResponseItems;
+ }
+
+ public void setInventoryResponseItems(List<Object> inventoryResponseItems) {
+ this.inventoryResponseItems = inventoryResponseItems;
+ }
+
+ /**
+ * Get list of A&AI objects in the custom query.
+ *
+ * @param classOfResponse Class of the type of A&AI objects to be returned
+ * @return List A&AI objects matching the class
+ */
+ @SuppressWarnings("unchecked")
+ public <T> List<T> getItemListByType(Class<T> classOfResponse) {
+ List<T> returnItemList = new ArrayList<>();
+ for (Object i : this.inventoryResponseItems) {
+ if (i.getClass() == classOfResponse) {
+ returnItemList.add((T) i);
+ }
+ }
+ return returnItemList;
+
+ }
+
+ /**
+ * Get Service Instance.
+ *
+ * @return Service Instance
+ */
+ public ServiceInstance getServiceInstance() {
+ ServiceInstance serviceInstance = null;
+ for (Object i : this.inventoryResponseItems) {
+ if (i.getClass() == ServiceInstance.class) {
+ serviceInstance = (ServiceInstance) i;
+ }
+ }
+ return serviceInstance;
+
+ }
+
+ /**
+ * Get Tenant.
+ *
+ * @return Tenant
+ */
+ public Tenant getDefaultTenant() {
+ Tenant tenant = null;
+ for (Object i : this.inventoryResponseItems) {
+ if (i.getClass() == Tenant.class) {
+ tenant = (Tenant) i;
+ }
+ }
+ return tenant;
+
+ }
+
+ /**
+ * Get Cloud Region.
+ *
+ * @return Cloud Region
+ */
+ public CloudRegion getDefaultCloudRegion() {
+ CloudRegion cloudRegion = null;
+ for (Object i : this.inventoryResponseItems) {
+ if (i.getClass() == CloudRegion.class) {
+ cloudRegion = (CloudRegion) i;
+ }
+ }
+ return cloudRegion;
+
+ }
+
+ /**
+ * Get Generic Vnfs in the custom query.
+ *
+ * @return List of generic Vnf
+ */
+ public List<GenericVnf> getGenericVnfs() {
+ List<GenericVnf> genericVnfList = new ArrayList<>();
+ for (Object i : this.inventoryResponseItems) {
+ if (i.getClass() == GenericVnf.class) {
+ genericVnfList.add((GenericVnf) i);
+ }
+ }
+ return genericVnfList;
+
+ }
+
+
+ /**
+ * Returns a generic Vnf matching vnf name.
+ *
+ * @param vnfName Name of the vnf to match
+ * @return generic Vnf
+ */
+ public GenericVnf getGenericVnfByVnfName(String vnfName) {
+ List<GenericVnf> genericVnfList = new ArrayList<>();
+ GenericVnf genericVnf = null;
+ for (Object i : this.inventoryResponseItems) {
+ if (i.getClass() == GenericVnf.class) {
+ genericVnfList.add((GenericVnf) i);
+ }
+ }
+
+ for (GenericVnf genVnf : genericVnfList) {
+ if (vnfName.equals(genVnf.getVnfName())) {
+ genericVnf = genVnf;
+ }
+
+ }
+ return genericVnf;
+
+ }
+
+ /**
+ * Returns a generic Vnf matching model invariant ID.
+ *
+ * @param modelInvariantId Name of the vnf to match
+ * @return generic Vnf
+ */
+ public GenericVnf getGenericVnfByModelInvariantId(String modelInvariantId) {
+ List<GenericVnf> genericVnfList = new ArrayList<>();
+ GenericVnf genericVnf = null;
+ for (Object i : this.inventoryResponseItems) {
+ if (i.getClass() == GenericVnf.class) {
+ genericVnfList.add((GenericVnf) i);
+ }
+ }
+
+ for (GenericVnf genVnf : genericVnfList) {
+ if (modelInvariantId.equals(genVnf.getModelInvariantId())) {
+ genericVnf = genVnf;
+ }
+
+ }
+ return genericVnf;
+
+ }
+
+
+
+ /**
+ * Get the generic vnf associated with the vserver in the custom query.
+ *
+ * @return Generic VNF
+ */
+ public GenericVnf getDefaultGenericVnf() {
+ GenericVnf genericVnf = null;
+
+ // Get the vserver associated with the query
+ Vserver vserver = this.getVserver();
+
+ // Get the relationships of the vserver
+ List<Relationship> relations = vserver.getRelationshipList().getRelationship();
+
+ // Find the relationship of the genericVNF
+ String genericVnfId = "";
+ List<RelationshipData> relationshipData = null;
+
+ // Iterate through the list of relationships and get generic vnf relationship data
+ for (Relationship r : relations) {
+ // Get the name of generic-vnf related to this server
+ if (GENERIC_VNF.equals(r.getRelatedTo())) {
+ relationshipData = r.getRelationshipData();
+ }
+ }
+
+ // Iterate through relationship data, and get vnf-id
+ for (RelationshipData rd : relationshipData) {
+ // Get the id of the generic-vnf
+ if ("generic-vnf.vnf-id".equals(rd.getRelationshipKey())) {
+ genericVnfId = rd.getRelationshipValue();
+ }
+ }
+
+ // Get the list of generic vnfs
+ List<GenericVnf> genericVnfList = this.getGenericVnfs();
+
+ for (GenericVnf genVnf : genericVnfList) {
+ if (genericVnfId.equals(genVnf.getVnfId())) {
+ genericVnf = genVnf;
+ }
+ }
+
+ return genericVnf;
+ }
+
+
+ /**
+ * Get Vf Module associated with the vserver in the custom query.
+ *
+ * @return Vf Module
+ */
+ public VfModule getDefaultVfModule() {
+ GenericVnf genericVnf = null;
+ VfModule vfModule = null;
+
+ // Get the vserver associated with the query
+ Vserver vserver = this.getVserver();
+
+ // Get the relationships of the vserver
+ List<Relationship> relations = vserver.getRelationshipList().getRelationship();
+
+ // Find the relationship of VfModule
+ String vfModuleId = "";
+ List<RelationshipData> relationshipData = null;
+
+ // Iterate through the list of relationships and get vf module relationship data
+ for (Relationship r : relations) {
+ // Get relationship data of vfmodule related to this server
+ if (VF_MODULE.equals(r.getRelatedTo())) {
+ relationshipData = r.getRelationshipData();
+ }
+ }
+
+ // Iterate through relationship data, and get vf-module-id
+ for (RelationshipData rd : relationshipData) {
+ // Get the id of the vf-module
+ if ("vf-module.vf-module-id".equals(rd.getRelationshipKey())) {
+ vfModuleId = rd.getRelationshipValue();
+ }
+ }
+
+ // Get the generic VNF associated with this vserver query
+ genericVnf = this.getDefaultGenericVnf();
+
+ // Get the list of VFmodules associated with this generic Vnf
+ List<VfModule> vfModuleList = genericVnf.getVfModules().getVfModule();
+
+ for (VfModule vfMod : vfModuleList) {
+ if (vfModuleId.equals(vfMod.getVfModuleId())) {
+ vfModule = vfMod;
+ }
+ }
+
+ return vfModule;
+ }
+
+
+ /**
+ * Get vf modules in the custom query.
+ *
+ * @return List of VfModule
+ */
+ public List<VfModule> getAllVfModules() {
+ List<VfModule> vfModuleList = new ArrayList<>();
+
+ for (GenericVnf genVnf : this.getGenericVnfs()) {
+ vfModuleList.addAll(genVnf.getVfModules().getVfModule());
+ }
+ return vfModuleList;
+
+ }
+
+ /**
+ * Get Vf Module matching a specific VF module name.
+ *
+ * @return VfModule
+ */
+ public VfModule getVfModuleByVfModuleName(String vfModuleName) {
+ VfModule vfModule = null;
+
+ for (VfModule vfMod : this.getAllVfModules()) {
+ if (vfModuleName.equals(vfMod.getVfModuleName())) {
+ vfModule = vfMod;
+ }
+
+ }
+ return vfModule;
+ }
+
+ /**
+ * Get verver in the custom query.
+ *
+ * @return Vserver
+ */
+ public Vserver getVserver() {
+ Vserver vserver = null;
+ int index = 0;
+ while (this.inventoryResponseItems.get(index).getClass() != Vserver.class) {
+ index = index + 1;
+ }
+ vserver = (Vserver) this.inventoryResponseItems.get(index);
+ return vserver;
+
+ }
+
+}
+
diff --git a/models-interactions/model-impl/aai/src/main/java/org/onap/policy/aai/AaiManager.java b/models-interactions/model-impl/aai/src/main/java/org/onap/policy/aai/AaiManager.java
index bb772e6ca..f50f0cb9f 100644
--- a/models-interactions/model-impl/aai/src/main/java/org/onap/policy/aai/AaiManager.java
+++ b/models-interactions/model-impl/aai/src/main/java/org/onap/policy/aai/AaiManager.java
@@ -23,11 +23,11 @@
package org.onap.policy.aai;
import com.google.gson.JsonSyntaxException;
-
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
-
+import org.json.JSONArray;
+import org.json.JSONObject;
import org.onap.policy.aai.util.Serialization;
import org.onap.policy.common.endpoints.event.comm.Topic.CommInfrastructure;
import org.onap.policy.common.endpoints.utils.NetLoggerUtil;
@@ -49,6 +49,12 @@ public final class AaiManager {
// The REST manager used for processing REST calls for this AAI manager
private final RestManager restManager;
+ /** custom query URLs. */
+ private static String cqUrl = "/aai/v16/query?format=resource";
+ private static String tenantUrl = "/aai/v16/search/nodes-query?search-node-type=vserver&filter=vserver-name:";
+ private static String prefix = "/aai/v16";
+
+
/**
* Constructor, create the AAI manager with the specified REST manager.
*
@@ -59,6 +65,151 @@ public final class AaiManager {
}
/**
+ * Creates the custom query payload from a tenant query response.
+ *
+ * @param getResponse response from the tenant query
+ * @return String Payload
+ */
+ private String createCustomQueryPayload(String getResponse) {
+
+ if (getResponse == null) {
+ return null;
+ } else {
+ JSONObject responseObj = new JSONObject(getResponse);
+ JSONArray resultsArray = new JSONArray();
+ if (responseObj.has("result-data")) {
+ resultsArray = (JSONArray) responseObj.get("result-data");
+ } else {
+ return null;
+ }
+ String resourceLink = resultsArray.getJSONObject(0).getString("resource-link");
+ String start = resourceLink.replace(prefix, "");
+ String query = "query/closed-loop";
+ JSONObject payload = new JSONObject();
+ payload.put("start", start);
+ payload.put("query", query);
+ return payload.toString();
+
+ }
+ }
+
+
+ /**
+ * This method is used to get the information for custom query.
+ *
+ * @param url url of the get method
+ * @param username Aai username
+ * @param password Aai password
+ * @param requestId request ID
+ * @param vserver Id of the vserver
+ * @return String
+ */
+ private String getCustomQueryRequestPayload(String url, String username, String password, UUID requestId,
+ String vserver) {
+
+ String urlGet = url + tenantUrl;
+ String getResponse = getStringQuery(urlGet, username, password, requestId, vserver);
+ return createCustomQueryPayload(getResponse);
+ }
+
+
+
+ /**
+ * Calls Aai and returns a custom query response for a vserver.
+ *
+ * @param url Aai url
+ * @param username Aai Username
+ * @param password Aai Password
+ * @param requestId request ID
+ * @param vserver Vserver
+ * @return AaiCqResponse response from Aai for custom query
+ */
+ public AaiCqResponse getCustomQueryResponse(String url, String username, String password, UUID requestId,
+ String vserver) {
+
+ final Map<String, String> headers = createHeaders(requestId);
+
+ url = url + cqUrl;
+
+ logger.debug("RestManager.put before");
+ String requestJson = getCustomQueryRequestPayload(url, username, password, requestId, vserver);
+ NetLoggerUtil.log(EventType.OUT, CommInfrastructure.REST, url, requestJson);
+ Pair<Integer, String> httpDetails =
+ this.restManager.put(url, username, password, headers, "application/json", requestJson);
+ logger.debug("RestManager.put after");
+
+ if (httpDetails == null) {
+ logger.info("AAI POST Null Response to {}", url);
+ return null;
+ }
+
+ int httpResponseCode = httpDetails.first;
+
+ logger.info(url);
+ logger.info("{}", httpResponseCode);
+ logger.info(httpDetails.second);
+
+ if (httpDetails.second != null) {
+ String resp = httpDetails.second;
+ return new AaiCqResponse(resp);
+ }
+ return null;
+ }
+
+
+
+ /**
+ * Returns the string response of a get query.
+ *
+ * @param url Aai URL
+ * @param username Aai Username
+ * @param password Aai Password
+ * @param requestId AaiRequestId
+ * @param key Aai Key
+ * @return String returns the string from the get query
+ */
+ private String getStringQuery(final String url, final String username, final String password, final UUID requestId,
+ final String key) {
+
+ Map<String, String> headers = createHeaders(requestId);
+
+ String urlGet = url + key;
+
+ int attemptsLeft = 3;
+
+ while (attemptsLeft-- > 0) {
+ NetLoggerUtil.getNetworkLogger().info("[OUT|{}|{}|]", CommInfrastructure.REST, urlGet);
+ Pair<Integer, String> httpDetailsGet = restManager.get(urlGet, username, password, headers);
+ if (httpDetailsGet == null) {
+ logger.info("AAI GET Null Response to {}", urlGet);
+ return null;
+ }
+
+ int httpResponseCode = httpDetailsGet.first;
+
+ logger.info(urlGet);
+ logger.info("{}", httpResponseCode);
+ logger.info(httpDetailsGet.second);
+
+ if (httpResponseCode == 200) {
+ String responseGet = httpDetailsGet.second;
+ if (responseGet != null) {
+ return responseGet;
+ }
+ }
+ try {
+ Thread.sleep(1000);
+ } catch (InterruptedException e) {
+ Thread.currentThread().interrupt();
+ }
+
+ }
+
+ return null;
+ }
+
+
+ /**
* Post a query to A&AI.
*
* @param url the A&AI URL
diff --git a/models-interactions/model-impl/aai/src/test/java/org/onap/policy/aai/AaiCqResponseTest.java b/models-interactions/model-impl/aai/src/test/java/org/onap/policy/aai/AaiCqResponseTest.java
new file mode 100644
index 000000000..bfa0a5a4c
--- /dev/null
+++ b/models-interactions/model-impl/aai/src/test/java/org/onap/policy/aai/AaiCqResponseTest.java
@@ -0,0 +1,278 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *
+ * ================================================================================
+ * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.aai;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+
+import java.io.File;
+import java.nio.file.Files;
+import java.util.ArrayList;
+import java.util.List;
+import org.junit.Test;
+import org.onap.aai.domain.yang.CloudRegion;
+import org.onap.aai.domain.yang.GenericVnf;
+import org.onap.aai.domain.yang.ServiceInstance;
+import org.onap.aai.domain.yang.Tenant;
+import org.onap.aai.domain.yang.VfModule;
+import org.onap.aai.domain.yang.Vserver;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class AaiCqResponseTest {
+ private static final Logger LOGGER = LoggerFactory.getLogger(AaiCqResponseTest.class);
+ private static final String CQ_RESPONSE_SAMPLE = "src/test/resources/org/onap/policy/aai/AaiCqResponse.json";
+
+
+ @Test
+ public void testConstructor() throws Exception {
+ /*
+ * Read JSON String and add all AaiObjects
+ */
+
+ String responseString = "";
+ responseString = new String(Files.readAllBytes(new File(CQ_RESPONSE_SAMPLE).toPath()));
+
+ AaiCqResponse aaiCqResponse;
+ aaiCqResponse = new AaiCqResponse(responseString);
+ assertNotNull(aaiCqResponse);
+ assertNotNull(aaiCqResponse.getInventoryResponseItems());
+ }
+
+ @Test
+ public void testAaiMalformedCqResponse() throws Exception {
+ /*
+ * Read JSON String and add all AaiObjects
+ */
+
+ String responseString = "";
+ responseString = new String(Files
+ .readAllBytes(new File("src/test/resources/org/onap/policy/aai/AaiMalformedCqResponse.json").toPath()));
+
+ AaiCqResponse aaiCqResponse;
+ aaiCqResponse = new AaiCqResponse(responseString);
+ for (Object aaiObj : aaiCqResponse.getInventoryResponseItems()) {
+ assertNull(aaiObj);
+ }
+
+
+ }
+
+ @Test
+ public void testGetItemByList() throws Exception {
+ /*
+ * Read JSON String and add all AaiObjects
+ */
+
+ String responseString = "";
+ responseString = new String(Files.readAllBytes(new File(CQ_RESPONSE_SAMPLE).toPath()));
+
+ AaiCqResponse aaiCqResponse;
+ aaiCqResponse = new AaiCqResponse(responseString);
+ ArrayList<Vserver> vs = (ArrayList<Vserver>) aaiCqResponse.getItemListByType(Vserver.class);
+ assertNotNull(vs);
+ assertEquals("e7f1db09-ff78-44fc-b256-69095c5556fb", vs.get(0).getVserverId());
+ LOGGER.info(vs.get(0).getVserverId());
+
+ }
+
+ @Test
+ public void testGetServiceInstance() throws Exception {
+
+ String responseString = "";
+ responseString = new String(Files.readAllBytes(new File(CQ_RESPONSE_SAMPLE).toPath()));
+
+ AaiCqResponse aaiCqResponse;
+ aaiCqResponse = new AaiCqResponse(responseString);
+ ServiceInstance si = aaiCqResponse.getServiceInstance();
+ assertNotNull(si);
+ assertEquals("vLoadBalancerMS-0211-1", si.getServiceInstanceName());
+ LOGGER.info(si.getServiceInstanceName());
+ }
+
+ @Test
+ public void testGetDefaultCloudRegion() throws Exception {
+
+ String responseString = "";
+ responseString = new String(Files.readAllBytes(new File(CQ_RESPONSE_SAMPLE).toPath()));
+
+ AaiCqResponse aaiCqResponse;
+ aaiCqResponse = new AaiCqResponse(responseString);
+ CloudRegion cloudRegion = aaiCqResponse.getDefaultCloudRegion();
+ assertNotNull(cloudRegion);
+ assertEquals("cr-16197-01-as988q", cloudRegion.getCloudRegionId());
+ LOGGER.info(cloudRegion.getCloudRegionId());
+ }
+
+ @Test
+ public void testGetDefaultTenant() throws Exception {
+
+ String responseString = "";
+ responseString = new String(Files.readAllBytes(new File(CQ_RESPONSE_SAMPLE).toPath()));
+
+ AaiCqResponse aaiCqResponse;
+ aaiCqResponse = new AaiCqResponse(responseString);
+ Tenant tenant = aaiCqResponse.getDefaultTenant();
+ assertNotNull(tenant);
+ assertEquals("tenant1-16197-as988q", tenant.getTenantId());
+ LOGGER.info(tenant.getTenantId());
+ }
+
+
+
+ @Test
+ public void testGetGenericVnfs() throws Exception {
+
+ String responseString = "";
+ responseString = new String(Files.readAllBytes(new File(CQ_RESPONSE_SAMPLE).toPath()));
+
+ AaiCqResponse aaiCqResponse;
+ aaiCqResponse = new AaiCqResponse(responseString);
+ List<GenericVnf> genericVnfList = aaiCqResponse.getGenericVnfs();
+ assertNotNull(genericVnfList);
+ for (GenericVnf genVnf : genericVnfList) {
+ LOGGER.info(genVnf.getVnfName());
+ }
+
+ }
+
+
+
+ @Test
+ public void testGetDefaultGenericVnf() throws Exception {
+
+ String responseString = "";
+ responseString = new String(Files.readAllBytes(new File(CQ_RESPONSE_SAMPLE).toPath()));
+
+ AaiCqResponse aaiCqResponse;
+ aaiCqResponse = new AaiCqResponse(responseString);
+ GenericVnf genVnf = aaiCqResponse.getDefaultGenericVnf();
+ assertNotNull(genVnf);
+ assertEquals("TestVM-Vnf-0201-1", genVnf.getVnfName());
+ LOGGER.info(genVnf.getVnfName());
+
+ }
+
+ @Test
+ public void testGetGenericVnfByName() throws Exception {
+
+ String responseString = "";
+ responseString = new String(Files.readAllBytes(new File(CQ_RESPONSE_SAMPLE).toPath()));
+
+ AaiCqResponse aaiCqResponse;
+ aaiCqResponse = new AaiCqResponse(responseString);
+ GenericVnf genVnf = aaiCqResponse.getGenericVnfByVnfName("TestVM-Vnf-0201-1");
+ assertNotNull(genVnf);
+ assertEquals("17044ef4-e7f3-46a1-af03-e2aa562f23ac", genVnf.getVnfId());
+ LOGGER.info(genVnf.getVnfId());
+ }
+
+
+ @Test
+ public void testGetGenericVnfByModelInvariantId() throws Exception {
+
+ String responseString = "";
+ responseString = new String(Files.readAllBytes(new File(CQ_RESPONSE_SAMPLE).toPath()));
+
+ AaiCqResponse aaiCqResponse;
+ aaiCqResponse = new AaiCqResponse(responseString);
+ GenericVnf genVnf = aaiCqResponse.getGenericVnfByModelInvariantId("724ab1cf-6120-49e8-b909-849963bed1d6");
+ assertNotNull(genVnf);
+ assertEquals("724ab1cf-6120-49e8-b909-849963bed1d6", genVnf.getModelInvariantId());
+ LOGGER.info(genVnf.getModelInvariantId());
+ }
+
+ @Test
+ public void testGetAllVfModules() throws Exception {
+
+ String responseString = "";
+ responseString = new String(Files.readAllBytes(new File(CQ_RESPONSE_SAMPLE).toPath()));
+
+ AaiCqResponse aaiCqResponse;
+ aaiCqResponse = new AaiCqResponse(responseString);
+ List<VfModule> vfModuleList = aaiCqResponse.getAllVfModules();
+ assertNotNull(vfModuleList);
+ for (VfModule vfMod : vfModuleList) {
+ LOGGER.info(vfMod.getVfModuleName());
+ }
+
+ }
+
+
+ @Test
+ public void testGetVfModuleByVfModuleName() throws Exception {
+
+ String responseString = "";
+ responseString = new String(Files.readAllBytes(new File(CQ_RESPONSE_SAMPLE).toPath()));
+
+ AaiCqResponse aaiCqResponse;
+ aaiCqResponse = new AaiCqResponse(responseString);
+ VfModule vfModule = aaiCqResponse.getVfModuleByVfModuleName("vLoadBalancerMS-0211-1");
+ assertNotNull(vfModule);
+ assertEquals("vLoadBalancerMS-0211-1", vfModule.getVfModuleName());
+ LOGGER.info(vfModule.getVfModuleName());
+
+
+ }
+
+ @Test
+ public void testGetDefaultVfModule() throws Exception {
+
+ String responseString = "";
+ responseString = new String(Files.readAllBytes(new File(CQ_RESPONSE_SAMPLE).toPath()));
+
+ AaiCqResponse aaiCqResponse;
+ aaiCqResponse = new AaiCqResponse(responseString);
+ VfModule vfModule = aaiCqResponse.getDefaultVfModule();
+ assertNotNull(vfModule);
+ assertEquals("TestVM-0201-2", vfModule.getVfModuleName());
+ LOGGER.info(vfModule.getVfModuleName());
+ }
+
+ @Test
+ public void testGetVserver() throws Exception {
+
+ String responseString = "";
+ responseString = new String(Files.readAllBytes(new File(CQ_RESPONSE_SAMPLE).toPath()));
+
+ AaiCqResponse aaiCqResponse;
+ aaiCqResponse = new AaiCqResponse(responseString);
+ Vserver vserver = aaiCqResponse.getVserver();
+ assertNotNull(vserver);
+ assertEquals("vfw-vm-0201-2", vserver.getVserverName());
+ LOGGER.info(vserver.getVserverName());
+
+ }
+
+ /**
+ * Aai Cq sample response.
+ *
+ * @return String return response
+ * @throws Exception file read exception
+ */
+ public String getAaiCqResponse() throws Exception {
+ String responseString = "";
+ responseString = new String(Files.readAllBytes(new File(CQ_RESPONSE_SAMPLE).toPath()));
+ return responseString;
+ }
+
+}
diff --git a/models-interactions/model-impl/aai/src/test/java/org/onap/policy/aai/AaiManagerTest.java b/models-interactions/model-impl/aai/src/test/java/org/onap/policy/aai/AaiManagerTest.java
index 111042f6d..c453d89a1 100644
--- a/models-interactions/model-impl/aai/src/test/java/org/onap/policy/aai/AaiManagerTest.java
+++ b/models-interactions/model-impl/aai/src/test/java/org/onap/policy/aai/AaiManagerTest.java
@@ -31,10 +31,12 @@ import static org.mockito.ArgumentMatchers.startsWith;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
-
import org.junit.Before;
import org.junit.Test;
import org.onap.policy.aai.util.Serialization;
@@ -48,12 +50,18 @@ public class AaiManagerTest {
Pair<Integer, String> httpResponseErr0;
Pair<Integer, String> httpResponseErr1;
Pair<Integer, String> httpResponseWait;
+ Pair<Integer, String> httpTenantResponseOk;
+ Pair<Integer, String> httpCqResponseOk;
+
+ private static final String TENANT_RESPONSE_SAMPLE =
+ "src/test/resources/org/onap/policy/aai/AaiTenantResponse.json";
/**
* Set up test cases.
+ * @throws Exception if error occurs
*/
@Before
- public void beforeTestAaiManager() {
+ public void beforeTestAaiManager() throws Exception {
restManagerMock = mock(RestManager.class);
Map<String, String> expectedHeaders = new HashMap<>();
@@ -61,6 +69,10 @@ public class AaiManagerTest {
expectedHeaders.put("X-TransactionId", aaiNqRequestUuid.toString());
expectedHeaders.put("Accept", "application/json");
+ String aaiCqResponse = new AaiCqResponseTest().getAaiCqResponse();
+ String tenantResponse = this.getTenantQueryResponse();
+ httpCqResponseOk = restManagerMock.new Pair<>(200, aaiCqResponse);
+ httpTenantResponseOk = restManagerMock.new Pair<>(200, tenantResponse);
AaiNqResponse aaiNqResponse = new AaiNqResponseTest().getAaiNqResponse();
httpResponseOk = restManagerMock.new Pair<>(200, Serialization.gsonPretty.toJson(aaiNqResponse));
httpResponseErr0 = restManagerMock.new Pair<>(200, null);
@@ -69,6 +81,51 @@ public class AaiManagerTest {
}
@Test
+ public void testAaiCqResponse() {
+ AaiManager aaiManager = new AaiManager(restManagerMock);
+ assertNotNull(aaiManager);
+
+ UUID vserverNameRequestId = UUID.randomUUID();
+
+ when(restManagerMock.put(startsWith("http://testing.cq.query"), eq("Foo"), eq("Bar"), anyMap(), anyString(),
+ anyString())).thenReturn(httpCqResponseOk);
+
+ when(restManagerMock.get(startsWith("http://testing.cq.query"), eq("Foo"), eq("Bar"), anyMap()))
+ .thenReturn(httpTenantResponseOk);
+
+ AaiCqResponse aaiCqResponse =
+ aaiManager.getCustomQueryResponse("http://testing.cq.query", "Foo", "Bar", vserverNameRequestId, "Foo");
+ assertNotNull(aaiCqResponse);
+
+ when(restManagerMock.put(eq(""), eq("Foo"), eq("Bar"), anyMap(), anyString(), anyString()))
+ .thenReturn(httpResponseErr0);
+
+ when(restManagerMock.get(eq("/aai/v11/query?format=resource"), eq("Foo"), eq("Bar"), anyMap()))
+ .thenReturn(httpResponseErr0);
+
+ AaiCqResponse aaiCqResponseNull =
+ aaiManager.getCustomQueryResponse("", "Foo", "Bar", vserverNameRequestId, "Foo");
+ assertNull(aaiCqResponseNull);
+
+
+ when(restManagerMock.put(eq("Error"), eq("Foo"), eq("Bar"), anyMap(), anyString(), anyString()))
+ .thenReturn(httpResponseErr1);
+
+ when(restManagerMock.get(eq("Error/aai/v11/query?format=resource"), eq("Foo"), eq("Bar"), anyMap()))
+ .thenReturn(httpResponseErr1);
+
+ AaiCqResponse aaiCqResponseErr =
+ aaiManager.getCustomQueryResponse("Error", "Foo", "Bar", vserverNameRequestId, "Foo");
+ assertNull(aaiCqResponseErr);
+ }
+
+ private String getTenantQueryResponse() throws IOException {
+ String responseString = "";
+ responseString = new String(Files.readAllBytes(new File(TENANT_RESPONSE_SAMPLE).toPath()));
+ return responseString;
+ }
+
+ @Test
public void testAaiManagerAaiNqRequest() {
AaiManager aaiManager = new AaiManager(restManagerMock);
diff --git a/models-interactions/model-impl/aai/src/test/resources/org/onap/policy/aai/AaiCqResponse.json b/models-interactions/model-impl/aai/src/test/resources/org/onap/policy/aai/AaiCqResponse.json
new file mode 100644
index 000000000..63d6f79ac
--- /dev/null
+++ b/models-interactions/model-impl/aai/src/test/resources/org/onap/policy/aai/AaiCqResponse.json
@@ -0,0 +1,673 @@
+{
+ "results": [
+ {
+ "vserver": {
+ "vserver-id": "e7f1db09-ff78-44fc-b256-69095c5556fb",
+ "vserver-name": "vfw-vm-0201-2",
+ "vserver-name2": "vfw-vm-0201-2",
+ "prov-status": "ACTIVE",
+ "vserver-selflink": "http://ecompctl1.research.att.com:8774/v2/3f2aaef74ecb4b19b35e26d0849fe9a2/servers/e7f1db09-ff78-44fc-b256-69095c5556fb",
+ "in-maint": false,
+ "is-closed-loop-disabled": false,
+ "resource-version": "1549553422524",
+ "relationship-list": {
+ "relationship": [
+ {
+ "related-to": "generic-vnf",
+ "related-link": "/aai/v11/network/generic-vnfs/generic-vnf/17044ef4-e7f3-46a1-af03-e2aa562f23ac",
+ "relationship-data": [
+ {
+ "relationship-key": "generic-vnf.vnf-id",
+ "relationship-value": "17044ef4-e7f3-46a1-af03-e2aa562f23ac"
+ }
+ ],
+ "related-to-property": [
+ {
+ "property-key": "generic-vnf.vnf-name",
+ "property-value": "TestVM-Vnf-0201-1"
+ }
+ ]
+ },
+ {
+ "related-to": "vnfc",
+ "related-link": "/aai/v11/network/vnfcs/vnfc/vfw",
+ "relationship-data": [
+ {
+ "relationship-key": "vnfc.vnfc-name",
+ "relationship-value": "vfw"
+ }
+ ]
+ },
+ {
+ "related-to": "vf-module",
+ "related-link": "/aai/v11/network/generic-vnfs/generic-vnf/17044ef4-e7f3-46a1-af03-e2aa562f23ac/vf-modules/vf-module/33f9e03d-2fbd-4e9c-8e73-ce6b12f0b3d2",
+ "relationship-data": [
+ {
+ "relationship-key": "generic-vnf.vnf-id",
+ "relationship-value": "17044ef4-e7f3-46a1-af03-e2aa562f23ac"
+ },
+ {
+ "relationship-key": "vf-module.vf-module-id",
+ "relationship-value": "33f9e03d-2fbd-4e9c-8e73-ce6b12f0b3d2"
+ }
+ ]
+ },
+ {
+ "related-to": "flavor",
+ "related-link": "/aai/v11/cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/flavors/flavor/2",
+ "relationship-data": [
+ {
+ "relationship-key": "cloud-region.cloud-owner",
+ "relationship-value": "CloudOwner"
+ },
+ {
+ "relationship-key": "cloud-region.cloud-region-id",
+ "relationship-value": "RegionOne"
+ },
+ {
+ "relationship-key": "flavor.flavor-id",
+ "relationship-value": "2"
+ }
+ ],
+ "related-to-property": [
+ {
+ "property-key": "flavor.flavor-name",
+ "property-value": "m1.small"
+ }
+ ]
+ },
+ {
+ "related-to": "image",
+ "related-link": "/aai/v11/cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/images/image/84be7136-301f-4f47-9585-3a2e0f9534af",
+ "relationship-data": [
+ {
+ "relationship-key": "cloud-region.cloud-owner",
+ "relationship-value": "CloudOwner"
+ },
+ {
+ "relationship-key": "cloud-region.cloud-region-id",
+ "relationship-value": "RegionOne"
+ },
+ {
+ "relationship-key": "image.image-id",
+ "relationship-value": "84be7136-301f-4f47-9585-3a2e0f9534af"
+ }
+ ],
+ "related-to-property": [
+ {
+ "property-key": "image.image-name",
+ "property-value": "unknown"
+ }
+ ]
+ }
+ ]
+ }
+ }
+ },
+ {
+ "generic-vnf": {
+ "vnf-id": "7b202620-2936-4b0d-b09c-60b411f10f64",
+ "vnf-name": "vLoadBalancerMS-Vnf-0211-1",
+ "vnf-type": "vLoadBalancerMS/vLoadBalancerMS 0",
+ "prov-status": "ACTIVE",
+ "equipment-role": "vLB",
+ "orchestration-status": "Active",
+ "ipv4-oam-address": "10.0.150.1",
+ "in-maint": true,
+ "is-closed-loop-disabled": false,
+ "resource-version": "1552311656338",
+ "model-invariant-id": "724ab1cf-6120-49e8-b909-849963bed1d6",
+ "model-version-id": "9d5944d8-2267-4799-824a-0f824e9a978d",
+ "model-customization-id": "efcd576d-a05e-4798-bb68-79e7d9c80f4c",
+ "nf-type": "ONAP-LOADBALANCER",
+ "nf-function": "LOADBALANCER",
+ "nf-role": "vLB",
+ "nf-naming-code": "vlb",
+ "selflink": "restconf/config/GENERIC-RESOURCE-API:services/service/101b8fc1-1796-4db1-a4e7-fe39c6a51558/service-data/vnfs/vnf/7b202620-2936-4b0d-b09c-60b411f10f64/vnf-data/vnf-topology/",
+ "relationship-list": {
+ "relationship": [
+ {
+ "related-to": "service-instance",
+ "related-link": "/aai/v11/business/customers/customer/Demonstration/service-subscriptions/service-subscription/vLB/service-instances/service-instance/101b8fc1-1796-4db1-a4e7-fe39c6a51558",
+ "relationship-data": [
+ {
+ "relationship-key": "customer.global-customer-id",
+ "relationship-value": "Demonstration"
+ },
+ {
+ "relationship-key": "service-subscription.service-type",
+ "relationship-value": "vLB"
+ },
+ {
+ "relationship-key": "service-instance.service-instance-id",
+ "relationship-value": "101b8fc1-1796-4db1-a4e7-fe39c6a51558"
+ }
+ ],
+ "related-to-property": [
+ {
+ "property-key": "service-instance.service-instance-name",
+ "property-value": "vLoadBalancerMS-0211-1"
+ }
+ ]
+ },
+ {
+ "related-to": "platform",
+ "related-link": "/aai/v11/business/platforms/platform/Test-Platform",
+ "relationship-data": [
+ {
+ "relationship-key": "platform.platform-name",
+ "relationship-value": "Test-Platform"
+ }
+ ]
+ },
+ {
+ "related-to": "line-of-business",
+ "related-link": "/aai/v11/business/lines-of-business/line-of-business/Test-Business",
+ "relationship-data": [
+ {
+ "relationship-key": "line-of-business.line-of-business-name",
+ "relationship-value": "Test-Business"
+ }
+ ]
+ },
+ {
+ "related-to": "vserver",
+ "related-link": "/aai/v11/cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/tenants/tenant/3f2aaef74ecb4b19b35e26d0849fe9a2/vservers/vserver/58ca8df0-17b8-4aa2-8766-9c6c1a12cec8",
+ "relationship-data": [
+ {
+ "relationship-key": "cloud-region.cloud-owner",
+ "relationship-value": "CloudOwner"
+ },
+ {
+ "relationship-key": "cloud-region.cloud-region-id",
+ "relationship-value": "RegionOne"
+ },
+ {
+ "relationship-key": "tenant.tenant-id",
+ "relationship-value": "3f2aaef74ecb4b19b35e26d0849fe9a2"
+ },
+ {
+ "relationship-key": "vserver.vserver-id",
+ "relationship-value": "58ca8df0-17b8-4aa2-8766-9c6c1a12cec8"
+ }
+ ],
+ "related-to-property": [
+ {
+ "property-key": "vserver.vserver-name",
+ "property-value": "vdns-ms-0211-1"
+ }
+ ]
+ },
+ {
+ "related-to": "vserver",
+ "related-link": "/aai/v11/cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/tenants/tenant/3f2aaef74ecb4b19b35e26d0849fe9a2/vservers/vserver/6c3b3714-e36c-45af-9f16-7d3a73d99497",
+ "relationship-data": [
+ {
+ "relationship-key": "cloud-region.cloud-owner",
+ "relationship-value": "CloudOwner"
+ },
+ {
+ "relationship-key": "cloud-region.cloud-region-id",
+ "relationship-value": "RegionOne"
+ },
+ {
+ "relationship-key": "tenant.tenant-id",
+ "relationship-value": "3f2aaef74ecb4b19b35e26d0849fe9a2"
+ },
+ {
+ "relationship-key": "vserver.vserver-id",
+ "relationship-value": "6c3b3714-e36c-45af-9f16-7d3a73d99497"
+ }
+ ],
+ "related-to-property": [
+ {
+ "property-key": "vserver.vserver-name",
+ "property-value": "vlb-ms-0211-1"
+ }
+ ]
+ },
+ {
+ "related-to": "availability-zone",
+ "related-link": "/aai/v11/cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/availability-zones/availability-zone/nova",
+ "relationship-data": [
+ {
+ "relationship-key": "cloud-region.cloud-owner",
+ "relationship-value": "CloudOwner"
+ },
+ {
+ "relationship-key": "cloud-region.cloud-region-id",
+ "relationship-value": "RegionOne"
+ },
+ {
+ "relationship-key": "availability-zone.availability-zone-name",
+ "relationship-value": "nova"
+ }
+ ]
+ }
+ ]
+ },
+ "vf-modules": {
+ "vf-module": [
+ {
+ "vf-module-id": "e46c6636-9ce5-4b77-bb1b-455ce9edc892",
+ "vf-module-name": "vLoadBalancerMS-0211-1",
+ "heat-stack-id": "vLoadBalancerMS-0211-1/73360253-2dfe-46f6-bcd6-8662a81238ea",
+ "orchestration-status": "Active",
+ "is-base-vf-module": true,
+ "resource-version": "1552311559802",
+ "model-invariant-id": "d263fc6d-cfce-4e20-8337-e06f48b474e6",
+ "model-version-id": "24c0aa10-3979-402c-ad98-20124751b551",
+ "model-customization-id": "65382eb1-db84-466c-b9d7-4e0f1ba7105f",
+ "selflink": "restconf/config/GENERIC-RESOURCE-API:services/service/101b8fc1-1796-4db1-a4e7-fe39c6a51558/service-data/vnfs/vnf/7b202620-2936-4b0d-b09c-60b411f10f64/vnf-data/vf-modules/vf-module/e46c6636-9ce5-4b77-bb1b-455ce9edc892/vf-module-data/vf-module-topology/",
+ "relationship-list": {
+ "relationship": [
+ {
+ "related-to": "vserver",
+ "related-link": "/aai/v11/cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/tenants/tenant/3f2aaef74ecb4b19b35e26d0849fe9a2/vservers/vserver/58ca8df0-17b8-4aa2-8766-9c6c1a12cec8",
+ "relationship-data": [
+ {
+ "relationship-key": "cloud-region.cloud-owner",
+ "relationship-value": "CloudOwner"
+ },
+ {
+ "relationship-key": "cloud-region.cloud-region-id",
+ "relationship-value": "RegionOne"
+ },
+ {
+ "relationship-key": "tenant.tenant-id",
+ "relationship-value": "3f2aaef74ecb4b19b35e26d0849fe9a2"
+ },
+ {
+ "relationship-key": "vserver.vserver-id",
+ "relationship-value": "58ca8df0-17b8-4aa2-8766-9c6c1a12cec8"
+ }
+ ],
+ "related-to-property": [
+ {
+ "property-key": "vserver.vserver-name",
+ "property-value": "vdns-ms-0211-1"
+ }
+ ]
+ },
+ {
+ "related-to": "vserver",
+ "related-link": "/aai/v11/cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/tenants/tenant/3f2aaef74ecb4b19b35e26d0849fe9a2/vservers/vserver/6c3b3714-e36c-45af-9f16-7d3a73d99497",
+ "relationship-data": [
+ {
+ "relationship-key": "cloud-region.cloud-owner",
+ "relationship-value": "CloudOwner"
+ },
+ {
+ "relationship-key": "cloud-region.cloud-region-id",
+ "relationship-value": "RegionOne"
+ },
+ {
+ "relationship-key": "tenant.tenant-id",
+ "relationship-value": "3f2aaef74ecb4b19b35e26d0849fe9a2"
+ },
+ {
+ "relationship-key": "vserver.vserver-id",
+ "relationship-value": "6c3b3714-e36c-45af-9f16-7d3a73d99497"
+ }
+ ],
+ "related-to-property": [
+ {
+ "property-key": "vserver.vserver-name",
+ "property-value": "vlb-ms-0211-1"
+ }
+ ]
+ }
+ ]
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "service-instance": {
+ "service-instance-id": "101b8fc1-1796-4db1-a4e7-fe39c6a51558",
+ "service-instance-name": "vLoadBalancerMS-0211-1",
+ "environment-context": "General_Revenue-Bearing",
+ "workload-context": "Production",
+ "model-invariant-id": "1008a768-1b67-407e-88c6-58c82b34ef42",
+ "model-version-id": "81f8c1cd-f664-4450-b3a4-be645613ab32",
+ "resource-version": "1552311350334",
+ "selflink": "restconf/config/GENERIC-RESOURCE-API:services/service/101b8fc1-1796-4db1-a4e7-fe39c6a51558/service-data/service-topology/",
+ "orchestration-status": "Active",
+ "relationship-list": {
+ "relationship": [
+ {
+ "related-to": "project",
+ "related-link": "/aai/v11/business/projects/project/Test-Project",
+ "relationship-data": [
+ {
+ "relationship-key": "project.project-name",
+ "relationship-value": "Test-Project"
+ }
+ ]
+ },
+ {
+ "related-to": "generic-vnf",
+ "related-link": "/aai/v11/network/generic-vnfs/generic-vnf/7b202620-2936-4b0d-b09c-60b411f10f64",
+ "relationship-data": [
+ {
+ "relationship-key": "generic-vnf.vnf-id",
+ "relationship-value": "7b202620-2936-4b0d-b09c-60b411f10f64"
+ }
+ ],
+ "related-to-property": [
+ {
+ "property-key": "generic-vnf.vnf-name",
+ "property-value": "vLoadBalancerMS-Vnf-0211-1"
+ }
+ ]
+ },
+ {
+ "related-to": "owning-entity",
+ "related-link": "/aai/v11/business/owning-entities/owning-entity/bb94a687-4f3b-40a3-914e-e98037d5ebd2",
+ "relationship-data": [
+ {
+ "relationship-key": "owning-entity.owning-entity-id",
+ "relationship-value": "bb94a687-4f3b-40a3-914e-e98037d5ebd2"
+ }
+ ]
+ }
+ ]
+ }
+ }
+ },
+ {
+ "generic-vnf": {
+ "vnf-id": "17044ef4-e7f3-46a1-af03-e2aa562f23ac",
+ "vnf-name": "TestVM-Vnf-0201-1",
+ "vnf-type": "TestVM/TestVM 0",
+ "prov-status": "ACTIVE",
+ "equipment-role": "",
+ "orchestration-status": "Active",
+ "ipv4-oam-address": "10.0.70.1",
+ "in-maint": true,
+ "is-closed-loop-disabled": false,
+ "resource-version": "1549041636264",
+ "model-invariant-id": "6a4d7971-0778-4655-9eab-9d6031c7ad57",
+ "model-version-id": "fb6c673c-e5b6-4e0a-9baf-5e0089784de9",
+ "model-customization-id": "706a3100-dbe5-442e-86c3-c7b823abbec2",
+ "selflink": "restconf/config/GENERIC-RESOURCE-API:services/service/d41f8217-d464-4458-bf0a-fba33a0f1b31/service-data/vnfs/vnf/17044ef4-e7f3-46a1-af03-e2aa562f23ac/vnf-data/vnf-topology/",
+ "relationship-list": {
+ "relationship": [
+ {
+ "related-to": "service-instance",
+ "related-link": "/aai/v11/business/customers/customer/Demonstration/service-subscriptions/service-subscription/vFW/service-instances/service-instance/d41f8217-d464-4458-bf0a-fba33a0f1b31",
+ "relationship-data": [
+ {
+ "relationship-key": "customer.global-customer-id",
+ "relationship-value": "Demonstration"
+ },
+ {
+ "relationship-key": "service-subscription.service-type",
+ "relationship-value": "vFW"
+ },
+ {
+ "relationship-key": "service-instance.service-instance-id",
+ "relationship-value": "d41f8217-d464-4458-bf0a-fba33a0f1b31"
+ }
+ ],
+ "related-to-property": [
+ {
+ "property-key": "service-instance.service-instance-name",
+ "property-value": "TestVM-Service-0201-1"
+ }
+ ]
+ },
+ {
+ "related-to": "platform",
+ "related-link": "/aai/v11/business/platforms/platform/Test-Platform",
+ "relationship-data": [
+ {
+ "relationship-key": "platform.platform-name",
+ "relationship-value": "Test-Platform"
+ }
+ ]
+ },
+ {
+ "related-to": "line-of-business",
+ "related-link": "/aai/v11/business/lines-of-business/line-of-business/Test-Business",
+ "relationship-data": [
+ {
+ "relationship-key": "line-of-business.line-of-business-name",
+ "relationship-value": "Test-Business"
+ }
+ ]
+ },
+ {
+ "related-to": "vserver",
+ "related-link": "/aai/v11/cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/tenants/tenant/3f2aaef74ecb4b19b35e26d0849fe9a2/vservers/vserver/e7f1db09-ff78-44fc-b256-69095c5556fb",
+ "relationship-data": [
+ {
+ "relationship-key": "cloud-region.cloud-owner",
+ "relationship-value": "CloudOwner"
+ },
+ {
+ "relationship-key": "cloud-region.cloud-region-id",
+ "relationship-value": "RegionOne"
+ },
+ {
+ "relationship-key": "tenant.tenant-id",
+ "relationship-value": "3f2aaef74ecb4b19b35e26d0849fe9a2"
+ },
+ {
+ "relationship-key": "vserver.vserver-id",
+ "relationship-value": "e7f1db09-ff78-44fc-b256-69095c5556fb"
+ }
+ ],
+ "related-to-property": [
+ {
+ "property-key": "vserver.vserver-name",
+ "property-value": "vfw-vm-0201-2"
+ }
+ ]
+ },
+ {
+ "related-to": "availability-zone",
+ "related-link": "/aai/v11/cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionTwo/availability-zones/availability-zone/zone-1",
+ "relationship-data": [
+ {
+ "relationship-key": "cloud-region.cloud-owner",
+ "relationship-value": "CloudOwner"
+ },
+ {
+ "relationship-key": "cloud-region.cloud-region-id",
+ "relationship-value": "RegionTwo"
+ },
+ {
+ "relationship-key": "availability-zone.availability-zone-name",
+ "relationship-value": "zone-1"
+ }
+ ]
+ }
+ ]
+ },
+ "vf-modules": {
+ "vf-module": [
+ {
+ "vf-module-id": "0afde97a-3e3f-4597-aec3-e5488c0f20b7",
+ "vf-module-name": "TestVM-0201-1",
+ "heat-stack-id": "TestVM-0201-1/aee4d7e5-b4a0-4261-b3cf-bb23348a3d99",
+ "orchestration-status": "Active",
+ "is-base-vf-module": true,
+ "resource-version": "1549039401119",
+ "model-invariant-id": "6af68fdb-6479-43e2-8989-938f06c994bd",
+ "model-version-id": "16d1834e-d834-431f-b064-98c469c6505d",
+ "model-customization-id": "29ffb122-22c8-48d2-b152-b52d9e81e910",
+ "selflink": "restconf/config/GENERIC-RESOURCE-API:services/service/d41f8217-d464-4458-bf0a-fba33a0f1b31/service-data/vnfs/vnf/17044ef4-e7f3-46a1-af03-e2aa562f23ac/vnf-data/vf-modules/vf-module/0afde97a-3e3f-4597-aec3-e5488c0f20b7/vf-module-data/vf-module-topology/"
+ },
+ {
+ "vf-module-id": "33f9e03d-2fbd-4e9c-8e73-ce6b12f0b3d2",
+ "vf-module-name": "TestVM-0201-2",
+ "heat-stack-id": "TestVM-0201-2/1b9db6b8-620b-46f1-935a-8a61c294a98b",
+ "orchestration-status": "Active",
+ "is-base-vf-module": true,
+ "resource-version": "1549041447373",
+ "model-invariant-id": "6af68fdb-6479-43e2-8989-938f06c994bd",
+ "model-version-id": "16d1834e-d834-431f-b064-98c469c6505d",
+ "model-customization-id": "29ffb122-22c8-48d2-b152-b52d9e81e910",
+ "selflink": "restconf/config/GENERIC-RESOURCE-API:services/service/d41f8217-d464-4458-bf0a-fba33a0f1b31/service-data/vnfs/vnf/17044ef4-e7f3-46a1-af03-e2aa562f23ac/vnf-data/vf-modules/vf-module/33f9e03d-2fbd-4e9c-8e73-ce6b12f0b3d2/vf-module-data/vf-module-topology/",
+ "relationship-list": {
+ "relationship": [
+ {
+ "related-to": "vserver",
+ "related-link": "/aai/v11/cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/tenants/tenant/3f2aaef74ecb4b19b35e26d0849fe9a2/vservers/vserver/e7f1db09-ff78-44fc-b256-69095c5556fb",
+ "relationship-data": [
+ {
+ "relationship-key": "cloud-region.cloud-owner",
+ "relationship-value": "CloudOwner"
+ },
+ {
+ "relationship-key": "cloud-region.cloud-region-id",
+ "relationship-value": "RegionOne"
+ },
+ {
+ "relationship-key": "tenant.tenant-id",
+ "relationship-value": "3f2aaef74ecb4b19b35e26d0849fe9a2"
+ },
+ {
+ "relationship-key": "vserver.vserver-id",
+ "relationship-value": "e7f1db09-ff78-44fc-b256-69095c5556fb"
+ }
+ ],
+ "related-to-property": [
+ {
+ "property-key": "vserver.vserver-name",
+ "property-value": "vfw-vm-0201-2"
+ }
+ ]
+ }
+ ]
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "vf-module": {
+ "vf-module-id": "0afde97a-3e3f-4597-aec3-e5488c0f20b7",
+ "vf-module-name": "TestVM-0201-1",
+ "heat-stack-id": "TestVM-0201-1/aee4d7e5-b4a0-4261-b3cf-bb23348a3d99",
+ "orchestration-status": "Active",
+ "is-base-vf-module": true,
+ "resource-version": "1549039401119",
+ "model-invariant-id": "6af68fdb-6479-43e2-8989-938f06c994bd",
+ "model-version-id": "16d1834e-d834-431f-b064-98c469c6505d",
+ "model-customization-id": "29ffb122-22c8-48d2-b152-b52d9e81e910",
+ "selflink": "restconf/config/GENERIC-RESOURCE-API:services/service/d41f8217-d464-4458-bf0a-fba33a0f1b31/service-data/vnfs/vnf/17044ef4-e7f3-46a1-af03-e2aa562f23ac/vnf-data/vf-modules/vf-module/0afde97a-3e3f-4597-aec3-e5488c0f20b7/vf-module-data/vf-module-topology/"
+ }
+ },
+ {
+ "vf-module": {
+ "vf-module-id": "33f9e03d-2fbd-4e9c-8e73-ce6b12f0b3d2",
+ "vf-module-name": "TestVM-0201-2",
+ "heat-stack-id": "TestVM-0201-2/1b9db6b8-620b-46f1-935a-8a61c294a98b",
+ "orchestration-status": "Active",
+ "is-base-vf-module": true,
+ "resource-version": "1549041447373",
+ "model-invariant-id": "6af68fdb-6479-43e2-8989-938f06c994bd",
+ "model-version-id": "16d1834e-d834-431f-b064-98c469c6505d",
+ "model-customization-id": "29ffb122-22c8-48d2-b152-b52d9e81e910",
+ "selflink": "restconf/config/GENERIC-RESOURCE-API:services/service/d41f8217-d464-4458-bf0a-fba33a0f1b31/service-data/vnfs/vnf/17044ef4-e7f3-46a1-af03-e2aa562f23ac/vnf-data/vf-modules/vf-module/33f9e03d-2fbd-4e9c-8e73-ce6b12f0b3d2/vf-module-data/vf-module-topology/",
+ "relationship-list": {
+ "relationship": [
+ {
+ "related-to": "vserver",
+ "related-link": "/aai/v11/cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/tenants/tenant/3f2aaef74ecb4b19b35e26d0849fe9a2/vservers/vserver/e7f1db09-ff78-44fc-b256-69095c5556fb",
+ "relationship-data": [
+ {
+ "relationship-key": "cloud-region.cloud-owner",
+ "relationship-value": "CloudOwner"
+ },
+ {
+ "relationship-key": "cloud-region.cloud-region-id",
+ "relationship-value": "RegionOne"
+ },
+ {
+ "relationship-key": "tenant.tenant-id",
+ "relationship-value": "3f2aaef74ecb4b19b35e26d0849fe9a2"
+ },
+ {
+ "relationship-key": "vserver.vserver-id",
+ "relationship-value": "e7f1db09-ff78-44fc-b256-69095c5556fb"
+ }
+ ],
+ "related-to-property": [
+ {
+ "property-key": "vserver.vserver-name",
+ "property-value": "vfw-vm-0201-2"
+ }
+ ]
+ }
+ ]
+ }
+ }
+ },
+ {
+ "tenant": {
+ "tenant-id": "tenant1-16197-as988q",
+ "tenant-name": "tenant-name-16197-as988q",
+ "resource-version": "1550769793637",
+ "vservers": {
+ "vserver": [
+ {
+ "vserver-id": "vserver1-16197-as988q",
+ "vserver-name": "vserverName",
+ "vserver-name2": "vserverTE-name2-as988q",
+ "prov-status": "ACTIVE",
+ "vserver-selflink": "TRINITY vserverLink",
+ "in-maint": false,
+ "is-closed-loop-disabled": false,
+ "resource-version": "1550769794551",
+ "relationship-list": {
+ "relationship": [
+ {
+ "related-to": "generic-vnf",
+ "relationship-label": "tosca.relationships.HostedOn",
+ "related-link": "/aai/v16/network/generic-vnfs/generic-vnf/VNF1-16197-as988q",
+ "relationship-data": [
+ {
+ "relationship-key": "generic-vnf.vnf-id",
+ "relationship-value": "VNF1-16197-as988q"
+ }
+ ],
+ "related-to-property": [
+ {
+ "property-key": "generic-vnf.vnf-name",
+ "property-value": "vnf1Name"
+ }
+ ]
+ }
+ ]
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "cloud-region": {
+ "cloud-owner": "co-16197-01-as988q",
+ "cloud-region-id": "cr-16197-01-as988q",
+ "resource-version": "1550769792672",
+ "orchestration-disabled": false,
+ "in-maint": false,
+ "tenants": {
+ "tenant": [
+ {
+ "tenant-id": "tenant1-16197-as988q",
+ "tenant-name": "tenant-name-16197-as988q",
+ "resource-version": "1550769793637"
+ }
+ ]
+ }
+ }
+ }
+ ]
+}
diff --git a/models-interactions/model-impl/aai/src/test/resources/org/onap/policy/aai/AaiMalformedCqResponse.json b/models-interactions/model-impl/aai/src/test/resources/org/onap/policy/aai/AaiMalformedCqResponse.json
new file mode 100644
index 000000000..a9452a2e2
--- /dev/null
+++ b/models-interactions/model-impl/aai/src/test/resources/org/onap/policy/aai/AaiMalformedCqResponse.json
@@ -0,0 +1,3 @@
+{
+ "results": []
+} \ No newline at end of file
diff --git a/models-interactions/model-impl/aai/src/test/resources/org/onap/policy/aai/AaiTenantResponse.json b/models-interactions/model-impl/aai/src/test/resources/org/onap/policy/aai/AaiTenantResponse.json
new file mode 100644
index 000000000..62b690548
--- /dev/null
+++ b/models-interactions/model-impl/aai/src/test/resources/org/onap/policy/aai/AaiTenantResponse.json
@@ -0,0 +1,8 @@
+{
+ "result-data": [
+ {
+ "resource-type": "vserver",
+ "resource-link": "/aai/v11/cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/tenants/tenant/3f2aaef74ecb4b19b35e26d0849fe9a2/vservers/vserver/6c3b3714-e36c-45af-9f16-7d3a73d99497"
+ }
+ ]
+} \ No newline at end of file