+ @staticmethod
+ def find_persistent_root_volumes(
+ vnfd: dict,
+ target_vdu: str,
+ vdu_instantiation_volumes_list: list,
+ disk_list: list,
+ ) -> (list, dict):
+ """Find the persistent root volumes and add them to the disk_list
+ by parsing the instantiation parameters
+
+ Args:
+ vnfd: VNFD
+ target_vdu: processed VDU
+ vdu_instantiation_volumes_list: instantiation parameters for the each VDU as a list
+ disk_list: to be filled up
+
+ Returns:
+ disk_list: filled VDU list which is used for VDU creation
+
+ """
+ persistent_root_disk = {}
+
+ for vdu, vsd in product(
+ vnfd.get("vdu", ()), vnfd.get("virtual-storage-desc", ())
+ ):
+ if (
+ vdu["name"] == target_vdu["vdu-name"]
+ and vsd.get("id") == vdu.get("virtual-storage-desc", [[]])[0]
+ ):
+ root_disk = vsd
+ if (
+ root_disk.get("type-of-storage")
+ == "persistent-storage:persistent-storage"
+ ):
+ for vdu_volume in vdu_instantiation_volumes_list:
+
+ if (
+ vdu_volume["vim-volume-id"]
+ and root_disk["id"] == vdu_volume["name"]
+ ):
+
+ persistent_root_disk[vsd["id"]] = {
+ "vim_volume_id": vdu_volume["vim-volume-id"],
+ "image_id": vdu.get("sw-image-desc"),
+ }
+
+ disk_list.append(persistent_root_disk[vsd["id"]])
+
+ # There can be only one root disk, when we find it, it will return the result
+ return disk_list, persistent_root_disk
+
+ else:
+
+ if root_disk.get("size-of-storage"):
+ persistent_root_disk[vsd["id"]] = {
+ "image_id": vdu.get("sw-image-desc"),
+ "size": root_disk.get("size-of-storage"),
+ }
+
+ disk_list.append(persistent_root_disk[vsd["id"]])
+ return disk_list, persistent_root_disk
+
+ return disk_list, persistent_root_disk
+
+ @staticmethod
+ def find_persistent_volumes(
+ persistent_root_disk: dict,
+ target_vdu: str,
+ vdu_instantiation_volumes_list: list,
+ disk_list: list,
+ ) -> list:
+ """Find the ordinary persistent volumes and add them to the disk_list
+ by parsing the instantiation parameters
+
+ Args:
+ persistent_root_disk: persistent root disk dictionary
+ target_vdu: processed VDU
+ vdu_instantiation_volumes_list: instantiation parameters for the each VDU as a list
+ disk_list: to be filled up
+
+ Returns:
+ disk_list: filled VDU list which is used for VDU creation
+
+ """
+ # Find the ordinary volumes which are not added to the persistent_root_disk
+ persistent_disk = {}
+ for disk in target_vdu.get("virtual-storages", {}):
+ if (
+ disk.get("type-of-storage") == "persistent-storage:persistent-storage"
+ and disk["id"] not in persistent_root_disk.keys()
+ ):
+ for vdu_volume in vdu_instantiation_volumes_list:
+
+ if vdu_volume["vim-volume-id"] and disk["id"] == vdu_volume["name"]:
+
+ persistent_disk[disk["id"]] = {
+ "vim_volume_id": vdu_volume["vim-volume-id"],
+ }
+ disk_list.append(persistent_disk[disk["id"]])
+
+ else:
+ if disk["id"] not in persistent_disk.keys():
+ persistent_disk[disk["id"]] = {
+ "size": disk.get("size-of-storage"),
+ }
+ disk_list.append(persistent_disk[disk["id"]])
+
+ return disk_list
+