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