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.NS_INSTANCE_ID_PARAM_NAME;
23 import static org.onap.so.etsi.nfvo.ns.lcm.database.beans.JobStatusEnum.ERROR;
24 import static org.onap.so.etsi.nfvo.ns.lcm.database.beans.JobStatusEnum.FINISHED;
25 import static org.onap.so.etsi.nfvo.ns.lcm.database.beans.JobStatusEnum.IN_PROGRESS;
26 import java.time.LocalDateTime;
27 import java.util.Optional;
28 import org.camunda.bpm.engine.delegate.DelegateExecution;
29 import org.onap.aai.domain.yang.GenericVnf;
30 import org.onap.so.adapters.etsisol003adapter.lcm.v1.model.CreateVnfRequest;
31 import org.onap.so.adapters.etsisol003adapter.lcm.v1.model.CreateVnfResponse;
32 import org.onap.so.adapters.etsisol003adapter.lcm.v1.model.Tenant;
33 import org.onap.so.etsi.nfvo.ns.lcm.bpmn.flows.extclients.aai.AaiServiceProvider;
34 import org.onap.so.etsi.nfvo.ns.lcm.bpmn.flows.extclients.vnfm.Sol003AdapterServiceProvider;
35 import org.onap.so.etsi.nfvo.ns.lcm.database.beans.JobStatusEnum;
36 import org.onap.so.etsi.nfvo.ns.lcm.database.beans.NfvoNfInst;
37 import org.onap.so.etsi.nfvo.ns.lcm.database.beans.NfvoNsInst;
38 import org.onap.so.etsi.nfvo.ns.lcm.database.beans.State;
39 import org.onap.so.etsi.nfvo.ns.lcm.database.service.DatabaseServiceProvider;
40 import org.slf4j.Logger;
41 import org.slf4j.LoggerFactory;
42 import org.springframework.beans.factory.annotation.Autowired;
43 import org.springframework.stereotype.Component;
46 * @author Waqas Ikram (waqas.ikram@est.tech)
49 public class CreateInstantiateVnfTask extends AbstractNetworkServiceTask {
50 private static final Logger logger = LoggerFactory.getLogger(CreateInstantiateVnfTask.class);
51 private static final String NF_INST_ID_PARAM_NAME = "NF_INST_ID";
52 public static final String CREATE_VNF_RESPONSE_PARAM_NAME = "createVnfResponse";
53 private final AaiServiceProvider aaiServiceProvider;
54 private final Sol003AdapterServiceProvider sol003AdapterServiceProvider;
57 public CreateInstantiateVnfTask(final DatabaseServiceProvider databaseServiceProvider,
58 final AaiServiceProvider aaiServiceProvider,
59 final Sol003AdapterServiceProvider sol003AdapterServiceProvider) {
60 super(databaseServiceProvider);
61 this.aaiServiceProvider = aaiServiceProvider;
62 this.sol003AdapterServiceProvider = sol003AdapterServiceProvider;
65 public void checkIfNfInstanceExistsInDb(final DelegateExecution execution) {
66 logger.info("Executing checkIfNfInstanceInDb");
67 final CreateInstantiateRequest request = (CreateInstantiateRequest) execution.getVariable("request");
68 logger.info("request: {}", request);
70 setJobStatus(execution, JobStatusEnum.IN_PROGRESS, "Checking if NF Instance record exists in database for "
71 + request.getNsInstId() + " and " + request.getVnfName());
72 if (!databaseServiceProvider.isNsInstExists(request.getNsInstId(), request.getVnfName())) {
73 abortOperation(execution,
74 request.getNsInstId() + " " + request.getVnfName() + " VNF instance already exists");
76 logger.info("Finished executing checkIfNfInstanceInDb ...");
80 public void createNfInstanceInDb(final DelegateExecution execution) {
81 logger.info("Executing createNfInstanceInDb");
82 final CreateInstantiateRequest request = (CreateInstantiateRequest) execution.getVariable("request");
83 logger.info("request: {}", request);
85 setJobStatus(execution, IN_PROGRESS, "Creating NF Instance record in database for " + request.getVnfName());
87 final Optional<NfvoNsInst> optional = databaseServiceProvider.getNfvoNsInst(request.getNsInstId());
89 if (optional.isEmpty()) {
90 abortOperation(execution, "NfvoNsInst: " + request.getNsInstId() + "not founda");
93 final NfvoNsInst nfvoNsInst = optional.get();
94 final LocalDateTime now = LocalDateTime.now();
95 final NfvoNfInst nfvoNfInst = new NfvoNfInst().status(State.NOT_INSTANTIATED).createTime(now)
96 .lastUpdateTime(now).name(request.getVnfName()).vnfdId(request.getVnfdId())
97 .packageId(request.getVnfPkgId()).nfvoNsInst(nfvoNsInst);
98 databaseServiceProvider.saveNfvoNfInst(nfvoNfInst);
99 execution.setVariable(NF_INST_ID_PARAM_NAME, nfvoNfInst.getNfInstId());
100 logger.info("Finished executing createNfInstanceInDb ...");
104 public void createGenericVnfInAai(final DelegateExecution execution) {
105 logger.info("Executing createGenericVnfInAai");
107 final CreateInstantiateRequest request = (CreateInstantiateRequest) execution.getVariable("request");
109 setJobStatus(execution, IN_PROGRESS, "Creating GenericVnf record in AAI for " + request.getVnfName());
111 final String nfInstId = (String) execution.getVariable(NF_INST_ID_PARAM_NAME);
112 final String nsInstId = (String) execution.getVariable(NS_INSTANCE_ID_PARAM_NAME);
113 final NfvoNsInst nfvoNsInst = getNfvoNsInst(execution, nsInstId);
115 final GenericVnf genericVnf = new GenericVnf();
116 genericVnf.setVnfId(nfInstId);
117 genericVnf.setVnfName(request.getVnfName());
118 genericVnf.setVnfType(nfvoNsInst.getName() + "/" + request.getVnfName());
119 genericVnf.setServiceId(request.getNsInstId());
120 genericVnf.setNfType(request.getNfType());
121 genericVnf.setOperationalStatus("Created");
122 genericVnf.setIsClosedLoopDisabled(false);
124 aaiServiceProvider.createGenericVnfAndConnectServiceInstance(nsInstId, nfInstId, genericVnf);
126 final Tenant tenant = request.getTenant();
127 aaiServiceProvider.connectGenericVnfToTenant(nfInstId, tenant.getCloudOwner(), tenant.getRegionName(),
128 tenant.getTenantId());
130 } catch (final Exception exception) {
131 final String message = "Unable to Create GenericVnf in AAI";
132 logger.error(message, exception);
133 abortOperation(execution, message);
136 logger.info("Finished executing createGenericVnfInAai ...");
139 public void invokeCreateInstantiationRequest(final DelegateExecution execution) {
140 logger.info("Executing invokeCreateInstantiationRequest");
143 final CreateInstantiateRequest request = (CreateInstantiateRequest) execution.getVariable("request");
144 logger.info("request: {}", request);
146 setJobStatus(execution, IN_PROGRESS,
147 "Invoking SOL003 adapter for creating and instantiating VNF: " + request.getVnfName());
149 final String nsInstId = (String) execution.getVariable(NS_INSTANCE_ID_PARAM_NAME);
150 final NfvoNsInst nfvoNsInst = getNfvoNsInst(execution, nsInstId);
151 final CreateVnfRequest vnfRequest = new CreateVnfRequest();
152 vnfRequest.setTenant(request.getTenant());
153 vnfRequest.setName(nfvoNsInst.getName() + "." + request.getVnfName());
154 vnfRequest.setPkgId(request.getVnfPkgId());
155 vnfRequest.setAdditionalParams(request.getAdditionalParams());
156 final String vnfId = (String) execution.getVariable(NF_INST_ID_PARAM_NAME);
157 final Optional<CreateVnfResponse> optional =
158 sol003AdapterServiceProvider.invokeCreateInstantiationRequest(vnfId, vnfRequest);
160 if (!optional.isPresent()) {
161 final String errorMessage = "Unexpected error while processing create and instantiation request";
162 logger.error(errorMessage);
163 abortOperation(execution, errorMessage);
166 final CreateVnfResponse vnfResponse = optional.get();
168 logger.info("Vnf instantiation response: {}", vnfResponse);
169 execution.setVariable(CREATE_VNF_RESPONSE_PARAM_NAME, vnfResponse);
170 setJobStatus(execution, IN_PROGRESS, "Successfully invoked SOL003 adapater creating and instantiating VNF: "
171 + request.getVnfName() + " CreaetVnfResponse Job Id: " + vnfResponse.getJobId());
172 logger.debug("Finished executing invokeCreateInstantiationRequest ...");
173 } catch (final Exception exception) {
174 final String message = "Unable to invoke create and instantiation request";
175 logger.error(message, exception);
176 abortOperation(execution, message);
181 public void updateNfInstanceStatusToInstantiated(final DelegateExecution execution) {
182 logger.info("Executing updateNfInstanceStatusToInstantiated");
184 updateNfInstanceStatus(execution, State.INSTANTIATED);
185 final CreateInstantiateRequest request = (CreateInstantiateRequest) execution.getVariable("request");
186 setJobStatus(execution, FINISHED, "Successfully created and Instantiated VNF: " + request.getVnfName()
187 + " will set status to " + State.INSTANTIATED);
189 logger.info("Finished executing updateNfInstanceStatusToInstantiated ...");
193 public void updateNfInstanceStatusToFailed(final DelegateExecution execution) {
194 logger.info("Executing updateNfInstanceStatusToActive");
196 updateNfInstanceStatus(execution, State.FAILED);
197 final CreateInstantiateRequest request = (CreateInstantiateRequest) execution.getVariable("request");
198 setJobStatus(execution, ERROR, "Failed to create and instantiate VNF: " + request.getVnfName()
199 + " will set status to " + State.FAILED);
201 logger.info("Finished executing updateNfInstanceStatusToInstantiated ...");
205 private void updateNfInstanceStatus(final DelegateExecution execution, final State vnfStatus) {
206 final String nfInstId = (String) execution.getVariable(NF_INST_ID_PARAM_NAME);
208 final Optional<NfvoNfInst> optional = databaseServiceProvider.getNfvoNfInst(nfInstId);
209 if (!optional.isPresent()) {
210 final String message = "Unable to find NfvoNfInst record in database using nfInstId: " + nfInstId;
211 logger.error(message);
213 abortOperation(execution, message);
217 final NfvoNfInst nfvoNfInst = optional.get();
218 nfvoNfInst.setStatus(vnfStatus);
219 databaseServiceProvider.saveNfvoNfInst(nfvoNfInst);
222 private NfvoNsInst getNfvoNsInst(final DelegateExecution execution, final String nsInstId) {
223 logger.info("Getting NfvoNsInst to update with nsInstId: {}", nsInstId);
224 final Optional<NfvoNsInst> optionalNfvoNsInst = databaseServiceProvider.getNfvoNsInst(nsInstId);
226 if (!optionalNfvoNsInst.isPresent()) {
227 final String message = "Unable to find NS Instance in datababse using id: " + nsInstId;
228 abortOperation(execution, message);
231 return optionalNfvoNsInst.get();