+ if exc and db_nslcmop:
+ db_nslcmop_update = {
+ "detailed-status": "FAILED {}: {}".format(step, exc),
+ "operationState": "FAILED",
+ "statusEnteredTime": time(),
+ }
+ if db_nslcmop_update:
+ self.update_db_2("nslcmops", nslcmop_id, db_nslcmop_update)
+ if db_nsr_update:
+ self.update_db_2("nsrs", nsr_id, db_nsr_update)
+
+ async def ns_action(self, nsr_id, nslcmop_id):
+ logging_text = "Task ns={} action={} ".format(nsr_id, nslcmop_id)
+ self.logger.debug(logging_text + "Enter")
+ # get all needed from database
+ db_nsr = None
+ db_nslcmop = None
+ db_nslcmop_update = None
+ exc = None
+ step = "Getting nsr, nslcmop"
+ try:
+ db_nslcmop = self.db.get_one("nslcmops", {"_id": nslcmop_id})
+ db_nsr = self.db.get_one("nsrs", {"_id": nsr_id})
+ nsr_lcm = db_nsr["_admin"].get("deployed")
+ vnf_index = db_nslcmop["operationParams"]["vnf_member_index"]
+
+ #TODO check if ns is in a proper status
+ vca_deployed = nsr_lcm["VCA"].get(vnf_index)
+ if not vca_deployed:
+ raise LcmException("charm for vnf_member_index={} is not deployed".format(vnf_index))
+ model_name = vca_deployed.get("model")
+ application_name = vca_deployed.get("application")
+ if not model_name or not application_name:
+ raise LcmException("charm for vnf_member_index={} is not properly deployed".format(vnf_index))
+ if vca_deployed["operational-status"] != "active":
+ raise LcmException("charm for vnf_member_index={} operational_status={} not 'active'".format(
+ vnf_index, vca_deployed["operational-status"]))
+ primitive = db_nslcmop["operationParams"]["primitive"]
+ primitive_params = db_nslcmop["operationParams"]["primitive_params"]
+ callback = None # self.n2vc_callback
+ callback_args = () # [db_nsr, db_nslcmop, vnf_index, None]
+ await self.n2vc.login()
+ task = asyncio.ensure_future(
+ self.n2vc.ExecutePrimitive(
+ model_name,
+ application_name,
+ primitive, callback,
+ *callback_args,
+ **primitive_params
+ )
+ )
+ # task.add_done_callback(functools.partial(self.n2vc_callback, model_name, application_name, None,
+ # db_nsr, db_nslcmop, vnf_index))
+ # self.lcm_ns_tasks[nsr_id][nslcmop_id]["action: " + primitive] = task
+ # wait until completed with timeout
+ await asyncio.wait((task,), timeout=300)
+
+ result = "FAILED" # by default
+ result_detail = ""
+ if task.cancelled():
+ db_nslcmop["detailedStatus"] = "Task has been cancelled"
+ elif task.done():
+ exc = task.exception()
+ if exc:
+ result_detail = str(exc)
+ else:
+ self.logger.debug(logging_text + " task Done")
+ # TODO revise with Adam if action is finished and ok when task is done or callback is needed
+ result = "COMPLETED"
+ result_detail = "Done"
+ else: # timeout
+ # TODO Should it be cancelled?!!
+ task.cancel()
+ result_detail = "timeout"
+
+ db_nslcmop_update = {
+ "detailedStatus": result_detail,
+ "operationState": result,
+ "statusEnteredTime": time()
+ }
+ self.logger.debug(logging_text + " task Done with result {} {}".format(result, result_detail))
+ return # database update is called inside finally
+
+ except (DbException, LcmException) as e:
+ self.logger.error(logging_text + "Exit Exception {}".format(e))
+ exc = e
+ except Exception as e:
+ self.logger.critical(logging_text + "Exit Exception {} {}".format(type(e).__name__, e), exc_info=True)
+ exc = e
+ finally:
+ if exc and db_nslcmop:
+ db_nslcmop_update = {
+ "detailed-status": "FAILED {}: {}".format(step, exc),
+ "operationState": "FAILED",
+ "statusEnteredTime": time(),
+ }
+ if db_nslcmop_update:
+ self.update_db_2("nslcmops", nslcmop_id, db_nslcmop_update)