6c6bd61041e62fc07486471908d40eadaf154abc
[so.git] /
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  * Licensed under the Apache License, Version 2.0 (the "License");
14  * you may not use this file except in compliance with the License.
15  * You may obtain a copy of the License at
16  *
17  *      http://www.apache.org/licenses/LICENSE-2.0
18  *
19  * Unless required by applicable law or agreed to in writing, software
20  * distributed under the License is distributed on an "AS IS" BASIS,
21  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
22  * See the License for the specific language governing permissions and
23  * limitations under the License.
24  * ============LICENSE_END=========================================================
25  */
26
27 package org.onap.so.bpmn.infrastructure.workflow.tasks;
28
29 import com.fasterxml.jackson.databind.ObjectMapper;
30 import org.camunda.bpm.engine.delegate.DelegateExecution;
31 import org.onap.so.client.exception.ExceptionBuilder;
32 import org.onap.so.db.catalog.beans.CollectionResourceCustomization;
33 import org.onap.so.db.catalog.beans.CvnfcConfigurationCustomization;
34 import org.onap.so.db.catalog.beans.CvnfcCustomization;
35 import org.onap.so.db.catalog.beans.VfModuleCustomization;
36 import org.onap.so.db.catalog.client.CatalogDbClient;
37 import org.onap.so.serviceinstancebeans.Networks;
38 import org.onap.so.serviceinstancebeans.Pnfs;
39 import org.onap.so.serviceinstancebeans.Service;
40 import org.onap.so.serviceinstancebeans.VfModules;
41 import org.onap.so.serviceinstancebeans.Vnfs;
42 import org.slf4j.Logger;
43 import org.slf4j.LoggerFactory;
44 import org.springframework.stereotype.Component;
45 import java.io.IOException;
46 import java.util.ArrayList;
47 import java.util.List;
48 import java.util.Map;
49 import static org.onap.so.bpmn.infrastructure.workflow.tasks.WorkflowActionConstants.CREATE_INSTANCE;
50 import static org.onap.so.bpmn.infrastructure.workflow.tasks.WorkflowActionConstants.FABRIC_CONFIGURATION;
51 import static org.onap.so.bpmn.infrastructure.workflow.tasks.WorkflowActionConstants.USER_PARAM_SERVICE;
52 import static org.onap.so.bpmn.infrastructure.workflow.tasks.WorkflowActionConstants.WORKFLOW_ACTION_ERROR_MESSAGE;
53
54 @Component
55 public class UserParamsServiceTraversal {
56
57     private static final Logger logger = LoggerFactory.getLogger(UserParamsServiceTraversal.class);
58
59     private final CatalogDbClient catalogDbClient;
60     private final ExceptionBuilder exceptionBuilder;
61
62     UserParamsServiceTraversal(CatalogDbClient catalogDbClient, ExceptionBuilder exceptionBuilder) {
63         this.catalogDbClient = catalogDbClient;
64         this.exceptionBuilder = exceptionBuilder;
65     }
66
67     protected List<Resource> getResourceListFromUserParams(DelegateExecution execution,
68             List<Map<String, Object>> userParams, String serviceModelVersionId, String requestAction)
69             throws IOException {
70         List<Resource> resourceList = new ArrayList<>();
71         boolean foundVfModuleOrVG = false;
72         String vnfCustomizationUUID = "";
73         String vfModuleCustomizationUUID = "";
74         if (userParams != null) {
75             for (Map<String, Object> params : userParams) {
76                 if (params.containsKey(USER_PARAM_SERVICE)) {
77                     ObjectMapper obj = new ObjectMapper();
78                     String input = obj.writeValueAsString(params.get(USER_PARAM_SERVICE));
79                     Service validate = obj.readValue(input, Service.class);
80                     resourceList.add(
81                             new Resource(WorkflowType.SERVICE, validate.getModelInfo().getModelVersionId(), false));
82                     if (validate.getResources().getVnfs() != null) {
83                         for (Vnfs vnf : validate.getResources().getVnfs()) {
84                             resourceList.add(new Resource(WorkflowType.VNF,
85                                     vnf.getModelInfo().getModelCustomizationId(), false));
86                             if (vnf.getModelInfo() != null && vnf.getModelInfo().getModelCustomizationUuid() != null) {
87                                 vnfCustomizationUUID = vnf.getModelInfo().getModelCustomizationUuid();
88                             }
89                             if (vnf.getVfModules() != null) {
90                                 for (VfModules vfModule : vnf.getVfModules()) {
91                                     VfModuleCustomization vfModuleCustomization =
92                                             catalogDbClient.getVfModuleCustomizationByModelCuztomizationUUID(
93                                                     vfModule.getModelInfo().getModelCustomizationUuid());
94                                     if (vfModuleCustomization != null) {
95
96                                         if (vfModuleCustomization.getVfModule() != null
97                                                 && vfModuleCustomization.getVfModule().getVolumeHeatTemplate() != null
98                                                 && vfModuleCustomization.getVolumeHeatEnv() != null) {
99                                             resourceList.add(new Resource(WorkflowType.VOLUMEGROUP,
100                                                     vfModuleCustomization.getModelCustomizationUUID(), false));
101                                             foundVfModuleOrVG = true;
102                                         }
103
104                                         if ((vfModuleCustomization.getVfModule() != null)
105                                                 && ((vfModuleCustomization.getVfModule().getModuleHeatTemplate() != null
106                                                         && vfModuleCustomization.getHeatEnvironment() != null))
107                                                 || (vfModuleCustomization.getVfModule() != null
108                                                         && vfModuleCustomization.getVfModule().getModelName() != null
109                                                         && vfModuleCustomization.getVfModule().getModelName()
110                                                                 .contains("helm"))) {
111                                             foundVfModuleOrVG = true;
112                                             Resource resource = new Resource(WorkflowType.VFMODULE,
113                                                     vfModuleCustomization.getModelCustomizationUUID(), false);
114                                             resource.setBaseVfModule(
115                                                     vfModuleCustomization.getVfModule().getIsBase() != null
116                                                             && vfModuleCustomization.getVfModule().getIsBase());
117                                             resourceList.add(resource);
118                                             if (vfModule.getModelInfo() != null
119                                                     && vfModule.getModelInfo().getModelCustomizationUuid() != null) {
120                                                 vfModuleCustomizationUUID =
121                                                         vfModule.getModelInfo().getModelCustomizationUuid();
122                                             }
123                                             if (!vnfCustomizationUUID.isEmpty()
124                                                     && !vfModuleCustomizationUUID.isEmpty()) {
125                                                 List<CvnfcConfigurationCustomization> configs =
126                                                         traverseCatalogDbForConfiguration(
127                                                                 validate.getModelInfo().getModelVersionId(),
128                                                                 vnfCustomizationUUID, vfModuleCustomizationUUID);
129                                                 for (CvnfcConfigurationCustomization config : configs) {
130                                                     Resource configResource = new Resource(WorkflowType.CONFIGURATION,
131                                                             config.getConfigurationResource().getModelUUID(), false);
132                                                     resource.setVnfCustomizationId(
133                                                             vnf.getModelInfo().getModelCustomizationId());
134                                                     resource.setVfModuleCustomizationId(
135                                                             vfModule.getModelInfo().getModelCustomizationId());
136                                                     resourceList.add(configResource);
137                                                 }
138                                             }
139                                         }
140                                         if (!foundVfModuleOrVG) {
141                                             buildAndThrowException(execution,
142                                                     "Could not determine if vfModule was a vfModule or volume group. Heat template and Heat env are null");
143                                         }
144                                     }
145                                 }
146                             }
147                         }
148                     }
149                     if (validate.getResources().getPnfs() != null) {
150                         for (Pnfs pnf : validate.getResources().getPnfs()) {
151                             resourceList.add(new Resource(WorkflowType.PNF,
152                                     pnf.getModelInfo().getModelCustomizationId(), false));
153                         }
154                     }
155                     if (validate.getResources().getNetworks() != null) {
156                         for (Networks network : validate.getResources().getNetworks()) {
157                             resourceList.add(new Resource(WorkflowType.NETWORK,
158                                     network.getModelInfo().getModelCustomizationId(), false));
159                         }
160                         if (requestAction.equals(CREATE_INSTANCE)) {
161                             String networkColCustId =
162                                     queryCatalogDbForNetworkCollection(execution, serviceModelVersionId);
163                             if (networkColCustId != null) {
164                                 resourceList.add(new Resource(WorkflowType.NETWORKCOLLECTION, networkColCustId, false));
165                             }
166                         }
167                     }
168                     break;
169                 }
170             }
171         }
172         return resourceList;
173     }
174
175
176     private List<CvnfcConfigurationCustomization> traverseCatalogDbForConfiguration(String serviceModelUUID,
177             String vnfCustomizationUUID, String vfModuleCustomizationUUID) {
178         List<CvnfcConfigurationCustomization> configurations = new ArrayList<>();
179         try {
180             List<CvnfcCustomization> cvnfcCustomizations = catalogDbClient.getCvnfcCustomization(serviceModelUUID,
181                     vnfCustomizationUUID, vfModuleCustomizationUUID);
182             for (CvnfcCustomization cvnfc : cvnfcCustomizations) {
183                 for (CvnfcConfigurationCustomization customization : cvnfc.getCvnfcConfigurationCustomization()) {
184                     if (customization.getConfigurationResource().getToscaNodeType().contains(FABRIC_CONFIGURATION)) {
185                         configurations.add(customization);
186                     }
187                 }
188             }
189             logger.debug("found {} fabric configuration(s)", configurations.size());
190             return configurations;
191         } catch (Exception ex) {
192             logger.error("Error in finding configurations", ex);
193             return configurations;
194         }
195     }
196
197     private String queryCatalogDbForNetworkCollection(DelegateExecution execution, String serviceModelVersionId) {
198         org.onap.so.db.catalog.beans.Service service = catalogDbClient.getServiceByID(serviceModelVersionId);
199         if (service != null) {
200             CollectionResourceCustomization networkCollection = this.findCatalogNetworkCollection(execution, service);
201             if (networkCollection != null) {
202                 return networkCollection.getModelCustomizationUUID();
203             }
204         }
205         return null;
206     }
207
208     private CollectionResourceCustomization findCatalogNetworkCollection(DelegateExecution execution,
209             org.onap.so.db.catalog.beans.Service service) {
210         CollectionResourceCustomization networkCollection = null;
211         int count = 0;
212         for (CollectionResourceCustomization collectionCustom : service.getCollectionResourceCustomizations()) {
213             if (catalogDbClient.getNetworkCollectionResourceCustomizationByID(
214                     collectionCustom.getModelCustomizationUUID()) != null) {
215                 networkCollection = collectionCustom;
216                 count++;
217             }
218         }
219         if (count == 0) {
220             return null;
221         } else if (count > 1) {
222             buildAndThrowException(execution,
223                     "Found multiple Network Collections in the Service model, only one per Service is supported.");
224         }
225         return networkCollection;
226     }
227
228     private void buildAndThrowException(DelegateExecution execution, String msg) {
229         logger.error(msg);
230         execution.setVariable(WORKFLOW_ACTION_ERROR_MESSAGE, msg);
231         exceptionBuilder.buildAndThrowWorkflowException(execution, 7000, msg);
232     }
233 }