summaryrefslogtreecommitdiffstats
path: root/src/main/java/org/onap
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/main/java/org/onap
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/main/java/org/onap')
-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
9 files changed, 403 insertions, 4 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;
+ }
+
+}