X-Git-Url: https://osm.etsi.org/gitweb/?a=blobdiff_plain;f=osm_lcm%2Fns.py;h=e6dec8290994d92adb6f7c6b0664d1398205313e;hb=e9198bbf3a564c67b6721bcd3b5c7aa0f9e805a0;hp=07faafe89f3530e3ce546a3e4102675d420f3882;hpb=acde94fe034c55a740a5ec883a2bab71a31c0b7c;p=osm%2FLCM.git diff --git a/osm_lcm/ns.py b/osm_lcm/ns.py index 07faafe..e6dec82 100644 --- a/osm_lcm/ns.py +++ b/osm_lcm/ns.py @@ -738,6 +738,9 @@ class NsLcm(LcmBase): else: timeout_ns_deploy = self.timeout.get("ns_deploy", self.timeout_ns_deploy) + # Check for and optionally request placement optimization. Database will be updated if placement activated + await self.do_placement(logging_text, db_nslcmop, db_vnfrs) + # deploy RO # get vnfds, instantiate at RO @@ -1353,6 +1356,37 @@ class NsLcm(LcmBase): self.logger.warn('Error writing configuration status={}, ns={}, vca_index={}: {}' .format(status, nsr_id, vca_index, e)) + async def do_placement(self, logging_text, db_nslcmop, db_vnfrs): + placement_engine = deep_get(db_nslcmop, ('operationParams', 'placement-engine')) + if placement_engine == "PLA": + self.logger.debug(logging_text + "Invoke placement optimization for nslcmopId={}".format(db_nslcmop['id'])) + await self.msg.aiowrite("pla", "get_placement", {'nslcmopId': db_nslcmop['_id']}, loop=self.loop) + db_poll_interval = 5 + wait = db_poll_interval * 4 + pla_result = None + while not pla_result and wait >= 0: + await asyncio.sleep(db_poll_interval) + wait -= db_poll_interval + db_nslcmop = self.db.get_one("nslcmops", {"_id": db_nslcmop["_id"]}) + pla_result = deep_get(db_nslcmop, ('_admin', 'pla')) + + if not pla_result: + raise LcmException("Placement timeout for nslcmopId={}".format(db_nslcmop['id'])) + + for pla_vnf in pla_result['vnf']: + vnfr = db_vnfrs.get(pla_vnf['member-vnf-index']) + if not pla_vnf.get('vimAccountId') or not vnfr: + continue + self.db.set_one("vnfrs", {"_id": vnfr["_id"]}, {"vim-account-id": pla_vnf['vimAccountId']}) + return + + def update_nsrs_with_pla_result(self, params): + try: + nslcmop_id = deep_get(params, ('placement', 'nslcmopId')) + self.update_db_2("nslcmops", nslcmop_id, {"_admin.pla": params.get('placement')}) + except Exception as e: + self.logger.warn('Update failed for nslcmop_id={}:{}'.format(nslcmop_id, e)) + async def instantiate(self, nsr_id, nslcmop_id): """ @@ -2075,37 +2109,39 @@ class NsLcm(LcmBase): task = asyncio.ensure_future( self.k8sclusterjuju.install(cluster_uuid=cluster_uuid, kdu_model=kdumodel, atomic=True, params=desc_params, - db_dict=db_dict, timeout=600) + db_dict=db_dict, timeout=600, + kdu_name=kdur["kdu-name"]) ) pending_tasks[task] = "_admin.deployed.K8s.{}.".format(index) index += 1 - if not pending_tasks: - return - self.logger.debug(logging_text + 'Waiting for terminate pending tasks...') - pending_list = list(pending_tasks.keys()) - while pending_list: - done_list, pending_list = await asyncio.wait(pending_list, timeout=30*60, - return_when=asyncio.FIRST_COMPLETED) - if not done_list: # timeout - for task in pending_list: - db_nsr_update[pending_tasks(task) + "detailed-status"] = "Timeout" - deployed_ok = False - break - for task in done_list: - exc = task.exception() - if exc: - db_nsr_update[pending_tasks[task] + "detailed-status"] = "{}".format(exc) - deployed_ok = False - else: - db_nsr_update[pending_tasks[task] + "kdu-instance"] = task.result() + + if pending_tasks: + self.logger.debug(logging_text + 'Waiting for terminate pending tasks...') + pending_list = list(pending_tasks.keys()) + while pending_list: + done_list, pending_list = await asyncio.wait(pending_list, timeout=30*60, + return_when=asyncio.FIRST_COMPLETED) + if not done_list: # timeout + for task in pending_list: + db_nsr_update[pending_tasks(task) + "detailed-status"] = "Timeout" + deployed_ok = False + break + for task in done_list: + exc = task.exception() + if exc: + db_nsr_update[pending_tasks[task] + "detailed-status"] = "{}".format(exc) + deployed_ok = False + else: + db_nsr_update[pending_tasks[task] + "kdu-instance"] = task.result() if not deployed_ok: raise LcmException('Cannot deploy KDUs') except Exception as e: - self.logger.critical(logging_text + "Exit Exception {} while '{}': {}".format(type(e).__name__, step, e)) - raise LcmException("{} Exit Exception {} while '{}': {}".format(logging_text, type(e).__name__, step, e)) + msg = "{} Exit Exception {} while '{}': {}".format(logging_text, type(e).__name__, step, e) + self.logger.error(msg) + raise LcmException(msg) finally: if db_nsr_update: self.update_db_2("nsrs", nsr_id, db_nsr_update)