Fix bug 2098 to heal VDU when no VDU is specified in the heal operation
[osm/LCM.git] / osm_lcm / ns.py
index ae151db..8a99e91 100644 (file)
@@ -30,6 +30,7 @@ from jinja2 import (
     TemplateNotFound,
     StrictUndefined,
     UndefinedError,
+    select_autoescape,
 )
 
 from osm_lcm import ROclient
@@ -414,7 +415,10 @@ class NsLcm(LcmBase):
     @staticmethod
     def _parse_cloud_init(cloud_init_text, additional_params, vnfd_id, vdu_id):
         try:
-            env = Environment(undefined=StrictUndefined, autoescape=True)
+            env = Environment(
+                      undefined=StrictUndefined,
+                      autoescape=select_autoescape(default_for_string=True, default=True),
+                  )
             template = env.from_string(cloud_init_text)
             return template.render(additional_params or {})
         except UndefinedError as e:
@@ -3731,10 +3735,16 @@ class NsLcm(LcmBase):
         self.logger.debug(
             logging_text + "_deploy_n2vc vnfd_id={}, vdu_id={}".format(vnfd_id, vdu_id)
         )
+
+        charm_name = ""
+        get_charm_name = False
         if "execution-environment-list" in descriptor_config:
             ee_list = descriptor_config.get("execution-environment-list", [])
         elif "juju" in descriptor_config:
             ee_list = [descriptor_config]  # ns charms
+            if "execution-environment-list" not in descriptor_config:
+                # charm name is only required for ns charms
+                get_charm_name = True
         else:  # other types as script are not supported
             ee_list = []
 
@@ -3748,6 +3758,8 @@ class NsLcm(LcmBase):
             ee_descriptor_id = ee_item.get("id")
             if ee_item.get("juju"):
                 vca_name = ee_item["juju"].get("charm")
+                if get_charm_name:
+                    charm_name = self.find_charm_name(db_nsr, str(vca_name))
                 vca_type = (
                     "lxc_proxy_charm"
                     if ee_item["juju"].get("charm") is not None
@@ -3806,6 +3818,7 @@ class NsLcm(LcmBase):
                     "vdu_name": vdu_name,
                     "type": vca_type,
                     "ee_descriptor_id": ee_descriptor_id,
+                    "charm_name": charm_name,
                 }
                 vca_index += 1
 
@@ -4977,9 +4990,7 @@ class NsLcm(LcmBase):
                     break
                 except asyncio.CancelledError:
                     raise
-                except Exception as e:  # asyncio.TimeoutError
-                    if isinstance(e, asyncio.TimeoutError):
-                        e = "Timeout"
+                except Exception as e:
                     retries -= 1
                     if retries >= 0:
                         self.logger.debug(
@@ -4990,7 +5001,9 @@ class NsLcm(LcmBase):
                         # wait and retry
                         await asyncio.sleep(retries_interval, loop=self.loop)
                     else:
-                        return "FAILED", str(e)
+                        if isinstance(e, asyncio.TimeoutError):
+                            e = N2VCException(message="Timed out waiting for action to complete")
+                        return "FAILED", getattr(e, 'message', repr(e))
 
             return "COMPLETED", output
 
@@ -5325,7 +5338,7 @@ class NsLcm(LcmBase):
             )
             self.logger.debug(
                 logging_text
-                + " task Done with result {} {}".format(
+                + "Done with result {} {}".format(
                     nslcmop_operation_state, detailed_status
                 )
             )
@@ -7552,7 +7565,17 @@ class NsLcm(LcmBase):
                     member_vnf_index = db_vnfr.get("member-vnf-index-ref")
 
                     # Check each target VDU and deploy N2VC
-                    for target_vdu in target_vnf["additionalParams"].get("vdu", None):
+                    target_vdu_list = target_vnf.get("additionalParams", {}).get("vdu", [])
+                    if not target_vdu_list:
+                        # Codigo nuevo para crear diccionario
+                        target_vdu_list = []
+                        for existing_vdu in db_vnfr.get("vdur"):
+                            vdu_name = existing_vdu.get("vdu-name", None)
+                            vdu_index = existing_vdu.get("count-index", 0)
+                            vdu_run_day1 = target_vnf.get("additionalParams", {}).get("run-day1", False)
+                            vdu_to_be_healed = {"vdu-id": vdu_name, "count-index": vdu_index, "run-day1": vdu_run_day1}
+                            target_vdu_list.append(vdu_to_be_healed)
+                    for target_vdu in target_vdu_list:
                         deploy_params_vdu = target_vdu
                         # Set run-day1 vnf level value if not vdu level value exists
                         if not deploy_params_vdu.get("run-day1") and target_vnf["additionalParams"].get("run-day1"):
@@ -7828,10 +7851,16 @@ class NsLcm(LcmBase):
         self.logger.debug(
             logging_text + "_deploy_n2vc vnfd_id={}, vdu_id={}".format(vnfd_id, vdu_id)
         )
+
+        charm_name = ""
+        get_charm_name = False
         if "execution-environment-list" in descriptor_config:
             ee_list = descriptor_config.get("execution-environment-list", [])
         elif "juju" in descriptor_config:
             ee_list = [descriptor_config]  # ns charms
+            if "execution-environment-list" not in descriptor_config:
+                # charm name is only required for ns charms
+                get_charm_name = True
         else:  # other types as script are not supported
             ee_list = []
 
@@ -7845,6 +7874,8 @@ class NsLcm(LcmBase):
             ee_descriptor_id = ee_item.get("id")
             if ee_item.get("juju"):
                 vca_name = ee_item["juju"].get("charm")
+                if get_charm_name:
+                    charm_name = self.find_charm_name(db_nsr, str(vca_name))
                 vca_type = (
                     "lxc_proxy_charm"
                     if ee_item["juju"].get("charm") is not None
@@ -7903,6 +7934,7 @@ class NsLcm(LcmBase):
                     "vdu_name": vdu_name,
                     "type": vca_type,
                     "ee_descriptor_id": ee_descriptor_id,
+                    "charm_name": charm_name,
                 }
                 vca_index += 1