Correcting invalid vcpu calculation and vcpu pinning policy evaluation.
[osm/RO.git] / NG-RO / osm_ng_ro / ns.py
index c6f918b..70217d6 100644 (file)
@@ -722,9 +722,12 @@ class Ns(object):
             guest_epa_quota.get("cpu-pinning-policy") == "DEDICATED"
             and not epa_vcpu_set
         ):
+            # Pinning policy "REQUIRE" uses threads as host should support SMT architecture
+            # Pinning policy "ISOLATE" uses cores as host should not support SMT architecture
+            # Pinning policy "PREFER" uses threads in case host supports SMT architecture
             numa[
                 "cores"
-                if guest_epa_quota.get("cpu-thread-pinning-policy") != "PREFER"
+                if guest_epa_quota.get("cpu-thread-pinning-policy") == "ISOLATE"
                 else "threads"
             ] = max(vcpu_count, 1)
             local_epa_vcpu_set = True
@@ -949,7 +952,7 @@ class Ns(object):
                     "id": vim_info.get("vim_network_id"),
                 },
             }
-        elif target_vld.get("mgmt-network"):
+        elif target_vld.get("mgmt-network") and not vim_info.get("provider_network"):
             extra_dict["find_params"] = {
                 "mgmt": True,
                 "name": target_vld["id"],
@@ -1030,6 +1033,7 @@ class Ns(object):
                             persistent_root_disk[vsd["id"]] = {
                                 "image_id": vdu.get("sw-image-desc"),
                                 "size": root_disk.get("size-of-storage"),
+                                "keep": Ns.is_volume_keeping_required(root_disk),
                             }
 
                             disk_list.append(persistent_root_disk[vsd["id"]])
@@ -1073,9 +1077,29 @@ class Ns(object):
                     if disk["id"] not in persistent_disk.keys():
                         persistent_disk[disk["id"]] = {
                             "size": disk.get("size-of-storage"),
+                            "keep": Ns.is_volume_keeping_required(disk),
                         }
                         disk_list.append(persistent_disk[disk["id"]])
 
+    @staticmethod
+    def is_volume_keeping_required(virtual_storage_desc: Dict[str, Any]) -> bool:
+        """Function to decide keeping persistent volume
+        upon VDU deletion.
+
+        Args:
+            virtual_storage_desc (Dict[str, Any]): virtual storage description dictionary
+
+        Returns:
+            bool (True/False)
+        """
+
+        if not virtual_storage_desc.get("vdu-storage-requirements"):
+            return False
+        for item in virtual_storage_desc.get("vdu-storage-requirements", {}):
+            if item.get("key") == "keep-volume" and item.get("value") == "true":
+                return True
+        return False
+
     @staticmethod
     def _sort_vdu_interfaces(target_vdu: dict) -> None:
         """Sort the interfaces according to position number.
@@ -1397,13 +1421,13 @@ class Ns(object):
             if vdu["name"] == target_vdu["vdu-name"]:
                 for vsd in vnfd.get("virtual-storage-desc", ()):
                     root_disk = Ns._select_persistent_root_disk(vsd, vdu)
-
                     if not root_disk:
                         continue
 
                     persistent_root_disk[vsd["id"]] = {
                         "image_id": vdu.get("sw-image-desc"),
                         "size": root_disk["size-of-storage"],
+                        "keep": Ns.is_volume_keeping_required(root_disk),
                     }
 
                     disk_list.append(persistent_root_disk[vsd["id"]])
@@ -1434,6 +1458,7 @@ class Ns(object):
                 ):
                     persistent_ordinary_disk[disk["id"]] = {
                         "size": disk["size-of-storage"],
+                        "keep": Ns.is_volume_keeping_required(disk),
                     }
                     disk_list.append(persistent_ordinary_disk[disk["id"]])