Merge "Add INFO.yaml file"
[externalapi/nbi.git] / src / main / java / org / onap / nbi / apis / serviceinventory / ServiceInventoryService.java
1 package org.onap.nbi.apis.serviceinventory;
2
3 import java.util.ArrayList;
4 import java.util.LinkedHashMap;
5 import java.util.List;
6 import org.onap.nbi.apis.serviceinventory.jolt.FindServiceInventoryJsonTransformer;
7 import org.onap.nbi.apis.serviceinventory.jolt.GetServiceInventoryJsonTransformer;
8 import org.onap.nbi.exceptions.BackendFunctionalException;
9 import org.springframework.beans.factory.annotation.Autowired;
10 import org.springframework.http.HttpStatus;
11 import org.springframework.stereotype.Service;
12 import org.springframework.util.MultiValueMap;
13 import org.springframework.util.StringUtils;
14
15 @Service
16 public class ServiceInventoryService {
17
18     @Autowired
19     NbiClient nbiClient;
20
21     @Autowired
22     AaiClient aaiClient;
23
24     @Autowired
25     GetServiceInventoryJsonTransformer getServiceInventoryJsonTransformer;
26
27     @Autowired
28     FindServiceInventoryJsonTransformer findServiceInventoryJsonTransformer;
29
30     public LinkedHashMap get(String serviceId, MultiValueMap<String, String> params) {
31
32         String clientId = params.getFirst("relatedParty.id");
33         String serviceSpecId = params.getFirst("serviceSpecification.id");
34         String serviceSpecName = params.getFirst("serviceSpecification.name");
35
36         if (StringUtils.isEmpty(serviceSpecId) && StringUtils.isEmpty(serviceSpecName)) {
37             throw new BackendFunctionalException(HttpStatus.NOT_FOUND,
38                     "serviceSpecName or serviceSpecId must be provided");
39         }
40
41         String customerId = getCustomerId(clientId);
42         String serviceName = getServiceName(serviceSpecName, serviceSpecId);
43         LinkedHashMap serviceResponse = aaiClient.getCatalogService(customerId, serviceName, serviceId);
44
45         if (serviceResponse != null) {
46             addVnfsToResponse(serviceResponse);
47             LinkedHashMap serviceInventoryResponse =
48                     (LinkedHashMap) getServiceInventoryJsonTransformer.transform(serviceResponse);
49             addRelatedPartyId(customerId, serviceInventoryResponse);
50             return serviceInventoryResponse;
51         } else {
52             throw new BackendFunctionalException(HttpStatus.NOT_FOUND, "no catalog service found");
53         }
54
55     }
56
57
58     private String getCustomerId(String clientId) {
59
60         if (StringUtils.isEmpty(clientId)) {
61             return "generic";
62         } else {
63             return clientId;
64         }
65
66     }
67
68     private String getServiceName(String serviceSpecificationName, String serviceSpecificationId) {
69
70         if (StringUtils.isEmpty(serviceSpecificationName)) {
71             LinkedHashMap serviceSpecification = nbiClient.getServiceSpecification(serviceSpecificationId);
72             return (String) serviceSpecification.get("name");
73         } else {
74             return serviceSpecificationName;
75         }
76
77     }
78
79     private void addRelatedPartyId(String customerId, LinkedHashMap serviceInventoryResponse) {
80
81         LinkedHashMap relatedParty = (LinkedHashMap) serviceInventoryResponse.get("relatedParty");
82         relatedParty.put("id", customerId);
83
84     }
85
86     private void addVnfsToResponse(LinkedHashMap serviceResponse) {
87
88         List<LinkedHashMap> vnfs = new ArrayList<>();
89         LinkedHashMap relationShip = (LinkedHashMap) serviceResponse.get("relationship-list");
90         List<LinkedHashMap> relationsList = (List<LinkedHashMap>) relationShip.get("relationship");
91         for (LinkedHashMap relation : relationsList) {
92             String relatedLink = (String) relation.get("related-link");
93             LinkedHashMap vnf = aaiClient.getVNF(relatedLink);
94             if (vnf != null) {
95                 vnfs.add(vnf);
96             }
97         }
98         serviceResponse.put("vnfs", vnfs);
99
100     }
101
102
103     public List<LinkedHashMap> find(MultiValueMap<String, String> params) {
104
105         String clientId = params.getFirst("relatedParty.id");
106         String serviceSpecId = params.getFirst("serviceSpecification.id");
107         String serviceSpecName = params.getFirst("serviceSpecification.name");
108         String customerId = getCustomerId(clientId);
109         String serviceName;
110         List<LinkedHashMap> serviceInstances = new ArrayList<>();
111         if (StringUtils.isEmpty(serviceSpecId) && StringUtils.isEmpty(serviceSpecName)) {
112             LinkedHashMap servicesInAaiForCustomer = aaiClient.getServicesInAaiForCustomer(customerId);
113             List<LinkedHashMap> servicesInAAI =
114                     (List<LinkedHashMap>) servicesInAaiForCustomer.get("service-subscription");
115             for (LinkedHashMap service : servicesInAAI) {
116                 String serviceType = (String) service.get("service-type");
117                 buildServiceInstances(serviceInstances, customerId, serviceType);
118             }
119         } else {
120             serviceName = getServiceName(serviceSpecName, serviceSpecId);
121             buildServiceInstances(serviceInstances, customerId, serviceName);
122         }
123
124         List<LinkedHashMap> serviceInventoryResponse =
125                 (List<LinkedHashMap>) findServiceInventoryJsonTransformer.transform(serviceInstances);
126         for (LinkedHashMap serviceInventory : serviceInventoryResponse) {
127             LinkedHashMap party = (LinkedHashMap) serviceInventory.get("relatedParty");
128             party.put("id", customerId);
129         }
130         return serviceInventoryResponse;
131
132     }
133
134     private void buildServiceInstances(List<LinkedHashMap> serviceInstances, String customerId, String serviceType) {
135
136         LinkedHashMap serviceInstancesInAaiForCustomer =
137                 aaiClient.getServiceInstancesInAaiForCustomer(customerId, serviceType);
138         List<LinkedHashMap> serviceInstancesForServiceType =
139                 (List<LinkedHashMap>) serviceInstancesInAaiForCustomer.get("service-instance");
140
141         // add service type for jolt
142         for (LinkedHashMap serviceInstanceForServiceType : serviceInstancesForServiceType) {
143             serviceInstanceForServiceType.put("service-type", serviceType);
144         }
145         serviceInstances.addAll(serviceInstancesForServiceType);
146
147     }
148
149 }