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 #######################################################################################
20 from unittest
.mock
import MagicMock
, patch
22 from osm_ng_ro
.ns_thread
import VimInteractionNet
23 from osm_ro_plugin
.vimconn
import VimConnConnectionException
, VimConnException
26 class TestVimInteractionNet(unittest
.TestCase
):
28 module_name
= "osm_ro_plugin"
29 self
.target_vim
= MagicMock(name
=f
"{module_name}.vimconn.VimConnector")
30 self
.task_depends
= None
32 patches
= [patch(f
"{module_name}.vimconn.VimConnector", self
.target_vim
)]
34 # Enabling mocks and add cleanups
37 self
.addCleanup(mock
.stop
)
39 def test__mgmt_net_id_in_find_params_mgmt_several_vim_nets(self
):
41 management_network_id in find_params.get('mgmt')
42 More than one network found in the VIM
45 logger
= "test_logger"
50 "management_network_id": "test_mgmt_id",
55 instance
= VimInteractionNet(db
, logger
, my_vims
, db_vims
)
56 with patch
.object(instance
, "my_vims", [self
.target_vim
]), patch
.object(
57 instance
, "logger", logging
63 "target_id": "vim_openstack_2",
64 "action_id": "123456",
66 "task_id": "123456:1",
67 "status": "SCHEDULED",
70 "target_record": "test_target_record",
71 "target_record_id": "test_target_record_id",
72 # values coming from extra_dict
76 "name": "some_mgmt_name",
78 "depends_on": "test_depends_on",
83 task_index
= "task_index_2"
84 self
.target_vim
.get_network_list
.return_value
= [
85 {"id": "existing_net_1"},
86 {"id": "existing_net_2"},
88 with self
.assertLogs() as captured
:
89 result
= instance
.new(ro_task
, task_index
, self
.task_depends
)
90 self
.assertEqual(len(captured
.records
), 1)
92 "More than one network found with this criteria"
93 in captured
.records
[0].getMessage()
95 self
.assertEqual(captured
.records
[0].levelname
, "ERROR")
96 self
.assertEqual(result
[0], "FAILED")
97 self
.assertEqual(result
[1].get("created"), False)
98 self
.assertEqual(result
[1].get("vim_status"), "VIM_ERROR")
100 def test__mgmt_net_id_in_find_params_mgmt_no_vim_nets(self
):
102 management_network_id in find_params.get('mgmt')
103 The network could not be found in the VIM
106 logger
= "test_logger"
111 "management_network_id": "test_mgmt_id",
116 instance
= VimInteractionNet(db
, logger
, my_vims
, db_vims
)
117 with patch
.object(instance
, "my_vims", [self
.target_vim
]), patch
.object(
118 instance
, "logger", logging
124 "target_id": "vim_openstack_3",
125 "action_id": "123456",
127 "task_id": "123456:1",
128 "status": "SCHEDULED",
131 "target_record": "test_target_record",
132 "target_record_id": "test_target_record_id",
134 # values coming from extra_dict
137 "name": "some_mgmt_name",
139 "depends_on": "test_depends_on",
144 task_index
= "task_index_3"
145 self
.target_vim
.get_network_list
.return_value
= []
146 with self
.assertLogs() as captured
:
147 result
= instance
.new(ro_task
, task_index
, self
.task_depends
)
148 self
.assertEqual(len(captured
.records
), 1)
150 "Network not found with this criteria"
151 in captured
.records
[0].getMessage()
153 self
.assertEqual(captured
.records
[0].levelname
, "ERROR")
154 self
.assertEqual(result
[0], "FAILED")
155 self
.assertEqual(result
[1].get("created"), False)
156 self
.assertEqual(result
[1].get("vim_status"), "VIM_ERROR")
158 def test__mgmt_net_name_in_find_params_mgmt_several_vim_nets(self
):
160 management_network_name in find_params.get('mgmt')
161 More than one network found in the VIM
164 logger
= "test_logger"
169 "management_network_name": "test_mgmt_name",
174 instance
= VimInteractionNet(db
, logger
, my_vims
, db_vims
)
175 with patch
.object(instance
, "my_vims", [self
.target_vim
]), patch
.object(
176 instance
, "logger", logging
182 "target_id": "vim_openstack_4",
183 "action_id": "123456",
185 "task_id": "123456:1",
186 "status": "SCHEDULED",
189 "target_record": "test_target_record",
190 "target_record_id": "test_target_record_id",
191 # values coming from extra_dict
195 "name": "some_mgmt_name",
197 "depends_on": "test_depends_on",
202 task_index
= "task_index_4"
203 self
.target_vim
.get_network_list
.return_value
= [
204 {"id": "existing_net_1"},
205 {"id": "existing_net_2"},
207 with self
.assertLogs() as captured
:
208 result
= instance
.new(ro_task
, task_index
, self
.task_depends
)
209 self
.assertEqual(len(captured
.records
), 1)
211 "More than one network found with this criteria"
212 in captured
.records
[0].getMessage()
214 self
.assertEqual(captured
.records
[0].levelname
, "ERROR")
215 self
.assertEqual(result
[0], "FAILED")
216 self
.assertEqual(result
[1].get("created"), False)
217 self
.assertEqual(result
[1].get("vim_status"), "VIM_ERROR")
219 def test__mgmt_net_name_in_find_params_mgmt_no_vim_nets(self
):
221 management_network_name in find_params.get('mgmt')
222 The network could not be found in the VIM
225 logger
= "test_logger"
230 "management_network_name": "test_mgmt_name",
235 instance
= VimInteractionNet(db
, logger
, my_vims
, db_vims
)
236 with patch
.object(instance
, "my_vims", [self
.target_vim
]), patch
.object(
237 instance
, "logger", logging
243 "target_id": "vim_openstack_5",
244 "action_id": "123456",
246 "task_id": "123456:1",
247 "status": "SCHEDULED",
250 "target_record": "test_target_record",
251 "target_record_id": "test_target_record_id",
252 # values coming from extra_dict
256 "name": "some_mgmt_name",
258 "depends_on": "test_depends_on",
263 task_index
= "task_index_5"
264 self
.target_vim
.get_network_list
.return_value
= []
265 with self
.assertLogs() as captured
:
266 result
= instance
.new(ro_task
, task_index
, self
.task_depends
)
267 self
.assertEqual(len(captured
.records
), 1)
269 "Network not found with this criteria"
270 in captured
.records
[0].getMessage()
272 self
.assertEqual(captured
.records
[0].levelname
, "ERROR")
273 self
.assertEqual(result
[0], "FAILED")
274 self
.assertEqual(result
[1].get("created"), False)
275 self
.assertEqual(result
[1].get("vim_status"), "VIM_ERROR")
277 def test__mgmt_net_name_in_find_params_filterdict_several_vim_nets(self
):
279 management_network_name in find_params.get('filterdict')
280 More than one network found in the VIM
283 logger
= "test_logger"
288 "management_network_name": "test_mgmt_name",
292 instance
= VimInteractionNet(db
, logger
, my_vims
, db_vims
)
293 with patch
.object(instance
, "my_vims", [self
.target_vim
]), patch
.object(
294 instance
, "logger", logging
300 "target_id": "vim_openstack_6",
301 "action_id": "123456",
303 "task_id": "123456:1",
304 "status": "SCHEDULED",
307 "target_record": "test_target_record",
308 "target_record_id": "test_target_record_id",
309 # values coming from extra_dict
313 "name": "some-network-name",
316 "name": "some_mgmt_name",
318 "depends_on": "test_depends_on",
323 task_index
= "task_index_6"
324 self
.target_vim
.get_network_list
.return_value
= [
325 {"id": "existing_net_1"},
326 {"id": "existing_net_2"},
328 with self
.assertLogs() as captured
:
329 result
= instance
.new(ro_task
, task_index
, self
.task_depends
)
330 self
.assertEqual(len(captured
.records
), 1)
332 "More than one network found with this criteria"
333 in captured
.records
[0].getMessage()
335 self
.assertEqual(captured
.records
[0].levelname
, "ERROR")
336 self
.assertEqual(result
[0], "FAILED")
337 self
.assertEqual(result
[1].get("created"), False)
338 self
.assertEqual(result
[1].get("vim_status"), "VIM_ERROR")
340 def test__mgmt_net_name_in_find_params_no_filterdict_no_mgmt(self
):
342 There is find_params in the task
343 No mgmt in find_params
344 No filter_dict in find_params
347 logger
= "test_logger"
352 "management_network_name": "test_mgmt_name",
356 instance
= VimInteractionNet(db
, logger
, my_vims
, db_vims
)
357 with patch
.object(instance
, "my_vims", [self
.target_vim
]), patch
.object(
358 instance
, "logger", logging
364 "target_id": "vim_openstack_7",
365 "action_id": "123456",
367 "task_id": "123456:1",
368 "status": "SCHEDULED",
371 "target_record": "test_target_record",
372 "target_record_id": "test_target_record_id",
373 # values coming from extra_dict
375 "find_params": {"wrong_param": "wrong_value"},
376 "depends_on": "test_depends_on",
381 task_index
= "task_index_4"
382 with self
.assertLogs() as captured
:
383 result
= instance
.new(ro_task
, task_index
, self
.task_depends
)
384 self
.assertEqual(len(captured
.records
), 1)
386 "Invalid find_params for new_net"
387 in captured
.records
[0].getMessage()
389 self
.assertEqual(captured
.records
[0].levelname
, "ERROR")
390 self
.assertEqual(result
[0], "FAILED")
391 self
.assertEqual(result
[1].get("created"), False)
392 self
.assertEqual(result
[1].get("vim_status"), "VIM_ERROR")
394 def test__mgmt_net_name_in_find_params_filterdict_no_vim_nets_params_in_task(self
):
396 management_network_name in find_params.get('filterdict')
397 The network could not be found in the VIM
398 There are items in the task.get(params)
401 logger
= "test_logger"
406 "management_network_name": "test_mgmt_name",
410 instance
= VimInteractionNet(db
, logger
, my_vims
, db_vims
)
411 with patch
.object(instance
, "my_vims", [self
.target_vim
]), patch
.object(
412 instance
, "logger", logging
418 "target_id": "vim_openstack_8",
419 "action_id": "123456",
421 "task_id": "123456:1",
422 "status": "SCHEDULED",
425 "target_record": "test_target_record",
426 "target_record_id": "test_target_record_id",
427 # values coming from extra_dict
429 "net_name": "test_params",
433 "name": "some-network-name",
436 "name": "some_mgmt_name",
438 "depends_on": "test_depends_on",
443 task_index
= "task_index_8"
444 self
.target_vim
.get_network_list
.return_value
= []
445 result
= instance
.new(ro_task
, task_index
, self
.task_depends
)
446 self
.assertEqual(result
[0], "BUILD")
447 self
.assertEqual(result
[1].get("created"), False)
448 self
.assertEqual(result
[1].get("vim_id"), None)
449 self
.assertEqual(result
[1].get("created_items"), {})
450 self
.assertEqual(result
[1].get("vim_status"), "BUILD")
452 def test__mgmt_net_name_in_find_params_filterdict_no_vim_nets(self
):
454 management_network_name in find_params.get('filterdict')
455 Any network could not be found in the VIM
458 logger
= "test_logger"
463 "management_network_name": "test_mgmt_name",
467 instance
= VimInteractionNet(db
, logger
, my_vims
, db_vims
)
468 with patch
.object(instance
, "my_vims", [self
.target_vim
]), patch
.object(
469 instance
, "logger", logging
475 "target_id": "vim_openstack_9",
476 "action_id": "123456",
478 "task_id": "123456:1",
479 "status": "SCHEDULED",
482 "target_record": "test_target_record",
483 "target_record_id": "test_target_record_id",
484 # values coming from extra_dict
488 "name": "some-network-name",
491 "name": "some_mgmt_name",
493 "depends_on": "test_depends_on",
498 task_index
= "task_index_9"
499 self
.target_vim
.get_network_list
.return_value
= []
500 with self
.assertLogs() as captured
:
501 result
= instance
.new(ro_task
, task_index
, self
.task_depends
)
502 self
.assertEqual(len(captured
.records
), 1)
504 "Network not found with this criteria"
505 in captured
.records
[0].getMessage()
507 self
.assertEqual(captured
.records
[0].levelname
, "ERROR")
508 self
.assertEqual(result
[0], "FAILED")
509 self
.assertEqual(result
[1].get("created"), False)
510 self
.assertEqual(result
[1].get("vim_status"), "VIM_ERROR")
512 def test__mgmt_net_name_in_find_params_mgmt_no_config_one_vim_net(self
):
515 management_network_name is not in db_vims.get('config')
516 One network found in the VIM
519 logger
= "test_logger"
522 "vim_openstack_10": {
526 instance
= VimInteractionNet(db
, logger
, my_vims
, db_vims
)
527 with patch
.object(instance
, "my_vims", [self
.target_vim
]), patch
.object(
528 instance
, "logger", logging
534 "target_id": "vim_openstack_10",
535 "action_id": "123456",
537 "task_id": "123456:1",
538 "status": "SCHEDULED",
541 "target_record": "test_target_record",
542 "target_record_id": "test_target_record_id",
543 # values coming from extra_dict
547 "name": "some_mgmt_name",
549 "depends_on": "test_depends_on",
554 task_index
= "task_index_2"
555 self
.target_vim
.get_network_list
.return_value
= [
556 {"id": "4d83a7c9-3ef4-4a45-99c8-aca3550490dd"}
558 result
= instance
.new(ro_task
, task_index
, self
.task_depends
)
559 self
.assertEqual(result
[0], "BUILD")
560 self
.assertEqual(result
[1].get("created"), False)
561 self
.assertEqual(result
[1].get("vim_status"), "BUILD")
563 def test__params_in_task_no_find_params(self
):
566 find_params does not exist in the task
569 logger
= "test_logger"
572 "vim_openstack_11": {
574 "management_network_name": "test_mgmt_name",
578 instance
= VimInteractionNet(db
, logger
, my_vims
, db_vims
)
579 with patch
.object(instance
, "my_vims", [self
.target_vim
]), patch
.object(
580 instance
, "logger", logging
586 "target_id": "vim_openstack_11",
587 "action_id": "123456",
589 "task_id": "123456:1",
590 "status": "SCHEDULED",
593 "target_record": "test_target_record",
594 "target_record_id": "test_target_record_id",
595 # values coming from extra_dict
597 "net_name": "test-network",
600 "depends_on": "test_depends_on",
605 task_index
= "task_index_11"
606 self
.target_vim
.new_network
.return_value
= "sample_net_id", {
607 "item1": "sample_created_item"
609 result
= instance
.new(ro_task
, task_index
, self
.task_depends
)
610 self
.assertEqual(result
[0], "BUILD")
611 self
.assertEqual(result
[1].get("vim_id"), "sample_net_id")
612 self
.assertEqual(result
[1].get("created"), True)
614 result
[1].get("created_items"), {"item1": "sample_created_item"}
616 self
.assertEqual(result
[1].get("vim_status"), "BUILD")
618 def test__no_params_in_task_no_find_params(self
):
620 empty params in the task
621 find_params does not exist in the task
624 logger
= "test_logger"
627 "vim_openstack_13": {
629 "management_network_name": "test_mgmt_name",
633 instance
= VimInteractionNet(db
, logger
, my_vims
, db_vims
)
634 with patch
.object(instance
, "my_vims", [self
.target_vim
]), patch
.object(
635 instance
, "logger", logging
641 "target_id": "vim_openstack_13",
642 "action_id": "123456",
644 "task_id": "123456:1",
645 "status": "SCHEDULED",
648 "target_record": "test_target_record",
649 "target_record_id": "test_target_record_id",
650 # values coming from extra_dict
652 "depends_on": "test_depends_on",
657 task_index
= "task_index_12"
658 self
.target_vim
.new_network
.side_effect
= VimConnConnectionException(
659 "VimConnConnectionException occurred."
661 with self
.assertLogs() as captured
:
662 instance
.new(ro_task
, task_index
, self
.task_depends
)
663 self
.assertEqual(captured
.records
[0].levelname
, "ERROR")
665 def test__refresh_ro_task_vim_status_active(self
):
667 vim_info.get('status') is ACTIVE
670 logger
= "test_logger"
677 instance
= VimInteractionNet(db
, logger
, my_vims
, db_vims
)
679 instance
, "my_vims", {"vim_openstack_1": self
.target_vim
}
680 ), patch
.object(instance
, "logger", logging
):
685 "target_id": "vim_openstack_1",
688 "created_items": None,
689 "vim_id": "test-vim-id",
690 "vim_name": "test-vim",
692 "vim_details": "some-details",
695 "modified_at": 1637324200.994312,
696 "created_at": 1637324200.994312,
697 "to_check_at": 1637324200.994312,
701 self
.target_vim
.refresh_nets_status
.return_value
= {
703 "vim_info": "some-details",
710 ro_vim_item_update
= {
711 "vim_status": "ACTIVE",
713 result
= instance
.refresh(ro_task
)
714 self
.assertEqual(result
[0], task_status
)
715 self
.assertDictEqual(result
[1], ro_vim_item_update
)
717 def test__refresh_ro_task_vim_status_build(self
):
719 vim_info.get('status') is BUILD
722 logger
= "test_logger"
729 instance
= VimInteractionNet(db
, logger
, my_vims
, db_vims
)
731 instance
, "my_vims", {"vim_openstack_1": self
.target_vim
}
732 ), patch
.object(instance
, "logger", logging
):
737 "target_id": "vim_openstack_1",
740 "created_items": None,
741 "vim_id": "test-vim-id",
742 "vim_name": "test-vim",
743 "vim_status": "BUILD",
747 "modified_at": 1637324200.994312,
748 "created_at": 1637324200.994312,
749 "to_check_at": 1637324200.994312,
753 self
.target_vim
.refresh_nets_status
.return_value
= {
755 "vim_info": "some-details",
761 task_status
= "BUILD"
762 ro_vim_item_update
= {
763 "vim_name": "other-vim",
764 "vim_details": "some-details",
766 result
= instance
.refresh(ro_task
)
767 self
.assertEqual(result
[0], task_status
)
768 self
.assertDictEqual(result
[1], ro_vim_item_update
)
770 def test__refresh_ro_task_vim_status_error(self
):
772 vim_info.get('status') is ERROR
775 logger
= "test_logger"
782 instance
= VimInteractionNet(db
, logger
, my_vims
, db_vims
)
784 instance
, "my_vims", {"vim_openstack_1": self
.target_vim
}
785 ), patch
.object(instance
, "logger", logging
):
790 "target_id": "vim_openstack_1",
793 "created_items": None,
794 "vim_id": "test-vim-id",
795 "vim_name": "test-vim",
796 "vim_status": "BUILD",
800 "modified_at": 1637324200.994312,
801 "created_at": 1637324200.994312,
802 "to_check_at": 1637324200.994312,
806 self
.target_vim
.refresh_nets_status
.return_value
= {
808 "vim_info": "some-details",
811 "error_msg": "some error message",
814 task_status
= "FAILED"
815 ro_vim_item_update
= {
816 "vim_status": "ERROR",
817 "vim_details": "some error message",
819 result
= instance
.refresh(ro_task
)
820 self
.assertEqual(result
[0], task_status
)
821 self
.assertDictEqual(result
[1], ro_vim_item_update
)
823 def test__refresh_ro_task_VimConnException_occurred(self
):
825 vimconn.VimConnException has occured
828 logger
= "test_logger"
835 instance
= VimInteractionNet(db
, logger
, my_vims
, db_vims
)
837 instance
, "my_vims", {"vim_openstack_1": self
.target_vim
}
838 ), patch
.object(instance
, "logger", logging
):
843 "target_id": "vim_openstack_1",
846 "created_items": None,
847 "vim_id": "test-vim-id",
848 "vim_name": "test-vim",
849 "vim_status": "BUILD",
853 "modified_at": 1637324200.994312,
854 "created_at": 1637324200.994312,
855 "to_check_at": 1637324200.994312,
858 self
.target_vim
.refresh_nets_status
.side_effect
= VimConnException(
859 "VimConnException occurred."
861 with self
.assertLogs() as captured
:
862 instance
.refresh(ro_task
)
863 self
.assertEqual(captured
.records
[0].levelname
, "ERROR")
865 def test__refresh_ro_task_vim_status_deleted(self
):
867 vim_info.get('status') is DELETED
870 logger
= "test_logger"
877 instance
= VimInteractionNet(db
, logger
, my_vims
, db_vims
)
879 instance
, "my_vims", {"vim_openstack_1": self
.target_vim
}
880 ), patch
.object(instance
, "logger", logging
):
885 "target_id": "vim_openstack_1",
888 "created_items": None,
889 "vim_id": "test-vim-id",
890 "vim_name": "test-vim",
891 "vim_status": "BUILD",
895 "modified_at": 163724200.994312,
896 "created_at": 1637324200.994312,
897 "to_check_at": 1637324200.994312,
900 self
.target_vim
.refresh_nets_status
.return_value
= {
902 "vim_info": "some-details",
905 "error_msg": "some error message",
908 task_status
= "FAILED"
909 ro_vim_item_update
= {
910 "vim_status": "DELETED",
911 "vim_details": "Deleted externally",
914 result
= instance
.refresh(ro_task
)
915 self
.assertEqual(result
[0], task_status
)
916 self
.assertDictEqual(result
[1], ro_vim_item_update
)
918 def test__refresh_ro_task_empty_vim_dict(self
):
920 vim_dict does not include vim_id key
924 logger
= "test_logger"
931 instance
= VimInteractionNet(db
, logger
, my_vims
, db_vims
)
933 instance
, "my_vims", {"vim_openstack_2": self
.target_vim
}
934 ), patch
.object(instance
, "logger", logging
):
939 "target_id": "vim_openstack_2",
942 "created_items": None,
943 "vim_id": "test-vim-id",
944 "vim_name": "test-vim",
945 "vim_status": "BUILD",
949 "modified_at": 163724211.994312,
950 "created_at": 1637324211.994312,
951 "to_check_at": 1637324211.994312,
954 self
.target_vim
.refresh_nets_status
.return_value
= {}
955 with self
.assertRaises(KeyError):
956 instance
.refresh(ro_task
)