bfeaf49daa566fceaf48a099fcf48146f41ed6e6
[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 / CreateInstantiateVnfTask.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.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;
44
45 /**
46  * @author Waqas Ikram (waqas.ikram@est.tech)
47  */
48 @Component
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;
55
56     @Autowired
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;
63     }
64
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);
69
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");
75         }
76         logger.info("Finished executing checkIfNfInstanceInDb  ...");
77
78     }
79
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);
84
85         setJobStatus(execution, IN_PROGRESS, "Creating NF Instance record in database for " + request.getVnfName());
86
87         final Optional<NfvoNsInst> optional = databaseServiceProvider.getNfvoNsInst(request.getNsInstId());
88
89         if (optional.isEmpty()) {
90             abortOperation(execution, "NfvoNsInst: " + request.getNsInstId() + "not founda");
91         }
92
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  ...");
101
102     }
103
104     public void createGenericVnfInAai(final DelegateExecution execution) {
105         logger.info("Executing createGenericVnfInAai");
106         try {
107             final CreateInstantiateRequest request = (CreateInstantiateRequest) execution.getVariable("request");
108
109             setJobStatus(execution, IN_PROGRESS, "Creating GenericVnf record in AAI for " + request.getVnfName());
110
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);
114
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);
123
124             aaiServiceProvider.createGenericVnfAndConnectServiceInstance(nsInstId, nfInstId, genericVnf);
125
126             final Tenant tenant = request.getTenant();
127             aaiServiceProvider.connectGenericVnfToTenant(nfInstId, tenant.getCloudOwner(), tenant.getRegionName(),
128                     tenant.getTenantId());
129
130         } catch (final Exception exception) {
131             final String message = "Unable to Create GenericVnf in AAI";
132             logger.error(message, exception);
133             abortOperation(execution, message);
134         }
135
136         logger.info("Finished executing createGenericVnfInAai  ...");
137     }
138
139     public void invokeCreateInstantiationRequest(final DelegateExecution execution) {
140         logger.info("Executing invokeCreateInstantiationRequest");
141
142         try {
143             final CreateInstantiateRequest request = (CreateInstantiateRequest) execution.getVariable("request");
144             logger.info("request: {}", request);
145
146             setJobStatus(execution, IN_PROGRESS,
147                     "Invoking SOL003 adapter for creating and instantiating VNF: " + request.getVnfName());
148
149             final CreateVnfRequest vnfRequest = new CreateVnfRequest();
150             vnfRequest.setTenant(request.getTenant());
151             vnfRequest.setName(request.getVnfName());
152             vnfRequest.setPkgId(request.getVnfPkgId());
153             vnfRequest.setAdditionalParams(request.getAdditionalParams());
154             final String vnfId = (String) execution.getVariable(NF_INST_ID_PARAM_NAME);
155             final Optional<CreateVnfResponse> optional =
156                     sol003AdapterServiceProvider.invokeCreateInstantiationRequest(vnfId, vnfRequest);
157
158             if (!optional.isPresent()) {
159                 final String errorMessage = "Unexpected error while processing create and instantiation request";
160                 logger.error(errorMessage);
161                 abortOperation(execution, errorMessage);
162             }
163
164             final CreateVnfResponse vnfResponse = optional.get();
165
166             logger.info("Vnf instantiation response: {}", vnfResponse);
167             execution.setVariable(CREATE_VNF_RESPONSE_PARAM_NAME, vnfResponse);
168             setJobStatus(execution, IN_PROGRESS, "Successfully invoked SOL003 adapater creating and instantiating VNF: "
169                     + request.getVnfName() + " CreaetVnfResponse Job Id: " + vnfResponse.getJobId());
170             logger.debug("Finished executing invokeCreateInstantiationRequest ...");
171         } catch (final Exception exception) {
172             final String message = "Unable to invoke create and instantiation request";
173             logger.error(message, exception);
174             abortOperation(execution, message);
175         }
176
177     }
178
179     public void updateNfInstanceStatusToInstantiated(final DelegateExecution execution) {
180         logger.info("Executing updateNfInstanceStatusToInstantiated");
181
182         updateNfInstanceStatus(execution, State.INSTANTIATED);
183         final CreateInstantiateRequest request = (CreateInstantiateRequest) execution.getVariable("request");
184         setJobStatus(execution, FINISHED, "Successfully created and Instantiated VNF: " + request.getVnfName()
185                 + " will set status to " + State.INSTANTIATED);
186
187         logger.info("Finished executing updateNfInstanceStatusToInstantiated  ...");
188
189     }
190
191     public void updateNfInstanceStatusToFailed(final DelegateExecution execution) {
192         logger.info("Executing updateNfInstanceStatusToActive");
193
194         updateNfInstanceStatus(execution, State.FAILED);
195         final CreateInstantiateRequest request = (CreateInstantiateRequest) execution.getVariable("request");
196         setJobStatus(execution, ERROR, "Failed to create and instantiate VNF: " + request.getVnfName()
197                 + " will set status to " + State.FAILED);
198
199         logger.info("Finished executing updateNfInstanceStatusToInstantiated  ...");
200
201     }
202
203     private void updateNfInstanceStatus(final DelegateExecution execution, final State vnfStatus) {
204         final String nfInstId = (String) execution.getVariable(NF_INST_ID_PARAM_NAME);
205
206         final Optional<NfvoNfInst> optional = databaseServiceProvider.getNfvoNfInst(nfInstId);
207         if (!optional.isPresent()) {
208             final String message = "Unable to find NfvoNfInst record in database using nfInstId: " + nfInstId;
209             logger.error(message);
210
211             abortOperation(execution, message);
212
213         }
214
215         final NfvoNfInst nfvoNfInst = optional.get();
216         nfvoNfInst.setStatus(vnfStatus);
217         databaseServiceProvider.saveNfvoNfInst(nfvoNfInst);
218     }
219
220 }