ee2bb586cfec8f5f524b13daa6bff801fa6d5f91
[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.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.so.client.aai.AAIObjectType;
36 import org.onap.so.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 ServiceInstancesRequest buildVolumeGroupDeleteRequest(String vnfId, String volumeGroupId)
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         VolumeGroup volumeGroup = aaiDataRet.getVolumeGroup(vnfId, volumeGroupId);
101         if (volumeGroup == null) {
102             throw new AAIEntityNotFound(
103                     VF_MODULE_NOT_FOUND_IN_INVENTORY_VNF_ID + vnfId + " volumeGroupId: " + volumeGroupId);
104         }
105         return createServiceInstancesRequest(vnf, volumeGroup);
106     }
107
108     public ServiceInstancesRequest buildServiceDeleteRequest(String serviceInstanceId) throws AAIEntityNotFound {
109         ServiceInstance serviceInstance = aaiDataRet.getServiceInstance(serviceInstanceId);
110         if (serviceInstance == null) {
111             throw new AAIEntityNotFound(
112                     "ServiceInstance Not Found In Inventory, ServiceInstanceId: " + serviceInstanceId);
113         }
114         return createServiceInstancesRequest(serviceInstance);
115     }
116
117     public ServiceInstancesRequest buildVnfDeleteRequest(String vnfId) throws AAIEntityNotFound {
118         GenericVnf vnf = aaiDataRet.getGenericVnf(vnfId);
119         if (vnf == null) {
120             throw new AAIEntityNotFound(GENERIC_VNF_NOT_FOUND_IN_INVENTORY_VNF_ID + vnfId);
121         }
122         return createServiceInstancesRequest(vnf);
123     }
124
125     public ServiceInstancesRequest buildNetworkDeleteRequest(String networkId) throws AAIEntityNotFound {
126         L3Network network = aaiDataRet.getNetwork(networkId);
127         if (network == null) {
128             throw new AAIEntityNotFound("Network Not Found In Inventory, NetworkId: " + networkId);
129         }
130         return createServiceInstancesRequest(network);
131     }
132
133     protected ServiceInstancesRequest createServiceInstancesRequest(ServiceInstance serviceInstance) {
134         ServiceInstancesRequest request = new ServiceInstancesRequest();
135         RequestDetails requestDetails = mapServiceRequestDetails(serviceInstance);
136         request.setRequestDetails(requestDetails);
137         return request;
138     }
139
140     protected ServiceInstancesRequest createServiceInstancesRequest(GenericVnf vnf) {
141         ServiceInstancesRequest request = new ServiceInstancesRequest();
142         RequestDetails requestDetails = mapVnfRequestDetails(vnf);
143         request.setRequestDetails(requestDetails);
144         return request;
145     }
146
147     protected ServiceInstancesRequest createServiceInstancesRequest(GenericVnf vnf, VfModule vfModule,
148             ModelType modelType) {
149         ServiceInstancesRequest request = new ServiceInstancesRequest();
150         RequestDetails requestDetails = mapRequestDetails(vnf, vfModule, modelType);
151         request.setRequestDetails(requestDetails);
152         return request;
153     }
154
155     protected ServiceInstancesRequest createServiceInstancesRequest(GenericVnf vnf, VolumeGroup volumeGroup) {
156         ServiceInstancesRequest request = new ServiceInstancesRequest();
157         RequestDetails requestDetails = mapRequestDetails(vnf, volumeGroup);
158         request.setRequestDetails(requestDetails);
159         return request;
160     }
161
162     protected ServiceInstancesRequest createServiceInstancesRequest(L3Network network) {
163         ServiceInstancesRequest request = new ServiceInstancesRequest();
164         RequestDetails requestDetails = mapNetworkRequestDetails(network);
165         request.setRequestDetails(requestDetails);
166         return request;
167     }
168
169     protected RequestDetails mapRequestDetails(GenericVnf vnf, VfModule vfModule, ModelType modelType) {
170         RequestDetails requestDetails = new RequestDetails();
171         requestDetails.setRequestInfo(createRequestInfo());
172         if (vfModule.getVfModuleName() != null) {
173             requestDetails.getRequestInfo().setInstanceName(vfModule.getVfModuleName());
174         }
175         requestDetails.setModelInfo(mapVfModuleModelInformation(vfModule, modelType));
176
177         requestDetails.setCloudConfiguration(mapCloudConfiguration(vnf, vfModule));
178         requestDetails.setRequestParameters(createRequestParameters());
179         return requestDetails;
180     }
181
182     protected RequestDetails mapRequestDetails(GenericVnf vnf, VolumeGroup volumeGroup) {
183         RequestDetails requestDetails = new RequestDetails();
184         requestDetails.setRequestInfo(createRequestInfo());
185         if (volumeGroup.getVolumeGroupName() != null) {
186             requestDetails.getRequestInfo().setInstanceName(volumeGroup.getVolumeGroupName());
187         }
188         requestDetails.setModelInfo(mapVolumeGroupModelInformation(volumeGroup));
189         requestDetails.setCloudConfiguration(mapCloudConfigurationVolume(vnf, volumeGroup));
190         requestDetails.setRequestParameters(createRequestParameters());
191         return requestDetails;
192     }
193
194     protected RequestDetails mapVnfRequestDetails(GenericVnf vnf) {
195         RequestDetails requestDetails = new RequestDetails();
196         requestDetails.setRequestInfo(createRequestInfo());
197         if (vnf.getVnfName() != null) {
198             requestDetails.getRequestInfo().setInstanceName(vnf.getVnfName());
199         }
200         requestDetails.setModelInfo(mapVnfModelInformation(vnf));
201         requestDetails.setRequestParameters(createRequestParameters());
202         return requestDetails;
203     }
204
205     protected RequestDetails mapServiceRequestDetails(ServiceInstance serviceInstance) {
206         RequestDetails requestDetails = new RequestDetails();
207         requestDetails.setRequestInfo(createRequestInfo());
208         if (serviceInstance.getServiceInstanceName() != null) {
209             requestDetails.getRequestInfo().setInstanceName(serviceInstance.getServiceInstanceName());
210         }
211         requestDetails.setModelInfo(mapServiceModelInformation(serviceInstance));
212         requestDetails.setRequestParameters(createRequestParameters());
213         return requestDetails;
214     }
215
216     protected RequestDetails mapNetworkRequestDetails(L3Network network) {
217         RequestDetails requestDetails = new RequestDetails();
218         requestDetails.setRequestInfo(createRequestInfo());
219         if (network.getNetworkName() != null) {
220             requestDetails.getRequestInfo().setInstanceName(network.getNetworkName());
221         }
222         requestDetails.setCloudConfiguration(mapCloudConfigurationNetwork(network));
223         requestDetails.setModelInfo(mapNetworkModelInformation(network));
224         requestDetails.setRequestParameters(createRequestParameters());
225         return requestDetails;
226     }
227
228     protected ModelInfo mapVfModuleModelInformation(VfModule vfModule, ModelType modelType) {
229         ModelInfo modelInfo = new ModelInfo();
230         modelInfo.setModelCustomizationId(vfModule.getModelCustomizationId());
231         modelInfo.setModelCustomizationUuid(vfModule.getModelCustomizationId());
232         modelInfo.setModelType(modelType);
233         return modelInfo;
234     }
235
236     protected ModelInfo mapVolumeGroupModelInformation(VolumeGroup volumeGroup) {
237         ModelInfo modelInfo = new ModelInfo();
238         modelInfo.setModelCustomizationId(volumeGroup.getModelCustomizationId());
239         modelInfo.setModelCustomizationUuid(volumeGroup.getModelCustomizationId());
240         modelInfo.setModelType(ModelType.volumeGroup);
241         return modelInfo;
242     }
243
244     protected ModelInfo mapServiceModelInformation(ServiceInstance serviceInstance) {
245         ModelInfo modelInfo = new ModelInfo();
246         modelInfo.setModelVersionId(serviceInstance.getModelVersionId());
247         modelInfo.setModelType(ModelType.service);
248         return modelInfo;
249     }
250
251     protected ModelInfo mapVnfModelInformation(GenericVnf vnf) {
252         ModelInfo modelInfo = new ModelInfo();
253         modelInfo.setModelCustomizationId(vnf.getModelCustomizationId());
254         modelInfo.setModelCustomizationUuid(vnf.getModelCustomizationId());
255         modelInfo.setModelType(ModelType.vnf);
256         return modelInfo;
257     }
258
259     protected ModelInfo mapNetworkModelInformation(L3Network network) {
260         ModelInfo modelInfo = new ModelInfo();
261         modelInfo.setModelType(ModelType.network);
262         modelInfo.setModelCustomizationId(network.getModelCustomizationId());
263         modelInfo.setModelCustomizationUuid(network.getModelCustomizationId());
264         return modelInfo;
265     }
266
267     public CloudConfiguration mapCloudConfiguration(GenericVnf vnf, VfModule vfModule) {
268         CloudConfiguration cloudConfig = new CloudConfiguration();
269         AAIResultWrapper wrapper = new AAIResultWrapper(vnf);
270         Optional<org.onap.so.client.aai.entities.Relationships> relationshipsOpt = wrapper.getRelationships();
271         String tenantId = null;
272         String cloudOwner = null;
273         String lcpRegionId = null;
274         if (relationshipsOpt.isPresent()) {
275             tenantId = relationshipsOpt.get().getRelatedUris(AAIObjectType.TENANT).stream().findFirst()
276                     .map(item -> item.getURIKeys().get(TENANT_ID)).orElse(null);
277             cloudOwner = relationshipsOpt.get().getRelatedUris(AAIObjectType.TENANT).stream().findFirst()
278                     .map(item -> item.getURIKeys().get(CLOUD_OWNER)).orElse(null);
279             lcpRegionId = relationshipsOpt.get().getRelatedUris(AAIObjectType.TENANT).stream().findFirst()
280                     .map(item -> item.getURIKeys().get(CLOUD_REGION_ID)).orElse(null);
281         }
282
283         if (tenantId == null || cloudOwner == null || lcpRegionId == null) {
284             Map<String, String[]> filters = createQueryRequest("vfModuleId", vfModule.getVfModuleId());
285             Optional<ServiceInstancesRequest> request = findServiceInstanceRequest(filters);
286             if (request.isPresent()) {
287                 if (request.get().getRequestDetails() != null
288                         && request.get().getRequestDetails().getCloudConfiguration() != null) {
289                     if (request.get().getRequestDetails().getCloudConfiguration().getTenantId() != null) {
290                         tenantId = request.get().getRequestDetails().getCloudConfiguration().getTenantId();
291                     }
292                     if (request.get().getRequestDetails().getCloudConfiguration().getCloudOwner() != null) {
293                         cloudOwner = request.get().getRequestDetails().getCloudConfiguration().getCloudOwner();
294                     }
295                     if (request.get().getRequestDetails().getCloudConfiguration().getLcpCloudRegionId() != null) {
296                         lcpRegionId = request.get().getRequestDetails().getCloudConfiguration().getLcpCloudRegionId();
297                     }
298                 }
299             } else {
300                 throw new CloudConfigurationNotFoundException(CLOUD_CONFIGURATION_COULD_NOT_BE_FOUND);
301             }
302         }
303         cloudConfig.setTenantId(tenantId);
304         cloudConfig.setCloudOwner(cloudOwner);
305         cloudConfig.setLcpCloudRegionId(lcpRegionId);
306         return cloudConfig;
307     }
308
309     public CloudConfiguration mapCloudConfigurationVolume(GenericVnf vnf, VolumeGroup volumeGroup) {
310         CloudConfiguration cloudConfig = new CloudConfiguration();
311         AAIResultWrapper wrapper = new AAIResultWrapper(vnf);
312         Optional<org.onap.so.client.aai.entities.Relationships> relationshipsOpt = wrapper.getRelationships();
313         String tenantId = null;
314         String cloudOwner = null;
315         String lcpRegionId = null;
316         if (relationshipsOpt.isPresent()) {
317             tenantId = relationshipsOpt.get().getRelatedUris(AAIObjectType.TENANT).stream().findFirst()
318                     .map(item -> item.getURIKeys().get(TENANT_ID)).orElse(null);
319             cloudOwner = relationshipsOpt.get().getRelatedUris(AAIObjectType.TENANT).stream().findFirst()
320                     .map(item -> item.getURIKeys().get(CLOUD_OWNER)).orElse(null);
321             lcpRegionId = relationshipsOpt.get().getRelatedUris(AAIObjectType.TENANT).stream().findFirst()
322                     .map(item -> item.getURIKeys().get(CLOUD_REGION_ID)).orElse(null);
323         }
324
325         if (tenantId == null || cloudOwner == null || lcpRegionId == null) {
326             Map<String, String[]> filters = createQueryRequest("volumeGroupId", volumeGroup.getVolumeGroupId());
327             Optional<ServiceInstancesRequest> request = findServiceInstanceRequest(filters);
328             if (request.isPresent()) {
329                 tenantId = request.get().getRequestDetails().getCloudConfiguration().getTenantId();
330                 cloudOwner = request.get().getRequestDetails().getCloudConfiguration().getCloudOwner();
331                 lcpRegionId = request.get().getRequestDetails().getCloudConfiguration().getLcpCloudRegionId();
332             } else {
333                 throw new CloudConfigurationNotFoundException(CLOUD_CONFIGURATION_COULD_NOT_BE_FOUND);
334             }
335         }
336         cloudConfig.setTenantId(tenantId);
337         cloudConfig.setCloudOwner(cloudOwner);
338         cloudConfig.setLcpCloudRegionId(lcpRegionId);
339         return cloudConfig;
340     }
341
342     public CloudConfiguration mapCloudConfigurationNetwork(L3Network network) {
343         CloudConfiguration cloudConfig = new CloudConfiguration();
344         String tenantId = null;
345         String cloudOwner = null;
346         String lcpRegionId = null;
347
348         Map<String, String[]> filters = createQueryRequest("networkId", network.getNetworkId());
349         Optional<ServiceInstancesRequest> request = findServiceInstanceRequest(filters);
350         if (request.isPresent()) {
351             if (request.get().getRequestDetails() != null
352                     && request.get().getRequestDetails().getCloudConfiguration() != null) {
353                 if (request.get().getRequestDetails().getCloudConfiguration().getTenantId() != null) {
354                     tenantId = request.get().getRequestDetails().getCloudConfiguration().getTenantId();
355                 }
356                 if (request.get().getRequestDetails().getCloudConfiguration().getCloudOwner() != null) {
357                     cloudOwner = request.get().getRequestDetails().getCloudConfiguration().getCloudOwner();
358                 }
359                 if (request.get().getRequestDetails().getCloudConfiguration().getLcpCloudRegionId() != null) {
360                     lcpRegionId = request.get().getRequestDetails().getCloudConfiguration().getLcpCloudRegionId();
361                 }
362             }
363         } else {
364             throw new CloudConfigurationNotFoundException(CLOUD_CONFIGURATION_COULD_NOT_BE_FOUND);
365         }
366
367         cloudConfig.setTenantId(tenantId);
368         cloudConfig.setCloudOwner(cloudOwner);
369         cloudConfig.setLcpCloudRegionId(lcpRegionId);
370         return cloudConfig;
371     }
372
373     public Optional<ServiceInstancesRequest> findServiceInstanceRequest(Map<String, String[]> filters) {
374         List<InfraActiveRequests> completeRequests = infraActiveRequestsClient.getRequest(filters);
375         InfraActiveRequests foundRequest = completeRequests.get(0);
376         ServiceInstancesRequest siRequest;
377         try {
378             siRequest = mapper.readValue(foundRequest.getRequestBody(), ServiceInstancesRequest.class);
379             return Optional.of(siRequest);
380         } catch (Exception e) {
381             logger.error("Could not read Create Instance Request", e);
382         }
383         return Optional.empty();
384     }
385
386     public Map<String, String[]> createQueryRequest(String name, String instanceId) {
387         Map<String, String[]> filters = new HashMap<>();
388         filters.put(name, new String[] {"EQ", instanceId});
389         filters.put("requestStatus", new String[] {"EQ", Status.COMPLETE.toString()});
390         filters.put("action", new String[] {"EQ", "createInstance"});
391         return filters;
392     }
393
394     public RequestInfo createRequestInfo() {
395         RequestInfo requestInfo = new RequestInfo();
396         requestInfo.setSuppressRollback(false);
397         requestInfo.setSource(MDC.get(ONAPLogConstants.MDCs.PARTNER_NAME));
398         requestInfo.setRequestorId(MDC.get(ONAPLogConstants.MDCs.PARTNER_NAME));
399         return requestInfo;
400     }
401
402     public RequestParameters createRequestParameters() {
403         RequestParameters requestParams = new RequestParameters();
404         requestParams.setaLaCarte(true);
405         requestParams.setTestApi("GR_API");
406         return requestParams;
407     }
408
409
410 }