Fix Bug 2028 Multi-site VNF creation fails
[osm/LCM.git] / osm_lcm / ns.py
index dbdff3e..19be208 100644 (file)
@@ -538,7 +538,7 @@ class NsLcm(LcmBase):
                 )
                 if not vdur:
                     # Read the template saved in the db:
-                    self.logger.debug(f"No vdur in the database. Using the vdur-template to scale")
+                    self.logger.debug("No vdur in the database. Using the vdur-template to scale")
                     vdur_template = db_vnfr.get("vdur-template")
                     if not vdur_template:
                         raise LcmException(
@@ -547,12 +547,13 @@ class NsLcm(LcmBase):
                             )
                         )
                     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']}}
-                            )
+                    # 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"
@@ -586,7 +587,7 @@ class NsLcm(LcmBase):
         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")
+                self.logger.debug("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:
@@ -871,18 +872,55 @@ class NsLcm(LcmBase):
                             get_iterable(vdur, "interfaces"),
                             lambda iface: iface.get("ns-vld-id") == a_vld["name"],
                         )
+
+                        vld_params = find_in_list(
+                            get_iterable(ns_params, "vld"),
+                            lambda v_vld: v_vld["name"] in (a_vld["name"], a_vld["id"]),
+                        )
                         if target_vld:
+
                             if vnf_params.get("vimAccountId") not in a_vld.get(
                                 "vim_info", {}
                             ):
+                                target_vim_network_list = [
+                                    v for _, v in a_vld.get("vim_info").items()
+                                ]
+                                target_vim_network_name = next(
+                                    (
+                                        item.get("vim_network_name", "")
+                                        for item in target_vim_network_list
+                                    ),
+                                    "",
+                                )
+
                                 target["ns"]["vld"][a_index].get("vim_info").update(
                                     {
                                         "vim:{}".format(vnf_params["vimAccountId"]): {
-                                            "vim_network_name": ""
+                                            "vim_network_name": target_vim_network_name,
                                         }
                                     }
                                 )
 
+                                if vld_params:
+                                    for param in ("vim-network-name", "vim-network-id"):
+                                        if vld_params.get(param) and isinstance(
+                                            vld_params[param], dict
+                                        ):
+                                            for vim, vim_net in vld_params[
+                                                param
+                                            ].items():
+                                                other_target_vim = "vim:" + vim
+                                                populate_dict(
+                                                    target["ns"]["vld"][a_index].get(
+                                                        "vim_info"
+                                                    ),
+                                                    (
+                                                        other_target_vim,
+                                                        param.replace("-", "_"),
+                                                    ),
+                                                    vim_net,
+                                                )
+
         nslcmop_id = db_nslcmop["_id"]
         target = {
             "name": db_nsr["name"],
@@ -1974,6 +2012,9 @@ class NsLcm(LcmBase):
                     step = "Waiting to VM being up and getting IP address"
                 self.logger.debug(logging_text + step)
 
+                # default rw_mgmt_ip to None, avoiding the non definition of the variable
+                rw_mgmt_ip = None
+
                 # n2vc_redesign STEP 5.1
                 # wait for RO (ip-address) Insert pub_key into VM
                 if vnfr_id:
@@ -1981,7 +2022,13 @@ class NsLcm(LcmBase):
                         rw_mgmt_ip = await self.wait_kdu_up(
                             logging_text, nsr_id, vnfr_id, kdu_name
                         )
-                    else:
+
+                    # This verification is needed in order to avoid trying to add a public key
+                    # to a VM, when the VNF is a KNF (in the edge case where the user creates a VCA
+                    # for a KNF and not for its KDUs, the previous verification gives False, and the code
+                    # jumps to this block, meaning that there is the need to verify if the VNF is actually a VNF
+                    # or it is a KNF)
+                    elif db_vnfr.get('vdur'):
                         rw_mgmt_ip = await self.wait_vm_up_insert_key_ro(
                             logging_text,
                             nsr_id,
@@ -1991,8 +2038,6 @@ class NsLcm(LcmBase):
                             user=user,
                             pub_key=pub_key,
                         )
-                else:
-                    rw_mgmt_ip = None  # This is for a NS configuration
 
                 self.logger.debug(logging_text + " VM_ip_address={}".format(rw_mgmt_ip))
 
@@ -3564,7 +3609,7 @@ class NsLcm(LcmBase):
                             vnfd_with_id,
                             k8s_instance_info,
                             k8params=desc_params,
-                            timeout=600,
+                            timeout=1800,
                             vca_id=vca_id,
                         )
                     )