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.onap.so.adapters.vfc;
23 import java.util.HashMap;
26 import org.onap.so.adapters.vfc.constant.CommonConstant;
27 import org.onap.so.adapters.vfc.constant.CommonConstant.Step;
28 import org.onap.so.adapters.vfc.constant.DriverExceptionID;
29 import org.onap.so.adapters.vfc.constant.HttpCode;
30 import org.onap.so.adapters.vfc.exceptions.ApplicationException;
31 import org.onap.so.adapters.vfc.model.CustomerModel;
32 import org.onap.so.adapters.vfc.model.NSResourceInputParameter;
33 import org.onap.so.adapters.vfc.model.NsCreateReq;
34 import org.onap.so.adapters.vfc.model.NsInstantiateReq;
35 import org.onap.so.adapters.vfc.model.NsOperationKey;
36 import org.onap.so.adapters.vfc.model.NsParameters;
37 import org.onap.so.adapters.vfc.model.NsProgressStatus;
38 import org.onap.so.adapters.vfc.model.NsScaleParameters;
39 import org.onap.so.adapters.vfc.model.ResponseDescriptor;
40 import org.onap.so.adapters.vfc.model.RestfulResponse;
41 import org.onap.so.adapters.vfc.model.VFCScaleData;
42 import org.onap.so.adapters.vfc.util.JsonUtil;
43 import org.onap.so.adapters.vfc.util.RestfulUtil;
44 import org.onap.so.adapters.vfc.util.ValidateUtil;
45 import org.onap.so.db.request.beans.ResourceOperationStatus;
46 import org.onap.so.db.request.data.repository.ResourceOperationStatusRepository;
47 import org.onap.so.requestsdb.RequestsDbConstant;
48 import org.slf4j.Logger;
49 import org.slf4j.LoggerFactory;
50 import org.springframework.beans.factory.annotation.Autowired;
51 import org.springframework.data.domain.Example;
52 import org.springframework.stereotype.Component;
60 * @version ONAP Amsterdam Release 2017-08-28
63 public class VfcManager {
65 private static final Logger LOGGER = LoggerFactory.getLogger(VfcManager.class);
70 private static Map<String, String> nfvoUrlMap;
72 private ResourceOperationStatusRepository resourceOperationStatusRepository;
75 private RestfulUtil restfulUtil;
78 nfvoUrlMap = new HashMap<>();
79 nfvoUrlMap.put(Step.CREATE, CommonConstant.NFVO_CREATE_URL);
80 nfvoUrlMap.put(Step.INSTANTIATE, CommonConstant.NFVO_INSTANTIATE_URL);
81 nfvoUrlMap.put(Step.TERMINATE, CommonConstant.NFVO_TERMINATE_URL);
82 nfvoUrlMap.put(Step.DELETE, CommonConstant.NFVO_DELETE_URL);
83 nfvoUrlMap.put(Step.QUERY, CommonConstant.NFVO_QUERY_URL);
84 nfvoUrlMap.put(Step.SCALE, CommonConstant.NFVO_SCALE_URL);
92 * create network service <br>
94 * @param segInput input parameters for current node from http request
96 * @since ONAP Amsterdam Release
98 public RestfulResponse createNs(NSResourceInputParameter segInput) throws ApplicationException {
100 // Step1: get service template by node type
101 String csarId = segInput.getNsServiceModelUUID();
102 // nsdId for NFVO is "id" in the response, while for SDNO is "servcice template id"
103 LOGGER.info("serviceTemplateId is {}, id is {}", csarId, csarId);
105 LOGGER.info("create ns -> begin");
106 // Step2: Prepare url and method type
107 String url = getUrl(null, CommonConstant.Step.CREATE);
108 String methodType = CommonConstant.MethodType.POST;
110 // Step3: Prepare restful parameters and options
111 NsCreateReq oRequest = new NsCreateReq();
112 oRequest.setCsarId(csarId);
113 oRequest.setNsName(segInput.getNsServiceName());
114 oRequest.setDescription(segInput.getNsServiceDescription());
115 CustomerModel context = new CustomerModel();
116 context.setGlobalCustomerId(segInput.getNsOperationKey().getGlobalSubscriberId());
117 context.setServiceType(segInput.getNsOperationKey().getServiceType());
118 oRequest.setContext(context);
119 String createReq = JsonUtil.marshal(oRequest);
121 // Step4: Call NFVO or SDNO lcm to create ns
122 RestfulResponse createRsp = restfulUtil.send(url, methodType, createReq);
123 ValidateUtil.assertObjectNotNull(createRsp);
124 LOGGER.info("create ns response status is : {}", createRsp.getStatus());
125 LOGGER.info("create ns response content is : {}", createRsp.getResponseContent());
127 // Step 5: save resource operation information
128 ResourceOperationStatus status = new ResourceOperationStatus(segInput.getNsOperationKey().getServiceId(), segInput.getNsOperationKey().getOperationId(), segInput.getNsOperationKey().getNodeTemplateUUID());
129 status.setStatus(RequestsDbConstant.Status.PROCESSING);
130 status = resourceOperationStatusRepository.save(status);
131 if (!HttpCode.isSucess(createRsp.getStatus())) {
132 LOGGER.error("update segment operation status : fail to create ns");
133 status.setProgress("40");
134 status.setStatusDescription("NS is created");
135 status.setStatus(RequestsDbConstant.Status.ERROR);
136 status.setErrorCode(String.valueOf(createRsp.getStatus()));
137 resourceOperationStatusRepository.save(status);
138 throw new ApplicationException(HttpCode.INTERNAL_SERVER_ERROR,
139 DriverExceptionID.FAIL_TO_CREATE_NS);
141 @SuppressWarnings("unchecked")
142 Map<String, String> rsp = JsonUtil.unMarshal(createRsp.getResponseContent(), Map.class);
143 String nsInstanceId = rsp.get(CommonConstant.NS_INSTANCE_ID);
144 if (ValidateUtil.isStrEmpty(nsInstanceId)) {
145 LOGGER.error("Invalid instanceId from create operation");
146 throw new ApplicationException(HttpCode.INTERNAL_SERVER_ERROR,
147 DriverExceptionID.INVALID_RESPONSEE_FROM_CREATE_OPERATION);
149 LOGGER.info("create ns -> end");
150 LOGGER.info("save segment and operaton info -> begin");
151 // Step 6: add relation between service and NS
152 AaiUtil.addRelation(segInput.getNsOperationKey().getGlobalSubscriberId(),
153 segInput.getNsOperationKey().getServiceType(), segInput.getNsOperationKey().getServiceId(),
155 LOGGER.info("save segment and operation info -> end");
160 * delete network service <br>
162 * @param nsOperationKey The operation key of the NS resource
163 * @param nsInstanceId The NS instance id
165 * @since ONAP Amsterdam Release
167 public RestfulResponse deleteNs(NsOperationKey nsOperationKey, String nsInstanceId)
168 throws ApplicationException {
169 LOGGER.info("delete ns -> begin");
170 // Step1: prepare url and methodType
171 String url = getUrl(nsInstanceId, CommonConstant.Step.DELETE);
172 String methodType = CommonConstant.MethodType.DELETE;
174 // Step2: prepare restful parameters and options
175 RestfulResponse deleteRsp = restfulUtil.send(url, methodType, "");
176 ValidateUtil.assertObjectNotNull(deleteRsp);
177 LOGGER.info("delete ns response status is : {}", deleteRsp.getStatus());
178 LOGGER.info("delete ns response content is : {}", deleteRsp.getResponseContent());
179 LOGGER.info("delete ns -> end");
181 ResourceOperationStatus status = new ResourceOperationStatus(nsOperationKey.getServiceId(), nsOperationKey.getOperationId(), nsOperationKey.getNodeTemplateUUID());
182 if (!HttpCode.isSucess(deleteRsp.getStatus())) {
183 LOGGER.error("fail to delete ns");
185 status.setStatus(RequestsDbConstant.Status.ERROR);
186 status.setErrorCode(String.valueOf(deleteRsp.getStatus()));
187 status.setStatusDescription(CommonConstant.StatusDesc.TERMINATE_NS_FAILED);
188 resourceOperationStatusRepository.save(status);
189 throw new ApplicationException(HttpCode.INTERNAL_SERVER_ERROR,
190 DriverExceptionID.FAIL_TO_DELETE_NS);
193 // Step3: remove relation info between service and ns
194 AaiUtil.removeRelation(nsOperationKey.getGlobalSubscriberId(), nsOperationKey.getServiceType(),
195 nsOperationKey.getServiceId(), nsInstanceId);
196 LOGGER.info("delete segment information -> end");
198 // Step4: update service segment operation status
199 status.setStatus(RequestsDbConstant.Status.FINISHED);
200 status.setErrorCode(String.valueOf(deleteRsp.getStatus()));
201 status.setProgress("100");
202 status.setStatusDescription("VFC resource deletion finished");
203 resourceOperationStatusRepository.save(status);
204 LOGGER.info("update segment operaton status for delete -> end");
211 * instantiate network service <br>
213 * @param nsInstanceId The NS instance id
214 * @param segInput input parameters for current node from http request
216 * @since ONAP Amsterdam Release
218 public RestfulResponse instantiateNs(String nsInstanceId, NSResourceInputParameter segInput)
219 throws ApplicationException {
220 // Call the NFVO or SDNO service to instantiate service
221 LOGGER.info("instantiate ns -> begin");
223 // Step1: Prepare restful parameters and options
224 NsInstantiateReq oRequest = new NsInstantiateReq();
225 oRequest.setNsInstanceId(nsInstanceId);
226 NsParameters nsParameters = segInput.getNsParameters();
227 oRequest.setLocationConstraints(nsParameters.getLocationConstraints());
228 oRequest.setAdditionalParamForNs(nsParameters.getAdditionalParamForNs());
229 String instReq = JsonUtil.marshal(oRequest);
230 // Step2: prepare url and
231 String url = getUrl(nsInstanceId, CommonConstant.Step.INSTANTIATE);
232 String methodType = CommonConstant.MethodType.POST;
234 RestfulResponse instRsp = restfulUtil.send(url, methodType, instReq);
235 ResourceOperationStatus status = new ResourceOperationStatus(segInput.getNsOperationKey().getServiceId(), segInput.getNsOperationKey().getOperationId(), segInput.getNsOperationKey().getNodeTemplateUUID());
236 ValidateUtil.assertObjectNotNull(instRsp);
237 if (!HttpCode.isSucess(instRsp.getStatus())) {
238 LOGGER.error("update segment operation status : fail to instantiate ns");
239 status.setStatus(RequestsDbConstant.Status.ERROR);
240 status.setErrorCode(String.valueOf(instRsp.getStatus()));
241 status.setStatusDescription(CommonConstant.StatusDesc.INSTANTIATE_NS_FAILED);
242 resourceOperationStatusRepository.save(status);
243 throw new ApplicationException(HttpCode.INTERNAL_SERVER_ERROR,
244 DriverExceptionID.FAIL_TO_INSTANTIATE_NS);
246 LOGGER.info("instantiate ns response status is : {}", instRsp.getStatus());
247 LOGGER.info("instantiate ns response content is : {}", instRsp.getResponseContent());
248 ValidateUtil.assertObjectNotNull(instRsp.getResponseContent());
249 @SuppressWarnings("unchecked")
250 Map<String, String> rsp = JsonUtil.unMarshal(instRsp.getResponseContent(), Map.class);
251 String jobId = rsp.get(CommonConstant.JOB_ID);
252 if (ValidateUtil.isStrEmpty(jobId)) {
253 LOGGER.error("Invalid jobId from instantiate operation");
254 status.setStatus(RequestsDbConstant.Status.ERROR);
255 status.setErrorCode(String.valueOf(instRsp.getStatus()));
256 status.setStatusDescription(CommonConstant.StatusDesc.INSTANTIATE_NS_FAILED);
257 resourceOperationStatusRepository.save(status);
258 throw new ApplicationException(HttpCode.INTERNAL_SERVER_ERROR,
259 DriverExceptionID.INVALID_RESPONSE_FROM_INSTANTIATE_OPERATION);
261 LOGGER.info("instantiate ns -> end");
262 // Step 3: update segment operation job id
263 LOGGER.info("update resource operation status job id -> begin");
264 status.setJobId(jobId);
265 status.setProgress("100");
266 status.setStatusDescription("NS initiation completed.");
267 resourceOperationStatusRepository.save(status);
268 LOGGER.info("update segment operation job id -> end");
274 * terminate network service <br>
276 * @param nsOperationKey The operation key for NS resource
277 * @param nsInstanceId The NS instance id
279 * @since ONAP Amsterdam Release
281 public RestfulResponse terminateNs(NsOperationKey nsOperationKey, String nsInstanceId)
282 throws ApplicationException {
283 // Step1: save segment operation info for delete process
284 LOGGER.info("save segment operation for delete process");
285 ResourceOperationStatus status = new ResourceOperationStatus(nsOperationKey.getServiceId(), nsOperationKey.getOperationId(), nsOperationKey.getNodeTemplateUUID());
286 status.setStatus(RequestsDbConstant.Status.PROCESSING);
287 resourceOperationStatusRepository.save(status);
289 LOGGER.info("terminate ns -> begin");
290 // Step2: prepare url and method type
291 String url = getUrl(nsInstanceId, CommonConstant.Step.TERMINATE);
292 String methodType = CommonConstant.MethodType.POST;
294 // Step3: prepare restful parameters and options
295 Map<String, String> reqBody = new HashMap<>();
296 reqBody.put("nsInstanceId", nsInstanceId);
297 reqBody.put("terminationType", "graceful");
298 reqBody.put("gracefulTerminationTimeout", "60");
300 // Step4: Call the NFVO or SDNO service to terminate service
301 RestfulResponse terminateRsp = restfulUtil.send(url, methodType, JsonUtil.marshal(reqBody));
302 ValidateUtil.assertObjectNotNull(terminateRsp);
303 LOGGER.info("terminate ns response status is : {}", terminateRsp.getStatus());
304 LOGGER.info("terminate ns response content is : {}", terminateRsp.getResponseContent());
305 // Step 3: update segment operation
306 if (!HttpCode.isSucess(terminateRsp.getStatus())) {
307 LOGGER.error("fail to instantiate ns");
308 status.setStatus(RequestsDbConstant.Status.ERROR);
309 status.setErrorCode(String.valueOf(terminateRsp.getStatus()));
310 status.setStatusDescription(CommonConstant.StatusDesc.TERMINATE_NS_FAILED);
311 resourceOperationStatusRepository.save(status);
313 throw new ApplicationException(HttpCode.INTERNAL_SERVER_ERROR,
314 DriverExceptionID.FAIL_TO_TERMINATE_NS);
316 @SuppressWarnings("unchecked")
317 Map<String, String> rsp = JsonUtil.unMarshal(terminateRsp.getResponseContent(), Map.class);
318 String jobId = rsp.get(CommonConstant.JOB_ID);
319 if (ValidateUtil.isStrEmpty(jobId)) {
320 LOGGER.error("Invalid jobId from terminate operation");
321 status.setStatus(RequestsDbConstant.Status.ERROR);
322 status.setErrorCode(String.valueOf(terminateRsp.getStatus()));
323 status.setStatusDescription(CommonConstant.StatusDesc.TERMINATE_NS_FAILED);
324 resourceOperationStatusRepository.save(status);
325 throw new ApplicationException(HttpCode.INTERNAL_SERVER_ERROR,
326 DriverExceptionID.INVALID_RESPONSE_FROM_TERMINATE_OPERATION);
328 LOGGER.info("terminate ns -> end");
330 LOGGER.info("update segment job id -> begin");
331 status.setProgress("60");
332 status.setStatusDescription("NS is termination completed");
333 status.setJobId(jobId);
334 resourceOperationStatusRepository.save(status);
335 LOGGER.info("update segment job id -> end");
341 * get ns progress by job Id <br>
343 * @param nsOperationKey The OperationKey for NS resource
344 * @param jobId the job id
346 * @since ONAP Amsterdam Release
348 public RestfulResponse getNsProgress(NsOperationKey nsOperationKey, String jobId)
349 throws ApplicationException {
351 ValidateUtil.assertObjectNotNull(jobId);
352 // Step 1: query the current resource operation status
353 ResourceOperationStatus status = new ResourceOperationStatus(nsOperationKey.getServiceId(), nsOperationKey.getOperationId(), nsOperationKey.getNodeTemplateUUID());
354 status = resourceOperationStatusRepository.findOne(Example.of(status));
355 // Step 2: start query
356 LOGGER.info("query ns status -> begin");
357 String url = getUrl(jobId, CommonConstant.Step.QUERY);
358 String methodType = CommonConstant.MethodType.GET;
359 // prepare restful parameters and options
360 RestfulResponse rsp = restfulUtil.send(url, methodType, "");
361 ValidateUtil.assertObjectNotNull(rsp);
362 LOGGER.info("query ns progress response status is : {}", rsp.getStatus());
363 LOGGER.info("query ns progress response content is : {}", rsp.getResponseContent());
364 // Step 3:check the response staus
365 if (!HttpCode.isSucess(rsp.getStatus())) {
366 LOGGER.info("fail to query job status");
367 status.setErrorCode(String.valueOf(rsp.getStatus()));
368 status.setStatus(RequestsDbConstant.Status.ERROR);
369 status.setStatusDescription(CommonConstant.StatusDesc.QUERY_JOB_STATUS_FAILED);
370 resourceOperationStatusRepository.save(status);
371 throw new ApplicationException(HttpCode.INTERNAL_SERVER_ERROR,
372 DriverExceptionID.FAIL_TO_QUERY_JOB_STATUS);
374 // Step 4: Process Network Service Instantiate Response
375 NsProgressStatus nsProgress =
376 JsonUtil.unMarshal(rsp.getResponseContent(), NsProgressStatus.class);
377 ResponseDescriptor rspDesc = nsProgress.getResponseDescriptor();
378 // Step 5: update segment operation progress
380 status.setProgress(rspDesc.getProgress());
381 status.setStatusDescription(rspDesc.getStatusDescription());
382 resourceOperationStatusRepository.save(status);
384 // Step 6: update segment operation status
385 if (RequestsDbConstant.Progress.ONE_HUNDRED.equals(rspDesc.getProgress())
386 && RequestsDbConstant.Status.FINISHED.equals(rspDesc.getStatus())) {
387 LOGGER.info("job result is succeeded, operType is {}", status.getOperType());
388 status.setErrorCode(String.valueOf(rsp.getStatus()));
389 status.setStatusDescription(CommonConstant.StatusDesc.QUERY_JOB_STATUS_FAILED);
391 if(RequestsDbConstant.OperationType.CREATE.equalsIgnoreCase(status.getOperType()) || "createInstance".equalsIgnoreCase (status.getOperType())) {
392 status.setStatus(RequestsDbConstant.Status.FINISHED);
394 resourceOperationStatusRepository.save(status);
395 } else if (RequestsDbConstant.Status.ERROR.equals(rspDesc.getStatus())) {
396 LOGGER.error("job result is failed, operType is {}", status.getOperType());
397 status.setErrorCode(String.valueOf(rsp.getStatus()));
398 status.setStatusDescription(CommonConstant.StatusDesc.QUERY_JOB_STATUS_FAILED);
399 status.setStatus(RequestsDbConstant.Status.ERROR);
400 resourceOperationStatusRepository.save(status);
401 throw new ApplicationException(HttpCode.INTERNAL_SERVER_ERROR,
402 DriverExceptionID.JOB_STATUS_ERROR);
404 LOGGER.error("unexcepted response status");
406 LOGGER.info("query ns status -> end");
415 * @param nsInstanceId The NS instance id
416 * @param segInput input parameters for current node from http request
418 * @since ONAP Amsterdam Release
420 public RestfulResponse scaleNs(String nsInstanceId, NSResourceInputParameter segInput)
421 throws ApplicationException {
422 // Call the NFVO to scale service
423 LOGGER.info("scale ns -> begin");
425 // Step1: Prepare restful parameters and options
426 VFCScaleData oRequest = new VFCScaleData();
427 oRequest.setNsInstanceId(nsInstanceId);
428 NsScaleParameters nsScaleParameters = segInput.getNsScaleParameters();
429 oRequest.setScaleType(nsScaleParameters.getScaleType());
430 oRequest.setScaleNsData(nsScaleParameters.getScaleNsByStepsData());
431 String scaleReq = JsonUtil.marshal(oRequest);
433 // Step2: prepare url and method type
434 String url = getUrl(nsInstanceId, CommonConstant.Step.SCALE);
435 String methodType = CommonConstant.MethodType.POST;
436 LOGGER.info("scale ns request is {}", scaleReq);
437 // Step3: Call NFVO lcm to scale ns
438 RestfulResponse scaleRsp = restfulUtil.send(url, methodType, scaleReq);
440 ResourceOperationStatus status = new ResourceOperationStatus(segInput.getNsOperationKey().getServiceId(), segInput.getNsOperationKey().getOperationId(), segInput.getNsOperationKey().getNodeTemplateUUID());
441 ResourceOperationStatus nsOperInfo = resourceOperationStatusRepository.findOne(Example.of(status));
442 ValidateUtil.assertObjectNotNull(scaleRsp);
443 if(!HttpCode.isSucess(scaleRsp.getStatus())) {
444 LOGGER.error("update segment operation status : fail to scale ns");
445 nsOperInfo.setStatus(RequestsDbConstant.Status.ERROR);
446 nsOperInfo.setErrorCode(String.valueOf(scaleRsp.getStatus()));
447 nsOperInfo.setStatusDescription(CommonConstant.StatusDesc.SCALE_NS_FAILED);
448 resourceOperationStatusRepository.save(nsOperInfo);
449 throw new ApplicationException(HttpCode.INTERNAL_SERVER_ERROR, DriverExceptionID.FAIL_TO_SCALE_NS);
451 LOGGER.info("scale ns response status is {}", scaleRsp.getStatus());
452 LOGGER.info("scale ns response content is {}", scaleRsp.getResponseContent());
454 ValidateUtil.assertObjectNotNull(scaleRsp.getResponseContent());
455 @SuppressWarnings("unchecked")
456 Map<String, String> rsp = JsonUtil.unMarshal(scaleRsp.getResponseContent(), Map.class);
457 String jobId = rsp.get(CommonConstant.JOB_ID);
458 if(ValidateUtil.isStrEmpty(jobId)) {
459 LOGGER.error("Invalid jobId from scale operation");
460 nsOperInfo.setStatus(RequestsDbConstant.Status.ERROR);
461 nsOperInfo.setErrorCode(String.valueOf(scaleRsp.getStatus()));
462 nsOperInfo.setStatusDescription(CommonConstant.StatusDesc.SCALE_NS_FAILED);
463 resourceOperationStatusRepository.save(nsOperInfo);
464 throw new ApplicationException(HttpCode.INTERNAL_SERVER_ERROR,
465 DriverExceptionID.INVALID_RESPONSE_FROM_SCALE_OPERATION);
468 LOGGER.info("update resource operation status job id -> begin");
469 // Step 4: update segment operation job id
470 nsOperInfo.setJobId(jobId);
471 resourceOperationStatusRepository.save(nsOperInfo);
472 LOGGER.info("update segment operation job id -> end");
473 LOGGER.info("scale ns -> end");
479 * get url for the operation <br>
481 * @param variable variable should be put in the url
482 * @param step step of the operation (terminate,query,delete)
484 * @since ONAP Amsterdam Release
486 private String getUrl(String variable, String step) {
490 originalUrl = nfvoUrlMap.get(step);
491 url = String.format(originalUrl, variable);