diff options
Diffstat (limited to 'lcm')
-rw-r--r-- | lcm/lcm/nf/biz/heal_vnf.py | 79 |
1 files changed, 68 insertions, 11 deletions
diff --git a/lcm/lcm/nf/biz/heal_vnf.py b/lcm/lcm/nf/biz/heal_vnf.py index bf8e34a0..4b503424 100644 --- a/lcm/lcm/nf/biz/heal_vnf.py +++ b/lcm/lcm/nf/biz/heal_vnf.py @@ -17,16 +17,19 @@ 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 notify_lcm_to_nfvo, prepare_notification_data from lcm.pub.utils.jobutil import JobUtil from lcm.pub.utils.timeutil import now_time 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, GRANT_TYPE, HEAL_ACTION_TYPE, CHANGE_TYPE, OPERATION_TYPE +from lcm.nf.const import VNF_STATUS, GRANT_TYPE, OPERATION_STATE_TYPE, LCM_NOTIFICATION_STATUS +from lcm.nf.const import CHANGE_TYPE, OPERATION_TYPE, HEAL_ACTION_TYPE from lcm.nf.biz import common +import uuid +from lcm.pub.utils.notificationsutil import NotificationsUtil + logger = logging.getLogger(__name__) @@ -49,16 +52,20 @@ class HealVnf(Thread): def run(self): try: self.heal_pre() + self.lcm_notify(LCM_NOTIFICATION_STATUS.START, OPERATION_STATE_TYPE.STARTING) self.apply_grant() + self.lcm_notify(LCM_NOTIFICATION_STATUS.RESULT, OPERATION_STATE_TYPE.PROCESSING) self.heal_resource() JobUtil.add_job_status(self.job_id, 100, "Heal Vnf success.") NfInstModel.objects.filter(nfinstid=self.nf_inst_id).update(status='INSTANTIATED', lastuptime=now_time()) - self.lcm_notify() + self.lcm_notify(LCM_NOTIFICATION_STATUS.RESULT, OPERATION_STATE_TYPE.COMPLETED) except NFLCMException as e: logger.error(e.message) + self.lcm_notify(LCM_NOTIFICATION_STATUS.RESULT, OPERATION_STATE_TYPE.FAILED, str(e)) self.vnf_heal_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_heal_failed_handle(traceback.format_exc()) def heal_pre(self): @@ -76,7 +83,7 @@ class HealVnf(Thread): def apply_grant(self): if self.action == HEAL_ACTION_TYPE.RESTART: - self.vdu = VmInstModel.objects.filter(instid=self.nf_inst_id, is_predefined=1, vmid=self.vm_id, vmname=self.vm_name) + self.vdu = VmInstModel.objects.filter(instid=self.nf_inst_id, vmid=self.vm_id, vmname=self.vm_name) if not self.vdu: raise NFLCMException("VNF Vm does not exist.") self.vimid = self.vdu[0].vimid @@ -105,13 +112,63 @@ class HealVnf(Thread): resource_save_method = getattr(common, res_type + '_save') resource_save_method(self.job_id, self.nf_inst_id, ret) - def lcm_notify(self): - notification_content = prepare_notification_data(self.nf_inst_id, self.job_id, CHANGE_TYPE.MODIFIED, OPERATION_TYPE.HEAL) - 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 vnf_heal_failed_handle(self, error_msg): logger.error('VNF Healing failed, detail message: %s' % error_msg) NfInstModel.objects.filter(nfinstid=self.nf_inst_id).update(status=VNF_STATUS.FAILED, lastuptime=now_time()) JobUtil.add_job_status(self.job_id, 255, error_msg) + + 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 prepareNotificationData(self, status, opState, err=None): + affected_vnfcs = [] + if status == LCM_NOTIFICATION_STATUS.RESULT and opState == OPERATION_STATE_TYPE.COMPLETED: + chtype = "" + if self.action == HEAL_ACTION_TYPE.START: + chtype = CHANGE_TYPE.ADDED + else: + chtype = CHANGE_TYPE.MODIFIED + vnfcs = VNFCInstModel.objects.filter(instid=self.nf_inst_id, vmid=self.vm_id) + vm_resource = {} + vm = VmInstModel.objects.filter(instid=self.nf_inst_id, vmid=self.vm_id) + if vm: + vm_resource = { + 'vimConnectionId': vm[0].vimid, + 'resourceId': vm[0].resourceid, + 'vimLevelResourceType': 'vm' + } + affected_vnfcs.append({ + 'id': vnfcs[0].vnfcinstanceid, + 'vduId': vnfcs[0].vduid, + 'changeType': chtype, + '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.HEAL, + "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 |