Bug 1949 fixed to update the deploy_params_kdu dict instead of overwriting it
[osm/LCM.git] / osm_lcm / ns.py
index e530b8c..8eccf05 100644 (file)
@@ -440,7 +440,8 @@ class NsLcm(LcmBase):
 
     def _get_vdu_additional_params(self, db_vnfr, vdu_id):
         vdur = next(
-            vdur for vdur in db_vnfr.get("vdur") if vdu_id == vdur["vdu-id-ref"]
+            (vdur for vdur in db_vnfr.get("vdur") if vdu_id == vdur["vdu-id-ref"]),
+            {}
         )
         additional_params = vdur.get("additionalParams")
         return parse_yaml_strings(additional_params)
@@ -517,6 +518,7 @@ class NsLcm(LcmBase):
     def scale_vnfr(self, db_vnfr, vdu_create=None, vdu_delete=None, mark_delete=False):
 
         db_vdu_push_list = []
+        template_vdur = []
         db_update = {"_admin.modified": time()}
         if vdu_create:
             for vdu_id, vdu_count in vdu_create.items():
@@ -529,12 +531,22 @@ class NsLcm(LcmBase):
                     None,
                 )
                 if not vdur:
-                    raise LcmException(
-                        "Error scaling OUT VNFR for {}. There is not any existing vnfr. Scaled to 0?".format(
+                    # Read the template saved in the db:
+                    self.logger.debug(f"No vdur in the database. Using the vdur-template to scale")
+                    vdur_template = db_vnfr.get("vdur-template")
+                    if not vdur_template:
+                        raise LcmException(
+                           "Error scaling OUT VNFR for {}. No vnfr or template exists".format(
                             vdu_id
+                            )
                         )
-                    )
-
+                    vdur = vdur_template[0]
+                    #Delete a template from the database after using it
+                    self.db.set_one("vnfrs",
+                                {"_id": db_vnfr["_id"]},
+                                None,
+                                pull={"vdur-template": {"_id": vdur['_id']}}
+                            )
                 for count in range(vdu_count):
                     vdur_copy = deepcopy(vdur)
                     vdur_copy["status"] = "BUILD"
@@ -559,12 +571,17 @@ class NsLcm(LcmBase):
                             )
                         else:
                             iface.pop("mac-address", None)
-                        iface.pop(
-                            "mgmt_vnf", None
-                        )  # only first vdu can be managment of vnf
+                        if db_vnfr["vdur"]:
+                            iface.pop(
+                                "mgmt_vnf", None
+                            )  # only first vdu can be managment of vnf
                     db_vdu_push_list.append(vdur_copy)
                     # self.logger.debug("scale out, adding vdu={}".format(vdur_copy))
         if vdu_delete:
+            if len(db_vnfr["vdur"]) == 1:
+                # The scale will move to 0 instances
+                self.logger.debug(f"Scaling to 0 !, creating the template with the last vdur")
+                template_vdur = [db_vnfr["vdur"][0]]
             for vdu_id, vdu_count in vdu_delete.items():
                 if mark_delete:
                     indexes_to_delete = [
@@ -592,7 +609,14 @@ class NsLcm(LcmBase):
                             None,
                             pull={"vdur": {"_id": vdu["_id"]}},
                         )
-        db_push = {"vdur": db_vdu_push_list} if db_vdu_push_list else None
+        db_push = {}
+        if db_vdu_push_list:
+            db_push["vdur"] = db_vdu_push_list
+        if template_vdur:
+            db_push["vdur-template"] = template_vdur
+        if not db_push:
+            db_push = None
+        db_vnfr["vdur-template"] = template_vdur
         self.db.set_one("vnfrs", {"_id": db_vnfr["_id"]}, db_update, push_list=db_push)
         # modify passed dictionary db_vnfr
         db_vnfr_ = self.db.get_one("vnfrs", {"_id": db_vnfr["_id"]})
@@ -822,6 +846,37 @@ class NsLcm(LcmBase):
             if vld_params.get("common_id"):
                 target_vld["common_id"] = vld_params.get("common_id")
 
