2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2017 Huawei Technologies Co., Ltd. All rights reserved.
6 * ================================================================================
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 * ============LICENSE_END=========================================================
21 package org.openecomp.mso.adapters.vfc;
23 import java.util.HashMap;
26 import org.openecomp.mso.adapters.vfc.constant.CommonConstant;
27 import org.openecomp.mso.adapters.vfc.constant.CommonConstant.Step;
28 import org.openecomp.mso.adapters.vfc.constant.DriverExceptionID;
29 import org.openecomp.mso.adapters.vfc.constant.HttpCode;
30 import org.openecomp.mso.adapters.vfc.exceptions.ApplicationException;
31 import org.openecomp.mso.adapters.vfc.model.CustomerModel;
32 import org.openecomp.mso.adapters.vfc.model.NSResourceInputParameter;
33 import org.openecomp.mso.adapters.vfc.model.NsCreateReq;
34 import org.openecomp.mso.adapters.vfc.model.NsInstantiateReq;
35 import org.openecomp.mso.adapters.vfc.model.NsOperationKey;
36 import org.openecomp.mso.adapters.vfc.model.NsParameters;
37 import org.openecomp.mso.adapters.vfc.model.NsProgressStatus;
38 import org.openecomp.mso.adapters.vfc.model.ResponseDescriptor;
39 import org.openecomp.mso.adapters.vfc.model.RestfulResponse;
40 import org.openecomp.mso.adapters.vfc.util.JsonUtil;
41 import org.openecomp.mso.adapters.vfc.util.RestfulUtil;
42 import org.openecomp.mso.adapters.vfc.util.ValidateUtil;
43 import org.openecomp.mso.requestsdb.RequestsDatabase;
44 import org.openecomp.mso.requestsdb.RequestsDbConstant;
45 import org.openecomp.mso.requestsdb.ResourceOperationStatus;
46 import org.slf4j.Logger;
47 import org.slf4j.LoggerFactory;
55 * @version ONAP Amsterdam Release 2017-08-28
57 public class VfcManager {
59 private static final Logger LOGGER = LoggerFactory.getLogger(VfcManager.class);
64 private static Map<String, String> nfvoUrlMap;
67 nfvoUrlMap = new HashMap<>();
68 nfvoUrlMap.put(Step.CREATE, CommonConstant.NFVO_CREATE_URL);
69 nfvoUrlMap.put(Step.INSTANTIATE, CommonConstant.NFVO_INSTANTIATE_URL);
70 nfvoUrlMap.put(Step.TERMINATE, CommonConstant.NFVO_TERMINATE_URL);
71 nfvoUrlMap.put(Step.DELETE, CommonConstant.NFVO_DELETE_URL);
72 nfvoUrlMap.put(Step.QUERY, CommonConstant.NFVO_QUERY_URL);
80 * create network service <br>
82 * @param segInput input parameters for current node from http request
84 * @since ONAP Amsterdam Release
86 public RestfulResponse createNs(NSResourceInputParameter segInput) throws ApplicationException {
88 // Step1: get service template by node type
89 String csarId = segInput.getNsOperationKey().getNodeTemplateUUID();
90 // nsdId for NFVO is "id" in the response, while for SDNO is "servcice template id"
91 LOGGER.info("serviceTemplateId is {}, id is {}", csarId);
93 LOGGER.info("create ns -> begin");
94 // Step2: Prepare url and method type
95 String url = getUrl(null, CommonConstant.Step.CREATE);
96 String methodType = CommonConstant.MethodType.POST;
98 // Step3: Prepare restful parameters and options
99 NsCreateReq oRequest = new NsCreateReq();
100 oRequest.setCsarId(csarId);
101 oRequest.setNsName(segInput.getNsServiceName());
102 oRequest.setDescription(segInput.getNsServiceDescription());
103 CustomerModel context = new CustomerModel();
104 context.setGlobalCustomerId(segInput.getNsOperationKey().getGlobalSubscriberId());
105 context.setServiceType(segInput.getNsOperationKey().getServiceType());
106 oRequest.setContext(context);
107 String createReq = JsonUtil.marshal(oRequest);
109 // Step4: Call NFVO or SDNO lcm to create ns
110 RestfulResponse createRsp = RestfulUtil.send(url, methodType, createReq);
111 ValidateUtil.assertObjectNotNull(createRsp);
112 LOGGER.info("create ns response status is : {}", createRsp.getStatus());
113 LOGGER.info("create ns response content is : {}", createRsp.getResponseContent());
115 // Step 5: save resource operation information
116 ResourceOperationStatus nsOperInfo = (RequestsDatabase.getInstance())
117 .getResourceOperationStatus(segInput.getNsOperationKey().getServiceId(),
118 segInput.getNsOperationKey().getOperationId(),
119 segInput.getNsOperationKey().getNodeTemplateUUID());
120 nsOperInfo.setStatus(RequestsDbConstant.Status.PROCESSING);
121 (RequestsDatabase.getInstance()).updateResOperStatus(nsOperInfo);
123 if (!HttpCode.isSucess(createRsp.getStatus())) {
124 LOGGER.error("update segment operation status : fail to create ns");
125 nsOperInfo.setStatus(RequestsDbConstant.Status.ERROR);
126 nsOperInfo.setErrorCode(String.valueOf(createRsp.getStatus()));
127 (RequestsDatabase.getInstance()).updateResOperStatus(nsOperInfo);
128 throw new ApplicationException(HttpCode.INTERNAL_SERVER_ERROR,
129 DriverExceptionID.FAIL_TO_CREATE_NS);
131 @SuppressWarnings("unchecked")
132 Map<String, String> rsp = JsonUtil.unMarshal(createRsp.getResponseContent(), Map.class);
133 String nsInstanceId = rsp.get(CommonConstant.NS_INSTANCE_ID);
134 if (ValidateUtil.isStrEmpty(nsInstanceId)) {
135 LOGGER.error("Invalid instanceId from create operation");
136 throw new ApplicationException(HttpCode.INTERNAL_SERVER_ERROR,
137 DriverExceptionID.INVALID_RESPONSEE_FROM_CREATE_OPERATION);
139 LOGGER.info("create ns -> end");
140 LOGGER.info("save segment and operaton info -> begin");
141 // Step 6: add relation between service and NS
142 AaiUtil.addRelation(segInput.getNsOperationKey().getGlobalSubscriberId(),
143 segInput.getNsOperationKey().getServiceType(), segInput.getNsOperationKey().getServiceId(),
145 LOGGER.info("save segment and operation info -> end");
150 * delete network service <br>
152 * @param nsOperationKey The operation key of the NS resource
153 * @param nsInstanceId The NS instance id
155 * @since ONAP Amsterdam Release
157 public RestfulResponse deleteNs(NsOperationKey nsOperationKey, String nsInstanceId)
158 throws ApplicationException {
159 LOGGER.info("delete ns -> begin");
160 // Step1: prepare url and methodType
161 String url = getUrl(nsInstanceId, CommonConstant.Step.DELETE);
162 String methodType = CommonConstant.MethodType.DELETE;
164 // Step2: prepare restful parameters and options
165 RestfulResponse deleteRsp = RestfulUtil.send(url, methodType, "");
166 ValidateUtil.assertObjectNotNull(deleteRsp);
167 LOGGER.info("delete ns response status is : {}", deleteRsp.getStatus());
168 LOGGER.info("delete ns response content is : {}", deleteRsp.getResponseContent());
169 LOGGER.info("delete ns -> end");
170 ResourceOperationStatus nsOperInfo =
171 (RequestsDatabase.getInstance()).getResourceOperationStatus(nsOperationKey.getServiceId(),
172 nsOperationKey.getOperationId(), nsOperationKey.getNodeTemplateUUID());
173 if (!HttpCode.isSucess(deleteRsp.getStatus())) {
174 LOGGER.error("fail to delete ns");
176 nsOperInfo.setStatus(RequestsDbConstant.Status.ERROR);
177 nsOperInfo.setErrorCode(String.valueOf(deleteRsp.getStatus()));
178 nsOperInfo.setStatusDescription(CommonConstant.StatusDesc.TERMINATE_NS_FAILED);
179 (RequestsDatabase.getInstance()).updateResOperStatus(nsOperInfo);
180 throw new ApplicationException(HttpCode.INTERNAL_SERVER_ERROR,
181 DriverExceptionID.FAIL_TO_DELETE_NS);
184 // Step3: remove relation info between service and ns
185 AaiUtil.removeRelation(nsOperationKey.getGlobalSubscriberId(), nsOperationKey.getServiceType(),
186 nsOperationKey.getServiceId(), nsInstanceId);
187 LOGGER.info("delete segment information -> end");
189 // Step4: update service segment operation status
190 nsOperInfo.setStatus(RequestsDbConstant.Status.FINISHED);
191 nsOperInfo.setErrorCode(String.valueOf(deleteRsp.getStatus()));
192 (RequestsDatabase.getInstance()).updateResOperStatus(nsOperInfo);
193 LOGGER.info("update segment operaton status for delete -> end");
200 * instantiate network service <br>
202 * @param nsInstanceId The NS instance id
203 * @param segInput input parameters for current node from http request
205 * @since ONAP Amsterdam Release
207 public RestfulResponse instantiateNs(String nsInstanceId, NSResourceInputParameter segInput)
208 throws ApplicationException {
209 // Call the NFVO or SDNO service to instantiate service
210 LOGGER.info("instantiate ns -> begin");
212 // Step1: Prepare restful parameters and options
213 NsInstantiateReq oRequest = new NsInstantiateReq();
214 oRequest.setNsInstanceId(nsInstanceId);
215 NsParameters nsParameters = segInput.getNsParameters();
216 oRequest.setLocationConstraints(nsParameters.getLocationConstraints());
217 oRequest.setAdditionalParamForNs(nsParameters.getAdditionalParamForNs());
218 String instReq = JsonUtil.marshal(oRequest);
219 // Step2: prepare url and
220 String url = getUrl(nsInstanceId, CommonConstant.Step.INSTANTIATE);
221 String methodType = CommonConstant.MethodType.POST;
223 RestfulResponse instRsp = RestfulUtil.send(url, methodType, instReq);
224 ResourceOperationStatus nsOperInfo = (RequestsDatabase.getInstance())
225 .getResourceOperationStatus(segInput.getNsOperationKey().getServiceId(),
226 segInput.getNsOperationKey().getOperationId(),
227 segInput.getNsOperationKey().getNodeTemplateUUID());
228 ValidateUtil.assertObjectNotNull(instRsp);
229 if (!HttpCode.isSucess(instRsp.getStatus())) {
230 LOGGER.error("update segment operation status : fail to instantiate ns");
231 nsOperInfo.setStatus(RequestsDbConstant.Status.ERROR);
232 nsOperInfo.setErrorCode(String.valueOf(instRsp.getStatus()));
233 nsOperInfo.setStatusDescription(CommonConstant.StatusDesc.INSTANTIATE_NS_FAILED);
234 (RequestsDatabase.getInstance()).updateResOperStatus(nsOperInfo);
235 throw new ApplicationException(HttpCode.INTERNAL_SERVER_ERROR,
236 DriverExceptionID.FAIL_TO_INSTANTIATE_NS);
238 LOGGER.info("instantiate ns response status is : {}", instRsp.getStatus());
239 LOGGER.info("instantiate ns response content is : {}", instRsp.getResponseContent());
240 ValidateUtil.assertObjectNotNull(instRsp.getResponseContent());
241 @SuppressWarnings("unchecked")
242 Map<String, String> rsp = JsonUtil.unMarshal(instRsp.getResponseContent(), Map.class);
243 String jobId = rsp.get(CommonConstant.JOB_ID);
244 if (ValidateUtil.isStrEmpty(jobId)) {
245 LOGGER.error("Invalid jobId from instantiate operation");
246 nsOperInfo.setStatus(RequestsDbConstant.Status.ERROR);
247 nsOperInfo.setErrorCode(String.valueOf(instRsp.getStatus()));
248 nsOperInfo.setStatusDescription(CommonConstant.StatusDesc.INSTANTIATE_NS_FAILED);
249 (RequestsDatabase.getInstance()).updateResOperStatus(nsOperInfo);
250 throw new ApplicationException(HttpCode.INTERNAL_SERVER_ERROR,
251 DriverExceptionID.INVALID_RESPONSE_FROM_INSTANTIATE_OPERATION);
253 LOGGER.info("instantiate ns -> end");
254 // Step 3: update segment operation job id
255 LOGGER.info("update resource operation status job id -> begin");
256 nsOperInfo.setJobId(jobId);
257 (RequestsDatabase.getInstance()).updateResOperStatus(nsOperInfo);
258 LOGGER.info("update segment operation job id -> end");
264 * terminate network service <br>
266 * @param nsOperationKey The operation key for NS resource
267 * @param nsInstanceId The NS instance id
269 * @since ONAP Amsterdam Release
271 public RestfulResponse terminateNs(NsOperationKey nsOperationKey, String nsInstanceId)
272 throws ApplicationException {
273 // Step1: save segment operation info for delete process
274 LOGGER.info("save segment operation for delete process");
275 ResourceOperationStatus nsOperInfo =
276 (RequestsDatabase.getInstance()).getResourceOperationStatus(nsOperationKey.getServiceId(),
277 nsOperationKey.getOperationId(), nsOperationKey.getNodeTemplateUUID());
278 nsOperInfo.setStatus(RequestsDbConstant.Status.PROCESSING);
279 (RequestsDatabase.getInstance()).updateResOperStatus(nsOperInfo);
281 LOGGER.info("terminate ns -> begin");
282 // Step2: prepare url and method type
283 String url = getUrl(nsInstanceId, CommonConstant.Step.TERMINATE);
284 String methodType = CommonConstant.MethodType.POST;
286 // Step3: prepare restful parameters and options
287 Map<String, String> reqBody = new HashMap<>();
288 reqBody.put("nsInstanceId", nsInstanceId);
289 reqBody.put("terminationType", "graceful");
290 reqBody.put("gracefulTerminationTimeout", "60");
292 // Step4: Call the NFVO or SDNO service to terminate service
293 RestfulResponse terminateRsp = RestfulUtil.send(url, methodType, JsonUtil.marshal(reqBody));
294 ValidateUtil.assertObjectNotNull(terminateRsp);
295 LOGGER.info("terminate ns response status is : {}", terminateRsp.getStatus());
296 LOGGER.info("terminate ns response content is : {}", terminateRsp.getResponseContent());
297 // Step 3: update segment operation
298 if (!HttpCode.isSucess(terminateRsp.getStatus())) {
299 LOGGER.error("fail to instantiate ns");
300 nsOperInfo.setStatus(RequestsDbConstant.Status.ERROR);
301 nsOperInfo.setErrorCode(String.valueOf(terminateRsp.getStatus()));
302 nsOperInfo.setStatusDescription(CommonConstant.StatusDesc.TERMINATE_NS_FAILED);
303 (RequestsDatabase.getInstance()).updateResOperStatus(nsOperInfo);
305 throw new ApplicationException(HttpCode.INTERNAL_SERVER_ERROR,
306 DriverExceptionID.FAIL_TO_TERMINATE_NS);
308 @SuppressWarnings("unchecked")
309 Map<String, String> rsp = JsonUtil.unMarshal(terminateRsp.getResponseContent(), Map.class);
310 String jobId = rsp.get(CommonConstant.JOB_ID);
311 if (ValidateUtil.isStrEmpty(jobId)) {
312 LOGGER.error("Invalid jobId from terminate operation");
313 nsOperInfo.setStatus(RequestsDbConstant.Status.ERROR);
314 nsOperInfo.setErrorCode(String.valueOf(terminateRsp.getStatus()));
315 nsOperInfo.setStatusDescription(CommonConstant.StatusDesc.TERMINATE_NS_FAILED);
316 (RequestsDatabase.getInstance()).updateResOperStatus(nsOperInfo);
317 throw new ApplicationException(HttpCode.INTERNAL_SERVER_ERROR,
318 DriverExceptionID.INVALID_RESPONSE_FROM_TERMINATE_OPERATION);
320 LOGGER.info("terminate ns -> end");
322 LOGGER.info("update segment job id -> begin");
323 nsOperInfo.setJobId(jobId);
324 (RequestsDatabase.getInstance()).updateResOperStatus(nsOperInfo);
325 LOGGER.info("update segment job id -> end");
331 * get ns progress by job Id <br>
333 * @param nsOperationKey The OperationKey for NS resource
334 * @param jobId the job id
336 * @since ONAP Amsterdam Release
338 public RestfulResponse getNsProgress(NsOperationKey nsOperationKey, String jobId)
339 throws ApplicationException {
341 ValidateUtil.assertObjectNotNull(jobId);
342 // Step 1: query the current resource operation status
343 ResourceOperationStatus nsOperInfo =
344 (RequestsDatabase.getInstance()).getResourceOperationStatus(nsOperationKey.getServiceId(),
345 nsOperationKey.getOperationId(), nsOperationKey.getNodeTemplateUUID());
347 // Step 2: start query
348 LOGGER.info("query ns status -> begin");
349 String url = getUrl(jobId, CommonConstant.Step.QUERY);
350 String methodType = CommonConstant.MethodType.GET;
351 // prepare restful parameters and options
352 RestfulResponse rsp = RestfulUtil.send(url, methodType, "");
353 ValidateUtil.assertObjectNotNull(rsp);
354 LOGGER.info("query ns progress response status is : {}", rsp.getStatus());
355 LOGGER.info("query ns progress response content is : {}", rsp.getResponseContent());
356 // Step 3:check the response staus
357 if (!HttpCode.isSucess(rsp.getStatus())) {
358 LOGGER.info("fail to query job status");
359 nsOperInfo.setErrorCode(String.valueOf(rsp.getStatus()));
360 nsOperInfo.setStatus(RequestsDbConstant.Status.ERROR);
361 nsOperInfo.setStatusDescription(CommonConstant.StatusDesc.QUERY_JOB_STATUS_FAILED);
362 (RequestsDatabase.getInstance()).updateResOperStatus(nsOperInfo);
363 throw new ApplicationException(HttpCode.INTERNAL_SERVER_ERROR,
364 DriverExceptionID.FAIL_TO_QUERY_JOB_STATUS);
366 // Step 4: Process Network Service Instantiate Response
367 NsProgressStatus nsProgress =
368 JsonUtil.unMarshal(rsp.getResponseContent(), NsProgressStatus.class);
369 ResponseDescriptor rspDesc = nsProgress.getResponseDescriptor();
370 // Step 5: update segment operation progress
372 nsOperInfo.setProgress(rspDesc.getProgress());
373 nsOperInfo.setStatusDescription(rspDesc.getStatusDescription());
374 (RequestsDatabase.getInstance()).updateResOperStatus(nsOperInfo);
376 // Step 6: update segment operation status
377 if (RequestsDbConstant.Progress.ONE_HUNDRED.equals(rspDesc.getProgress())
378 && RequestsDbConstant.Status.FINISHED.equals(rspDesc.getStatus())) {
379 LOGGER.info("job result is succeeded, operType is {}", nsOperInfo.getOperType());
380 nsOperInfo.setErrorCode(String.valueOf(rsp.getStatus()));
381 nsOperInfo.setStatusDescription(CommonConstant.StatusDesc.QUERY_JOB_STATUS_FAILED);
383 if(RequestsDbConstant.OperationType.CREATE.equalsIgnoreCase(nsOperInfo.getOperType())) {
384 nsOperInfo.setStatus(RequestsDbConstant.Status.FINISHED);
386 (RequestsDatabase.getInstance()).updateResOperStatus(nsOperInfo);
387 } else if (RequestsDbConstant.Status.ERROR.equals(rspDesc.getStatus())) {
388 LOGGER.error("job result is failed, operType is {}", nsOperInfo.getOperType());
389 nsOperInfo.setErrorCode(String.valueOf(rsp.getStatus()));
390 nsOperInfo.setStatusDescription(CommonConstant.StatusDesc.QUERY_JOB_STATUS_FAILED);
391 nsOperInfo.setStatus(RequestsDbConstant.Status.ERROR);
392 (RequestsDatabase.getInstance()).updateResOperStatus(nsOperInfo);
393 throw new ApplicationException(HttpCode.INTERNAL_SERVER_ERROR,
394 DriverExceptionID.JOB_STATUS_ERROR);
396 LOGGER.error("unexcepted response status");
398 LOGGER.info("query ns status -> end");
404 * get url for the operation <br>
406 * @param variable variable should be put in the url
407 * @param step step of the operation (terminate,query,delete)
409 * @since ONAP Amsterdam Release
411 private String getUrl(String variable, String step) {
415 originalUrl = (String) nfvoUrlMap.get(step);
416 url = String.format(originalUrl, variable);