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
9 * http://www.apache.org/licenses/LICENSE-2.0
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.
17 * SPDX-License-Identifier: Apache-2.0
18 * ============LICENSE_END=========================================================
20 package org.onap.so.etsi.nfvo.ns.lcm.bpmn.flows.tasks;
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;
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;
58 * @author Waqas Ikram (waqas.ikram@est.tech)
59 * @author Andrew Lamb (andrew.a.lamb@est.tech)
63 public class InstantiateNsTask extends AbstractNetworkServiceTask {
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;
71 public InstantiateNsTask(final DatabaseServiceProvider databaseServiceProvider,
72 final EtsiCatalogPackageManagementServiceProvider etsiCatalogPackageManagementServiceProvider) {
73 super(databaseServiceProvider);
74 this.etsiCatalogPackageManagementServiceProvider = etsiCatalogPackageManagementServiceProvider;
78 public void setJobStatusToStarted(final DelegateExecution execution) {
79 setJobStatus(execution, STARTED, "Instantiate NS workflow process started");
82 public void setJobStatusToFinished(final DelegateExecution execution) {
83 setJobStatus(execution, FINISHED, "Instantiate NS workflow process finished");
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);
91 logger.info("Finished executing updateNsInstanceStatusToInstantiating ...");
95 public void checkIfVnfInstantiationWasSuccessful(final DelegateExecution execution) {
96 logger.info("Executing checkIfVnfInstantiationWasSuccessful");
98 @SuppressWarnings("unchecked")
99 final List<CreateInstantiateRequest> requests =
100 (List<CreateInstantiateRequest>) execution.getVariable(VNF_CREATE_INSTANTIATE_REQUESTS);
102 final String nsInstId = (String) execution.getVariable(NS_INSTANCE_ID_PARAM_NAME);
103 final List<NfvoNfInst> nfInstances = databaseServiceProvider.getNfvoNfInstByNsInstId(nsInstId);
105 if (nfInstances == null || nfInstances.isEmpty()) {
106 final String message = "Found empty nf instances";
107 abortOperation(execution, message);
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);
116 execution.setVariable(IS_NS_INSTANTIATION_SUCCESSFUL_PARAM_NAME, true);
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);
125 logger.info("Finished executing checkIfVnfInstantiationWasSuccessful ...");
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);
133 updateNsInstanceStatus(execution, State.INSTANTIATED);
134 logger.info("Finished executing updateNsInstanceStatusToInstantiated ...");
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();
144 final Optional<NetworkServiceDescriptor> optional =
145 etsiCatalogPackageManagementServiceProvider.getNetworkServiceDescriptor(nsPackageId);
147 if (!optional.isPresent()) {
148 final String message = "Unable to parse NSD " + nsPackageId;
149 logger.error(message);
150 abortOperation(execution, message);
153 final NetworkServiceDescriptor networkServiceDescriptor = optional.get();
154 logger.info("Found {}", networkServiceDescriptor);
155 execution.setVariable(NETWORK_SERVICE_DESCRIPTOR_PARAM_NAME, networkServiceDescriptor);
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);
162 abortOperation(execution, message);
165 logger.info("Finished executing getAndParseNsdFromEtsiCatalog ...");
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);
176 final InstantiateNsRequest instantiateNsRequest =
177 (InstantiateNsRequest) execution.getVariable(INSTANTIATE_NS_REQUEST_PARAM_NAME);
179 final List<NsInstancesnsInstanceIdinstantiateAdditionalParamsForVnf> additionalParamsForVnfList =
180 instantiateNsRequest.getAdditionalParamsForVnf();
182 @SuppressWarnings("unchecked")
183 final Map<String, String> vnfdIdToVnfPkgIdMapping =
184 (Map<String, String>) execution.getVariable(VNFD_ID_TO_VNF_PKG_ID_MAPPING_PARAM_NAME);
186 final List<CreateInstantiateRequest> requests = new ArrayList<>();
188 for (final VirtualNetworkFunction vnf : networkServiceDescriptor.getVnfs()) {
189 final List<String> vnfmInfoList = vnf.getVnfmInfoList();
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);
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);
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));
210 logger.info("Adding request to list: {}", createInstantiateRequest);
211 requests.add(createInstantiateRequest);
214 execution.setVariable(VNF_CREATE_INSTANTIATE_REQUESTS, requests);
216 logger.info("Finished executing prepareCreateInstantiateRequests ...");
219 public void getVnfPkgIdForEachVnfdId(final DelegateExecution execution) {
220 logger.info("Executing getVnfPkgIdForEachVnfdId ...");
222 setJobStatus(execution, IN_PROGRESS, "Getting VnfPkgId for each VnfdId");
224 final String nsInstId = (String) execution.getVariable(NS_INSTANCE_ID_PARAM_NAME);
225 final NfvoNsInst nfvoNsInst = getNfvoNsInst(execution, nsInstId);
227 final String nsPackageId = nfvoNsInst.getNsPackageId();
228 final NsdInfo nsdInfo = getNsdInfo(execution, nsPackageId);
230 final Map<String, String> vnfdIdToVnfPkgIdMapping = new HashMap<>();
232 for (final String vnfPkgId : nsdInfo.getVnfPkgIds()) {
233 final Optional<VnfPkgInfo> optional =
234 etsiCatalogPackageManagementServiceProvider.getVnfPkgInfo(vnfPkgId);
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);
241 final VnfPkgInfo vnfPkgInfo = optional.get();
242 vnfdIdToVnfPkgIdMapping.put(vnfPkgInfo.getVnfdId(), vnfPkgId);
245 logger.info("vnfdIdToVnfPkgIdMapping: {}", vnfdIdToVnfPkgIdMapping);
246 execution.setVariable(VNFD_ID_TO_VNF_PKG_ID_MAPPING_PARAM_NAME, vnfdIdToVnfPkgIdMapping);
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);
253 abortOperation(execution, message);
256 logger.info("Finished executing getVnfPkgIdForEachVnfdId ...");
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());
271 public void setJobStatusToError(final DelegateExecution execution) {
272 updateNsInstanceStatus(execution, State.FAILED);
273 setJobStatusToError(execution, "Instantiate NS workflow process failed");
276 private NsdInfo getNsdInfo(final DelegateExecution execution, final String nsPackageId) {
278 final Optional<NsdInfo> optional =
279 etsiCatalogPackageManagementServiceProvider.getNSPackageModel(nsPackageId);
281 if (optional.isPresent()) {
282 final NsdInfo packageModel = optional.get();
283 logger.info("NS Package exists {}", packageModel);
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);
292 abortOperation(execution, message);
295 final String message = "Unable to find NS package using NS package id: " + nsPackageId;
296 logger.error(message);
297 abortOperation(execution, message);
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);
309 private Optional<Tenant> getTenant(final String vnfPkgId,
310 final List<NsInstancesnsInstanceIdinstantiateAdditionalParamsForVnf> additionalParamsForVnfList) {
312 final Optional<NsInstancesnsInstanceIdinstantiateAdditionalParamsForVnf> optional = additionalParamsForVnfList
313 .stream().filter(entry -> vnfPkgId.equals(entry.getVnfProfileId())).findFirst();
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");
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]));
332 logger.error("Unable to find Tenant in instantiateNsRequest using vnfPkgId: {}", vnfPkgId);
333 return Optional.empty();
336 @SuppressWarnings("unchecked")
337 private Map<String, String> getAdditionalParams(final String vnfPkgId,
338 final List<NsInstancesnsInstanceIdinstantiateAdditionalParamsForVnf> additionalParamsForVnfList) {
340 final Optional<NsInstancesnsInstanceIdinstantiateAdditionalParamsForVnf> optional = additionalParamsForVnfList
341 .stream().filter(entry -> vnfPkgId.equals(entry.getVnfProfileId())).findFirst();
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();
351 return Collections.emptyMap();