Fix Bug 1607 Interface position is not taken into account and
[osm/RO.git] / NG-RO / osm_ng_ro / ns.py
index 80d711f..5e5cd9c 100644 (file)
@@ -693,7 +693,9 @@ class Ns(object):
 
                 return extra_dict
 
-            def _process_affinity_group_params(target_affinity_group, vim_info, target_record_id):
+            def _process_affinity_group_params(
+                target_affinity_group, vim_info, target_record_id
+            ):
                 extra_dict = {}
 
                 affinity_group_data = {
@@ -702,6 +704,11 @@ class Ns(object):
                     "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,
                 }
@@ -805,6 +812,45 @@ class Ns(object):
                 extra_dict = {"depends_on": [image_text, flavor_text]}
                 net_list = []
 
+                # If the position info is provided for all the interfaces, it will be sorted
+                # according to position number ascendingly.
+                if all(
+                    i.get("position") + 1
+                    for i in target_vdu["interfaces"]
+                    if i.get("position") is not None
+                ):
+                    sorted_interfaces = sorted(
+                        target_vdu["interfaces"],
+                        key=lambda x: (x.get("position") is None, x.get("position")),
+                    )
+                    target_vdu["interfaces"] = sorted_interfaces
+
+                # If the position info is provided for some interfaces but not all of them, the interfaces
+                # which has specific position numbers will be placed and others' positions will not be taken care.
+                else:
+                    if any(
+                        i.get("position") + 1
+                        for i in target_vdu["interfaces"]
+                        if i.get("position") is not None
+                    ):
+                        n = len(target_vdu["interfaces"])
+                        sorted_interfaces = [-1] * n
+                        k, m = 0, 0
+                        while k < n:
+                            if target_vdu["interfaces"][k].get("position"):
+                                idx = target_vdu["interfaces"][k]["position"]
+                                sorted_interfaces[idx - 1] = target_vdu["interfaces"][k]
+                            k += 1
+                        while m < n:
+                            if not target_vdu["interfaces"][m].get("position"):
+                                idy = sorted_interfaces.index(-1)
+                                sorted_interfaces[idy] = target_vdu["interfaces"][m]
+                            m += 1
+
+                        target_vdu["interfaces"] = sorted_interfaces
+
+                # If the position info is not provided for the interfaces, interfaces will be attached
+                # according to the order in the VNFD.
                 for iface_index, interface in enumerate(target_vdu["interfaces"]):
                     if interface.get("ns-vld-id"):
                         net_text = ns_preffix + ":vld." + interface["ns-vld-id"]
@@ -914,26 +960,55 @@ 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 = self.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"]:
+                    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
+                            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["affinity_group_id"] = (
+                            "TASK-" + affinity_group_text
+                        )
                         affinity_group_list.append(affinity_group)
 
                 extra_dict["params"] = {
@@ -1190,8 +1265,11 @@ class Ns(object):
                     step = "process NS Affinity Groups"
                     _process_items(
                         target_list=indata.get("affinity-or-anti-affinity-group") or [],
-                        existing_list=db_nsr.get("affinity-or-anti-affinity-group") or [],
-                        db_record="nsrs:{}:affinity-or-anti-affinity-group".format(nsr_id),
+                        existing_list=db_nsr.get("affinity-or-anti-affinity-group")
+                        or [],
+                        db_record="nsrs:{}:affinity-or-anti-affinity-group".format(
+                            nsr_id
+                        ),
                         db_update=db_nsr_update,
                         db_path="affinity-or-anti-affinity-group",
                         item="affinity-or-anti-affinity-group",