Merge "add junit coverage"
[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().getVnfs() != null) {
98             setResourceListForVnfs(execution, resourceList, serviceResource, validate);
99         }
100         if (validate.getResources().getPnfs() != null) {
101             setResourceListForPnfs(resourceList, serviceResource, validate);
102         }
103         if (validate.getResources().getNetworks() != null) {
104             setResourceListForNetworks(execution, serviceModelVersionId, requestAction, resourceList, serviceResource,
105                     validate);
106         }
107         return resourceList;
108     }
109
110     private void setResourceListForVnfs(DelegateExecution execution, List<Resource> resourceList,
111             Resource serviceResource, Service validate) {
112         for (Vnfs vnf : validate.getResources().getVnfs()) {
113             setVnfCustomizationUUID(vnf);
114             Resource vnfResource = new Resource(WorkflowType.VNF, vnf.getModelInfo().getModelCustomizationId(), false,
115                     serviceResource);
116             vnfResource.setProcessingPriority(vnf.getProcessingPriority());
117             resourceList.add(vnfResource);
118             setResourceListForVfModules(execution, resourceList, vnfResource, validate, vnf);
119         }
120     }
121
122     private void setResourceListForVfModules(DelegateExecution execution, List<Resource> resourceList,
123             Resource vnfResource, Service validate, Vnfs vnf) {
124         if (vnf.getVfModules() != null) {
125             for (VfModules vfModule : vnf.getVfModules()) {
126                 setVfModuleCustomizationUUID(vfModule);
127                 VfModuleCustomization vfModuleCustomization =
128                         catalogDbClient.getVfModuleCustomizationByModelCuztomizationUUID(vfModuleCustomizationUUID);
129                 if (vfModuleCustomization != null && vfModuleCustomization.getVfModule() != null) {
130                     setVolumeGroupWorkFlowTypeToResourceList(resourceList, vnfResource, vfModuleCustomization);
131                     setVfModuleAndConfigurationWorkFlowTypeToResourceList(resourceList, vnfResource, validate, vnf,
132                             vfModule, vfModuleCustomization);
133                     if (!foundVfModuleOrVG) {
134                         buildAndThrowException(execution,
135                                 "Could not determine if vfModule was a vfModule or volume group. Heat template and Heat env are null");
136                     }
137                 }
138             }
139         }
140     }
141
142     private void setVolumeGroupWorkFlowTypeToResourceList(List<Resource> resourceList, Resource vnfResource,
143             VfModuleCustomization vfModuleCustomization) {
144         if (vfModuleCustomization.getVfModule().getVolumeHeatTemplate() != null
145                 && vfModuleCustomization.getVolumeHeatEnv() != null) {
146             foundVfModuleOrVG = true;
147             resourceList.add(new Resource(WorkflowType.VOLUMEGROUP, vfModuleCustomization.getModelCustomizationUUID(),
148                     false, vnfResource));
149         }
150     }
151
152     private void setVfModuleAndConfigurationWorkFlowTypeToResourceList(List<Resource> resourceList,
153             Resource vnfResource, Service validate, Vnfs vnf, VfModules vfModule,
154             VfModuleCustomization vfModuleCustomization) {
155         if ((vfModuleCustomization.getVfModule().getModuleHeatTemplate() != null
156                 && vfModuleCustomization.getHeatEnvironment() != null)
157                 || (vfModuleCustomization.getVfModule().getModelName() != null
158                         && vfModuleCustomization.getVfModule().getModelName().contains("helm"))) {
159             foundVfModuleOrVG = true;
160             Resource resource =
161                     setVfModuleWorkFlowTypeToResourceList(resourceList, vnfResource, vfModuleCustomization, vfModule);
162             setConfigurationWorkFlowTypeToResourceList(resourceList, vnfResource, validate, vnf, vfModule, resource);
163         }
164     }
165
166     private Resource setVfModuleWorkFlowTypeToResourceList(List<Resource> resourceList, Resource vnfResource,
167             VfModuleCustomization vfModuleCustomization, VfModules vfModule) {
168         Resource resource = new Resource(WorkflowType.VFMODULE, vfModuleCustomization.getModelCustomizationUUID(),
169                 false, vnfResource);
170         resource.setProcessingPriority(vfModule.getProcessingPriority());
171         resource.setBaseVfModule(vfModuleCustomization.getVfModule().getIsBase() != null
172                 && vfModuleCustomization.getVfModule().getIsBase());
173         resourceList.add(resource);
174         return resource;
175     }
176
177     private void setConfigurationWorkFlowTypeToResourceList(List<Resource> resourceList, Resource vnfResource,
178             Service validate, Vnfs vnf, VfModules vfModule, Resource resource) {
179         if (!vnfCustomizationUUID.isEmpty() && !vfModuleCustomizationUUID.isEmpty()) {
180             List<CvnfcConfigurationCustomization> configs =
181                     traverseCatalogDbForConfiguration(validate.getModelInfo().getModelVersionId());
182             for (CvnfcConfigurationCustomization config : configs) {
183                 Resource configResource = new Resource(WorkflowType.CONFIGURATION,
184                         config.getConfigurationResource().getModelUUID(), false, vnfResource);
185                 resource.setVnfCustomizationId(vnf.getModelInfo().getModelCustomizationId());
186                 resource.setVfModuleCustomizationId(vfModule.getModelInfo().getModelCustomizationId());
187                 resourceList.add(configResource);
188             }
189         }
190     }
191
192     private void setVfModuleCustomizationUUID(VfModules vfModule) {
193         if (vfModule.getModelInfo() != null && vfModule.getModelInfo().getModelCustomizationUuid() != null) {
194             vfModuleCustomizationUUID = vfModule.getModelInfo().getModelCustomizationUuid();
195         } else {
196             vfModuleCustomizationUUID = "";
197         }
198     }
199
200     private void setVnfCustomizationUUID(Vnfs vnf) {
201         if (vnf.getModelInfo() != null && vnf.getModelInfo().getModelCustomizationUuid() != null) {
202             vnfCustomizationUUID = vnf.getModelInfo().getModelCustomizationUuid();
203         } else {
204             vnfCustomizationUUID = "";
205         }
206     }
207
208     private void setResourceListForPnfs(List<Resource> resourceList, Resource serviceResource, Service validate) {
209         for (Pnfs pnf : validate.getResources().getPnfs()) {
210             Resource pnfResource = new Resource(WorkflowType.PNF, pnf.getModelInfo().getModelCustomizationId(), false,
211                     serviceResource);
212             pnfResource.setProcessingPriority(pnf.getProcessingPriority());
213             resourceList.add(pnfResource);
214         }
215     }
216
217     private void setResourceListForNetworks(DelegateExecution execution, String serviceModelVersionId,
218             String requestAction, List<Resource> resourceList, Resource serviceResource, Service validate) {
219         for (Networks network : validate.getResources().getNetworks()) {
220             Resource networkResource = new Resource(WorkflowType.NETWORK,
221                     network.getModelInfo().getModelCustomizationId(), false, serviceResource);
222             networkResource.setProcessingPriority(network.getProcessingPriority());
223             resourceList.add(networkResource);
224         }
225         if (requestAction.equals(CREATE_INSTANCE)) {
226             String networkColCustId = queryCatalogDbForNetworkCollection(execution, serviceModelVersionId);
227             if (networkColCustId != null) {
228                 resourceList
229                         .add(new Resource(WorkflowType.NETWORKCOLLECTION, networkColCustId, false, serviceResource));
230             }
231         }
232     }
233
234
235     private List<CvnfcConfigurationCustomization> traverseCatalogDbForConfiguration(String serviceModelUUID) {
236         try {
237             List<CvnfcCustomization> cvnfcCustomizations = catalogDbClient.getCvnfcCustomization(serviceModelUUID,
238                     vnfCustomizationUUID, vfModuleCustomizationUUID);
239             return getCvnfcConfigurationCustomizations(cvnfcCustomizations);
240         } catch (Exception ex) {
241             logger.error("Error in finding configurations", ex);
242             return Collections.emptyList();
243         }
244     }
245
246     private List<CvnfcConfigurationCustomization> getCvnfcConfigurationCustomizations(
247             List<CvnfcCustomization> cvnfcCustomizations) {
248         List<CvnfcConfigurationCustomization> configurations = new ArrayList<>();
249         for (CvnfcCustomization cvnfc : cvnfcCustomizations) {
250             for (CvnfcConfigurationCustomization customization : cvnfc.getCvnfcConfigurationCustomization()) {
251                 if (customization.getConfigurationResource().getToscaNodeType().contains(FABRIC_CONFIGURATION)) {
252                     configurations.add(customization);
253                 }
254             }
255         }
256         logger.debug("found {} fabric configuration(s)", configurations.size());
257         return configurations;
258     }
259
260     private String queryCatalogDbForNetworkCollection(DelegateExecution execution, String serviceModelVersionId) {
261         org.onap.so.db.catalog.beans.Service service = catalogDbClient.getServiceByID(serviceModelVersionId);
262         if (service != null) {
263             CollectionResourceCustomization networkCollection = this.findCatalogNetworkCollection(execution, service);
264             if (networkCollection != null) {
265                 return networkCollection.getModelCustomizationUUID();
266             }
267         }
268         return null;
269     }
270
271     private CollectionResourceCustomization findCatalogNetworkCollection(DelegateExecution execution,
272             org.onap.so.db.catalog.beans.Service service) {
273         CollectionResourceCustomization networkCollection = null;
274         int count = 0;
275         for (CollectionResourceCustomization collectionCustom : service.getCollectionResourceCustomizations()) {
276             if (catalogDbClient.getNetworkCollectionResourceCustomizationByID(
277                     collectionCustom.getModelCustomizationUUID()) != null) {
278                 networkCollection = collectionCustom;
279                 count++;
280             }
281         }
282         if (count > 1) {
283             buildAndThrowException(execution,
284                     "Found multiple Network Collections in the Service model, only one per Service is supported.");
285         }
286         return networkCollection;
287     }
288
289     private void buildAndThrowException(DelegateExecution execution, String msg) {
290         logger.error(msg);
291         execution.setVariable(WORKFLOW_ACTION_ERROR_MESSAGE, msg);
292         exceptionBuilder.buildAndThrowWorkflowException(execution, 7000, msg);
293     }
294 }