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