diff options
Diffstat (limited to 'gvnfmadapter/driver/interfaces/views.py')
-rw-r--r-- | gvnfmadapter/driver/interfaces/views.py | 291 |
1 files changed, 168 insertions, 123 deletions
diff --git a/gvnfmadapter/driver/interfaces/views.py b/gvnfmadapter/driver/interfaces/views.py index b7da997..f0d5213 100644 --- a/gvnfmadapter/driver/interfaces/views.py +++ b/gvnfmadapter/driver/interfaces/views.py @@ -16,11 +16,13 @@ import inspect import json import logging import time +import traceback from rest_framework import status from rest_framework.decorators import api_view from rest_framework.response import Response +from driver.pub.exceptions import GvnfmDriverException from driver.pub.utils import restcall from driver.pub.utils.restcall import req_by_msb @@ -30,57 +32,78 @@ logger = logging.getLogger(__name__) @api_view(http_method_names=['POST']) def instantiate_vnf(request, *args, **kwargs): try: + logger.debug("instantiate_vnf--post::> %s" % request.data) + logger.info("Create vnf begin!") input_data = {} input_data["vnfdId"] = ignorcase_get(request.data, "vnfDescriptorId") input_data["vnfInstanceName"] = ignorcase_get(request.data, "vnfInstanceName") input_data["vnfInstanceDescription"] = ignorcase_get(request.data, "vnfInstanceDescription") vnfm_id = ignorcase_get(kwargs, "vnfmid") - ret, resp = do_createvnf(request, input_data, vnfm_id) - if ret != 0: - return resp - logger.info("[%s]resp_data=%s", fun_name(), resp) + logger.debug("do_createvnf: request data=[%s],input_data=[%s],vnfm_id=[%s]", request.data, input_data, vnfm_id) + resp = do_createvnf(vnfm_id, input_data) + logger.debug("do_createvnf: response data=[%s]", resp) + logger.debug("Create vnf end!") + + logger.debug("Instantiate vnf start!") vnfInstanceId = resp["vnfInstanceId"] - logger.info("[%s]vnfInstanceId=%s", fun_name(), vnfInstanceId) input_data = {} input_data["flavourId"] = ignorcase_get(request.data, "flavourId") input_data["extVirtualLinks"] = ignorcase_get(request.data, "extVirtualLink") - input_data["additionalParams"] = ignorcase_get(request.data, "additionalParams") - input_data["flavourId"] = ignorcase_get(request.data, "flavourId") - ret, resp = do_instvnf(vnfInstanceId, request, input_data, vnfm_id) - if ret != 0: - return resp - resp_data = {"jobId":"", "vnfInstanceId":""} - resp_data["vnfInstanceId"] = vnfInstanceId - resp_data["jobId"] = resp["vnfLcOpId"] - except Exception as e: - logger.error("Error occurred when instantiating VNF") - raise e - return Response(data=resp_data, status=status.HTTP_201_CREATED) + input_data["additionalParams"] = ignorcase_get(request.data, "additionalParam") + logger.debug("do_instvnf: vnfInstanceId=[%s],request data=[%s],input_data=[%s],vnfm_id=[%s]", + vnfInstanceId, request.data, input_data, vnfm_id) + resp = do_instvnf(vnfInstanceId, vnfm_id, input_data) + logger.debug("do_instvnf: response data=[%s]", resp) + resp_data = { + "vnfInstanceId": vnfInstanceId, + "jobId": ignorcase_get(resp, "vnfLcOpId") + } + logger.debug("Instantiate vnf end!") + return Response(data=resp_data, status=status.HTTP_201_CREATED) + except GvnfmDriverException as e: + logger.error('instantiate vnf failed, detail message: %s' % e.message) + return Response(data={'error': e.message}, status=status.HTTP_500_INTERNAL_SERVER_ERROR) + except: + logger.error(traceback.format_exc()) + return Response(data={'error': 'unexpected exception'}, status=status.HTTP_500_INTERNAL_SERVER_ERROR) @api_view(http_method_names=['POST']) def terminate_vnf(request, *args, **kwargs): + logger.debug("terminate_vnf--post::> %s" % request.data) + logger.info("Terminate vnf begin!") vnfm_id = ignorcase_get(kwargs, "vnfmid") vnfInstanceId = ignorcase_get(kwargs, "vnfInstanceId") try: input_data = {} input_data["terminationType"] = ignorcase_get(request.data, "terminationType") input_data["gracefulTerminationTimeout"] = ignorcase_get(request.data, "gracefulTerminationTimeout") - ret, resp = do_terminatevnf(request, input_data, vnfm_id, vnfInstanceId) - if ret != 0: - return resp + logger.debug("do_terminatevnf: vnfm_id=[%s],vnfInstanceId=[%s],input_data=[%s]", + vnfm_id, vnfInstanceId, input_data) + resp = do_terminatevnf(vnfm_id, vnfInstanceId, input_data) + logger.debug("terminate_vnf: response data=[%s]", resp) + jobId = ignorcase_get(resp, "vnfLcOpId") gracefulTerminationTimeout = ignorcase_get(request.data, "gracefulTerminationTimeout") - ret, response = wait4job(vnfm_id,jobId,gracefulTerminationTimeout) - if ret != 0: - return response - ret, resp = do_deletevnf(request, vnfm_id, vnfInstanceId) - if ret != 0: - return resp - except Exception as e: - logger.error("Error occurred when terminating VNF") - raise e - return Response(data=resp, status=status.HTTP_204_NO_CONTENT) + logger.debug("wait4job: vnfm_id=[%s],jobId=[%s],gracefulTerminationTimeout=[%s]", + vnfm_id, jobId, gracefulTerminationTimeout) + resp = wait4job(vnfm_id, jobId, gracefulTerminationTimeout) + logger.info("[wait4job] response=[%s]", resp) + + logger.debug("Delete vnf start!") + logger.debug("do_deletevnf: vnfm_id=[%s],vnfInstanceId=[%s],request data=[%s]", + vnfm_id, vnfInstanceId, request.data) + resp = do_deletevnf(vnfm_id, vnfInstanceId, request.data) + logger.debug("do_deletevnf: response data=[%s]", resp) + logger.debug("Delete vnf end!") + + return Response(data=resp, status=status.HTTP_204_NO_CONTENT) + except GvnfmDriverException as e: + logger.error('Terminate vnf failed, detail message: %s' % e.message) + return Response(data={'error': e.message}, status=status.HTTP_500_INTERNAL_SERVER_ERROR) + except: + logger.error(traceback.format_exc()) + return Response(data={'error': 'unexpected exception'}, status=status.HTTP_500_INTERNAL_SERVER_ERROR) @api_view(http_method_names=['GET']) @@ -220,8 +243,9 @@ def mapping_conv(keyword_map, rest_return): resp_data[param] = ignorcase_get(rest_return, param) return resp_data + def fun_name(): - return "=================%s==================" % inspect.stack()[1][3] + return "=========%s=========" % inspect.stack()[1][3] def ignorcase_get(args, key): @@ -240,105 +264,126 @@ def ignorcase_get(args, key): def get_vnfminfo_from_nslcm(vnfm_id): ret = req_by_msb("api/aai-esr-server/v1/vnfms/%s" % vnfm_id, "GET") if ret[0] != 0: - return 255, Response(data={'error': ret[1]}, status=ret[2]) - vnfm_info = json.JSONDecoder().decode(ret[1]) - logger.debug("[%s] vnfm_info=%s", fun_name(), vnfm_info) - return 0, vnfm_info - - -def wait4job(vnfm_id,jobId,gracefulTerminationTimeout): - begin_time = time.time() - try: - ret, vnfm_info = get_vnfminfo_from_nslcm(vnfm_id) - if ret != 0: - return 255, Response(data={"error":"Fail to get VNFM!"}, status=status.HTTP_412_PRECONDITION_FAILED) - - responseId = None - while ret == 0: - cur_time = time.time() - if gracefulTerminationTimeout and (cur_time - begin_time > gracefulTerminationTimeout): - return 255, Response(data={"error":"Fail to terminate VNF!"}, status=status.HTTP_408_REQUEST_TIMEOUT) - ret = call_vnfm("api/vnflcm/v1/vnf_lc_ops/%s?responseId=%s" % (jobId, responseId), "GET", vnfm_info) - if ret[0] != 0: - return 255, Response(data={"error":"Fail to get job status!"}, status=status.HTTP_412_PRECONDITION_FAILED) - if json.JSONDecoder().decode(ret[2]) != 200: - return 255, Response(data={"error":"Fail to get job status!"}, status=status.HTTP_412_PRECONDITION_FAILED) - job_info = json.JSONDecoder().decode(ret[1]) - responseId = ignorcase_get(ignorcase_get(job_info, "VnfLcOpResponseDescriptor"), "responseId") - progress = ignorcase_get(ignorcase_get(job_info, "VnfLcOpResponseDescriptor"), "progress") - if progress == "100": - return 0, Response(data={"success":"success"}, status=status.HTTP_204_NO_CONTENT) - except Exception as e: - logger.error("Error occurred when do_createvnf") - return 255, Response(data={"error":"Exception caught! Fail to get job status!"}, status=status.HTTP_412_PRECONDITION_FAILED) - - -def do_createvnf(request, data, vnfm_id): - logger.debug("[%s] request.data=%s", fun_name(), request.data) - try: - ret, vnfm_info = get_vnfminfo_from_nslcm(vnfm_id) - if ret != 0: - return ret, vnfm_info - ret = call_vnfm("api/vnflcm/v1/vnf_instances", "POST", vnfm_info, data) - logger.debug("[%s] call_req ret=%s", fun_name(), ret) + logger.error("Status code is %s, detail is %s.", ret[2], ret[1]) + raise GvnfmDriverException("Failed to query vnfm(%s) from nslcm." % vnfm_id) + return json.JSONDecoder().decode(ret[1]) + + +# def wait4job(vnfm_id, jobId, gracefulTerminationTimeout): +# begin_time = time.time() +# try: +# logger.debug("[wait4job] vnfm_id=[%s],jobId=[%s],gracefulTerminationTimeout=[%s]", +# vnfm_id, jobId, gracefulTerminationTimeout) +# vnfm_info = get_vnfminfo_from_nslcm(vnfm_id) +# logger.debug("[do_terminatevnf] vnfm_info=[%s]", vnfm_info) +# +# ret, vnfm_info = get_vnfminfo_from_nslcm(vnfm_id) +# if ret != 0: +# return 255, Response(data={"error":"Fail to get VNFM!"}, status=status.HTTP_412_PRECONDITION_FAILED) +# +# responseId = None +# while ret == 0: +# cur_time = time.time() +# if gracefulTerminationTimeout and (cur_time - begin_time > gracefulTerminationTimeout): +# return 255, Response(data={"error":"Fail to terminate VNF!"}, status=status.HTTP_408_REQUEST_TIMEOUT) +# ret = call_vnfm("api/vnflcm/v1/vnf_lc_ops/%s?responseId=%s" % (jobId, responseId), "GET", vnfm_info) +# if ret[0] != 0: +# return 255, Response(data={"error":"Fail to get job status!"}, status=status.HTTP_412_PRECONDITION_FAILED) +# if json.JSONDecoder().decode(ret[2]) != 200: +# return 255, Response(data={"error":"Fail to get job status!"}, status=status.HTTP_412_PRECONDITION_FAILED) +# job_info = json.JSONDecoder().decode(ret[1]) +# responseId = ignorcase_get(ignorcase_get(job_info, "VnfLcOpResponseDescriptor"), "responseId") +# progress = ignorcase_get(ignorcase_get(job_info, "VnfLcOpResponseDescriptor"), "progress") +# if progress == "100": +# return 0, Response(data={"success":"success"}, status=status.HTTP_204_NO_CONTENT) +# except Exception as e: +# logger.error("Error occurred when do_createvnf") +# return 255, Response(data={"error":"Exception caught! Fail to get job status!"}, status=status.HTTP_412_PRECONDITION_FAILED) + +def wait4job(vnfm_id, job_id, gracefulTerminationTimeout=1200, retry_count=60, interval_second=3): + logger.debug("[wait4job] vnfm_id=[%s],jobId=[%s],gracefulTerminationTimeout=[%s]", + vnfm_id, job_id, gracefulTerminationTimeout) + count = 0 + response_id, new_response_id = 0, 0 + job_end_normal, job_timeout = False, True + vnfm_info = get_vnfminfo_from_nslcm(vnfm_id) + logger.debug("[do_terminatevnf] vnfm_info=[%s]", vnfm_info) + + while count < retry_count: + count = count + 1 + time.sleep(interval_second) + ret = call_vnfm("api/vnflcm/v1/vnf_lc_ops/%s?responseId=%s" % (job_id, response_id), "GET", vnfm_info) if ret[0] != 0: - return 255, Response(data={'error': ret[1]}, status=ret[2]) - resp = json.JSONDecoder().decode(ret[1]) - except Exception as e: - logger.error("Error occurred when do_createvnf") - raise e - return 0, resp + logger.error("Failed to query job: %s:%s", ret[2], ret[1]) + continue + job_result = json.JSONDecoder().decode(ret[1]) + if "responseDescriptor" not in job_result: + logger.error("Job(%s) does not exist.", job_id) + continue + progress = job_result["responseDescriptor"]["progress"] + new_response_id = job_result["responseDescriptor"]["responseId"] + job_desc = job_result["responseDescriptor"]["statusDescription"] + if new_response_id != response_id: + logger.debug("%s:%s:%s", progress, new_response_id, job_desc) + response_id = new_response_id + count = 0 + if progress == 255: + job_timeout = False + logger.error("Job(%s) failed: %s", job_id, job_desc) + break + elif progress == 100: + job_end_normal, job_timeout = True, False + logger.info("Job(%s) ended normally", job_id) + return {"success": "success"} + if job_timeout: + logger.error("Job(%s) timeout", job_id) + raise GvnfmDriverException("Fail to get job status!") + + +def do_createvnf(vnfm_id, data): + logger.debug("[%s] request.data=%s", fun_name(), data) + vnfm_info = get_vnfminfo_from_nslcm(vnfm_id) + logger.debug("[do_createvnf] vnfm_info=[%s]", vnfm_info) + ret = call_vnfm("api/vnflcm/v1/vnf_instances", "POST", vnfm_info, data) + logger.debug("[%s] call_req ret=%s", fun_name(), ret) + if ret[0] != 0: + logger.error("Status code is %s, detail is %s.", ret[2], ret[1]) + raise GvnfmDriverException('Failed to create vnf.') + return json.JSONDecoder().decode(ret[1]) -def do_instvnf(vnfInstanceId, request, data, vnfm_id): - logger.debug("[%s] request.data=%s", fun_name(), request.data) - try: - ret, vnfm_info = get_vnfminfo_from_nslcm(vnfm_id) - if ret != 0: - return ret, vnfm_info - ret = call_vnfm("api/vnflcm/v1/vnf_instances/%s/instantiate" % vnfInstanceId, "POST", vnfm_info, data) - logger.debug("[%s] call_req ret=%s", fun_name(), ret) - if ret[0] != 0: - return 255, Response(data={'error': ret[1]}, status=ret[2]) - resp = json.JSONDecoder().decode(ret[1]) - except Exception as e: - logger.error("Error occurred when do_instvnf") - raise e - return 0, resp +def do_instvnf(vnfInstanceId, vnfm_id, data): + logger.debug("[%s] request.data=%s", fun_name(), data) + vnfm_info = get_vnfminfo_from_nslcm(vnfm_id) + logger.debug("[do_instvnf] vnfm_info=[%s]", vnfm_info) + ret = call_vnfm("api/vnflcm/v1/vnf_instances/%s/instantiate" % vnfInstanceId, "POST", vnfm_info, data) + logger.debug("[%s] call_req ret=%s", fun_name(), ret) + if ret[0] != 0: + logger.error("Status code is %s, detail is %s.", ret[2], ret[1]) + raise GvnfmDriverException('Failed to inst vnf.') + return json.JSONDecoder().decode(ret[1]) -def do_terminatevnf(request, data, vnfm_id, vnfInstanceId): - logger.debug("[%s] request.data=%s", fun_name(), request.data) - try: - ret, vnfm_info = get_vnfminfo_from_nslcm(vnfm_id) - if ret != 0: - return ret,vnfm_info - ret = call_vnfm("api/vnflcm/v1/vnf_instances/%s/terminate"% vnfInstanceId,"POST", vnfm_info, data) - if ret[0] != 0: - return 255, Response(data={'error': ret[1]}, status=ret[2]) - resp_data = json.JSONDecoder().decode(ret[1]) - logger.debug("[%s]resp_data=%s", fun_name(), resp_data) - except Exception as e: - logger.error("Error occurred when do_terminatevnf") - raise e - return 0, resp_data +def do_terminatevnf(vnfm_id, vnfInstanceId, data): + logger.debug("[%s] request.data=%s", fun_name(), data) + vnfm_info = get_vnfminfo_from_nslcm(vnfm_id) + logger.debug("[do_terminatevnf] vnfm_info=[%s]", vnfm_info) + ret = call_vnfm("api/vnflcm/v1/vnf_instances/%s/terminate"% vnfInstanceId,"POST", vnfm_info, data) + if ret[0] != 0: + logger.error("Status code is %s, detail is %s.", ret[2], ret[1]) + raise GvnfmDriverException('Failed to terminate vnf.') + return json.JSONDecoder().decode(ret[1]) -def do_deletevnf(request, vnfm_id, vnfInstanceId): - logger.debug("[%s] request.data=%s", fun_name(), request.data) - try: - ret, vnfm_info = get_vnfminfo_from_nslcm(vnfm_id) - if ret != 0: - return ret, vnfm_info - ret = call_vnfm("api/vnflcm/v1/vnf_instances/%s" % vnfInstanceId, "DELETE", vnfm_info) - if ret[0] != 0: - return 255, Response(data={'error': ret[1]}, status=ret[2]) - resp_data = json.JSONDecoder().decode(ret[1]) - logger.debug("[%s]resp_data=%s", fun_name(), resp_data) - except Exception as e: - logger.error("Error occurred when do_deletevnf") - raise e - return 0, resp_data +def do_deletevnf(vnfm_id, vnfInstanceId, data): + logger.debug("[%s] request.data=%s", fun_name(), data) + vnfm_info = get_vnfminfo_from_nslcm(vnfm_id) + logger.debug("[do_deletevnf] vnfm_info=[%s]", vnfm_info) + ret = call_vnfm("api/vnflcm/v1/vnf_instances/%s" % vnfInstanceId, "DELETE", vnfm_info) + if ret[0] != 0: + logger.error("Status code is %s, detail is %s.", ret[2], ret[1]) + raise GvnfmDriverException('Failed to delete vnf.') + return json.JSONDecoder().decode(ret[1]) def do_queryvnf(request, vnfm_id, vnfInstanceId): |