X-Git-Url: https://osm.etsi.org/gitweb/?a=blobdiff_plain;f=NG-RO%2Fosm_ng_ro%2Ftests%2Ftest_ns.py;h=02561b7f5f9624fc980b078a37694bafa9f56f86;hb=dca2c239b699d258c2906292182cff330157a957;hp=c0ba426370b7eda70535852c0b4a40c664d9c2a4;hpb=c8b3fb65fe58052717f842f49df1d4c36c982e13;p=osm%2FRO.git diff --git a/NG-RO/osm_ng_ro/tests/test_ns.py b/NG-RO/osm_ng_ro/tests/test_ns.py index c0ba4263..02561b7f 100644 --- a/NG-RO/osm_ng_ro/tests/test_ns.py +++ b/NG-RO/osm_ng_ro/tests/test_ns.py @@ -18,7 +18,14 @@ import unittest from unittest.mock import MagicMock, Mock, patch -from jinja2 import TemplateError, TemplateNotFound, UndefinedError +from jinja2 import ( + Environment, + select_autoescape, + StrictUndefined, + TemplateError, + TemplateNotFound, + UndefinedError, +) from osm_ng_ro.ns import Ns, NsException @@ -824,19 +831,18 @@ class TestNs(unittest.TestCase): self.assertDictEqual(expected_result, result) def test__process_guest_epa_numa_params_with_empty_numa_params(self): - expected_numa_result = {} + expected_numa_result = [] expected_epa_vcpu_set_result = False guest_epa_quota = {} numa_result, epa_vcpu_set_result = Ns._process_guest_epa_numa_params( guest_epa_quota=guest_epa_quota, ) - - self.assertDictEqual(expected_numa_result, numa_result) + self.assertEqual(expected_numa_result, numa_result) self.assertEqual(expected_epa_vcpu_set_result, epa_vcpu_set_result) def test__process_guest_epa_numa_params_with_wrong_numa_params(self): - expected_numa_result = {} + expected_numa_result = [] expected_epa_vcpu_set_result = False guest_epa_quota = {"no_nume": "here"} @@ -844,11 +850,11 @@ class TestNs(unittest.TestCase): guest_epa_quota=guest_epa_quota, ) - self.assertDictEqual(expected_numa_result, numa_result) + self.assertEqual(expected_numa_result, numa_result) self.assertEqual(expected_epa_vcpu_set_result, epa_vcpu_set_result) def test__process_guest_epa_numa_params_with_numa_node_policy(self): - expected_numa_result = {} + expected_numa_result = [] expected_epa_vcpu_set_result = False guest_epa_quota = {"numa-node-policy": {}} @@ -856,11 +862,11 @@ class TestNs(unittest.TestCase): guest_epa_quota=guest_epa_quota, ) - self.assertDictEqual(expected_numa_result, numa_result) + self.assertEqual(expected_numa_result, numa_result) self.assertEqual(expected_epa_vcpu_set_result, epa_vcpu_set_result) def test__process_guest_epa_numa_params_with_no_node(self): - expected_numa_result = {} + expected_numa_result = [] expected_epa_vcpu_set_result = False guest_epa_quota = { "numa-node-policy": { @@ -872,11 +878,11 @@ class TestNs(unittest.TestCase): guest_epa_quota=guest_epa_quota, ) - self.assertDictEqual(expected_numa_result, numa_result) + self.assertEqual(expected_numa_result, numa_result) self.assertEqual(expected_epa_vcpu_set_result, epa_vcpu_set_result) def test__process_guest_epa_numa_params_with_1_node_num_cores(self): - expected_numa_result = {"cores": 3} + expected_numa_result = [{"cores": 3}] expected_epa_vcpu_set_result = True guest_epa_quota = { "numa-node-policy": { @@ -892,11 +898,11 @@ class TestNs(unittest.TestCase): guest_epa_quota=guest_epa_quota, ) - self.assertDictEqual(expected_numa_result, numa_result) + self.assertEqual(expected_numa_result, numa_result) self.assertEqual(expected_epa_vcpu_set_result, epa_vcpu_set_result) def test__process_guest_epa_numa_params_with_1_node_paired_threads(self): - expected_numa_result = {"paired-threads": 3} + expected_numa_result = [{"paired_threads": 3}] expected_epa_vcpu_set_result = True guest_epa_quota = { "numa-node-policy": { @@ -912,13 +918,15 @@ class TestNs(unittest.TestCase): guest_epa_quota=guest_epa_quota, ) - self.assertDictEqual(expected_numa_result, numa_result) + self.assertEqual(expected_numa_result, numa_result) self.assertEqual(expected_epa_vcpu_set_result, epa_vcpu_set_result) def test__process_guest_epa_numa_params_with_1_node_paired_threads_ids(self): - expected_numa_result = { - "paired-threads-id": [("0", "1"), ("4", "5")], - } + expected_numa_result = [ + { + "paired-threads-id": [("0", "1"), ("4", "5")], + } + ] expected_epa_vcpu_set_result = False guest_epa_quota = { "numa-node-policy": { @@ -945,11 +953,11 @@ class TestNs(unittest.TestCase): guest_epa_quota=guest_epa_quota, ) - self.assertDictEqual(expected_numa_result, numa_result) + self.assertEqual(expected_numa_result, numa_result) self.assertEqual(expected_epa_vcpu_set_result, epa_vcpu_set_result) def test__process_guest_epa_numa_params_with_1_node_num_threads(self): - expected_numa_result = {"threads": 3} + expected_numa_result = [{"threads": 3}] expected_epa_vcpu_set_result = True guest_epa_quota = { "numa-node-policy": { @@ -965,11 +973,11 @@ class TestNs(unittest.TestCase): guest_epa_quota=guest_epa_quota, ) - self.assertDictEqual(expected_numa_result, numa_result) + self.assertEqual(expected_numa_result, numa_result) self.assertEqual(expected_epa_vcpu_set_result, epa_vcpu_set_result) def test__process_guest_epa_numa_params_with_1_node_memory_mb(self): - expected_numa_result = {"memory": 2} + expected_numa_result = [{"memory": 2}] expected_epa_vcpu_set_result = False guest_epa_quota = { "numa-node-policy": { @@ -985,17 +993,71 @@ class TestNs(unittest.TestCase): guest_epa_quota=guest_epa_quota, ) - self.assertDictEqual(expected_numa_result, numa_result) + self.assertEqual(expected_numa_result, numa_result) self.assertEqual(expected_epa_vcpu_set_result, epa_vcpu_set_result) - def test__process_guest_epa_numa_params_with_1_node(self): - expected_numa_result = { - "cores": 3, - "paired-threads": 3, - "paired-threads-id": [("0", "1"), ("4", "5")], - "threads": 3, - "memory": 2, + def test__process_guest_epa_numa_params_with_1_node_vcpu(self): + expected_numa_result = [ + { + "id": 0, + "vcpu": [0, 1], + } + ] + expected_epa_vcpu_set_result = False + guest_epa_quota = { + "numa-node-policy": { + "node": [{"id": "0", "vcpu": [{"id": "0"}, {"id": "1"}]}], + }, } + + numa_result, epa_vcpu_set_result = Ns._process_guest_epa_numa_params( + guest_epa_quota=guest_epa_quota, + ) + + self.assertEqual(expected_numa_result, numa_result) + self.assertEqual(expected_epa_vcpu_set_result, epa_vcpu_set_result) + + def test__process_guest_epa_numa_params_with_2_node_vcpu(self): + expected_numa_result = [ + { + "id": 0, + "vcpu": [0, 1], + }, + { + "id": 1, + "vcpu": [2, 3], + }, + ] + + expected_epa_vcpu_set_result = False + guest_epa_quota = { + "numa-node-policy": { + "node": [ + {"id": "0", "vcpu": [{"id": "0"}, {"id": "1"}]}, + {"id": "1", "vcpu": [{"id": "2"}, {"id": "3"}]}, + ], + }, + } + + numa_result, epa_vcpu_set_result = Ns._process_guest_epa_numa_params( + guest_epa_quota=guest_epa_quota, + ) + + self.assertEqual(expected_numa_result, numa_result) + self.assertEqual(expected_epa_vcpu_set_result, epa_vcpu_set_result) + + def test__process_guest_epa_numa_params_with_1_node(self): + expected_numa_result = [ + { + # "id": 0, + # "vcpu": [0, 1], + "cores": 3, + "paired_threads": 3, + "paired-threads-id": [("0", "1"), ("4", "5")], + "threads": 3, + "memory": 2, + } + ] expected_epa_vcpu_set_result = True guest_epa_quota = { "numa-node-policy": { @@ -1026,17 +1088,26 @@ class TestNs(unittest.TestCase): guest_epa_quota=guest_epa_quota, ) - self.assertDictEqual(expected_numa_result, numa_result) + self.assertEqual(expected_numa_result, numa_result) self.assertEqual(expected_epa_vcpu_set_result, epa_vcpu_set_result) def test__process_guest_epa_numa_params_with_2_nodes(self): - expected_numa_result = { - "cores": 3, - "paired-threads": 3, - "paired-threads-id": [("0", "1"), ("4", "5")], - "threads": 3, - "memory": 2, - } + expected_numa_result = [ + { + "cores": 3, + "paired_threads": 3, + "paired-threads-id": [("0", "1"), ("4", "5")], + "threads": 3, + "memory": 2, + }, + { + "cores": 7, + "paired_threads": 7, + "paired-threads-id": [("2", "3"), ("5", "6")], + "threads": 4, + "memory": 4, + }, + ] expected_epa_vcpu_set_result = True guest_epa_quota = { "numa-node-policy": { @@ -1085,7 +1156,7 @@ class TestNs(unittest.TestCase): guest_epa_quota=guest_epa_quota, ) - self.assertDictEqual(expected_numa_result, numa_result) + self.assertEqual(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_empty_params(self): @@ -1230,10 +1301,15 @@ class TestNs(unittest.TestCase): guest_epa_cpu_pinning_params, guest_epa_quota_params, ): - expected_result = {} + expected_result = { + "mem-policy": "STRICT", + } target_flavor = { "guest-epa": { "vcpu-count": 1, + "numa-node-policy": { + "mem-policy": "STRICT", + }, }, } @@ -1261,9 +1337,16 @@ class TestNs(unittest.TestCase): ): expected_result = { "mempage-size": "1G", + "mem-policy": "STRICT", } target_flavor = { - "guest-epa": {"vcpu-count": 1, "mempage-size": "1G"}, + "guest-epa": { + "vcpu-count": 1, + "mempage-size": "1G", + "numa-node-policy": { + "mem-policy": "STRICT", + }, + }, } guest_epa_numa_params.return_value = ({}, False) @@ -1290,6 +1373,8 @@ class TestNs(unittest.TestCase): ): expected_result = { "mempage-size": "1G", + "cpu-pinning-policy": "DEDICATED", + "cpu-thread-pinning-policy": "PREFER", "numas": [ { "cores": 3, @@ -1356,13 +1441,15 @@ class TestNs(unittest.TestCase): } guest_epa_numa_params.return_value = ( - { - "cores": 3, - "paired-threads": 3, - "paired-threads-id": [("0", "1"), ("4", "5")], - "threads": 3, - "memory": 2, - }, + [ + { + "cores": 3, + "paired-threads": 3, + "paired-threads-id": [("0", "1"), ("4", "5")], + "threads": 3, + "memory": 2, + }, + ], True, ) guest_epa_cpu_pinning_params.return_value = ( @@ -1397,8 +1484,7 @@ class TestNs(unittest.TestCase): result = Ns._process_epa_params( target_flavor=target_flavor, ) - - self.assertDictEqual(expected_result, result) + self.assertEqual(expected_result, result) self.assertTrue(guest_epa_numa_params.called) self.assertTrue(guest_epa_cpu_pinning_params.called) self.assertTrue(guest_epa_quota_params.called) @@ -1409,7 +1495,13 @@ class TestNs(unittest.TestCase): epa_params, ): target_flavor = {} - indata = {} + indata = { + "vnf": [ + { + "vnfd-id": "ad6356e3-698c-43bf-9901-3aae9e9b9d18", + }, + ], + } vim_info = {} target_record_id = "" @@ -1540,6 +1632,52 @@ class TestNs(unittest.TestCase): self, epa_params, ): + db = MagicMock(name="database mock") + kwargs = { + "db": db, + } + + db.get_one.return_value = { + "_id": "ad6356e3-698c-43bf-9901-3aae9e9b9d18", + "df": [ + { + "id": "default-df", + "vdu-profile": [ + {"id": "without_volumes-VM", "min-number-of-instances": 1} + ], + } + ], + "id": "without_volumes-vnf", + "product-name": "without_volumes-vnf", + "vdu": [ + { + "id": "without_volumes-VM", + "name": "without_volumes-VM", + "sw-image-desc": "ubuntu20.04", + "alternative-sw-image-desc": [ + "ubuntu20.04-aws", + "ubuntu20.04-azure", + ], + "virtual-storage-desc": ["root-volume", "ephemeral-volume"], + } + ], + "version": "1.0", + "virtual-storage-desc": [ + {"id": "root-volume", "size-of-storage": "10"}, + { + "id": "ephemeral-volume", + "type-of-storage": "etsi-nfv-descriptors:ephemeral-storage", + "size-of-storage": "1", + }, + ], + "_admin": { + "storage": { + "fs": "mongo", + "path": "/app/storage/", + }, + "type": "vnfd", + }, + } expected_result = { "find_params": { "flavor_data": { @@ -1580,6 +1718,7 @@ class TestNs(unittest.TestCase): ], }, ], + "vnfd-id": "ad6356e3-698c-43bf-9901-3aae9e9b9d18", }, ], } @@ -1593,6 +1732,7 @@ class TestNs(unittest.TestCase): indata=indata, vim_info=vim_info, target_record_id=target_record_id, + **kwargs, ) self.assertTrue(epa_params.called) @@ -1643,6 +1783,118 @@ class TestNs(unittest.TestCase): ], }, ], + "vnfd-id": "ad6356e3-698c-43bf-9901-3aae9e9b9d18", + }, + ], + } + vim_info = {} + target_record_id = "" + + epa_params.return_value = {} + + result = Ns._process_flavor_params( + target_flavor=target_flavor, + indata=indata, + vim_info=vim_info, + target_record_id=target_record_id, + ) + + self.assertTrue(epa_params.called) + self.assertDictEqual(result, expected_result) + + @patch("osm_ng_ro.ns.Ns._process_epa_params") + def test__process_flavor_params_with_persistent_root_disk( + self, + epa_params, + ): + db = MagicMock(name="database mock") + + kwargs = { + "db": db, + } + + db.get_one.return_value = { + "_id": "ad6356e3-698c-43bf-9901-3aae9e9b9d18", + "df": [ + { + "id": "default-df", + "vdu-profile": [ + {"id": "several_volumes-VM", "min-number-of-instances": 1} + ], + } + ], + "id": "several_volumes-vnf", + "product-name": "several_volumes-vnf", + "vdu": [ + { + "id": "several_volumes-VM", + "name": "several_volumes-VM", + "sw-image-desc": "ubuntu20.04", + "alternative-sw-image-desc": [ + "ubuntu20.04-aws", + "ubuntu20.04-azure", + ], + "virtual-storage-desc": [ + "persistent-root-volume", + ], + } + ], + "version": "1.0", + "virtual-storage-desc": [ + { + "id": "persistent-root-volume", + "type-of-storage": "persistent-storage:persistent-storage", + "size-of-storage": "10", + }, + ], + "_admin": { + "storage": { + "fs": "mongo", + "path": "/app/storage/", + }, + "type": "vnfd", + }, + } + expected_result = { + "find_params": { + "flavor_data": { + "disk": 0, + "ram": 1024, + "vcpus": 2, + }, + }, + "params": { + "flavor_data": { + "disk": 0, + "name": "test", + "ram": 1024, + "vcpus": 2, + }, + }, + } + target_flavor = { + "id": "test_id", + "name": "test", + "storage-gb": "10", + "memory-mb": "1024", + "vcpu-count": "2", + } + indata = { + "vnf": [ + { + "vdur": [ + { + "vdu-name": "several_volumes-VM", + "ns-flavor-id": "test_id", + "virtual-storages": [ + { + "type-of-storage": "persistent-storage:persistent-storage", + "size-of-storage": "10", + }, + ], + }, + ], + "vnfd-id": "ad6356e3-698c-43bf-9901-3aae9e9b9d18", }, ], } @@ -1656,6 +1908,7 @@ class TestNs(unittest.TestCase): indata=indata, vim_info=vim_info, target_record_id=target_record_id, + **kwargs, ) self.assertTrue(epa_params.called) @@ -1696,7 +1949,18 @@ class TestNs(unittest.TestCase): "memory-mb": "1024", "vcpu-count": "2", } - indata = {} + indata = { + "vnf": [ + { + "vdur": [ + { + "ns-flavor-id": "test_id", + }, + ], + "vnfd-id": "ad6356e3-698c-43bf-9901-3aae9e9b9d18", + }, + ], + } vim_info = {} target_record_id = "" @@ -1719,6 +1983,54 @@ class TestNs(unittest.TestCase): self, epa_params, ): + db = MagicMock(name="database mock") + + kwargs = { + "db": db, + } + + db.get_one.return_value = { + "_id": "ad6356e3-698c-43bf-9901-3aae9e9b9d18", + "df": [ + { + "id": "default-df", + "vdu-profile": [ + {"id": "without_volumes-VM", "min-number-of-instances": 1} + ], + } + ], + "id": "without_volumes-vnf", + "product-name": "without_volumes-vnf", + "vdu": [ + { + "id": "without_volumes-VM", + "name": "without_volumes-VM", + "sw-image-desc": "ubuntu20.04", + "alternative-sw-image-desc": [ + "ubuntu20.04-aws", + "ubuntu20.04-azure", + ], + "virtual-storage-desc": ["root-volume", "ephemeral-volume"], + } + ], + "version": "1.0", + "virtual-storage-desc": [ + {"id": "root-volume", "size-of-storage": "10"}, + { + "id": "ephemeral-volume", + "type-of-storage": "etsi-nfv-descriptors:ephemeral-storage", + "size-of-storage": "1", + }, + ], + "_admin": { + "storage": { + "fs": "mongo", + "path": "/app/storage/", + }, + "type": "vnfd", + }, + } + expected_result = { "find_params": { "flavor_data": { @@ -1771,6 +2083,7 @@ class TestNs(unittest.TestCase): ], }, ], + "vnfd-id": "ad6356e3-698c-43bf-9901-3aae9e9b9d18", }, ], } @@ -1786,6 +2099,7 @@ class TestNs(unittest.TestCase): indata=indata, vim_info=vim_info, target_record_id=target_record_id, + **kwargs, ) self.assertTrue(epa_params.called) @@ -2398,8 +2712,108 @@ class TestNs(unittest.TestCase): cloud_init_content=cloud_init_content, params=params, context=context ) - def test__parse_jinja2(self): - pass + def test_rendering_jinja2_temp_without_special_characters(self): + cloud_init_content = """ + disk_setup: + ephemeral0: + table_type: {{type}} + layout: True + overwrite: {{is_override}} + runcmd: + - [ ls, -l, / ] + - [ sh, -xc, "echo $(date) '{{command}}'" ] + """ + params = { + "type": "mbr", + "is_override": "False", + "command": "; mkdir abc", + } + context = "cloud-init for VM" + expected_result = """ + disk_setup: + ephemeral0: + table_type: mbr + layout: True + overwrite: False + runcmd: + - [ ls, -l, / ] + - [ sh, -xc, "echo $(date) '; mkdir abc'" ] + """ + result = Ns._parse_jinja2( + cloud_init_content=cloud_init_content, params=params, context=context + ) + self.assertEqual(result, expected_result) + + def test_rendering_jinja2_temp_with_special_characters(self): + cloud_init_content = """ + disk_setup: + ephemeral0: + table_type: {{type}} + layout: True + overwrite: {{is_override}} + runcmd: + - [ ls, -l, / ] + - [ sh, -xc, "echo $(date) '{{command}}'" ] + """ + params = { + "type": "mbr", + "is_override": "False", + "command": "& rm -rf", + } + context = "cloud-init for VM" + expected_result = """ + disk_setup: + ephemeral0: + table_type: mbr + layout: True + overwrite: False + runcmd: + - [ ls, -l, / ] + - [ sh, -xc, "echo $(date) '& rm -rf /'" ] + """ + result = Ns._parse_jinja2( + cloud_init_content=cloud_init_content, params=params, context=context + ) + self.assertNotEqual(result, expected_result) + + def test_rendering_jinja2_temp_with_special_characters_autoescape_is_false(self): + with patch("osm_ng_ro.ns.Environment") as mock_environment: + mock_environment.return_value = Environment( + undefined=StrictUndefined, + autoescape=select_autoescape(default_for_string=False, default=False), + ) + cloud_init_content = """ + disk_setup: + ephemeral0: + table_type: {{type}} + layout: True + overwrite: {{is_override}} + runcmd: + - [ ls, -l, / ] + - [ sh, -xc, "echo $(date) '{{command}}'" ] + """ + params = { + "type": "mbr", + "is_override": "False", + "command": "& rm -rf /", + } + context = "cloud-init for VM" + expected_result = """ + disk_setup: + ephemeral0: + table_type: mbr + layout: True + overwrite: False + runcmd: + - [ ls, -l, / ] + - [ sh, -xc, "echo $(date) '& rm -rf /'" ] + """ + result = Ns._parse_jinja2( + cloud_init_content=cloud_init_content, + params=params, + context=context, + ) + self.assertEqual(result, expected_result) def test__process_vdu_params_empty_kargs(self): pass