1 #######################################################################################
2 # Copyright ETSI Contributors and Others.
4 # Licensed under the Apache License, Version 2.0 (the "License");
5 # you may not use this file except in compliance with the License.
6 # You may obtain a copy of the License at
8 # http://www.apache.org/licenses/LICENSE-2.0
10 # Unless required by applicable law or agreed to in writing, software
11 # distributed under the License is distributed on an "AS IS" BASIS,
12 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
14 # See the License for the specific language governing permissions and
15 # limitations under the License.
16 #######################################################################################
17 from copy
import deepcopy
19 from unittest
.mock
import MagicMock
, Mock
, patch
29 from osm_ng_ro
.ns
import Ns
, NsException
32 __author__
= "Eduardo Sousa"
33 __date__
= "$19-NOV-2021 00:00:00$"
36 # Variables used in Tests
37 vnfd_wth_persistent_storage
= {
38 "_id": "ad6356e3-698c-43bf-9901-3aae9e9b9d18",
42 "vdu-profile": [{"id": "several_volumes-VM", "min-number-of-instances": 1}],
45 "id": "several_volumes-vnf",
46 "product-name": "several_volumes-vnf",
49 "id": "several_volumes-VM",
50 "name": "several_volumes-VM",
51 "sw-image-desc": "ubuntu20.04",
52 "alternative-sw-image-desc": [
56 "virtual-storage-desc": [
57 "persistent-root-volume",
64 "virtual-storage-desc": [
66 "id": "persistent-volume2",
67 "type-of-storage": "persistent-storage:persistent-storage",
68 "size-of-storage": "10",
71 "id": "persistent-root-volume",
72 "type-of-storage": "persistent-storage:persistent-storage",
73 "size-of-storage": "10",
74 "vdu-storage-requirements": [
75 {"key": "keep-volume", "value": "true"},
79 "id": "ephemeral-volume",
80 "type-of-storage": "etsi-nfv-descriptors:ephemeral-storage",
81 "size-of-storage": "1",
87 "path": "/app/storage/",
92 vim_volume_id
= "ru937f49-3870-4169-b758-9732e1ff40f3"
93 task_by_target_record_id
= {
94 "nsrs:th47f48-9870-4169-b758-9732e1ff40f3": {
95 "extra_dict": {"params": {"net_type": "SR-IOV"}}
98 interfaces_wthout_positions
= [
109 "ns-vld-id": "mgmtnet",
112 interfaces_wth_all_positions
= [
125 "ns-vld-id": "mgmtnet",
129 target_vdu_wth_persistent_storage
= {
130 "_id": "09a0baa7-b7cb-4924-bd63-9f04a1c23960",
133 "vdu-name": "several_volumes-VM",
137 "ns-vld-id": "mgmtnet",
140 "virtual-storages": [
142 "id": "persistent-volume2",
143 "size-of-storage": "10",
144 "type-of-storage": "persistent-storage:persistent-storage",
147 "id": "persistent-root-volume",
148 "size-of-storage": "10",
149 "type-of-storage": "persistent-storage:persistent-storage",
150 "vdu-storage-requirements": [
151 {"key": "keep-volume", "value": "true"},
155 "id": "ephemeral-volume",
156 "size-of-storage": "1",
157 "type-of-storage": "etsi-nfv-descriptors:ephemeral-storage",
161 db
= MagicMock(name
="database mock")
162 fs
= MagicMock(name
="database mock")
163 ns_preffix
= "nsrs:th47f48-9870-4169-b758-9732e1ff40f3"
164 vnf_preffix
= "vnfrs:wh47f48-y870-4169-b758-5732e1ff40f5"
165 vnfr_id
= "wh47f48-y870-4169-b758-5732e1ff40f5"
166 nsr_id
= "th47f48-9870-4169-b758-9732e1ff40f3"
168 "name": "sample_name",
170 expected_extra_dict
= {
172 f
"{ns_preffix}:image.0",
173 f
"{ns_preffix}:flavor.0",
176 "affinity_group_list": [],
177 "availability_zone_index": None,
178 "availability_zone_list": None,
179 "cloud_config": None,
180 "description": "several_volumes-VM",
182 "flavor_id": f
"TASK-{ns_preffix}:flavor.0",
183 "image_id": f
"TASK-{ns_preffix}:image.0",
184 "name": "sample_name-vnf-several-volu-several_volumes-VM-0",
190 expected_extra_dict2
= {
192 f
"{ns_preffix}:image.0",
193 f
"{ns_preffix}:flavor.0",
196 "affinity_group_list": [],
197 "availability_zone_index": None,
198 "availability_zone_list": None,
199 "cloud_config": None,
200 "description": "without_volumes-VM",
202 "flavor_id": f
"TASK-{ns_preffix}:flavor.0",
203 "image_id": f
"TASK-{ns_preffix}:image.0",
204 "name": "sample_name-vnf-several-volu-without_volumes-VM-0",
209 tasks_by_target_record_id
= {
210 "nsrs:th47f48-9870-4169-b758-9732e1ff40f3": {
213 "net_type": "SR-IOV",
220 "vdu2cloud_init": {},
222 "vnfd-id": "ad6356e3-698c-43bf-9901-3aae9e9b9d18",
223 "member-vnf-index-ref": "vnf-several-volumes",
226 vnfd_wthout_persistent_storage
= {
227 "_id": "ad6356e3-698c-43bf-9901-3aae9e9b9d18",
231 "vdu-profile": [{"id": "without_volumes-VM", "min-number-of-instances": 1}],
234 "id": "without_volumes-vnf",
235 "product-name": "without_volumes-vnf",
238 "id": "without_volumes-VM",
239 "name": "without_volumes-VM",
240 "sw-image-desc": "ubuntu20.04",
241 "alternative-sw-image-desc": [
245 "virtual-storage-desc": ["root-volume", "ephemeral-volume"],
249 "virtual-storage-desc": [
250 {"id": "root-volume", "size-of-storage": "10"},
252 "id": "ephemeral-volume",
253 "type-of-storage": "etsi-nfv-descriptors:ephemeral-storage",
254 "size-of-storage": "1",
260 "path": "/app/storage/",
266 target_vdu_wthout_persistent_storage
= {
267 "_id": "09a0baa7-b7cb-4924-bd63-9f04a1c23960",
270 "vdu-name": "without_volumes-VM",
274 "ns-vld-id": "mgmtnet",
277 "virtual-storages": [
280 "size-of-storage": "10",
283 "id": "ephemeral-volume",
284 "size-of-storage": "1",
285 "type-of-storage": "etsi-nfv-descriptors:ephemeral-storage",
289 cloud_init_content
= """
294 overwrite: {{is_override}}
297 - [ sh, -xc, "echo $(date) '{{command}}'" ]
308 - [ sh, -xc, "echo $(date) '& rm -rf /'" ]
312 class CopyingMock(MagicMock
):
313 def __call__(self
, *args
, **kwargs
):
314 args
= deepcopy(args
)
315 kwargs
= deepcopy(kwargs
)
316 return super(CopyingMock
, self
).__call
__(*args
, **kwargs
)
319 class TestNs(unittest
.TestCase
):
323 def test__create_task_without_extra_dict(self
):
325 "target_id": "vim_openstack_1",
326 "action_id": "123456",
328 "task_id": "123456:1",
329 "status": "SCHEDULED",
332 "target_record": "test_target_record",
333 "target_record_id": "test_target_record_id",
336 "action_id": "123456",
341 task
= Ns
._create
_task
(
342 deployment_info
=deployment_info
,
343 target_id
="vim_openstack_1",
346 target_record
="test_target_record",
347 target_record_id
="test_target_record_id",
350 self
.assertEqual(deployment_info
.get("task_index"), 2)
351 self
.assertDictEqual(task
, expected_result
)
353 def test__create_task(self
):
355 "target_id": "vim_openstack_1",
356 "action_id": "123456",
358 "task_id": "123456:1",
359 "status": "SCHEDULED",
362 "target_record": "test_target_record",
363 "target_record_id": "test_target_record_id",
364 # values coming from extra_dict
365 "params": "test_params",
366 "find_params": "test_find_params",
367 "depends_on": "test_depends_on",
370 "action_id": "123456",
375 task
= Ns
._create
_task
(
376 deployment_info
=deployment_info
,
377 target_id
="vim_openstack_1",
380 target_record
="test_target_record",
381 target_record_id
="test_target_record_id",
383 "params": "test_params",
384 "find_params": "test_find_params",
385 "depends_on": "test_depends_on",
389 self
.assertEqual(deployment_info
.get("task_index"), 2)
390 self
.assertDictEqual(task
, expected_result
)
392 @patch("osm_ng_ro.ns.time")
393 def test__create_ro_task(self
, mock_time
: Mock
):
394 now
= 1637324838.994551
395 mock_time
.return_value
= now
397 "target_id": "vim_openstack_1",
398 "action_id": "123456",
400 "task_id": "123456:1",
401 "status": "SCHEDULED",
404 "target_record": "test_target_record",
405 "target_record_id": "test_target_record_id",
406 # values coming from extra_dict
407 "params": "test_params",
408 "find_params": "test_find_params",
409 "depends_on": "test_depends_on",
415 "target_id": "vim_openstack_1",
418 "created_items": None,
432 ro_task
= Ns
._create
_ro
_task
(
433 target_id
="vim_openstack_1",
437 self
.assertDictEqual(ro_task
, expected_result
)
439 def test__process_image_params_with_empty_target_image(self
):
445 result
= Ns
._process
_image
_params
(
446 target_image
=target_image
,
449 target_record_id
=None,
452 self
.assertDictEqual(expected_result
, result
)
454 def test__process_image_params_with_wrong_target_image(self
):
459 "no_image": "to_see_here",
462 result
= Ns
._process
_image
_params
(
463 target_image
=target_image
,
466 target_record_id
=None,
469 self
.assertDictEqual(expected_result
, result
)
471 def test__process_image_params_with_image(self
):
483 result
= Ns
._process
_image
_params
(
484 target_image
=target_image
,
487 target_record_id
=None,
490 self
.assertDictEqual(expected_result
, result
)
492 def test__process_image_params_with_vim_image_id(self
):
501 "vim_image_id": "123456",
504 result
= Ns
._process
_image
_params
(
505 target_image
=target_image
,
508 target_record_id
=None,
511 self
.assertDictEqual(expected_result
, result
)
513 def test__process_image_params_with_image_checksum(self
):
517 "checksum": "e3fc50a88d0a364313df4b21ef20c29e",
522 "image_checksum": "e3fc50a88d0a364313df4b21ef20c29e",
525 result
= Ns
._process
_image
_params
(
526 target_image
=target_image
,
529 target_record_id
=None,
532 self
.assertDictEqual(expected_result
, result
)
534 def test__get_resource_allocation_params_with_empty_target_image(self
):
536 quota_descriptor
= {}
538 result
= Ns
._get
_resource
_allocation
_params
(
539 quota_descriptor
=quota_descriptor
,
542 self
.assertDictEqual(expected_result
, result
)
544 def test__get_resource_allocation_params_with_wrong_target_image(self
):
547 "no_quota": "present_here",
550 result
= Ns
._get
_resource
_allocation
_params
(
551 quota_descriptor
=quota_descriptor
,
554 self
.assertDictEqual(expected_result
, result
)
556 def test__get_resource_allocation_params_with_limit(self
):
564 result
= Ns
._get
_resource
_allocation
_params
(
565 quota_descriptor
=quota_descriptor
,
568 self
.assertDictEqual(expected_result
, result
)
570 def test__get_resource_allocation_params_with_reserve(self
):
578 result
= Ns
._get
_resource
_allocation
_params
(
579 quota_descriptor
=quota_descriptor
,
582 self
.assertDictEqual(expected_result
, result
)
584 def test__get_resource_allocation_params_with_shares(self
):
592 result
= Ns
._get
_resource
_allocation
_params
(
593 quota_descriptor
=quota_descriptor
,
596 self
.assertDictEqual(expected_result
, result
)
598 def test__get_resource_allocation_params(self
):
610 result
= Ns
._get
_resource
_allocation
_params
(
611 quota_descriptor
=quota_descriptor
,
614 self
.assertDictEqual(expected_result
, result
)
616 @patch("osm_ng_ro.ns.Ns._get_resource_allocation_params")
617 def test__process_guest_epa_quota_params_with_empty_quota_epa_cpu(
625 result
= Ns
._process
_guest
_epa
_quota
_params
(
626 guest_epa_quota
=guest_epa_quota
,
627 epa_vcpu_set
=epa_vcpu_set
,
630 self
.assertDictEqual(expected_result
, result
)
631 self
.assertFalse(resource_allocation
.called
)
633 @patch("osm_ng_ro.ns.Ns._get_resource_allocation_params")
634 def test__process_guest_epa_quota_params_with_empty_quota_false_epa_cpu(
642 result
= Ns
._process
_guest
_epa
_quota
_params
(
643 guest_epa_quota
=guest_epa_quota
,
644 epa_vcpu_set
=epa_vcpu_set
,
647 self
.assertDictEqual(expected_result
, result
)
648 self
.assertFalse(resource_allocation
.called
)
650 @patch("osm_ng_ro.ns.Ns._get_resource_allocation_params")
651 def test__process_guest_epa_quota_params_with_wrong_quota_epa_cpu(
657 "no-quota": "nothing",
661 result
= Ns
._process
_guest
_epa
_quota
_params
(
662 guest_epa_quota
=guest_epa_quota
,
663 epa_vcpu_set
=epa_vcpu_set
,
666 self
.assertDictEqual(expected_result
, result
)
667 self
.assertFalse(resource_allocation
.called
)
669 @patch("osm_ng_ro.ns.Ns._get_resource_allocation_params")
670 def test__process_guest_epa_quota_params_with_wrong_quota_false_epa_cpu(
676 "no-quota": "nothing",
680 result
= Ns
._process
_guest
_epa
_quota
_params
(
681 guest_epa_quota
=guest_epa_quota
,
682 epa_vcpu_set
=epa_vcpu_set
,
685 self
.assertDictEqual(expected_result
, result
)
686 self
.assertFalse(resource_allocation
.called
)
688 @patch("osm_ng_ro.ns.Ns._get_resource_allocation_params")
689 def test__process_guest_epa_quota_params_with_cpu_quota_epa_cpu(
703 result
= Ns
._process
_guest
_epa
_quota
_params
(
704 guest_epa_quota
=guest_epa_quota
,
705 epa_vcpu_set
=epa_vcpu_set
,
708 self
.assertDictEqual(expected_result
, result
)
709 self
.assertFalse(resource_allocation
.called
)
711 @patch("osm_ng_ro.ns.Ns._get_resource_allocation_params")
712 def test__process_guest_epa_quota_params_with_cpu_quota_false_epa_cpu(
732 resource_allocation_param
= {
737 resource_allocation
.return_value
= {
743 result
= Ns
._process
_guest
_epa
_quota
_params
(
744 guest_epa_quota
=guest_epa_quota
,
745 epa_vcpu_set
=epa_vcpu_set
,
748 resource_allocation
.assert_called_once_with(resource_allocation_param
)
749 self
.assertDictEqual(expected_result
, result
)
751 @patch("osm_ng_ro.ns.Ns._get_resource_allocation_params")
752 def test__process_guest_epa_quota_params_with_mem_quota_epa_cpu(
772 resource_allocation_param
= {
777 resource_allocation
.return_value
= {
783 result
= Ns
._process
_guest
_epa
_quota
_params
(
784 guest_epa_quota
=guest_epa_quota
,
785 epa_vcpu_set
=epa_vcpu_set
,
788 resource_allocation
.assert_called_once_with(resource_allocation_param
)
789 self
.assertDictEqual(expected_result
, result
)
791 @patch("osm_ng_ro.ns.Ns._get_resource_allocation_params")
792 def test__process_guest_epa_quota_params_with_mem_quota_false_epa_cpu(
812 resource_allocation_param
= {
817 resource_allocation
.return_value
= {
823 result
= Ns
._process
_guest
_epa
_quota
_params
(
824 guest_epa_quota
=guest_epa_quota
,
825 epa_vcpu_set
=epa_vcpu_set
,
828 resource_allocation
.assert_called_once_with(resource_allocation_param
)
829 self
.assertDictEqual(expected_result
, result
)
831 @patch("osm_ng_ro.ns.Ns._get_resource_allocation_params")
832 def test__process_guest_epa_quota_params_with_disk_io_quota_epa_cpu(
852 resource_allocation_param
= {
857 resource_allocation
.return_value
= {
863 result
= Ns
._process
_guest
_epa
_quota
_params
(
864 guest_epa_quota
=guest_epa_quota
,
865 epa_vcpu_set
=epa_vcpu_set
,
868 resource_allocation
.assert_called_once_with(resource_allocation_param
)
869 self
.assertDictEqual(expected_result
, result
)
871 @patch("osm_ng_ro.ns.Ns._get_resource_allocation_params")
872 def test__process_guest_epa_quota_params_with_disk_io_quota_false_epa_cpu(
892 resource_allocation_param
= {
897 resource_allocation
.return_value
= {
903 result
= Ns
._process
_guest
_epa
_quota
_params
(
904 guest_epa_quota
=guest_epa_quota
,
905 epa_vcpu_set
=epa_vcpu_set
,
908 resource_allocation
.assert_called_once_with(resource_allocation_param
)
909 self
.assertDictEqual(expected_result
, result
)
911 @patch("osm_ng_ro.ns.Ns._get_resource_allocation_params")
912 def test__process_guest_epa_quota_params_with_vif_quota_epa_cpu(
932 resource_allocation_param
= {
937 resource_allocation
.return_value
= {
943 result
= Ns
._process
_guest
_epa
_quota
_params
(
944 guest_epa_quota
=guest_epa_quota
,
945 epa_vcpu_set
=epa_vcpu_set
,
948 resource_allocation
.assert_called_once_with(resource_allocation_param
)
949 self
.assertDictEqual(expected_result
, result
)
951 @patch("osm_ng_ro.ns.Ns._get_resource_allocation_params")
952 def test__process_guest_epa_quota_params_with_vif_quota_false_epa_cpu(
972 resource_allocation_param
= {
977 resource_allocation
.return_value
= {
983 result
= Ns
._process
_guest
_epa
_quota
_params
(
984 guest_epa_quota
=guest_epa_quota
,
985 epa_vcpu_set
=epa_vcpu_set
,
988 resource_allocation
.assert_called_once_with(resource_allocation_param
)
989 self
.assertDictEqual(expected_result
, result
)
991 @patch("osm_ng_ro.ns.Ns._get_resource_allocation_params")
992 def test__process_guest_epa_quota_params_with_quota_epa_cpu(
1037 resource_allocation
.return_value
= {
1043 result
= Ns
._process
_guest
_epa
_quota
_params
(
1044 guest_epa_quota
=guest_epa_quota
,
1045 epa_vcpu_set
=epa_vcpu_set
,
1048 self
.assertTrue(resource_allocation
.called
)
1049 self
.assertDictEqual(expected_result
, result
)
1051 @patch("osm_ng_ro.ns.Ns._get_resource_allocation_params")
1052 def test__process_guest_epa_quota_params_with_quota_epa_cpu_no_set(
1054 resource_allocation
,
1100 epa_vcpu_set
= False
1102 resource_allocation
.return_value
= {
1108 result
= Ns
._process
_guest
_epa
_quota
_params
(
1109 guest_epa_quota
=guest_epa_quota
,
1110 epa_vcpu_set
=epa_vcpu_set
,
1113 self
.assertTrue(resource_allocation
.called
)
1114 self
.assertDictEqual(expected_result
, result
)
1116 def test__process_guest_epa_numa_params_with_empty_numa_params(self
):
1117 expected_numa_result
= []
1118 expected_epa_vcpu_set_result
= False
1119 guest_epa_quota
= {}
1121 numa_result
, epa_vcpu_set_result
= Ns
._process
_guest
_epa
_numa
_params
(
1122 guest_epa_quota
=guest_epa_quota
,
1124 self
.assertEqual(expected_numa_result
, numa_result
)
1125 self
.assertEqual(expected_epa_vcpu_set_result
, epa_vcpu_set_result
)
1127 def test__process_guest_epa_numa_params_with_wrong_numa_params(self
):
1128 expected_numa_result
= []
1129 expected_epa_vcpu_set_result
= False
1130 guest_epa_quota
= {"no_nume": "here"}
1132 numa_result
, epa_vcpu_set_result
= Ns
._process
_guest
_epa
_numa
_params
(
1133 guest_epa_quota
=guest_epa_quota
,
1136 self
.assertEqual(expected_numa_result
, numa_result
)
1137 self
.assertEqual(expected_epa_vcpu_set_result
, epa_vcpu_set_result
)
1139 def test__process_guest_epa_numa_params_with_numa_node_policy(self
):
1140 expected_numa_result
= []
1141 expected_epa_vcpu_set_result
= False
1142 guest_epa_quota
= {"numa-node-policy": {}}
1144 numa_result
, epa_vcpu_set_result
= Ns
._process
_guest
_epa
_numa
_params
(
1145 guest_epa_quota
=guest_epa_quota
,
1148 self
.assertEqual(expected_numa_result
, numa_result
)
1149 self
.assertEqual(expected_epa_vcpu_set_result
, epa_vcpu_set_result
)
1151 def test__process_guest_epa_numa_params_with_no_node(self
):
1152 expected_numa_result
= []
1153 expected_epa_vcpu_set_result
= False
1155 "numa-node-policy": {
1160 numa_result
, epa_vcpu_set_result
= Ns
._process
_guest
_epa
_numa
_params
(
1161 guest_epa_quota
=guest_epa_quota
,
1164 self
.assertEqual(expected_numa_result
, numa_result
)
1165 self
.assertEqual(expected_epa_vcpu_set_result
, epa_vcpu_set_result
)
1167 def test__process_guest_epa_numa_params_with_1_node_num_cores(self
):
1168 expected_numa_result
= [{"cores": 3}]
1169 expected_epa_vcpu_set_result
= True
1171 "numa-node-policy": {
1180 numa_result
, epa_vcpu_set_result
= Ns
._process
_guest
_epa
_numa
_params
(
1181 guest_epa_quota
=guest_epa_quota
,
1184 self
.assertEqual(expected_numa_result
, numa_result
)
1185 self
.assertEqual(expected_epa_vcpu_set_result
, epa_vcpu_set_result
)
1187 def test__process_guest_epa_numa_params_with_1_node_paired_threads(self
):
1188 expected_numa_result
= [{"paired_threads": 3}]
1189 expected_epa_vcpu_set_result
= True
1191 "numa-node-policy": {
1194 "paired-threads": {"num-paired-threads": "3"},
1200 numa_result
, epa_vcpu_set_result
= Ns
._process
_guest
_epa
_numa
_params
(
1201 guest_epa_quota
=guest_epa_quota
,
1204 self
.assertEqual(expected_numa_result
, numa_result
)
1205 self
.assertEqual(expected_epa_vcpu_set_result
, epa_vcpu_set_result
)
1207 def test__process_guest_epa_numa_params_with_1_node_paired_threads_ids(self
):
1208 expected_numa_result
= [
1210 "paired-threads-id": [("0", "1"), ("4", "5")],
1213 expected_epa_vcpu_set_result
= False
1215 "numa-node-policy": {
1219 "paired-thread-ids": [
1235 numa_result
, epa_vcpu_set_result
= Ns
._process
_guest
_epa
_numa
_params
(
1236 guest_epa_quota
=guest_epa_quota
,
1239 self
.assertEqual(expected_numa_result
, numa_result
)
1240 self
.assertEqual(expected_epa_vcpu_set_result
, epa_vcpu_set_result
)
1242 def test__process_guest_epa_numa_params_with_1_node_num_threads(self
):
1243 expected_numa_result
= [{"threads": 3}]
1244 expected_epa_vcpu_set_result
= True
1246 "numa-node-policy": {
1255 numa_result
, epa_vcpu_set_result
= Ns
._process
_guest
_epa
_numa
_params
(
1256 guest_epa_quota
=guest_epa_quota
,
1259 self
.assertEqual(expected_numa_result
, numa_result
)
1260 self
.assertEqual(expected_epa_vcpu_set_result
, epa_vcpu_set_result
)
1262 def test__process_guest_epa_numa_params_with_1_node_memory_mb(self
):
1263 expected_numa_result
= [{"memory": 2}]
1264 expected_epa_vcpu_set_result
= False
1266 "numa-node-policy": {
1275 numa_result
, epa_vcpu_set_result
= Ns
._process
_guest
_epa
_numa
_params
(
1276 guest_epa_quota
=guest_epa_quota
,
1279 self
.assertEqual(expected_numa_result
, numa_result
)
1280 self
.assertEqual(expected_epa_vcpu_set_result
, epa_vcpu_set_result
)
1282 def test__process_guest_epa_numa_params_with_1_node_vcpu(self
):
1283 expected_numa_result
= [
1289 expected_epa_vcpu_set_result
= False
1291 "numa-node-policy": {
1292 "node": [{"id": "0", "vcpu": [{"id": "0"}, {"id": "1"}]}],
1296 numa_result
, epa_vcpu_set_result
= Ns
._process
_guest
_epa
_numa
_params
(
1297 guest_epa_quota
=guest_epa_quota
,
1300 self
.assertEqual(expected_numa_result
, numa_result
)
1301 self
.assertEqual(expected_epa_vcpu_set_result
, epa_vcpu_set_result
)
1303 def test__process_guest_epa_numa_params_with_2_node_vcpu(self
):
1304 expected_numa_result
= [
1315 expected_epa_vcpu_set_result
= False
1317 "numa-node-policy": {
1319 {"id": "0", "vcpu": [{"id": "0"}, {"id": "1"}]},
1320 {"id": "1", "vcpu": [{"id": "2"}, {"id": "3"}]},
1325 numa_result
, epa_vcpu_set_result
= Ns
._process
_guest
_epa
_numa
_params
(
1326 guest_epa_quota
=guest_epa_quota
,
1329 self
.assertEqual(expected_numa_result
, numa_result
)
1330 self
.assertEqual(expected_epa_vcpu_set_result
, epa_vcpu_set_result
)
1332 def test__process_guest_epa_numa_params_with_1_node(self
):
1333 expected_numa_result
= [
1338 "paired_threads": 3,
1339 "paired-threads-id": [("0", "1"), ("4", "5")],
1344 expected_epa_vcpu_set_result
= True
1346 "numa-node-policy": {
1351 "num-paired-threads": "3",
1352 "paired-thread-ids": [
1370 numa_result
, epa_vcpu_set_result
= Ns
._process
_guest
_epa
_numa
_params
(
1371 guest_epa_quota
=guest_epa_quota
,
1374 self
.assertEqual(expected_numa_result
, numa_result
)
1375 self
.assertEqual(expected_epa_vcpu_set_result
, epa_vcpu_set_result
)
1377 def test__process_guest_epa_numa_params_with_2_nodes(self
):
1378 expected_numa_result
= [
1381 "paired_threads": 3,
1382 "paired-threads-id": [("0", "1"), ("4", "5")],
1388 "paired_threads": 7,
1389 "paired-threads-id": [("2", "3"), ("5", "6")],
1394 expected_epa_vcpu_set_result
= True
1396 "numa-node-policy": {
1401 "num-paired-threads": "3",
1402 "paired-thread-ids": [
1419 "num-paired-threads": "7",
1420 "paired-thread-ids": [
1438 numa_result
, epa_vcpu_set_result
= Ns
._process
_guest
_epa
_numa
_params
(
1439 guest_epa_quota
=guest_epa_quota
,
1442 self
.assertEqual(expected_numa_result
, numa_result
)
1443 self
.assertEqual(expected_epa_vcpu_set_result
, epa_vcpu_set_result
)
1445 def test__process_guest_epa_cpu_pinning_params_with_empty_params(self
):
1446 expected_numa_result
= {}
1447 expected_epa_vcpu_set_result
= False
1448 guest_epa_quota
= {}
1450 epa_vcpu_set
= False
1452 numa_result
, epa_vcpu_set_result
= Ns
._process
_guest
_epa
_cpu
_pinning
_params
(
1453 guest_epa_quota
=guest_epa_quota
,
1454 vcpu_count
=vcpu_count
,
1455 epa_vcpu_set
=epa_vcpu_set
,
1458 self
.assertDictEqual(expected_numa_result
, numa_result
)
1459 self
.assertEqual(expected_epa_vcpu_set_result
, epa_vcpu_set_result
)
1461 def test__process_guest_epa_cpu_pinning_params_with_wrong_params(self
):
1462 expected_numa_result
= {}
1463 expected_epa_vcpu_set_result
= False
1465 "no-cpu-pinning-policy": "here",
1468 epa_vcpu_set
= False
1470 numa_result
, epa_vcpu_set_result
= Ns
._process
_guest
_epa
_cpu
_pinning
_params
(
1471 guest_epa_quota
=guest_epa_quota
,
1472 vcpu_count
=vcpu_count
,
1473 epa_vcpu_set
=epa_vcpu_set
,
1476 self
.assertDictEqual(expected_numa_result
, numa_result
)
1477 self
.assertEqual(expected_epa_vcpu_set_result
, epa_vcpu_set_result
)
1479 def test__process_guest_epa_cpu_pinning_params_with_epa_vcpu_set(self
):
1480 expected_numa_result
= {}
1481 expected_epa_vcpu_set_result
= True
1483 "cpu-pinning-policy": "DEDICATED",
1488 numa_result
, epa_vcpu_set_result
= Ns
._process
_guest
_epa
_cpu
_pinning
_params
(
1489 guest_epa_quota
=guest_epa_quota
,
1490 vcpu_count
=vcpu_count
,
1491 epa_vcpu_set
=epa_vcpu_set
,
1494 self
.assertDictEqual(expected_numa_result
, numa_result
)
1495 self
.assertEqual(expected_epa_vcpu_set_result
, epa_vcpu_set_result
)
1497 def test__process_guest_epa_cpu_pinning_params_with_threads(self
):
1498 expected_numa_result
= {"threads": 3}
1499 expected_epa_vcpu_set_result
= True
1501 "cpu-pinning-policy": "DEDICATED",
1502 "cpu-thread-pinning-policy": "PREFER",
1505 epa_vcpu_set
= False
1507 numa_result
, epa_vcpu_set_result
= Ns
._process
_guest
_epa
_cpu
_pinning
_params
(
1508 guest_epa_quota
=guest_epa_quota
,
1509 vcpu_count
=vcpu_count
,
1510 epa_vcpu_set
=epa_vcpu_set
,
1513 self
.assertDictEqual(expected_numa_result
, numa_result
)
1514 self
.assertEqual(expected_epa_vcpu_set_result
, epa_vcpu_set_result
)
1516 def test__process_guest_epa_cpu_pinning_params(self
):
1517 expected_numa_result
= {"cores": 3}
1518 expected_epa_vcpu_set_result
= True
1520 "cpu-pinning-policy": "DEDICATED",
1523 epa_vcpu_set
= False
1525 numa_result
, epa_vcpu_set_result
= Ns
._process
_guest
_epa
_cpu
_pinning
_params
(
1526 guest_epa_quota
=guest_epa_quota
,
1527 vcpu_count
=vcpu_count
,
1528 epa_vcpu_set
=epa_vcpu_set
,
1531 self
.assertDictEqual(expected_numa_result
, numa_result
)
1532 self
.assertEqual(expected_epa_vcpu_set_result
, epa_vcpu_set_result
)
1534 @patch("osm_ng_ro.ns.Ns._process_guest_epa_quota_params")
1535 @patch("osm_ng_ro.ns.Ns._process_guest_epa_cpu_pinning_params")
1536 @patch("osm_ng_ro.ns.Ns._process_guest_epa_numa_params")
1537 def test__process_guest_epa_params_with_empty_params(
1539 guest_epa_numa_params
,
1540 guest_epa_cpu_pinning_params
,
1541 guest_epa_quota_params
,
1543 expected_result
= {}
1546 result
= Ns
._process
_epa
_params
(
1547 target_flavor
=target_flavor
,
1550 self
.assertDictEqual(expected_result
, result
)
1551 self
.assertFalse(guest_epa_numa_params
.called
)
1552 self
.assertFalse(guest_epa_cpu_pinning_params
.called
)
1553 self
.assertFalse(guest_epa_quota_params
.called
)
1555 @patch("osm_ng_ro.ns.Ns._process_guest_epa_quota_params")
1556 @patch("osm_ng_ro.ns.Ns._process_guest_epa_cpu_pinning_params")
1557 @patch("osm_ng_ro.ns.Ns._process_guest_epa_numa_params")
1558 def test__process_guest_epa_params_with_wrong_params(
1560 guest_epa_numa_params
,
1561 guest_epa_cpu_pinning_params
,
1562 guest_epa_quota_params
,
1564 expected_result
= {}
1566 "no-guest-epa": "here",
1569 result
= Ns
._process
_epa
_params
(
1570 target_flavor
=target_flavor
,
1573 self
.assertDictEqual(expected_result
, result
)
1574 self
.assertFalse(guest_epa_numa_params
.called
)
1575 self
.assertFalse(guest_epa_cpu_pinning_params
.called
)
1576 self
.assertFalse(guest_epa_quota_params
.called
)
1578 @patch("osm_ng_ro.ns.Ns._process_guest_epa_quota_params")
1579 @patch("osm_ng_ro.ns.Ns._process_guest_epa_cpu_pinning_params")
1580 @patch("osm_ng_ro.ns.Ns._process_guest_epa_numa_params")
1581 def test__process_guest_epa_params(
1583 guest_epa_numa_params
,
1584 guest_epa_cpu_pinning_params
,
1585 guest_epa_quota_params
,
1588 "mem-policy": "STRICT",
1593 "numa-node-policy": {
1594 "mem-policy": "STRICT",
1599 guest_epa_numa_params
.return_value
= ({}, False)
1600 guest_epa_cpu_pinning_params
.return_value
= ({}, False)
1601 guest_epa_quota_params
.return_value
= {}
1603 result
= Ns
._process
_epa
_params
(
1604 target_flavor
=target_flavor
,
1607 self
.assertDictEqual(expected_result
, result
)
1608 self
.assertTrue(guest_epa_numa_params
.called
)
1609 self
.assertTrue(guest_epa_cpu_pinning_params
.called
)
1610 self
.assertTrue(guest_epa_quota_params
.called
)
1612 @patch("osm_ng_ro.ns.Ns._process_guest_epa_quota_params")
1613 @patch("osm_ng_ro.ns.Ns._process_guest_epa_cpu_pinning_params")
1614 @patch("osm_ng_ro.ns.Ns._process_guest_epa_numa_params")
1615 def test__process_guest_epa_params_with_mempage_size(
1617 guest_epa_numa_params
,
1618 guest_epa_cpu_pinning_params
,
1619 guest_epa_quota_params
,
1622 "mempage-size": "1G",
1623 "mem-policy": "STRICT",
1628 "mempage-size": "1G",
1629 "numa-node-policy": {
1630 "mem-policy": "STRICT",
1635 guest_epa_numa_params
.return_value
= ({}, False)
1636 guest_epa_cpu_pinning_params
.return_value
= ({}, False)
1637 guest_epa_quota_params
.return_value
= {}
1639 result
= Ns
._process
_epa
_params
(
1640 target_flavor
=target_flavor
,
1643 self
.assertDictEqual(expected_result
, result
)
1644 self
.assertTrue(guest_epa_numa_params
.called
)
1645 self
.assertTrue(guest_epa_cpu_pinning_params
.called
)
1646 self
.assertTrue(guest_epa_quota_params
.called
)
1648 @patch("osm_ng_ro.ns.Ns._process_guest_epa_quota_params")
1649 @patch("osm_ng_ro.ns.Ns._process_guest_epa_cpu_pinning_params")
1650 @patch("osm_ng_ro.ns.Ns._process_guest_epa_numa_params")
1651 def test__process_guest_epa_params_with_numa(
1653 guest_epa_numa_params
,
1654 guest_epa_cpu_pinning_params
,
1655 guest_epa_quota_params
,
1658 "mempage-size": "1G",
1659 "cpu-pinning-policy": "DEDICATED",
1660 "cpu-thread-pinning-policy": "PREFER",
1665 "paired-threads": 3,
1666 "paired-threads-id": [("0", "1"), ("4", "5")],
1670 "cpu-quota": {"limit": 10, "reserve": 20, "shares": 30},
1671 "disk-io-quota": {"limit": 10, "reserve": 20, "shares": 30},
1672 "mem-quota": {"limit": 10, "reserve": 20, "shares": 30},
1673 "vif-quota": {"limit": 10, "reserve": 20, "shares": 30},
1678 "mempage-size": "1G",
1679 "cpu-pinning-policy": "DEDICATED",
1680 "cpu-thread-pinning-policy": "PREFER",
1681 "numa-node-policy": {
1686 "num-paired-threads": "3",
1687 "paired-thread-ids": [
1726 guest_epa_numa_params
.return_value
= (
1730 "paired-threads": 3,
1731 "paired-threads-id": [("0", "1"), ("4", "5")],
1738 guest_epa_cpu_pinning_params
.return_value
= (
1744 guest_epa_quota_params
.return_value
= {
1767 result
= Ns
._process
_epa
_params
(
1768 target_flavor
=target_flavor
,
1770 self
.assertEqual(expected_result
, result
)
1771 self
.assertTrue(guest_epa_numa_params
.called
)
1772 self
.assertTrue(guest_epa_cpu_pinning_params
.called
)
1773 self
.assertTrue(guest_epa_quota_params
.called
)
1775 @patch("osm_ng_ro.ns.Ns._process_epa_params")
1776 def test__process_flavor_params_with_empty_target_flavor(
1784 "vnfd-id": "ad6356e3-698c-43bf-9901-3aae9e9b9d18",
1789 target_record_id
= ""
1791 with self
.assertRaises(KeyError):
1792 Ns
._process
_flavor
_params
(
1793 target_flavor
=target_flavor
,
1796 target_record_id
=target_record_id
,
1799 self
.assertFalse(epa_params
.called
)
1801 @patch("osm_ng_ro.ns.Ns._process_epa_params")
1802 def test__process_flavor_params_with_wrong_target_flavor(
1807 "no-target-flavor": "here",
1811 target_record_id
= ""
1813 with self
.assertRaises(KeyError):
1814 Ns
._process
_flavor
_params
(
1815 target_flavor
=target_flavor
,
1818 target_record_id
=target_record_id
,
1821 self
.assertFalse(epa_params
.called
)
1823 @patch("osm_ng_ro.ns.Ns._process_epa_params")
1824 def test__process_flavor_params_with_empty_indata(
1848 "memory-mb": "1024",
1853 target_record_id
= ""
1855 epa_params
.return_value
= {}
1857 result
= Ns
._process
_flavor
_params
(
1858 target_flavor
=target_flavor
,
1861 target_record_id
=target_record_id
,
1864 self
.assertTrue(epa_params
.called
)
1865 self
.assertDictEqual(result
, expected_result
)
1867 @patch("osm_ng_ro.ns.Ns._process_epa_params")
1868 def test__process_flavor_params_with_wrong_indata(
1892 "memory-mb": "1024",
1899 target_record_id
= ""
1901 epa_params
.return_value
= {}
1903 result
= Ns
._process
_flavor
_params
(
1904 target_flavor
=target_flavor
,
1907 target_record_id
=target_record_id
,
1910 self
.assertTrue(epa_params
.called
)
1911 self
.assertDictEqual(result
, expected_result
)
1913 @patch("osm_ng_ro.ns.Ns._process_epa_params")
1914 def test__process_flavor_params_with_ephemeral_disk(
1922 db
.get_one
.return_value
= {
1923 "_id": "ad6356e3-698c-43bf-9901-3aae9e9b9d18",
1928 {"id": "without_volumes-VM", "min-number-of-instances": 1}
1932 "id": "without_volumes-vnf",
1933 "product-name": "without_volumes-vnf",
1936 "id": "without_volumes-VM",
1937 "name": "without_volumes-VM",
1938 "sw-image-desc": "ubuntu20.04",
1939 "alternative-sw-image-desc": [
1941 "ubuntu20.04-azure",
1943 "virtual-storage-desc": ["root-volume", "ephemeral-volume"],
1947 "virtual-storage-desc": [
1948 {"id": "root-volume", "size-of-storage": "10"},
1950 "id": "ephemeral-volume",
1951 "type-of-storage": "etsi-nfv-descriptors:ephemeral-storage",
1952 "size-of-storage": "1",
1958 "path": "/app/storage/",
1986 "memory-mb": "1024",
1994 "ns-flavor-id": "test_id",
1995 "virtual-storages": [
1997 "type-of-storage": "etsi-nfv-descriptors:ephemeral-storage",
1998 "size-of-storage": "10",
2003 "vnfd-id": "ad6356e3-698c-43bf-9901-3aae9e9b9d18",
2008 target_record_id
= ""
2010 epa_params
.return_value
= {}
2012 result
= Ns
._process
_flavor
_params
(
2013 target_flavor
=target_flavor
,
2016 target_record_id
=target_record_id
,
2020 self
.assertTrue(epa_params
.called
)
2021 self
.assertDictEqual(result
, expected_result
)
2023 @patch("osm_ng_ro.ns.Ns._process_epa_params")
2024 def test__process_flavor_params_with_swap_disk(
2051 "memory-mb": "1024",
2059 "ns-flavor-id": "test_id",
2060 "virtual-storages": [
2062 "type-of-storage": "etsi-nfv-descriptors:swap-storage",
2063 "size-of-storage": "20",
2068 "vnfd-id": "ad6356e3-698c-43bf-9901-3aae9e9b9d18",
2073 target_record_id
= ""
2075 epa_params
.return_value
= {}
2077 result
= Ns
._process
_flavor
_params
(
2078 target_flavor
=target_flavor
,
2081 target_record_id
=target_record_id
,
2084 self
.assertTrue(epa_params
.called
)
2085 self
.assertDictEqual(result
, expected_result
)
2087 @patch("osm_ng_ro.ns.Ns._process_epa_params")
2088 def test__process_flavor_params_with_persistent_root_disk(
2096 db
.get_one
.return_value
= {
2097 "_id": "ad6356e3-698c-43bf-9901-3aae9e9b9d18",
2102 {"id": "several_volumes-VM", "min-number-of-instances": 1}
2106 "id": "several_volumes-vnf",
2107 "product-name": "several_volumes-vnf",
2110 "id": "several_volumes-VM",
2111 "name": "several_volumes-VM",
2112 "sw-image-desc": "ubuntu20.04",
2113 "alternative-sw-image-desc": [
2115 "ubuntu20.04-azure",
2117 "virtual-storage-desc": [
2118 "persistent-root-volume",
2123 "virtual-storage-desc": [
2125 "id": "persistent-root-volume",
2126 "type-of-storage": "persistent-storage:persistent-storage",
2127 "size-of-storage": "10",
2133 "path": "/app/storage/",
2159 "memory-mb": "1024",
2167 "vdu-name": "several_volumes-VM",
2168 "ns-flavor-id": "test_id",
2169 "virtual-storages": [
2171 "type-of-storage": "persistent-storage:persistent-storage",
2172 "size-of-storage": "10",
2177 "vnfd-id": "ad6356e3-698c-43bf-9901-3aae9e9b9d18",
2182 target_record_id
= ""
2184 epa_params
.return_value
= {}
2186 result
= Ns
._process
_flavor
_params
(
2187 target_flavor
=target_flavor
,
2190 target_record_id
=target_record_id
,
2194 self
.assertTrue(epa_params
.called
)
2195 self
.assertDictEqual(result
, expected_result
)
2197 @patch("osm_ng_ro.ns.Ns._process_epa_params")
2198 def test__process_flavor_params_with_epa_params(
2209 "numa": "there-is-numa-here",
2220 "numa": "there-is-numa-here",
2229 "memory-mb": "1024",
2237 "ns-flavor-id": "test_id",
2240 "vnfd-id": "ad6356e3-698c-43bf-9901-3aae9e9b9d18",
2245 target_record_id
= ""
2247 epa_params
.return_value
= {
2248 "numa": "there-is-numa-here",
2251 result
= Ns
._process
_flavor
_params
(
2252 target_flavor
=target_flavor
,
2255 target_record_id
=target_record_id
,
2258 self
.assertTrue(epa_params
.called
)
2259 self
.assertDictEqual(result
, expected_result
)
2261 @patch("osm_ng_ro.ns.Ns._process_epa_params")
2262 def test__process_flavor_params(
2270 db
.get_one
.return_value
= {
2271 "_id": "ad6356e3-698c-43bf-9901-3aae9e9b9d18",
2276 {"id": "without_volumes-VM", "min-number-of-instances": 1}
2280 "id": "without_volumes-vnf",
2281 "product-name": "without_volumes-vnf",
2284 "id": "without_volumes-VM",
2285 "name": "without_volumes-VM",
2286 "sw-image-desc": "ubuntu20.04",
2287 "alternative-sw-image-desc": [
2289 "ubuntu20.04-azure",
2291 "virtual-storage-desc": ["root-volume", "ephemeral-volume"],
2295 "virtual-storage-desc": [
2296 {"id": "root-volume", "size-of-storage": "10"},
2298 "id": "ephemeral-volume",
2299 "type-of-storage": "etsi-nfv-descriptors:ephemeral-storage",
2300 "size-of-storage": "1",
2306 "path": "/app/storage/",
2321 "numa": "there-is-numa-here",
2334 "numa": "there-is-numa-here",
2343 "memory-mb": "1024",
2351 "ns-flavor-id": "test_id",
2352 "virtual-storages": [
2354 "type-of-storage": "etsi-nfv-descriptors:ephemeral-storage",
2355 "size-of-storage": "10",
2358 "type-of-storage": "etsi-nfv-descriptors:swap-storage",
2359 "size-of-storage": "20",
2364 "vnfd-id": "ad6356e3-698c-43bf-9901-3aae9e9b9d18",
2369 target_record_id
= ""
2371 epa_params
.return_value
= {
2372 "numa": "there-is-numa-here",
2375 result
= Ns
._process
_flavor
_params
(
2376 target_flavor
=target_flavor
,
2379 target_record_id
=target_record_id
,
2383 self
.assertTrue(epa_params
.called
)
2384 self
.assertDictEqual(result
, expected_result
)
2386 def test__ip_profile_to_ro_with_none(self
):
2389 result
= Ns
._ip
_profile
_to
_ro
(
2390 ip_profile
=ip_profile
,
2393 self
.assertIsNone(result
)
2395 def test__ip_profile_to_ro_with_empty_profile(self
):
2398 result
= Ns
._ip
_profile
_to
_ro
(
2399 ip_profile
=ip_profile
,
2402 self
.assertIsNone(result
)
2404 def test__ip_profile_to_ro_with_wrong_profile(self
):
2406 "no-profile": "here",
2409 "ip_version": "IPv4",
2410 "subnet_address": None,
2411 "gateway_address": None,
2412 "dhcp_enabled": False,
2413 "dhcp_start_address": None,
2417 result
= Ns
._ip
_profile
_to
_ro
(
2418 ip_profile
=ip_profile
,
2421 self
.assertDictEqual(expected_result
, result
)
2423 def test__ip_profile_to_ro_with_ipv4_profile(self
):
2425 "ip-version": "ipv4",
2426 "subnet-address": "192.168.0.0/24",
2427 "gateway-address": "192.168.0.254",
2430 "start-address": "192.168.0.10",
2435 "ip_version": "IPv4",
2436 "subnet_address": "192.168.0.0/24",
2437 "gateway_address": "192.168.0.254",
2438 "dhcp_enabled": True,
2439 "dhcp_start_address": "192.168.0.10",
2443 result
= Ns
._ip
_profile
_to
_ro
(
2444 ip_profile
=ip_profile
,
2447 self
.assertDictEqual(expected_result
, result
)
2449 def test__ip_profile_to_ro_with_ipv6_profile(self
):
2451 "ip-version": "ipv6",
2452 "subnet-address": "2001:0200:0001::/48",
2453 "gateway-address": "2001:0200:0001:ffff:ffff:ffff:ffff:fffe",
2456 "start-address": "2001:0200:0001::0010",
2461 "ip_version": "IPv6",
2462 "subnet_address": "2001:0200:0001::/48",
2463 "gateway_address": "2001:0200:0001:ffff:ffff:ffff:ffff:fffe",
2464 "dhcp_enabled": True,
2465 "dhcp_start_address": "2001:0200:0001::0010",
2469 result
= Ns
._ip
_profile
_to
_ro
(
2470 ip_profile
=ip_profile
,
2473 self
.assertDictEqual(expected_result
, result
)
2475 def test__ip_profile_to_ro_with_dns_server(self
):
2477 "ip-version": "ipv4",
2478 "subnet-address": "192.168.0.0/24",
2479 "gateway-address": "192.168.0.254",
2482 "start-address": "192.168.0.10",
2487 "address": "8.8.8.8",
2490 "address": "1.1.1.1",
2493 "address": "1.0.0.1",
2498 "ip_version": "IPv4",
2499 "subnet_address": "192.168.0.0/24",
2500 "gateway_address": "192.168.0.254",
2501 "dhcp_enabled": True,
2502 "dhcp_start_address": "192.168.0.10",
2504 "dns_address": "8.8.8.8;1.1.1.1;1.0.0.1",
2507 result
= Ns
._ip
_profile
_to
_ro
(
2508 ip_profile
=ip_profile
,
2511 self
.assertDictEqual(expected_result
, result
)
2513 def test__ip_profile_to_ro_with_security_group(self
):
2515 "ip-version": "ipv4",
2516 "subnet-address": "192.168.0.0/24",
2517 "gateway-address": "192.168.0.254",
2520 "start-address": "192.168.0.10",
2524 "some-security-group": "here",
2528 "ip_version": "IPv4",
2529 "subnet_address": "192.168.0.0/24",
2530 "gateway_address": "192.168.0.254",
2531 "dhcp_enabled": True,
2532 "dhcp_start_address": "192.168.0.10",
2535 "some-security-group": "here",
2539 result
= Ns
._ip
_profile
_to
_ro
(
2540 ip_profile
=ip_profile
,
2543 self
.assertDictEqual(expected_result
, result
)
2545 def test__ip_profile_to_ro(self
):
2547 "ip-version": "ipv4",
2548 "subnet-address": "192.168.0.0/24",
2549 "gateway-address": "192.168.0.254",
2552 "start-address": "192.168.0.10",
2557 "address": "8.8.8.8",
2560 "address": "1.1.1.1",
2563 "address": "1.0.0.1",
2567 "some-security-group": "here",
2571 "ip_version": "IPv4",
2572 "subnet_address": "192.168.0.0/24",
2573 "gateway_address": "192.168.0.254",
2574 "dhcp_enabled": True,
2575 "dhcp_start_address": "192.168.0.10",
2577 "dns_address": "8.8.8.8;1.1.1.1;1.0.0.1",
2579 "some-security-group": "here",
2583 result
= Ns
._ip
_profile
_to
_ro
(
2584 ip_profile
=ip_profile
,
2587 self
.assertDictEqual(expected_result
, result
)
2589 @patch("osm_ng_ro.ns.Ns._ip_profile_to_ro")
2590 def test__process_net_params_with_empty_params(
2601 "provider_network": "some-profile-here",
2603 target_record_id
= ""
2606 "net_name": "ns-name-vld-name",
2607 "net_type": "bridge",
2609 "some_ip_profile": "here",
2611 "provider_network_profile": "some-profile-here",
2615 ip_profile_to_ro
.return_value
= {
2616 "some_ip_profile": "here",
2619 result
= Ns
._process
_net
_params
(
2620 target_vld
=target_vld
,
2623 target_record_id
=target_record_id
,
2626 self
.assertDictEqual(expected_result
, result
)
2627 self
.assertTrue(ip_profile_to_ro
.called
)
2629 @patch("osm_ng_ro.ns.Ns._ip_profile_to_ro")
2630 def test__process_net_params_with_vim_info_sdn(
2642 "sdn-ports": ["some", "ports", "here"],
2643 "vlds": ["some", "vlds", "here"],
2646 target_record_id
= "vld.sdn.something"
2649 "sdn-ports": ["some", "ports", "here"],
2650 "vlds": ["some", "vlds", "here"],
2655 result
= Ns
._process
_net
_params
(
2656 target_vld
=target_vld
,
2659 target_record_id
=target_record_id
,
2662 self
.assertDictEqual(expected_result
, result
)
2663 self
.assertFalse(ip_profile_to_ro
.called
)
2665 @patch("osm_ng_ro.ns.Ns._ip_profile_to_ro")
2666 def test__process_net_params_with_vim_info_sdn_target_vim(
2678 "sdn-ports": ["some", "ports", "here"],
2679 "vlds": ["some", "vlds", "here"],
2680 "target_vim": "some-vim",
2683 target_record_id
= "vld.sdn.something"
2685 "depends_on": ["some-vim vld.sdn"],
2687 "sdn-ports": ["some", "ports", "here"],
2688 "vlds": ["some", "vlds", "here"],
2689 "target_vim": "some-vim",
2694 result
= Ns
._process
_net
_params
(
2695 target_vld
=target_vld
,
2698 target_record_id
=target_record_id
,
2701 self
.assertDictEqual(expected_result
, result
)
2702 self
.assertFalse(ip_profile_to_ro
.called
)
2704 @patch("osm_ng_ro.ns.Ns._ip_profile_to_ro")
2705 def test__process_net_params_with_vim_network_name(
2716 "vim_network_name": "some-network-name",
2718 target_record_id
= "vld.sdn.something"
2722 "name": "some-network-name",
2727 result
= Ns
._process
_net
_params
(
2728 target_vld
=target_vld
,
2731 target_record_id
=target_record_id
,
2734 self
.assertDictEqual(expected_result
, result
)
2735 self
.assertFalse(ip_profile_to_ro
.called
)
2737 @patch("osm_ng_ro.ns.Ns._ip_profile_to_ro")
2738 def test__process_net_params_with_vim_network_id(
2749 "vim_network_id": "some-network-id",
2751 target_record_id
= "vld.sdn.something"
2755 "id": "some-network-id",
2760 result
= Ns
._process
_net
_params
(
2761 target_vld
=target_vld
,
2764 target_record_id
=target_record_id
,
2767 self
.assertDictEqual(expected_result
, result
)
2768 self
.assertFalse(ip_profile_to_ro
.called
)
2770 @patch("osm_ng_ro.ns.Ns._ip_profile_to_ro")
2771 def test__process_net_params_with_mgmt_network(
2778 "mgmt-network": "some-mgmt-network",
2784 target_record_id
= "vld.sdn.something"
2792 result
= Ns
._process
_net
_params
(
2793 target_vld
=target_vld
,
2796 target_record_id
=target_record_id
,
2799 self
.assertDictEqual(expected_result
, result
)
2800 self
.assertFalse(ip_profile_to_ro
.called
)
2802 @patch("osm_ng_ro.ns.Ns._ip_profile_to_ro")
2803 def test__process_net_params_with_underlay_eline(
2809 "underlay": "some-underlay-here",
2816 "provider_network": "some-profile-here",
2818 target_record_id
= ""
2822 "some_ip_profile": "here",
2824 "net_name": "ns-name-vld-name",
2826 "provider_network_profile": "some-profile-here",
2830 ip_profile_to_ro
.return_value
= {
2831 "some_ip_profile": "here",
2834 result
= Ns
._process
_net
_params
(
2835 target_vld
=target_vld
,
2838 target_record_id
=target_record_id
,
2841 self
.assertDictEqual(expected_result
, result
)
2842 self
.assertTrue(ip_profile_to_ro
.called
)
2844 @patch("osm_ng_ro.ns.Ns._ip_profile_to_ro")
2845 def test__process_net_params_with_underlay_elan(
2851 "underlay": "some-underlay-here",
2858 "provider_network": "some-profile-here",
2860 target_record_id
= ""
2864 "some_ip_profile": "here",
2866 "net_name": "ns-name-vld-name",
2868 "provider_network_profile": "some-profile-here",
2872 ip_profile_to_ro
.return_value
= {
2873 "some_ip_profile": "here",
2876 result
= Ns
._process
_net
_params
(
2877 target_vld
=target_vld
,
2880 target_record_id
=target_record_id
,
2883 self
.assertDictEqual(expected_result
, result
)
2884 self
.assertTrue(ip_profile_to_ro
.called
)
2886 def test__get_cloud_init_exception(self
):
2887 db_mock
= MagicMock(name
="database mock")
2892 with self
.assertRaises(NsException
):
2893 Ns
._get
_cloud
_init
(db
=db_mock
, fs
=fs_mock
, location
=location
)
2895 def test__get_cloud_init_file_fs_exception(self
):
2896 db_mock
= MagicMock(name
="database mock")
2899 location
= "vnfr_id_123456:file:test_file"
2900 db_mock
.get_one
.return_value
= {
2903 "folder": "/home/osm",
2904 "pkg-dir": "vnfr_test_dir",
2909 with self
.assertRaises(NsException
):
2910 Ns
._get
_cloud
_init
(db
=db_mock
, fs
=fs_mock
, location
=location
)
2912 def test__get_cloud_init_file(self
):
2913 db_mock
= MagicMock(name
="database mock")
2914 fs_mock
= MagicMock(name
="filesystem mock")
2915 file_mock
= MagicMock(name
="file mock")
2917 location
= "vnfr_id_123456:file:test_file"
2918 cloud_init_content
= "this is a cloud init file content"
2920 db_mock
.get_one
.return_value
= {
2923 "folder": "/home/osm",
2924 "pkg-dir": "vnfr_test_dir",
2928 fs_mock
.file_open
.return_value
= file_mock
2929 file_mock
.__enter
__.return_value
.read
.return_value
= cloud_init_content
2931 result
= Ns
._get
_cloud
_init
(db
=db_mock
, fs
=fs_mock
, location
=location
)
2933 self
.assertEqual(cloud_init_content
, result
)
2935 def test__get_cloud_init_vdu(self
):
2936 db_mock
= MagicMock(name
="database mock")
2939 location
= "vnfr_id_123456:vdu:0"
2940 cloud_init_content
= "this is a cloud init file content"
2942 db_mock
.get_one
.return_value
= {
2945 "cloud-init": cloud_init_content
,
2950 result
= Ns
._get
_cloud
_init
(db
=db_mock
, fs
=fs_mock
, location
=location
)
2952 self
.assertEqual(cloud_init_content
, result
)
2954 @patch("jinja2.Environment.__init__")
2955 def test__parse_jinja2_undefined_error(self
, env_mock
: Mock
):
2956 cloud_init_content
= None
2960 env_mock
.side_effect
= UndefinedError("UndefinedError occurred.")
2962 with self
.assertRaises(NsException
):
2964 cloud_init_content
=cloud_init_content
, params
=params
, context
=context
2967 @patch("jinja2.Environment.__init__")
2968 def test__parse_jinja2_template_error(self
, env_mock
: Mock
):
2969 cloud_init_content
= None
2973 env_mock
.side_effect
= TemplateError("TemplateError occurred.")
2975 with self
.assertRaises(NsException
):
2977 cloud_init_content
=cloud_init_content
, params
=params
, context
=context
2980 @patch("jinja2.Environment.__init__")
2981 def test__parse_jinja2_template_not_found(self
, env_mock
: Mock
):
2982 cloud_init_content
= None
2986 env_mock
.side_effect
= TemplateNotFound("TemplateNotFound occurred.")
2988 with self
.assertRaises(NsException
):
2990 cloud_init_content
=cloud_init_content
, params
=params
, context
=context
2993 def test_rendering_jinja2_temp_without_special_characters(self
):
2994 cloud_init_content
= """
2997 table_type: {{type}}
2999 overwrite: {{is_override}}
3002 - [ sh, -xc, "echo $(date) '{{command}}'" ]
3006 "is_override": "False",
3007 "command": "; mkdir abc",
3009 context
= "cloud-init for VM"
3010 expected_result
= """
3018 - [ sh, -xc, "echo $(date) '; mkdir abc'" ]
3020 result
= Ns
._parse
_jinja
2(
3021 cloud_init_content
=cloud_init_content
, params
=params
, context
=context
3023 self
.assertEqual(result
, expected_result
)
3025 def test_rendering_jinja2_temp_with_special_characters(self
):
3026 cloud_init_content
= """
3029 table_type: {{type}}
3031 overwrite: {{is_override}}
3034 - [ sh, -xc, "echo $(date) '{{command}}'" ]
3038 "is_override": "False",
3039 "command": "& rm -rf",
3041 context
= "cloud-init for VM"
3042 expected_result
= """
3050 - [ sh, -xc, "echo $(date) '& rm -rf /'" ]
3052 result
= Ns
._parse
_jinja
2(
3053 cloud_init_content
=cloud_init_content
, params
=params
, context
=context
3055 self
.assertNotEqual(result
, expected_result
)
3057 def test_rendering_jinja2_temp_with_special_characters_autoescape_is_false(self
):
3058 with
patch("osm_ng_ro.ns.Environment") as mock_environment
:
3059 mock_environment
.return_value
= Environment(
3060 undefined
=StrictUndefined
,
3061 autoescape
=select_autoescape(default_for_string
=False, default
=False),
3063 cloud_init_content
= """
3066 table_type: {{type}}
3068 overwrite: {{is_override}}
3071 - [ sh, -xc, "echo $(date) '{{command}}'" ]
3075 "is_override": "False",
3076 "command": "& rm -rf /",
3078 context
= "cloud-init for VM"
3079 expected_result
= """
3087 - [ sh, -xc, "echo $(date) '& rm -rf /'" ]
3089 result
= Ns
._parse
_jinja
2(
3090 cloud_init_content
=cloud_init_content
,
3094 self
.assertEqual(result
, expected_result
)
3096 @patch("osm_ng_ro.ns.Ns._assign_vim")
3097 def test__rebuild_start_stop_task(self
, assign_vim
):
3100 actions
= ["start", "stop", "rebuild"]
3101 vdu_id
= "bb9c43f9-10a2-4569-a8a8-957c3528b6d1"
3102 vnf_id
= "665b4165-ce24-4320-bf19-b9a45bade49f"
3104 action_id
= "bb937f49-3870-4169-b758-9732e1ff40f3"
3105 nsr_id
= "993166fe-723e-4680-ac4b-b1af2541ae31"
3107 target_vim
= "vim:f9f370ac-0d44-41a7-9000-457f2332bc35"
3108 t
= "vnfrs:665b4165-ce24-4320-bf19-b9a45bade49f:vdur.bb9c43f9-10a2-4569-a8a8-957c3528b6d1"
3109 for action
in actions
:
3111 "target_id": "vim:f9f370ac-0d44-41a7-9000-457f2332bc35",
3112 "action_id": "bb937f49-3870-4169-b758-9732e1ff40f3",
3113 "nsr_id": "993166fe-723e-4680-ac4b-b1af2541ae31",
3114 "task_id": "bb937f49-3870-4169-b758-9732e1ff40f3:0",
3115 "status": "SCHEDULED",
3118 "target_record": "vnfrs:665b4165-ce24-4320-bf19-b9a45bade49f:vdur.0",
3119 "target_record_id": t
,
3121 "vim_vm_id": "f37b18ef-3caa-4dc9-ab91-15c669b16396",
3125 extra_dict
["params"] = {
3126 "vim_vm_id": "f37b18ef-3caa-4dc9-ab91-15c669b16396",
3129 task
= self
.ns
.rebuild_start_stop_task(
3139 self
.assertEqual(task
.get("action_id"), action_id
)
3140 self
.assertEqual(task
.get("nsr_id"), nsr_id
)
3141 self
.assertEqual(task
.get("target_id"), target_vim
)
3142 self
.assertDictEqual(task
, expected_result
)
3144 @patch("osm_ng_ro.ns.Ns._assign_vim")
3145 def test_verticalscale_task(self
, assign_vim
):
3149 action_id
= "bb937f49-3870-4169-b758-9732e1ff40f3"
3150 nsr_id
= "993166fe-723e-4680-ac4b-b1af2541ae31"
3152 target_record_id
= (
3153 "vnfrs:665b4165-ce24-4320-bf19-b9a45bade49f:"
3154 "vdur.bb9c43f9-10a2-4569-a8a8-957c3528b6d1"
3158 "target_id": "vim:f9f370ac-0d44-41a7-9000-457f2332bc35",
3159 "action_id": "bb937f49-3870-4169-b758-9732e1ff40f3",
3160 "nsr_id": "993166fe-723e-4680-ac4b-b1af2541ae31",
3161 "task_id": "bb937f49-3870-4169-b758-9732e1ff40f3:1",
3162 "status": "SCHEDULED",
3164 "item": "verticalscale",
3165 "target_record": "vnfrs:665b4165-ce24-4320-bf19-b9a45bade49f:vdur.1",
3166 "target_record_id": target_record_id
,
3168 "vim_vm_id": "f37b18ef-3caa-4dc9-ab91-15c669b16396",
3169 "flavor_dict": "flavor_dict",
3173 "id": "bb9c43f9-10a2-4569-a8a8-957c3528b6d1",
3175 "vim:f9f370ac-0d44-41a7-9000-457f2332bc35": {"interfaces": []}
3178 vnf
= {"_id": "665b4165-ce24-4320-bf19-b9a45bade49f"}
3179 extra_dict
["params"] = {
3180 "vim_vm_id": "f37b18ef-3caa-4dc9-ab91-15c669b16396",
3181 "flavor_dict": "flavor_dict",
3183 task
= self
.ns
.verticalscale_task(
3184 vdu
, vnf
, vdu_index
, action_id
, nsr_id
, task_index
, extra_dict
3187 self
.assertDictEqual(task
, expected_result
)
3189 @patch("osm_ng_ro.ns.Ns._assign_vim")
3190 def test_migrate_task(self
, assign_vim
):
3194 action_id
= "bb937f49-3870-4169-b758-9732e1ff40f3"
3195 nsr_id
= "993166fe-723e-4680-ac4b-b1af2541ae31"
3197 target_record_id
= (
3198 "vnfrs:665b4165-ce24-4320-bf19-b9a45bade49f:"
3199 "vdur.bb9c43f9-10a2-4569-a8a8-957c3528b6d1"
3203 "target_id": "vim:f9f370ac-0d44-41a7-9000-457f2332bc35",
3204 "action_id": "bb937f49-3870-4169-b758-9732e1ff40f3",
3205 "nsr_id": "993166fe-723e-4680-ac4b-b1af2541ae31",
3206 "task_id": "bb937f49-3870-4169-b758-9732e1ff40f3:1",
3207 "status": "SCHEDULED",
3210 "target_record": "vnfrs:665b4165-ce24-4320-bf19-b9a45bade49f:vdur.1",
3211 "target_record_id": target_record_id
,
3213 "vim_vm_id": "f37b18ef-3caa-4dc9-ab91-15c669b16396",
3214 "migrate_host": "migrateToHost",
3218 "id": "bb9c43f9-10a2-4569-a8a8-957c3528b6d1",
3220 "vim:f9f370ac-0d44-41a7-9000-457f2332bc35": {"interfaces": []}
3223 vnf
= {"_id": "665b4165-ce24-4320-bf19-b9a45bade49f"}
3224 extra_dict
["params"] = {
3225 "vim_vm_id": "f37b18ef-3caa-4dc9-ab91-15c669b16396",
3226 "migrate_host": "migrateToHost",
3228 task
= self
.ns
.migrate_task(
3229 vdu
, vnf
, vdu_index
, action_id
, nsr_id
, task_index
, extra_dict
3232 self
.assertDictEqual(task
, expected_result
)
3235 class TestProcessVduParams(unittest
.TestCase
):
3238 self
.logger
= CopyingMock(autospec
=True)
3240 @patch("osm_ng_ro.ns.Ns.is_volume_keeping_required")
3241 def test_find_persistent_root_volumes_empty_instantiation_vol_list(
3242 self
, mock_volume_keeping_required
3244 """Find persistent root volume, instantiation_vol_list is empty."""
3245 vnfd
= deepcopy(vnfd_wth_persistent_storage
)
3246 target_vdu
= target_vdu_wth_persistent_storage
3247 vdu_instantiation_volumes_list
= []
3249 mock_volume_keeping_required
.return_value
= True
3250 expected_root_disk
= {
3251 "id": "persistent-root-volume",
3252 "type-of-storage": "persistent-storage:persistent-storage",
3253 "size-of-storage": "10",
3254 "vdu-storage-requirements": [{"key": "keep-volume", "value": "true"}],
3256 expected_persist_root_disk
= {
3257 "persistent-root-volume": {
3258 "image_id": "ubuntu20.04",
3263 expected_disk_list
= [
3265 "image_id": "ubuntu20.04",
3270 persist_root_disk
= self
.ns
.find_persistent_root_volumes(
3271 vnfd
, target_vdu
, vdu_instantiation_volumes_list
, disk_list
3273 self
.assertEqual(persist_root_disk
, expected_persist_root_disk
)
3274 mock_volume_keeping_required
.assert_called_once_with(expected_root_disk
)
3275 self
.assertEqual(disk_list
, expected_disk_list
)
3276 self
.assertEqual(len(disk_list
), 1)
3278 @patch("osm_ng_ro.ns.Ns.is_volume_keeping_required")
3279 def test_find_persistent_root_volumes_always_selects_first_vsd_as_root(
3280 self
, mock_volume_keeping_required
3282 """Find persistent root volume, always selects the first vsd as root volume."""
3283 vnfd
= deepcopy(vnfd_wth_persistent_storage
)
3284 vnfd
["vdu"][0]["virtual-storage-desc"] = [
3285 "persistent-volume2",
3286 "persistent-root-volume",
3289 target_vdu
= target_vdu_wth_persistent_storage
3290 vdu_instantiation_volumes_list
= []
3292 mock_volume_keeping_required
.return_value
= True
3293 expected_root_disk
= {
3294 "id": "persistent-volume2",
3295 "type-of-storage": "persistent-storage:persistent-storage",
3296 "size-of-storage": "10",
3298 expected_persist_root_disk
= {
3299 "persistent-volume2": {
3300 "image_id": "ubuntu20.04",
3305 expected_disk_list
= [
3307 "image_id": "ubuntu20.04",
3312 persist_root_disk
= self
.ns
.find_persistent_root_volumes(
3313 vnfd
, target_vdu
, vdu_instantiation_volumes_list
, disk_list
3315 self
.assertEqual(persist_root_disk
, expected_persist_root_disk
)
3316 mock_volume_keeping_required
.assert_called_once_with(expected_root_disk
)
3317 self
.assertEqual(disk_list
, expected_disk_list
)
3318 self
.assertEqual(len(disk_list
), 1)
3320 @patch("osm_ng_ro.ns.Ns.is_volume_keeping_required")
3321 def test_find_persistent_root_volumes_empty_size_of_storage(
3322 self
, mock_volume_keeping_required
3324 """Find persistent root volume, size of storage is empty."""
3325 vnfd
= deepcopy(vnfd_wth_persistent_storage
)
3326 vnfd
["virtual-storage-desc"][0]["size-of-storage"] = ""
3327 vnfd
["vdu"][0]["virtual-storage-desc"] = [
3328 "persistent-volume2",
3329 "persistent-root-volume",
3332 target_vdu
= target_vdu_wth_persistent_storage
3333 vdu_instantiation_volumes_list
= []
3335 persist_root_disk
= self
.ns
.find_persistent_root_volumes(
3336 vnfd
, target_vdu
, vdu_instantiation_volumes_list
, disk_list
3338 self
.assertEqual(persist_root_disk
, None)
3339 mock_volume_keeping_required
.assert_not_called()
3340 self
.assertEqual(disk_list
, [])
3342 @patch("osm_ng_ro.ns.Ns.is_volume_keeping_required")
3343 def test_find_persistent_root_volumes_keeping_is_not_required(
3344 self
, mock_volume_keeping_required
3346 """Find persistent root volume, volume keeping is not required."""
3347 vnfd
= deepcopy(vnfd_wth_persistent_storage
)
3348 vnfd
["virtual-storage-desc"][1]["vdu-storage-requirements"] = [
3349 {"key": "keep-volume", "value": "false"},
3351 target_vdu
= target_vdu_wth_persistent_storage
3352 vdu_instantiation_volumes_list
= []
3354 mock_volume_keeping_required
.return_value
= False
3355 expected_root_disk
= {
3356 "id": "persistent-root-volume",
3357 "type-of-storage": "persistent-storage:persistent-storage",
3358 "size-of-storage": "10",
3359 "vdu-storage-requirements": [{"key": "keep-volume", "value": "false"}],
3361 expected_persist_root_disk
= {
3362 "persistent-root-volume": {
3363 "image_id": "ubuntu20.04",
3368 expected_disk_list
= [
3370 "image_id": "ubuntu20.04",
3375 persist_root_disk
= self
.ns
.find_persistent_root_volumes(
3376 vnfd
, target_vdu
, vdu_instantiation_volumes_list
, disk_list
3378 self
.assertEqual(persist_root_disk
, expected_persist_root_disk
)
3379 mock_volume_keeping_required
.assert_called_once_with(expected_root_disk
)
3380 self
.assertEqual(disk_list
, expected_disk_list
)
3381 self
.assertEqual(len(disk_list
), 1)
3383 @patch("osm_ng_ro.ns.Ns.is_volume_keeping_required")
3384 def test_find_persistent_root_volumes_target_vdu_mismatch(
3385 self
, mock_volume_keeping_required
3387 """Find persistent root volume, target vdu name is not matching."""
3388 vnfd
= deepcopy(vnfd_wth_persistent_storage
)
3389 vnfd
["vdu"][0]["name"] = "Several_Volumes-VM"
3390 target_vdu
= target_vdu_wth_persistent_storage
3391 vdu_instantiation_volumes_list
= []
3393 result
= self
.ns
.find_persistent_root_volumes(
3394 vnfd
, target_vdu
, vdu_instantiation_volumes_list
, disk_list
3396 self
.assertEqual(result
, None)
3397 mock_volume_keeping_required
.assert_not_called()
3398 self
.assertEqual(disk_list
, [])
3399 self
.assertEqual(len(disk_list
), 0)
3401 @patch("osm_ng_ro.ns.Ns.is_volume_keeping_required")
3402 def test_find_persistent_root_volumes_with_instantiation_vol_list(
3403 self
, mock_volume_keeping_required
3405 """Find persistent root volume, existing volume needs to be used."""
3406 vnfd
= deepcopy(vnfd_wth_persistent_storage
)
3407 target_vdu
= target_vdu_wth_persistent_storage
3408 vdu_instantiation_volumes_list
= [
3410 "vim-volume-id": vim_volume_id
,
3411 "name": "persistent-root-volume",
3415 expected_persist_root_disk
= {
3416 "persistent-root-volume": {
3417 "vim_volume_id": vim_volume_id
,
3418 "image_id": "ubuntu20.04",
3421 expected_disk_list
= [
3423 "vim_volume_id": vim_volume_id
,
3424 "image_id": "ubuntu20.04",
3427 persist_root_disk
= self
.ns
.find_persistent_root_volumes(
3428 vnfd
, target_vdu
, vdu_instantiation_volumes_list
, disk_list
3430 self
.assertEqual(persist_root_disk
, expected_persist_root_disk
)
3431 mock_volume_keeping_required
.assert_not_called()
3432 self
.assertEqual(disk_list
, expected_disk_list
)
3433 self
.assertEqual(len(disk_list
), 1)
3435 @patch("osm_ng_ro.ns.Ns.is_volume_keeping_required")
3436 def test_find_persistent_root_volumes_invalid_instantiation_params(
3437 self
, mock_volume_keeping_required
3439 """Find persistent root volume, existing volume id keyword is invalid."""
3440 vnfd
= deepcopy(vnfd_wth_persistent_storage
)
3441 target_vdu
= target_vdu_wth_persistent_storage
3442 vdu_instantiation_volumes_list
= [
3444 "volume-id": vim_volume_id
,
3445 "name": "persistent-root-volume",
3449 with self
.assertRaises(KeyError):
3450 self
.ns
.find_persistent_root_volumes(
3451 vnfd
, target_vdu
, vdu_instantiation_volumes_list
, disk_list
3453 mock_volume_keeping_required
.assert_not_called()
3454 self
.assertEqual(disk_list
, [])
3455 self
.assertEqual(len(disk_list
), 0)
3457 @patch("osm_ng_ro.ns.Ns.is_volume_keeping_required")
3458 def test_find_persistent_volumes_vdu_wth_persistent_root_disk_wthout_inst_vol_list(
3459 self
, mock_volume_keeping_required
3461 """Find persistent ordinary volume, there is persistent root disk and instatiation volume list is empty."""
3462 persistent_root_disk
= {
3463 "persistent-root-volume": {
3464 "image_id": "ubuntu20.04",
3469 mock_volume_keeping_required
.return_value
= False
3470 target_vdu
= target_vdu_wth_persistent_storage
3471 vdu_instantiation_volumes_list
= []
3474 "image_id": "ubuntu20.04",
3480 "id": "persistent-volume2",
3481 "size-of-storage": "10",
3482 "type-of-storage": "persistent-storage:persistent-storage",
3484 expected_disk_list
= [
3486 "image_id": "ubuntu20.04",
3495 self
.ns
.find_persistent_volumes(
3496 persistent_root_disk
, target_vdu
, vdu_instantiation_volumes_list
, disk_list
3498 self
.assertEqual(disk_list
, expected_disk_list
)
3499 mock_volume_keeping_required
.assert_called_once_with(expected_disk
)
3501 @patch("osm_ng_ro.ns.Ns.is_volume_keeping_required")
3502 def test_find_persistent_volumes_vdu_wth_inst_vol_list(
3503 self
, mock_volume_keeping_required
3505 """Find persistent ordinary volume, vim-volume-id is given as instantiation parameter."""
3506 persistent_root_disk
= {
3507 "persistent-root-volume": {
3508 "image_id": "ubuntu20.04",
3513 vdu_instantiation_volumes_list
= [
3515 "vim-volume-id": vim_volume_id
,
3516 "name": "persistent-volume2",
3519 target_vdu
= target_vdu_wth_persistent_storage
3522 "image_id": "ubuntu20.04",
3527 expected_disk_list
= [
3529 "image_id": "ubuntu20.04",
3534 "vim_volume_id": vim_volume_id
,
3537 self
.ns
.find_persistent_volumes(
3538 persistent_root_disk
, target_vdu
, vdu_instantiation_volumes_list
, disk_list
3540 self
.assertEqual(disk_list
, expected_disk_list
)
3541 mock_volume_keeping_required
.assert_not_called()
3543 @patch("osm_ng_ro.ns.Ns.is_volume_keeping_required")
3544 def test_find_persistent_volumes_vdu_wthout_persistent_storage(
3545 self
, mock_volume_keeping_required
3547 """Find persistent ordinary volume, there is not any persistent disk."""
3548 persistent_root_disk
= {}
3549 vdu_instantiation_volumes_list
= []
3550 mock_volume_keeping_required
.return_value
= False
3551 target_vdu
= target_vdu_wthout_persistent_storage
3553 self
.ns
.find_persistent_volumes(
3554 persistent_root_disk
, target_vdu
, vdu_instantiation_volumes_list
, disk_list
3556 self
.assertEqual(disk_list
, disk_list
)
3557 mock_volume_keeping_required
.assert_not_called()
3559 @patch("osm_ng_ro.ns.Ns.is_volume_keeping_required")
3560 def test_find_persistent_volumes_vdu_wth_persistent_root_disk_wthout_ordinary_disk(
3561 self
, mock_volume_keeping_required
3563 """There is persistent root disk, but there is not ordinary persistent disk."""
3564 persistent_root_disk
= {
3565 "persistent-root-volume": {
3566 "image_id": "ubuntu20.04",
3571 vdu_instantiation_volumes_list
= []
3572 mock_volume_keeping_required
.return_value
= False
3573 target_vdu
= deepcopy(target_vdu_wth_persistent_storage
)
3574 target_vdu
["virtual-storages"] = [
3576 "id": "persistent-root-volume",
3577 "size-of-storage": "10",
3578 "type-of-storage": "persistent-storage:persistent-storage",
3579 "vdu-storage-requirements": [
3580 {"key": "keep-volume", "value": "true"},
3584 "id": "ephemeral-volume",
3585 "size-of-storage": "1",
3586 "type-of-storage": "etsi-nfv-descriptors:ephemeral-storage",
3591 "image_id": "ubuntu20.04",
3596 self
.ns
.find_persistent_volumes(
3597 persistent_root_disk
, target_vdu
, vdu_instantiation_volumes_list
, disk_list
3599 self
.assertEqual(disk_list
, disk_list
)
3600 mock_volume_keeping_required
.assert_not_called()
3602 @patch("osm_ng_ro.ns.Ns.is_volume_keeping_required")
3603 def test_find_persistent_volumes_wth_inst_vol_list_disk_id_mismatch(
3604 self
, mock_volume_keeping_required
3606 """Find persistent ordinary volume, volume id is not persistent_root_disk dict,
3607 vim-volume-id is given as instantiation parameter but disk id is not matching.
3609 mock_volume_keeping_required
.return_value
= True
3610 vdu_instantiation_volumes_list
= [
3612 "vim-volume-id": vim_volume_id
,
3613 "name": "persistent-volume3",
3616 persistent_root_disk
= {
3617 "persistent-root-volume": {
3618 "image_id": "ubuntu20.04",
3625 "image_id": "ubuntu20.04",
3630 expected_disk_list
= [
3632 "image_id": "ubuntu20.04",
3642 "id": "persistent-volume2",
3643 "size-of-storage": "10",
3644 "type-of-storage": "persistent-storage:persistent-storage",
3646 target_vdu
= target_vdu_wth_persistent_storage
3647 self
.ns
.find_persistent_volumes(
3648 persistent_root_disk
, target_vdu
, vdu_instantiation_volumes_list
, disk_list
3650 self
.assertEqual(disk_list
, expected_disk_list
)
3651 mock_volume_keeping_required
.assert_called_once_with(expected_disk
)
3653 def test_is_volume_keeping_required_true(self
):
3654 """Volume keeping is required."""
3655 virtual_storage_descriptor
= {
3656 "id": "persistent-root-volume",
3657 "type-of-storage": "persistent-storage:persistent-storage",
3658 "size-of-storage": "10",
3659 "vdu-storage-requirements": [
3660 {"key": "keep-volume", "value": "true"},
3663 result
= self
.ns
.is_volume_keeping_required(virtual_storage_descriptor
)
3664 self
.assertEqual(result
, True)
3666 def test_is_volume_keeping_required_false(self
):
3667 """Volume keeping is not required."""
3668 virtual_storage_descriptor
= {
3669 "id": "persistent-root-volume",
3670 "type-of-storage": "persistent-storage:persistent-storage",
3671 "size-of-storage": "10",
3672 "vdu-storage-requirements": [
3673 {"key": "keep-volume", "value": "false"},
3676 result
= self
.ns
.is_volume_keeping_required(virtual_storage_descriptor
)
3677 self
.assertEqual(result
, False)
3679 def test_is_volume_keeping_required_wthout_vdu_storage_reqirement(self
):
3680 """Volume keeping is not required, vdu-storage-requirements key does not exist."""
3681 virtual_storage_descriptor
= {
3682 "id": "persistent-root-volume",
3683 "type-of-storage": "persistent-storage:persistent-storage",
3684 "size-of-storage": "10",
3686 result
= self
.ns
.is_volume_keeping_required(virtual_storage_descriptor
)
3687 self
.assertEqual(result
, False)
3689 def test_is_volume_keeping_required_wrong_keyword(self
):
3690 """vdu-storage-requirements key to indicate keeping-volume is wrong."""
3691 virtual_storage_descriptor
= {
3692 "id": "persistent-root-volume",
3693 "type-of-storage": "persistent-storage:persistent-storage",
3694 "size-of-storage": "10",
3695 "vdu-storage-requirements": [
3696 {"key": "hold-volume", "value": "true"},
3699 result
= self
.ns
.is_volume_keeping_required(virtual_storage_descriptor
)
3700 self
.assertEqual(result
, False)
3702 def test_sort_vdu_interfaces_position_all_wth_positions(self
):
3703 """Interfaces are sorted according to position, all have positions."""
3704 target_vdu
= deepcopy(target_vdu_wth_persistent_storage
)
3705 target_vdu
["interfaces"] = [
3708 "ns-vld-id": "datanet",
3713 "ns-vld-id": "mgmtnet",
3717 sorted_interfaces
= [
3720 "ns-vld-id": "mgmtnet",
3725 "ns-vld-id": "datanet",
3729 self
.ns
._sort
_vdu
_interfaces
(target_vdu
)
3730 self
.assertEqual(target_vdu
["interfaces"], sorted_interfaces
)
3732 def test_sort_vdu_interfaces_position_some_wth_position(self
):
3733 """Interfaces are sorted according to position, some of them have positions."""
3734 target_vdu
= deepcopy(target_vdu_wth_persistent_storage
)
3735 target_vdu
["interfaces"] = [
3738 "ns-vld-id": "mgmtnet",
3742 "ns-vld-id": "datanet",
3746 sorted_interfaces
= [
3749 "ns-vld-id": "datanet",
3754 "ns-vld-id": "mgmtnet",
3757 self
.ns
._sort
_vdu
_interfaces
(target_vdu
)
3758 self
.assertEqual(target_vdu
["interfaces"], sorted_interfaces
)
3760 def test_sort_vdu_interfaces_position_empty_interface_list(self
):
3761 """Interface list is empty."""
3762 target_vdu
= deepcopy(target_vdu_wth_persistent_storage
)
3763 target_vdu
["interfaces"] = []
3764 sorted_interfaces
= []
3765 self
.ns
._sort
_vdu
_interfaces
(target_vdu
)
3766 self
.assertEqual(target_vdu
["interfaces"], sorted_interfaces
)
3768 def test_partially_locate_vdu_interfaces(self
):
3769 """Some interfaces have positions."""
3770 target_vdu
= deepcopy(target_vdu_wth_persistent_storage
)
3771 target_vdu
["interfaces"] = [
3774 "ns-vld-id": "net1",
3776 {"name": "vdu-eth2", "ns-vld-id": "net2", "position": 3},
3779 "ns-vld-id": "mgmtnet",
3783 "ns-vld-id": "datanet",
3787 self
.ns
._partially
_locate
_vdu
_interfaces
(target_vdu
)
3788 self
.assertDictEqual(
3789 target_vdu
["interfaces"][0],
3792 "ns-vld-id": "datanet",
3796 self
.assertDictEqual(
3797 target_vdu
["interfaces"][2],
3798 {"name": "vdu-eth2", "ns-vld-id": "net2", "position": 3},
3801 def test_partially_locate_vdu_interfaces_position_start_from_0(self
):
3802 """Some interfaces have positions, position start from 0."""
3803 target_vdu
= deepcopy(target_vdu_wth_persistent_storage
)
3804 target_vdu
["interfaces"] = [
3807 "ns-vld-id": "net1",
3809 {"name": "vdu-eth2", "ns-vld-id": "net2", "position": 3},
3812 "ns-vld-id": "mgmtnet",
3816 "ns-vld-id": "datanet",
3820 self
.ns
._partially
_locate
_vdu
_interfaces
(target_vdu
)
3821 self
.assertDictEqual(
3822 target_vdu
["interfaces"][0],
3825 "ns-vld-id": "datanet",
3829 self
.assertDictEqual(
3830 target_vdu
["interfaces"][3],
3831 {"name": "vdu-eth2", "ns-vld-id": "net2", "position": 3},
3834 def test_partially_locate_vdu_interfaces_wthout_position(self
):
3835 """Interfaces do not have positions."""
3836 target_vdu
= deepcopy(target_vdu_wth_persistent_storage
)
3837 target_vdu
["interfaces"] = interfaces_wthout_positions
3838 expected_result
= deepcopy(target_vdu
["interfaces"])
3839 self
.ns
._partially
_locate
_vdu
_interfaces
(target_vdu
)
3840 self
.assertEqual(target_vdu
["interfaces"], expected_result
)
3842 def test_partially_locate_vdu_interfaces_all_has_position(self
):
3843 """All interfaces have position."""
3844 target_vdu
= deepcopy(target_vdu_wth_persistent_storage
)
3845 target_vdu
["interfaces"] = interfaces_wth_all_positions
3846 expected_interfaces
= [
3849 "ns-vld-id": "net2",
3854 "ns-vld-id": "mgmtnet",
3859 "ns-vld-id": "net1",
3863 self
.ns
._partially
_locate
_vdu
_interfaces
(target_vdu
)
3864 self
.assertEqual(target_vdu
["interfaces"], expected_interfaces
)
3866 @patch("osm_ng_ro.ns.Ns._get_cloud_init")
3867 @patch("osm_ng_ro.ns.Ns._parse_jinja2")
3868 def test_prepare_vdu_cloud_init(self
, mock_parse_jinja2
, mock_get_cloud_init
):
3869 """Target_vdu has cloud-init and boot-data-drive."""
3870 target_vdu
= deepcopy(target_vdu_wth_persistent_storage
)
3871 target_vdu
["cloud-init"] = "sample-cloud-init-path"
3872 target_vdu
["boot-data-drive"] = "vda"
3874 mock_get_cloud_init
.return_value
= cloud_init_content
3875 mock_parse_jinja2
.return_value
= user_data
3877 "user-data": user_data
,
3878 "boot-data-drive": "vda",
3880 result
= self
.ns
._prepare
_vdu
_cloud
_init
(target_vdu
, vdu2cloud_init
, db
, fs
)
3881 self
.assertDictEqual(result
, expected_result
)
3882 mock_get_cloud_init
.assert_called_once_with(
3883 db
=db
, fs
=fs
, location
="sample-cloud-init-path"
3885 mock_parse_jinja2
.assert_called_once_with(
3886 cloud_init_content
=cloud_init_content
,
3888 context
="sample-cloud-init-path",
3891 @patch("osm_ng_ro.ns.Ns._get_cloud_init")
3892 @patch("osm_ng_ro.ns.Ns._parse_jinja2")
3893 def test_prepare_vdu_cloud_init_get_cloud_init_raise_exception(
3894 self
, mock_parse_jinja2
, mock_get_cloud_init
3896 """Target_vdu has cloud-init and boot-data-drive, get_cloud_init method raises exception."""
3897 target_vdu
= deepcopy(target_vdu_wth_persistent_storage
)
3898 target_vdu
["cloud-init"] = "sample-cloud-init-path"
3899 target_vdu
["boot-data-drive"] = "vda"
3901 mock_get_cloud_init
.side_effect
= NsException(
3902 "Mismatch descriptor for cloud init."
3905 with self
.assertRaises(NsException
) as err
:
3906 self
.ns
._prepare
_vdu
_cloud
_init
(target_vdu
, vdu2cloud_init
, db
, fs
)
3907 self
.assertEqual(str(err
.exception
), "Mismatch descriptor for cloud init.")
3909 mock_get_cloud_init
.assert_called_once_with(
3910 db
=db
, fs
=fs
, location
="sample-cloud-init-path"
3912 mock_parse_jinja2
.assert_not_called()
3914 @patch("osm_ng_ro.ns.Ns._get_cloud_init")
3915 @patch("osm_ng_ro.ns.Ns._parse_jinja2")
3916 def test_prepare_vdu_cloud_init_parse_jinja2_raise_exception(
3917 self
, mock_parse_jinja2
, mock_get_cloud_init
3919 """Target_vdu has cloud-init and boot-data-drive, parse_jinja2 method raises exception."""
3920 target_vdu
= deepcopy(target_vdu_wth_persistent_storage
)
3921 target_vdu
["cloud-init"] = "sample-cloud-init-path"
3922 target_vdu
["boot-data-drive"] = "vda"
3924 mock_get_cloud_init
.return_value
= cloud_init_content
3925 mock_parse_jinja2
.side_effect
= NsException("Error parsing cloud-init content.")
3927 with self
.assertRaises(NsException
) as err
:
3928 self
.ns
._prepare
_vdu
_cloud
_init
(target_vdu
, vdu2cloud_init
, db
, fs
)
3929 self
.assertEqual(str(err
.exception
), "Error parsing cloud-init content.")
3930 mock_get_cloud_init
.assert_called_once_with(
3931 db
=db
, fs
=fs
, location
="sample-cloud-init-path"
3933 mock_parse_jinja2
.assert_called_once_with(
3934 cloud_init_content
=cloud_init_content
,
3936 context
="sample-cloud-init-path",
3939 @patch("osm_ng_ro.ns.Ns._get_cloud_init")
3940 @patch("osm_ng_ro.ns.Ns._parse_jinja2")
3941 def test_prepare_vdu_cloud_init_vdu_wthout_boot_data_drive(
3942 self
, mock_parse_jinja2
, mock_get_cloud_init
3944 """Target_vdu has cloud-init but do not have boot-data-drive."""
3945 target_vdu
= deepcopy(target_vdu_wth_persistent_storage
)
3946 target_vdu
["cloud-init"] = "sample-cloud-init-path"
3948 mock_get_cloud_init
.return_value
= cloud_init_content
3949 mock_parse_jinja2
.return_value
= user_data
3951 "user-data": user_data
,
3953 result
= self
.ns
._prepare
_vdu
_cloud
_init
(target_vdu
, vdu2cloud_init
, db
, fs
)
3954 self
.assertDictEqual(result
, expected_result
)
3955 mock_get_cloud_init
.assert_called_once_with(
3956 db
=db
, fs
=fs
, location
="sample-cloud-init-path"
3958 mock_parse_jinja2
.assert_called_once_with(
3959 cloud_init_content
=cloud_init_content
,
3961 context
="sample-cloud-init-path",
3964 @patch("osm_ng_ro.ns.Ns._get_cloud_init")
3965 @patch("osm_ng_ro.ns.Ns._parse_jinja2")
3966 def test_prepare_vdu_cloud_init_exists_in_vdu2cloud_init(
3967 self
, mock_parse_jinja2
, mock_get_cloud_init
3969 """Target_vdu has cloud-init, vdu2cloud_init dict has cloud-init_content."""
3970 target_vdu
= deepcopy(target_vdu_wth_persistent_storage
)
3971 target_vdu
["cloud-init"] = "sample-cloud-init-path"
3972 target_vdu
["boot-data-drive"] = "vda"
3973 vdu2cloud_init
= {"sample-cloud-init-path": cloud_init_content
}
3974 mock_parse_jinja2
.return_value
= user_data
3976 "user-data": user_data
,
3977 "boot-data-drive": "vda",
3979 result
= self
.ns
._prepare
_vdu
_cloud
_init
(target_vdu
, vdu2cloud_init
, db
, fs
)
3980 self
.assertDictEqual(result
, expected_result
)
3981 mock_get_cloud_init
.assert_not_called()
3982 mock_parse_jinja2
.assert_called_once_with(
3983 cloud_init_content
=cloud_init_content
,
3985 context
="sample-cloud-init-path",
3988 @patch("osm_ng_ro.ns.Ns._get_cloud_init")
3989 @patch("osm_ng_ro.ns.Ns._parse_jinja2")
3990 def test_prepare_vdu_cloud_init_no_cloud_init(
3991 self
, mock_parse_jinja2
, mock_get_cloud_init
3993 """Target_vdu do not have cloud-init."""
3994 target_vdu
= deepcopy(target_vdu_wth_persistent_storage
)
3995 target_vdu
["boot-data-drive"] = "vda"
3998 "boot-data-drive": "vda",
4000 result
= self
.ns
._prepare
_vdu
_cloud
_init
(target_vdu
, vdu2cloud_init
, db
, fs
)
4001 self
.assertDictEqual(result
, expected_result
)
4002 mock_get_cloud_init
.assert_not_called()
4003 mock_parse_jinja2
.assert_not_called()
4005 def test_check_vld_information_of_interfaces_ns_vld_vnf_vld_both_exist(self
):
4006 """ns_vld and vnf_vld both exist."""
4009 "ns-vld-id": "mgmtnet",
4010 "vnf-vld-id": "mgmt_cp_int",
4012 expected_result
= f
"{ns_preffix}:vld.mgmtnet"
4013 result
= self
.ns
._check
_vld
_information
_of
_interfaces
(
4014 interface
, ns_preffix
, vnf_preffix
4016 self
.assertEqual(result
, expected_result
)
4018 def test_check_vld_information_of_interfaces_empty_interfaces(self
):
4019 """Interface dict is empty."""
4021 result
= self
.ns
._check
_vld
_information
_of
_interfaces
(
4022 interface
, ns_preffix
, vnf_preffix
4024 self
.assertEqual(result
, "")
4026 def test_check_vld_information_of_interfaces_has_only_vnf_vld(self
):
4027 """Interface dict has only vnf_vld."""
4030 "vnf-vld-id": "mgmt_cp_int",
4032 expected_result
= f
"{vnf_preffix}:vld.mgmt_cp_int"
4033 result
= self
.ns
._check
_vld
_information
_of
_interfaces
(
4034 interface
, ns_preffix
, vnf_preffix
4036 self
.assertEqual(result
, expected_result
)
4038 def test_check_vld_information_of_interfaces_has_vnf_vld_wthout_vnf_prefix(
4041 """Interface dict has only vnf_vld but vnf_preffix does not exist."""
4044 "vnf-vld-id": "mgmt_cp_int",
4047 with self
.assertRaises(Exception) as err
:
4048 self
.ns
._check
_vld
_information
_of
_interfaces
(
4049 interface
, ns_preffix
, vnf_preffix
4051 self
.assertEqual(type(err
), TypeError)
4053 def test_prepare_interface_port_security_has_security_details(self
):
4054 """Interface dict has port security details."""
4057 "ns-vld-id": "mgmtnet",
4058 "vnf-vld-id": "mgmt_cp_int",
4059 "port-security-enabled": True,
4060 "port-security-disable-strategy": "allow-address-pairs",
4062 expected_interface
= {
4064 "ns-vld-id": "mgmtnet",
4065 "vnf-vld-id": "mgmt_cp_int",
4066 "port_security": True,
4067 "port_security_disable_strategy": "allow-address-pairs",
4069 self
.ns
._prepare
_interface
_port
_security
(interface
)
4070 self
.assertDictEqual(interface
, expected_interface
)
4072 def test_prepare_interface_port_security_empty_interfaces(self
):
4073 """Interface dict is empty."""
4075 expected_interface
= {}
4076 self
.ns
._prepare
_interface
_port
_security
(interface
)
4077 self
.assertDictEqual(interface
, expected_interface
)
4079 def test_prepare_interface_port_security_wthout_port_security(self
):
4080 """Interface dict does not have port security details."""
4083 "ns-vld-id": "mgmtnet",
4084 "vnf-vld-id": "mgmt_cp_int",
4086 expected_interface
= {
4088 "ns-vld-id": "mgmtnet",
4089 "vnf-vld-id": "mgmt_cp_int",
4091 self
.ns
._prepare
_interface
_port
_security
(interface
)
4092 self
.assertDictEqual(interface
, expected_interface
)
4094 def test_create_net_item_of_interface_floating_ip_port_security(self
):
4095 """Interface dict has floating ip, port-security details."""
4098 "vcpi": "sample_vcpi",
4099 "port_security": True,
4100 "port_security_disable_strategy": "allow-address-pairs",
4101 "floating_ip": "10.1.1.12",
4102 "ns-vld-id": "mgmtnet",
4103 "vnf-vld-id": "mgmt_cp_int",
4105 net_text
= f
"{ns_preffix}"
4106 expected_net_item
= {
4108 "port_security": True,
4109 "port_security_disable_strategy": "allow-address-pairs",
4110 "floating_ip": "10.1.1.12",
4111 "net_id": f
"TASK-{ns_preffix}",
4114 result
= self
.ns
._create
_net
_item
_of
_interface
(interface
, net_text
)
4115 self
.assertDictEqual(result
, expected_net_item
)
4117 def test_create_net_item_of_interface_invalid_net_text(self
):
4118 """net-text is invalid."""
4121 "vcpi": "sample_vcpi",
4122 "port_security": True,
4123 "port_security_disable_strategy": "allow-address-pairs",
4124 "floating_ip": "10.1.1.12",
4125 "ns-vld-id": "mgmtnet",
4126 "vnf-vld-id": "mgmt_cp_int",
4129 with self
.assertRaises(TypeError):
4130 self
.ns
._create
_net
_item
_of
_interface
(interface
, net_text
)
4132 def test_create_net_item_of_interface_empty_interface(self
):
4133 """Interface dict is empty."""
4135 net_text
= ns_preffix
4136 expected_net_item
= {
4137 "net_id": f
"TASK-{ns_preffix}",
4140 result
= self
.ns
._create
_net
_item
_of
_interface
(interface
, net_text
)
4141 self
.assertDictEqual(result
, expected_net_item
)
4143 @patch("osm_ng_ro.ns.deep_get")
4144 def test_prepare_type_of_interface_type_sriov(self
, mock_deep_get
):
4145 """Interface type is SR-IOV."""
4148 "vcpi": "sample_vcpi",
4149 "port_security": True,
4150 "port_security_disable_strategy": "allow-address-pairs",
4151 "floating_ip": "10.1.1.12",
4152 "ns-vld-id": "mgmtnet",
4153 "vnf-vld-id": "mgmt_cp_int",
4156 mock_deep_get
.return_value
= "SR-IOV"
4157 net_text
= ns_preffix
4159 expected_net_item
= {
4164 self
.ns
._prepare
_type
_of
_interface
(
4165 interface
, tasks_by_target_record_id
, net_text
, net_item
4167 self
.assertDictEqual(net_item
, expected_net_item
)
4170 tasks_by_target_record_id
[net_text
]["extra_dict"]["params"]["net_type"],
4172 mock_deep_get
.assert_called_once_with(
4173 tasks_by_target_record_id
, net_text
, "extra_dict", "params", "net_type"
4176 @patch("osm_ng_ro.ns.deep_get")
4177 def test_prepare_type_of_interface_type_pic_passthrough_deep_get_return_empty_dict(
4180 """Interface type is PCI-PASSTHROUGH, deep_get method return empty dict."""
4183 "vcpi": "sample_vcpi",
4184 "port_security": True,
4185 "port_security_disable_strategy": "allow-address-pairs",
4186 "floating_ip": "10.1.1.12",
4187 "ns-vld-id": "mgmtnet",
4188 "vnf-vld-id": "mgmt_cp_int",
4189 "type": "PCI-PASSTHROUGH",
4191 mock_deep_get
.return_value
= {}
4192 tasks_by_target_record_id
= {}
4193 net_text
= ns_preffix
4195 expected_net_item
= {
4197 "model": "PCI-PASSTHROUGH",
4198 "type": "PCI-PASSTHROUGH",
4200 self
.ns
._prepare
_type
_of
_interface
(
4201 interface
, tasks_by_target_record_id
, net_text
, net_item
4203 self
.assertDictEqual(net_item
, expected_net_item
)
4204 mock_deep_get
.assert_called_once_with(
4205 tasks_by_target_record_id
, net_text
, "extra_dict", "params", "net_type"
4208 @patch("osm_ng_ro.ns.deep_get")
4209 def test_prepare_type_of_interface_type_mgmt(self
, mock_deep_get
):
4210 """Interface type is mgmt."""
4213 "vcpi": "sample_vcpi",
4214 "port_security": True,
4215 "port_security_disable_strategy": "allow-address-pairs",
4216 "floating_ip": "10.1.1.12",
4217 "ns-vld-id": "mgmtnet",
4218 "vnf-vld-id": "mgmt_cp_int",
4221 tasks_by_target_record_id
= {}
4222 net_text
= ns_preffix
4224 expected_net_item
= {
4227 self
.ns
._prepare
_type
_of
_interface
(
4228 interface
, tasks_by_target_record_id
, net_text
, net_item
4230 self
.assertDictEqual(net_item
, expected_net_item
)
4231 mock_deep_get
.assert_not_called()
4233 @patch("osm_ng_ro.ns.deep_get")
4234 def test_prepare_type_of_interface_type_bridge(self
, mock_deep_get
):
4235 """Interface type is bridge."""
4238 "vcpi": "sample_vcpi",
4239 "port_security": True,
4240 "port_security_disable_strategy": "allow-address-pairs",
4241 "floating_ip": "10.1.1.12",
4242 "ns-vld-id": "mgmtnet",
4243 "vnf-vld-id": "mgmt_cp_int",
4245 tasks_by_target_record_id
= {}
4246 net_text
= ns_preffix
4248 expected_net_item
= {
4252 self
.ns
._prepare
_type
_of
_interface
(
4253 interface
, tasks_by_target_record_id
, net_text
, net_item
4255 self
.assertDictEqual(net_item
, expected_net_item
)
4256 mock_deep_get
.assert_not_called()
4258 @patch("osm_ng_ro.ns.Ns._check_vld_information_of_interfaces")
4259 @patch("osm_ng_ro.ns.Ns._prepare_interface_port_security")
4260 @patch("osm_ng_ro.ns.Ns._create_net_item_of_interface")
4261 @patch("osm_ng_ro.ns.Ns._prepare_type_of_interface")
4262 def test_prepare_vdu_interfaces(
4264 mock_type_of_interface
,
4265 mock_item_of_interface
,
4267 mock_vld_information_of_interface
,
4269 """Prepare vdu interfaces successfully."""
4270 target_vdu
= deepcopy(target_vdu_wth_persistent_storage
)
4273 "ns-vld-id": "net1",
4274 "ip-address": "13.2.12.31",
4275 "mgmt-interface": True,
4279 "vnf-vld-id": "net2",
4280 "mac-address": "d0:94:66:ed:fc:e2",
4284 "ns-vld-id": "mgmtnet",
4286 target_vdu
["interfaces"] = [interface_1
, interface_2
, interface_3
]
4288 "params": "test_params",
4289 "find_params": "test_find_params",
4293 net_text_1
= f
"{ns_preffix}:net1"
4294 net_text_2
= f
"{vnf_preffix}:net2"
4295 net_text_3
= f
"{ns_preffix}:mgmtnet"
4298 "net_id": f
"TASK-{ns_preffix}",
4303 "net_id": f
"TASK-{ns_preffix}",
4308 "net_id": f
"TASK-{ns_preffix}",
4311 mock_item_of_interface
.side_effect
= [net_item_1
, net_item_2
, net_item_3
]
4312 mock_vld_information_of_interface
.side_effect
= [
4318 expected_extra_dict
= {
4319 "params": "test_params",
4320 "find_params": "test_find_params",
4321 "depends_on": [net_text_1
, net_text_2
, net_text_3
],
4322 "mgmt_vdu_interface": 0,
4324 updated_net_item1
= deepcopy(net_item_1
)
4325 updated_net_item1
.update({"ip_address": "13.2.12.31"})
4326 updated_net_item2
= deepcopy(net_item_2
)
4327 updated_net_item2
.update({"mac_address": "d0:94:66:ed:fc:e2"})
4328 expected_net_list
= [updated_net_item1
, updated_net_item2
, net_item_3
]
4329 self
.ns
._prepare
_vdu
_interfaces
(
4335 tasks_by_target_record_id
,
4338 _call_mock_vld_information_of_interface
= (
4339 mock_vld_information_of_interface
.call_args_list
4342 _call_mock_vld_information_of_interface
[0][0],
4343 (interface_1
, ns_preffix
, vnf_preffix
),
4346 _call_mock_vld_information_of_interface
[1][0],
4347 (interface_2
, ns_preffix
, vnf_preffix
),
4350 _call_mock_vld_information_of_interface
[2][0],
4351 (interface_3
, ns_preffix
, vnf_preffix
),
4354 _call_mock_port_security
= mock_port_security
.call_args_list
4355 self
.assertEqual(_call_mock_port_security
[0].args
[0], interface_1
)
4356 self
.assertEqual(_call_mock_port_security
[1].args
[0], interface_2
)
4357 self
.assertEqual(_call_mock_port_security
[2].args
[0], interface_3
)
4359 _call_mock_item_of_interface
= mock_item_of_interface
.call_args_list
4360 self
.assertEqual(_call_mock_item_of_interface
[0][0], (interface_1
, net_text_1
))
4361 self
.assertEqual(_call_mock_item_of_interface
[1][0], (interface_2
, net_text_2
))
4362 self
.assertEqual(_call_mock_item_of_interface
[2][0], (interface_3
, net_text_3
))
4364 _call_mock_type_of_interface
= mock_type_of_interface
.call_args_list
4366 _call_mock_type_of_interface
[0][0],
4367 (interface_1
, tasks_by_target_record_id
, net_text_1
, net_item_1
),
4370 _call_mock_type_of_interface
[1][0],
4371 (interface_2
, tasks_by_target_record_id
, net_text_2
, net_item_2
),
4374 _call_mock_type_of_interface
[2][0],
4375 (interface_3
, tasks_by_target_record_id
, net_text_3
, net_item_3
),
4377 self
.assertEqual(net_list
, expected_net_list
)
4378 self
.assertEqual(extra_dict
, expected_extra_dict
)
4379 self
.logger
.error
.assert_not_called()
4381 @patch("osm_ng_ro.ns.Ns._check_vld_information_of_interfaces")
4382 @patch("osm_ng_ro.ns.Ns._prepare_interface_port_security")
4383 @patch("osm_ng_ro.ns.Ns._create_net_item_of_interface")
4384 @patch("osm_ng_ro.ns.Ns._prepare_type_of_interface")
4385 def test_prepare_vdu_interfaces_create_net_item_raise_exception(
4387 mock_type_of_interface
,
4388 mock_item_of_interface
,
4390 mock_vld_information_of_interface
,
4392 """Prepare vdu interfaces, create_net_item_of_interface method raise exception."""
4393 target_vdu
= deepcopy(target_vdu_wth_persistent_storage
)
4396 "ns-vld-id": "net1",
4397 "ip-address": "13.2.12.31",
4398 "mgmt-interface": True,
4402 "vnf-vld-id": "net2",
4403 "mac-address": "d0:94:66:ed:fc:e2",
4407 "ns-vld-id": "mgmtnet",
4409 target_vdu
["interfaces"] = [interface_1
, interface_2
, interface_3
]
4411 "params": "test_params",
4412 "find_params": "test_find_params",
4415 net_text_1
= f
"{ns_preffix}:net1"
4416 mock_item_of_interface
.side_effect
= [TypeError, TypeError, TypeError]
4418 mock_vld_information_of_interface
.side_effect
= [net_text_1
]
4420 expected_extra_dict
= {
4421 "params": "test_params",
4422 "find_params": "test_find_params",
4423 "depends_on": [net_text_1
],
4425 with self
.assertRaises(TypeError):
4426 self
.ns
._prepare
_vdu
_interfaces
(
4432 tasks_by_target_record_id
,
4436 _call_mock_vld_information_of_interface
= (
4437 mock_vld_information_of_interface
.call_args_list
4440 _call_mock_vld_information_of_interface
[0][0],
4441 (interface_1
, ns_preffix
, vnf_preffix
),
4444 _call_mock_port_security
= mock_port_security
.call_args_list
4445 self
.assertEqual(_call_mock_port_security
[0].args
[0], interface_1
)
4447 _call_mock_item_of_interface
= mock_item_of_interface
.call_args_list
4448 self
.assertEqual(_call_mock_item_of_interface
[0][0], (interface_1
, net_text_1
))
4450 mock_type_of_interface
.assert_not_called()
4451 self
.logger
.error
.assert_not_called()
4452 self
.assertEqual(net_list
, [])
4453 self
.assertEqual(extra_dict
, expected_extra_dict
)
4455 @patch("osm_ng_ro.ns.Ns._check_vld_information_of_interfaces")
4456 @patch("osm_ng_ro.ns.Ns._prepare_interface_port_security")
4457 @patch("osm_ng_ro.ns.Ns._create_net_item_of_interface")
4458 @patch("osm_ng_ro.ns.Ns._prepare_type_of_interface")
4459 def test_prepare_vdu_interfaces_vld_information_is_empty(
4461 mock_type_of_interface
,
4462 mock_item_of_interface
,
4464 mock_vld_information_of_interface
,
4466 """Prepare vdu interfaces, check_vld_information_of_interface method returns empty result."""
4467 target_vdu
= deepcopy(target_vdu_wth_persistent_storage
)
4470 "ns-vld-id": "net1",
4471 "ip-address": "13.2.12.31",
4472 "mgmt-interface": True,
4476 "vnf-vld-id": "net2",
4477 "mac-address": "d0:94:66:ed:fc:e2",
4481 "ns-vld-id": "mgmtnet",
4483 target_vdu
["interfaces"] = [interface_1
, interface_2
, interface_3
]
4485 "params": "test_params",
4486 "find_params": "test_find_params",
4489 mock_vld_information_of_interface
.side_effect
= ["", "", ""]
4491 self
.ns
._prepare
_vdu
_interfaces
(
4497 tasks_by_target_record_id
,
4501 _call_mock_vld_information_of_interface
= (
4502 mock_vld_information_of_interface
.call_args_list
4505 _call_mock_vld_information_of_interface
[0][0],
4506 (interface_1
, ns_preffix
, vnf_preffix
),
4509 _call_mock_vld_information_of_interface
[1][0],
4510 (interface_2
, ns_preffix
, vnf_preffix
),
4513 _call_mock_vld_information_of_interface
[2][0],
4514 (interface_3
, ns_preffix
, vnf_preffix
),
4517 _call_logger
= self
.logger
.error
.call_args_list
4520 ("Interface 0 from vdu several_volumes-VM not connected to any vld",),
4524 ("Interface 1 from vdu several_volumes-VM not connected to any vld",),
4528 ("Interface 2 from vdu several_volumes-VM not connected to any vld",),
4530 self
.assertEqual(net_list
, [])
4534 "params": "test_params",
4535 "find_params": "test_find_params",
4540 mock_item_of_interface
.assert_not_called()
4541 mock_port_security
.assert_not_called()
4542 mock_type_of_interface
.assert_not_called()
4544 @patch("osm_ng_ro.ns.Ns._check_vld_information_of_interfaces")
4545 @patch("osm_ng_ro.ns.Ns._prepare_interface_port_security")
4546 @patch("osm_ng_ro.ns.Ns._create_net_item_of_interface")
4547 @patch("osm_ng_ro.ns.Ns._prepare_type_of_interface")
4548 def test_prepare_vdu_interfaces_empty_interface_list(
4550 mock_type_of_interface
,
4551 mock_item_of_interface
,
4553 mock_vld_information_of_interface
,
4555 """Prepare vdu interfaces, interface list is empty."""
4556 target_vdu
= deepcopy(target_vdu_wth_persistent_storage
)
4557 target_vdu
["interfaces"] = []
4560 self
.ns
._prepare
_vdu
_interfaces
(
4566 tasks_by_target_record_id
,
4569 mock_type_of_interface
.assert_not_called()
4570 mock_vld_information_of_interface
.assert_not_called()
4571 mock_item_of_interface
.assert_not_called()
4572 mock_port_security
.assert_not_called()
4574 def test_prepare_vdu_ssh_keys(self
):
4575 """Target_vdu has ssh-keys and ro_nsr_public_key exists."""
4576 target_vdu
= deepcopy(target_vdu_wth_persistent_storage
)
4577 target_vdu
["ssh-keys"] = ["sample-ssh-key"]
4578 ro_nsr_public_key
= {"public_key": "path_of_public_key"}
4579 target_vdu
["ssh-access-required"] = True
4581 expected_cloud_config
= {
4582 "key-pairs": ["sample-ssh-key", {"public_key": "path_of_public_key"}]
4584 self
.ns
._prepare
_vdu
_ssh
_keys
(target_vdu
, ro_nsr_public_key
, cloud_config
)
4585 self
.assertDictEqual(cloud_config
, expected_cloud_config
)
4587 def test_prepare_vdu_ssh_keys_target_vdu_wthout_ssh_keys(self
):
4588 """Target_vdu does not have ssh-keys."""
4589 target_vdu
= deepcopy(target_vdu_wth_persistent_storage
)
4590 ro_nsr_public_key
= {"public_key": "path_of_public_key"}
4591 target_vdu
["ssh-access-required"] = True
4593 expected_cloud_config
= {"key-pairs": [{"public_key": "path_of_public_key"}]}
4594 self
.ns
._prepare
_vdu
_ssh
_keys
(target_vdu
, ro_nsr_public_key
, cloud_config
)
4595 self
.assertDictEqual(cloud_config
, expected_cloud_config
)
4597 def test_prepare_vdu_ssh_keys_ssh_access_is_not_required(self
):
4598 """Target_vdu has ssh-keys, ssh-access is not required."""
4599 target_vdu
= deepcopy(target_vdu_wth_persistent_storage
)
4600 target_vdu
["ssh-keys"] = ["sample-ssh-key"]
4601 ro_nsr_public_key
= {"public_key": "path_of_public_key"}
4602 target_vdu
["ssh-access-required"] = False
4604 expected_cloud_config
= {"key-pairs": ["sample-ssh-key"]}
4605 self
.ns
._prepare
_vdu
_ssh
_keys
(target_vdu
, ro_nsr_public_key
, cloud_config
)
4606 self
.assertDictEqual(cloud_config
, expected_cloud_config
)
4608 @patch("osm_ng_ro.ns.Ns._select_persistent_root_disk")
4609 @patch("osm_ng_ro.ns.Ns.is_volume_keeping_required")
4610 def test_add_persistent_root_disk_to_disk_list_keep_false(
4611 self
, mock_volume_keeping_required
, mock_select_persistent_root_disk
4613 """Add persistent root disk to disk_list, keep volume set to False."""
4615 "id": "persistent-root-volume",
4616 "type-of-storage": "persistent-storage:persistent-storage",
4617 "size-of-storage": "10",
4619 mock_select_persistent_root_disk
.return_value
= root_disk
4620 vnfd
= deepcopy(vnfd_wth_persistent_storage
)
4621 vnfd
["virtual-storage-desc"][1] = root_disk
4622 target_vdu
= deepcopy(target_vdu_wth_persistent_storage
)
4623 persistent_root_disk
= {}
4625 mock_volume_keeping_required
.return_value
= False
4626 expected_disk_list
= [
4628 "image_id": "ubuntu20.04",
4633 self
.ns
._add
_persistent
_root
_disk
_to
_disk
_list
(
4634 vnfd
, target_vdu
, persistent_root_disk
, disk_list
4636 self
.assertEqual(disk_list
, expected_disk_list
)
4637 mock_select_persistent_root_disk
.assert_called_once()
4638 mock_volume_keeping_required
.assert_called_once()
4640 @patch("osm_ng_ro.ns.Ns._select_persistent_root_disk")
4641 @patch("osm_ng_ro.ns.Ns.is_volume_keeping_required")
4642 def test_add_persistent_root_disk_to_disk_list_select_persistent_root_disk_raises(
4643 self
, mock_volume_keeping_required
, mock_select_persistent_root_disk
4645 """Add persistent root disk to disk_list"""
4647 "id": "persistent-root-volume",
4648 "type-of-storage": "persistent-storage:persistent-storage",
4649 "size-of-storage": "10",
4651 mock_select_persistent_root_disk
.side_effect
= AttributeError
4652 vnfd
= deepcopy(vnfd_wth_persistent_storage
)
4653 vnfd
["virtual-storage-desc"][1] = root_disk
4654 target_vdu
= deepcopy(target_vdu_wth_persistent_storage
)
4655 persistent_root_disk
= {}
4657 with self
.assertRaises(AttributeError):
4658 self
.ns
._add
_persistent
_root
_disk
_to
_disk
_list
(
4659 vnfd
, target_vdu
, persistent_root_disk
, disk_list
4661 self
.assertEqual(disk_list
, [])
4662 mock_select_persistent_root_disk
.assert_called_once()
4663 mock_volume_keeping_required
.assert_not_called()
4665 @patch("osm_ng_ro.ns.Ns._select_persistent_root_disk")
4666 @patch("osm_ng_ro.ns.Ns.is_volume_keeping_required")
4667 def test_add_persistent_root_disk_to_disk_list_keep_true(
4668 self
, mock_volume_keeping_required
, mock_select_persistent_root_disk
4670 """Add persistent root disk, keeo volume set to True."""
4671 vnfd
= deepcopy(vnfd_wth_persistent_storage
)
4672 target_vdu
= deepcopy(target_vdu_wth_persistent_storage
)
4673 mock_volume_keeping_required
.return_value
= True
4675 "id": "persistent-root-volume",
4676 "type-of-storage": "persistent-storage:persistent-storage",
4677 "size-of-storage": "10",
4678 "vdu-storage-requirements": [
4679 {"key": "keep-volume", "value": "true"},
4682 mock_select_persistent_root_disk
.return_value
= root_disk
4683 persistent_root_disk
= {}
4685 expected_disk_list
= [
4687 "image_id": "ubuntu20.04",
4692 self
.ns
._add
_persistent
_root
_disk
_to
_disk
_list
(
4693 vnfd
, target_vdu
, persistent_root_disk
, disk_list
4695 self
.assertEqual(disk_list
, expected_disk_list
)
4696 mock_volume_keeping_required
.assert_called_once_with(root_disk
)
4698 @patch("osm_ng_ro.ns.Ns.is_volume_keeping_required")
4699 def test_add_persistent_ordinary_disk_to_disk_list(
4700 self
, mock_volume_keeping_required
4702 """Add persistent ordinary disk, keeo volume set to True."""
4703 target_vdu
= deepcopy(target_vdu_wth_persistent_storage
)
4704 mock_volume_keeping_required
.return_value
= False
4705 persistent_root_disk
= {
4706 "persistent-root-volume": {
4707 "image_id": "ubuntu20.04",
4713 "id": "persistent-volume2",
4714 "type-of-storage": "persistent-storage:persistent-storage",
4715 "size-of-storage": "10",
4717 persistent_ordinary_disk
= {}
4719 expected_disk_list
= [
4725 self
.ns
._add
_persistent
_ordinary
_disks
_to
_disk
_list
(
4726 target_vdu
, persistent_root_disk
, persistent_ordinary_disk
, disk_list
4728 self
.assertEqual(disk_list
, expected_disk_list
)
4729 mock_volume_keeping_required
.assert_called_once_with(ordinary_disk
)
4731 @patch("osm_ng_ro.ns.Ns.is_volume_keeping_required")
4732 def test_add_persistent_ordinary_disk_to_disk_list_vsd_id_in_root_disk_dict(
4733 self
, mock_volume_keeping_required
4735 """Add persistent ordinary disk, vsd id is in root_disk dict."""
4736 target_vdu
= deepcopy(target_vdu_wth_persistent_storage
)
4737 mock_volume_keeping_required
.return_value
= False
4738 persistent_root_disk
= {
4739 "persistent-root-volume": {
4740 "image_id": "ubuntu20.04",
4744 "persistent-volume2": {
4748 persistent_ordinary_disk
= {}
4751 self
.ns
._add
_persistent
_ordinary
_disks
_to
_disk
_list
(
4752 target_vdu
, persistent_root_disk
, persistent_ordinary_disk
, disk_list
4754 self
.assertEqual(disk_list
, [])
4755 mock_volume_keeping_required
.assert_not_called()
4757 @patch("osm_ng_ro.ns.Ns._select_persistent_root_disk")
4758 @patch("osm_ng_ro.ns.Ns.is_volume_keeping_required")
4759 def test_add_persistent_root_disk_to_disk_list_vnfd_wthout_persistent_storage(
4760 self
, mock_volume_keeping_required
, mock_select_persistent_root_disk
4762 """VNFD does not have persistent storage."""
4763 vnfd
= deepcopy(vnfd_wthout_persistent_storage
)
4764 target_vdu
= deepcopy(target_vdu_wthout_persistent_storage
)
4765 mock_select_persistent_root_disk
.return_value
= None
4766 persistent_root_disk
= {}
4768 self
.ns
._add
_persistent
_root
_disk
_to
_disk
_list
(
4769 vnfd
, target_vdu
, persistent_root_disk
, disk_list
4771 self
.assertEqual(disk_list
, [])
4772 self
.assertEqual(mock_select_persistent_root_disk
.call_count
, 2)
4773 mock_volume_keeping_required
.assert_not_called()
4775 @patch("osm_ng_ro.ns.Ns._select_persistent_root_disk")
4776 @patch("osm_ng_ro.ns.Ns.is_volume_keeping_required")
4777 def test_add_persistent_root_disk_to_disk_list_wthout_persistent_root_disk(
4778 self
, mock_volume_keeping_required
, mock_select_persistent_root_disk
4780 """Persistent_root_disk dict is empty."""
4781 vnfd
= deepcopy(vnfd_wthout_persistent_storage
)
4782 target_vdu
= deepcopy(target_vdu_wthout_persistent_storage
)
4783 mock_select_persistent_root_disk
.return_value
= None
4784 persistent_root_disk
= {}
4786 self
.ns
._add
_persistent
_root
_disk
_to
_disk
_list
(
4787 vnfd
, target_vdu
, persistent_root_disk
, disk_list
4789 self
.assertEqual(disk_list
, [])
4790 self
.assertEqual(mock_select_persistent_root_disk
.call_count
, 2)
4791 mock_volume_keeping_required
.assert_not_called()
4793 def test_prepare_vdu_affinity_group_list_invalid_extra_dict(self
):
4794 """Invalid extra dict."""
4795 target_vdu
= deepcopy(target_vdu_wth_persistent_storage
)
4796 target_vdu
["affinity-or-anti-affinity-group-id"] = "sample_affinity-group-id"
4798 ns_preffix
= "nsrs:th47f48-9870-4169-b758-9732e1ff40f3"
4799 with self
.assertRaises(NsException
) as err
:
4800 self
.ns
._prepare
_vdu
_affinity
_group
_list
(target_vdu
, extra_dict
, ns_preffix
)
4801 self
.assertEqual(str(err
.exception
), "Invalid extra_dict format.")
4803 def test_prepare_vdu_affinity_group_list_one_affinity_group(self
):
4804 """There is one affinity-group."""
4805 target_vdu
= deepcopy(target_vdu_wth_persistent_storage
)
4806 target_vdu
["affinity-or-anti-affinity-group-id"] = ["sample_affinity-group-id"]
4807 extra_dict
= {"depends_on": []}
4808 ns_preffix
= "nsrs:th47f48-9870-4169-b758-9732e1ff40f3"
4809 affinity_group_txt
= "nsrs:th47f48-9870-4169-b758-9732e1ff40f3:affinity-or-anti-affinity-group.sample_affinity-group-id"
4810 expected_result
= [{"affinity_group_id": "TASK-" + affinity_group_txt
}]
4811 expected_extra_dict
= {"depends_on": [affinity_group_txt
]}
4812 result
= self
.ns
._prepare
_vdu
_affinity
_group
_list
(
4813 target_vdu
, extra_dict
, ns_preffix
4815 self
.assertDictEqual(extra_dict
, expected_extra_dict
)
4816 self
.assertEqual(result
, expected_result
)
4818 def test_prepare_vdu_affinity_group_list_several_affinity_groups(self
):
4819 """There are two affinity-groups."""
4820 target_vdu
= deepcopy(target_vdu_wth_persistent_storage
)
4821 target_vdu
["affinity-or-anti-affinity-group-id"] = [
4822 "affinity-group-id1",
4823 "affinity-group-id2",
4825 extra_dict
= {"depends_on": []}
4826 ns_preffix
= "nsrs:th47f48-9870-4169-b758-9732e1ff40f3"
4827 affinity_group_txt1
= "nsrs:th47f48-9870-4169-b758-9732e1ff40f3:affinity-or-anti-affinity-group.affinity-group-id1"
4828 affinity_group_txt2
= "nsrs:th47f48-9870-4169-b758-9732e1ff40f3:affinity-or-anti-affinity-group.affinity-group-id2"
4830 {"affinity_group_id": "TASK-" + affinity_group_txt1
},
4831 {"affinity_group_id": "TASK-" + affinity_group_txt2
},
4833 expected_extra_dict
= {"depends_on": [affinity_group_txt1
, affinity_group_txt2
]}
4834 result
= self
.ns
._prepare
_vdu
_affinity
_group
_list
(
4835 target_vdu
, extra_dict
, ns_preffix
4837 self
.assertDictEqual(extra_dict
, expected_extra_dict
)
4838 self
.assertEqual(result
, expected_result
)
4840 def test_prepare_vdu_affinity_group_list_no_affinity_group(self
):
4841 """There is not any affinity-group."""
4842 target_vdu
= deepcopy(target_vdu_wth_persistent_storage
)
4843 extra_dict
= {"depends_on": []}
4844 ns_preffix
= "nsrs:th47f48-9870-4169-b758-9732e1ff40f3"
4845 result
= self
.ns
._prepare
_vdu
_affinity
_group
_list
(
4846 target_vdu
, extra_dict
, ns_preffix
4848 self
.assertDictEqual(extra_dict
, {"depends_on": []})
4849 self
.assertEqual(result
, [])
4851 @patch("osm_ng_ro.ns.Ns._sort_vdu_interfaces")
4852 @patch("osm_ng_ro.ns.Ns._partially_locate_vdu_interfaces")
4853 @patch("osm_ng_ro.ns.Ns._prepare_vdu_interfaces")
4854 @patch("osm_ng_ro.ns.Ns._prepare_vdu_cloud_init")
4855 @patch("osm_ng_ro.ns.Ns._prepare_vdu_ssh_keys")
4856 @patch("osm_ng_ro.ns.Ns.find_persistent_root_volumes")
4857 @patch("osm_ng_ro.ns.Ns.find_persistent_volumes")
4858 @patch("osm_ng_ro.ns.Ns._add_persistent_root_disk_to_disk_list")
4859 @patch("osm_ng_ro.ns.Ns._add_persistent_ordinary_disks_to_disk_list")
4860 @patch("osm_ng_ro.ns.Ns._prepare_vdu_affinity_group_list")
4861 def test_process_vdu_params_with_inst_vol_list(
4863 mock_prepare_vdu_affinity_group_list
,
4864 mock_add_persistent_ordinary_disks_to_disk_list
,
4865 mock_add_persistent_root_disk_to_disk_list
,
4866 mock_find_persistent_volumes
,
4867 mock_find_persistent_root_volumes
,
4868 mock_prepare_vdu_ssh_keys
,
4869 mock_prepare_vdu_cloud_init
,
4870 mock_prepare_vdu_interfaces
,
4871 mock_locate_vdu_interfaces
,
4872 mock_sort_vdu_interfaces
,
4874 """Instantiation volume list is empty."""
4875 target_vdu
= deepcopy(target_vdu_wth_persistent_storage
)
4877 target_vdu
["interfaces"] = interfaces_wth_all_positions
4879 vdu_instantiation_vol_list
= [
4881 "vim-volume-id": vim_volume_id
,
4882 "name": "persistent-volume2",
4885 target_vdu
["additionalParams"] = {
4886 "OSM": {"vdu_volumes": vdu_instantiation_vol_list
}
4888 mock_prepare_vdu_cloud_init
.return_value
= {}
4889 mock_prepare_vdu_affinity_group_list
.return_value
= []
4890 persistent_root_disk
= {
4891 "persistent-root-volume": {
4892 "image_id": "ubuntu20.04",
4896 mock_find_persistent_root_volumes
.return_value
= persistent_root_disk
4898 new_kwargs
= deepcopy(kwargs
)
4903 "tasks_by_target_record_id": {},
4907 expected_extra_dict_copy
= deepcopy(expected_extra_dict
)
4908 vnfd
= deepcopy(vnfd_wth_persistent_storage
)
4909 db
.get_one
.return_value
= vnfd
4910 result
= Ns
._process
_vdu
_params
(
4911 target_vdu
, indata
, vim_info
=None, target_record_id
=None, **new_kwargs
4913 mock_sort_vdu_interfaces
.assert_called_once_with(target_vdu
)
4914 mock_locate_vdu_interfaces
.assert_not_called()
4915 mock_prepare_vdu_cloud_init
.assert_called_once()
4916 mock_add_persistent_root_disk_to_disk_list
.assert_not_called()
4917 mock_add_persistent_ordinary_disks_to_disk_list
.assert_not_called()
4918 mock_prepare_vdu_interfaces
.assert_called_once_with(
4920 expected_extra_dict_copy
,
4927 self
.assertDictEqual(result
, expected_extra_dict_copy
)
4928 mock_prepare_vdu_ssh_keys
.assert_called_once_with(target_vdu
, None, {})
4929 mock_prepare_vdu_affinity_group_list
.assert_called_once()
4930 mock_find_persistent_volumes
.assert_called_once_with(
4931 persistent_root_disk
, target_vdu
, vdu_instantiation_vol_list
, []
4934 @patch("osm_ng_ro.ns.Ns._sort_vdu_interfaces")
4935 @patch("osm_ng_ro.ns.Ns._partially_locate_vdu_interfaces")
4936 @patch("osm_ng_ro.ns.Ns._prepare_vdu_interfaces")
4937 @patch("osm_ng_ro.ns.Ns._prepare_vdu_cloud_init")
4938 @patch("osm_ng_ro.ns.Ns._prepare_vdu_ssh_keys")
4939 @patch("osm_ng_ro.ns.Ns.find_persistent_root_volumes")
4940 @patch("osm_ng_ro.ns.Ns.find_persistent_volumes")
4941 @patch("osm_ng_ro.ns.Ns._add_persistent_root_disk_to_disk_list")
4942 @patch("osm_ng_ro.ns.Ns._add_persistent_ordinary_disks_to_disk_list")
4943 @patch("osm_ng_ro.ns.Ns._prepare_vdu_affinity_group_list")
4944 def test_process_vdu_params_wth_affinity_groups(
4946 mock_prepare_vdu_affinity_group_list
,
4947 mock_add_persistent_ordinary_disks_to_disk_list
,
4948 mock_add_persistent_root_disk_to_disk_list
,
4949 mock_find_persistent_volumes
,
4950 mock_find_persistent_root_volumes
,
4951 mock_prepare_vdu_ssh_keys
,
4952 mock_prepare_vdu_cloud_init
,
4953 mock_prepare_vdu_interfaces
,
4954 mock_locate_vdu_interfaces
,
4955 mock_sort_vdu_interfaces
,
4957 """There is cloud-config."""
4958 target_vdu
= deepcopy(target_vdu_wthout_persistent_storage
)
4961 target_vdu
["interfaces"] = interfaces_wth_all_positions
4962 mock_prepare_vdu_cloud_init
.return_value
= {}
4963 mock_prepare_vdu_affinity_group_list
.return_value
= [
4968 new_kwargs
= deepcopy(kwargs
)
4973 "tasks_by_target_record_id": {},
4977 expected_extra_dict3
= deepcopy(expected_extra_dict2
)
4978 expected_extra_dict3
["params"]["affinity_group_list"] = [
4982 vnfd
= deepcopy(vnfd_wth_persistent_storage
)
4983 db
.get_one
.return_value
= vnfd
4984 result
= Ns
._process
_vdu
_params
(
4985 target_vdu
, indata
, vim_info
=None, target_record_id
=None, **new_kwargs
4987 self
.assertDictEqual(result
, expected_extra_dict3
)
4988 mock_sort_vdu_interfaces
.assert_called_once_with(target_vdu
)
4989 mock_locate_vdu_interfaces
.assert_not_called()
4990 mock_prepare_vdu_cloud_init
.assert_called_once()
4991 mock_add_persistent_root_disk_to_disk_list
.assert_called_once()
4992 mock_add_persistent_ordinary_disks_to_disk_list
.assert_called_once()
4993 mock_prepare_vdu_interfaces
.assert_called_once_with(
4995 expected_extra_dict3
,
5003 mock_prepare_vdu_ssh_keys
.assert_called_once_with(target_vdu
, None, {})
5004 mock_prepare_vdu_affinity_group_list
.assert_called_once()
5005 mock_find_persistent_volumes
.assert_not_called()
5007 @patch("osm_ng_ro.ns.Ns._sort_vdu_interfaces")
5008 @patch("osm_ng_ro.ns.Ns._partially_locate_vdu_interfaces")
5009 @patch("osm_ng_ro.ns.Ns._prepare_vdu_interfaces")
5010 @patch("osm_ng_ro.ns.Ns._prepare_vdu_cloud_init")
5011 @patch("osm_ng_ro.ns.Ns._prepare_vdu_ssh_keys")
5012 @patch("osm_ng_ro.ns.Ns.find_persistent_root_volumes")
5013 @patch("osm_ng_ro.ns.Ns.find_persistent_volumes")
5014 @patch("osm_ng_ro.ns.Ns._add_persistent_root_disk_to_disk_list")
5015 @patch("osm_ng_ro.ns.Ns._add_persistent_ordinary_disks_to_disk_list")
5016 @patch("osm_ng_ro.ns.Ns._prepare_vdu_affinity_group_list")
5017 def test_process_vdu_params_wth_cloud_config(
5019 mock_prepare_vdu_affinity_group_list
,
5020 mock_add_persistent_ordinary_disks_to_disk_list
,
5021 mock_add_persistent_root_disk_to_disk_list
,
5022 mock_find_persistent_volumes
,
5023 mock_find_persistent_root_volumes
,
5024 mock_prepare_vdu_ssh_keys
,
5025 mock_prepare_vdu_cloud_init
,
5026 mock_prepare_vdu_interfaces
,
5027 mock_locate_vdu_interfaces
,
5028 mock_sort_vdu_interfaces
,
5030 """There is cloud-config."""
5031 target_vdu
= deepcopy(target_vdu_wthout_persistent_storage
)
5034 target_vdu
["interfaces"] = interfaces_wth_all_positions
5035 mock_prepare_vdu_cloud_init
.return_value
= {
5036 "user-data": user_data
,
5037 "boot-data-drive": "vda",
5039 mock_prepare_vdu_affinity_group_list
.return_value
= []
5041 new_kwargs
= deepcopy(kwargs
)
5046 "tasks_by_target_record_id": {},
5050 expected_extra_dict3
= deepcopy(expected_extra_dict2
)
5051 expected_extra_dict3
["params"]["cloud_config"] = {
5052 "user-data": user_data
,
5053 "boot-data-drive": "vda",
5055 vnfd
= deepcopy(vnfd_wth_persistent_storage
)
5056 db
.get_one
.return_value
= vnfd
5057 result
= Ns
._process
_vdu
_params
(
5058 target_vdu
, indata
, vim_info
=None, target_record_id
=None, **new_kwargs
5060 mock_sort_vdu_interfaces
.assert_called_once_with(target_vdu
)
5061 mock_locate_vdu_interfaces
.assert_not_called()
5062 mock_prepare_vdu_cloud_init
.assert_called_once()
5063 mock_add_persistent_root_disk_to_disk_list
.assert_called_once()
5064 mock_add_persistent_ordinary_disks_to_disk_list
.assert_called_once()
5065 mock_prepare_vdu_interfaces
.assert_called_once_with(
5067 expected_extra_dict3
,
5074 self
.assertDictEqual(result
, expected_extra_dict3
)
5075 mock_prepare_vdu_ssh_keys
.assert_called_once_with(
5076 target_vdu
, None, {"user-data": user_data
, "boot-data-drive": "vda"}
5078 mock_prepare_vdu_affinity_group_list
.assert_called_once()
5079 mock_find_persistent_volumes
.assert_not_called()
5081 @patch("osm_ng_ro.ns.Ns._sort_vdu_interfaces")
5082 @patch("osm_ng_ro.ns.Ns._partially_locate_vdu_interfaces")
5083 @patch("osm_ng_ro.ns.Ns._prepare_vdu_interfaces")
5084 @patch("osm_ng_ro.ns.Ns._prepare_vdu_cloud_init")
5085 @patch("osm_ng_ro.ns.Ns._prepare_vdu_ssh_keys")
5086 @patch("osm_ng_ro.ns.Ns.find_persistent_root_volumes")
5087 @patch("osm_ng_ro.ns.Ns.find_persistent_volumes")
5088 @patch("osm_ng_ro.ns.Ns._add_persistent_root_disk_to_disk_list")
5089 @patch("osm_ng_ro.ns.Ns._add_persistent_ordinary_disks_to_disk_list")
5090 @patch("osm_ng_ro.ns.Ns._prepare_vdu_affinity_group_list")
5091 def test_process_vdu_params_wthout_persistent_storage(
5093 mock_prepare_vdu_affinity_group_list
,
5094 mock_add_persistent_ordinary_disks_to_disk_list
,
5095 mock_add_persistent_root_disk_to_disk_list
,
5096 mock_find_persistent_volumes
,
5097 mock_find_persistent_root_volumes
,
5098 mock_prepare_vdu_ssh_keys
,
5099 mock_prepare_vdu_cloud_init
,
5100 mock_prepare_vdu_interfaces
,
5101 mock_locate_vdu_interfaces
,
5102 mock_sort_vdu_interfaces
,
5104 """There is not any persistent storage."""
5105 target_vdu
= deepcopy(target_vdu_wthout_persistent_storage
)
5108 target_vdu
["interfaces"] = interfaces_wth_all_positions
5109 mock_prepare_vdu_cloud_init
.return_value
= {}
5110 mock_prepare_vdu_affinity_group_list
.return_value
= []
5112 new_kwargs
= deepcopy(kwargs
)
5117 "tasks_by_target_record_id": {},
5121 expected_extra_dict_copy
= deepcopy(expected_extra_dict2
)
5122 vnfd
= deepcopy(vnfd_wthout_persistent_storage
)
5123 db
.get_one
.return_value
= vnfd
5124 result
= Ns
._process
_vdu
_params
(
5125 target_vdu
, indata
, vim_info
=None, target_record_id
=None, **new_kwargs
5127 mock_sort_vdu_interfaces
.assert_called_once_with(target_vdu
)
5128 mock_locate_vdu_interfaces
.assert_not_called()
5129 mock_prepare_vdu_cloud_init
.assert_called_once()
5130 mock_add_persistent_root_disk_to_disk_list
.assert_called_once()
5131 mock_add_persistent_ordinary_disks_to_disk_list
.assert_called_once()
5132 mock_prepare_vdu_interfaces
.assert_called_once_with(
5134 expected_extra_dict_copy
,
5141 self
.assertDictEqual(result
, expected_extra_dict_copy
)
5142 mock_prepare_vdu_ssh_keys
.assert_called_once_with(target_vdu
, None, {})
5143 mock_prepare_vdu_affinity_group_list
.assert_called_once()
5144 mock_find_persistent_volumes
.assert_not_called()
5146 @patch("osm_ng_ro.ns.Ns._sort_vdu_interfaces")
5147 @patch("osm_ng_ro.ns.Ns._partially_locate_vdu_interfaces")
5148 @patch("osm_ng_ro.ns.Ns._prepare_vdu_interfaces")
5149 @patch("osm_ng_ro.ns.Ns._prepare_vdu_cloud_init")
5150 @patch("osm_ng_ro.ns.Ns._prepare_vdu_ssh_keys")
5151 @patch("osm_ng_ro.ns.Ns.find_persistent_root_volumes")
5152 @patch("osm_ng_ro.ns.Ns.find_persistent_volumes")
5153 @patch("osm_ng_ro.ns.Ns._add_persistent_root_disk_to_disk_list")
5154 @patch("osm_ng_ro.ns.Ns._add_persistent_ordinary_disks_to_disk_list")
5155 @patch("osm_ng_ro.ns.Ns._prepare_vdu_affinity_group_list")
5156 def test_process_vdu_params_interfaces_partially_located(
5158 mock_prepare_vdu_affinity_group_list
,
5159 mock_add_persistent_ordinary_disks_to_disk_list
,
5160 mock_add_persistent_root_disk_to_disk_list
,
5161 mock_find_persistent_volumes
,
5162 mock_find_persistent_root_volumes
,
5163 mock_prepare_vdu_ssh_keys
,
5164 mock_prepare_vdu_cloud_init
,
5165 mock_prepare_vdu_interfaces
,
5166 mock_locate_vdu_interfaces
,
5167 mock_sort_vdu_interfaces
,
5169 """Some interfaces have position."""
5170 target_vdu
= deepcopy(target_vdu_wth_persistent_storage
)
5173 target_vdu
["interfaces"] = [
5176 "ns-vld-id": "net1",
5178 {"name": "vdu-eth2", "ns-vld-id": "net2", "position": 2},
5181 "ns-vld-id": "mgmtnet",
5184 mock_prepare_vdu_cloud_init
.return_value
= {}
5185 mock_prepare_vdu_affinity_group_list
.return_value
= []
5186 persistent_root_disk
= {
5187 "persistent-root-volume": {
5188 "image_id": "ubuntu20.04",
5193 mock_find_persistent_root_volumes
.return_value
= persistent_root_disk
5195 new_kwargs
= deepcopy(kwargs
)
5200 "tasks_by_target_record_id": {},
5205 vnfd
= deepcopy(vnfd_wth_persistent_storage
)
5206 db
.get_one
.return_value
= vnfd
5207 result
= Ns
._process
_vdu
_params
(
5208 target_vdu
, indata
, vim_info
=None, target_record_id
=None, **new_kwargs
5210 expected_extra_dict_copy
= deepcopy(expected_extra_dict
)
5211 mock_sort_vdu_interfaces
.assert_not_called()
5212 mock_locate_vdu_interfaces
.assert_called_once_with(target_vdu
)
5213 mock_prepare_vdu_cloud_init
.assert_called_once()
5214 mock_add_persistent_root_disk_to_disk_list
.assert_called_once()
5215 mock_add_persistent_ordinary_disks_to_disk_list
.assert_called_once()
5216 mock_prepare_vdu_interfaces
.assert_called_once_with(
5218 expected_extra_dict_copy
,
5225 self
.assertDictEqual(result
, expected_extra_dict_copy
)
5226 mock_prepare_vdu_ssh_keys
.assert_called_once_with(target_vdu
, None, {})
5227 mock_prepare_vdu_affinity_group_list
.assert_called_once()
5228 mock_find_persistent_volumes
.assert_not_called()
5229 mock_find_persistent_root_volumes
.assert_not_called()
5231 @patch("osm_ng_ro.ns.Ns._sort_vdu_interfaces")
5232 @patch("osm_ng_ro.ns.Ns._partially_locate_vdu_interfaces")
5233 @patch("osm_ng_ro.ns.Ns._prepare_vdu_interfaces")
5234 @patch("osm_ng_ro.ns.Ns._prepare_vdu_cloud_init")
5235 @patch("osm_ng_ro.ns.Ns._prepare_vdu_ssh_keys")
5236 @patch("osm_ng_ro.ns.Ns.find_persistent_root_volumes")
5237 @patch("osm_ng_ro.ns.Ns.find_persistent_volumes")
5238 @patch("osm_ng_ro.ns.Ns._add_persistent_root_disk_to_disk_list")
5239 @patch("osm_ng_ro.ns.Ns._add_persistent_ordinary_disks_to_disk_list")
5240 @patch("osm_ng_ro.ns.Ns._prepare_vdu_affinity_group_list")
5241 def test_process_vdu_params_no_interface_position(
5243 mock_prepare_vdu_affinity_group_list
,
5244 mock_add_persistent_ordinary_disks_to_disk_list
,
5245 mock_add_persistent_root_disk_to_disk_list
,
5246 mock_find_persistent_volumes
,
5247 mock_find_persistent_root_volumes
,
5248 mock_prepare_vdu_ssh_keys
,
5249 mock_prepare_vdu_cloud_init
,
5250 mock_prepare_vdu_interfaces
,
5251 mock_locate_vdu_interfaces
,
5252 mock_sort_vdu_interfaces
,
5254 """Interfaces do not have position."""
5255 target_vdu
= deepcopy(target_vdu_wth_persistent_storage
)
5258 target_vdu
["interfaces"] = interfaces_wthout_positions
5259 mock_prepare_vdu_cloud_init
.return_value
= {}
5260 mock_prepare_vdu_affinity_group_list
.return_value
= []
5261 persistent_root_disk
= {
5262 "persistent-root-volume": {
5263 "image_id": "ubuntu20.04",
5268 mock_find_persistent_root_volumes
.return_value
= persistent_root_disk
5269 new_kwargs
= deepcopy(kwargs
)
5274 "tasks_by_target_record_id": {},
5279 vnfd
= deepcopy(vnfd_wth_persistent_storage
)
5280 db
.get_one
.return_value
= vnfd
5281 result
= Ns
._process
_vdu
_params
(
5282 target_vdu
, indata
, vim_info
=None, target_record_id
=None, **new_kwargs
5284 expected_extra_dict_copy
= deepcopy(expected_extra_dict
)
5285 mock_sort_vdu_interfaces
.assert_not_called()
5286 mock_locate_vdu_interfaces
.assert_called_once_with(target_vdu
)
5287 mock_prepare_vdu_cloud_init
.assert_called_once()
5288 mock_add_persistent_root_disk_to_disk_list
.assert_called_once()
5289 mock_add_persistent_ordinary_disks_to_disk_list
.assert_called_once()
5290 mock_prepare_vdu_interfaces
.assert_called_once_with(
5292 expected_extra_dict_copy
,
5299 self
.assertDictEqual(result
, expected_extra_dict_copy
)
5300 mock_prepare_vdu_ssh_keys
.assert_called_once_with(target_vdu
, None, {})
5301 mock_prepare_vdu_affinity_group_list
.assert_called_once()
5302 mock_find_persistent_volumes
.assert_not_called()
5303 mock_find_persistent_root_volumes
.assert_not_called()
5305 @patch("osm_ng_ro.ns.Ns._sort_vdu_interfaces")
5306 @patch("osm_ng_ro.ns.Ns._partially_locate_vdu_interfaces")
5307 @patch("osm_ng_ro.ns.Ns._prepare_vdu_interfaces")
5308 @patch("osm_ng_ro.ns.Ns._prepare_vdu_cloud_init")
5309 @patch("osm_ng_ro.ns.Ns._prepare_vdu_ssh_keys")
5310 @patch("osm_ng_ro.ns.Ns.find_persistent_root_volumes")
5311 @patch("osm_ng_ro.ns.Ns.find_persistent_volumes")
5312 @patch("osm_ng_ro.ns.Ns._add_persistent_root_disk_to_disk_list")
5313 @patch("osm_ng_ro.ns.Ns._add_persistent_ordinary_disks_to_disk_list")
5314 @patch("osm_ng_ro.ns.Ns._prepare_vdu_affinity_group_list")
5315 def test_process_vdu_params_prepare_vdu_interfaces_raises_exception(
5317 mock_prepare_vdu_affinity_group_list
,
5318 mock_add_persistent_ordinary_disks_to_disk_list
,
5319 mock_add_persistent_root_disk_to_disk_list
,
5320 mock_find_persistent_volumes
,
5321 mock_find_persistent_root_volumes
,
5322 mock_prepare_vdu_ssh_keys
,
5323 mock_prepare_vdu_cloud_init
,
5324 mock_prepare_vdu_interfaces
,
5325 mock_locate_vdu_interfaces
,
5326 mock_sort_vdu_interfaces
,
5328 """Prepare vdu interfaces method raises exception."""
5329 target_vdu
= deepcopy(target_vdu_wth_persistent_storage
)
5332 target_vdu
["interfaces"] = interfaces_wthout_positions
5333 mock_prepare_vdu_cloud_init
.return_value
= {}
5334 mock_prepare_vdu_affinity_group_list
.return_value
= []
5335 persistent_root_disk
= {
5336 "persistent-root-volume": {
5337 "image_id": "ubuntu20.04",
5342 mock_find_persistent_root_volumes
.return_value
= persistent_root_disk
5343 new_kwargs
= deepcopy(kwargs
)
5348 "tasks_by_target_record_id": {},
5352 mock_prepare_vdu_interfaces
.side_effect
= TypeError
5354 vnfd
= deepcopy(vnfd_wth_persistent_storage
)
5355 db
.get_one
.return_value
= vnfd
5356 with self
.assertRaises(Exception) as err
:
5357 Ns
._process
_vdu
_params
(
5358 target_vdu
, indata
, vim_info
=None, target_record_id
=None, **new_kwargs
5360 self
.assertEqual(type(err
), TypeError)
5361 mock_sort_vdu_interfaces
.assert_not_called()
5362 mock_locate_vdu_interfaces
.assert_called_once_with(target_vdu
)
5363 mock_prepare_vdu_cloud_init
.assert_not_called()
5364 mock_add_persistent_root_disk_to_disk_list
.assert_not_called()
5365 mock_add_persistent_ordinary_disks_to_disk_list
.assert_not_called()
5366 mock_prepare_vdu_interfaces
.assert_called_once()
5367 mock_prepare_vdu_ssh_keys
.assert_not_called()
5368 mock_prepare_vdu_affinity_group_list
.assert_not_called()
5369 mock_find_persistent_volumes
.assert_not_called()
5370 mock_find_persistent_root_volumes
.assert_not_called()
5372 @patch("osm_ng_ro.ns.Ns._sort_vdu_interfaces")
5373 @patch("osm_ng_ro.ns.Ns._partially_locate_vdu_interfaces")
5374 @patch("osm_ng_ro.ns.Ns._prepare_vdu_interfaces")
5375 @patch("osm_ng_ro.ns.Ns._prepare_vdu_cloud_init")
5376 @patch("osm_ng_ro.ns.Ns._prepare_vdu_ssh_keys")
5377 @patch("osm_ng_ro.ns.Ns.find_persistent_root_volumes")
5378 @patch("osm_ng_ro.ns.Ns.find_persistent_volumes")
5379 @patch("osm_ng_ro.ns.Ns._add_persistent_root_disk_to_disk_list")
5380 @patch("osm_ng_ro.ns.Ns._add_persistent_ordinary_disks_to_disk_list")
5381 @patch("osm_ng_ro.ns.Ns._prepare_vdu_affinity_group_list")
5382 def test_process_vdu_params_add_persistent_root_disk_raises_exception(
5384 mock_prepare_vdu_affinity_group_list
,
5385 mock_add_persistent_ordinary_disks_to_disk_list
,
5386 mock_add_persistent_root_disk_to_disk_list
,
5387 mock_find_persistent_volumes
,
5388 mock_find_persistent_root_volumes
,
5389 mock_prepare_vdu_ssh_keys
,
5390 mock_prepare_vdu_cloud_init
,
5391 mock_prepare_vdu_interfaces
,
5392 mock_locate_vdu_interfaces
,
5393 mock_sort_vdu_interfaces
,
5395 """Add persistent root disk method raises exception."""
5396 target_vdu
= deepcopy(target_vdu_wth_persistent_storage
)
5399 target_vdu
["interfaces"] = interfaces_wthout_positions
5400 mock_prepare_vdu_cloud_init
.return_value
= {}
5401 mock_prepare_vdu_affinity_group_list
.return_value
= []
5402 mock_add_persistent_root_disk_to_disk_list
.side_effect
= KeyError
5403 new_kwargs
= deepcopy(kwargs
)
5408 "tasks_by_target_record_id": {},
5413 vnfd
= deepcopy(vnfd_wth_persistent_storage
)
5414 db
.get_one
.return_value
= vnfd
5415 with self
.assertRaises(Exception) as err
:
5416 Ns
._process
_vdu
_params
(
5417 target_vdu
, indata
, vim_info
=None, target_record_id
=None, **new_kwargs
5419 self
.assertEqual(type(err
), KeyError)
5420 mock_sort_vdu_interfaces
.assert_not_called()
5421 mock_locate_vdu_interfaces
.assert_called_once_with(target_vdu
)
5422 mock_prepare_vdu_cloud_init
.assert_called_once()
5423 mock_add_persistent_root_disk_to_disk_list
.assert_called_once()
5424 mock_add_persistent_ordinary_disks_to_disk_list
.assert_not_called()
5425 mock_prepare_vdu_interfaces
.assert_called_once_with(
5429 f
"{ns_preffix}:image.0",
5430 f
"{ns_preffix}:flavor.0",
5440 mock_prepare_vdu_ssh_keys
.assert_called_once_with(target_vdu
, None, {})
5441 mock_prepare_vdu_affinity_group_list
.assert_not_called()
5442 mock_find_persistent_volumes
.assert_not_called()
5443 mock_find_persistent_root_volumes
.assert_not_called()
5445 def test_select_persistent_root_disk(self
):
5446 vdu
= deepcopy(target_vdu_wth_persistent_storage
)
5447 vdu
["virtual-storage-desc"] = [
5448 "persistent-root-volume",
5449 "persistent-volume2",
5452 vsd
= deepcopy(vnfd_wth_persistent_storage
)["virtual-storage-desc"][1]
5453 expected_result
= vsd
5454 result
= Ns
._select
_persistent
_root
_disk
(vsd
, vdu
)
5455 self
.assertEqual(result
, expected_result
)
5457 def test_select_persistent_root_disk_first_vsd_is_different(self
):
5458 """VDU first virtual-storage-desc is different than vsd id."""
5459 vdu
= deepcopy(target_vdu_wth_persistent_storage
)
5460 vdu
["virtual-storage-desc"] = [
5461 "persistent-volume2",
5462 "persistent-root-volume",
5465 vsd
= deepcopy(vnfd_wth_persistent_storage
)["virtual-storage-desc"][1]
5466 expected_result
= None
5467 result
= Ns
._select
_persistent
_root
_disk
(vsd
, vdu
)
5468 self
.assertEqual(result
, expected_result
)
5470 def test_select_persistent_root_disk_vsd_is_not_persistent(self
):
5471 """vsd type is not persistent."""
5472 vdu
= deepcopy(target_vdu_wth_persistent_storage
)
5473 vdu
["virtual-storage-desc"] = [
5474 "persistent-volume2",
5475 "persistent-root-volume",
5478 vsd
= deepcopy(vnfd_wth_persistent_storage
)["virtual-storage-desc"][1]
5479 vsd
["type-of-storage"] = "etsi-nfv-descriptors:ephemeral-storage"
5480 expected_result
= None
5481 result
= Ns
._select
_persistent
_root
_disk
(vsd
, vdu
)
5482 self
.assertEqual(result
, expected_result
)
5484 def test_select_persistent_root_disk_vsd_does_not_have_size(self
):
5485 """vsd size is None."""
5486 vdu
= deepcopy(target_vdu_wth_persistent_storage
)
5487 vdu
["virtual-storage-desc"] = [
5488 "persistent-volume2",
5489 "persistent-root-volume",
5492 vsd
= deepcopy(vnfd_wth_persistent_storage
)["virtual-storage-desc"][1]
5493 vsd
["size-of-storage"] = None
5494 expected_result
= None
5495 result
= Ns
._select
_persistent
_root
_disk
(vsd
, vdu
)
5496 self
.assertEqual(result
, expected_result
)
5498 def test_select_persistent_root_disk_vdu_wthout_vsd(self
):
5499 """VDU does not have virtual-storage-desc."""
5500 vdu
= deepcopy(target_vdu_wth_persistent_storage
)
5501 vsd
= deepcopy(vnfd_wth_persistent_storage
)["virtual-storage-desc"][1]
5502 expected_result
= None
5503 result
= Ns
._select
_persistent
_root
_disk
(vsd
, vdu
)
5504 self
.assertEqual(result
, expected_result
)
5506 def test_select_persistent_root_disk_invalid_vsd_type(self
):
5507 """vsd is list, expected to be a dict."""
5508 vdu
= deepcopy(target_vdu_wth_persistent_storage
)
5509 vsd
= deepcopy(vnfd_wth_persistent_storage
)["virtual-storage-desc"]
5510 with self
.assertRaises(AttributeError):
5511 Ns
._select
_persistent
_root
_disk
(vsd
, vdu
)