aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMatthieuGeerebaert <matthieu.geerebaert@orange.com>2018-03-28 17:12:51 +0200
committerMatthieuGeerebaert <matthieu.geerebaert@orange.com>2018-04-03 23:36:25 +0200
commit9ac6c3cc7e3f4aec9ba69e7a5bb0800471c4e8dc (patch)
tree55122c3e6f668250d19d917e668066cf8647f125 /src
parent99bf586a6eb9799c4f33e43976d741f2807ea287 (diff)
Add service inventory
- Add service inventory operations get and find - Consumes AAI - Add tests Change-Id: If04ada259b7a172c1dbaac3649047cdb2d9dd5bc Issue-ID: EXTAPI-39 Signed-off-by: MatthieuGeerebaert <matthieu.geerebaert@orange.com>
Diffstat (limited to 'src')
-rw-r--r--src/main/java/org/onap/nbi/OnapComponentsUrlPaths.java2
-rw-r--r--src/main/java/org/onap/nbi/apis/servicecatalog/SdcClient.java5
-rw-r--r--src/main/java/org/onap/nbi/apis/serviceinventory/AaiClient.java82
-rw-r--r--src/main/java/org/onap/nbi/apis/serviceinventory/BaseClient.java33
-rw-r--r--src/main/java/org/onap/nbi/apis/serviceinventory/NbiClient.java20
-rw-r--r--src/main/java/org/onap/nbi/apis/serviceinventory/ServiceInventoryResource.java45
-rw-r--r--src/main/java/org/onap/nbi/apis/serviceinventory/ServiceInventoryService.java149
-rw-r--r--src/main/java/org/onap/nbi/apis/serviceinventory/jolt/FindServiceInventoryJsonTransformer.java35
-rw-r--r--src/main/java/org/onap/nbi/apis/serviceinventory/jolt/GetServiceInventoryJsonTransformer.java36
-rw-r--r--src/main/resources/application-localhost.properties16
-rw-r--r--src/main/resources/jolt/findServiceInventory.json24
-rw-r--r--src/main/resources/jolt/getServiceInventory.json44
-rw-r--r--src/test/java/org/onap/nbi/apis/resources/ApiTest.java74
-rw-r--r--src/test/java/org/onap/nbi/apis/resources/ServiceInventoryAssertions.java88
-rw-r--r--src/test/resources/application.properties15
-rw-r--r--src/test/resources/mappings/aai_get_6490_service-subscriptions.json24
-rw-r--r--src/test/resources/mappings/aai_get_customer_6490.json18
-rw-r--r--src/test/resources/mappings/aai_get_customer_generic.json18
-rw-r--r--src/test/resources/mappings/aai_get_generic_service-subscriptions.json20
-rw-r--r--src/test/resources/mappings/aai_get_service-subscription.json55
-rw-r--r--src/test/resources/mappings/aai_get_service-subscription_vnf.json58
-rw-r--r--src/test/resources/mappings/aai_get_service-subscriptionsVFW.json43
-rw-r--r--src/test/resources/mappings/aai_get_service-subscriptionsvFW-service-2VF-based.json43
-rw-r--r--src/test/resources/mappings/aai_get_tenants.json167
-rw-r--r--src/test/resources/mappings/aai_put_customer.json12
-rw-r--r--src/test/resources/mappings/aai_put_customer_service.json12
26 files changed, 1132 insertions, 6 deletions
diff --git a/src/main/java/org/onap/nbi/OnapComponentsUrlPaths.java b/src/main/java/org/onap/nbi/OnapComponentsUrlPaths.java
index 5ee6528..797fde8 100644
--- a/src/main/java/org/onap/nbi/OnapComponentsUrlPaths.java
+++ b/src/main/java/org/onap/nbi/OnapComponentsUrlPaths.java
@@ -15,7 +15,7 @@ public final class OnapComponentsUrlPaths {
// AAI
public static final String AAI_GET_TENANTS_PATH =
- "/aai/v11/cloud-infrastructure/cloud-regions/cloud-region/$cloudOwner/$lcpCloudRegionId/tenants";
+ "/aai/v11/cloud-infrastructure/cloud-regions/cloud-region/$onap.cloudOwner/$onap.lcpCloudRegionId/tenants";
public static final String AAI_GET_CUSTOMER_PATH = "/aai/v11/business/customers/customer/";
public static final String AAI_GET_SERVICES_FOR_CUSTOMER_PATH =
"/aai/v11/business/customers/customer/$customerId/service-subscriptions";
diff --git a/src/main/java/org/onap/nbi/apis/servicecatalog/SdcClient.java b/src/main/java/org/onap/nbi/apis/servicecatalog/SdcClient.java
index abc8bda..5bab982 100644
--- a/src/main/java/org/onap/nbi/apis/servicecatalog/SdcClient.java
+++ b/src/main/java/org/onap/nbi/apis/servicecatalog/SdcClient.java
@@ -50,8 +50,8 @@ public class SdcClient {
public LinkedHashMap callGet(String id) {
- StringBuilder callURL = new StringBuilder().append(sdcHost).append(OnapComponentsUrlPaths.SDC_ROOT_URL).append(id)
- .append(OnapComponentsUrlPaths.SDC_GET_PATH);
+ StringBuilder callURL = new StringBuilder().append(sdcHost).append(OnapComponentsUrlPaths.SDC_ROOT_URL)
+ .append(id).append(OnapComponentsUrlPaths.SDC_GET_PATH);
ResponseEntity<Object> response = callSdc(callURL.toString());
return (LinkedHashMap) response.getBody();
@@ -134,7 +134,6 @@ public class SdcClient {
} catch (BackendFunctionalException e) {
LOGGER.error(HTTP_CALL_SDC_ON + callURL.toString() + " error " + e);
-
return null;
}
}
diff --git a/src/main/java/org/onap/nbi/apis/serviceinventory/AaiClient.java b/src/main/java/org/onap/nbi/apis/serviceinventory/AaiClient.java
new file mode 100644
index 0000000..1f5f74d
--- /dev/null
+++ b/src/main/java/org/onap/nbi/apis/serviceinventory/AaiClient.java
@@ -0,0 +1,82 @@
+package org.onap.nbi.apis.serviceinventory;
+
+import java.util.LinkedHashMap;
+import org.onap.nbi.OnapComponentsUrlPaths;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Service;
+
+@Service
+public class AaiClient extends BaseClient {
+
+ public static final String CUSTOMER_ID = "$customerId";
+
+ @Value("${aai.host}")
+ private String aaiHost;
+
+ @Value("${aai.header.authorization}")
+ private String aaiHeaderAuthorization;
+
+ @Value("${aai.api.id}")
+ private String aaiApiId;
+
+ private static final String HEADER_AUTHORIZATION = "Authorization";
+ private static final String X_FROM_APP_ID = "X-FromAppId";
+
+ private HttpHeaders buildRequestHeaderForAAI() {
+
+ HttpHeaders httpHeaders = new HttpHeaders();
+ httpHeaders.add(HEADER_AUTHORIZATION, aaiHeaderAuthorization);
+ httpHeaders.add(X_FROM_APP_ID, aaiApiId);
+ httpHeaders.add("Accept", "application/json");
+ httpHeaders.add("Content-Type", "application/json");
+ return httpHeaders;
+
+ }
+
+ public LinkedHashMap getCatalogService(String customerId, String serviceSpecName, String serviceId) {
+
+ StringBuilder callURL =
+ new StringBuilder().append(aaiHost).append(OnapComponentsUrlPaths.AAI_GET_SERVICE_FOR_CUSTOMER_PATH);
+ String callUrlFormated = callURL.toString().replace(CUSTOMER_ID, customerId);
+ callUrlFormated = callUrlFormated.replace("$serviceSpecName", serviceSpecName);
+ callUrlFormated = callUrlFormated.replace("$serviceId", serviceId);
+
+ ResponseEntity<Object> response = callApiGet(callUrlFormated, buildRequestHeaderForAAI());
+ if (response != null && response.getStatusCode().equals(HttpStatus.OK)) {
+ return (LinkedHashMap) response.getBody();
+ }
+ return null;
+ }
+
+
+ public LinkedHashMap getVNF(String relatedLink) {
+
+ StringBuilder callURL = new StringBuilder().append(aaiHost).append(relatedLink);
+
+ ResponseEntity<Object> response = callApiGet(callURL.toString(), buildRequestHeaderForAAI());
+ return (LinkedHashMap) response.getBody();
+
+ }
+
+ public LinkedHashMap getServicesInAaiForCustomer(String customerId) {
+ StringBuilder callURL =
+ new StringBuilder().append(aaiHost).append(OnapComponentsUrlPaths.AAI_GET_SERVICES_FOR_CUSTOMER_PATH);
+ String callUrlFormated = callURL.toString().replace(CUSTOMER_ID, customerId);
+
+ ResponseEntity<Object> response = callApiGet(callUrlFormated, buildRequestHeaderForAAI());
+ return (LinkedHashMap) response.getBody();
+ }
+
+ public LinkedHashMap getServiceInstancesInAaiForCustomer(String customerId, String serviceType) {
+ StringBuilder callURL =
+ new StringBuilder().append(aaiHost).append(OnapComponentsUrlPaths.AAI_GET_SERVICE_INSTANCES_PATH);
+ String callUrlFormated = callURL.toString().replace(CUSTOMER_ID, customerId);
+ callUrlFormated = callUrlFormated.replace("$serviceSpecName", serviceType);
+
+ ResponseEntity<Object> response = callApiGet(callUrlFormated, buildRequestHeaderForAAI());
+ return (LinkedHashMap) response.getBody();
+ }
+}
diff --git a/src/main/java/org/onap/nbi/apis/serviceinventory/BaseClient.java b/src/main/java/org/onap/nbi/apis/serviceinventory/BaseClient.java
new file mode 100644
index 0000000..b9a93d0
--- /dev/null
+++ b/src/main/java/org/onap/nbi/apis/serviceinventory/BaseClient.java
@@ -0,0 +1,33 @@
+package org.onap.nbi.apis.serviceinventory;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpMethod;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.client.RestTemplate;
+
+public abstract class BaseClient {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(BaseClient.class);
+
+ @Autowired
+ private RestTemplate restTemplate;
+
+ protected ResponseEntity<Object> callApiGet(String callURL, HttpHeaders httpHeaders) {
+
+ ResponseEntity<Object> response = restTemplate.exchange(callURL, HttpMethod.GET,
+ new HttpEntity<>("parameters", httpHeaders), Object.class);
+ LOGGER.debug("response body : " + response.getBody().toString());
+ LOGGER.info("response status : " + response.getStatusCodeValue());
+ if (!response.getStatusCode().equals(HttpStatus.OK)) {
+ LOGGER.warn("HTTP call on " + callURL + " returns " + response.getStatusCodeValue() + ", "
+ + response.getBody().toString());
+ }
+ return response;
+ }
+
+}
diff --git a/src/main/java/org/onap/nbi/apis/serviceinventory/NbiClient.java b/src/main/java/org/onap/nbi/apis/serviceinventory/NbiClient.java
new file mode 100644
index 0000000..cbbd88d
--- /dev/null
+++ b/src/main/java/org/onap/nbi/apis/serviceinventory/NbiClient.java
@@ -0,0 +1,20 @@
+package org.onap.nbi.apis.serviceinventory;
+
+import java.util.LinkedHashMap;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Service;
+
+@Service
+public class NbiClient extends BaseClient {
+
+ @Value("${nbi.url}")
+ private String nbiUrl;
+
+ public LinkedHashMap getServiceSpecification(String id) {
+ StringBuilder callURL = new StringBuilder().append(nbiUrl).append("/serviceSpecification/").append(id);
+ ResponseEntity<Object> response = callApiGet(callURL.toString(), new HttpHeaders());
+ return (LinkedHashMap) response.getBody();
+ }
+}
diff --git a/src/main/java/org/onap/nbi/apis/serviceinventory/ServiceInventoryResource.java b/src/main/java/org/onap/nbi/apis/serviceinventory/ServiceInventoryResource.java
new file mode 100644
index 0000000..9092381
--- /dev/null
+++ b/src/main/java/org/onap/nbi/apis/serviceinventory/ServiceInventoryResource.java
@@ -0,0 +1,45 @@
+package org.onap.nbi.apis.serviceinventory;
+
+import java.util.LinkedHashMap;
+import java.util.List;
+import org.onap.nbi.commons.JsonRepresentation;
+import org.onap.nbi.commons.ResourceManagement;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+import org.springframework.util.MultiValueMap;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/service")
+public class ServiceInventoryResource extends ResourceManagement {
+
+ @Autowired
+ ServiceInventoryService serviceInventoryService;
+
+ @GetMapping(value = "/{serviceId}", produces = MediaType.APPLICATION_JSON_VALUE)
+ public ResponseEntity<Object> getServiceInventory(@PathVariable String serviceId,
+ @RequestParam MultiValueMap<String, String> params) {
+
+ LinkedHashMap response = serviceInventoryService.get(serviceId, params);
+
+ JsonRepresentation filter = new JsonRepresentation(params);
+ return this.getResponse(response, filter);
+
+ }
+
+ @GetMapping(value = "", produces = MediaType.APPLICATION_JSON_VALUE)
+ public ResponseEntity<Object> findServiceInventory(@RequestParam MultiValueMap<String, String> params) {
+
+ List<LinkedHashMap> response = serviceInventoryService.find(params);
+ JsonRepresentation filter = new JsonRepresentation(params);
+ return this.findResponse(response, filter, null);
+
+ }
+
+
+}
diff --git a/src/main/java/org/onap/nbi/apis/serviceinventory/ServiceInventoryService.java b/src/main/java/org/onap/nbi/apis/serviceinventory/ServiceInventoryService.java
new file mode 100644
index 0000000..886a464
--- /dev/null
+++ b/src/main/java/org/onap/nbi/apis/serviceinventory/ServiceInventoryService.java
@@ -0,0 +1,149 @@
+package org.onap.nbi.apis.serviceinventory;
+
+import java.util.ArrayList;
+import java.util.LinkedHashMap;
+import java.util.List;
+import org.onap.nbi.apis.serviceinventory.jolt.FindServiceInventoryJsonTransformer;
+import org.onap.nbi.apis.serviceinventory.jolt.GetServiceInventoryJsonTransformer;
+import org.onap.nbi.exceptions.BackendFunctionalException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.stereotype.Service;
+import org.springframework.util.MultiValueMap;
+import org.springframework.util.StringUtils;
+
+@Service
+public class ServiceInventoryService {
+
+ @Autowired
+ NbiClient nbiClient;
+
+ @Autowired
+ AaiClient aaiClient;
+
+ @Autowired
+ GetServiceInventoryJsonTransformer getServiceInventoryJsonTransformer;
+
+ @Autowired
+ FindServiceInventoryJsonTransformer findServiceInventoryJsonTransformer;
+
+ public LinkedHashMap get(String serviceId, MultiValueMap<String, String> params) {
+
+ String clientId = params.getFirst("relatedParty.id");
+ String serviceSpecId = params.getFirst("serviceSpecification.id");
+ String serviceSpecName = params.getFirst("serviceSpecification.name");
+
+ if (StringUtils.isEmpty(serviceSpecId) && StringUtils.isEmpty(serviceSpecName)) {
+ throw new BackendFunctionalException(HttpStatus.NOT_FOUND,
+ "serviceSpecName or serviceSpecId must be provided");
+ }
+
+ String customerId = getCustomerId(clientId);
+ String serviceName = getServiceName(serviceSpecName, serviceSpecId);
+ LinkedHashMap serviceResponse = aaiClient.getCatalogService(customerId, serviceName, serviceId);
+
+ if (serviceResponse != null) {
+ addVnfsToResponse(serviceResponse);
+ LinkedHashMap serviceInventoryResponse =
+ (LinkedHashMap) getServiceInventoryJsonTransformer.transform(serviceResponse);
+ addRelatedPartyId(customerId, serviceInventoryResponse);
+ return serviceInventoryResponse;
+ } else {
+ throw new BackendFunctionalException(HttpStatus.NOT_FOUND, "no catalog service found");
+ }
+
+ }
+
+
+ private String getCustomerId(String clientId) {
+
+ if (StringUtils.isEmpty(clientId)) {
+ return "generic";
+ } else {
+ return clientId;
+ }
+
+ }
+
+ private String getServiceName(String serviceSpecificationName, String serviceSpecificationId) {
+
+ if (StringUtils.isEmpty(serviceSpecificationName)) {
+ LinkedHashMap serviceSpecification = nbiClient.getServiceSpecification(serviceSpecificationId);
+ return (String) serviceSpecification.get("name");
+ } else {
+ return serviceSpecificationName;
+ }
+
+ }
+
+ private void addRelatedPartyId(String customerId, LinkedHashMap serviceInventoryResponse) {
+
+ LinkedHashMap relatedParty = (LinkedHashMap) serviceInventoryResponse.get("relatedParty");
+ relatedParty.put("id", customerId);
+
+ }
+
+ private void addVnfsToResponse(LinkedHashMap serviceResponse) {
+
+ List<LinkedHashMap> vnfs = new ArrayList<>();
+ LinkedHashMap relationShip = (LinkedHashMap) serviceResponse.get("relationship-list");
+ List<LinkedHashMap> relationsList = (List<LinkedHashMap>) relationShip.get("relationship");
+ for (LinkedHashMap relation : relationsList) {
+ String relatedLink = (String) relation.get("related-link");
+ LinkedHashMap vnf = aaiClient.getVNF(relatedLink);
+ if (vnf != null) {
+ vnfs.add(vnf);
+ }
+ }
+ serviceResponse.put("vnfs", vnfs);
+
+ }
+
+
+ public List<LinkedHashMap> find(MultiValueMap<String, String> params) {
+
+ String clientId = params.getFirst("relatedParty.id");
+ String serviceSpecId = params.getFirst("serviceSpecification.id");
+ String serviceSpecName = params.getFirst("serviceSpecification.name");
+ String customerId = getCustomerId(clientId);
+ String serviceName;
+ List<LinkedHashMap> serviceInstances = new ArrayList<>();
+ if (StringUtils.isEmpty(serviceSpecId) && StringUtils.isEmpty(serviceSpecName)) {
+ LinkedHashMap servicesInAaiForCustomer = aaiClient.getServicesInAaiForCustomer(customerId);
+ List<LinkedHashMap> servicesInAAI =
+ (List<LinkedHashMap>) servicesInAaiForCustomer.get("service-subscription");
+ for (LinkedHashMap service : servicesInAAI) {
+ String serviceType = (String) service.get("service-type");
+ buildServiceInstances(serviceInstances, customerId, serviceType);
+ }
+ } else {
+ serviceName = getServiceName(serviceSpecName, serviceSpecId);
+ buildServiceInstances(serviceInstances, customerId, serviceName);
+ }
+
+ List<LinkedHashMap> serviceInventoryResponse =
+ (List<LinkedHashMap>) findServiceInventoryJsonTransformer.transform(serviceInstances);
+ for (LinkedHashMap serviceInventory : serviceInventoryResponse) {
+ LinkedHashMap party = (LinkedHashMap) serviceInventory.get("relatedParty");
+ party.put("id", customerId);
+ }
+ return serviceInventoryResponse;
+
+ }
+
+ private void buildServiceInstances(List<LinkedHashMap> serviceInstances, String customerId, String serviceType) {
+
+ LinkedHashMap serviceInstancesInAaiForCustomer =
+ aaiClient.getServiceInstancesInAaiForCustomer(customerId, serviceType);
+ List<LinkedHashMap> serviceInstancesForServiceType =
+ (List<LinkedHashMap>) serviceInstancesInAaiForCustomer.get("service-instance");
+
+ // add service type for jolt
+ for (LinkedHashMap serviceInstanceForServiceType : serviceInstancesForServiceType) {
+ serviceInstanceForServiceType.put("service-type", serviceType);
+ }
+ serviceInstances.addAll(serviceInstancesForServiceType);
+
+ }
+
+}
diff --git a/src/main/java/org/onap/nbi/apis/serviceinventory/jolt/FindServiceInventoryJsonTransformer.java b/src/main/java/org/onap/nbi/apis/serviceinventory/jolt/FindServiceInventoryJsonTransformer.java
new file mode 100644
index 0000000..8173215
--- /dev/null
+++ b/src/main/java/org/onap/nbi/apis/serviceinventory/jolt/FindServiceInventoryJsonTransformer.java
@@ -0,0 +1,35 @@
+package org.onap.nbi.apis.serviceinventory.jolt;
+
+import java.util.List;
+import org.onap.nbi.exceptions.TechnicalException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+import com.bazaarvoice.jolt.Chainr;
+import com.bazaarvoice.jolt.JsonUtils;
+import com.bazaarvoice.jolt.exception.JoltException;
+
+@Service
+public class FindServiceInventoryJsonTransformer {
+
+ private Chainr chainr;
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(FindServiceInventoryJsonTransformer.class);
+
+ public FindServiceInventoryJsonTransformer() {
+ List<Object> specs = JsonUtils.classpathToList("/jolt/findServiceInventory.json");
+ this.chainr = Chainr.fromSpec(specs);
+ }
+
+ public Object transform(Object serviceSpec) {
+ Object output = null;
+ try {
+ output = chainr.transform(serviceSpec);
+ } catch (JoltException joE) {
+ LOGGER.error("Unable to transform SDC response with JOLT Transformer : " + joE.getMessage());
+ throw new TechnicalException("Error while parsing ONAP response");
+ }
+ return output;
+ }
+
+}
diff --git a/src/main/java/org/onap/nbi/apis/serviceinventory/jolt/GetServiceInventoryJsonTransformer.java b/src/main/java/org/onap/nbi/apis/serviceinventory/jolt/GetServiceInventoryJsonTransformer.java
new file mode 100644
index 0000000..f82c696
--- /dev/null
+++ b/src/main/java/org/onap/nbi/apis/serviceinventory/jolt/GetServiceInventoryJsonTransformer.java
@@ -0,0 +1,36 @@
+package org.onap.nbi.apis.serviceinventory.jolt;
+
+import java.util.List;
+import org.onap.nbi.exceptions.TechnicalException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+import com.bazaarvoice.jolt.Chainr;
+import com.bazaarvoice.jolt.JsonUtils;
+import com.bazaarvoice.jolt.exception.JoltException;
+
+@Service
+public class GetServiceInventoryJsonTransformer {
+
+ private Chainr chainr;
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(GetServiceInventoryJsonTransformer.class);
+
+
+ public GetServiceInventoryJsonTransformer() {
+ List<Object> specs = JsonUtils.classpathToList("/jolt/getServiceInventory.json");
+ this.chainr = Chainr.fromSpec(specs);
+ }
+
+ public Object transform(Object serviceSpec) {
+ Object output = null;
+ try {
+ output = chainr.transform(serviceSpec);
+ } catch (JoltException joE) {
+ LOGGER.error("Unable to transform SDC response with JOLT Transformer : " + joE.getMessage());
+ throw new TechnicalException("Error while parsing ONAP response");
+ }
+ return output;
+ }
+
+}
diff --git a/src/main/resources/application-localhost.properties b/src/main/resources/application-localhost.properties
index 58b13f6..e753488 100644
--- a/src/main/resources/application-localhost.properties
+++ b/src/main/resources/application-localhost.properties
@@ -1,7 +1,23 @@
# LOGGING
logging.level.org.onap.nbi=DEBUG
+# ONAP
+onap.lcpCloudRegionId=RegionOne
+onap.tenantId=31047205ce114b60833b23e400d6a535
+onap.cloudOwner=CloudOwner
+
+# NBI
+nbi.url=http://127.0.0.1:8080/nbi/api/v1
+
# SDC
sdc.host=http://127.0.0.1:8090
sdc.header.ecompInstanceId=Rene
sdc.header.authorization=Basic YWFpOktwOGJKNFNYc3pNMFdYbGhhazNlSGxjc2UyZ0F3ODR2YW9HR21KdlV5MlU=
+
+# AAI
+aai.host=http://127.0.0.1:8090
+aai.header.authorization=Basic QUFJOkFBSQ==
+aai.api.id=AAI
+
+
+
diff --git a/src/main/resources/jolt/findServiceInventory.json b/src/main/resources/jolt/findServiceInventory.json
new file mode 100644
index 0000000..7188edc
--- /dev/null
+++ b/src/main/resources/jolt/findServiceInventory.json
@@ -0,0 +1,24 @@
+[
+ {
+ "operation": "shift",
+ "spec": {
+ "*": {
+ "service-instance-id": "[&1].id",
+ "service-instance-name": "[&1].name",
+ "service-type": "[&1].serviceSpecification.name",
+ "model-version-id": "[&1].serviceSpecification.id"
+ }
+ }
+ },
+ {
+ "operation": "default",
+ "spec": {
+ "*": {
+ "relatedParty": {
+
+ "role": "ONAPcustomer"
+ }
+ }
+ }
+ }
+] \ No newline at end of file
diff --git a/src/main/resources/jolt/getServiceInventory.json b/src/main/resources/jolt/getServiceInventory.json
new file mode 100644
index 0000000..df4f14c
--- /dev/null
+++ b/src/main/resources/jolt/getServiceInventory.json
@@ -0,0 +1,44 @@
+[
+ {
+ "operation": "shift",
+ "spec": {
+ "service-instance-id": "id",
+ "service-instance-name": "name",
+ "model-version-id" : "serviceSpecification.id",
+ "model-invariant-id": "serviceSpecification.invariantUUID",
+ "vnfs" : {
+ "*": {
+ "vnf-id": "supportingResource[&1].id",
+ "related-link": "supportingResource[&1].href",
+ "vnf-name": "supportingResource[&1].name",
+ "prov-status": "supportingResource[&1].status",
+ "model-invariant-id": "supportingResource[&1].modelInvariantId",
+ "model-version-id": "supportingResource[&1].modelVersionId",
+ "model-customisation-id": "supportingResource[&1].status"
+
+ }
+ }
+ }
+ },
+ {
+ "operation": "default",
+ "spec": {
+ "type": "service-instance",
+ "hasStarted": "yes",
+ "@type": "serviceONAP",
+ "serviceSpecification" : {
+ "@type" :"ONAPservice"
+ },
+ "supportingResource[]" : {
+ "*": {
+ "@referredType": "ONAP resource"
+ }
+
+ },
+ "relatedParty" : {
+ "role" :"ONAPcustomer"
+ }
+
+ }
+ }
+] \ No newline at end of file
diff --git a/src/test/java/org/onap/nbi/apis/resources/ApiTest.java b/src/test/java/org/onap/nbi/apis/resources/ApiTest.java
index 05d332c..df2fb24 100644
--- a/src/test/java/org/onap/nbi/apis/resources/ApiTest.java
+++ b/src/test/java/org/onap/nbi/apis/resources/ApiTest.java
@@ -8,6 +8,7 @@ import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.onap.nbi.apis.servicecatalog.ServiceSpecificationResource;
+import org.onap.nbi.apis.serviceinventory.ServiceInventoryResource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.embedded.LocalServerPort;
import org.springframework.boot.test.context.SpringBootTest;
@@ -26,12 +27,14 @@ public class ApiTest {
String realServerPort;
-
static public WireMockServer wireMockServer = new WireMockServer(8091);
@Autowired
ServiceSpecificationResource serviceSpecificationResource;
+ @Autowired
+ ServiceInventoryResource serviceInventoryResource;
+
@BeforeClass
public static void setUp() throws Exception {
wireMockServer.start();
@@ -48,6 +51,8 @@ public class ApiTest {
wireMockServer.resetToDefaultMappings();
}
+ // serviceCatalog
+
@Test
@Ignore
public void testServiceResourceGetCatalog() throws Exception {
@@ -86,4 +91,71 @@ public class ApiTest {
}
+ // serviceInventory
+
+ @Test
+ public void testServiceResourceGetInventory() throws Exception {
+
+ String serviceName = "vFW";
+ String serviceId = "e4688e5f-61a0-4f8b-ae02-a2fbde623bcb";
+ MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
+ params.add("serviceSpecification.name", serviceName);
+ params.add("relatedParty.id", "6490");
+ ResponseEntity<Object> resource = serviceInventoryResource.getServiceInventory(serviceId, params);
+ ServiceInventoryAssertions.assertServiceInventoryGet(resource);
+
+ }
+
+
+ @Test
+ public void testServiceResourceGetInventoryWithServiceSpecId() throws Exception {
+
+ String serviceId = "e4688e5f-61a0-4f8b-ae02-a2fbde623bcb";
+ MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
+ params.add("serviceSpecification.id", "1e3feeb0-8e36-46c6-862c-236d9c626439");
+ params.add("relatedParty.id", "6490");
+ ResponseEntity<Object> resource = serviceInventoryResource.getServiceInventory(serviceId, params);
+ ServiceInventoryAssertions.assertServiceInventoryGet(resource);
+
+ }
+
+
+ @Test
+ public void testServiceInventoryFind() throws Exception {
+
+ MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
+ String serviceName = "vFW";
+ params.add("serviceSpecification.name", serviceName);
+ params.add("relatedParty.id", "6490");
+
+ ResponseEntity<Object> resource = serviceInventoryResource.findServiceInventory(params);
+ ServiceInventoryAssertions.assertServiceInventoryFind(resource);
+
+ }
+
+
+ @Test
+ public void testServiceInventoryFindWithServiceSpecId() throws Exception {
+
+ MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
+ params.add("serviceSpecification.id", "1e3feeb0-8e36-46c6-862c-236d9c626439");
+ params.add("relatedParty.id", "6490");
+
+ ResponseEntity<Object> resource = serviceInventoryResource.findServiceInventory(params);
+ ServiceInventoryAssertions.assertServiceInventoryFind(resource);
+
+ }
+
+
+ @Test
+ public void testServiceInventoryFindWithoutParameter() throws Exception {
+
+ MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
+ params.add("relatedParty.id", "6490");
+
+ ResponseEntity<Object> resource = serviceInventoryResource.findServiceInventory(params);
+ ServiceInventoryAssertions.assertServiceInventoryFindWithoutParameter(resource);
+
+ }
+
}
diff --git a/src/test/java/org/onap/nbi/apis/resources/ServiceInventoryAssertions.java b/src/test/java/org/onap/nbi/apis/resources/ServiceInventoryAssertions.java
new file mode 100644
index 0000000..e8afc9c
--- /dev/null
+++ b/src/test/java/org/onap/nbi/apis/resources/ServiceInventoryAssertions.java
@@ -0,0 +1,88 @@
+package org.onap.nbi.apis.resources;
+
+
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+
+import java.util.ArrayList;
+import java.util.LinkedHashMap;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class ServiceInventoryAssertions {
+
+
+
+
+ public static void assertServiceInventoryGet(ResponseEntity<Object> resource) {
+ assertThat(resource.getStatusCode()).isEqualTo(HttpStatus.OK);
+ LinkedHashMap service = (LinkedHashMap)resource.getBody();
+ assertThat(service.get("id")).isEqualTo("e4688e5f-61a0-4f8b-ae02-a2fbde623bcb");
+ assertThat(service.get("name")).isEqualTo("NewFreeRadius-service-instance-01");
+ assertThat(service.get("hasStarted")).isEqualTo("yes");
+ assertThat(service.get("type")).isEqualTo("service-instance");
+ assertThat(service.get("@type")).isEqualTo("serviceONAP");
+ LinkedHashMap relatedParty = (LinkedHashMap) service.get("relatedParty");
+ assertThat(relatedParty.get("role")).isEqualTo("ONAPcustomer");
+ assertThat(relatedParty.get("id")).isEqualTo("6490");
+ LinkedHashMap serviceSpecification = (LinkedHashMap)service.get("serviceSpecification");
+ assertThat(serviceSpecification.get("id")).isEqualTo("98d95267-5e0f-4531-abf8-f14b90031dc5");
+ assertThat(serviceSpecification.get("invariantUUID")).isEqualTo("709d157b-52fb-4250-976e-7133dff5c347");
+ assertThat(serviceSpecification.get("@type")).isEqualTo("ONAPservice");
+
+
+ assertThat(((ArrayList)service.get("supportingResource")).size()).isEqualTo(2);
+ LinkedHashMap resource1 = (LinkedHashMap) ((ArrayList) service.get("supportingResource")).get(0);
+ assertThat(resource1.get("id")).isEqualTo("cb80fbb6-9aa7-4ac5-9541-e14f45de533e");
+ assertThat(resource1.get("name")).isEqualTo("NewFreeRadius-VNF-instance-01");
+ assertThat(resource1.get("status")).isEqualTo("PREPROV");
+ assertThat(resource1.get("modelInvariantId")).isEqualTo("f5993703-977f-4346-a1c9-c1884f8cfd8d");
+ assertThat(resource1.get("modelVersionId")).isEqualTo("902438f7-1e4c-492d-b7cc-8650e13b8aeb");
+ assertThat(resource1.get("@referredType")).isEqualTo("ONAP resource");
+ }
+
+
+ public static void assertServiceInventoryFind(ResponseEntity<Object> resource) {
+ assertThat(resource.getStatusCode()).isEqualTo(HttpStatus.OK);
+ ArrayList body = (ArrayList)resource.getBody();
+ assertThat(body.size()).isEqualTo(1);
+ LinkedHashMap service1 = (LinkedHashMap)body.get(0);
+ assertThat(service1.get("id")).isEqualTo("e4688e5f-61a0-4f8b-ae02-a2fbde623bcb");
+ assertThat(service1.get("name")).isEqualTo("NewFreeRadius-service-instance-01");
+ LinkedHashMap relatedParty = (LinkedHashMap) service1.get("relatedParty");
+ assertThat(relatedParty.get("role")).isEqualTo("ONAPcustomer");
+ assertThat(relatedParty.get("id")).isEqualTo("6490");
+ LinkedHashMap serviceSpecification = (LinkedHashMap) service1.get("serviceSpecification");
+ assertThat(serviceSpecification.get("name")).isEqualTo("vFW");
+ assertThat(serviceSpecification.get("id")).isEqualTo("98d95267-5e0f-4531-abf8-f14b90031dc5");
+ }
+
+
+ public static void assertServiceInventoryFindWithoutParameter(ResponseEntity<Object> resource) {
+ assertThat(resource.getStatusCode()).isEqualTo(HttpStatus.OK);
+ ArrayList body = (ArrayList)resource.getBody();
+ assertThat(body.size()).isEqualTo(2);
+ LinkedHashMap service1 = (LinkedHashMap)body.get(0);
+ assertThat(service1.get("id")).isEqualTo("vfw-service-id");
+ assertThat(service1.get("name")).isEqualTo("vfw-service-name");
+ LinkedHashMap relatedParty = (LinkedHashMap) service1.get("relatedParty");
+ assertThat(relatedParty.get("role")).isEqualTo("ONAPcustomer");
+ assertThat(relatedParty.get("id")).isEqualTo("6490");
+ LinkedHashMap serviceSpecification = (LinkedHashMap) service1.get("serviceSpecification");
+ assertThat(serviceSpecification.get("name")).isEqualTo("vFW-service-2VF-based");
+ assertThat(serviceSpecification.get("id")).isEqualTo("9vfw-service-modek-version-id");
+
+
+ LinkedHashMap service2 = (LinkedHashMap)body.get(1);
+ assertThat(service2.get("id")).isEqualTo("e4688e5f-61a0-4f8b-ae02-a2fbde623bcb");
+ assertThat(service2.get("name")).isEqualTo("NewFreeRadius-service-instance-01");
+ relatedParty = (LinkedHashMap) service1.get("relatedParty");
+ assertThat(relatedParty.get("role")).isEqualTo("ONAPcustomer");
+ assertThat(relatedParty.get("id")).isEqualTo("6490");
+ serviceSpecification = (LinkedHashMap) service2.get("serviceSpecification");
+ assertThat(serviceSpecification.get("name")).isEqualTo("vFW");
+ assertThat(serviceSpecification.get("id")).isEqualTo("98d95267-5e0f-4531-abf8-f14b90031dc5");
+
+ }
+
+}
diff --git a/src/test/resources/application.properties b/src/test/resources/application.properties
index 5d18ec8..f778b8a 100644
--- a/src/test/resources/application.properties
+++ b/src/test/resources/application.properties
@@ -4,10 +4,23 @@ server.port = 8080
# LOGGING
logging.level.org.onap.nbi=DEBUG
-logging.level.org.springframework.cloud.contract.wiremock=DEBUG
+
+# ONAP
+onap.lcpCloudRegionId=RegionOne
+onap.tenantId=31047205ce114b60833b23e400d6a535
+onap.cloudOwner=CloudOwner
+
+# NBI
+nbi.url=http://127.0.0.1:8080/nbi/api/v1
# SDC
sdc.host=http://127.0.0.1:8091
sdc.header.ecompInstanceId=Rene
sdc.header.authorization=Basic YWFpOktwOGJKNFNYc3pNMFdYbGhhazNlSGxjc2UyZ0F3ODR2YW9HR21KdlV5MlU=
+# AAI
+aai.host=http://127.0.0.1:8091
+aai.header.authorization=Basic QUFJOkFBSQ==
+aai.api.id=AAI
+
+
diff --git a/src/test/resources/mappings/aai_get_6490_service-subscriptions.json b/src/test/resources/mappings/aai_get_6490_service-subscriptions.json
new file mode 100644
index 0000000..5582990
--- /dev/null
+++ b/src/test/resources/mappings/aai_get_6490_service-subscriptions.json
@@ -0,0 +1,24 @@
+{
+ "request": {
+ "method": "GET",
+ "url": "/aai/v11/business/customers/customer/6490/service-subscriptions"
+ },
+ "response": {
+ "status": 200,
+ "jsonBody": {
+ "service-subscription": [
+ {
+ "service-type": "vFW-service-2VF-based",
+ "resource-version": "1519809287769"
+ },
+ {
+ "service-type": "vFW",
+ "resource-version": "1519660513613"
+ }
+ ]
+ },
+ "headers": {
+ "Content-Type": "application/json"
+ }
+ }
+} \ No newline at end of file
diff --git a/src/test/resources/mappings/aai_get_customer_6490.json b/src/test/resources/mappings/aai_get_customer_6490.json
new file mode 100644
index 0000000..eaf5a4b
--- /dev/null
+++ b/src/test/resources/mappings/aai_get_customer_6490.json
@@ -0,0 +1,18 @@
+{
+ "request": {
+ "method": "GET",
+ "url": "/aai/v11/business/customers/customer/6490"
+ },
+ "response": {
+ "status": 200,
+ "jsonBody": {
+ "global-customer-id": "6490",
+ "subscriber-name": "Jean Pontus",
+ "subscriber-type": "BSS",
+ "resource-version": "1518595364087"
+ },
+ "headers": {
+ "Content-Type": "application/json"
+ }
+ }
+} \ No newline at end of file
diff --git a/src/test/resources/mappings/aai_get_customer_generic.json b/src/test/resources/mappings/aai_get_customer_generic.json
new file mode 100644
index 0000000..250f5d6
--- /dev/null
+++ b/src/test/resources/mappings/aai_get_customer_generic.json
@@ -0,0 +1,18 @@
+{
+ "request": {
+ "method": "GET",
+ "url": "/aai/v11/business/customers/customer/generic"
+ },
+ "response": {
+ "status": 200,
+ "jsonBody": {
+ "global-customer-id": "generic",
+ "subscriber-name": "generic",
+ "subscriber-type": "BSS",
+ "resource-version": "1518595364087"
+ },
+ "headers": {
+ "Content-Type": "application/json"
+ }
+ }
+} \ No newline at end of file
diff --git a/src/test/resources/mappings/aai_get_generic_service-subscriptions.json b/src/test/resources/mappings/aai_get_generic_service-subscriptions.json
new file mode 100644
index 0000000..5cf9ddd
--- /dev/null
+++ b/src/test/resources/mappings/aai_get_generic_service-subscriptions.json
@@ -0,0 +1,20 @@
+{
+ "request": {
+ "method": "GET",
+ "url": "/aai/v11/business/customers/customer/generic/service-subscriptions"
+ },
+ "response": {
+ "status": 200,
+ "jsonBody": {
+ "service-subscription": [
+ {
+ "service-type": "vFW",
+ "resource-version": "1519660513613"
+ }
+ ]
+ },
+ "headers": {
+ "Content-Type": "application/json"
+ }
+ }
+} \ No newline at end of file
diff --git a/src/test/resources/mappings/aai_get_service-subscription.json b/src/test/resources/mappings/aai_get_service-subscription.json
new file mode 100644
index 0000000..03558a9
--- /dev/null
+++ b/src/test/resources/mappings/aai_get_service-subscription.json
@@ -0,0 +1,55 @@
+{
+ "request": {
+ "method": "GET",
+ "url": "/aai/v11/business/customers/customer/6490/service-subscriptions/service-subscription/vFW/service-instances/service-instance/e4688e5f-61a0-4f8b-ae02-a2fbde623bcb"
+ },
+ "response": {
+ "status": 200,
+ "jsonBody": {
+ "service-instance-id": "e4688e5f-61a0-4f8b-ae02-a2fbde623bcb",
+ "service-instance-name": "NewFreeRadius-service-instance-01",
+ "model-invariant-id": "709d157b-52fb-4250-976e-7133dff5c347",
+ "model-version-id": "98d95267-5e0f-4531-abf8-f14b90031dc5",
+ "resource-version": "1518508381261",
+ "relationship-list": {
+ "relationship": [
+ {
+ "related-to": "generic-vnf",
+ "related-link": "/aai/v11/network/generic-vnfs/generic-vnf/cb80fbb6-9aa7-4ac5-9541-e14f45de533e",
+ "relationship-data": [
+ {
+ "relationship-key": "generic-vnf.vnf-id",
+ "relationship-value": "cb80fbb6-9aa7-4ac5-9541-e14f45de533e"
+ }
+ ],
+ "related-to-property": [
+ {
+ "property-key": "generic-vnf.vnf-name",
+ "property-value": "NewFreeRadius-VNF-instance-01"
+ }
+ ]
+ },
+ {
+ "related-to": "generic-vnf",
+ "related-link": "/aai/v11/network/generic-vnfs/generic-vnf/cb80fbb6-9aa7-4ac5-9541-e14f45de533e",
+ "relationship-data": [
+ {
+ "relationship-key": "generic-vnf.vnf-id",
+ "relationship-value": "cb80fbb6-9aa7-4ac5-9541-e14f45de533e"
+ }
+ ],
+ "related-to-property": [
+ {
+ "property-key": "generic-vnf.vnf-name",
+ "property-value": "NewFreeRadius-VNF-instance-01"
+ }
+ ]
+ }
+ ]
+ }
+ },
+ "headers": {
+ "Content-Type": "application/json"
+ }
+ }
+} \ No newline at end of file
diff --git a/src/test/resources/mappings/aai_get_service-subscription_vnf.json b/src/test/resources/mappings/aai_get_service-subscription_vnf.json
new file mode 100644
index 0000000..7c33979
--- /dev/null
+++ b/src/test/resources/mappings/aai_get_service-subscription_vnf.json
@@ -0,0 +1,58 @@
+{
+ "request": {
+ "method": "GET",
+ "url": "/aai/v11/network/generic-vnfs/generic-vnf/cb80fbb6-9aa7-4ac5-9541-e14f45de533e"
+ },
+ "response": {
+ "status": 200,
+ "jsonBody": {
+ "vnf-id": "cb80fbb6-9aa7-4ac5-9541-e14f45de533e",
+ "vnf-name": "NewFreeRadius-VNF-instance-01",
+ "vnf-type": "NewFreeRadius-service/New-FreeRadius 0",
+ "service-id": "709d157b-52fb-4250-976e-7133dff5c347",
+ "prov-status": "PREPROV",
+ "orchestration-status": "Created",
+ "in-maint": false,
+ "is-closed-loop-disabled": false,
+ "resource-version": "1516871905399",
+ "model-invariant-id": "f5993703-977f-4346-a1c9-c1884f8cfd8d",
+ "model-version-id": "902438f7-1e4c-492d-b7cc-8650e13b8aeb",
+ "model-customization-id": "a2def5c8-ab15-482b-a2cd-2af0b987300f",
+ "nf-type": "",
+ "nf-function": "",
+ "nf-role": "",
+ "nf-naming-code": "",
+ "relationship-list": {
+ "relationship": [
+ {
+ "related-to": "service-instance",
+ "related-link": "/aai/v11/business/customers/customer/Sina/service-subscriptions/service-subscription/NewFreeRadius-service/service-instances/service-instance/e4688e5f-61a0-4f8b-ae02-a2fbde623bcb",
+ "relationship-data": [
+ {
+ "relationship-key": "customer.global-customer-id",
+ "relationship-value": "Sina"
+ },
+ {
+ "relationship-key": "service-subscription.service-type",
+ "relationship-value": "NewFreeRadius-service"
+ },
+ {
+ "relationship-key": "service-instance.service-instance-id",
+ "relationship-value": "e4688e5f-61a0-4f8b-ae02-a2fbde623bcb"
+ }
+ ],
+ "related-to-property": [
+ {
+ "property-key": "service-instance.service-instance-name",
+ "property-value": "NewFreeRadius-service-instance-01"
+ }
+ ]
+ }
+ ]
+ }
+ },
+ "headers": {
+ "Content-Type": "application/json"
+ }
+ }
+} \ No newline at end of file
diff --git a/src/test/resources/mappings/aai_get_service-subscriptionsVFW.json b/src/test/resources/mappings/aai_get_service-subscriptionsVFW.json
new file mode 100644
index 0000000..093dd96
--- /dev/null
+++ b/src/test/resources/mappings/aai_get_service-subscriptionsVFW.json
@@ -0,0 +1,43 @@
+{
+ "request": {
+ "method": "GET",
+ "url": "/aai/v11/business/customers/customer/6490/service-subscriptions/service-subscription/vFW/service-instances/"
+ },
+ "response": {
+ "status": 200,
+ "jsonBody": {
+ "service-instance": [
+ {
+ "service-instance-id": "e4688e5f-61a0-4f8b-ae02-a2fbde623bcb",
+ "service-instance-name": "NewFreeRadius-service-instance-01",
+ "model-invariant-id": "709d157b-52fb-4250-976e-7133dff5c347",
+ "model-version-id": "98d95267-5e0f-4531-abf8-f14b90031dc5",
+ "resource-version": "1518508381261",
+ "relationship-list": {
+ "relationship": [
+ {
+ "related-to": "generic-vnf",
+ "related-link": "/aai/v11/network/generic-vnfs/generic-vnf/cb80fbb6-9aa7-4ac5-9541-e14f45de533e",
+ "relationship-data": [
+ {
+ "relationship-key": "generic-vnf.vnf-id",
+ "relationship-value": "cb80fbb6-9aa7-4ac5-9541-e14f45de533e"
+ }
+ ],
+ "related-to-property": [
+ {
+ "property-key": "generic-vnf.vnf-name",
+ "property-value": "NewFreeRadius-VNF-instance-01"
+ }
+ ]
+ }
+ ]
+ }
+ }
+ ]
+ },
+ "headers": {
+ "Content-Type": "application/json"
+ }
+ }
+} \ No newline at end of file
diff --git a/src/test/resources/mappings/aai_get_service-subscriptionsvFW-service-2VF-based.json b/src/test/resources/mappings/aai_get_service-subscriptionsvFW-service-2VF-based.json
new file mode 100644
index 0000000..444e3cd
--- /dev/null
+++ b/src/test/resources/mappings/aai_get_service-subscriptionsvFW-service-2VF-based.json
@@ -0,0 +1,43 @@
+{
+ "request": {
+ "method": "GET",
+ "url": "/aai/v11/business/customers/customer/6490/service-subscriptions/service-subscription/vFW-service-2VF-based/service-instances/"
+ },
+ "response": {
+ "status": 200,
+ "jsonBody": {
+ "service-instance": [
+ {
+ "service-instance-id": "vfw-service-id",
+ "service-instance-name": "vfw-service-name",
+ "model-invariant-id": "vfw-service-invariant-id",
+ "model-version-id": "9vfw-service-modek-version-id",
+ "resource-version": "1518508381261",
+ "relationship-list": {
+ "relationship": [
+ {
+ "related-to": "generic-vnf",
+ "related-link": "/aai/v11/network/generic-vnfs/generic-vnf/cb80fbb6-9aa7-4ac5-9541-e14f45de533e",
+ "relationship-data": [
+ {
+ "relationship-key": "generic-vnf.vnf-id",
+ "relationship-value": "cb80fbb6-9aa7-4ac5-9541-e14f45de533e"
+ }
+ ],
+ "related-to-property": [
+ {
+ "property-key": "generic-vnf.vnf-name",
+ "property-value": "NewFreeRadius-VNF-instance-01"
+ }
+ ]
+ }
+ ]
+ }
+ }
+ ]
+ },
+ "headers": {
+ "Content-Type": "application/json"
+ }
+ }
+} \ No newline at end of file
diff --git a/src/test/resources/mappings/aai_get_tenants.json b/src/test/resources/mappings/aai_get_tenants.json
new file mode 100644
index 0000000..7581a91
--- /dev/null
+++ b/src/test/resources/mappings/aai_get_tenants.json
@@ -0,0 +1,167 @@
+{
+ "request": {
+ "method": "GET",
+ "url": "/aai/v11/cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/tenants"
+ },
+ "response": {
+ "status": 200,
+ "jsonBody": {
+
+ "tenant": [
+ {
+ "tenant-id": "31047205ce114b60833b23e400d6a535",
+ "tenant-name": "onap-vnfs",
+ "resource-version": "1516022902124",
+ "relationship-list": {
+ "relationship": [
+ {
+ "related-to": "service-subscription",
+ "related-link": "/aai/v11/business/customers/customer/OPL-User/service-subscriptions/service-subscription/OPL_FWtest1_service_type",
+ "relationship-data": [
+ {
+ "relationship-key": "customer.global-customer-id",
+ "relationship-value": "OPL-User"
+ },
+ {
+ "relationship-key": "service-subscription.service-type",
+ "relationship-value": "OPL_FWtest1_service_type"
+ }
+ ]
+ },
+ {
+ "related-to": "service-subscription",
+ "related-link": "/aai/v11/business/customers/customer/Sina/service-subscriptions/service-subscription/NewFreeRadius-service",
+ "relationship-data": [
+ {
+ "relationship-key": "customer.global-customer-id",
+ "relationship-value": "Sina"
+ },
+ {
+ "relationship-key": "service-subscription.service-type",
+ "relationship-value": "NewFreeRadius-service"
+ }
+ ]
+ },
+ {
+ "related-to": "service-subscription",
+ "related-link": "/aai/v11/business/customers/customer/Sina/service-subscriptions/service-subscription/vMRFaaS3",
+ "relationship-data": [
+ {
+ "relationship-key": "customer.global-customer-id",
+ "relationship-value": "Sina"
+ },
+ {
+ "relationship-key": "service-subscription.service-type",
+ "relationship-value": "vMRFaaS3"
+ }
+ ]
+ },
+ {
+ "related-to": "service-subscription",
+ "related-link": "/aai/v11/business/customers/customer/Sina/service-subscriptions/service-subscription/FreeRadius-service",
+ "relationship-data": [
+ {
+ "relationship-key": "customer.global-customer-id",
+ "relationship-value": "Sina"
+ },
+ {
+ "relationship-key": "service-subscription.service-type",
+ "relationship-value": "FreeRadius-service"
+ }
+ ]
+ },
+ {
+ "related-to": "service-subscription",
+ "related-link": "/aai/v11/business/customers/customer/6401/service-subscriptions/service-subscription/vFW-service-model",
+ "relationship-data": [
+ {
+ "relationship-key": "customer.global-customer-id",
+ "relationship-value": "6401"
+ },
+ {
+ "relationship-key": "service-subscription.service-type",
+ "relationship-value": "vFW-service-model"
+ }
+ ]
+ },
+ {
+ "related-to": "service-subscription",
+ "related-link": "/aai/v11/business/customers/customer/Sina/service-subscriptions/service-subscription/vFW-service-model",
+ "relationship-data": [
+ {
+ "relationship-key": "customer.global-customer-id",
+ "relationship-value": "Sina"
+ },
+ {
+ "relationship-key": "service-subscription.service-type",
+ "relationship-value": "vFW-service-model"
+ }
+ ]
+ },
+ {
+ "related-to": "service-subscription",
+ "related-link": "/aai/v11/business/customers/customer/6404/service-subscriptions/service-subscription/vFW-service-model",
+ "relationship-data": [
+ {
+ "relationship-key": "customer.global-customer-id",
+ "relationship-value": "6404"
+ },
+ {
+ "relationship-key": "service-subscription.service-type",
+ "relationship-value": "vFW-service-model"
+ }
+ ]
+ },
+ {
+ "related-to": "service-subscription",
+ "related-link": "/aai/v11/business/customers/customer/6405/service-subscriptions/service-subscription/vFW-service-model",
+ "relationship-data": [
+ {
+ "relationship-key": "customer.global-customer-id",
+ "relationship-value": "6405"
+ },
+ {
+ "relationship-key": "service-subscription.service-type",
+ "relationship-value": "vFW-service-model"
+ }
+ ]
+ },
+ {
+ "related-to": "service-subscription",
+ "related-link": "/aai/v11/business/customers/customer/6406/service-subscriptions/service-subscription/vFW-service-model",
+ "relationship-data": [
+ {
+ "relationship-key": "customer.global-customer-id",
+ "relationship-value": "6406"
+ },
+ {
+ "relationship-key": "service-subscription.service-type",
+ "relationship-value": "vFW-service-model"
+ }
+ ]
+ },
+ {
+ "related-to": "service-subscription",
+ "related-link": "/aai/v11/business/customers/customer/Sina/service-subscriptions/service-subscription/serviceFRDBS",
+ "relationship-data": [
+ {
+ "relationship-key": "customer.global-customer-id",
+ "relationship-value": "Sina"
+ },
+ {
+ "relationship-key": "service-subscription.service-type",
+ "relationship-value": "serviceFRDBS"
+ }
+ ]
+ }
+ ]
+ }
+ }
+ ]
+
+ },
+ "headers": {
+ "Content-Type": "application/json"
+ }
+ }
+} \ No newline at end of file
diff --git a/src/test/resources/mappings/aai_put_customer.json b/src/test/resources/mappings/aai_put_customer.json
new file mode 100644
index 0000000..ec28b72
--- /dev/null
+++ b/src/test/resources/mappings/aai_put_customer.json
@@ -0,0 +1,12 @@
+{
+ "request": {
+ "method": "PUT",
+ "url": "/aai/v11/business/customers/customer/new"
+ },
+ "response": {
+ "status": 201,
+ "headers": {
+ "Content-Type": "application/json"
+ }
+ }
+} \ No newline at end of file
diff --git a/src/test/resources/mappings/aai_put_customer_service.json b/src/test/resources/mappings/aai_put_customer_service.json
new file mode 100644
index 0000000..889627a
--- /dev/null
+++ b/src/test/resources/mappings/aai_put_customer_service.json
@@ -0,0 +1,12 @@
+{
+ "request": {
+ "method": "PUT",
+ "url": "/aai/v11/business/customers/customer/new/service-subscriptions/service-subscription/vFW"
+ },
+ "response": {
+ "status": 201,
+ "headers": {
+ "Content-Type": "application/json"
+ }
+ }
+} \ No newline at end of file