6774fad543e7eba938c2f2c97415d9b9a824ca2e
[so.git] / so-etsi-nfvo / so-etsi-nfvo-ns-lcm / so-etsi-nfvo-ns-lcm-bpmn-flows / src / main / java / org / onap / so / etsi / nfvo / ns / lcm / bpmn / flows / tasks / InstantiateNsTask.java
1 /*-
2  * ============LICENSE_START=======================================================
3  *  Copyright (C) 2020 Nordix Foundation.
4  * ================================================================================
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  *      http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  *
17  * SPDX-License-Identifier: Apache-2.0
18  * ============LICENSE_END=========================================================
19  */
20 package org.onap.so.etsi.nfvo.ns.lcm.bpmn.flows.tasks;
21
22 import static org.onap.so.etsi.nfvo.ns.lcm.bpmn.flows.CamundaVariableNameConstants.INSTANTIATE_NS_REQUEST_PARAM_NAME;
23 import static org.onap.so.etsi.nfvo.ns.lcm.bpmn.flows.CamundaVariableNameConstants.NETWORK_SERVICE_DESCRIPTOR_PARAM_NAME;
24 import static org.onap.so.etsi.nfvo.ns.lcm.bpmn.flows.CamundaVariableNameConstants.NS_INSTANCE_ID_PARAM_NAME;
25 import static org.onap.so.etsi.nfvo.ns.lcm.bpmn.flows.CamundaVariableNameConstants.OCC_ID_PARAM_NAME;
26 import static org.onap.so.etsi.nfvo.ns.lcm.bpmn.flows.CamundaVariableNameConstants.VNF_CREATE_INSTANTIATE_REQUESTS;
27 import static org.onap.so.etsi.nfvo.ns.lcm.database.beans.JobStatusEnum.FINISHED;
28 import static org.onap.so.etsi.nfvo.ns.lcm.database.beans.JobStatusEnum.IN_PROGRESS;
29 import static org.onap.so.etsi.nfvo.ns.lcm.database.beans.JobStatusEnum.STARTED;
30 import java.util.ArrayList;
31 import java.util.Collections;
32 import java.util.HashMap;
33 import java.util.List;
34 import java.util.Map;
35 import java.util.Optional;
36 import org.camunda.bpm.engine.delegate.DelegateExecution;
37 import org.onap.so.adapters.etsisol003adapter.lcm.v1.model.Tenant;
38 import org.onap.so.adapters.etsisol003adapter.pkgm.extclients.etsicatalog.model.NsdInfo;
39 import org.onap.so.adapters.etsisol003adapter.pkgm.extclients.etsicatalog.model.VnfPkgInfo;
40 import org.onap.so.etsi.nfvo.ns.lcm.bpmn.flows.exceptions.EtsiCatalogManagerRequestFailureException;
41 import org.onap.so.etsi.nfvo.ns.lcm.bpmn.flows.extclients.etsicatalog.EtsiCatalogPackageManagementServiceProvider;
42 import org.onap.so.etsi.nfvo.ns.lcm.bpmn.flows.nsd.NetworkServiceDescriptor;
43 import org.onap.so.etsi.nfvo.ns.lcm.bpmn.flows.nsd.VirtualNetworkFunction;
44 import org.onap.so.etsi.nfvo.ns.lcm.database.beans.NfvoNfInst;
45 import org.onap.so.etsi.nfvo.ns.lcm.database.beans.NfvoNsInst;
46 import org.onap.so.etsi.nfvo.ns.lcm.database.beans.NsLcmOpOcc;
47 import org.onap.so.etsi.nfvo.ns.lcm.database.beans.OperationStateEnum;
48 import org.onap.so.etsi.nfvo.ns.lcm.database.beans.State;
49 import org.onap.so.etsi.nfvo.ns.lcm.database.service.DatabaseServiceProvider;
50 import org.onap.so.etsi.nfvo.ns.lcm.model.InstantiateNsRequest;
51 import org.onap.so.etsi.nfvo.ns.lcm.model.NsInstancesnsInstanceIdinstantiateAdditionalParamsForVnf;
52 import org.slf4j.Logger;
53 import org.slf4j.LoggerFactory;
54 import org.springframework.beans.factory.annotation.Autowired;
55 import org.springframework.stereotype.Component;
56
57 /**
58  * @author Waqas Ikram (waqas.ikram@est.tech)
59  * @author Andrew Lamb (andrew.a.lamb@est.tech)
60  *
61  */
62 @Component
63 public class InstantiateNsTask extends AbstractNetworkServiceTask {
64
65     private static final String IS_NS_INSTANTIATION_SUCCESSFUL_PARAM_NAME = "isNsInstantiationSuccessful";
66     private static final String VNFD_ID_TO_VNF_PKG_ID_MAPPING_PARAM_NAME = "vnfdIdToVnfPkgIdMapping";
67     private static final Logger logger = LoggerFactory.getLogger(InstantiateNsTask.class);
68     private final EtsiCatalogPackageManagementServiceProvider etsiCatalogPackageManagementServiceProvider;
69
70     @Autowired
71     public InstantiateNsTask(final DatabaseServiceProvider databaseServiceProvider,
72             final EtsiCatalogPackageManagementServiceProvider etsiCatalogPackageManagementServiceProvider) {
73         super(databaseServiceProvider);
74         this.etsiCatalogPackageManagementServiceProvider = etsiCatalogPackageManagementServiceProvider;
75
76     }
77
78     public void setJobStatusToStarted(final DelegateExecution execution) {
79         setJobStatus(execution, STARTED, "Instantiate NS workflow process started");
80     }
81
82     public void setJobStatusToFinished(final DelegateExecution execution) {
83         setJobStatus(execution, FINISHED, "Instantiate NS workflow process finished");
84     }
85
86     public void updateNsInstanceStatusToInstantiating(final DelegateExecution execution) {
87         logger.info("Executing updateNsInstanceStatusToInstantiating");
88         setJobStatus(execution, IN_PROGRESS, "Updating NfvoNsInst Status to " + State.INSTANTIATING);
89         updateNsInstanceStatus(execution, State.INSTANTIATING);
90
91         logger.info("Finished executing updateNsInstanceStatusToInstantiating  ...");
92     }
93
94
95     public void checkIfVnfInstantiationWasSuccessful(final DelegateExecution execution) {
96         logger.info("Executing checkIfVnfInstantiationWasSuccessful");
97
98         @SuppressWarnings("unchecked")
99         final List<CreateInstantiateRequest> requests =
100                 (List<CreateInstantiateRequest>) execution.getVariable(VNF_CREATE_INSTANTIATE_REQUESTS);
101
102         final String nsInstId = (String) execution.getVariable(NS_INSTANCE_ID_PARAM_NAME);
103         final List<NfvoNfInst> nfInstances = databaseServiceProvider.getNfvoNfInstByNsInstId(nsInstId);
104
105         if (nfInstances == null || nfInstances.isEmpty()) {
106             final String message = "Found empty nf instances";
107             abortOperation(execution, message);
108         }
109
110         if (requests.size() != nfInstances.size()) {
111             final String message = "Missing nf Instance. Request triggered: " + requests.size()
112                     + " Nf Instace reqeust found in database " + nfInstances.size();
113             abortOperation(execution, message);
114         }
115
116         execution.setVariable(IS_NS_INSTANTIATION_SUCCESSFUL_PARAM_NAME, true);
117
118         nfInstances.stream().forEach(instance -> {
119             if (!State.INSTANTIATED.equals(instance.getStatus())) {
120                 logger.error("VNF : {} {} instantiation failed", instance.getNfInstId(), instance.getName());
121                 execution.setVariable(IS_NS_INSTANTIATION_SUCCESSFUL_PARAM_NAME, false);
122             }
123         });
124
125         logger.info("Finished executing checkIfVnfInstantiationWasSuccessful  ...");
126     }
127
128     public void updateNsInstanceStatusToInstantiated(final DelegateExecution execution) {
129         logger.info("Executing updateNsInstanceStatusToInstantiated");
130         final String nsInstId = (String) execution.getVariable(NS_INSTANCE_ID_PARAM_NAME);
131         setJobStatus(execution, FINISHED, "Successfully " + State.INSTANTIATED + " NS: " + nsInstId);
132
133         updateNsInstanceStatus(execution, State.INSTANTIATED);
134         logger.info("Finished executing updateNsInstanceStatusToInstantiated  ...");
135     }
136
137     public void getAndParseNsdFromEtsiCatalog(final DelegateExecution execution) {
138         logger.info("Executing getAndParseNsdFromEtsiCatalog");
139         setJobStatus(execution, IN_PROGRESS, "Retrieving and parsing NSD from ETSI Catalog Manager");
140         final NfvoNsInst nfvoNsInst = getNfvoNsInst(execution);
141         final String nsPackageId = nfvoNsInst.getNsPackageId();
142
143         try {
144             final Optional<NetworkServiceDescriptor> optional =
145                     etsiCatalogPackageManagementServiceProvider.getNetworkServiceDescriptor(nsPackageId);
146
147             if (!optional.isPresent()) {
148                 final String message = "Unable to parse NSD " + nsPackageId;
149                 logger.error(message);
150                 abortOperation(execution, message);
151             }
152
153             final NetworkServiceDescriptor networkServiceDescriptor = optional.get();
154             logger.info("Found {}", networkServiceDescriptor);
155             execution.setVariable(NETWORK_SERVICE_DESCRIPTOR_PARAM_NAME, networkServiceDescriptor);
156
157         } catch (final EtsiCatalogManagerRequestFailureException failureException) {
158             final String message =
159                     "Unexpected exception occured while getting nsd content using nsPackageId: " + nsPackageId;
160             logger.error(message, failureException);
161
162             abortOperation(execution, message);
163         }
164
165         logger.info("Finished executing getAndParseNsdFromEtsiCatalog  ...");
166
167     }
168
169     public void prepareCreateInstantiateRequests(final DelegateExecution execution) {
170         logger.info("Executing prepareCreateInstantiateRequests ...");
171         setJobStatus(execution, IN_PROGRESS, "Preparing VNF CreateInstantiate requests");
172         final NetworkServiceDescriptor networkServiceDescriptor =
173                 (NetworkServiceDescriptor) execution.getVariable(NETWORK_SERVICE_DESCRIPTOR_PARAM_NAME);
174         final String nsInstId = (String) execution.getVariable(NS_INSTANCE_ID_PARAM_NAME);
175
176         final InstantiateNsRequest instantiateNsRequest =
177                 (InstantiateNsRequest) execution.getVariable(INSTANTIATE_NS_REQUEST_PARAM_NAME);
178
179         final List<NsInstancesnsInstanceIdinstantiateAdditionalParamsForVnf> additionalParamsForVnfList =
180                 instantiateNsRequest.getAdditionalParamsForVnf();
181
182         @SuppressWarnings("unchecked")
183         final Map<String, String> vnfdIdToVnfPkgIdMapping =
184                 (Map<String, String>) execution.getVariable(VNFD_ID_TO_VNF_PKG_ID_MAPPING_PARAM_NAME);
185
186         final List<CreateInstantiateRequest> requests = new ArrayList<>();
187
188         for (final VirtualNetworkFunction vnf : networkServiceDescriptor.getVnfs()) {
189             final List<String> vnfmInfoList = vnf.getVnfmInfoList();
190
191             final String vnfdId = vnf.getVnfdId();
192             final String vnfPkgId = vnfdIdToVnfPkgIdMapping.get(vnfdId);
193             if (vnfdId == null || vnfmInfoList.isEmpty() || vnfPkgId == null) {
194                 final String message = "Unable to find VnfdId/vnfmInfo/VnfPkgId for vnf: " + vnf;
195                 abortOperation(execution, message);
196             }
197
198             final Optional<Tenant> optional = getTenant(vnfPkgId, additionalParamsForVnfList);
199             if (!optional.isPresent()) {
200                 final String message = "Unable to find Tenant information for " + vnfdId + " in instantiateNsRequest : "
201                         + instantiateNsRequest;
202                 abortOperation(execution, message);
203             }
204
205             final Tenant tenant = optional.get();
206             final CreateInstantiateRequest createInstantiateRequest = new CreateInstantiateRequest().nsInstId(nsInstId)
207                     .vnfdId(vnfdId).vnfName(vnf.getVnfName()).vnfPkgId(vnfPkgId).nfType(vnfmInfoList.get(0))
208                     .tenant(tenant).additionalParams(getAdditionalParams(vnfPkgId, additionalParamsForVnfList));
209
210             logger.info("Adding request to list: {}", createInstantiateRequest);
211             requests.add(createInstantiateRequest);
212
213         }
214         execution.setVariable(VNF_CREATE_INSTANTIATE_REQUESTS, requests);
215
216         logger.info("Finished executing prepareCreateInstantiateRequests  ...");
217     }
218
219     public void getVnfPkgIdForEachVnfdId(final DelegateExecution execution) {
220         logger.info("Executing getVnfPkgIdForEachVnfdId ...");
221
222         setJobStatus(execution, IN_PROGRESS, "Getting VnfPkgId for each VnfdId");
223
224         final String nsInstId = (String) execution.getVariable(NS_INSTANCE_ID_PARAM_NAME);
225         final NfvoNsInst nfvoNsInst = getNfvoNsInst(execution, nsInstId);
226
227         final String nsPackageId = nfvoNsInst.getNsPackageId();
228         final NsdInfo nsdInfo = getNsdInfo(execution, nsPackageId);
229
230         final Map<String, String> vnfdIdToVnfPkgIdMapping = new HashMap<>();
231         try {
232             for (final String vnfPkgId : nsdInfo.getVnfPkgIds()) {
233                 final Optional<VnfPkgInfo> optional =
234                         etsiCatalogPackageManagementServiceProvider.getVnfPkgInfo(vnfPkgId);
235
236                 if (!optional.isPresent()) {
237                     final String message = "Unable to find VNF package using NS vnfPkgId: " + vnfPkgId;
238                     logger.error(message);
239                     abortOperation(execution, message);
240                 }
241                 final VnfPkgInfo vnfPkgInfo = optional.get();
242                 vnfdIdToVnfPkgIdMapping.put(vnfPkgInfo.getVnfdId(), vnfPkgId);
243
244             }
245             logger.info("vnfdIdToVnfPkgIdMapping: {}", vnfdIdToVnfPkgIdMapping);
246             execution.setVariable(VNFD_ID_TO_VNF_PKG_ID_MAPPING_PARAM_NAME, vnfdIdToVnfPkgIdMapping);
247
248         } catch (final EtsiCatalogManagerRequestFailureException failureException) {
249             final String message =
250                     "Unexpected exception occured while getting VNF package using nsPackageId: " + nsPackageId;
251             logger.error(message, failureException);
252
253             abortOperation(execution, message);
254         }
255
256         logger.info("Finished executing getVnfPkgIdForEachVnfdId ...");
257
258     }
259
260     public void logTimeOut(final DelegateExecution execution) {
261         logger.error("Vnf instantiation timedOut ...");
262         final String nsInstId = (String) execution.getVariable(NS_INSTANCE_ID_PARAM_NAME);
263         final List<NfvoNfInst> nfInstances = databaseServiceProvider.getNfvoNfInstByNsInstId(nsInstId);
264         if (nfInstances != null) {
265             nfInstances.stream().forEach(instance -> {
266                 logger.info("Current status {} of vnf: {}", instance.getStatus(), instance.getName());
267             });
268         }
269     }
270
271     public void setJobStatusToError(final DelegateExecution execution) {
272         updateNsInstanceStatus(execution, State.FAILED);
273         setJobStatusToError(execution, "Instantiate NS workflow process failed");
274     }
275
276     private NsdInfo getNsdInfo(final DelegateExecution execution, final String nsPackageId) {
277         try {
278             final Optional<NsdInfo> optional =
279                     etsiCatalogPackageManagementServiceProvider.getNSPackageModel(nsPackageId);
280
281             if (optional.isPresent()) {
282                 final NsdInfo packageModel = optional.get();
283                 logger.info("NS Package exists {}", packageModel);
284                 return packageModel;
285             }
286
287         } catch (final EtsiCatalogManagerRequestFailureException failureException) {
288             final String message =
289                     "Unexpected exception occured while getting ns package using nsPackageId: " + nsPackageId;
290             logger.error(message, failureException);
291
292             abortOperation(execution, message);
293         }
294
295         final String message = "Unable to find NS package using NS package id: " + nsPackageId;
296         logger.error(message);
297         abortOperation(execution, message);
298         return null;
299
300     }
301
302     private void updateNsInstanceStatus(final DelegateExecution execution, final State nsStatus) {
303         final NfvoNsInst nfvoNsInst = getNfvoNsInst(execution);
304         logger.info("Updating NfvoNsInst Status to {} and saving to DB", nsStatus);
305         nfvoNsInst.setStatus(nsStatus);
306         databaseServiceProvider.saveNfvoNsInst(nfvoNsInst);
307     }
308
309     private Optional<Tenant> getTenant(final String vnfPkgId,
310             final List<NsInstancesnsInstanceIdinstantiateAdditionalParamsForVnf> additionalParamsForVnfList) {
311
312         final Optional<NsInstancesnsInstanceIdinstantiateAdditionalParamsForVnf> optional = additionalParamsForVnfList
313                 .stream().filter(entry -> vnfPkgId.equals(entry.getVnfProfileId())).findFirst();
314
315         if (optional.isPresent()) {
316             final NsInstancesnsInstanceIdinstantiateAdditionalParamsForVnf additionalParamsForVnf = optional.get();
317             @SuppressWarnings("unchecked")
318             final Map<String, Object> additionalParams =
319                     (Map<String, Object>) additionalParamsForVnf.getAdditionalParams();
320             final String vimId = (String) additionalParams.get("vim_id");
321             if (vimId != null) {
322                 final String[] splitString = vimId.split("_");
323                 if (splitString.length == 3) {
324                     logger.info("Found Tenant in instantiateNsRequest using vnfPkgId: {}", vnfPkgId);
325                     return Optional.of(new Tenant().cloudOwner(splitString[0]).regionName(splitString[1])
326                             .tenantId(splitString[2]));
327                 }
328
329             }
330         }
331
332         logger.error("Unable to find Tenant in instantiateNsRequest using vnfPkgId: {}", vnfPkgId);
333         return Optional.empty();
334     }
335
336     @SuppressWarnings("unchecked")
337     private Map<String, String> getAdditionalParams(final String vnfPkgId,
338             final List<NsInstancesnsInstanceIdinstantiateAdditionalParamsForVnf> additionalParamsForVnfList) {
339
340         final Optional<NsInstancesnsInstanceIdinstantiateAdditionalParamsForVnf> optional = additionalParamsForVnfList
341                 .stream().filter(entry -> vnfPkgId.equals(entry.getVnfProfileId())).findFirst();
342
343         if (optional.isPresent()) {
344             final NsInstancesnsInstanceIdinstantiateAdditionalParamsForVnf additionalParamsForVnf = optional.get();
345             if (additionalParamsForVnf instanceof Map) {
346                 logger.info("Found AdditionalParams in instantiateNsRequest using vnfPkgId: {}", vnfPkgId);
347                 return (Map<String, String>) additionalParamsForVnf.getAdditionalParams();
348             }
349         }
350
351         return Collections.emptyMap();
352
353     }
354
355 }