X-Git-Url: https://osm.etsi.org/gitweb/?a=blobdiff_plain;f=osm_lcm%2Fns.py;h=3b2dc2ed58a3360faee68a9639cfb344c3ae80e8;hb=refs%2Fchanges%2F58%2F7758%2F1;hp=4a16835e10cb315ae0f45f4eddb571f61fd40428;hpb=29cfa602d40ff4d3e7f611414cf66d4cc62a2be6;p=osm%2FLCM.git diff --git a/osm_lcm/ns.py b/osm_lcm/ns.py index 4a16835..3b2dc2e 100644 --- a/osm_lcm/ns.py +++ b/osm_lcm/ns.py @@ -29,7 +29,7 @@ from lcm_utils import LcmException, LcmExceptionNoMgmtIP, LcmBase from osm_common.dbbase import DbException from osm_common.fsbase import FsException -from n2vc.vnf import N2VC, N2VCPrimitiveExecutionFailed, NetworkServiceDoesNotExist +from n2vc.vnf import N2VC, N2VCPrimitiveExecutionFailed, NetworkServiceDoesNotExist, PrimitiveDoesNotExist from copy import copy, deepcopy from http import HTTPStatus @@ -628,6 +628,12 @@ class NsLcm(LcmBase): raise LcmException("ns_update_vnfr: Not found member_vnf_index={} at RO info".format(vnf_index)) async def instantiate(self, nsr_id, nslcmop_id): + + # Try to lock HA task here + task_is_locked_by_me = self.lcm_tasks.lock_HA('ns', 'nslcmops', nslcmop_id) + if not task_is_locked_by_me: + return + logging_text = "Task ns={} instantiate={} ".format(nsr_id, nslcmop_id) self.logger.debug(logging_text + "Enter") # get all needed from database @@ -644,6 +650,9 @@ class NsLcm(LcmBase): n2vc_key_list = [] # list of public keys to be injected as authorized to VMs exc = None try: + # wait for any previous tasks in process + await self.lcm_tasks.waitfor_related_HA('ns', 'nslcmops', nslcmop_id) + step = "Getting nslcmop={} from db".format(nslcmop_id) db_nslcmop = self.db.get_one("nslcmops", {"_id": nslcmop_id}) step = "Getting nsr={} from db".format(nsr_id) @@ -652,17 +661,6 @@ class NsLcm(LcmBase): nsd = db_nsr["nsd"] nsr_name = db_nsr["name"] # TODO short-name?? - # look if previous tasks in process - task_name, task_dependency = self.lcm_tasks.lookfor_related("ns", nsr_id, nslcmop_id) - if task_dependency: - step = db_nslcmop_update["detailed-status"] = \ - "Waiting for related tasks to be completed: {}".format(task_name) - self.logger.debug(logging_text + step) - self.update_db_2("nslcmops", nslcmop_id, db_nslcmop_update) - _, pending = await asyncio.wait(task_dependency, timeout=3600) - if pending: - raise LcmException("Timeout waiting related tasks to be completed") - step = "Getting vnfrs from db" db_vnfrs_list = self.db.get_list("vnfrs", {"nsr-id-ref": nsr_id}) db_vnfds_ref = {} @@ -935,17 +933,28 @@ class NsLcm(LcmBase): .format(vca_deployed["member-vnf-index"], vca_deployed["vdu_id"]) self.logger.debug(logging_text + step) - primitive_id = await self.n2vc.ExecutePrimitive( - vca_deployed["model"], - vca_deployed["application"], - "get-ssh-public-key", - None, - ) - vca_deployed["step"] = db_nsr_update[database_entry + "step"] = "get-ssh-public-key" - vca_deployed["primitive_id"] = db_nsr_update[database_entry + "primitive_id"] =\ - primitive_id - db_nsr_update[database_entry + "operational-status"] =\ - vca_deployed["operational-status"] + try: + primitive_id = await self.n2vc.ExecutePrimitive( + vca_deployed["model"], + vca_deployed["application"], + "get-ssh-public-key", + None, + ) + vca_deployed["step"] = db_nsr_update[database_entry + "step"] = "get-ssh-public-key" + vca_deployed["primitive_id"] = db_nsr_update[database_entry + "primitive_id"] =\ + primitive_id + db_nsr_update[database_entry + "operational-status"] =\ + vca_deployed["operational-status"] + except PrimitiveDoesNotExist: + ssh_public_key = None + vca_deployed["step"] = db_nsr_update[database_entry + "step"] =\ + "ssh-public-key-obtained" + vca_deployed["ssh-public-key"] = db_nsr_update[database_entry + "ssh-public-key"] =\ + ssh_public_key + step = "charm ssh-public-key for member_vnf_index={} vdu_id={} not needed".format( + vca_deployed["member-vnf-index"], vca_deployed["vdu_id"]) + self.logger.debug(logging_text + step) + elif vca_deployed["step"] in ("get-ssh-public-key", "retry-get-ssh-public-key"): primitive_id = vca_deployed["primitive_id"] primitive_status = await self.n2vc.GetPrimitiveStatus(vca_deployed["model"], @@ -1232,7 +1241,7 @@ class NsLcm(LcmBase): # add primitive verify-ssh-credentials to the list after config only when is a vnf or vdu charm initial_config_primitive_list = initial_config_primitive_list.copy() - if initial_config_primitive_list and vnf_index: + if initial_config_primitive_list and vnf_index and vca_deployed.get("ssh-public-key"): initial_config_primitive_list.insert(1, {"name": "verify-ssh-credentials", "parameter": []}) for initial_config_primitive in initial_config_primitive_list: @@ -1551,8 +1560,9 @@ class NsLcm(LcmBase): else: return False - # Get a numerically sorted list of the sequences for this VNFD's terminate action - def _get_terminate_config_primitive_seq_list(self, vnfd): + @staticmethod + def _get_terminate_config_primitive_seq_list(vnfd): + """ Get a numerically sorted list of the sequences for this VNFD's terminate action """ # No need to check for existing primitive twice, already done before vnf_config = vnfd.get("vnf-configuration") seq_list = vnf_config.get("terminate-config-primitive") @@ -1594,10 +1604,10 @@ class NsLcm(LcmBase): } return nslcmop - # Create a primitive with params from VNFD - # - Called from terminate() before deleting instance - # - Calls action() to execute the primitive async def _terminate_action(self, db_nslcmop, nslcmop_id, nsr_id): + """ Create a primitive with params from VNFD + Called from terminate() before deleting instance + Calls action() to execute the primitive """ logging_text = "Task ns={} _terminate_action={} ".format(nsr_id, nslcmop_id) db_vnfds = {} db_vnfrs_list = self.db.get_list("vnfrs", {"nsr-id-ref": nsr_id}) @@ -1650,6 +1660,12 @@ class NsLcm(LcmBase): vnf_index, seq.get("name"), nslcmop_operation_state_detail)) async def terminate(self, nsr_id, nslcmop_id): + + # Try to lock HA task here + task_is_locked_by_me = self.lcm_tasks.lock_HA('ns', 'nslcmops', nslcmop_id) + if not task_is_locked_by_me: + return + logging_text = "Task ns={} terminate={} ".format(nsr_id, nslcmop_id) self.logger.debug(logging_text + "Enter") db_nsr = None @@ -1662,6 +1678,9 @@ class NsLcm(LcmBase): nslcmop_operation_state = None autoremove = False # autoremove after terminated try: + # wait for any previous tasks in process + await self.lcm_tasks.waitfor_related_HA("ns", 'nslcmops', nslcmop_id) + step = "Getting nslcmop={} from db".format(nslcmop_id) db_nslcmop = self.db.get_one("nslcmops", {"_id": nslcmop_id}) step = "Getting nsr={} from db".format(nsr_id) @@ -1998,6 +2017,12 @@ class NsLcm(LcmBase): return "FAILED", str(e) async def action(self, nsr_id, nslcmop_id): + + # Try to lock HA task here + task_is_locked_by_me = self.lcm_tasks.lock_HA('ns', 'nslcmops', nslcmop_id) + if not task_is_locked_by_me: + return + logging_text = "Task ns={} action={} ".format(nsr_id, nslcmop_id) self.logger.debug(logging_text + "Enter") # get all needed from database @@ -2009,6 +2034,9 @@ class NsLcm(LcmBase): nslcmop_operation_state_detail = None exc = None try: + # wait for any previous tasks in process + await self.lcm_tasks.waitfor_related_HA('ns', 'nslcmops', nslcmop_id) + step = "Getting information from database" db_nslcmop = self.db.get_one("nslcmops", {"_id": nslcmop_id}) db_nsr = self.db.get_one("nsrs", {"_id": nsr_id}) @@ -2031,17 +2059,6 @@ class NsLcm(LcmBase): step = "Getting nsd from database" db_nsd = self.db.get_one("nsds", {"_id": db_nsr["nsd-id"]}) - # look if previous tasks in process - task_name, task_dependency = self.lcm_tasks.lookfor_related("ns", nsr_id, nslcmop_id) - if task_dependency: - step = db_nslcmop_update["detailed-status"] = \ - "Waiting for related tasks to be completed: {}".format(task_name) - self.logger.debug(logging_text + step) - self.update_db_2("nslcmops", nslcmop_id, db_nslcmop_update) - _, pending = await asyncio.wait(task_dependency, timeout=3600) - if pending: - raise LcmException("Timeout waiting related tasks to be completed") - # for backward compatibility if nsr_deployed and isinstance(nsr_deployed.get("VCA"), dict): nsr_deployed["VCA"] = list(nsr_deployed["VCA"].values()) @@ -2129,6 +2146,12 @@ class NsLcm(LcmBase): return nslcmop_operation_state, nslcmop_operation_state_detail async def scale(self, nsr_id, nslcmop_id): + + # Try to lock HA task here + task_is_locked_by_me = self.lcm_tasks.lock_HA('ns', 'nslcmops', nslcmop_id) + if not task_is_locked_by_me: + return + logging_text = "Task ns={} scale={} ".format(nsr_id, nslcmop_id) self.logger.debug(logging_text + "Enter") # get all needed from database @@ -2144,16 +2167,8 @@ class NsLcm(LcmBase): old_config_status = "" vnfr_scaled = False try: - # look if previous tasks in process - task_name, task_dependency = self.lcm_tasks.lookfor_related("ns", nsr_id, nslcmop_id) - if task_dependency: - step = db_nslcmop_update["detailed-status"] = \ - "Waiting for related tasks to be completed: {}".format(task_name) - self.logger.debug(logging_text + step) - self.update_db_2("nslcmops", nslcmop_id, db_nslcmop_update) - _, pending = await asyncio.wait(task_dependency, timeout=3600) - if pending: - raise LcmException("Timeout waiting related tasks to be completed") + # wait for any previous tasks in process + await self.lcm_tasks.waitfor_related_HA('ns', 'nslcmops', nslcmop_id) step = "Getting nslcmop from database" self.logger.debug(step + " after having waited for previous tasks to be completed")