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 Andrew Lamb (andrew.a.lamb@est.tech)
62 public class InstantiateNsTask extends AbstractNetworkServiceTask {
64 private static final String IS_NS_INSTANTIATION_SUCCESSFUL_PARAM_NAME = "isNsInstantiationSuccessful";
65 private static final String VNFD_ID_TO_VNF_PKG_ID_MAPPING_PARAM_NAME = "vnfdIdToVnfPkgIdMapping";
66 private static final Logger logger = LoggerFactory.getLogger(InstantiateNsTask.class);
67 private final EtsiCatalogPackageManagementServiceProvider etsiCatalogPackageManagementServiceProvider;
70 public InstantiateNsTask(final DatabaseServiceProvider databaseServiceProvider,
71 final EtsiCatalogPackageManagementServiceProvider etsiCatalogPackageManagementServiceProvider) {
72 super(databaseServiceProvider);
73 this.etsiCatalogPackageManagementServiceProvider = etsiCatalogPackageManagementServiceProvider;
77 public void setJobStatusToStarted(final DelegateExecution execution) {
78 setJobStatus(execution, STARTED, "Instantiate NS workflow process started");
81 public void setJobStatusToFinished(final DelegateExecution execution) {
82 setJobStatus(execution, FINISHED, "Instantiate NS workflow process finished");
85 public void updateNsInstanceStatusToInstantiating(final DelegateExecution execution) {
86 logger.info("Executing updateNsInstanceStatusToInstantiating");
87 setJobStatus(execution, IN_PROGRESS, "Updating NfvoNsInst Status to " + State.INSTANTIATING);
88 updateNsInstanceStatus(execution, State.INSTANTIATING);
90 logger.info("Finished executing updateNsInstanceStatusToInstantiating ...");
94 public void checkIfVnfInstantiationWasSuccessful(final DelegateExecution execution) {
95 logger.info("Executing checkIfVnfInstantiationWasSuccessful");
97 @SuppressWarnings("unchecked")
98 final List<CreateInstantiateRequest> requests =
99 (List<CreateInstantiateRequest>) execution.getVariable(VNF_CREATE_INSTANTIATE_REQUESTS);
101 final String nsInstId = (String) execution.getVariable(NS_INSTANCE_ID_PARAM_NAME);
102 final List<NfvoNfInst> nfInstances = databaseServiceProvider.getNfvoNfInstByNsInstId(nsInstId);
104 if (nfInstances == null || nfInstances.isEmpty()) {
105 final String message = "Found empty nf instances";
106 abortOperation(execution, message);
109 if (requests.size() != nfInstances.size()) {
110 final String message = "Missing nf Instance. Request triggered: " + requests.size()
111 + " Nf Instace reqeust found in database " + nfInstances.size();
112 abortOperation(execution, message);
115 execution.setVariable(IS_NS_INSTANTIATION_SUCCESSFUL_PARAM_NAME, true);
117 nfInstances.stream().forEach(instance -> {
118 if (!State.INSTANTIATED.equals(instance.getStatus())) {
119 logger.error("VNF : {} {} instantiation failed", instance.getNfInstId(), instance.getName());
120 execution.setVariable(IS_NS_INSTANTIATION_SUCCESSFUL_PARAM_NAME, false);
124 logger.info("Finished executing checkIfVnfInstantiationWasSuccessful ...");
127 public void updateNsInstanceStatusToInstantiated(final DelegateExecution execution) {
128 logger.info("Executing updateNsInstanceStatusToInstantiated");
129 final String nsInstId = (String) execution.getVariable(NS_INSTANCE_ID_PARAM_NAME);
130 setJobStatus(execution, FINISHED, "Successfully " + State.INSTANTIATED + " NS: " + nsInstId);
132 updateNsInstanceStatus(execution, State.INSTANTIATED);
133 logger.info("Finished executing updateNsInstanceStatusToInstantiated ...");
136 public void getAndParseNsdFromEtsiCatalog(final DelegateExecution execution) {
137 logger.info("Executing getAndParseNsdFromEtsiCatalog");
138 setJobStatus(execution, IN_PROGRESS, "Retrieving and parsing NSD from ETSI Catalog Manager");
139 final NfvoNsInst nfvoNsInst = getNfvoNsInst(execution);
140 final String nsPackageId = nfvoNsInst.getNsPackageId();
143 final Optional<NetworkServiceDescriptor> optional =
144 etsiCatalogPackageManagementServiceProvider.getNetworkServiceDescriptor(nsPackageId);
146 if (!optional.isPresent()) {
147 final String message = "Unable to parse NSD " + nsPackageId;
148 logger.error(message);
149 abortOperation(execution, message);
152 final NetworkServiceDescriptor networkServiceDescriptor = optional.get();
153 logger.info("Found {}", networkServiceDescriptor);
154 execution.setVariable(NETWORK_SERVICE_DESCRIPTOR_PARAM_NAME, networkServiceDescriptor);
156 } catch (final EtsiCatalogManagerRequestFailureException failureException) {
157 final String message =
158 "Unexpected exception occured while getting nsd content using nsPackageId: " + nsPackageId;
159 logger.error(message, failureException);
161 abortOperation(execution, message);
164 logger.info("Finished executing getAndParseNsdFromEtsiCatalog ...");
168 public void prepareCreateInstantiateRequests(final DelegateExecution execution) {
169 logger.info("Executing prepareCreateInstantiateRequests ...");
170 setJobStatus(execution, IN_PROGRESS, "Preparing VNF CreateInstantiate requests");
171 final NetworkServiceDescriptor networkServiceDescriptor =
172 (NetworkServiceDescriptor) execution.getVariable(NETWORK_SERVICE_DESCRIPTOR_PARAM_NAME);
173 final String nsInstId = (String) execution.getVariable(NS_INSTANCE_ID_PARAM_NAME);
175 final InstantiateNsRequest instantiateNsRequest =
176 (InstantiateNsRequest) execution.getVariable(INSTANTIATE_NS_REQUEST_PARAM_NAME);
178 final List<NsInstancesnsInstanceIdinstantiateAdditionalParamsForVnf> additionalParamsForVnfList =
179 instantiateNsRequest.getAdditionalParamsForVnf();
181 @SuppressWarnings("unchecked")
182 final Map<String, String> vnfdIdToVnfPkgIdMapping =
183 (Map<String, String>) execution.getVariable(VNFD_ID_TO_VNF_PKG_ID_MAPPING_PARAM_NAME);
185 final List<CreateInstantiateRequest> requests = new ArrayList<>();
187 for (final VirtualNetworkFunction vnf : networkServiceDescriptor.getVnfs()) {
188 final List<String> vnfmInfoList = vnf.getVnfmInfoList();
190 final String vnfdId = vnf.getVnfdId();
191 final String vnfPkgId = vnfdIdToVnfPkgIdMapping.get(vnfdId);
192 if (vnfdId == null || vnfmInfoList.isEmpty() || vnfPkgId == null) {
193 final String message = "Unable to find VnfdId/vnfmInfo/VnfPkgId for vnf: " + vnf;
194 abortOperation(execution, message);
197 final Optional<Tenant> optional = getTenant(vnfPkgId, additionalParamsForVnfList);
198 if (!optional.isPresent()) {
199 final String message = "Unable to find Tenant information for " + vnfdId + " in instantiateNsRequest : "
200 + instantiateNsRequest;
201 abortOperation(execution, message);
204 final Tenant tenant = optional.get();
205 final CreateInstantiateRequest createInstantiateRequest = new CreateInstantiateRequest().nsInstId(nsInstId)
206 .vnfdId(vnfdId).vnfName(vnf.getVnfName()).vnfPkgId(vnfPkgId).nfType(vnfmInfoList.get(0))
207 .tenant(tenant).additionalParams(getAdditionalParams(vnfPkgId, additionalParamsForVnfList));
209 logger.info("Adding request to list: {}", createInstantiateRequest);
210 requests.add(createInstantiateRequest);
213 execution.setVariable(VNF_CREATE_INSTANTIATE_REQUESTS, requests);
215 logger.info("Finished executing prepareCreateInstantiateRequests ...");
218 public void getVnfPkgIdForEachVnfdId(final DelegateExecution execution) {
219 logger.info("Executing getVnfPkgIdForEachVnfdId ...");
221 setJobStatus(execution, IN_PROGRESS, "Getting VnfPkgId for each VnfdId");
223 final String nsInstId = (String) execution.getVariable(NS_INSTANCE_ID_PARAM_NAME);
224 final NfvoNsInst nfvoNsInst = getNfvoNsInst(execution, nsInstId);
226 final String nsPackageId = nfvoNsInst.getNsPackageId();
227 final NsdInfo nsdInfo = getNsdInfo(execution, nsPackageId);
229 final Map<String, String> vnfdIdToVnfPkgIdMapping = new HashMap<>();
231 for (final String vnfPkgId : nsdInfo.getVnfPkgIds()) {
232 final Optional<VnfPkgInfo> optional =
233 etsiCatalogPackageManagementServiceProvider.getVnfPkgInfo(vnfPkgId);
235 if (!optional.isPresent()) {
236 final String message = "Unable to find VNF package using NS vnfPkgId: " + vnfPkgId;
237 logger.error(message);
238 abortOperation(execution, message);
240 final VnfPkgInfo vnfPkgInfo = optional.get();
241 vnfdIdToVnfPkgIdMapping.put(vnfPkgInfo.getVnfdId(), vnfPkgId);
244 logger.info("vnfdIdToVnfPkgIdMapping: {}", vnfdIdToVnfPkgIdMapping);
245 execution.setVariable(VNFD_ID_TO_VNF_PKG_ID_MAPPING_PARAM_NAME, vnfdIdToVnfPkgIdMapping);
247 } catch (final EtsiCatalogManagerRequestFailureException failureException) {
248 final String message =
249 "Unexpected exception occured while getting VNF package using nsPackageId: " + nsPackageId;
250 logger.error(message, failureException);
252 abortOperation(execution, message);
255 logger.info("Finished executing getVnfPkgIdForEachVnfdId ...");
259 public void logTimeOut(final DelegateExecution execution) {
260 logger.error("Vnf instantiation timedOut ...");
261 final String nsInstId = (String) execution.getVariable(NS_INSTANCE_ID_PARAM_NAME);
262 final List<NfvoNfInst> nfInstances = databaseServiceProvider.getNfvoNfInstByNsInstId(nsInstId);
263 if (nfInstances != null) {
264 nfInstances.stream().forEach(instance -> {
265 logger.info("Current status {} of vnf: {}", instance.getStatus(), instance.getName());
270 public void setJobStatusToError(final DelegateExecution execution) {
271 updateNsInstanceStatus(execution, State.FAILED);
272 setJobStatusToError(execution, "Instantiate NS workflow process failed");
276 public void updateNsLcmOpOccStatusToCompleted(final DelegateExecution execution) {
277 logger.info("Executing updateNsLcmOpOccStatusToCompleted ...");
278 final String occId = (String) execution.getVariable(OCC_ID_PARAM_NAME);
280 final Optional<NsLcmOpOcc> optional = databaseServiceProvider.getNsLcmOpOcc(occId);
282 if (!optional.isPresent()) {
283 final String message = "Unable to find record for NSLcmOpOcc in database using id: " + occId;
284 logger.error(message);
285 abortOperation(execution, message);
288 final NsLcmOpOcc nsLcmOpOcc = optional.get();
289 final OperationStateEnum operationStateCompleted = OperationStateEnum.COMPLETED;
290 logger.info("Setting operation state to {} for id: {}", operationStateCompleted, occId);
291 nsLcmOpOcc.setOperationState(operationStateCompleted);
292 databaseServiceProvider.addNSLcmOpOcc(nsLcmOpOcc);
294 logger.info("Finished executing updateNsLcmOpOccStatusToCompleted ...");
298 public void updateNsLcmOpOccStatusToFailed(final DelegateExecution execution) {
299 logger.info("Executing updateNsLcmOpOccStatusToFailed ...");
300 final String occId = (String) execution.getVariable(OCC_ID_PARAM_NAME);
302 final Optional<NsLcmOpOcc> optional = databaseServiceProvider.getNsLcmOpOcc(occId);
304 if (optional.isPresent()) {
305 final NsLcmOpOcc nsLcmOpOcc = optional.get();
306 final OperationStateEnum operationStateFailed = OperationStateEnum.FAILED;
307 logger.info("Setting operation state to {} for id: {}", operationStateFailed, occId);
308 nsLcmOpOcc.setOperationState(operationStateFailed);
310 databaseServiceProvider.addNSLcmOpOcc(nsLcmOpOcc);
312 logger.error("Unable to find record for NSLcmOpOcc in database using id: {}", occId);
315 logger.info("Finished executing updateNsLcmOpOccStatusToFailed ...");
319 private NsdInfo getNsdInfo(final DelegateExecution execution, final String nsPackageId) {
321 final Optional<NsdInfo> optional =
322 etsiCatalogPackageManagementServiceProvider.getNSPackageModel(nsPackageId);
324 if (optional.isPresent()) {
325 final NsdInfo packageModel = optional.get();
326 logger.info("NS Package exists {}", packageModel);
330 } catch (final EtsiCatalogManagerRequestFailureException failureException) {
331 final String message =
332 "Unexpected exception occured while getting ns package using nsPackageId: " + nsPackageId;
333 logger.error(message, failureException);
335 abortOperation(execution, message);
338 final String message = "Unable to find NS package using NS package id: " + nsPackageId;
339 logger.error(message);
340 abortOperation(execution, message);
345 private void updateNsInstanceStatus(final DelegateExecution execution, final State nsStatus) {
346 final NfvoNsInst nfvoNsInst = getNfvoNsInst(execution);
347 logger.info("Updating NfvoNsInst Status to {} and saving to DB", nsStatus);
348 nfvoNsInst.setStatus(nsStatus);
349 databaseServiceProvider.saveNfvoNsInst(nfvoNsInst);
352 private Optional<Tenant> getTenant(final String vnfPkgId,
353 final List<NsInstancesnsInstanceIdinstantiateAdditionalParamsForVnf> additionalParamsForVnfList) {
355 final Optional<NsInstancesnsInstanceIdinstantiateAdditionalParamsForVnf> optional = additionalParamsForVnfList
356 .stream().filter(entry -> vnfPkgId.equals(entry.getVnfProfileId())).findFirst();
358 if (optional.isPresent()) {
359 final NsInstancesnsInstanceIdinstantiateAdditionalParamsForVnf additionalParamsForVnf = optional.get();
360 @SuppressWarnings("unchecked")
361 final Map<String, Object> additionalParams =
362 (Map<String, Object>) additionalParamsForVnf.getAdditionalParams();
363 final String vimId = (String) additionalParams.get("vim_id");
365 final String[] splitString = vimId.split("_");
366 if (splitString.length == 3) {
367 logger.info("Found Tenant in instantiateNsRequest using vnfPkgId: {}", vnfPkgId);
368 return Optional.of(new Tenant().cloudOwner(splitString[0]).regionName(splitString[1])
369 .tenantId(splitString[2]));
375 logger.error("Unable to find Tenant in instantiateNsRequest using vnfPkgId: {}", vnfPkgId);
376 return Optional.empty();
379 @SuppressWarnings("unchecked")
380 private Map<String, String> getAdditionalParams(final String vnfPkgId,
381 final List<NsInstancesnsInstanceIdinstantiateAdditionalParamsForVnf> additionalParamsForVnfList) {
383 final Optional<NsInstancesnsInstanceIdinstantiateAdditionalParamsForVnf> optional = additionalParamsForVnfList
384 .stream().filter(entry -> vnfPkgId.equals(entry.getVnfProfileId())).findFirst();
386 if (optional.isPresent()) {
387 final NsInstancesnsInstanceIdinstantiateAdditionalParamsForVnf additionalParamsForVnf = optional.get();
388 if (additionalParamsForVnf instanceof Map) {
389 logger.info("Found AdditionalParams in instantiateNsRequest using vnfPkgId: {}", vnfPkgId);
390 return (Map<String, String>) additionalParamsForVnf.getAdditionalParams();
394 return Collections.emptyMap();
398 private NfvoNsInst getNfvoNsInst(final DelegateExecution execution) {
399 final String nsInstId = (String) execution.getVariable(NS_INSTANCE_ID_PARAM_NAME);
400 return getNfvoNsInst(execution, nsInstId);
403 private NfvoNsInst getNfvoNsInst(final DelegateExecution execution, final String nsInstId) {
404 logger.info("Getting NfvoNsInst to update with nsInstId: {}", nsInstId);
405 final Optional<NfvoNsInst> optionalNfvoNsInst = databaseServiceProvider.getNfvoNsInst(nsInstId);
407 if (!optionalNfvoNsInst.isPresent()) {
408 final String message = "Unable to find NS Instance in database using id: " + nsInstId;
409 abortOperation(execution, message);
412 return optionalNfvoNsInst.get();