X-Git-Url: https://osm.etsi.org/gitweb/?a=blobdiff_plain;f=osm_lcm%2Fns.py;h=8f2b192a74cb1ef1c441a2ce00f1654e43e66de2;hb=ceb0386270a13ab6b68c3549c01813eb41c178a5;hp=3e6bafc5e9c813ecd085dad9d8d006e596c96fad;hpb=afff693a2ae9757aee5f731ee12bca70cdb9a907;p=osm%2FLCM.git diff --git a/osm_lcm/ns.py b/osm_lcm/ns.py index 3e6bafc..8f2b192 100644 --- a/osm_lcm/ns.py +++ b/osm_lcm/ns.py @@ -1014,16 +1014,16 @@ class NsLcm(LcmBase): # check if this network needs SDN assist if vld.get("pci-interfaces"): db_vim = get_vim_account(ns_params["vimAccountId"]) - sdnc_id = db_vim["config"].get("sdn-controller") - if sdnc_id: - sdn_vld = "nsrs:{}:vld.{}".format(nsr_id, vld["id"]) - target_sdn = "sdn:{}".format(sdnc_id) - target_vld["vim_info"][target_sdn] = { - "sdn": True, - "target_vim": target_vim, - "vlds": [sdn_vld], - "type": vld.get("type"), - } + if vim_config := db_vim.get("config"): + if sdnc_id := vim_config.get("sdn-controller"): + sdn_vld = "nsrs:{}:vld.{}".format(nsr_id, vld["id"]) + target_sdn = "sdn:{}".format(sdnc_id) + target_vld["vim_info"][target_sdn] = { + "sdn": True, + "target_vim": target_vim, + "vlds": [sdn_vld], + "type": vld.get("type"), + } nsd_vnf_profiles = get_vnf_profiles(nsd) for nsd_vnf_profile in nsd_vnf_profiles: @@ -1378,7 +1378,6 @@ class NsLcm(LcmBase): } desc = await self.RO.deploy(nsr_id, target) action_id = desc["action_id"] - db_nsr_update["_admin.deployed.RO.nsr_delete_action_id"] = action_id db_nsr_update["_admin.deployed.RO.nsr_status"] = "DELETING" self.logger.debug( logging_text @@ -1396,20 +1395,17 @@ class NsLcm(LcmBase): stage, operation="termination", ) - - db_nsr_update["_admin.deployed.RO.nsr_delete_action_id"] = None db_nsr_update["_admin.deployed.RO.nsr_status"] = "DELETED" # delete all nsr await self.RO.delete(nsr_id) - except Exception as e: - if isinstance(e, NgRoException) and e.http_code == 404: # not found + except NgRoException as e: + if e.http_code == 404: # not found db_nsr_update["_admin.deployed.RO.nsr_id"] = None db_nsr_update["_admin.deployed.RO.nsr_status"] = "DELETED" - db_nsr_update["_admin.deployed.RO.nsr_delete_action_id"] = None self.logger.debug( logging_text + "RO_action_id={} already deleted".format(action_id) ) - elif isinstance(e, NgRoException) and e.http_code == 409: # conflict + elif e.http_code == 409: # conflict failed_detail.append("delete conflict: {}".format(e)) self.logger.debug( logging_text @@ -1421,6 +1417,11 @@ class NsLcm(LcmBase): logging_text + "RO_action_id={} delete error: {}".format(action_id, e) ) + except Exception as e: + failed_detail.append("delete error: {}".format(e)) + self.logger.error( + logging_text + "RO_action_id={} delete error: {}".format(action_id, e) + ) if failed_detail: stage[2] = "Error deleting from VIM" @@ -1562,9 +1563,7 @@ class NsLcm(LcmBase): """ self.logger.debug(logging_text + "Starting wait_vm_up_insert_key_ro") - ro_nsr_id = None ip_address = None - nb_tries = 0 target_vdu_id = None ro_retries = 0 @@ -1652,74 +1651,24 @@ class NsLcm(LcmBase): self.logger.error(logging_text + "Cannot inject ssh-ky to a PDU") return ip_address try: - ro_vm_id = "{}-{}".format( - db_vnfr["member-vnf-index-ref"], target_vdu_id - ) # TODO add vdu_index - if self.ro_config.ng: - target = { - "action": { - "action": "inject_ssh_key", - "key": pub_key, - "user": user, - }, - "vnf": [{"_id": vnfr_id, "vdur": [{"id": vdur["id"]}]}], - } - desc = await self.RO.deploy(nsr_id, target) - action_id = desc["action_id"] - await self._wait_ng_ro( - nsr_id, action_id, timeout=600, operation="instantiation" - ) - break - else: - # wait until NS is deployed at RO - if not ro_nsr_id: - db_nsrs = self.db.get_one("nsrs", {"_id": nsr_id}) - ro_nsr_id = deep_get( - db_nsrs, ("_admin", "deployed", "RO", "nsr_id") - ) - if not ro_nsr_id: - continue - result_dict = await self.RO.create_action( - item="ns", - item_id_name=ro_nsr_id, - descriptor={ - "add_public_key": pub_key, - "vms": [ro_vm_id], - "user": user, - }, - ) - # result_dict contains the format {VM-id: {vim_result: 200, description: text}} - if not result_dict or not isinstance(result_dict, dict): - raise LcmException( - "Unknown response from RO when injecting key" - ) - for result in result_dict.values(): - if result.get("vim_result") == 200: - break - else: - raise ROclient.ROClientException( - "error injecting key: {}".format( - result.get("description") - ) - ) - break + target = { + "action": { + "action": "inject_ssh_key", + "key": pub_key, + "user": user, + }, + "vnf": [{"_id": vnfr_id, "vdur": [{"id": vdur["id"]}]}], + } + desc = await self.RO.deploy(nsr_id, target) + action_id = desc["action_id"] + await self._wait_ng_ro( + nsr_id, action_id, timeout=600, operation="instantiation" + ) + break except NgRoException as e: raise LcmException( "Reaching max tries injecting key. Error: {}".format(e) ) - except ROclient.ROClientException as e: - if not nb_tries: - self.logger.debug( - logging_text - + "error injecting key: {}. Retrying until {} seconds".format( - e, 20 * 10 - ) - ) - nb_tries += 1 - if nb_tries >= 20: - raise LcmException( - "Reaching max tries injecting key. Error: {}".format(e) - ) else: break @@ -2044,13 +1993,16 @@ class NsLcm(LcmBase): ) # add relations for this VCA (wait for other peers related with this VCA) - await self._add_vca_relations( + is_relation_added = await self._add_vca_relations( logging_text=logging_text, nsr_id=nsr_id, vca_type=vca_type, vca_index=vca_index, ) + if not is_relation_added: + raise LcmException("Relations could not be added to VCA.") + # if SSH access is required, then get execution environment SSH public # if native charm we have waited already to VM be UP if vca_type in ("k8s_proxy_charm", "lxc_proxy_charm", "helm", "helm-v3"): @@ -2245,7 +2197,7 @@ class NsLcm(LcmBase): self._write_configuration_status( nsr_id=nsr_id, vca_index=vca_index, status="BROKEN" ) - raise LcmException("{} {}".format(step, e)) from e + raise LcmException("{}. {}".format(step, e)) from e def _write_ns_status( self, @@ -2458,6 +2410,8 @@ class NsLcm(LcmBase): # update operation on nslcmops db_nslcmop_update = {} + timeout_ns_deploy = self.timeout.ns_deploy + nslcmop_operation_state = None db_vnfrs = {} # vnf's info indexed by member-index # n2vc_info = {} @@ -2498,8 +2452,6 @@ class NsLcm(LcmBase): ns_params = db_nslcmop.get("operationParams") if ns_params and ns_params.get("timeout_ns_deploy"): timeout_ns_deploy = ns_params["timeout_ns_deploy"] - else: - timeout_ns_deploy = self.timeout.ns_deploy # read from db: ns stage[1] = "Getting nsr={} from db.".format(nsr_id) @@ -3047,6 +2999,9 @@ class NsLcm(LcmBase): cached_vnfds: Dict[str, Any], ) -> List[Relation]: relations = [] + if vca.target_element == "ns": + self.logger.debug("VCA is a NS charm, not a VNF.") + return relations vnf_profile = get_vnf_profile(nsd, vca.vnf_profile_id) vnf_profile_id = vnf_profile["id"] vnfd_id = vnf_profile["vnfd-id"] @@ -3213,11 +3168,14 @@ class NsLcm(LcmBase): requirer_vca_id, relation.requirer.endpoint, ) - await self.vca_map[vca_type].add_relation( - provider=provider_relation_endpoint, - requirer=requirer_relation_endpoint, - ) - # remove entry from relations list + try: + await self.vca_map[vca_type].add_relation( + provider=provider_relation_endpoint, + requirer=requirer_relation_endpoint, + ) + except N2VCException as exception: + self.logger.error(exception) + raise LcmException(exception) return True return False @@ -4283,206 +4241,6 @@ class NsLcm(LcmBase): pass self._write_all_config_status(db_nsr=db_nsr, status="DELETED") - async def _terminate_RO( - self, logging_text, nsr_deployed, nsr_id, nslcmop_id, stage - ): - """ - Terminates a deployment from RO - :param logging_text: - :param nsr_deployed: db_nsr._admin.deployed - :param nsr_id: - :param nslcmop_id: - :param stage: list of string with the content to write on db_nslcmop.detailed-status. - this method will update only the index 2, but it will write on database the concatenated content of the list - :return: - """ - db_nsr_update = {} - failed_detail = [] - ro_nsr_id = ro_delete_action = None - if nsr_deployed and nsr_deployed.get("RO"): - ro_nsr_id = nsr_deployed["RO"].get("nsr_id") - ro_delete_action = nsr_deployed["RO"].get("nsr_delete_action_id") - try: - if ro_nsr_id: - stage[2] = "Deleting ns from VIM." - db_nsr_update["detailed-status"] = " ".join(stage) - self._write_op_status(nslcmop_id, stage) - self.logger.debug(logging_text + stage[2]) - self.update_db_2("nsrs", nsr_id, db_nsr_update) - self._write_op_status(nslcmop_id, stage) - desc = await self.RO.delete("ns", ro_nsr_id) - ro_delete_action = desc["action_id"] - db_nsr_update[ - "_admin.deployed.RO.nsr_delete_action_id" - ] = ro_delete_action - db_nsr_update["_admin.deployed.RO.nsr_id"] = None - db_nsr_update["_admin.deployed.RO.nsr_status"] = "DELETED" - if ro_delete_action: - # wait until NS is deleted from VIM - stage[2] = "Waiting ns deleted from VIM." - detailed_status_old = None - self.logger.debug( - logging_text - + stage[2] - + " RO_id={} ro_delete_action={}".format( - ro_nsr_id, ro_delete_action - ) - ) - self.update_db_2("nsrs", nsr_id, db_nsr_update) - self._write_op_status(nslcmop_id, stage) - - delete_timeout = 20 * 60 # 20 minutes - while delete_timeout > 0: - desc = await self.RO.show( - "ns", - item_id_name=ro_nsr_id, - extra_item="action", - extra_item_id=ro_delete_action, - ) - - # deploymentStatus - self._on_update_ro_db(nsrs_id=nsr_id, ro_descriptor=desc) - - ns_status, ns_status_info = self.RO.check_action_status(desc) - if ns_status == "ERROR": - raise ROclient.ROClientException(ns_status_info) - elif ns_status == "BUILD": - stage[2] = "Deleting from VIM {}".format(ns_status_info) - elif ns_status == "ACTIVE": - db_nsr_update["_admin.deployed.RO.nsr_delete_action_id"] = None - db_nsr_update["_admin.deployed.RO.nsr_status"] = "DELETED" - break - else: - assert ( - False - ), "ROclient.check_action_status returns unknown {}".format( - ns_status - ) - if stage[2] != detailed_status_old: - detailed_status_old = stage[2] - db_nsr_update["detailed-status"] = " ".join(stage) - self._write_op_status(nslcmop_id, stage) - self.update_db_2("nsrs", nsr_id, db_nsr_update) - await asyncio.sleep(5, loop=self.loop) - delete_timeout -= 5 - else: # delete_timeout <= 0: - raise ROclient.ROClientException( - "Timeout waiting ns deleted from VIM" - ) - - except Exception as e: - self.update_db_2("nsrs", nsr_id, db_nsr_update) - if ( - isinstance(e, ROclient.ROClientException) and e.http_code == 404 - ): # not found - db_nsr_update["_admin.deployed.RO.nsr_id"] = None - db_nsr_update["_admin.deployed.RO.nsr_status"] = "DELETED" - db_nsr_update["_admin.deployed.RO.nsr_delete_action_id"] = None - self.logger.debug( - logging_text + "RO_ns_id={} already deleted".format(ro_nsr_id) - ) - elif ( - isinstance(e, ROclient.ROClientException) and e.http_code == 409 - ): # conflict - failed_detail.append("delete conflict: {}".format(e)) - self.logger.debug( - logging_text - + "RO_ns_id={} delete conflict: {}".format(ro_nsr_id, e) - ) - else: - failed_detail.append("delete error: {}".format(e)) - self.logger.error( - logging_text + "RO_ns_id={} delete error: {}".format(ro_nsr_id, e) - ) - - # Delete nsd - if not failed_detail and deep_get(nsr_deployed, ("RO", "nsd_id")): - ro_nsd_id = nsr_deployed["RO"]["nsd_id"] - try: - stage[2] = "Deleting nsd from RO." - db_nsr_update["detailed-status"] = " ".join(stage) - self.update_db_2("nsrs", nsr_id, db_nsr_update) - self._write_op_status(nslcmop_id, stage) - await self.RO.delete("nsd", ro_nsd_id) - self.logger.debug( - logging_text + "ro_nsd_id={} deleted".format(ro_nsd_id) - ) - db_nsr_update["_admin.deployed.RO.nsd_id"] = None - except Exception as e: - if ( - isinstance(e, ROclient.ROClientException) and e.http_code == 404 - ): # not found - db_nsr_update["_admin.deployed.RO.nsd_id"] = None - self.logger.debug( - logging_text + "ro_nsd_id={} already deleted".format(ro_nsd_id) - ) - elif ( - isinstance(e, ROclient.ROClientException) and e.http_code == 409 - ): # conflict - failed_detail.append( - "ro_nsd_id={} delete conflict: {}".format(ro_nsd_id, e) - ) - self.logger.debug(logging_text + failed_detail[-1]) - else: - failed_detail.append( - "ro_nsd_id={} delete error: {}".format(ro_nsd_id, e) - ) - self.logger.error(logging_text + failed_detail[-1]) - - if not failed_detail and deep_get(nsr_deployed, ("RO", "vnfd")): - for index, vnf_deployed in enumerate(nsr_deployed["RO"]["vnfd"]): - if not vnf_deployed or not vnf_deployed["id"]: - continue - try: - ro_vnfd_id = vnf_deployed["id"] - stage[ - 2 - ] = "Deleting member_vnf_index={} ro_vnfd_id={} from RO.".format( - vnf_deployed["member-vnf-index"], ro_vnfd_id - ) - db_nsr_update["detailed-status"] = " ".join(stage) - self.update_db_2("nsrs", nsr_id, db_nsr_update) - self._write_op_status(nslcmop_id, stage) - await self.RO.delete("vnfd", ro_vnfd_id) - self.logger.debug( - logging_text + "ro_vnfd_id={} deleted".format(ro_vnfd_id) - ) - db_nsr_update["_admin.deployed.RO.vnfd.{}.id".format(index)] = None - except Exception as e: - if ( - isinstance(e, ROclient.ROClientException) and e.http_code == 404 - ): # not found - db_nsr_update[ - "_admin.deployed.RO.vnfd.{}.id".format(index) - ] = None - self.logger.debug( - logging_text - + "ro_vnfd_id={} already deleted ".format(ro_vnfd_id) - ) - elif ( - isinstance(e, ROclient.ROClientException) and e.http_code == 409 - ): # conflict - failed_detail.append( - "ro_vnfd_id={} delete conflict: {}".format(ro_vnfd_id, e) - ) - self.logger.debug(logging_text + failed_detail[-1]) - else: - failed_detail.append( - "ro_vnfd_id={} delete error: {}".format(ro_vnfd_id, e) - ) - self.logger.error(logging_text + failed_detail[-1]) - - if failed_detail: - stage[2] = "Error deleting from VIM" - else: - stage[2] = "Deleted from VIM" - db_nsr_update["detailed-status"] = " ".join(stage) - self.update_db_2("nsrs", nsr_id, db_nsr_update) - self._write_op_status(nslcmop_id, stage) - - if failed_detail: - raise LcmException("; ".join(failed_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) @@ -4687,13 +4445,7 @@ class NsLcm(LcmBase): logging_text, nsr_deployed, nsr_id, nslcmop_id, stage ) ) - else: - task_delete_ro = asyncio.ensure_future( - self._terminate_RO( - logging_text, nsr_deployed, nsr_id, nslcmop_id, stage - ) - ) - tasks_dict_info[task_delete_ro] = "Removing deployment from VIM" + tasks_dict_info[task_delete_ro] = "Removing deployment from VIM" # rest of staff will be done at finally @@ -5130,6 +4882,7 @@ class NsLcm(LcmBase): nslcmop_operation_state = None error_description_nslcmop = None exc = None + step = "" try: # wait for any previous tasks in process step = "Waiting for previous operations to terminate" @@ -5804,6 +5557,7 @@ class NsLcm(LcmBase): exc = None change_type = "updated" detailed_status = "" + member_vnf_index = None try: # wait for any previous tasks in process @@ -6308,7 +6062,10 @@ class NsLcm(LcmBase): "nslcmop_id": nslcmop_id, "operationState": nslcmop_operation_state, } - if change_type in ("vnf_terminated", "policy_updated"): + if ( + change_type in ("vnf_terminated", "policy_updated") + and member_vnf_index + ): msg.update({"vnf_member_index": member_vnf_index}) await self.msg.aiowrite("ns", change_type, msg, loop=self.loop) except Exception as e: