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