Fix Bug 2282: Can't instantiate NS using a pre-existing volume
[osm/RO.git] / NG-RO / osm_ng_ro / tests / test_ns.py
index 97f072b..27c21a6 100644 (file)
@@ -206,6 +206,25 @@ expected_extra_dict2 = {
         "start": True,
     },
 }
+
+expected_extra_dict3 = {
+    "depends_on": [
+        f"{ns_preffix}:image.0",
+    ],
+    "params": {
+        "affinity_group_list": [],
+        "availability_zone_index": None,
+        "availability_zone_list": None,
+        "cloud_config": None,
+        "description": "without_volumes-VM",
+        "disk_list": [],
+        "flavor_id": "flavor_test",
+        "image_id": f"TASK-{ns_preffix}:image.0",
+        "name": "sample_name-vnf-several-volu-without_volumes-VM-0",
+        "net_list": [],
+        "start": True,
+    },
+}
 tasks_by_target_record_id = {
     "nsrs:th47f48-9870-4169-b758-9732e1ff40f3": {
         "extra_dict": {
@@ -307,6 +326,77 @@ runcmd:
      - [ ls, -l, / ]
      - [ sh, -xc, "echo $(date) '& rm -rf /'" ]
 """
+vdu_id = "bb9c43f9-10a2-4569-a8a8-957c3528b6d1"
+vnf_id = "665b4165-ce24-4320-bf19-b9a45bade49f"
+target_vim = "vim:f9f370ac-0d44-41a7-9000-457f2332bc35"
+action_id = "bb937f49-3870-4169-b758-9732e1ff40f3"
+nsr_id_2 = "993166fe-723e-4680-ac4b-b1af2541ae31"
+target_record_1 = "vnfrs:665b4165-ce24-4320-bf19-b9a45bade49f:vdur.1.vim_info.vim:f9f370ac-0d44-41a7-9000-457f2332bc35"
+target_record_id = (
+    "vnfrs:665b4165-ce24-4320-bf19-b9a45bade49f:"
+    "vdur.bb9c43f9-10a2-4569-a8a8-957c3528b6d1"
+)
+expected_result_vertical_scale = {
+    "target_id": target_vim,
+    "action_id": "bb937f49-3870-4169-b758-9732e1ff40f3",
+    "nsr_id": "993166fe-723e-4680-ac4b-b1af2541ae31",
+    "task_id": "bb937f49-3870-4169-b758-9732e1ff40f3:1",
+    "status": "SCHEDULED",
+    "action": "EXEC",
+    "item": "verticalscale",
+    "target_record": target_record_1,
+    "target_record_id": target_record_id,
+    "params": {
+        "vim_vm_id": "f37b18ef-3caa-4dc9-ab91-15c669b16396",
+        "flavor_dict": "flavor_dict",
+    },
+}
+vdu = {
+    "id": vdu_id,
+    "vim_info": {target_vim: {"interfaces": []}},
+}
+vnf = {"_id": vnf_id}
+extra_dict_vertical_scale = {
+    "params": {
+        "vim_vm_id": "f37b18ef-3caa-4dc9-ab91-15c669b16396",
+        "flavor_dict": "flavor_dict",
+    },
+}
+extra_dict_migrate = {
+    "params": {
+        "vim_vm_id": "f37b18ef-3caa-4dc9-ab91-15c669b16396",
+        "migrate_host": "migrateToHost",
+    },
+}
+expected_result_migrate = {
+    "target_id": target_vim,
+    "action_id": "bb937f49-3870-4169-b758-9732e1ff40f3",
+    "nsr_id": "993166fe-723e-4680-ac4b-b1af2541ae31",
+    "task_id": "bb937f49-3870-4169-b758-9732e1ff40f3:1",
+    "status": "SCHEDULED",
+    "action": "EXEC",
+    "item": "migrate",
+    "target_record": "vnfrs:665b4165-ce24-4320-bf19-b9a45bade49f:vdur.1.vim_info.vim:f9f370ac-0d44-41a7-9000-457f2332bc35",
+    "target_record_id": target_record_id,
+    "params": {
+        "vim_vm_id": "f37b18ef-3caa-4dc9-ab91-15c669b16396",
+        "migrate_host": "migrateToHost",
+    },
+}
+expected_result_rebuild_start_stop = {
+    "target_id": target_vim,
+    "action_id": "bb937f49-3870-4169-b758-9732e1ff40f3",
+    "nsr_id": "993166fe-723e-4680-ac4b-b1af2541ae31",
+    "task_id": "bb937f49-3870-4169-b758-9732e1ff40f3:0",
+    "status": "SCHEDULED",
+    "action": "EXEC",
+    "item": "update",
+    "target_record_id": "vnfrs:665b4165-ce24-4320-bf19-b9a45bade49f:vdur.bb9c43f9-10a2-4569-a8a8-957c3528b6d1",
+}
+
+
+class TestException(Exception):
+    pass
 
 
 class CopyingMock(MagicMock):
@@ -1494,7 +1584,7 @@ class TestNs(unittest.TestCase):
         self.assertDictEqual(expected_numa_result, numa_result)
         self.assertEqual(expected_epa_vcpu_set_result, epa_vcpu_set_result)
 
-    def test__process_guest_epa_cpu_pinning_params_with_threads(self):
+    def test__process_guest_epa_cpu_pinning_params_with_policy_prefer(self):
         expected_numa_result = {"threads": 3}
         expected_epa_vcpu_set_result = True
         guest_epa_quota = {
@@ -1513,9 +1603,47 @@ class TestNs(unittest.TestCase):
         self.assertDictEqual(expected_numa_result, numa_result)
         self.assertEqual(expected_epa_vcpu_set_result, epa_vcpu_set_result)
 
-    def test__process_guest_epa_cpu_pinning_params(self):
+    def test__process_guest_epa_cpu_pinning_params_with_policy_isolate(self):
         expected_numa_result = {"cores": 3}
         expected_epa_vcpu_set_result = True
+        guest_epa_quota = {
+            "cpu-pinning-policy": "DEDICATED",
+            "cpu-thread-pinning-policy": "ISOLATE",
+        }
+        vcpu_count = 3
+        epa_vcpu_set = False
+
+        numa_result, epa_vcpu_set_result = Ns._process_guest_epa_cpu_pinning_params(
+            guest_epa_quota=guest_epa_quota,
+            vcpu_count=vcpu_count,
+            epa_vcpu_set=epa_vcpu_set,
+        )
+
+        self.assertDictEqual(expected_numa_result, numa_result)
+        self.assertEqual(expected_epa_vcpu_set_result, epa_vcpu_set_result)
+
+    def test__process_guest_epa_cpu_pinning_params_with_policy_require(self):
+        expected_numa_result = {"threads": 3}
+        expected_epa_vcpu_set_result = True
+        guest_epa_quota = {
+            "cpu-pinning-policy": "DEDICATED",
+            "cpu-thread-pinning-policy": "REQUIRE",
+        }
+        vcpu_count = 3
+        epa_vcpu_set = False
+
+        numa_result, epa_vcpu_set_result = Ns._process_guest_epa_cpu_pinning_params(
+            guest_epa_quota=guest_epa_quota,
+            vcpu_count=vcpu_count,
+            epa_vcpu_set=epa_vcpu_set,
+        )
+
+        self.assertDictEqual(expected_numa_result, numa_result)
+        self.assertEqual(expected_epa_vcpu_set_result, epa_vcpu_set_result)
+
+    def test__process_guest_epa_cpu_pinning_params(self):
+        expected_numa_result = {"threads": 3}
+        expected_epa_vcpu_set_result = True
         guest_epa_quota = {
             "cpu-pinning-policy": "DEDICATED",
         }
@@ -1777,7 +1905,6 @@ class TestNs(unittest.TestCase):
         self,
         epa_params,
     ):
-
         target_flavor = {}
         indata = {
             "vnf": [
@@ -1804,7 +1931,6 @@ class TestNs(unittest.TestCase):
         self,
         epa_params,
     ):
-
         target_flavor = {
             "no-target-flavor": "here",
         }
@@ -1827,7 +1953,6 @@ class TestNs(unittest.TestCase):
         self,
         epa_params,
     ):
-
         expected_result = {
             "find_params": {
                 "flavor_data": {
@@ -1872,7 +1997,6 @@ class TestNs(unittest.TestCase):
         self,
         epa_params,
     ):
-
         expected_result = {
             "find_params": {
                 "flavor_data": {
@@ -2029,7 +2153,6 @@ class TestNs(unittest.TestCase):
         self,
         epa_params,
     ):
-
         expected_result = {
             "find_params": {
                 "flavor_data": {
@@ -2094,7 +2217,6 @@ class TestNs(unittest.TestCase):
         self,
         epa_params,
     ):
-
         kwargs = {
             "db": db,
         }
@@ -2205,7 +2327,6 @@ class TestNs(unittest.TestCase):
         self,
         epa_params,
     ):
-
         expected_result = {
             "find_params": {
                 "flavor_data": {
@@ -2270,7 +2391,6 @@ class TestNs(unittest.TestCase):
         self,
         epa_params,
     ):
-
         kwargs = {
             "db": db,
         }
@@ -2391,213 +2511,8 @@ class TestNs(unittest.TestCase):
         self.assertTrue(epa_params.called)
         self.assertDictEqual(result, expected_result)
 
-    def test__ip_profile_to_ro_with_none(self):
-        ip_profile = None
-
-        result = Ns._ip_profile_to_ro(
-            ip_profile=ip_profile,
-        )
-
-        self.assertIsNone(result)
-
-    def test__ip_profile_to_ro_with_empty_profile(self):
-        ip_profile = {}
-
-        result = Ns._ip_profile_to_ro(
-            ip_profile=ip_profile,
-        )
-
-        self.assertIsNone(result)
-
-    def test__ip_profile_to_ro_with_wrong_profile(self):
-        ip_profile = {
-            "no-profile": "here",
-        }
-        expected_result = {
-            "ip_version": "IPv4",
-            "subnet_address": None,
-            "gateway_address": None,
-            "dhcp_enabled": False,
-            "dhcp_start_address": None,
-            "dhcp_count": None,
-        }
-
-        result = Ns._ip_profile_to_ro(
-            ip_profile=ip_profile,
-        )
-
-        self.assertDictEqual(expected_result, result)
-
-    def test__ip_profile_to_ro_with_ipv4_profile(self):
-        ip_profile = {
-            "ip-version": "ipv4",
-            "subnet-address": "192.168.0.0/24",
-            "gateway-address": "192.168.0.254",
-            "dhcp-params": {
-                "enabled": True,
-                "start-address": "192.168.0.10",
-                "count": 25,
-            },
-        }
-        expected_result = {
-            "ip_version": "IPv4",
-            "subnet_address": "192.168.0.0/24",
-            "gateway_address": "192.168.0.254",
-            "dhcp_enabled": True,
-            "dhcp_start_address": "192.168.0.10",
-            "dhcp_count": 25,
-        }
-
-        result = Ns._ip_profile_to_ro(
-            ip_profile=ip_profile,
-        )
-
-        self.assertDictEqual(expected_result, result)
-
-    def test__ip_profile_to_ro_with_ipv6_profile(self):
-        ip_profile = {
-            "ip-version": "ipv6",
-            "subnet-address": "2001:0200:0001::/48",
-            "gateway-address": "2001:0200:0001:ffff:ffff:ffff:ffff:fffe",
-            "dhcp-params": {
-                "enabled": True,
-                "start-address": "2001:0200:0001::0010",
-                "count": 25,
-            },
-        }
-        expected_result = {
-            "ip_version": "IPv6",
-            "subnet_address": "2001:0200:0001::/48",
-            "gateway_address": "2001:0200:0001:ffff:ffff:ffff:ffff:fffe",
-            "dhcp_enabled": True,
-            "dhcp_start_address": "2001:0200:0001::0010",
-            "dhcp_count": 25,
-        }
-
-        result = Ns._ip_profile_to_ro(
-            ip_profile=ip_profile,
-        )
-
-        self.assertDictEqual(expected_result, result)
-
-    def test__ip_profile_to_ro_with_dns_server(self):
-        ip_profile = {
-            "ip-version": "ipv4",
-            "subnet-address": "192.168.0.0/24",
-            "gateway-address": "192.168.0.254",
-            "dhcp-params": {
-                "enabled": True,
-                "start-address": "192.168.0.10",
-                "count": 25,
-            },
-            "dns-server": [
-                {
-                    "address": "8.8.8.8",
-                },
-                {
-                    "address": "1.1.1.1",
-                },
-                {
-                    "address": "1.0.0.1",
-                },
-            ],
-        }
-        expected_result = {
-            "ip_version": "IPv4",
-            "subnet_address": "192.168.0.0/24",
-            "gateway_address": "192.168.0.254",
-            "dhcp_enabled": True,
-            "dhcp_start_address": "192.168.0.10",
-            "dhcp_count": 25,
-            "dns_address": "8.8.8.8;1.1.1.1;1.0.0.1",
-        }
-
-        result = Ns._ip_profile_to_ro(
-            ip_profile=ip_profile,
-        )
-
-        self.assertDictEqual(expected_result, result)
-
-    def test__ip_profile_to_ro_with_security_group(self):
-        ip_profile = {
-            "ip-version": "ipv4",
-            "subnet-address": "192.168.0.0/24",
-            "gateway-address": "192.168.0.254",
-            "dhcp-params": {
-                "enabled": True,
-                "start-address": "192.168.0.10",
-                "count": 25,
-            },
-            "security-group": {
-                "some-security-group": "here",
-            },
-        }
-        expected_result = {
-            "ip_version": "IPv4",
-            "subnet_address": "192.168.0.0/24",
-            "gateway_address": "192.168.0.254",
-            "dhcp_enabled": True,
-            "dhcp_start_address": "192.168.0.10",
-            "dhcp_count": 25,
-            "security_group": {
-                "some-security-group": "here",
-            },
-        }
-
-        result = Ns._ip_profile_to_ro(
-            ip_profile=ip_profile,
-        )
-
-        self.assertDictEqual(expected_result, result)
-
-    def test__ip_profile_to_ro(self):
-        ip_profile = {
-            "ip-version": "ipv4",
-            "subnet-address": "192.168.0.0/24",
-            "gateway-address": "192.168.0.254",
-            "dhcp-params": {
-                "enabled": True,
-                "start-address": "192.168.0.10",
-                "count": 25,
-            },
-            "dns-server": [
-                {
-                    "address": "8.8.8.8",
-                },
-                {
-                    "address": "1.1.1.1",
-                },
-                {
-                    "address": "1.0.0.1",
-                },
-            ],
-            "security-group": {
-                "some-security-group": "here",
-            },
-        }
-        expected_result = {
-            "ip_version": "IPv4",
-            "subnet_address": "192.168.0.0/24",
-            "gateway_address": "192.168.0.254",
-            "dhcp_enabled": True,
-            "dhcp_start_address": "192.168.0.10",
-            "dhcp_count": 25,
-            "dns_address": "8.8.8.8;1.1.1.1;1.0.0.1",
-            "security_group": {
-                "some-security-group": "here",
-            },
-        }
-
-        result = Ns._ip_profile_to_ro(
-            ip_profile=ip_profile,
-        )
-
-        self.assertDictEqual(expected_result, result)
-
-    @patch("osm_ng_ro.ns.Ns._ip_profile_to_ro")
     def test__process_net_params_with_empty_params(
         self,
-        ip_profile_to_ro,
     ):
         target_vld = {
             "name": "vld-name",
@@ -2607,6 +2522,9 @@ class TestNs(unittest.TestCase):
         }
         vim_info = {
             "provider_network": "some-profile-here",
+            "ip_profile": {
+                "some_ip_profile": "here",
+            },
         }
         target_record_id = ""
         expected_result = {
@@ -2620,10 +2538,6 @@ class TestNs(unittest.TestCase):
             }
         }
 
-        ip_profile_to_ro.return_value = {
-            "some_ip_profile": "here",
-        }
-
         result = Ns._process_net_params(
             target_vld=target_vld,
             indata=indata,
@@ -2632,12 +2546,9 @@ class TestNs(unittest.TestCase):
         )
 
         self.assertDictEqual(expected_result, result)
-        self.assertTrue(ip_profile_to_ro.called)
 
-    @patch("osm_ng_ro.ns.Ns._ip_profile_to_ro")
     def test__process_net_params_with_vim_info_sdn(
         self,
-        ip_profile_to_ro,
     ):
         target_vld = {
             "name": "vld-name",
@@ -2668,12 +2579,9 @@ class TestNs(unittest.TestCase):
         )
 
         self.assertDictEqual(expected_result, result)
-        self.assertFalse(ip_profile_to_ro.called)
 
-    @patch("osm_ng_ro.ns.Ns._ip_profile_to_ro")
     def test__process_net_params_with_vim_info_sdn_target_vim(
         self,
-        ip_profile_to_ro,
     ):
         target_vld = {
             "name": "vld-name",
@@ -2707,12 +2615,9 @@ class TestNs(unittest.TestCase):
         )
 
         self.assertDictEqual(expected_result, result)
-        self.assertFalse(ip_profile_to_ro.called)
 
-    @patch("osm_ng_ro.ns.Ns._ip_profile_to_ro")
     def test__process_net_params_with_vim_network_name(
         self,
-        ip_profile_to_ro,
     ):
         target_vld = {
             "name": "vld-name",
@@ -2740,12 +2645,9 @@ class TestNs(unittest.TestCase):
         )
 
         self.assertDictEqual(expected_result, result)
-        self.assertFalse(ip_profile_to_ro.called)
 
-    @patch("osm_ng_ro.ns.Ns._ip_profile_to_ro")
     def test__process_net_params_with_vim_network_id(
         self,
-        ip_profile_to_ro,
     ):
         target_vld = {
             "name": "vld-name",
@@ -2773,12 +2675,9 @@ class TestNs(unittest.TestCase):
         )
 
         self.assertDictEqual(expected_result, result)
-        self.assertFalse(ip_profile_to_ro.called)
 
-    @patch("osm_ng_ro.ns.Ns._ip_profile_to_ro")
     def test__process_net_params_with_mgmt_network(
         self,
-        ip_profile_to_ro,
     ):
         target_vld = {
             "id": "vld-id",
@@ -2805,12 +2704,9 @@ class TestNs(unittest.TestCase):
         )
 
         self.assertDictEqual(expected_result, result)
-        self.assertFalse(ip_profile_to_ro.called)
 
-    @patch("osm_ng_ro.ns.Ns._ip_profile_to_ro")
     def test__process_net_params_with_underlay_eline(
         self,
-        ip_profile_to_ro,
     ):
         target_vld = {
             "name": "vld-name",
@@ -2822,6 +2718,9 @@ class TestNs(unittest.TestCase):
         }
         vim_info = {
             "provider_network": "some-profile-here",
+            "ip_profile": {
+                "some_ip_profile": "here",
+            },
         }
         target_record_id = ""
         expected_result = {
@@ -2835,10 +2734,6 @@ class TestNs(unittest.TestCase):
             }
         }
 
-        ip_profile_to_ro.return_value = {
-            "some_ip_profile": "here",
-        }
-
         result = Ns._process_net_params(
             target_vld=target_vld,
             indata=indata,
@@ -2847,12 +2742,9 @@ class TestNs(unittest.TestCase):
         )
 
         self.assertDictEqual(expected_result, result)
-        self.assertTrue(ip_profile_to_ro.called)
 
-    @patch("osm_ng_ro.ns.Ns._ip_profile_to_ro")
     def test__process_net_params_with_underlay_elan(
         self,
-        ip_profile_to_ro,
     ):
         target_vld = {
             "name": "vld-name",
@@ -2864,6 +2756,9 @@ class TestNs(unittest.TestCase):
         }
         vim_info = {
             "provider_network": "some-profile-here",
+            "ip_profile": {
+                "some_ip_profile": "here",
+            },
         }
         target_record_id = ""
         expected_result = {
@@ -2877,10 +2772,6 @@ class TestNs(unittest.TestCase):
             }
         }
 
-        ip_profile_to_ro.return_value = {
-            "some_ip_profile": "here",
-        }
-
         result = Ns._process_net_params(
             target_vld=target_vld,
             indata=indata,
@@ -2889,7 +2780,6 @@ class TestNs(unittest.TestCase):
         )
 
         self.assertDictEqual(expected_result, result)
-        self.assertTrue(ip_profile_to_ro.called)
 
     def test__get_cloud_init_exception(self):
         db_mock = MagicMock(name="database mock")
@@ -3102,143 +2992,278 @@ class TestNs(unittest.TestCase):
             self.assertEqual(result, expected_result)
 
     @patch("osm_ng_ro.ns.Ns._assign_vim")
-    def test__rebuild_start_stop_task(self, assign_vim):
+    def test__rebuild_start_stop_task__successful(self, assign_vim):
         self.ns = Ns()
         extra_dict = {}
         actions = ["start", "stop", "rebuild"]
-        vdu_id = "bb9c43f9-10a2-4569-a8a8-957c3528b6d1"
-        vnf_id = "665b4165-ce24-4320-bf19-b9a45bade49f"
         vdu_index = "0"
-        action_id = "bb937f49-3870-4169-b758-9732e1ff40f3"
-        nsr_id = "993166fe-723e-4680-ac4b-b1af2541ae31"
         task_index = 0
-        target_vim = "vim:f9f370ac-0d44-41a7-9000-457f2332bc35"
-        t = "vnfrs:665b4165-ce24-4320-bf19-b9a45bade49f:vdur.bb9c43f9-10a2-4569-a8a8-957c3528b6d1"
         for action in actions:
-            expected_result = {
-                "target_id": "vim:f9f370ac-0d44-41a7-9000-457f2332bc35",
-                "action_id": "bb937f49-3870-4169-b758-9732e1ff40f3",
-                "nsr_id": "993166fe-723e-4680-ac4b-b1af2541ae31",
-                "task_id": "bb937f49-3870-4169-b758-9732e1ff40f3:0",
-                "status": "SCHEDULED",
-                "action": "EXEC",
-                "item": "update",
-                "target_record": "vnfrs:665b4165-ce24-4320-bf19-b9a45bade49f:vdur.0",
-                "target_record_id": t,
-                "params": {
-                    "vim_vm_id": "f37b18ef-3caa-4dc9-ab91-15c669b16396",
-                    "action": action,
-                },
+            params = {
+                "vim_vm_id": "f37b18ef-3caa-4dc9-ab91-15c669b16396",
+                "action": action,
+            }
+            extra_dict["params"] = params
+            expected_result = deepcopy(expected_result_rebuild_start_stop)
+            expected_result[
+                "target_record"
+            ] = "vnfrs:665b4165-ce24-4320-bf19-b9a45bade49f:vdur.0.vim_info.vim:f9f370ac-0d44-41a7-9000-457f2332bc35"
+            expected_result["params"] = params
+            task = self.ns.rebuild_start_stop_task(
+                vdu_id,
+                vnf_id,
+                vdu_index,
+                action_id,
+                nsr_id_2,
+                task_index,
+                target_vim,
+                extra_dict,
+            )
+            self.assertDictEqual(task, expected_result)
+
+    @patch("osm_ng_ro.ns.Ns._assign_vim")
+    def test__rebuild_start_stop_task__empty_extra_dict__task_without_params(
+        self, assign_vim
+    ):
+        self.ns = Ns()
+        extra_dict = {}
+        actions = ["start", "stop", "rebuild"]
+        vdu_index = "0"
+        task_index = 0
+        expected_result = deepcopy(expected_result_rebuild_start_stop)
+        expected_result[
+            "target_record"
+        ] = "vnfrs:665b4165-ce24-4320-bf19-b9a45bade49f:vdur.0.vim_info.vim:f9f370ac-0d44-41a7-9000-457f2332bc35"
+        for _ in actions:
+            task = self.ns.rebuild_start_stop_task(
+                vdu_id,
+                vnf_id,
+                vdu_index,
+                action_id,
+                nsr_id_2,
+                task_index,
+                target_vim,
+                extra_dict,
+            )
+            self.assertDictEqual(task, expected_result)
+
+    @patch("osm_ng_ro.ns.Ns._assign_vim")
+    def test__rebuild_start_stop_task__different_vdu_index__target_record_changes(
+        self, assign_vim
+    ):
+        self.ns = Ns()
+        extra_dict = {}
+        actions = ["start", "stop", "rebuild"]
+        vdu_index = "4"
+        task_index = 0
+        for action in actions:
+            params = {
+                "vim_vm_id": "f37b18ef-3caa-4dc9-ab91-15c669b16396",
+                "action": action,
             }
-            extra_dict["params"] = {
+            extra_dict["params"] = params
+            expected_result = deepcopy(expected_result_rebuild_start_stop)
+            expected_result[
+                "target_record"
+            ] = "vnfrs:665b4165-ce24-4320-bf19-b9a45bade49f:vdur.4.vim_info.vim:f9f370ac-0d44-41a7-9000-457f2332bc35"
+            expected_result["params"] = params
+            task = self.ns.rebuild_start_stop_task(
+                vdu_id,
+                vnf_id,
+                vdu_index,
+                action_id,
+                nsr_id_2,
+                task_index,
+                target_vim,
+                extra_dict,
+            )
+            self.assertDictEqual(task, expected_result)
+
+    @patch("osm_ng_ro.ns.Ns._assign_vim")
+    def test__rebuild_start_stop_task__different_task_index__task_id_changes(
+        self, assign_vim
+    ):
+        self.ns = Ns()
+        extra_dict = {}
+        actions = ["start", "stop", "rebuild"]
+        vdu_index = "0"
+        task_index = 3
+        for action in actions:
+            params = {
                 "vim_vm_id": "f37b18ef-3caa-4dc9-ab91-15c669b16396",
                 "action": action,
             }
+            extra_dict["params"] = params
+            expected_result = deepcopy(expected_result_rebuild_start_stop)
+            expected_result[
+                "target_record"
+            ] = "vnfrs:665b4165-ce24-4320-bf19-b9a45bade49f:vdur.0.vim_info.vim:f9f370ac-0d44-41a7-9000-457f2332bc35"
+            expected_result["params"] = params
+            expected_result["task_id"] = "bb937f49-3870-4169-b758-9732e1ff40f3:3"
             task = self.ns.rebuild_start_stop_task(
                 vdu_id,
                 vnf_id,
                 vdu_index,
                 action_id,
-                nsr_id,
+                nsr_id_2,
                 task_index,
                 target_vim,
                 extra_dict,
             )
-            self.assertEqual(task.get("action_id"), action_id)
-            self.assertEqual(task.get("nsr_id"), nsr_id)
-            self.assertEqual(task.get("target_id"), target_vim)
             self.assertDictEqual(task, expected_result)
 
     @patch("osm_ng_ro.ns.Ns._assign_vim")
-    def test_verticalscale_task(self, assign_vim):
+    def test__rebuild_start_stop_task__assign_vim_raises__task_is_not_created(
+        self, assign_vim
+    ):
         self.ns = Ns()
         extra_dict = {}
+        actions = ["start", "stop", "rebuild"]
+        vdu_index = "0"
+        task_index = 0
+        for action in actions:
+            params = {
+                "vim_vm_id": "f37b18ef-3caa-4dc9-ab91-15c669b16396",
+                "action": action,
+            }
+            extra_dict["params"] = params
+            assign_vim.side_effect = TestException("Can not connect to VIM.")
+            with self.assertRaises(TestException) as err:
+                task = self.ns.rebuild_start_stop_task(
+                    vdu_id,
+                    vnf_id,
+                    vdu_index,
+                    action_id,
+                    nsr_id_2,
+                    task_index,
+                    target_vim,
+                    extra_dict,
+                )
+                self.assertEqual(task, None)
+                self.assertEqual(str(err.exception), "Can not connect to VIM.")
+
+    @patch("osm_ng_ro.ns.Ns._assign_vim")
+    def test_verticalscale_task__successful(self, assign_vim):
+        self.ns = Ns()
         vdu_index = "1"
-        action_id = "bb937f49-3870-4169-b758-9732e1ff40f3"
-        nsr_id = "993166fe-723e-4680-ac4b-b1af2541ae31"
         task_index = 1
-        target_record_id = (
-            "vnfrs:665b4165-ce24-4320-bf19-b9a45bade49f:"
-            "vdur.bb9c43f9-10a2-4569-a8a8-957c3528b6d1"
+        task = self.ns.verticalscale_task(
+            vdu,
+            vnf,
+            vdu_index,
+            action_id,
+            nsr_id_2,
+            task_index,
+            extra_dict_vertical_scale,
         )
+        self.assertDictEqual(task, expected_result_vertical_scale)
 
-        expected_result = {
-            "target_id": "vim:f9f370ac-0d44-41a7-9000-457f2332bc35",
-            "action_id": "bb937f49-3870-4169-b758-9732e1ff40f3",
-            "nsr_id": "993166fe-723e-4680-ac4b-b1af2541ae31",
-            "task_id": "bb937f49-3870-4169-b758-9732e1ff40f3:1",
-            "status": "SCHEDULED",
-            "action": "EXEC",
-            "item": "verticalscale",
-            "target_record": "vnfrs:665b4165-ce24-4320-bf19-b9a45bade49f:vdur.1",
-            "target_record_id": target_record_id,
-            "params": {
-                "vim_vm_id": "f37b18ef-3caa-4dc9-ab91-15c669b16396",
-                "flavor_dict": "flavor_dict",
-            },
-        }
-        vdu = {
-            "id": "bb9c43f9-10a2-4569-a8a8-957c3528b6d1",
-            "vim_info": {
-                "vim:f9f370ac-0d44-41a7-9000-457f2332bc35": {"interfaces": []}
-            },
-        }
-        vnf = {"_id": "665b4165-ce24-4320-bf19-b9a45bade49f"}
-        extra_dict["params"] = {
-            "vim_vm_id": "f37b18ef-3caa-4dc9-ab91-15c669b16396",
-            "flavor_dict": "flavor_dict",
-        }
+    @patch("osm_ng_ro.ns.Ns._assign_vim")
+    def test_verticalscale_task__task_index_changes__task_id_changes(self, assign_vim):
+        self.ns = Ns()
+        vdu_index = "1"
+        task_index = 2
+        expected_result = deepcopy(expected_result_vertical_scale)
+        expected_result["task_id"] = "bb937f49-3870-4169-b758-9732e1ff40f3:2"
         task = self.ns.verticalscale_task(
-            vdu, vnf, vdu_index, action_id, nsr_id, task_index, extra_dict
+            vdu,
+            vnf,
+            vdu_index,
+            action_id,
+            nsr_id_2,
+            task_index,
+            extra_dict_vertical_scale,
         )
-
         self.assertDictEqual(task, expected_result)
 
     @patch("osm_ng_ro.ns.Ns._assign_vim")
-    def test_migrate_task(self, assign_vim):
+    def test_verticalscale_task__empty_extra_dict__expected_result_without_params(
+        self, assign_vim
+    ):
         self.ns = Ns()
         extra_dict = {}
         vdu_index = "1"
-        action_id = "bb937f49-3870-4169-b758-9732e1ff40f3"
-        nsr_id = "993166fe-723e-4680-ac4b-b1af2541ae31"
         task_index = 1
-        target_record_id = (
-            "vnfrs:665b4165-ce24-4320-bf19-b9a45bade49f:"
-            "vdur.bb9c43f9-10a2-4569-a8a8-957c3528b6d1"
+        expected_result = deepcopy(expected_result_vertical_scale)
+        expected_result.pop("params")
+        task = self.ns.verticalscale_task(
+            vdu, vnf, vdu_index, action_id, nsr_id_2, task_index, extra_dict
         )
+        self.assertDictEqual(task, expected_result)
 
-        expected_result = {
-            "target_id": "vim:f9f370ac-0d44-41a7-9000-457f2332bc35",
-            "action_id": "bb937f49-3870-4169-b758-9732e1ff40f3",
-            "nsr_id": "993166fe-723e-4680-ac4b-b1af2541ae31",
-            "task_id": "bb937f49-3870-4169-b758-9732e1ff40f3:1",
-            "status": "SCHEDULED",
-            "action": "EXEC",
-            "item": "migrate",
-            "target_record": "vnfrs:665b4165-ce24-4320-bf19-b9a45bade49f:vdur.1",
-            "target_record_id": target_record_id,
-            "params": {
-                "vim_vm_id": "f37b18ef-3caa-4dc9-ab91-15c669b16396",
-                "migrate_host": "migrateToHost",
-            },
-        }
-        vdu = {
-            "id": "bb9c43f9-10a2-4569-a8a8-957c3528b6d1",
-            "vim_info": {
-                "vim:f9f370ac-0d44-41a7-9000-457f2332bc35": {"interfaces": []}
-            },
-        }
-        vnf = {"_id": "665b4165-ce24-4320-bf19-b9a45bade49f"}
-        extra_dict["params"] = {
-            "vim_vm_id": "f37b18ef-3caa-4dc9-ab91-15c669b16396",
-            "migrate_host": "migrateToHost",
-        }
+    @patch("osm_ng_ro.ns.Ns._assign_vim")
+    def test_verticalscale_task__assign_vim_raises__task_is_not_created(
+        self, assign_vim
+    ):
+        self.ns = Ns()
+        vdu_index = "1"
+        task_index = 1
+        assign_vim.side_effect = TestException("Can not connect to VIM.")
+        with self.assertRaises(TestException) as err:
+            task = self.ns.verticalscale_task(
+                vdu,
+                vnf,
+                vdu_index,
+                action_id,
+                nsr_id_2,
+                task_index,
+                extra_dict_vertical_scale,
+            )
+            self.assertEqual(task, {})
+            self.assertEqual(str(err.exception), "Can not connect to VIM.")
+
+    @patch("osm_ng_ro.ns.Ns._assign_vim")
+    def test_migrate_task__successful(self, assign_vim):
+        self.ns = Ns()
+        vdu_index = "1"
+        task_index = 1
         task = self.ns.migrate_task(
-            vdu, vnf, vdu_index, action_id, nsr_id, task_index, extra_dict
+            vdu, vnf, vdu_index, action_id, nsr_id_2, task_index, extra_dict_migrate
         )
+        self.assertDictEqual(task, expected_result_migrate)
 
+    @patch("osm_ng_ro.ns.Ns._assign_vim")
+    def test_migrate_task__empty_extra_dict__task_without_params(self, assign_vim):
+        self.ns = Ns()
+        extra_dict = {}
+        vdu_index = "1"
+        task_index = 1
+        expected_result = deepcopy(expected_result_migrate)
+        expected_result.pop("params")
+        task = self.ns.migrate_task(
+            vdu, vnf, vdu_index, action_id, nsr_id_2, task_index, extra_dict
+        )
+        self.assertDictEqual(task, expected_result)
+
+    @patch("osm_ng_ro.ns.Ns._assign_vim")
+    def test_migrate_task__different_vdu_index__target_record_with_different_vdu_index(
+        self, assign_vim
+    ):
+        self.ns = Ns()
+        vdu_index = "4"
+        task_index = 1
+        expected_result = deepcopy(expected_result_migrate)
+        expected_result[
+            "target_record"
+        ] = "vnfrs:665b4165-ce24-4320-bf19-b9a45bade49f:vdur.4.vim_info.vim:f9f370ac-0d44-41a7-9000-457f2332bc35"
+        task = self.ns.migrate_task(
+            vdu, vnf, vdu_index, action_id, nsr_id_2, task_index, extra_dict_migrate
+        )
         self.assertDictEqual(task, expected_result)
 
+    @patch("osm_ng_ro.ns.Ns._assign_vim")
+    def test_migrate_task__assign_vim_raises__task_is_not_created(self, assign_vim):
+        self.ns = Ns()
+        vdu_index = "1"
+        task_index = 1
+        assign_vim.side_effect = TestException("Can not connect to VIM.")
+        with self.assertRaises(TestException) as err:
+            task = self.ns.migrate_task(
+                vdu, vnf, vdu_index, action_id, nsr_id, task_index, extra_dict_migrate
+            )
+            self.assertDictEqual(task, {})
+            self.assertEqual(str(err.exception), "Can not connect to VIM.")
+
 
 class TestProcessVduParams(unittest.TestCase):
     def setUp(self):
@@ -3343,7 +3368,7 @@ class TestProcessVduParams(unittest.TestCase):
         persist_root_disk = self.ns.find_persistent_root_volumes(
             vnfd, target_vdu, vdu_instantiation_volumes_list, disk_list
         )
-        self.assertEqual(persist_root_disk, None)
+        self.assertEqual(persist_root_disk, {})
         mock_volume_keeping_required.assert_not_called()
         self.assertEqual(disk_list, [])
 
@@ -3612,7 +3637,8 @@ class TestProcessVduParams(unittest.TestCase):
         self, mock_volume_keeping_required
     ):
         """Find persistent ordinary volume, volume id is not persistent_root_disk dict,
-        vim-volume-id is given as instantiation parameter but disk id is not matching."""
+        vim-volume-id is given as instantiation parameter but disk id is not matching.
+        """
         mock_volume_keeping_required.return_value = True
         vdu_instantiation_volumes_list = [
             {
@@ -4723,14 +4749,21 @@ class TestProcessVduParams(unittest.TestCase):
         }
         persistent_ordinary_disk = {}
         disk_list = []
+        extra_dict = {}
         expected_disk_list = [
             {
                 "size": "10",
                 "keep": False,
+                "multiattach": False,
+                "name": "persistent-volume2",
             }
         ]
         self.ns._add_persistent_ordinary_disks_to_disk_list(
-            target_vdu, persistent_root_disk, persistent_ordinary_disk, disk_list
+            target_vdu,
+            persistent_root_disk,
+            persistent_ordinary_disk,
+            disk_list,
+            extra_dict,
         )
         self.assertEqual(disk_list, expected_disk_list)
         mock_volume_keeping_required.assert_called_once_with(ordinary_disk)
@@ -4754,9 +4787,14 @@ class TestProcessVduParams(unittest.TestCase):
         }
         persistent_ordinary_disk = {}
         disk_list = []
+        extra_dict = {}
 
         self.ns._add_persistent_ordinary_disks_to_disk_list(
-            target_vdu, persistent_root_disk, persistent_ordinary_disk, disk_list
+            target_vdu,
+            persistent_root_disk,
+            persistent_ordinary_disk,
+            disk_list,
+            extra_dict,
         )
         self.assertEqual(disk_list, [])
         mock_volume_keeping_required.assert_not_called()
@@ -4938,6 +4976,76 @@ class TestProcessVduParams(unittest.TestCase):
             persistent_root_disk, target_vdu, vdu_instantiation_vol_list, []
         )
 
+    @patch("osm_ng_ro.ns.Ns._sort_vdu_interfaces")
+    @patch("osm_ng_ro.ns.Ns._partially_locate_vdu_interfaces")
+    @patch("osm_ng_ro.ns.Ns._prepare_vdu_interfaces")
+    @patch("osm_ng_ro.ns.Ns._prepare_vdu_cloud_init")
+    @patch("osm_ng_ro.ns.Ns._prepare_vdu_ssh_keys")
+    @patch("osm_ng_ro.ns.Ns.find_persistent_root_volumes")
+    @patch("osm_ng_ro.ns.Ns.find_persistent_volumes")
+    @patch("osm_ng_ro.ns.Ns._add_persistent_root_disk_to_disk_list")
+    @patch("osm_ng_ro.ns.Ns._add_persistent_ordinary_disks_to_disk_list")
+    @patch("osm_ng_ro.ns.Ns._prepare_vdu_affinity_group_list")
+    def test_process_vdu_params_with_inst_flavor_id(
+        self,
+        mock_prepare_vdu_affinity_group_list,
+        mock_add_persistent_ordinary_disks_to_disk_list,
+        mock_add_persistent_root_disk_to_disk_list,
+        mock_find_persistent_volumes,
+        mock_find_persistent_root_volumes,
+        mock_prepare_vdu_ssh_keys,
+        mock_prepare_vdu_cloud_init,
+        mock_prepare_vdu_interfaces,
+        mock_locate_vdu_interfaces,
+        mock_sort_vdu_interfaces,
+    ):
+        """Instantiation volume list is empty."""
+        target_vdu = deepcopy(target_vdu_wthout_persistent_storage)
+
+        target_vdu["interfaces"] = interfaces_wth_all_positions
+
+        vdu_instantiation_flavor_id = "flavor_test"
+
+        target_vdu["additionalParams"] = {
+            "OSM": {"vim_flavor_id": vdu_instantiation_flavor_id}
+        }
+        mock_prepare_vdu_cloud_init.return_value = {}
+        mock_prepare_vdu_affinity_group_list.return_value = []
+
+        new_kwargs = deepcopy(kwargs)
+        new_kwargs.update(
+            {
+                "vnfr_id": vnfr_id,
+                "nsr_id": nsr_id,
+                "tasks_by_target_record_id": {},
+                "logger": "logger",
+            }
+        )
+        expected_extra_dict_copy = deepcopy(expected_extra_dict3)
+        vnfd = deepcopy(vnfd_wth_persistent_storage)
+        db.get_one.return_value = vnfd
+        result = Ns._process_vdu_params(
+            target_vdu, indata, vim_info=None, target_record_id=None, **new_kwargs
+        )
+        mock_sort_vdu_interfaces.assert_called_once_with(target_vdu)
+        mock_locate_vdu_interfaces.assert_not_called()
+        mock_prepare_vdu_cloud_init.assert_called_once()
+        mock_add_persistent_root_disk_to_disk_list.assert_called_once()
+        mock_add_persistent_ordinary_disks_to_disk_list.assert_called_once()
+        mock_prepare_vdu_interfaces.assert_called_once_with(
+            target_vdu,
+            expected_extra_dict_copy,
+            ns_preffix,
+            vnf_preffix,
+            "logger",
+            {},
+            [],
+        )
+        self.assertDictEqual(result, expected_extra_dict_copy)
+        mock_prepare_vdu_ssh_keys.assert_called_once_with(target_vdu, None, {})
+        mock_prepare_vdu_affinity_group_list.assert_called_once()
+        mock_find_persistent_volumes.assert_not_called()
+
     @patch("osm_ng_ro.ns.Ns._sort_vdu_interfaces")
     @patch("osm_ng_ro.ns.Ns._partially_locate_vdu_interfaces")
     @patch("osm_ng_ro.ns.Ns._prepare_vdu_interfaces")