X-Git-Url: https://gerrit.onap.org/r/gitweb?a=blobdiff_plain;f=lcm%2Flcm%2Fnf%2Fbiz%2Finstantiate_vnf.py;h=788e582c9ff09dd4db70890be18472932af12287;hb=cc4fa321dc9addf090ac889ad8c9a8297f84be6a;hp=606dbab084e26e6f519c27af63344d6d6f4bf927;hpb=49b87c030e4ae60b141268f9c2f89b8010acd050;p=vfc%2Fgvnfm%2Fvnflcm.git diff --git a/lcm/lcm/nf/biz/instantiate_vnf.py b/lcm/lcm/nf/biz/instantiate_vnf.py index 606dbab0..788e582c 100644 --- a/lcm/lcm/nf/biz/instantiate_vnf.py +++ b/lcm/lcm/nf/biz/instantiate_vnf.py @@ -19,8 +19,9 @@ from threading import Thread from lcm.pub.database.models import NfInstModel from lcm.pub.exceptions import NFLCMException +from lcm.pub.exceptions import NFLCMExceptionConflict from lcm.pub.msapi.gvnfmdriver import prepare_notification_data -# from lcm.pub.msapi.gvnfmdriver import notify_lcm_to_nfvo +from lcm.pub.msapi.gvnfmdriver import notify_lcm_to_nfvo from lcm.pub.msapi.sdc_run_catalog import query_vnfpackage_by_id from lcm.pub.utils.jobutil import JobUtil from lcm.pub.utils.timeutil import now_time @@ -29,7 +30,12 @@ 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 CHANGE_TYPE, GRANT_TYPE, OPERATION_TYPE +from lcm.nf.const import OPERATION_TASK +from lcm.nf.const import OPERATION_STATE_TYPE +from lcm.nf.const import SUB_OPERATION_TASK from lcm.nf.biz import common +from .operate_vnf_lcm_op_occ import VnfLcmOpOcc +from lcm.pub.verifyvnfd import verifyvnfd logger = logging.getLogger(__name__) @@ -40,23 +46,62 @@ class InstantiateVnf(Thread): self.data = data self.nf_inst_id = nf_inst_id self.job_id = job_id - self.vim_id = ignore_case_get(ignore_case_get(self.data, "additionalParams"), "vimId") + self.vim_id = ignore_case_get( + ignore_case_get( + self.data, + "additionalParams" + ), + "vimId" + ) self.grant_type = GRANT_TYPE.INSTANTIATE + self.lcm_op_occ = VnfLcmOpOcc( + vnf_inst_id=nf_inst_id, + lcm_op_id=job_id, + operation=OPERATION_TYPE.INSTANTIATE, + task=OPERATION_TASK.INSTANTIATE + ) + self.pre_deal() def run(self): try: self.inst_pre() + self.lcm_op_occ.notify_lcm(OPERATION_STATE_TYPE.STARTING) self.apply_grant() + self.lcm_op_occ.upd( + sub_operation=SUB_OPERATION_TASK.GRANTED, + operation_state=OPERATION_STATE_TYPE.PROCESSING + ) + self.lcm_op_occ.notify_lcm(OPERATION_STATE_TYPE.PROCESSING) self.create_res() self.lcm_notify() - JobUtil.add_job_status(self.job_id, 100, "Instantiate Vnf success.") + JobUtil.add_job_status( + self.job_id, + 100, + "Instantiate Vnf success." + ) + self.lcm_op_occ.upd( + sub_operation=SUB_OPERATION_TASK.SUCCESS, + operation_state=OPERATION_STATE_TYPE.COMPLETED + ) except NFLCMException as e: - self.vnf_inst_failed_handle(e.message) + self.vnf_inst_failed_handle(e.args[0]) + except NFLCMExceptionConflict as e: + self.vnf_inst_failed_handle(e.args[0]) except Exception as e: - logger.error(e.message) + logger.error(str(e)) logger.error(traceback.format_exc()) self.vnf_inst_failed_handle('unexpected exception') + def pre_deal(self): + logger.debug("Start pre deal for VNF instantiate_vnf task") + + vnf_is_in_processing, vnf_op = self.lcm_op_occ.is_in_processing() + if vnf_is_in_processing: + raise NFLCMExceptionConflict('VNF(%s) %s in processing.' % ( + self.nf_inst_id, vnf_op + )) + self.lcm_op_occ.add() + def inst_pre(self): vnf_insts = NfInstModel.objects.filter(nfinstid=self.nf_inst_id) if not vnf_insts.exists(): @@ -71,13 +116,14 @@ class InstantiateVnf(Thread): input_parameters = [] inputs = ignore_case_get(self.data, "additionalParams") if inputs: - if isinstance(inputs, (str, unicode)): + if isinstance(inputs, str): inputs = json.loads(inputs) - for key, val in inputs.items(): + for key, val in list(inputs.items()): input_parameters.append({"key": key, "value": val}) vnf_package = query_vnfpackage_by_id(self.vnfd_id) pkg_info = ignore_case_get(vnf_package, "packageInfo") self.vnfd_info = json.loads(ignore_case_get(pkg_info, "vnfdModel")) + verifyvnfd.verify(self.vnfd_info) self.update_cps() metadata = ignore_case_get(self.vnfd_info, "metadata") @@ -114,19 +160,30 @@ class InstantiateVnf(Thread): def apply_grant(self): vdus = ignore_case_get(self.vnfd_info, "vdus") - 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) + 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) self.set_location(apply_result) logger.info('VnfdInfo = %s' % self.vnfd_info) - NfInstModel.objects.filter(nfinstid=self.nf_inst_id).update(status='INSTANTIATED', lastuptime=now_time()) + NfInstModel.objects.filter(nfinstid=self.nf_inst_id).update( + status='INSTANTIATED', + lastuptime=now_time() + ) JobUtil.add_job_status(self.job_id, 20, 'Nf instancing apply grant finish') logger.info("Nf instancing apply grant finish") def create_res(self): logger.info("Create resource start") vim_cache, res_cache = {}, {} - adaptor.create_vim_res(self.vnfd_info, self.do_notify, vim_cache=vim_cache, res_cache=res_cache) + adaptor.create_vim_res( + self.vnfd_info, + self.do_notify, + vim_cache=vim_cache, + res_cache=res_cache + ) JobUtil.add_job_status(self.job_id, 70, '[NF instantiation] create resource finish') NfInstModel.objects.filter(nfinstid=self.nf_inst_id).\ update(vimInfo=json.dumps(vim_cache), @@ -134,16 +191,36 @@ class InstantiateVnf(Thread): logger.info("Create resource finish") def lcm_notify(self): - notification_content = prepare_notification_data(self.nf_inst_id, self.job_id, CHANGE_TYPE.ADDED, OPERATION_TYPE.INSTANTIATE) + notification_content = prepare_notification_data( + self.nf_inst_id, + self.job_id, + CHANGE_TYPE.ADDED, + OPERATION_TYPE.INSTANTIATE + ) 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) + try: + resp = notify_lcm_to_nfvo(json.dumps(notification_content)) + logger.info('Lcm notify end, response %s' % resp) + except Exception as e: + logger.error("Lcm instantiate notify failed: %s", e.args[0]) NotificationsUtil().send_notification(notification_content) def vnf_inst_failed_handle(self, error_msg): logger.error('VNF instantiation failed, detail message: %s' % error_msg) - NfInstModel.objects.filter(nfinstid=self.nf_inst_id).update(status='NOT_INSTANTIATED', lastuptime=now_time()) + NfInstModel.objects.filter(nfinstid=self.nf_inst_id).update( + status='NOT_INSTANTIATED', + lastuptime=now_time() + ) + self.lcm_op_occ.notify_lcm(OPERATION_STATE_TYPE.FAILED, error_msg) JobUtil.add_job_status(self.job_id, 255, error_msg) + self.lcm_op_occ.upd( + sub_operation=SUB_OPERATION_TASK.ERROR, + operation_state=OPERATION_STATE_TYPE.FAILED, + error={ + "status": 500, + "detail": error_msg + } + ) def do_notify(self, res_type, ret): logger.info('Creating [%s] resource' % res_type) @@ -163,7 +240,6 @@ class InstantiateVnf(Thread): def set_location(self, apply_result): vim_connections = ignore_case_get(apply_result, "vimConnections") vnfid = ignore_case_get(apply_result, "vnfInstanceId") - directive = ignore_case_get(apply_result, "directive") vim_assets = ignore_case_get(apply_result, "vimAssets") access_info = ignore_case_get(vim_connections[0], "accessInfo") tenant = ignore_case_get(access_info, "tenant") @@ -171,12 +247,15 @@ class InstantiateVnf(Thread): cloud_owner, cloud_regionid = vimid.split("_") vdu_info = [] - for flavor in ignore_case_get(vim_assets, "vimComputeResourceFlavour"): + for flavor in ignore_case_get(vim_assets, "computeResourceFlavours"): + oof_vimid = flavor["vimConnectionId"] + if oof_vimid and oof_vimid != "none": + vimid = oof_vimid vdu_info.append({"vduName": flavor["resourceProviderId"], - "flavorName": flavor["vimFlavourId"], - "directive": directive}) + "flavorId": flavor["vimFlavourId"], + "vimid": vimid}) - for resource_type in ['vdus', 'vls']: + for resource_type in ['vdus', 'vls', 'cps', 'volume_storages']: for resource in ignore_case_get(self.vnfd_info, resource_type): if "location_info" in resource["properties"]: resource["properties"]["location_info"]["vimid"] = vimid