Adding NS instantiation
[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 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);
159
160             if (!optional.isPresent()) {
161                 final String errorMessage = "Unexpected error while processing create and instantiation request";
162                 logger.error(errorMessage);
163                 abortOperation(execution, errorMessage);
164             }
165
166             final CreateVnfResponse vnfResponse = optional.get();
167
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);
177         }
178
179     }
180
181     public void updateNfInstanceStatusToInstantiated(final DelegateExecution execution) {
182         logger.info("Executing updateNfInstanceStatusToInstantiated");
183
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);
188
189         logger.info("Finished executing updateNfInstanceStatusToInstantiated  ...");
190
191     }
192
193     public void updateNfInstanceStatusToFailed(final DelegateExecution execution) {
194         logger.info("Executing updateNfInstanceStatusToActive");
195
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);
200
201         logger.info("Finished executing updateNfInstanceStatusToInstantiated  ...");
202
203     }
204
205     private void updateNfInstanceStatus(final DelegateExecution execution, final State vnfStatus) {
206         final String nfInstId = (String) execution.getVariable(NF_INST_ID_PARAM_NAME);
207
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);
212
213             abortOperation(execution, message);
214
215         }
216
217         final NfvoNfInst nfvoNfInst = optional.get();
218         nfvoNfInst.setStatus(vnfStatus);
219         databaseServiceProvider.saveNfvoNfInst(nfvoNfInst);
220     }
221
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);
225
226         if (!optionalNfvoNsInst.isPresent()) {
227             final String message = "Unable to find NS Instance in datababse using id: " + nsInstId;
228             abortOperation(execution, message);
229         }
230
231         return optionalNfvoNsInst.get();
232     }
233
234 }