+        # modify target["ns"]["vld"] with instantiation parameters to override vnf vim-account
+        def update_ns_vld_target(target, ns_params):
+            for vnf_params in ns_params.get("vnf", ()):
+                if vnf_params.get("vimAccountId"):
+                    target_vnf = next(
+                        (
+                            vnfr
+                            for vnfr in db_vnfrs.values()
+                            if vnf_params["member-vnf-index"]
+                            == vnfr["member-vnf-index-ref"]
+                        ),
+                        None,
+                    )
+                    vdur = next((vdur for vdur in target_vnf.get("vdur", ())), None)
+                    for a_index, a_vld in enumerate(target["ns"]["vld"]):
+                        target_vld = find_in_list(
+                            get_iterable(vdur, "interfaces"),
+                            lambda iface: iface.get("ns-vld-id") == a_vld["name"],
+                        )
+                        if target_vld:
+                            if vnf_params.get("vimAccountId") not in a_vld.get(
+                                "vim_info", {}
+                            ):
+                                target["ns"]["vld"][a_index].get("vim_info").update(
+                                    {
+                                        "vim:{}".format(vnf_params["vimAccountId"]): {
+                                            "vim_network_name": ""
+                                        }
+                                    }
+                                )
+
         nslcmop_id = db_nslcmop["_id"]
         target = {
             "name": db_nsr["name"],
@@ -836,6 +891,14 @@ class NsLcm(LcmBase):
             image["vim_info"] = {}
         for flavor in target["flavor"]:
             flavor["vim_info"] = {}
+        if db_nsr.get("affinity-or-anti-affinity-group"):
+            target["affinity-or-anti-affinity-group"] = deepcopy(
+                db_nsr["affinity-or-anti-affinity-group"]
+            )
+            for affinity_or_anti_affinity_group in target[
+                "affinity-or-anti-affinity-group"
+            ]:
+                affinity_or_anti_affinity_group["vim_info"] = {}
 
         if db_nslcmop.get("lcmOperationType") != "instantiate":
             # get parameters of instantiation:
@@ -937,6 +1000,8 @@ class NsLcm(LcmBase):
                 vld_params.update(vld_instantiation_params)
             parse_vld_instantiation_params(target_vim, target_vld, vld_params, None)
             target["ns"]["vld"].append(target_vld)
+        # Update the target ns_vld if vnf vim_account is overriden by instantiation params
+        update_ns_vld_target(target, ns_params)
 
         for vnfr in db_vnfrs.values():
             vnfd = find_in_list(
@@ -1126,6 +1191,13 @@ class NsLcm(LcmBase):
                 if target_vim not in ns_image["vim_info"]:
                     ns_image["vim_info"][target_vim] = {}
 
+                # Affinity groups
+                if vdur.get("affinity-or-anti-affinity-group-id"):
+                    for ags_id in vdur["affinity-or-anti-affinity-group-id"]:
+                        ns_ags = target["affinity-or-anti-affinity-group"][int(ags_id)]
+                        if target_vim not in ns_ags["vim_info"]:
+                            ns_ags["vim_info"][target_vim] = {}
+
                 vdur["vim_info"] = {target_vim: {}}
                 # instantiation parameters
                 # if vnf_params:
@@ -1665,7 +1737,8 @@ class NsLcm(LcmBase):
                     base_folder["folder"],
                     base_folder["pkg-dir"],
                     "charms"
-                    if vca_type in ("native_charm", "lxc_proxy_charm", "k8s_proxy_charm")
+                    if vca_type
+                    in ("native_charm", "lxc_proxy_charm", "k8s_proxy_charm")
                     else "helm-charts",
                     vca_name,
                 )
@@ -1673,7 +1746,8 @@ class NsLcm(LcmBase):
                 artifact_path = "{}/Scripts/{}/{}/".format(
                     base_folder["folder"],
                     "charms"
-                    if vca_type in ("native_charm", "lxc_proxy_charm", "k8s_proxy_charm")
+                    if vca_type
+                    in ("native_charm", "lxc_proxy_charm", "k8s_proxy_charm")
                     else "helm-charts",
                     vca_name,
                 )
@@ -2004,12 +2078,10 @@ class NsLcm(LcmBase):
                     for job in prometheus_jobs:
                         self.db.set_one(
                             "prometheus_jobs",
-                            {
-                                "job_name": job["job_name"]
-                            },
+                            {"job_name": job["job_name"]},
                             job,
                             upsert=True,
-                            fail_on_empty=False
+                            fail_on_empty=False,
                         )
 
             step = "instantiated at VCA"
@@ -2313,7 +2385,9 @@ class NsLcm(LcmBase):
                     kdur_list = []
                     for kdur in vnfr["kdur"]:
                         if kdur.get("additionalParams"):
-                            kdur["additionalParams"] = json.loads(kdur["additionalParams"])
+                            kdur["additionalParams"] = json.loads(
+                                kdur["additionalParams"]
+                            )
                         kdur_list.append(kdur)
                     vnfr["kdur"] = kdur_list
 
@@ -2511,8 +2585,8 @@ class NsLcm(LcmBase):
                         )
                         deploy_params_kdu = {"OSM": get_osm_params(db_vnfr)}
                         if kdur.get("additionalParams"):
