Find service inventory
[externalapi/nbi.git] / src / main / java / org / onap / nbi / apis / serviceinventory / ServiceInventoryService.java
1 /**
2  * Copyright (c) 2018 Orange
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
5  * the License. You may obtain a copy of the License at
6  *
7  * http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
10  * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
11  * specific language governing permissions and limitations under the License.
12  */
13 package org.onap.nbi.apis.serviceinventory;
14
15 import java.util.ArrayList;
16 import java.util.LinkedHashMap;
17 import java.util.List;
18 import org.apache.commons.collections.CollectionUtils;
19 import org.onap.nbi.apis.serviceinventory.jolt.FindServiceInventoryJsonTransformer;
20 import org.onap.nbi.apis.serviceinventory.jolt.GetServiceInventoryJsonTransformer;
21 import org.onap.nbi.exceptions.BackendFunctionalException;
22 import org.springframework.beans.factory.annotation.Autowired;
23 import org.springframework.http.HttpStatus;
24 import org.springframework.stereotype.Service;
25 import org.springframework.util.MultiValueMap;
26 import org.springframework.util.StringUtils;
27
28 @Service
29 public class ServiceInventoryService {
30
31     @Autowired
32     NbiClient nbiClient;
33
34     @Autowired
35     AaiClient aaiClient;
36
37     @Autowired
38     GetServiceInventoryJsonTransformer getServiceInventoryJsonTransformer;
39
40     @Autowired
41     FindServiceInventoryJsonTransformer findServiceInventoryJsonTransformer;
42
43     public LinkedHashMap get(String serviceId, MultiValueMap<String, String> params) {
44
45         String clientId = params.getFirst("relatedParty.id");
46         String serviceSpecId = params.getFirst("serviceSpecification.id");
47         String serviceSpecName = params.getFirst("serviceSpecification.name");
48
49         if (StringUtils.isEmpty(serviceSpecId) && StringUtils.isEmpty(serviceSpecName)) {
50             throw new BackendFunctionalException(HttpStatus.NOT_FOUND,
51                 "serviceSpecName or serviceSpecId must be provided");
52         }
53
54         String customerId = getCustomerId(clientId);
55         String serviceName = getServiceName(serviceSpecName, serviceSpecId);
56         LinkedHashMap serviceResponse = aaiClient.getCatalogService(customerId, serviceName, serviceId);
57
58         if (serviceResponse != null) {
59             addVnfsToResponse(serviceResponse);
60             LinkedHashMap serviceInventoryResponse =
61                 (LinkedHashMap) getServiceInventoryJsonTransformer.transform(serviceResponse);
62             addRelatedPartyId(customerId, serviceInventoryResponse);
63             return serviceInventoryResponse;
64         } else {
65             throw new BackendFunctionalException(HttpStatus.NOT_FOUND, "no catalog service found");
66         }
67
68     }
69
70
71     private String getCustomerId(String clientId) {
72
73         if (StringUtils.isEmpty(clientId)) {
74             return "generic";
75         } else {
76             return clientId;
77         }
78
79     }
80
81     private String getServiceName(String serviceSpecificationName, String serviceSpecificationId) {
82
83         if (StringUtils.isEmpty(serviceSpecificationName)) {
84             LinkedHashMap serviceSpecification = nbiClient.getServiceSpecification(serviceSpecificationId);
85             return (String) serviceSpecification.get("name");
86         } else {
87             return serviceSpecificationName;
88         }
89
90     }
91
92     private void addRelatedPartyId(String customerId, LinkedHashMap serviceInventoryResponse) {
93
94         LinkedHashMap relatedParty = (LinkedHashMap) serviceInventoryResponse.get("relatedParty");
95         relatedParty.put("id", customerId);
96
97     }
98
99     private void addVnfsToResponse(LinkedHashMap serviceResponse) {
100
101         List<LinkedHashMap> vnfs = new ArrayList<>();
102         LinkedHashMap relationShip = (LinkedHashMap) serviceResponse.get("relationship-list");
103         if (relationShip != null) {
104             List<LinkedHashMap> relationsList = (List<LinkedHashMap>) relationShip.get("relationship");
105             if (relationsList != null) {
106                 for (LinkedHashMap relation : relationsList) {
107                     String relatedLink = (String) relation.get("related-link");
108                     LinkedHashMap vnf = aaiClient.getVNF(relatedLink);
109                     if (vnf != null) {
110                         vnfs.add(vnf);
111                     }
112                 }
113                 serviceResponse.put("vnfs", vnfs);
114             }
115         }
116     }
117
118
119     public List<LinkedHashMap> find(MultiValueMap<String, String> params) {
120
121         String clientId = params.getFirst("relatedParty.id");
122         String serviceSpecId = params.getFirst("serviceSpecification.id");
123         String serviceSpecName = params.getFirst("serviceSpecification.name");
124         String customerId = getCustomerId(clientId);
125         String serviceName;
126         List<LinkedHashMap> serviceInstances = new ArrayList<>();
127         if (StringUtils.isEmpty(serviceSpecId) && StringUtils.isEmpty(serviceSpecName)) {
128             handleFindWithNoServiceParam(customerId, serviceInstances);
129         } else {
130             serviceName = getServiceName(serviceSpecName, serviceSpecId);
131             buildServiceInstances(serviceInstances, customerId, serviceName);
132         }
133         List<LinkedHashMap> serviceInventoryResponse = new ArrayList<>();
134         if(CollectionUtils.isNotEmpty(serviceInstances)){
135             serviceInventoryResponse =
136                 findServiceInventoryJsonTransformer.transform(serviceInstances);
137             for (LinkedHashMap serviceInventory : serviceInventoryResponse) {
138                 LinkedHashMap party = (LinkedHashMap) serviceInventory.get("relatedParty");
139                 party.put("id", customerId);
140             }
141         }
142         return serviceInventoryResponse;
143
144
145     }
146
147     private void handleFindWithNoServiceParam(String customerId, List<LinkedHashMap> serviceInstances) {
148         LinkedHashMap servicesInAaiForCustomer = aaiClient.getServicesInAaiForCustomer(customerId);
149         if(servicesInAaiForCustomer!=null){
150             List<LinkedHashMap> servicesInAAI =
151                 (List<LinkedHashMap>) servicesInAaiForCustomer.get("service-subscription");
152             for (LinkedHashMap service : servicesInAAI) {
153                 String serviceType = (String) service.get("service-type");
154                 buildServiceInstances(serviceInstances, customerId, serviceType);
155             }
156         }
157     }
158
159     private void buildServiceInstances(List<LinkedHashMap> serviceInstances, String customerId, String serviceType) {
160
161         LinkedHashMap serviceInstancesInAaiForCustomer =
162             aaiClient.getServiceInstancesInAaiForCustomer(customerId, serviceType);
163         if (serviceInstancesInAaiForCustomer != null) {
164             List<LinkedHashMap> serviceInstancesForServiceType =
165                 (List<LinkedHashMap>) serviceInstancesInAaiForCustomer.get("service-instance");
166
167             if (!CollectionUtils.isEmpty(serviceInstancesForServiceType)) {
168                 // add service type for jolt
169                 for (LinkedHashMap serviceInstanceForServiceType : serviceInstancesForServiceType) {
170                     serviceInstanceForServiceType.put("service-type", serviceType);
171                 }
172                 serviceInstances.addAll(serviceInstancesForServiceType);
173             }
174         }
175
176
177     }
178
179 }