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();