-                            deploy_params_kdu = parse_yaml_strings(
-                                kdur["additionalParams"]
+                            deploy_params_kdu.update(
+                                parse_yaml_strings(kdur["additionalParams"].copy())
                             )
 
                         self._deploy_n2vc(
@@ -2784,7 +2858,9 @@ class NsLcm(LcmBase):
                 if requirer_id != nsd["id"]:
                     requirer_dict["vnf-profile-id"] = requirer_id
             else:
-                raise Exception("provider/requirer or entities must be included in the relation.")
+                raise Exception(
+                    "provider/requirer or entities must be included in the relation."
+                )
             relation_provider = self._update_ee_relation_data_with_implicit_data(
                 nsr_id, nsd, provider_dict, cached_vnfds
             )
@@ -2836,7 +2912,9 @@ class NsLcm(LcmBase):
                 if requirer_id != vnfd_id:
                     requirer_dict["vdu-profile-id"] = requirer_id
             else:
-                raise Exception("provider/requirer or entities must be included in the relation.")
+                raise Exception(
+                    "provider/requirer or entities must be included in the relation."
+                )
             relation_provider = self._update_ee_relation_data_with_implicit_data(
                 nsr_id, nsd, provider_dict, cached_vnfds, vnf_profile_id=vnf_profile_id
             )
@@ -4864,7 +4942,9 @@ class NsLcm(LcmBase):
                     kdur_list = []
                     for kdur in db_vnfr["kdur"]:
                         if kdur.get("additionalParams"):
-                            kdur["additionalParams"] = json.loads(kdur["additionalParams"])
+                            kdur["additionalParams"] = json.loads(
+                                kdur["additionalParams"]
+                            )
                         kdur_list.append(kdur)
                     db_vnfr["kdur"] = kdur_list
                 step = "Getting vnfd from database"
@@ -5737,7 +5817,7 @@ class NsLcm(LcmBase):
                 ] = "Deleting the execution environments"
                 scale_process = "VCA"
                 for vca_info in vca_scaling_info:
-                    if vca_info["type"] == "delete":
+                    if vca_info["type"] == "delete" and not vca_info.get("osm_kdu_id"):
                         member_vnf_index = str(vca_info["member-vnf-index"])
                         self.logger.debug(
                             logging_text + "vdu info: {}".format(vca_info)
@@ -5750,14 +5830,6 @@ class NsLcm(LcmBase):
                             ] = "Scaling member_vnf_index={}, vdu_id={}, vdu_index={} ".format(
                                 member_vnf_index, vdu_id, vdu_index
                             )
-                        else:
-                            vdu_index = 0
-                            kdu_id = vca_info["osm_kdu_id"]
-                            stage[
-                                1
-                            ] = "Scaling member_vnf_index={}, kdu_id={}, vdu_index={} ".format(
-                                member_vnf_index, kdu_id, vdu_index
-                            )
                         stage[2] = step = "Scaling in VCA"
                         self._write_op_status(op_id=nslcmop_id, stage=stage)
                         vca_update = db_nsr["_admin"]["deployed"]["VCA"]
@@ -5873,7 +5945,7 @@ class NsLcm(LcmBase):
                 ] = "Creating new execution environments"
                 scale_process = "VCA"
                 for vca_info in vca_scaling_info:
-                    if vca_info["type"] == "create":
+                    if vca_info["type"] == "create" and not vca_info.get("osm_kdu_id"):
                         member_vnf_index = str(vca_info["member-vnf-index"])
                         self.logger.debug(
                             logging_text + "vdu info: {}".format(vca_info)
@@ -5961,43 +6033,6 @@ class NsLcm(LcmBase):
                                     task_instantiation_info=tasks_dict_info,
                                     stage=stage,
                                 )
-                        else:
-                            kdu_name = vca_info["osm_kdu_id"]
-                            descriptor_config = get_configuration(db_vnfd, kdu_name)
-                            if descriptor_config:
-                                vdu_id = None
-                                kdu_index = int(vca_info["kdu_index"])
-                                vdu_name = None
-                                kdur = next(
-                                    x
-                                    for x in db_vnfr["kdur"]
-                                    if x["kdu-name"] == kdu_name
-                                )
-                                deploy_params_kdu = {"OSM": get_osm_params(db_vnfr)}
-                                if kdur.get("additionalParams"):
-                                    deploy_params_kdu = parse_yaml_strings(
-                                        kdur["additionalParams"]
-                                    )
-
-                                self._deploy_n2vc(
-                                    logging_text=logging_text,
-                                    db_nsr=db_nsr,
-                                    db_vnfr=db_vnfr,
-                                    nslcmop_id=nslcmop_id,
-                                    nsr_id=nsr_id,
-                                    nsi_id=nsi_id,
-                                    vnfd_id=vnfd_id,
-                                    vdu_id=vdu_id,
-                                    kdu_name=kdu_name,
-                                    member_vnf_index=member_vnf_index,
-                                    vdu_index=kdu_index,
-                                    vdu_name=vdu_name,
-                                    deploy_params=deploy_params_kdu,
-                                    descriptor_config=descriptor_config,
-                                    base_folder=base_folder,
-                                    task_instantiation_info=tasks_dict_info,
-                                    stage=stage,
-                                )
             # SCALE-UP VCA - END
             scale_process = None
 
@@ -6387,13 +6422,7 @@ class NsLcm(LcmBase):
             )
 
     async def extract_prometheus_scrape_jobs(
-        self,
-        ee_id,
-        artifact_path,
-        ee_config_descriptor,
-        vnfr_id,
-        nsr_id,
-        target_ip
+        self, ee_id, artifact_path, ee_config_descriptor, vnfr_id, nsr_id, target_ip
     ):
         # look if exist a file called 'prometheus*.j2' and
         artifact_content = self.fs.dir_ls(artifact_path)