rename package for external use
[so.git] / mso-api-handlers / mso-api-handler-infra / src / main / java / org / onap / so / apihandlerinfra / infra / rest / BpmnRequestBuilder.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * ONAP - SO
4  * ================================================================================
5  * Copyright (C) 2017 - 2019 AT&T Intellectual Property. All rights reserved.
6  * ================================================================================
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  * 
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  * 
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  * ============LICENSE_END=========================================================
19  */
20
21 package org.onap.so.apihandlerinfra.infra.rest;
22
23 import java.util.HashMap;
24 import java.util.List;
25 import java.util.Map;
26 import java.util.Optional;
27 import org.onap.aai.domain.yang.GenericVnf;
28 import org.onap.aai.domain.yang.L3Network;
29 import org.onap.aai.domain.yang.ServiceInstance;
30 import org.onap.aai.domain.yang.VfModule;
31 import org.onap.aai.domain.yang.VolumeGroup;
32 import org.onap.logging.ref.slf4j.ONAPLogConstants;
33 import org.onap.so.apihandlerinfra.infra.rest.exception.AAIEntityNotFound;
34 import org.onap.so.apihandlerinfra.infra.rest.exception.CloudConfigurationNotFoundException;
35 import org.onap.aaiclient.client.aai.AAIObjectType;
36 import org.onap.aaiclient.client.aai.entities.AAIResultWrapper;
37 import org.onap.so.constants.Status;
38 import org.onap.so.db.request.beans.InfraActiveRequests;
39 import org.onap.so.db.request.client.RequestsDbClient;
40 import org.onap.so.serviceinstancebeans.CloudConfiguration;
41 import org.onap.so.serviceinstancebeans.ModelInfo;
42 import org.onap.so.serviceinstancebeans.ModelType;
43 import org.onap.so.serviceinstancebeans.RequestDetails;
44 import org.onap.so.serviceinstancebeans.RequestInfo;
45 import org.onap.so.serviceinstancebeans.RequestParameters;
46 import org.onap.so.serviceinstancebeans.ServiceInstancesRequest;
47 import org.slf4j.Logger;
48 import org.slf4j.LoggerFactory;
49 import org.slf4j.MDC;
50 import org.springframework.beans.factory.annotation.Autowired;
51 import org.springframework.stereotype.Component;
52 import com.fasterxml.jackson.databind.ObjectMapper;
53
54 @Component
55 public class BpmnRequestBuilder {
56
57     private static final String CLOUD_CONFIGURATION_COULD_NOT_BE_FOUND = "Cloud Configuration could not be found";
58
59     private static final String CLOUD_REGION_ID = "cloud-region-id";
60
61     private static final String CLOUD_OWNER = "cloud-owner";
62
63     private static final String TENANT_ID = "tenant-id";
64
65     private static final String GENERIC_VNF_NOT_FOUND_IN_INVENTORY_VNF_ID =
66             "Generic Vnf Not Found In Inventory, VnfId: ";
67
68     private static final String VF_MODULE_NOT_FOUND_IN_INVENTORY_VNF_ID = "VF Module Not Found In Inventory, VnfId: ";
69
70     private static final Logger logger = LoggerFactory.getLogger(BpmnRequestBuilder.class);
71
72     @Autowired
73     private RequestsDbClient infraActiveRequestsClient;
74
75     @Autowired
76     private AAIDataRetrieval aaiDataRet;
77
78     private ObjectMapper mapper = new ObjectMapper();
79
80
81     public ServiceInstancesRequest buildVFModuleDeleteRequest(String vnfId, String vfModuleId, ModelType modelType)
82             throws AAIEntityNotFound {
83         GenericVnf vnf = aaiDataRet.getGenericVnf(vnfId);
84         if (vnf == null) {
85             throw new AAIEntityNotFound(GENERIC_VNF_NOT_FOUND_IN_INVENTORY_VNF_ID + vnfId);
86         }
87         VfModule vfModule = aaiDataRet.getAAIVfModule(vnfId, vfModuleId);
88         if (vfModule == null) {
89             throw new AAIEntityNotFound(VF_MODULE_NOT_FOUND_IN_INVENTORY_VNF_ID + vnfId + " vfModuleId: " + vfModuleId);
90         }
91         return createServiceInstancesRequest(vnf, vfModule, modelType);
92     }
93
94     public CloudConfiguration getCloudConfigurationVfModuleReplace(String vnfId, String vfModuleId)
95             throws AAIEntityNotFound {
96         GenericVnf vnf = aaiDataRet.getGenericVnf(vnfId);
97         if (vnf == null) {
98             throw new AAIEntityNotFound(GENERIC_VNF_NOT_FOUND_IN_INVENTORY_VNF_ID + vnfId);
99         }
100
101         return mapCloudConfiguration(vnf, vfModuleId);
102     }
103
104     public ServiceInstancesRequest buildVolumeGroupDeleteRequest(String vnfId, String volumeGroupId)
105             throws AAIEntityNotFound {
106         GenericVnf vnf = aaiDataRet.getGenericVnf(vnfId);
107         if (vnf == null) {
108             throw new AAIEntityNotFound(GENERIC_VNF_NOT_FOUND_IN_INVENTORY_VNF_ID + vnfId);
109         }
110         VolumeGroup volumeGroup = aaiDataRet.getVolumeGroup(vnfId, volumeGroupId);
111         if (volumeGroup == null) {
112             throw new AAIEntityNotFound(
113                     VF_MODULE_NOT_FOUND_IN_INVENTORY_VNF_ID + vnfId + " volumeGroupId: " + volumeGroupId);
114         }
115         return createServiceInstancesRequest(vnf, volumeGroup);
116     }
117
118     public ServiceInstancesRequest buildServiceDeleteRequest(String serviceInstanceId) throws AAIEntityNotFound {
119         ServiceInstance serviceInstance = aaiDataRet.getServiceInstance(serviceInstanceId);
120         if (serviceInstance == null) {
121             throw new AAIEntityNotFound(
122                     "ServiceInstance Not Found In Inventory, ServiceInstanceId: " + serviceInstanceId);
123         }
124         return createServiceInstancesRequest(serviceInstance);
125     }
126
127     public ServiceInstancesRequest buildVnfDeleteRequest(String vnfId) throws AAIEntityNotFound {
128         GenericVnf vnf = aaiDataRet.getGenericVnf(vnfId);
129         if (vnf == null) {
130             throw new AAIEntityNotFound(GENERIC_VNF_NOT_FOUND_IN_INVENTORY_VNF_ID + vnfId);
131         }
132         return createServiceInstancesRequest(vnf);
133     }
134
135     public ServiceInstancesRequest buildNetworkDeleteRequest(String networkId) throws AAIEntityNotFound {
136         L3Network network = aaiDataRet.getNetwork(networkId);
137         if (network == null) {
138             throw new AAIEntityNotFound("Network Not Found In Inventory, NetworkId: " + networkId);
139         }
140         return createServiceInstancesRequest(network);
141     }
142
143     protected ServiceInstancesRequest createServiceInstancesRequest(ServiceInstance serviceInstance) {
144         ServiceInstancesRequest request = new ServiceInstancesRequest();
145         RequestDetails requestDetails = mapServiceRequestDetails(serviceInstance);
146         request.setRequestDetails(requestDetails);
147         return request;
148     }
149
150     protected ServiceInstancesRequest createServiceInstancesRequest(GenericVnf vnf) {
151         ServiceInstancesRequest request = new ServiceInstancesRequest();
152         RequestDetails requestDetails = mapVnfRequestDetails(vnf);
153         request.setRequestDetails(requestDetails);
154         return request;
155     }
156
157     protected ServiceInstancesRequest createServiceInstancesRequest(GenericVnf vnf, VfModule vfModule,
158             ModelType modelType) {
159         ServiceInstancesRequest request = new ServiceInstancesRequest();
160         RequestDetails requestDetails = mapRequestDetails(vnf, vfModule, modelType);
161         request.setRequestDetails(requestDetails);
162         return request;
163     }
164
165     protected ServiceInstancesRequest createServiceInstancesRequest(GenericVnf vnf, VolumeGroup volumeGroup) {
166         ServiceInstancesRequest request = new ServiceInstancesRequest();
167         RequestDetails requestDetails = mapRequestDetails(vnf, volumeGroup);
168         request.setRequestDetails(requestDetails);
169         return request;
170     }
171
172     protected ServiceInstancesRequest createServiceInstancesRequest(L3Network network) {
173         ServiceInstancesRequest request = new ServiceInstancesRequest();
174         RequestDetails requestDetails = mapNetworkRequestDetails(network);
175         request.setRequestDetails(requestDetails);
176         return request;
177     }
178
179     protected RequestDetails mapRequestDetails(GenericVnf vnf, VfModule vfModule, ModelType modelType) {
180         RequestDetails requestDetails = new RequestDetails();
181         requestDetails.setRequestInfo(createRequestInfo());
182         if (vfModule.getVfModuleName() != null) {
183             requestDetails.getRequestInfo().setInstanceName(vfModule.getVfModuleName());
184         }
185         requestDetails.setModelInfo(mapVfModuleModelInformation(vfModule, modelType));
186
187         requestDetails.setCloudConfiguration(mapCloudConfiguration(vnf, vfModule.getVfModuleId()));
188         requestDetails.setRequestParameters(createRequestParameters());
189         return requestDetails;
190     }
191
192     protected RequestDetails mapRequestDetails(GenericVnf vnf, VolumeGroup volumeGroup) {
193         RequestDetails requestDetails = new RequestDetails();
194         requestDetails.setRequestInfo(createRequestInfo());
195         if (volumeGroup.getVolumeGroupName() != null) {
196             requestDetails.getRequestInfo().setInstanceName(volumeGroup.getVolumeGroupName());
197         }
198         requestDetails.setModelInfo(mapVolumeGroupModelInformation(volumeGroup));
199         requestDetails.setCloudConfiguration(mapCloudConfigurationVolume(vnf, volumeGroup));
200         requestDetails.setRequestParameters(createRequestParameters());
201         return requestDetails;
202     }
203
204     protected RequestDetails mapVnfRequestDetails(GenericVnf vnf) {
205         RequestDetails requestDetails = new RequestDetails();
206         requestDetails.setRequestInfo(createRequestInfo());
207         if (vnf.getVnfName() != null) {
208             requestDetails.getRequestInfo().setInstanceName(vnf.getVnfName());
209         }
210         requestDetails.setModelInfo(mapVnfModelInformation(vnf));
211         requestDetails.setRequestParameters(createRequestParameters());
212         return requestDetails;
213     }
214
215     protected RequestDetails mapServiceRequestDetails(ServiceInstance serviceInstance) {
216         RequestDetails requestDetails = new RequestDetails();
217         requestDetails.setRequestInfo(createRequestInfo());
218         if (serviceInstance.getServiceInstanceName() != null) {
219             requestDetails.getRequestInfo().setInstanceName(serviceInstance.getServiceInstanceName());
220         }
221         requestDetails.setModelInfo(mapServiceModelInformation(serviceInstance));
222         requestDetails.setRequestParameters(createRequestParameters());
223         return requestDetails;
224     }
225
226     protected RequestDetails mapNetworkRequestDetails(L3Network network) {
227         RequestDetails requestDetails = new RequestDetails();
228         requestDetails.setRequestInfo(createRequestInfo());
229         if (network.getNetworkName() != null) {
230             requestDetails.getRequestInfo().setInstanceName(network.getNetworkName());
231         }
232         requestDetails.setCloudConfiguration(mapCloudConfigurationNetwork(network));
233         requestDetails.setModelInfo(mapNetworkModelInformation(network));
234         requestDetails.setRequestParameters(createRequestParameters());
235         return requestDetails;
236     }
237
238     protected ModelInfo mapVfModuleModelInformation(VfModule vfModule, ModelType modelType) {
239         ModelInfo modelInfo = new ModelInfo();
240         modelInfo.setModelCustomizationId(vfModule.getModelCustomizationId());
241         modelInfo.setModelCustomizationUuid(vfModule.getModelCustomizationId());
242         modelInfo.setModelType(modelType);
243         return modelInfo;
244     }
245
246     protected ModelInfo mapVolumeGroupModelInformation(VolumeGroup volumeGroup) {
247         ModelInfo modelInfo = new ModelInfo();
248         modelInfo.setModelCustomizationId(volumeGroup.getModelCustomizationId());
249         modelInfo.setModelCustomizationUuid(volumeGroup.getModelCustomizationId());
250         modelInfo.setModelType(ModelType.volumeGroup);
251         return modelInfo;
252     }
253
254     protected ModelInfo mapServiceModelInformation(ServiceInstance serviceInstance) {
255         ModelInfo modelInfo = new ModelInfo();
256         modelInfo.setModelVersionId(serviceInstance.getModelVersionId());
257         modelInfo.setModelType(ModelType.service);
258         return modelInfo;
259     }
260
261     protected ModelInfo mapVnfModelInformation(GenericVnf vnf) {
262         ModelInfo modelInfo = new ModelInfo();
263         modelInfo.setModelCustomizationId(vnf.getModelCustomizationId());
264         modelInfo.setModelCustomizationUuid(vnf.getModelCustomizationId());
265         modelInfo.setModelType(ModelType.vnf);
266         return modelInfo;
267     }
268
269     protected ModelInfo mapNetworkModelInformation(L3Network network) {
270         ModelInfo modelInfo = new ModelInfo();
271         modelInfo.setModelType(ModelType.network);
272         modelInfo.setModelCustomizationId(network.getModelCustomizationId());
273         modelInfo.setModelCustomizationUuid(network.getModelCustomizationId());
274         return modelInfo;
275     }
276
277     public CloudConfiguration mapCloudConfiguration(GenericVnf vnf, String vfModuleId) {
278         CloudConfiguration cloudConfig = new CloudConfiguration();
279         AAIResultWrapper wrapper = new AAIResultWrapper(vnf);
280         Optional<org.onap.aaiclient.client.aai.entities.Relationships> relationshipsOpt = wrapper.getRelationships();
281         String tenantId = null;
282         String cloudOwner = null;
283         String lcpRegionId = null;
284         if (relationshipsOpt.isPresent()) {
285             tenantId = relationshipsOpt.get().getRelatedUris(AAIObjectType.TENANT).stream().findFirst()
286                     .map(item -> item.getURIKeys().get(TENANT_ID)).orElse(null);
287             cloudOwner = relationshipsOpt.get().getRelatedUris(AAIObjectType.TENANT).stream().findFirst()
288                     .map(item -> item.getURIKeys().get(CLOUD_OWNER)).orElse(null);
289             lcpRegionId = relationshipsOpt.get().getRelatedUris(AAIObjectType.TENANT).stream().findFirst()
290                     .map(item -> item.getURIKeys().get(CLOUD_REGION_ID)).orElse(null);
291         }
292
293         if (tenantId == null || cloudOwner == null || lcpRegionId == null) {
294             Map<String, String[]> filters = createQueryRequest("vfModuleId", vfModuleId);
295             Optional<ServiceInstancesRequest> request = findServiceInstanceRequest(filters);
296             if (request.isPresent()) {
297                 if (request.get().getRequestDetails() != null
298                         && request.get().getRequestDetails().getCloudConfiguration() != null) {
299                     if (request.get().getRequestDetails().getCloudConfiguration().getTenantId() != null) {
300                         tenantId = request.get().getRequestDetails().getCloudConfiguration().getTenantId();
301                     }
302                     if (request.get().getRequestDetails().getCloudConfiguration().getCloudOwner() != null) {
303                         cloudOwner = request.get().getRequestDetails().getCloudConfiguration().getCloudOwner();
304                     }
305                     if (request.get().getRequestDetails().getCloudConfiguration().getLcpCloudRegionId() != null) {
306                         lcpRegionId = request.get().getRequestDetails().getCloudConfiguration().getLcpCloudRegionId();
307                     }
308                 }
309             } else {
310                 throw new CloudConfigurationNotFoundException(CLOUD_CONFIGURATION_COULD_NOT_BE_FOUND);
311             }
312         }
313         cloudConfig.setTenantId(tenantId);
314         cloudConfig.setCloudOwner(cloudOwner);
315         cloudConfig.setLcpCloudRegionId(lcpRegionId);
316         return cloudConfig;
317     }
318
319     public CloudConfiguration mapCloudConfigurationVolume(GenericVnf vnf, VolumeGroup volumeGroup) {
320         CloudConfiguration cloudConfig = new CloudConfiguration();
321         AAIResultWrapper wrapper = new AAIResultWrapper(vnf);
322         Optional<org.onap.aaiclient.client.aai.entities.Relationships> relationshipsOpt = wrapper.getRelationships();
323         String tenantId = null;
324         String cloudOwner = null;
325         String lcpRegionId = null;
326         if (relationshipsOpt.isPresent()) {
327             tenantId = relationshipsOpt.get().getRelatedUris(AAIObjectType.TENANT).stream().findFirst()
328                     .map(item -> item.getURIKeys().get(TENANT_ID)).orElse(null);
329             cloudOwner = relationshipsOpt.get().getRelatedUris(AAIObjectType.TENANT).stream().findFirst()
330                     .map(item -> item.getURIKeys().get(CLOUD_OWNER)).orElse(null);
331             lcpRegionId = relationshipsOpt.get().getRelatedUris(AAIObjectType.TENANT).stream().findFirst()
332                     .map(item -> item.getURIKeys().get(CLOUD_REGION_ID)).orElse(null);
333         }
334
335         if (tenantId == null || cloudOwner == null || lcpRegionId == null) {
336             Map<String, String[]> filters = createQueryRequest("volumeGroupId", volumeGroup.getVolumeGroupId());
337             Optional<ServiceInstancesRequest> request = findServiceInstanceRequest(filters);
338             if (request.isPresent()) {
339                 tenantId = request.get().getRequestDetails().getCloudConfiguration().getTenantId();
340                 cloudOwner = request.get().getRequestDetails().getCloudConfiguration().getCloudOwner();
341                 lcpRegionId = request.get().getRequestDetails().getCloudConfiguration().getLcpCloudRegionId();
342             } else {
343                 throw new CloudConfigurationNotFoundException(CLOUD_CONFIGURATION_COULD_NOT_BE_FOUND);
344             }
345         }
346         cloudConfig.setTenantId(tenantId);
347         cloudConfig.setCloudOwner(cloudOwner);
348         cloudConfig.setLcpCloudRegionId(lcpRegionId);
349         return cloudConfig;
350     }
351
352     public CloudConfiguration mapCloudConfigurationNetwork(L3Network network) {
353         CloudConfiguration cloudConfig = new CloudConfiguration();
354         String tenantId = null;
355         String cloudOwner = null;
356         String lcpRegionId = null;
357
358         Map<String, String[]> filters = createQueryRequest("networkId", network.getNetworkId());
359         Optional<ServiceInstancesRequest> request = findServiceInstanceRequest(filters);
360         if (request.isPresent()) {
361             if (request.get().getRequestDetails() != null
362                     && request.get().getRequestDetails().getCloudConfiguration() != null) {
363                 if (request.get().getRequestDetails().getCloudConfiguration().getTenantId() != null) {
364                     tenantId = request.get().getRequestDetails().getCloudConfiguration().getTenantId();
365                 }
366                 if (request.get().getRequestDetails().getCloudConfiguration().getCloudOwner() != null) {
367                     cloudOwner = request.get().getRequestDetails().getCloudConfiguration().getCloudOwner();
368                 }
369                 if (request.get().getRequestDetails().getCloudConfiguration().getLcpCloudRegionId() != null) {
370                     lcpRegionId = request.get().getRequestDetails().getCloudConfiguration().getLcpCloudRegionId();
371                 }
372             }
373         } else {
374             throw new CloudConfigurationNotFoundException(CLOUD_CONFIGURATION_COULD_NOT_BE_FOUND);
375         }
376
377         cloudConfig.setTenantId(tenantId);
378         cloudConfig.setCloudOwner(cloudOwner);
379         cloudConfig.setLcpCloudRegionId(lcpRegionId);
380         return cloudConfig;
381     }
382
383     public CloudConfiguration mapCloudConfigurationVnf(String vnfId) {
384         CloudConfiguration cloudConfig = new CloudConfiguration();
385         String tenantId = null;
386         String cloudOwner = null;
387         String lcpRegionId = null;
388
389         Map<String, String[]> filters = createQueryRequest("vnfId", vnfId);
390         Optional<ServiceInstancesRequest> request = findServiceInstanceRequest(filters);
391         if (request.isPresent()) {
392             if (request.get().getRequestDetails() != null
393                     && request.get().getRequestDetails().getCloudConfiguration() != null) {
394                 if (request.get().getRequestDetails().getCloudConfiguration().getTenantId() != null) {
395                     tenantId = request.get().getRequestDetails().getCloudConfiguration().getTenantId();
396                 }
397                 if (request.get().getRequestDetails().getCloudConfiguration().getCloudOwner() != null) {
398                     cloudOwner = request.get().getRequestDetails().getCloudConfiguration().getCloudOwner();
399                 }
400                 if (request.get().getRequestDetails().getCloudConfiguration().getLcpCloudRegionId() != null) {
401                     lcpRegionId = request.get().getRequestDetails().getCloudConfiguration().getLcpCloudRegionId();
402                 }
403             }
404         } else {
405             throw new CloudConfigurationNotFoundException(CLOUD_CONFIGURATION_COULD_NOT_BE_FOUND);
406         }
407         cloudConfig.setTenantId(tenantId);
408         cloudConfig.setCloudOwner(cloudOwner);
409         cloudConfig.setLcpCloudRegionId(lcpRegionId);
410         return cloudConfig;
411     }
412
413     public Optional<ServiceInstancesRequest> findServiceInstanceRequest(Map<String, String[]> filters) {
414         List<InfraActiveRequests> completeRequests = infraActiveRequestsClient.getRequest(filters);
415         InfraActiveRequests foundRequest = completeRequests.get(0);
416         ServiceInstancesRequest siRequest;
417         try {
418             siRequest = mapper.readValue(foundRequest.getRequestBody(), ServiceInstancesRequest.class);
419             return Optional.of(siRequest);
420         } catch (Exception e) {
421             logger.error("Could not read Create Instance Request", e);
422         }
423         return Optional.empty();
424     }
425
426     public Map<String, String[]> createQueryRequest(String name, String instanceId) {
427         Map<String, String[]> filters = new HashMap<>();
428         filters.put(name, new String[] {"EQ", instanceId});
429         filters.put("requestStatus", new String[] {"EQ", Status.COMPLETE.toString()});
430         filters.put("action", new String[] {"EQ", "createInstance"});
431         return filters;
432     }
433
434     public RequestInfo createRequestInfo() {
435         RequestInfo requestInfo = new RequestInfo();
436         requestInfo.setSuppressRollback(false);
437         requestInfo.setSource(MDC.get(ONAPLogConstants.MDCs.PARTNER_NAME));
438         requestInfo.setRequestorId(MDC.get(ONAPLogConstants.MDCs.PARTNER_NAME));
439         return requestInfo;
440     }
441
442     public RequestParameters createRequestParameters() {
443         RequestParameters requestParams = new RequestParameters();
444         requestParams.setaLaCarte(true);
445         requestParams.setTestApi("GR_API");
446         return requestParams;
447     }
448
449
450 }