From 7ecbc3423bc9e08a662780b2eec10ee7cfe78b74 Mon Sep 17 00:00:00 2001 From: tierno Date: Mon, 21 Sep 2020 14:05:39 +0000 Subject: [PATCH] fix 1201: for a KDU with configuration, wait for KDU up instead of deployed at RO Change-Id: Id88a5a0993af0d2758635d204e603e3b0f33df0d Signed-off-by: tierno --- osm_lcm/ns.py | 46 ++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 40 insertions(+), 6 deletions(-) diff --git a/osm_lcm/ns.py b/osm_lcm/ns.py index 13298e0..1e56e32 100644 --- a/osm_lcm/ns.py +++ b/osm_lcm/ns.py @@ -1236,6 +1236,34 @@ class NsLcm(LcmBase): self.set_vnfr_at_error(db_vnfrs, str(e)) raise + async def wait_kdu_up(self, logging_text, nsr_id, vnfr_id, kdu_name): + """ + Wait for kdu to be up, get ip address + :param logging_text: prefix use for logging + :param nsr_id: + :param vnfr_id: + :param kdu_name: + :return: IP address + """ + + # self.logger.debug(logging_text + "Starting wait_kdu_up") + nb_tries = 0 + + while nb_tries < 360: + db_vnfr = self.db.get_one("vnfrs", {"_id": vnfr_id}) + kdur = next((x for x in get_iterable(db_vnfr, "kdur") if x.get("name") == kdu_name), None) + if not kdur: + raise LcmException("Not found vnfr_id={}, kdu_name={}".format(vnfr_id, kdu_name)) + if kdur.get("status"): + if kdur["status"] in ("READY", "ENABLED"): + return kdur.get("ip-address") + else: + raise LcmException("target KDU={} is in error state".format(kdu_name)) + + await asyncio.sleep(10, loop=self.loop) + nb_tries += 1 + raise LcmException("Timeout waiting KDU={} instantiated".format(kdu_name)) + async def wait_vm_up_insert_key_ro(self, logging_text, nsr_id, vnfr_id, vdu_id, vdu_index, pub_key=None, user=None): """ Wait for ip addres at RO, and optionally, insert public key in virtual machine @@ -1581,8 +1609,11 @@ class NsLcm(LcmBase): # n2vc_redesign STEP 5.1 # wait for RO (ip-address) Insert pub_key into VM if vnfr_id: - rw_mgmt_ip = await self.wait_vm_up_insert_key_ro(logging_text, nsr_id, vnfr_id, vdu_id, vdu_index, - user=user, pub_key=pub_key) + if kdu_name: + rw_mgmt_ip = await self.wait_kdu_up(logging_text, nsr_id, vnfr_id, kdu_name) + else: + rw_mgmt_ip = await self.wait_vm_up_insert_key_ro(logging_text, nsr_id, vnfr_id, vdu_id, + vdu_index, user=user, pub_key=pub_key) else: rw_mgmt_ip = None # This is for a NS configuration @@ -2397,7 +2428,7 @@ class NsLcm(LcmBase): self.logger.warn(logging_text + ' ERROR adding relations: {}'.format(e)) return False - async def _install_kdu(self, nsr_id: str, nsr_db_path: str, vnfr_data: dict, kdu_index: int, kdur: dict, kdud: dict, + async def _install_kdu(self, nsr_id: str, nsr_db_path: str, vnfr_data: dict, kdu_index: int, kdud: dict, vnfd: dict, k8s_instance_info: dict, k8params: dict = None, timeout: int = 600): try: @@ -2425,8 +2456,9 @@ class NsLcm(LcmBase): namespace=k8s_instance_info["namespace"]) # Obtain management service info (if exists) + vnfr_update_dict = {} if services: - vnfr_update_dict = {"kdur.{}.services".format(kdu_index): services} + vnfr_update_dict["kdur.{}.services".format(kdu_index)] = services mgmt_services = [service for service in kdud.get("service", []) if service.get("mgmt-service")] for mgmt_service in mgmt_services: for service in services: @@ -2448,7 +2480,8 @@ class NsLcm(LcmBase): else: self.logger.warn("Mgmt service name: {} not found".format(mgmt_service["name"])) - self.update_db_2("vnfrs", vnfr_data.get("_id"), vnfr_update_dict) + vnfr_update_dict["kdur.{}.status".format(kdu_index)] = "READY" + self.update_db_2("vnfrs", vnfr_data.get("_id"), vnfr_update_dict) kdu_config = kdud.get("kdu-configuration") if kdu_config and kdu_config.get("initial-config-primitive") and kdu_config.get("juju") is None: @@ -2470,6 +2503,7 @@ class NsLcm(LcmBase): # Prepare update db with error and raise exception try: self.update_db_2("nsrs", nsr_id, {nsr_db_path + ".detailed-status": str(e)}) + self.update_db_2("vnfrs", vnfr_data.get("_id"), {"kdur.{}.status".format(kdu_index): "ERROR"}) except Exception: # ignore to keep original exception pass @@ -2579,7 +2613,7 @@ class NsLcm(LcmBase): self.update_db_2("nsrs", nsr_id, db_nsr_update) task = asyncio.ensure_future( - self._install_kdu(nsr_id, db_path, vnfr_data, kdu_index, kdur, kdud, db_vnfds[vnfd_id], + self._install_kdu(nsr_id, db_path, vnfr_data, kdu_index, kdud, db_vnfds[vnfd_id], k8s_instance_info, k8params=desc_params, timeout=600)) self.lcm_tasks.register("ns", nsr_id, nslcmop_id, "instantiate_KDU-{}".format(index), task) task_instantiation_info[task] = "Deploying KDU {}".format(kdur["kdu-name"]) -- 2.17.1