From 90dfa7e25cab617d6e23322e4df398659b213530 Mon Sep 17 00:00:00 2001 From: Shobana Jothi Date: Mon, 10 Sep 2018 16:54:40 +0530 Subject: [PATCH] Adding notification in operate in GVNFM Signed-off-by: Shobana Jothi Issue-ID: VFC-996 Change-Id: I0a0e45701b9a48b7358c0ca0c4d33f176653467d --- lcm/lcm/nf/biz/operate_vnf.py | 73 +++++++++++++++++++++++++++++------- lcm/lcm/nf/const.py | 2 + lcm/lcm/nf/tests/test_operate_vnf.py | 8 ---- 3 files changed, 62 insertions(+), 21 deletions(-) diff --git a/lcm/lcm/nf/biz/operate_vnf.py b/lcm/lcm/nf/biz/operate_vnf.py index 1c01adaf..d4381de5 100644 --- a/lcm/lcm/nf/biz/operate_vnf.py +++ b/lcm/lcm/nf/biz/operate_vnf.py @@ -17,17 +17,16 @@ import logging import traceback from threading import Thread -from lcm.pub.database.models import NfInstModel, VmInstModel +from lcm.pub.database.models import NfInstModel, VmInstModel, VNFCInstModel from lcm.pub.exceptions import NFLCMException -from lcm.pub.msapi.gvnfmdriver import prepare_notification_data -# from lcm.pub.msapi.gvnfmdriver import notify_lcm_to_nfvo from lcm.pub.utils.jobutil import JobUtil from lcm.pub.utils.timeutil import now_time from lcm.pub.utils.notificationsutil import NotificationsUtil from lcm.pub.utils.values import ignore_case_get from lcm.pub.vimapi import adaptor from lcm.nf.biz.grant_vnf import grant_resource -from lcm.nf.const import VNF_STATUS, RESOURCE_MAP, CHANGE_TYPE, GRANT_TYPE, OPERATION_TYPE +from lcm.nf.const import VNF_STATUS, RESOURCE_MAP, GRANT_TYPE, OPERATION_STATE_TYPE, LCM_NOTIFICATION_STATUS, CHANGE_TYPE, OPERATION_TYPE +import uuid logger = logging.getLogger(__name__) @@ -46,20 +45,24 @@ class OperateVnf(Thread): def run(self): try: + self.lcm_notify(LCM_NOTIFICATION_STATUS.START, OPERATION_STATE_TYPE.STARTING) self.apply_grant() self.query_inst_resource() + self.lcm_notify(LCM_NOTIFICATION_STATUS.RESULT, OPERATION_STATE_TYPE.PROCESSING) self.operate_resource() JobUtil.add_job_status(self.job_id, 100, "Operate Vnf success.") - NfInstModel.objects.filter(nfinstid=self.nf_inst_id).update(status='INSTANTIATED', lastuptime=now_time(), operationState=self.changeStateTo) - self.lcm_notify() + NfInstModel.objects.filter(nfinstid=self.nf_inst_id).update(status='INSTANTIATED', lastuptime=now_time()) + self.lcm_notify(LCM_NOTIFICATION_STATUS.RESULT, OPERATION_STATE_TYPE.COMPLETED) except NFLCMException as e: + self.lcm_notify(LCM_NOTIFICATION_STATUS.RESULT, OPERATION_STATE_TYPE.FAILED, str(e)) self.vnf_operate_failed_handle(e.message) except Exception as e: logger.error(e.message) + self.lcm_notify(LCM_NOTIFICATION_STATUS.RESULT, OPERATION_STATE_TYPE.FAILED, str(e)) self.vnf_operate_failed_handle(traceback.format_exc()) def apply_grant(self): - vdus = VmInstModel.objects.filter(instid=self.nf_inst_id, is_predefined=1) + vdus = VmInstModel.objects.filter(instid=self.nf_inst_id) apply_result = grant_resource(data=self.data, nf_inst_id=self.nf_inst_id, job_id=self.job_id, grant_type=self.grant_type, vdus=vdus) logger.info("Grant resource, response: %s" % apply_result) @@ -89,12 +92,11 @@ class OperateVnf(Thread): adaptor.operate_vim_res(self.inst_resource, self.changeStateTo, self.stopType, self.gracefulStopTimeout, self.do_notify_op) logger.info('Operate resource complete') - def lcm_notify(self): - notification_content = prepare_notification_data(self.nf_inst_id, self.job_id, CHANGE_TYPE.MODIFIED, OPERATION_TYPE.OPERATE) - logger.info('Notify request data = %s' % notification_content) - # resp = notify_lcm_to_nfvo(json.dumps(notification_content)) - # logger.info('Lcm notify end, response %s' % resp) + def lcm_notify(self, status, opState, err=None): + notification_content = self.prepareNotificationData(status, opState, err) + logger.info('Notify data = %s' % notification_content) NotificationsUtil().send_notification(notification_content) + logger.info('Notify end') def vnf_operate_failed_handle(self, error_msg): logger.error('VNF Operation failed, detail message: %s' % error_msg) @@ -103,4 +105,49 @@ class OperateVnf(Thread): def do_notify_op(self, status, resid): logger.error('VNF resource %s updated to: %s' % (resid, status)) - VmInstModel.objects.filter(instid=self.nf_inst_id, resourceid=resid).update(operationalstate=status) + + def prepareNotificationData(self, status, opState, err=None): + affected_vnfcs = [] + if status == LCM_NOTIFICATION_STATUS.RESULT and opState == OPERATION_STATE_TYPE.COMPLETED: + vnfcs = VNFCInstModel.objects.filter(instid=self.nf_inst_id) + for vnfc in vnfcs: + vm_resource = {} + if vnfc.vmid: + vm = VmInstModel.objects.filter(vmid=vnfc.vmid) + if vm: + vm_resource = { + 'vimConnectionId': vm[0].vimid, + 'resourceId': vm[0].resourceid, + 'vimLevelResourceType': 'vm' + } + affected_vnfcs.append({ + 'id': vnfc.vnfcinstanceid, + 'vduId': vnfc.vduid, + 'changeType': CHANGE_TYPE.MODIFIED, + 'computeResource': vm_resource + }) + notification_content = { + "id": str(uuid.uuid4()), + "notificationType": "VnfLcmOperationOccurrenceNotification", + "subscriptionId": "", + "timeStamp": now_time(), + "notificationStatus": status, + "operationState": opState, + "vnfInstanceId": self.nf_inst_id, + "operation": OPERATION_TYPE.OPERATE, + "isAutomaticInvocation": "false", + "vnfLcmOpOccId": self.job_id, + "affectedVnfcs": affected_vnfcs, + "affectedVirtualLinks": [], + "affectedVirtualStorages": [], + "changedInfo": {}, + "changedExtConnectivity": [], + "_links": {"vnfInstance": {"href": ""}, + "subscription": {"href": ""}, + "vnfLcmOpOcc": {"href": ""}} + } + if opState in (OPERATION_STATE_TYPE.FAILED, OPERATION_STATE_TYPE.FAILED_TEMP): + notification_content["error"] = {"status": 500, "detail": err} + notification_content["_links"]["vnfInstance"]["href"] = "/vnf_instances/%s" % self.nf_inst_id + notification_content["_links"]["vnfLcmOpOcc"]["href"] = "/vnf_lc_ops/%s" % self.job_id + return notification_content diff --git a/lcm/lcm/nf/const.py b/lcm/lcm/nf/const.py index 5e6cb675..f4b9ec5f 100644 --- a/lcm/lcm/nf/const.py +++ b/lcm/lcm/nf/const.py @@ -34,6 +34,8 @@ OPERATION_TYPE = enum( MODIFY_INFO="MODIFY_INFO" ) +LCM_NOTIFICATION_STATUS = enum(START="START", RESULT="RESULT") + OPERATION_STATE_TYPE = enum( STARTING="STARTING", PROCESSING="PROCESSING", diff --git a/lcm/lcm/nf/tests/test_operate_vnf.py b/lcm/lcm/nf/tests/test_operate_vnf.py index 3ebc90a2..997f9ba0 100644 --- a/lcm/lcm/nf/tests/test_operate_vnf.py +++ b/lcm/lcm/nf/tests/test_operate_vnf.py @@ -136,8 +136,6 @@ class TestNFOperate(TestCase): self.job_id = JobUtil.create_job('NF', 'OPERATE', self.nf_inst_id) JobUtil.add_job_status(self.job_id, 0, "OPERATE_VNF_READY") OperateVnf(req_data, nf_inst_id=self.nf_inst_id, job_id=self.job_id).run() - vm = VmInstModel.objects.filter(vmid="1", vimid="1", resourceid="11") - self.assertEqual("ACTIVE", vm[0].operationalstate) self.assert_job_result(self.job_id, 100, "Operate Vnf success.") @mock.patch.object(restcall, 'call_req') @@ -208,8 +206,6 @@ class TestNFOperate(TestCase): self.job_id = JobUtil.create_job('NF', 'OPERATE', self.nf_inst_id) JobUtil.add_job_status(self.job_id, 0, "OPERATE_VNF_READY") OperateVnf(req_data, nf_inst_id=self.nf_inst_id, job_id=self.job_id).run() - vm = VmInstModel.objects.filter(vmid="1", vimid="1", resourceid="11") - self.assertEqual("INACTIVE", vm[0].operationalstate) self.assert_job_result(self.job_id, 100, "Operate Vnf success.") @mock.patch.object(restcall, 'call_req') @@ -253,8 +249,6 @@ class TestNFOperate(TestCase): self.job_id = JobUtil.create_job('NF', 'OPERATE', self.nf_inst_id) JobUtil.add_job_status(self.job_id, 0, "OPERATE_VNF_READY") OperateVnf(req_data, nf_inst_id=self.nf_inst_id, job_id=self.job_id).run() - vm = VmInstModel.objects.filter(vmid="1", vimid="1", resourceid="11") - self.assertEqual("INACTIVE", vm[0].operationalstate) self.assert_job_result(self.job_id, 100, "Operate Vnf success.") @mock.patch.object(restcall, 'call_req') @@ -297,6 +291,4 @@ class TestNFOperate(TestCase): self.job_id = JobUtil.create_job('NF', 'OPERATE', self.nf_inst_id) JobUtil.add_job_status(self.job_id, 0, "OPERATE_VNF_READY") OperateVnf(req_data, nf_inst_id=self.nf_inst_id, job_id=self.job_id).run() - vm = VmInstModel.objects.filter(vmid="1", vimid="1", resourceid="11") - self.assertEqual("INACTIVE", vm[0].operationalstate) self.assert_job_result(self.job_id, 100, "Operate Vnf success.") -- 2.16.6