fix 1201: for a KDU with configuration, wait for KDU up instead of deployed at RO 47/9747/1
authortierno <alfonso.tiernosepulveda@telefonica.com>
Mon, 21 Sep 2020 14:05:39 +0000 (14:05 +0000)
committertierno <alfonso.tiernosepulveda@telefonica.com>
Wed, 23 Sep 2020 13:42:03 +0000 (13:42 +0000)
Change-Id: Id88a5a0993af0d2758635d204e603e3b0f33df0d
Signed-off-by: tierno <alfonso.tiernosepulveda@telefonica.com>
osm_lcm/ns.py

index 13298e0..1e56e32 100644 (file)
@@ -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"])