Fixes bug 2013 : Passing Anti-affinity group as additionalParamsForVnf
[osm/RO.git] / NG-RO / osm_ng_ro / ns.py
index b6524cc..9642a8c 100644 (file)
@@ -113,12 +113,14 @@ class Ns(object):
             "image": Ns._process_image_params,
             "flavor": Ns._process_flavor_params,
             "vdu": Ns._process_vdu_params,
+            "affinity-or-anti-affinity-group": Ns._process_affinity_group_params,
         }
         self.db_path_map = {
             "net": "vld",
             "image": "image",
             "flavor": "flavor",
             "vdu": "vdur",
+            "affinity-or-anti-affinity-group": "affinity-or-anti-affinity-group",
         }
 
     def init_db(self, target_version):
@@ -1067,14 +1069,47 @@ class Ns(object):
         if ssh_keys:
             cloud_config["key-pairs"] = ssh_keys
 
-        disk_list = None
+        persistent_root_disk = {}
+        disk_list = []
+        vnfd_id = vnfr["vnfd-id"]
+        vnfd = db.get_one("vnfds", {"_id": vnfd_id})
+        for vdu in vnfd.get("vdu", ()):
+            if vdu["name"] == target_vdu["vdu-name"]:
+                for vsd in vnfd.get("virtual-storage-desc", ()):
+                    if vsd.get("id") == vdu.get("virtual-storage-desc", [[]])[0]:
+                        root_disk = vsd
+                        if root_disk.get(
+                            "type-of-storage"
+                        ) == "persistent-storage:persistent-storage" and root_disk.get(
+                            "size-of-storage"
+                        ):
+                            persistent_root_disk[vsd["id"]] = {
+                                "image_id": vdu.get("sw-image-desc"),
+                                "size": root_disk["size-of-storage"],
+                            }
+                            disk_list.append(persistent_root_disk[vsd["id"]])
+
         if target_vdu.get("virtual-storages"):
-            disk_list = [
-                {"size": disk["size-of-storage"]}
-                for disk in target_vdu["virtual-storages"]
-                if disk.get("type-of-storage")
-                == "persistent-storage:persistent-storage"
-            ]
+            for disk in target_vdu["virtual-storages"]:
+                if (
+                    disk.get("type-of-storage")
+                    == "persistent-storage:persistent-storage"
+                    and disk["id"] not in persistent_root_disk.keys()
+                ):
+                    disk_list.append({"size": disk["size-of-storage"]})
+
+        affinity_group_list = []
+
+        if target_vdu.get("affinity-or-anti-affinity-group-id"):
+            affinity_group = {}
+            for affinity_group_id in target_vdu["affinity-or-anti-affinity-group-id"]:
+                affinity_group_text = (
+                    ns_preffix + ":affinity-or-anti-affinity-group." + affinity_group_id
+                )
+
+                extra_dict["depends_on"].append(affinity_group_text)
+                affinity_group["affinity_group_id"] = "TASK-" + affinity_group_text
+                affinity_group_list.append(affinity_group)
 
         extra_dict["params"] = {
             "name": "{}-{}-{}-{}".format(
@@ -1087,6 +1122,7 @@ class Ns(object):
             "start": True,
             "image_id": "TASK-" + image_text,
             "flavor_id": "TASK-" + flavor_text,
+            "affinity_group_list": affinity_group_list,
             "net_list": net_list,
             "cloud_config": cloud_config or None,
             "disk_list": disk_list,
@@ -1096,6 +1132,44 @@ class Ns(object):
 
         return extra_dict
 
+    @staticmethod
+    def _process_affinity_group_params(
+        target_affinity_group: Dict[str, Any],
+        indata: Dict[str, Any],
+        vim_info: Dict[str, Any],
+        target_record_id: str,
+        **kwargs: Dict[str, Any],
+    ) -> Dict[str, Any]:
+        """Get affinity or anti-affinity group parameters.
+
+        Args:
+            target_affinity_group (Dict[str, Any]): [description]
+            indata (Dict[str, Any]): [description]
+            vim_info (Dict[str, Any]): [description]
+            target_record_id (str): [description]
+
+        Returns:
+            Dict[str, Any]: [description]
+        """
+        extra_dict = {}
+
+        affinity_group_data = {
+            "name": target_affinity_group["name"],
+            "type": target_affinity_group["type"],
+            "scope": target_affinity_group["scope"],
+        }
+
+        if target_affinity_group.get("vim-affinity-group-id"):
+            affinity_group_data["vim-affinity-group-id"] = target_affinity_group[
+                "vim-affinity-group-id"
+            ]
+
+        extra_dict["params"] = {
+            "affinity_group_data": affinity_group_data,
+        }
+
+        return extra_dict
+
     def calculate_diff_items(
         self,
         indata,
@@ -1166,7 +1240,7 @@ class Ns(object):
                 )
                 target_list = target_vnf.get(db_path, []) if target_vnf else []
                 existing_list = vnfr.get(db_path, [])
-        elif item in ("image", "flavor"):
+        elif item in ("image", "flavor", "affinity-or-anti-affinity-group"):
             db_record = "nsrs:{}:{}".format(nsr_id, db_path)
             target_list = indata.get(item, [])
             existing_list = db_nsr.get(item, [])
@@ -1342,7 +1416,7 @@ class Ns(object):
         changes_list = []
 
         # NS vld, image and flavor
-        for item in ["net", "image", "flavor"]:
+        for item in ["net", "image", "flavor", "affinity-or-anti-affinity-group"]:
             self.logger.debug("process NS={} {}".format(nsr_id, item))
             diff_items, task_index = self.calculate_diff_items(
                 indata=indata,