074aa9e5a1f0040598b4072bbc6db410a542fdbc
[so.git] / bpmn / so-bpmn-tasks / src / main / java / org / onap / so / bpmn / infrastructure / workflow / tasks / ebb / loader / UserParamsServiceTraversal.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * ONAP - SO
4  * ================================================================================
5  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
6  * ================================================================================
7  * Modifications Copyright (c) 2019 Samsung
8  * ================================================================================
9  * Modifications Copyright (c) 2020 Nokia
10  * ================================================================================
11  * Modifications Copyright (c) 2020 Tech Mahindra
12  * ================================================================================
13  * Modifications Copyright (c) 2021 Orange
14  * ================================================================================
15  * Licensed under the Apache License, Version 2.0 (the "License");
16  * you may not use this file except in compliance with the License.
17  * You may obtain a copy of the License at
18  *
19  *      http://www.apache.org/licenses/LICENSE-2.0
20  *
21  * Unless required by applicable law or agreed to in writing, software
22  * distributed under the License is distributed on an "AS IS" BASIS,
23  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
24  * See the License for the specific language governing permissions and
25  * limitations under the License.
26  * ============LICENSE_END=========================================================
27  */
28
29 package org.onap.so.bpmn.infrastructure.workflow.tasks.ebb.loader;
30
31 import com.fasterxml.jackson.databind.ObjectMapper;
32 import org.camunda.bpm.engine.delegate.DelegateExecution;
33 import org.onap.so.bpmn.infrastructure.workflow.tasks.Resource;
34 import org.onap.so.bpmn.infrastructure.workflow.tasks.WorkflowType;
35 import org.onap.so.client.exception.ExceptionBuilder;
36 import org.onap.so.db.catalog.beans.CollectionResourceCustomization;
37 import org.onap.so.db.catalog.beans.CvnfcConfigurationCustomization;
38 import org.onap.so.db.catalog.beans.CvnfcCustomization;
39 import org.onap.so.db.catalog.beans.VfModuleCustomization;
40 import org.onap.so.db.catalog.client.CatalogDbClient;
41 import org.onap.so.serviceinstancebeans.Networks;
42 import org.onap.so.serviceinstancebeans.Pnfs;
43 import org.onap.so.serviceinstancebeans.Service;
44 import org.onap.so.serviceinstancebeans.VfModules;
45 import org.onap.so.serviceinstancebeans.Vnfs;
46 import org.slf4j.Logger;
47 import org.slf4j.LoggerFactory;
48 import org.springframework.stereotype.Component;
49 import java.io.IOException;
50 import java.util.ArrayList;
51 import java.util.Collections;
52 import java.util.List;
53 import java.util.Map;
54 import static org.onap.so.bpmn.infrastructure.workflow.tasks.WorkflowActionConstants.CREATE_INSTANCE;
55 import static org.onap.so.bpmn.infrastructure.workflow.tasks.WorkflowActionConstants.FABRIC_CONFIGURATION;
56 import static org.onap.so.bpmn.infrastructure.workflow.tasks.WorkflowActionConstants.USER_PARAM_SERVICE;
57 import static org.onap.so.bpmn.infrastructure.workflow.tasks.WorkflowActionConstants.WORKFLOW_ACTION_ERROR_MESSAGE;
58
59 @Component
60 public class UserParamsServiceTraversal {
61
62     private static final Logger logger = LoggerFactory.getLogger(UserParamsServiceTraversal.class);
63
64     private final CatalogDbClient catalogDbClient;
65     private final ExceptionBuilder exceptionBuilder;
66     private boolean foundVfModuleOrVG;
67     private String vnfCustomizationUUID;
68     private String vfModuleCustomizationUUID;
69
70     UserParamsServiceTraversal(CatalogDbClient catalogDbClient, ExceptionBuilder exceptionBuilder) {
71         this.catalogDbClient = catalogDbClient;
72         this.exceptionBuilder = exceptionBuilder;
73     }
74
75     public List<Resource> getResourceListFromUserParams(DelegateExecution execution,
76             List<Map<String, Object>> userParams, String serviceModelVersionId, String requestAction)
77             throws IOException {
78         if (userParams != null) {
79             for (Map<String, Object> params : userParams) {
80                 if (params.containsKey(USER_PARAM_SERVICE)) {
81                     ObjectMapper obj = new ObjectMapper();
82                     String input = obj.writeValueAsString(params.get(USER_PARAM_SERVICE));
83                     Service validate = obj.readValue(input, Service.class);
84                     return getResourceList(execution, serviceModelVersionId, requestAction, validate);
85                 }
86             }
87         }
88         return Collections.emptyList();
89     }
90
91     private List<Resource> getResourceList(DelegateExecution execution, String serviceModelVersionId,
92             String requestAction, Service validate) {
93         List<Resource> resourceList = new ArrayList<>();
94         Resource serviceResource =
95                 new Resource(WorkflowType.SERVICE, validate.getModelInfo().getModelVersionId(), false, null);
96         resourceList.add(serviceResource);
97         if (validate.getResources().getServices() != null) {
98             setResourceListForChildServices(execution, resourceList, serviceResource, validate);
99         }
100         if (validate.getResources().getVnfs() != null) {
101             setResourceListForVnfs(execution, resourceList, serviceResource, validate);
102         }
103         if (validate.getResources().getPnfs() != null) {
104             setResourceListForPnfs(resourceList, serviceResource, validate);
105         }
106         if (validate.getResources().getNetworks() != null) {
107             setResourceListForNetworks(execution, serviceModelVersionId, requestAction, resourceList, serviceResource,
108                     validate);
109         }
110         return resourceList;
111     }
112
113     private void setResourceListForChildServices(DelegateExecution execution, List<Resource> resourceList,
114             Resource serviceResource, Service validate) {
115         for (Service childService : validate.getResources().getServices()) {
116             Resource childServiceResource = new Resource(WorkflowType.SERVICE,
117                     childService.getModelInfo().getModelVersionId(), false, serviceResource);
118             childServiceResource.setInstanceName(childService.getInstanceName());
119             resourceList.add(childServiceResource);
120         }
121     }
122
123     private void setResourceListForVnfs(DelegateExecution execution, List<Resource> resourceList,
124             Resource serviceResource, Service validate) {
125         for (Vnfs vnf : validate.getResources().getVnfs()) {
126             setVnfCustomizationUUID(vnf);
127             Resource vnfResource = new Resource(WorkflowType.VNF, vnf.getModelInfo().getModelCustomizationId(), false,
128                     serviceResource);
129             vnfResource.setProcessingPriority(vnf.getProcessingPriority());
130             vnfResource.setInstanceName(vnf.getInstanceName());
131             resourceList.add(vnfResource);
132             setResourceListForVfModules(execution, resourceList, vnfResource, validate, vnf);
133         }
134     }
135
136     private void setResourceListForVfModules(DelegateExecution execution, List<Resource> resourceList,
137             Resource vnfResource, Service validate, Vnfs vnf) {
138         if (vnf.getVfModules() != null) {
139             for (VfModules vfModule : vnf.getVfModules()) {
140                 setVfModuleCustomizationUUID(vfModule);
141                 VfModuleCustomization vfModuleCustomization =
142                         catalogDbClient.getVfModuleCustomizationByModelCuztomizationUUID(vfModuleCustomizationUUID);
143                 if (vfModuleCustomization != null && vfModuleCustomization.getVfModule() != null) {
144                     setVolumeGroupWorkFlowTypeToResourceList(resourceList, vnfResource, vfModuleCustomization);
145                     setVfModuleAndConfigurationWorkFlowTypeToResourceList(resourceList, vnfResource, validate, vnf,
146                             vfModule, vfModuleCustomization);
147                     if (!foundVfModuleOrVG) {
148                         buildAndThrowException(execution,
149                                 "Could not determine if vfModule was a vfModule or volume group. Heat template and Heat env are null");
150                     }
151                 }
152             }
153         }
154     }
155
156     private void setVolumeGroupWorkFlowTypeToResourceList(List<Resource> resourceList, Resource vnfResource,
157             VfModuleCustomization vfModuleCustomization) {
158         if (vfModuleCustomization.getVfModule().getVolumeHeatTemplate() != null
159                 && vfModuleCustomization.getVolumeHeatEnv() != null) {
160             foundVfModuleOrVG = true;
161             resourceList.add(new Resource(WorkflowType.VOLUMEGROUP, vfModuleCustomization.getModelCustomizationUUID(),
162                     false, vnfResource));
163         }
164     }
165
166     private void setVfModuleAndConfigurationWorkFlowTypeToResourceList(List<Resource> resourceList,
167             Resource vnfResource, Service validate, Vnfs vnf, VfModules vfModule,
168             VfModuleCustomization vfModuleCustomization) {
169         if ((vfModuleCustomization.getVfModule().getModuleHeatTemplate() != null
170                 && vfModuleCustomization.getHeatEnvironment() != null)
171                 || (vfModuleCustomization.getVfModule().getModelName() != null
172                         && vfModuleCustomization.getVfModule().getModelName().contains("helm"))) {
173             foundVfModuleOrVG = true;
174             Resource resource =
175                     setVfModuleWorkFlowTypeToResourceList(resourceList, vnfResource, vfModuleCustomization, vfModule);
176             setConfigurationWorkFlowTypeToResourceList(resourceList, vnfResource, validate, vnf, vfModule, resource);
177         }
178     }
179
180     private Resource setVfModuleWorkFlowTypeToResourceList(List<Resource> resourceList, Resource vnfResource,
181             VfModuleCustomization vfModuleCustomization, VfModules vfModule) {
182         Resource resource = new Resource(WorkflowType.VFMODULE, vfModuleCustomization.getModelCustomizationUUID(),
183                 false, vnfResource);
184         resource.setProcessingPriority(vfModule.getProcessingPriority());
185         resource.setBaseVfModule(vfModuleCustomization.getVfModule().getIsBase() != null
186                 && vfModuleCustomization.getVfModule().getIsBase());
187         resource.setInstanceName(vfModule.getInstanceName());
188         resourceList.add(resource);
189         return resource;
190     }
191
192     private void setConfigurationWorkFlowTypeToResourceList(List<Resource> resourceList, Resource vnfResource,
193             Service validate, Vnfs vnf, VfModules vfModule, Resource resource) {
194         if (!vnfCustomizationUUID.isEmpty() && !vfModuleCustomizationUUID.isEmpty()) {
195             List<CvnfcConfigurationCustomization> configs =
196                     traverseCatalogDbForConfiguration(validate.getModelInfo().getModelVersionId());
197             for (CvnfcConfigurationCustomization config : configs) {
198                 Resource configResource = new Resource(WorkflowType.CONFIGURATION,
199                         config.getConfigurationResource().getModelUUID(), false, vnfResource);
200                 resource.setVnfCustomizationId(vnf.getModelInfo().getModelCustomizationId());
201                 resource.setVfModuleCustomizationId(vfModule.getModelInfo().getModelCustomizationId());
202                 resourceList.add(configResource);
203             }
204         }
205     }
206
207     private void setVfModuleCustomizationUUID(VfModules vfModule) {
208         if (vfModule.getModelInfo() != null && vfModule.getModelInfo().getModelCustomizationUuid() != null) {
209             vfModuleCustomizationUUID = vfModule.getModelInfo().getModelCustomizationUuid();
210         } else {
211             vfModuleCustomizationUUID = "";
212         }
213     }
214
215     private void setVnfCustomizationUUID(Vnfs vnf) {
216         if (vnf.getModelInfo() != null && vnf.getModelInfo().getModelCustomizationUuid() != null) {
217             vnfCustomizationUUID = vnf.getModelInfo().getModelCustomizationUuid();
218         } else {
219             vnfCustomizationUUID = "";
220         }
221     }
222
223     private void setResourceListForPnfs(List<Resource> resourceList, Resource serviceResource, Service validate) {
224         for (Pnfs pnf : validate.getResources().getPnfs()) {
225             Resource pnfResource = new Resource(WorkflowType.PNF, pnf.getModelInfo().getModelCustomizationId(), false,
226                     serviceResource);
227             pnfResource.setProcessingPriority(pnf.getProcessingPriority());
228             resourceList.add(pnfResource);
229         }
230     }
231
232     private void setResourceListForNetworks(DelegateExecution execution, String serviceModelVersionId,
233             String requestAction, List<Resource> resourceList, Resource serviceResource, Service validate) {
234         for (Networks network : validate.getResources().getNetworks()) {
235             Resource networkResource = new Resource(WorkflowType.NETWORK,
236                     network.getModelInfo().getModelCustomizationId(), false, serviceResource);
237             networkResource.setProcessingPriority(network.getProcessingPriority());
238             resourceList.add(networkResource);
239         }
240         if (requestAction.equals(CREATE_INSTANCE)) {
241             String networkColCustId = queryCatalogDbForNetworkCollection(execution, serviceModelVersionId);
242             if (networkColCustId != null) {
243                 resourceList
244                         .add(new Resource(WorkflowType.NETWORKCOLLECTION, networkColCustId, false, serviceResource));
245             }
246         }
247     }
248
249
250     private List<CvnfcConfigurationCustomization> traverseCatalogDbForConfiguration(String serviceModelUUID) {
251         try {
252             List<CvnfcCustomization> cvnfcCustomizations = catalogDbClient.getCvnfcCustomization(serviceModelUUID,
253                     vnfCustomizationUUID, vfModuleCustomizationUUID);
254             return getCvnfcConfigurationCustomizations(cvnfcCustomizations);
255         } catch (Exception ex) {
256             logger.error("Error in finding configurations", ex);
257             return Collections.emptyList();
258         }
259     }
260
261     private List<CvnfcConfigurationCustomization> getCvnfcConfigurationCustomizations(
262             List<CvnfcCustomization> cvnfcCustomizations) {
263         List<CvnfcConfigurationCustomization> configurations = new ArrayList<>();
264         for (CvnfcCustomization cvnfc : cvnfcCustomizations) {
265             for (CvnfcConfigurationCustomization customization : cvnfc.getCvnfcConfigurationCustomization()) {
266                 if (customization.getConfigurationResource().getToscaNodeType().contains(FABRIC_CONFIGURATION)) {
267                     configurations.add(customization);
268                 }
269             }
270         }
271         logger.debug("found {} fabric configuration(s)", configurations.size());
272         return configurations;
273     }
274
275     private String queryCatalogDbForNetworkCollection(DelegateExecution execution, String serviceModelVersionId) {
276         org.onap.so.db.catalog.beans.Service service = catalogDbClient.getServiceByID(serviceModelVersionId);
277         if (service != null) {
278             CollectionResourceCustomization networkCollection = this.findCatalogNetworkCollection(execution, service);
279             if (networkCollection != null) {
280                 return networkCollection.getModelCustomizationUUID();
281             }
282         }
283         return null;
284     }
285
286     private CollectionResourceCustomization findCatalogNetworkCollection(DelegateExecution execution,
287             org.onap.so.db.catalog.beans.Service service) {
288         CollectionResourceCustomization networkCollection = null;
289         int count = 0;
290         for (CollectionResourceCustomization collectionCustom : service.getCollectionResourceCustomizations()) {
291             if (catalogDbClient.getNetworkCollectionResourceCustomizationByID(
292                     collectionCustom.getModelCustomizationUUID()) != null) {
293                 networkCollection = collectionCustom;
294                 count++;
295             }
296         }
297         if (count > 1) {
298             buildAndThrowException(execution,
299                     "Found multiple Network Collections in the Service model, only one per Service is supported.");
300         }
301         return networkCollection;
302     }
303
304     private void buildAndThrowException(DelegateExecution execution, String msg) {
305         logger.error(msg);
306         execution.setVariable(WORKFLOW_ACTION_ERROR_MESSAGE, msg);
307         exceptionBuilder.buildAndThrowWorkflowException(execution, 7000, msg);
308     }
309 }