Fix Bug 1785 Openstack VIM connector failed Unittests
[osm/RO.git] / NG-RO / osm_ng_ro / ns.py
index f3b073e..df5dfd2 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):
@@ -1000,10 +1002,13 @@ class Ns(object):
                 if deep_get(
                     tasks_by_target_record_id,
                     net_text,
+                    "extra_dict",
                     "params",
                     "net_type",
                 ):
-                    tasks_by_target_record_id[net_text]["params"]["net_type"] = "data"
+                    tasks_by_target_record_id[net_text]["extra_dict"]["params"][
+                        "net_type"
+                    ] = "data"
 
                 net_item["use"] = "data"
                 net_item["model"] = interface["type"]
@@ -1073,6 +1078,19 @@ class Ns(object):
                 == "persistent-storage:persistent-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(
                 indata["name"][:16],
@@ -1084,6 +1102,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,
@@ -1093,6 +1112,39 @@ 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"],
+        }
+
+        extra_dict["params"] = {
+            "affinity_group_data": affinity_group_data,
+        }
+
+        return extra_dict
+
     def calculate_diff_items(
         self,
         indata,
@@ -1153,7 +1205,7 @@ class Ns(object):
         if item in ("net", "vdu"):
             if vnfr is None:
                 db_record = "nsrs:{}:{}".format(nsr_id, db_path)
-                target_list = indata.get("ns", []).get(db_path, []) 
+                target_list = indata.get("ns", []).get(db_path, [])
                 existing_list = db_nsr.get(db_path, [])
             else:
                 db_record = "vnfrs:{}:{}".format(vnfr_id, db_path)
@@ -1163,7 +1215,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, [])
@@ -1285,18 +1337,18 @@ class Ns(object):
                     "task_index": task_index,
                 }
 
-                diff_items.append(
-                    {
-                        "deployment_info": deployment_info,
-                        "target_id": target_vim,
-                        "item": item_,
-                        "action": "CREATE",
-                        "target_record": f"{db_record}.{item_index}.vim_info.{target_vim}",
-                        "target_record_id": target_record_id,
-                        "extra_dict": extra_dict,
-                        "common_id": target_item.get("common_id", None),
-                    }
-                )
+                new_item = {
+                    "deployment_info": deployment_info,
+                    "target_id": target_vim,
+                    "item": item_,
+                    "action": "CREATE",
+                    "target_record": f"{db_record}.{item_index}.vim_info.{target_vim}",
+                    "target_record_id": target_record_id,
+                    "extra_dict": extra_dict,
+                    "common_id": target_item.get("common_id", None),
+                }
+                diff_items.append(new_item)
+                tasks_by_target_record_id[target_record_id] = new_item
                 task_index += 1
 
                 db_nsr_update[db_path + ".{}".format(item_index)] = target_item
@@ -1339,7 +1391,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,