summaryrefslogtreecommitdiffstats
path: root/pomba/service-decomposition/src/main/java/org/onap/sdnc/apps/pomba/servicedecomposition/util/RestUtil.java
diff options
context:
space:
mode:
Diffstat (limited to 'pomba/service-decomposition/src/main/java/org/onap/sdnc/apps/pomba/servicedecomposition/util/RestUtil.java')
-rw-r--r--pomba/service-decomposition/src/main/java/org/onap/sdnc/apps/pomba/servicedecomposition/util/RestUtil.java285
1 files changed, 155 insertions, 130 deletions
diff --git a/pomba/service-decomposition/src/main/java/org/onap/sdnc/apps/pomba/servicedecomposition/util/RestUtil.java b/pomba/service-decomposition/src/main/java/org/onap/sdnc/apps/pomba/servicedecomposition/util/RestUtil.java
index ffd7bf8..af2f7be 100644
--- a/pomba/service-decomposition/src/main/java/org/onap/sdnc/apps/pomba/servicedecomposition/util/RestUtil.java
+++ b/pomba/service-decomposition/src/main/java/org/onap/sdnc/apps/pomba/servicedecomposition/util/RestUtil.java
@@ -19,25 +19,24 @@ package org.onap.sdnc.apps.pomba.servicedecomposition.util;
import static org.onap.sdnc.apps.pomba.servicedecomposition.exception.DiscoveryException.Error.FETCH_RESOURCE_FAILED;
import static org.onap.sdnc.apps.pomba.servicedecomposition.exception.DiscoveryException.Error.INVALID_URL;
-import static org.onap.sdnc.apps.pomba.servicedecomposition.exception.DiscoveryException.Error.RELATIONSHIP_LINK_PARSE_ERROR;
import static org.onap.sdnc.apps.pomba.servicedecomposition.exception.DiscoveryException.Error.SERVICE_INSTANCE_NOT_FOUND;
-import static org.onap.sdnc.apps.pomba.servicedecomposition.exception.DiscoveryException.Error.SERVICE_RELATIONSHIP_PARSE_ERROR;
-import com.sun.jersey.core.util.MultivaluedMapImpl;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+
import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.MultivaluedHashMap;
import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.core.Response.Status;
+
import org.json.JSONArray;
import org.json.JSONObject;
import org.onap.aai.restclient.client.OperationResult;
import org.onap.aai.restclient.client.RestClient;
-import org.onap.logging.ref.slf4j.ONAPLogAdapter;
import org.onap.sdnc.apps.pomba.servicedecomposition.exception.DiscoveryException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -46,6 +45,10 @@ import org.slf4j.LoggerFactory;
public class RestUtil {
+
+
+ private static final String RELATIONSHIP_KEY = "relationship";
+ private static final String RELATIONSHIP_LIST_KEY = "relationship-list";
// Parameters for Query AAI Model Data API
// HTTP headers
private static final String TRANSACTION_ID = "X-TransactionId";
@@ -54,6 +57,8 @@ public class RestUtil {
private static final String AUTHORIZATION = "Authorization";
private static final Resource GENERIC_VNF = new Resource("generic-vnf");
+ private static final Resource VF_MODULE = new Resource("vf-module");
+ private static final Resource L3_NETWORK = new Resource("l3-network");
public static class Resource {
private String resourceName;
@@ -71,6 +76,11 @@ public class RestUtil {
private String getCollectionName() {
return this.collectionName;
}
+
+ @Override
+ public String toString() {
+ return "Resource [resourceName=" + resourceName + ", collectionName=" + collectionName + "]";
+ }
}
private static final String JSON_ATT_RELATED_TO = "related-to";
@@ -81,6 +91,10 @@ public class RestUtil {
private static final String DEPTH = "?depth=2";
private static Logger logger = LoggerFactory.getLogger(RestUtil.class);
+ private RestUtil() {
+ throw new IllegalStateException("Utility class");
+ }
+
/**
* Validates the URL parameter.
*
@@ -97,11 +111,6 @@ public class RestUtil {
return MessageFormat.format(siPath, serviceInstanceId);
}
-
- /*
- * Trigger external API call to AAI to retrieve Service Instance data (i.e. genericVNF and VNFC)
- */
-
/**
* @param aaiClient
* @param baseURL
@@ -115,7 +124,7 @@ public class RestUtil {
* @throws DiscoveryException
*/
public static JSONObject retrieveAAIModelData(RestClient aaiClient, String baseURL, String aaiBasicAuthorization, String aaiServiceInstancePath, String aaiResourceList,
- String transactionId, String serviceInstanceId, ONAPLogAdapter adapter) throws DiscoveryException {
+ String transactionId, String serviceInstanceId) throws DiscoveryException {
// Follow two variables for transform purpose
String url = baseURL + generateServiceInstanceURL(aaiServiceInstancePath, serviceInstanceId);
@@ -123,20 +132,29 @@ public class RestUtil {
JSONObject serviceInstancePayload = new JSONObject(
getResource(aaiClient, url, aaiBasicAuthorization, transactionId));
// Handle the case if the service instance is not found in AAI
- if (serviceInstancePayload == null || serviceInstancePayload.length() == 0) {
- logger.info("Service Instance " + serviceInstanceId + " is not found from AAI");
+ if (serviceInstancePayload.length() == 0) {
+ logger.info("Service Instance {} is not found from AAI", serviceInstanceId);
// Only return the empty Json on the root level. i.e service instance
throw new DiscoveryException(SERVICE_INSTANCE_NOT_FOUND, Status.NOT_FOUND);
}
- HashMap<String, List<String>> relationMap = extractServiceRelationShips(serviceInstancePayload);
- logger.info("The number of the relationships for service instance id {} is: {}", serviceInstanceId,
+ Map<String, List<String>> relationMap = extractRelationships(serviceInstancePayload);
+ logger.info("The number of the relationship types for service instance id {} is: {}", serviceInstanceId,
relationMap.size());
JSONObject response = processVNFRelationMap(aaiClient, aaiResourceList, baseURL, aaiBasicAuthorization, transactionId, relationMap, serviceInstancePayload);
+
+ if (relationMap.containsKey(L3_NETWORK.getResourceName())) {
+ List<String> l3NetworkRelatedLinks = relationMap.get(L3_NETWORK.getResourceName());
+ List<JSONObject> l3networkPayload = processResourceList(aaiClient, baseURL, aaiBasicAuthorization, transactionId,
+ L3_NETWORK.getResourceName(), l3NetworkRelatedLinks);
+
+ response.put(L3_NETWORK.getCollectionName(), l3networkPayload);
+ }
+
return response;
- }
+ }
/**
* @param aaiClient
@@ -146,46 +164,100 @@ public class RestUtil {
* @throws DiscoveryException
*/
private static JSONObject processVNFRelationMap(RestClient aaiClient, String aaiResourceList, String baseURL, String aaiBasicAuthorization, String transactionId,
- HashMap<String, List<String>> relationMap, JSONObject serviceInstancePayload) throws DiscoveryException {
- List<JSONObject> vnfLst = new ArrayList<JSONObject>(); // List of the VNF JSON along with related resources
+ Map<String, List<String>> relationMap, JSONObject serviceInstancePayload) throws DiscoveryException {
+ List<JSONObject> vnfLst = new ArrayList<>(); // List of the VNF JSON along with related resources
JSONObject response = serviceInstancePayload;
List<Resource> resourceTypes = getResourceTypes(aaiResourceList);
if (relationMap.get(GENERIC_VNF.getResourceName()) != null) {
- List<JSONObject> vnfList = processResourceList(aaiClient, baseURL, aaiBasicAuthorization, transactionId, GENERIC_VNF.getResourceName(),
- relationMap.get(GENERIC_VNF.getResourceName()));
+ List<JSONObject> vnfList = processResourceList(aaiClient, baseURL, aaiBasicAuthorization, transactionId,
+ GENERIC_VNF.getResourceName(), relationMap.get(GENERIC_VNF.getResourceName()));
// Logic to Create the Generic VNF JSON and extract further relationships
for (JSONObject vnfPayload : vnfList) {
+ Map<String, List<String>> vnfRelationMap = extractRelationships(vnfPayload);
+ String vnfId = vnfPayload.optString("vnf-id");
+
for (Resource resourceType : resourceTypes) {
- List<String> vnfcLinkLst = extractRelatedLink(vnfPayload, resourceType.getResourceName());
- if (vnfcLinkLst != null && !vnfcLinkLst.isEmpty()) {
- logger.info("The number of the API call for vnfc is:" + vnfcLinkLst.size());
- List<JSONObject> vnfcList = processResourceList(aaiClient, baseURL, aaiBasicAuthorization, transactionId,
- resourceType.getResourceName(), vnfcLinkLst);
- if (vnfcList != null) {
- vnfPayload.put(resourceType.getCollectionName(), vnfcList);
- }
- } else {
- logger.info("No " + resourceType.getResourceName() + " found for vnf-id:" + vnfPayload.getString("vnf-id"));
+ List<String> vnfcLinkLst = vnfRelationMap.get(resourceType.getResourceName());
+ if (vnfcLinkLst == null || vnfcLinkLst.isEmpty()) {
+ logger.info("No relationships found for generic-vnf '{}', resource type '{}'", vnfId,
+ resourceType.getResourceName());
+ continue;
}
+
+ logger.info("Number of relationships found for generic-vnf '{}', resource type '{}' are: {}", vnfId,
+ resourceType.getResourceName(), vnfcLinkLst.size());
+ List<JSONObject> vnfcList = processResourceList(aaiClient, baseURL, aaiBasicAuthorization,
+ transactionId, resourceType.getResourceName(), vnfcLinkLst);
+ vnfPayload.put(resourceType.getCollectionName(), vnfcList);
}
- // Add final vnf payload to list
- vnfLst.add(vnfPayload);
+
+ // Process vf-module looking for l3-network:
+ processVfModuleList(aaiClient, baseURL, aaiBasicAuthorization, transactionId, vnfPayload);
+ // Add final vnf payload to list
+ vnfLst.add(vnfPayload);
}
} else {
- logger.info("No " + GENERIC_VNF.getResourceName() + " found for :" + serviceInstancePayload.getString("service-instance-id"));
+ logger.info("No {} found for service-instance-id: {}", GENERIC_VNF.getResourceName(),
+ serviceInstancePayload.optString("service-instance-id"));
}
// Add generic vnf with related resource payload to response
- if (vnfLst != null && !vnfLst.isEmpty()) {
+ if (!vnfLst.isEmpty()) {
response.put(GENERIC_VNF.getCollectionName(), vnfLst);
}
return response;
}
+ private static void processVfModuleList(RestClient aaiClient, String baseURL, String aaiBasicAuthorization, String transactionId,
+ JSONObject vnfPayload) throws DiscoveryException {
+
+ if (!vnfPayload.has(VF_MODULE.getCollectionName())) {
+ return;
+ }
+
+ JSONObject vfmoduleCollection = vnfPayload.getJSONObject(VF_MODULE.getCollectionName());
+
+ if (!vfmoduleCollection.has(VF_MODULE.getResourceName())) {
+ return;
+ }
+
+ JSONArray vfModuleList = vfmoduleCollection.getJSONArray(VF_MODULE.getResourceName());
+
+ for (int i = 0; i < vfModuleList.length(); i++) {
+ JSONObject vfModulePayload = vfModuleList.optJSONObject(i);
+ if (vfModulePayload == null) {
+ logger.error("VF Module not found for vnf-id {}", vnfPayload.opt("vnf-id"));
+ continue;
+ }
+ processVfModule(aaiClient, baseURL, aaiBasicAuthorization, transactionId, vfModulePayload);
+ }
+ }
+
+ private static void processVfModule(RestClient aaiClient, String baseURL, String aaiBasicAuthorization,
+ String transactionId, JSONObject vfModulePayload) throws DiscoveryException {
+
+ Map<String, List<String>> relationMap = extractRelationships(vfModulePayload);
+ Object vfModuleId = vfModulePayload.opt("vf-module-id");
+
+ List<String> l3NetworkRelatedLinks = relationMap.get(L3_NETWORK.getResourceName());
+ if (l3NetworkRelatedLinks == null) {
+ logger.info("No relationships found for vf-module '{}', resource type '{}'", vfModuleId, L3_NETWORK.getResourceName());
+ // No L3-network relationships exist.
+ return;
+ }
+
+ logger.info("Number of relationships found for vf-module '{}', resource type '{}' are: {}", vfModuleId, L3_NETWORK.getResourceName(), l3NetworkRelatedLinks.size());
+
+ List<JSONObject> l3NetworkObjects = processResourceList(aaiClient, baseURL, aaiBasicAuthorization,
+ transactionId, L3_NETWORK.getResourceName(), l3NetworkRelatedLinks);
+
+ // Add l3-network with related resource payload to the vfModulePayload:
+ vfModulePayload.put(L3_NETWORK.getCollectionName(), l3NetworkObjects);
+ }
/**
* @param aaiClient
@@ -198,7 +270,7 @@ public class RestUtil {
*/
private static List<JSONObject> processResourceList(RestClient aaiClient, String aaiBaseURL, String aaiBasicAuthorization, String transactionId,
String resourceType, List<String> resourceList) throws DiscoveryException {
- List<JSONObject> resourcePayloadList = new ArrayList<JSONObject>();
+ List<JSONObject> resourcePayloadList = new ArrayList<>();
for (String resourceLink : resourceList) {
String resourceURL = aaiBaseURL + resourceLink;
// With latest AAI development, in order to retrieve the both generic VNF + vf_module, we can use
@@ -210,8 +282,8 @@ public class RestUtil {
// Response from generic VNF API call
JSONObject resourcePayload = new JSONObject(
getResource(aaiClient, resourceURL, aaiBasicAuthorization, transactionId));
- if (resourcePayload == null || resourcePayload.length() == 0) {
- logger.info("Resource with url " + resourceLink + " is not found from AAI");
+ if (resourcePayload.length() == 0) {
+ logger.info("Resource with url {} is not found from AAI", resourceLink);
} else {
resourcePayloadList.add(resourcePayload);
}
@@ -219,48 +291,56 @@ public class RestUtil {
return resourcePayloadList;
}
-
/**
- * @param serviceInstancePayload
- * @param relationMap
- * @return
- * @throws DiscoveryException
+ * Extract the related-Link from Json payload. For example
+ * <pre>
+ * {
+ * "related-to": "vnfc",
+ * "related-link": "/aai/v11/network/vnfcs/vnfc/zrdm5aepdg01vmg003",
+ * "relationship-data": [
+ * {
+ * "relationship-key": "vnfc.vnfc-name",
+ * "relationship-value": "zrdm5aepdg01vmg003"
+ * }
+ * ]
+ * }
+ * </pre>
+ * @param payload input pay load json.
+ * @return Map of "related-to" to list of "related-link" strings.
*/
- private static HashMap<String, List<String>> extractServiceRelationShips(JSONObject payload)
- throws DiscoveryException {
+ private static Map<String, List<String>> extractRelationships(JSONObject payload) {
- JSONArray relationships = null;
- HashMap<String, List<String>> relationMap = new HashMap<String, List<String>>();
- logger.info("Fetching Service Instance Relationships");
- try {
- JSONObject relationshipList = payload.getJSONObject("relationship-list");
- if (relationshipList != null) {
- relationships = relationshipList.getJSONArray("relationship");
- }
- } catch (Exception e) {
- logger.error(e.getMessage());
- throw new DiscoveryException(SERVICE_RELATIONSHIP_PARSE_ERROR, Status.INTERNAL_SERVER_ERROR,
- e.getMessage());
+ Map<String, List<String>> relationMap = new HashMap<>();
+
+ if (!payload.has(RELATIONSHIP_LIST_KEY)) {
+ return relationMap;
}
- if (relationships != null && relationships.length() > 0) {
- for (int i = 0; i < relationships.length(); i++) {
- JSONObject obj = relationships.optJSONObject(i);
- String relatedToObj = obj.getString(JSON_ATT_RELATED_TO);
- String relatedLinkObj = obj.getString(JSON_ATT_RELATED_LINK);
+ JSONObject relationshipList = payload.getJSONObject(RELATIONSHIP_LIST_KEY);
- if (relatedToObj == null) {
- logger.info("Related-To Object found null");
- continue;
- }
- List<String> relatedLinkList = relationMap.get(relatedToObj);
- if (relatedLinkList == null) {
- relatedLinkList = new ArrayList<>();
- relationMap.put(relatedToObj, relatedLinkList);
- }
- relatedLinkList.add(relatedLinkObj);
+ if (!relationshipList.has(RELATIONSHIP_KEY)) {
+ return relationMap;
+ }
+
+ JSONArray relationships = relationshipList.getJSONArray(RELATIONSHIP_KEY);
+
+ for (int i = 0; i < relationships.length(); i++) {
+ JSONObject obj = relationships.optJSONObject(i);
+ String relatedToObj = obj.optString(JSON_ATT_RELATED_TO);
+
+ if (relatedToObj == null) {
+ logger.error("Related-To Object is null");
+ continue;
}
+ List<String> relatedLinkList = relationMap.get(relatedToObj);
+ if (relatedLinkList == null) {
+ relatedLinkList = new ArrayList<>();
+ relationMap.put(relatedToObj, relatedLinkList);
+ }
+ String relatedLinkObj = obj.getString(JSON_ATT_RELATED_LINK);
+ relatedLinkList.add(relatedLinkObj);
}
+
return relationMap;
}
@@ -276,74 +356,19 @@ public class RestUtil {
throws DiscoveryException {
OperationResult result = client.get(url, buildHeaders(aaiBasicAuthorization, transId), MediaType.valueOf(MediaType.APPLICATION_JSON));
- if (result.getResultCode() == 200) {
- String jsonString = result.getResult();
- return jsonString;
+ if (result.wasSuccessful()) {
+ return result.getResult();
} else if (result.getResultCode() == 404) {
// Resource not found, generate empty JSON format
- logger.info("Resource for " + url + " is not found " + "return empty Json format");
+ logger.info("Resource for {} is not found, return empty Json format", url);
return EMPTY_JSON_STRING;
} else {
throw new DiscoveryException(FETCH_RESOURCE_FAILED, Status.INTERNAL_SERVER_ERROR, result.getFailureCause());
}
}
- /**
- * Extract the related-Link from Json payload. For example
- * {
- * "related-to": "vnfc",
- * "related-link": "/aai/v11/network/vnfcs/vnfc/zrdm5aepdg01vmg003",
- * "relationship-data": [
- * {
- * "relationship-key": "vnfc.vnfc-name",
- * "relationship-value": "zrdm5aepdg01vmg003"
- * }
- * ]
- * }
- */
- private static List<String> extractRelatedLink(JSONObject payload, String catalog) throws DiscoveryException {
- List<String> relatedLinkList = new ArrayList<String>();
- JSONArray relationships = null;
- logger.info("Fetching relationships for resource type: " + catalog);
- try {
- JSONObject relationshipLst = payload.getJSONObject("relationship-list");
- if (relationshipLst != null) {
- relationships = relationshipLst.getJSONArray("relationship");
- }
-
- } catch (Exception e) {
- logger.error(e.getMessage());
- throw new DiscoveryException(RELATIONSHIP_LINK_PARSE_ERROR, Status.INTERNAL_SERVER_ERROR, e.getMessage());
- }
-
- if (relationships != null && relationships.length() > 0) {
- for (int i = 0; i < relationships.length(); i++) {
- Object relatedToObj = null;
- Object relatedLinkObj = null;
-
- JSONObject obj = relationships.optJSONObject(i);
- relatedToObj = obj.get(JSON_ATT_RELATED_TO);
-
- if (relatedToObj.toString().equals(catalog)) {
- relatedLinkObj = obj.get(JSON_ATT_RELATED_LINK);
- if (relatedLinkObj != null) {
- relatedLinkList.add(relatedLinkObj.toString());
- }
- }
-
- }
- }
- if (relatedLinkList != null) {
- logger.info(
- "Number of relationships found for resource type: " + catalog + " are: " + relatedLinkList.size());
- }
- return relatedLinkList;
- }
-
-
-
private static Map<String, List<String>> buildHeaders(String aaiBasicAuthorization, String transactionId) {
- MultivaluedMap<String, String> headers = new MultivaluedMapImpl();
+ MultivaluedMap<String, String> headers = new MultivaluedHashMap<>();
headers.put(TRANSACTION_ID, Collections.singletonList(transactionId));
headers.put(FROM_APP_ID, Collections.singletonList(APP_NAME));
headers.put(AUTHORIZATION, Collections.singletonList(aaiBasicAuthorization));
@@ -351,7 +376,7 @@ public class RestUtil {
}
private static List<Resource> getResourceTypes(String aaiResourceList) {
- List<Resource> resources = new ArrayList<Resource>();
+ List<Resource> resources = new ArrayList<>();
String noSpaceAaiResourceList = aaiResourceList.replaceAll("\\s", "");
String[] resourceList = noSpaceAaiResourceList.split(",");
for (int i = 0; i < resourceList.length; i++) {