Fix Bug 2282: Can't instantiate NS using a pre-existing volume
[osm/RO.git] / NG-RO / osm_ng_ro / ns.py
index cd75025..6cea780 100644 (file)
@@ -999,6 +999,7 @@ class Ns(object):
                             disk_list.append(persistent_root_disk[vsd["id"]])
 
                             return persistent_root_disk
+                return persistent_root_disk
 
     @staticmethod
     def find_persistent_volumes(
@@ -1422,7 +1423,9 @@ class Ns(object):
         persistent_root_disk: dict,
         persistent_ordinary_disk: dict,
         disk_list: list,
+        extra_dict: dict,
         vnf_id: str = None,
+        nsr_id: str = None,
     ) -> None:
         """Fill the disk list by adding persistent ordinary disks.
 
@@ -1448,6 +1451,10 @@ class Ns(object):
                         "multiattach": multiattach,
                     }
                     disk_list.append(persistent_ordinary_disk[disk["id"]])
+                    if multiattach:  # VDU creation has to wait for shared volumes
+                        extra_dict["depends_on"].append(
+                            f"nsrs:{nsr_id}:shared-volumes.{name}"
+                        )
 
     @staticmethod
     def _prepare_vdu_affinity_group_list(
@@ -1598,7 +1605,9 @@ class Ns(object):
                 persistent_root_disk,
                 persistent_ordinary_disk,
                 disk_list,
+                extra_dict,
                 vnfd["id"],
+                nsr_id,
             )
 
         affinity_group_list = Ns._prepare_vdu_affinity_group_list(
@@ -1638,6 +1647,7 @@ class Ns(object):
             "size": target_shared_volume["size-of-storage"],
             "name": target_shared_volume["id"],
             "type": target_shared_volume["type-of-storage"],
+            "keep": Ns.is_volume_keeping_required(target_shared_volume),
         }
         extra_dict["params"] = shared_volume_data
         return extra_dict
@@ -2121,7 +2131,6 @@ class Ns(object):
             "image",
             "flavor",
             "affinity-or-anti-affinity-group",
-            "shared-volumes",
         ]:
             self.logger.debug("process NS={} {}".format(nsr_id, item))
             diff_items, task_index = self.calculate_diff_items(
@@ -2141,7 +2150,7 @@ class Ns(object):
         # VNF vlds and vdus
         for vnfr_id, vnfr in db_vnfrs.items():
             # vnfr_id need to be set as global variable for among others nested method _process_vdu_params
-            for item in ["net", "vdu"]:
+            for item in ["net", "vdu", "shared-volumes"]:
                 self.logger.debug("process VNF={} {}".format(vnfr_id, item))
                 diff_items, task_index = self.calculate_diff_items(
                     indata=indata,
@@ -2889,7 +2898,9 @@ class Ns(object):
         extra_dict,
     ):
         self._assign_vim(target_vim)
-        target_record = "vnfrs:{}:vdur.{}".format(vnf_id, vdu_index)
+        target_record = "vnfrs:{}:vdur.{}.vim_info.{}".format(
+            vnf_id, vdu_index, target_vim
+        )
         target_record_id = "vnfrs:{}:vdur.{}".format(vnf_id, vdu_id)
         deployment_info = {
             "action_id": action_id,
@@ -2995,7 +3006,9 @@ class Ns(object):
     ):
         target_vim, vim_info = next(k_v for k_v in vdu["vim_info"].items())
         self._assign_vim(target_vim)
-        target_record = "vnfrs:{}:vdur.{}".format(vnf["_id"], vdu_index)
+        target_record = "vnfrs:{}:vdur.{}.vim_info.{}".format(
+            vnf["_id"], vdu_index, target_vim
+        )
         target_record_id = "vnfrs:{}:vdur.{}".format(vnf["_id"], vdu["id"])
         deployment_info = {
             "action_id": action_id,
@@ -3109,7 +3122,9 @@ class Ns(object):
     ):
         target_vim, vim_info = next(k_v for k_v in vdu["vim_info"].items())
         self._assign_vim(target_vim)
-        target_record = "vnfrs:{}:vdur.{}".format(vnf["_id"], vdu_index)
+        target_record = "vnfrs:{}:vdur.{}.vim_info.{}".format(
+            vnf["_id"], vdu_index, target_vim
+        )
         target_record_id = "vnfrs:{}:vdur.{}".format(vnf["_id"], vdu["id"])
         deployment_info = {
             "action_id": action_id,