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 #######################################################################################
19 from unittest
.mock
import MagicMock
, Mock
, patch
21 from osm_common
.dbmemory
import DbMemory
22 from osm_ng_ro
.ns_thread
import (
25 VimInteractionAffinityGroup
,
26 VimInteractionMigration
,
30 from osm_ro_plugin
.vimconn
import VimConnConnectionException
, VimConnException
32 # Variables used in tests
34 "my_target_vim": {"vim_type": "openstack"},
37 "my_target_vim": {"vim_type": "aws"},
41 class TestConfigValidate(unittest
.TestCase
):
47 "refresh_image": 3600,
53 def test__get_configuration(self
):
54 with self
.subTest(i
=1, t
="Get config attributes with config input"):
55 configuration
= ConfigValidate(self
.config_dict
)
56 self
.assertEqual(configuration
.active
, 65)
57 self
.assertEqual(configuration
.build
, 20)
58 self
.assertEqual(configuration
.image
, 3600)
59 self
.assertEqual(configuration
.error
, 300)
60 self
.assertEqual(configuration
.queue_size
, 50)
62 with self
.subTest(i
=2, t
="Unallowed refresh active input"):
63 # > 60 (except -1) is not allowed to set, so it should return default value 60
64 self
.config_dict
["period"]["refresh_active"] = 20
65 configuration
= ConfigValidate(self
.config_dict
)
66 self
.assertEqual(configuration
.active
, 60)
68 with self
.subTest(i
=3, t
="Config to disable VM status periodic checks"):
69 # -1 is allowed to set to disable VM status updates
70 self
.config_dict
["period"]["refresh_active"] = -1
71 configuration
= ConfigValidate(self
.config_dict
)
72 self
.assertEqual(configuration
.active
, -1)
75 class TestNsWorker(unittest
.TestCase
):
76 @patch("logging.getLogger", autospec
=True)
77 def setUp(self
, mock_logger
):
78 mock_logger
= logging
.getLogger()
79 mock_logger
.disabled
= True
80 self
.task_depends
= None
82 self
.db_vims
= db_vims_openstack
83 self
.db
= Mock(DbMemory())
84 self
.worker_index
= "worker-3"
89 "refresh_image": 3600,
93 "process_id": "343435353",
94 "global": {"task_locked_time": 16373242100.994312},
101 "target_id": "my_target_vim",
104 "created_items": None,
105 "vim_id": "test-vim-id",
106 "vim_name": "test-vim",
107 "vim_status": "DONE",
112 "modified_at": 1637324200.994312,
113 "created_at": 1637324200.994312,
114 "to_check_at": 16373242400.994312,
118 "action_id": "123456",
120 "task_id": "123456:1",
124 "target_record": "test_target_record",
125 "target_record_id": "test_target_record_id",
129 self
.instance
= NsWorker(self
.worker_index
, self
.config
, self
.plugins
, self
.db
)
130 self
.instance
.db_vims
= db_vims_openstack
131 self
.instance
.refresh_config
= Mock()
133 def get_disabled_tasks(self
, db
, status
):
134 db_disabled_tasks
= db
.get_list(
137 "tasks.status": status
,
141 return db_disabled_tasks
143 def test_update_vm_refresh_disabled_task_with_status_build_vim_openstack_with_refresh(
146 """1 disabled task with status BUILD in DB, refresh_active parameter is not equal to -1."""
147 # Disabled task with status build is not enabled again
149 self
.ro_task
["tasks"][0]["status"] = "BUILD"
150 self
.config
["period"]["refresh_active"] = 70
151 self
.ro_task
["to_check_at"] = -1
152 db
.create("ro_tasks", self
.ro_task
)
153 disabled_tasks_count
= len(self
.get_disabled_tasks(db
, "BUILD"))
154 instance
= NsWorker(self
.worker_index
, self
.config
, self
.plugins
, db
)
155 instance
.update_vm_refresh(self
.ro_task
)
157 len(self
.get_disabled_tasks(db
, "BUILD")), disabled_tasks_count
160 def test_update_vm_refresh_disabled_task_with_status_done_vim_openstack_no_refresh(
163 """1 disabled task with status DONE in DB, refresh_active parameter is equal to -1."""
164 # As refresh_active parameter is equal to -1, task is not be enabled to process again
166 self
.config
["period"]["refresh_active"] = -1
167 self
.ro_task
["tasks"][0]["status"] = "DONE"
168 self
.ro_task
["to_check_at"] = -1
169 db
.create("ro_tasks", self
.ro_task
)
170 disabled_tasks_count
= len(self
.get_disabled_tasks(db
, "DONE"))
171 instance
= NsWorker(self
.worker_index
, self
.config
, self
.plugins
, db
)
172 instance
.update_vm_refresh(self
.ro_task
)
173 self
.assertEqual(len(self
.get_disabled_tasks(db
, "DONE")), disabled_tasks_count
)
175 def test_update_vm_refresh_disabled_task_with_status_done_vim_aws_with_refresh(
178 """2 disabled task with status DONE in DB, refresh_active parameter is not equal to -1."""
179 # Disabled tasks should be enabled to process again as vim type aws
181 self
.config
["period"]["refresh_active"] = 66
182 self
.ro_task
["tasks"][0]["status"] = "DONE"
183 self
.ro_task
["to_check_at"] = -1
184 db
.create("ro_tasks", self
.ro_task
)
185 self
.ro_task2
= self
.ro_task
186 self
.ro_task2
["_id"] = "122437:1"
187 db
.create("ro_tasks", self
.ro_task2
)
188 disabled_tasks_count
= len(self
.get_disabled_tasks(db
, "DONE"))
189 instance
= NsWorker(self
.worker_index
, self
.config
, self
.plugins
, db
)
190 with patch
.object(instance
, "db_vims", db_vims_aws
):
191 instance
.update_vm_refresh(self
.ro_task
)
193 len(self
.get_disabled_tasks(db
, "DONE")), disabled_tasks_count
- 2
196 def test_update_vm_refresh_no_disabled_task_with_status_done_vim_openstack_with_refresh(
199 """No disabled task with status DONE in DB, refresh_active parameter is not equal to -1."""
200 # There is not any disabled task, method does not change anything
202 self
.config
["period"]["refresh_active"] = 66
203 self
.ro_task
["tasks"][0]["status"] = "DONE"
204 self
.ro_task
["to_check_at"] = 16373242400.994312
205 db
.create("ro_tasks", self
.ro_task
)
206 self
.ro_task2
= self
.ro_task
207 self
.ro_task2
["_id"] = "122437:1"
208 db
.create("ro_tasks", self
.ro_task2
)
209 disabled_tasks_count
= len(self
.get_disabled_tasks(db
, "DONE"))
210 instance
= NsWorker(self
.worker_index
, self
.config
, self
.plugins
, db
)
211 instance
.update_vm_refresh(self
.ro_task
)
212 self
.assertEqual(len(self
.get_disabled_tasks(db
, "DONE")), disabled_tasks_count
)
214 def test_update_vm_refresh_disabled_task_with_status_done_vim_openstack_with_refresh(
217 """1 disabled task with status DONE in DB, refresh_active parameter is equal to -1, vim type is Openstack."""
218 # Disabled task with status done is not enabled again as vim type is openstack
220 self
.ro_task
["tasks"][0]["status"] = "DONE"
221 self
.ro_task
["to_check_at"] = -1
222 db
.create("ro_tasks", self
.ro_task
)
223 disabled_tasks_count
= len(self
.get_disabled_tasks(db
, "DONE"))
224 instance
= NsWorker(self
.worker_index
, self
.config
, self
.plugins
, db
)
225 instance
.update_vm_refresh(self
.ro_task
)
226 self
.assertEqual(len(self
.get_disabled_tasks(db
, "DONE")), disabled_tasks_count
)
228 def test_process_pending_tasks_status_done_vim_aws_no_refresh(self
):
229 """Refresh_active parameter is equal to -1, task status is DONE."""
230 # Task should be disabled to process again
232 self
.config
["period"]["refresh_active"] = -1
233 self
.ro_task
["tasks"][0]["status"] = "DONE"
234 self
.ro_task
["to_check_at"] = 16373242400.994312
235 db
.create("ro_tasks", self
.ro_task
)
236 # Number of disabled tasks in DB
237 disabled_tasks_count
= len(self
.get_disabled_tasks(db
, "DONE"))
238 instance
= NsWorker(self
.worker_index
, self
.config
, self
.plugins
, db
)
239 with patch
.object(instance
, "db_vims", db_vims_aws
):
240 instance
._process
_pending
_tasks
(self
.ro_task
)
242 len(self
.get_disabled_tasks(db
, "DONE")), disabled_tasks_count
+ 1
245 def test_process_pending_tasks_status_failed_vim_aws_no_refresh(self
):
246 """Refresh_active parameter is equal to -1, task status is FAILED."""
247 # Task is not disabled to process as task status is not DONE
249 self
.config
["period"]["refresh_active"] = -1
250 self
.ro_task
["tasks"][0]["status"] = "FAILED"
251 self
.ro_task
["to_check_at"] = 16373242400.994312
252 db
.create("ro_tasks", self
.ro_task
)
253 disabled_tasks_count
= len(self
.get_disabled_tasks(db
, "FAILED"))
254 instance
= NsWorker(self
.worker_index
, self
.config
, self
.plugins
, db
)
255 with patch
.object(instance
, "db_vims", db_vims_aws
):
256 instance
._process
_pending
_tasks
(self
.ro_task
)
258 len(self
.get_disabled_tasks(db
, "FAILED")), disabled_tasks_count
261 def test_process_pending_tasks_status_done_vim_aws_with_refresh(self
):
262 """Refresh_active parameter is not equal to -1, task status is DONE."""
263 # Task is not disabled to process as refresh_active parameter is not -1
265 self
.config
["period"]["refresh_active"] = 70
266 self
.ro_task
["tasks"][0]["status"] = "DONE"
267 self
.ro_task
["to_check_at"] = 16373242400.994312
268 db
.create("ro_tasks", self
.ro_task
)
269 disabled_tasks_count
= len(self
.get_disabled_tasks(db
, "DONE"))
270 instance
= NsWorker(self
.worker_index
, self
.config
, self
.plugins
, db
)
271 with patch
.object(instance
, "db_vims", db_vims_aws
):
272 instance
._process
_pending
_tasks
(self
.ro_task
)
274 len(self
.get_disabled_tasks(db
, "DONE")), disabled_tasks_count
278 class TestVimInteractionNet(unittest
.TestCase
):
280 module_name
= "osm_ro_plugin"
281 self
.target_vim
= MagicMock(name
=f
"{module_name}.vimconn.VimConnector")
282 self
.task_depends
= None
284 patches
= [patch(f
"{module_name}.vimconn.VimConnector", self
.target_vim
)]
286 # Enabling mocks and add cleanups
289 self
.addCleanup(mock
.stop
)
291 def test__mgmt_net_id_in_find_params_mgmt_several_vim_nets(self
):
293 mgmt network is set in find_params
294 management_network_id in vim config
295 More than one network found in the VIM
298 logger
= "test_logger"
303 "management_network_id": "test_mgmt_id",
308 instance
= VimInteractionNet(db
, logger
, my_vims
, db_vims
)
309 with patch
.object(instance
, "my_vims", [self
.target_vim
]), patch
.object(
310 instance
, "logger", logging
311 ), patch
.object(instance
, "db_vims", db_vims
):
317 "action_id": "123456",
319 "task_id": "123456:1",
320 "status": "SCHEDULED",
323 "target_record": "test_target_record",
324 "target_record_id": "test_target_record_id",
325 # values coming from extra_dict
329 "name": "some_mgmt_name",
331 "depends_on": "test_depends_on",
336 task_index
= "task_index_2"
337 self
.target_vim
.get_network_list
.return_value
= [
338 {"id": "existing_net_1"},
339 {"id": "existing_net_2"},
341 with self
.assertLogs() as captured
:
342 result
= instance
.new(ro_task
, task_index
, self
.task_depends
)
343 self
.assertEqual(len(captured
.records
), 1)
345 "More than one network found with this criteria"
346 in captured
.records
[0].getMessage()
348 self
.assertEqual(captured
.records
[0].levelname
, "ERROR")
349 self
.assertEqual(result
[0], "FAILED")
350 self
.assertEqual(result
[1].get("created"), False)
351 self
.assertEqual(result
[1].get("vim_status"), "VIM_ERROR")
353 def test__mgmt_net_id_in_find_params_mgmt_no_vim_nets(self
):
355 mgmt network is set in find_params
356 management_network_id in vim config
357 The network could not be found in the VIM
360 logger
= "test_logger"
365 "management_network_id": "test_mgmt_id",
370 instance
= VimInteractionNet(db
, logger
, my_vims
, db_vims
)
371 with patch
.object(instance
, "my_vims", [self
.target_vim
]), patch
.object(
372 instance
, "db_vims", db_vims
373 ), patch
.object(instance
, "logger", logging
):
379 "action_id": "123456",
381 "task_id": "123456:1",
382 "status": "SCHEDULED",
385 "target_record": "test_target_record",
386 "target_record_id": "test_target_record_id",
388 # values coming from extra_dict
391 "name": "some_mgmt_name",
393 "depends_on": "test_depends_on",
398 task_index
= "task_index_3"
399 self
.target_vim
.get_network_list
.return_value
= []
400 with self
.assertLogs() as captured
:
401 result
= instance
.new(ro_task
, task_index
, self
.task_depends
)
402 self
.assertEqual(len(captured
.records
), 1)
404 "Network not found with this criteria"
405 in captured
.records
[0].getMessage()
407 self
.assertEqual(captured
.records
[0].levelname
, "ERROR")
408 self
.assertEqual(result
[0], "FAILED")
409 self
.assertEqual(result
[1].get("created"), False)
410 self
.assertEqual(result
[1].get("vim_status"), "VIM_ERROR")
412 def test__mgmt_net_in_find_params_no_vim_config_no_vim_nets(self
):
414 mgmt network is set in find_params
415 vim config does not have management_network_id or management_network_id
416 The network could not be found in the VIM
419 logger
= "test_logger"
427 instance
= VimInteractionNet(db
, logger
, my_vims
, db_vims
)
428 with patch
.object(instance
, "my_vims", [self
.target_vim
]), patch
.object(
429 instance
, "db_vims", db_vims
430 ), patch
.object(instance
, "logger", logging
):
436 "action_id": "123456",
438 "task_id": "123456:1",
439 "status": "SCHEDULED",
442 "target_record": "test_target_record",
443 "target_record_id": "test_target_record_id",
445 # values coming from extra_dict
448 "name": "some_mgmt_name",
450 "depends_on": "test_depends_on",
455 task_index
= "task_index_3"
456 self
.target_vim
.get_network_list
.return_value
= []
457 self
.target_vim
.new_network
.return_value
= "sample_net_id", {
458 "item1": "sample_created_item"
460 result
= instance
.new(ro_task
, task_index
, self
.task_depends
)
461 self
.assertEqual(result
[0], "BUILD")
462 self
.assertEqual(result
[1].get("vim_id"), "sample_net_id")
463 self
.assertEqual(result
[1].get("created"), True)
464 self
.assertDictEqual(
465 result
[1].get("created_items"), {"item1": "sample_created_item"}
467 self
.assertEqual(result
[1].get("vim_status"), "BUILD")
469 def test__mgmt_net_name_in_find_params_mgmt_several_vim_nets(self
):
471 mgmt network is set in find_params
472 management_network_name in vim config
473 More than one network found in the VIM
476 logger
= "test_logger"
481 "management_network_name": "test_mgmt_name",
486 instance
= VimInteractionNet(db
, logger
, my_vims
, db_vims
)
487 with patch
.object(instance
, "my_vims", [self
.target_vim
]), patch
.object(
488 instance
, "logger", logging
489 ), patch
.object(instance
, "db_vims", db_vims
):
495 "action_id": "123456",
497 "task_id": "123456:1",
498 "status": "SCHEDULED",
501 "target_record": "test_target_record",
502 "target_record_id": "test_target_record_id",
503 # values coming from extra_dict
507 "name": "some_mgmt_name",
509 "depends_on": "test_depends_on",
514 task_index
= "task_index_4"
515 self
.target_vim
.get_network_list
.return_value
= [
516 {"id": "existing_net_1"},
517 {"id": "existing_net_2"},
519 with self
.assertLogs() as captured
:
520 result
= instance
.new(ro_task
, task_index
, self
.task_depends
)
521 self
.assertEqual(len(captured
.records
), 1)
523 "More than one network found with this criteria"
524 in captured
.records
[0].getMessage()
526 self
.assertEqual(captured
.records
[0].levelname
, "ERROR")
527 self
.assertEqual(result
[0], "FAILED")
528 self
.assertEqual(result
[1].get("created"), False)
529 self
.assertEqual(result
[1].get("vim_status"), "VIM_ERROR")
531 def test__mgmt_net_name_in_find_params_mgmt_no_vim_nets(self
):
533 mgmt network is set in find_params
534 management_network_name in vim config
535 The network could not be found in the VIM
538 logger
= "test_logger"
543 "management_network_name": "test_mgmt_name",
548 instance
= VimInteractionNet(db
, logger
, my_vims
, db_vims
)
549 with patch
.object(instance
, "my_vims", [self
.target_vim
]), patch
.object(
550 instance
, "logger", logging
551 ), patch
.object(instance
, "db_vims", db_vims
):
557 "action_id": "123456",
559 "task_id": "123456:1",
560 "status": "SCHEDULED",
563 "target_record": "test_target_record",
564 "target_record_id": "test_target_record_id",
565 # values coming from extra_dict
569 "name": "some_mgmt_name",
571 "depends_on": "test_depends_on",
576 task_index
= "task_index_5"
577 self
.target_vim
.get_network_list
.return_value
= []
578 with self
.assertLogs() as captured
:
579 result
= instance
.new(ro_task
, task_index
, self
.task_depends
)
580 self
.assertEqual(len(captured
.records
), 1)
582 "Network not found with this criteria"
583 in captured
.records
[0].getMessage()
585 self
.assertEqual(captured
.records
[0].levelname
, "ERROR")
586 self
.assertEqual(result
[0], "FAILED")
587 self
.assertEqual(result
[1].get("created"), False)
588 self
.assertEqual(result
[1].get("vim_status"), "VIM_ERROR")
590 def test__mgmt_net_name_in_find_params_filterdict_several_vim_nets(self
):
592 mgmt network is set in find_params
593 management_network_name in vim config
594 network_name is set in find_params.get('filterdict')
595 More than one network found in the VIM
598 logger
= "test_logger"
603 "management_network_name": "test_mgmt_name",
607 instance
= VimInteractionNet(db
, logger
, my_vims
, db_vims
)
608 with patch
.object(instance
, "my_vims", [self
.target_vim
]), patch
.object(
609 instance
, "logger", logging
610 ), patch
.object(instance
, "db_vims", db_vims
):
616 "action_id": "123456",
618 "task_id": "123456:1",
619 "status": "SCHEDULED",
622 "target_record": "test_target_record",
623 "target_record_id": "test_target_record_id",
624 # values coming from extra_dict
628 "name": "some-network-name",
631 "name": "some_mgmt_name",
633 "depends_on": "test_depends_on",
638 task_index
= "task_index_6"
639 self
.target_vim
.get_network_list
.return_value
= [
640 {"id": "existing_net_1"},
641 {"id": "existing_net_2"},
643 with self
.assertLogs() as captured
:
644 result
= instance
.new(ro_task
, task_index
, self
.task_depends
)
645 self
.assertEqual(len(captured
.records
), 1)
647 "More than one network found with this criteria"
648 in captured
.records
[0].getMessage()
650 self
.assertEqual(captured
.records
[0].levelname
, "ERROR")
651 self
.assertEqual(result
[0], "FAILED")
652 self
.assertEqual(result
[1].get("created"), False)
653 self
.assertEqual(result
[1].get("vim_status"), "VIM_ERROR")
655 def test__mgmt_net_name_in_find_params_no_filterdict_no_mgmt(self
):
657 There is find_params in the task
658 No mgmt in find_params
659 No filter_dict in find_params
662 logger
= "test_logger"
667 "management_network_name": "test_mgmt_name",
671 instance
= VimInteractionNet(db
, logger
, my_vims
, db_vims
)
672 with patch
.object(instance
, "my_vims", [self
.target_vim
]), patch
.object(
673 instance
, "logger", logging
674 ), patch
.object(instance
, "db_vims", db_vims
):
680 "action_id": "123456",
682 "task_id": "123456:1",
683 "status": "SCHEDULED",
686 "target_record": "test_target_record",
687 "target_record_id": "test_target_record_id",
688 # values coming from extra_dict
690 "find_params": {"wrong_param": "wrong_value"},
691 "depends_on": "test_depends_on",
696 task_index
= "task_index_4"
697 with self
.assertLogs() as captured
:
698 result
= instance
.new(ro_task
, task_index
, self
.task_depends
)
699 self
.assertEqual(len(captured
.records
), 1)
701 "Invalid find_params for new_net"
702 in captured
.records
[0].getMessage()
704 self
.assertEqual(captured
.records
[0].levelname
, "ERROR")
705 self
.assertEqual(result
[0], "FAILED")
706 self
.assertEqual(result
[1].get("created"), False)
707 self
.assertEqual(result
[1].get("vim_status"), "VIM_ERROR")
709 def test__mgmt_net_name_in_find_params_filterdict_no_vim_nets_params_in_task(self
):
711 management_network_name in find_params.get('filterdict')
712 The network could not be found in the VIM
713 There are items in the task.get(params)
716 logger
= "test_logger"
721 "management_network_name": "test_mgmt_name",
725 instance
= VimInteractionNet(db
, logger
, my_vims
, db_vims
)
726 with patch
.object(instance
, "my_vims", [self
.target_vim
]), patch
.object(
727 instance
, "logger", logging
728 ), patch
.object(instance
, "db_vims", db_vims
):
734 "action_id": "123456",
736 "task_id": "123456:1",
737 "status": "SCHEDULED",
740 "target_record": "test_target_record",
741 "target_record_id": "test_target_record_id",
742 # values coming from extra_dict
744 "net_name": "test_params",
748 "name": "some-network-name",
751 "name": "some_mgmt_name",
753 "depends_on": "test_depends_on",
758 task_index
= "task_index_8"
759 self
.target_vim
.get_network_list
.return_value
= []
760 result
= instance
.new(ro_task
, task_index
, self
.task_depends
)
761 self
.assertEqual(result
[0], "BUILD")
762 self
.assertEqual(result
[1].get("created"), False)
763 self
.assertEqual(result
[1].get("vim_id"), None)
764 self
.assertEqual(result
[1].get("created_items"), {})
765 self
.assertEqual(result
[1].get("vim_status"), "BUILD")
767 def test__mgmt_net_name_in_find_params_filterdict_no_vim_nets(self
):
769 mgmt network is set in find_params
770 management_network_name in vim config
771 network_name is set in find_params.get('filterdict')
772 Any network could not be found in the VIM
775 logger
= "test_logger"
780 "management_network_name": "test_mgmt_name",
784 instance
= VimInteractionNet(db
, logger
, my_vims
, db_vims
)
785 with patch
.object(instance
, "my_vims", [self
.target_vim
]), patch
.object(
786 instance
, "logger", logging
787 ), patch
.object(instance
, "db_vims", db_vims
):
793 "action_id": "123456",
795 "task_id": "123456:1",
796 "status": "SCHEDULED",
799 "target_record": "test_target_record",
800 "target_record_id": "test_target_record_id",
801 # values coming from extra_dict
805 "name": "some-network-name",
808 "name": "some_mgmt_name",
810 "depends_on": "test_depends_on",
815 task_index
= "task_index_9"
816 self
.target_vim
.get_network_list
.return_value
= []
817 with self
.assertLogs() as captured
:
818 result
= instance
.new(ro_task
, task_index
, self
.task_depends
)
819 self
.assertEqual(len(captured
.records
), 1)
821 "Network not found with this criteria"
822 in captured
.records
[0].getMessage()
824 self
.assertEqual(captured
.records
[0].levelname
, "ERROR")
825 self
.assertEqual(result
[0], "FAILED")
826 self
.assertEqual(result
[1].get("created"), False)
827 self
.assertEqual(result
[1].get("vim_status"), "VIM_ERROR")
829 def test__mgmt_net_in_find_params_filterdict_no_config_no_vim_nets(self
):
831 mgmt network is set in find_params
833 network_name is set in find_params.get('filterdict')
834 Any network could not be found in the VIM
837 logger
= "test_logger"
844 instance
= VimInteractionNet(db
, logger
, my_vims
, db_vims
)
845 with patch
.object(instance
, "my_vims", [self
.target_vim
]), patch
.object(
846 instance
, "logger", logging
847 ), patch
.object(instance
, "db_vims", db_vims
):
853 "action_id": "123456",
855 "task_id": "123456:1",
856 "status": "SCHEDULED",
859 "target_record": "test_target_record",
860 "target_record_id": "test_target_record_id",
861 # values coming from extra_dict
865 "name": "some-network-name",
868 "name": "some_mgmt_name",
870 "depends_on": "test_depends_on",
875 task_index
= "task_index_9"
876 self
.target_vim
.get_network_list
.return_value
= []
877 with self
.assertLogs() as captured
:
878 result
= instance
.new(ro_task
, task_index
, self
.task_depends
)
879 self
.assertEqual(len(captured
.records
), 1)
881 "Network not found with this criteria"
882 in captured
.records
[0].getMessage()
884 self
.assertEqual(captured
.records
[0].levelname
, "ERROR")
885 self
.assertEqual(result
[0], "FAILED")
886 self
.assertEqual(result
[1].get("created"), False)
887 self
.assertEqual(result
[1].get("vim_status"), "VIM_ERROR")
889 def test__mgmt_net_name_in_find_params_mgmt_no_config_one_vim_net(self
):
891 mgmt network is set in find_params
892 management_network_name is not in db_vims.get('config')
893 One network found in the VIM
896 logger
= "test_logger"
903 instance
= VimInteractionNet(db
, logger
, my_vims
, db_vims
)
904 with patch
.object(instance
, "my_vims", [self
.target_vim
]), patch
.object(
905 instance
, "logger", logging
906 ), patch
.object(instance
, "db_vims", db_vims
):
912 "action_id": "123456",
914 "task_id": "123456:1",
915 "status": "SCHEDULED",
918 "target_record": "test_target_record",
919 "target_record_id": "test_target_record_id",
920 # values coming from extra_dict
924 "name": "some_mgmt_name",
926 "depends_on": "test_depends_on",
931 task_index
= "task_index_2"
932 self
.target_vim
.get_network_list
.return_value
= [
933 {"id": "4d83a7c9-3ef4-4a45-99c8-aca3550490dd"}
935 result
= instance
.new(ro_task
, task_index
, self
.task_depends
)
936 self
.assertEqual(result
[0], "BUILD")
937 self
.assertEqual(result
[1].get("created"), False)
938 self
.assertEqual(result
[1].get("vim_status"), "BUILD")
940 def test__params_in_task_no_find_params(self
):
943 find_params does not exist in the task
946 logger
= "test_logger"
951 "management_network_name": "test_mgmt_name",
955 instance
= VimInteractionNet(db
, logger
, my_vims
, db_vims
)
956 with patch
.object(instance
, "my_vims", [self
.target_vim
]), patch
.object(
957 instance
, "logger", logging
958 ), patch
.object(instance
, "db_vims", db_vims
):
964 "action_id": "123456",
966 "task_id": "123456:1",
967 "status": "SCHEDULED",
970 "target_record": "test_target_record",
971 "target_record_id": "test_target_record_id",
972 # values coming from extra_dict
974 "net_name": "test-network",
977 "depends_on": "test_depends_on",
982 task_index
= "task_index_11"
983 self
.target_vim
.new_network
.return_value
= "sample_net_id", {
984 "item1": "sample_created_item"
986 result
= instance
.new(ro_task
, task_index
, self
.task_depends
)
987 self
.assertEqual(result
[0], "BUILD")
988 self
.assertEqual(result
[1].get("vim_id"), "sample_net_id")
989 self
.assertEqual(result
[1].get("created"), True)
991 result
[1].get("created_items"), {"item1": "sample_created_item"}
993 self
.assertEqual(result
[1].get("vim_status"), "BUILD")
995 def test__no_params_in_task_no_find_params(self
):
997 empty params in the task
998 find_params does not exist in the task
1001 logger
= "test_logger"
1002 my_vims
= "test-vim"
1006 "management_network_name": "test_mgmt_name",
1010 instance
= VimInteractionNet(db
, logger
, my_vims
, db_vims
)
1011 with patch
.object(instance
, "my_vims", [self
.target_vim
]), patch
.object(
1012 instance
, "logger", logging
1013 ), patch
.object(instance
, "db_vims", db_vims
):
1019 "action_id": "123456",
1021 "task_id": "123456:1",
1022 "status": "SCHEDULED",
1024 "item": "test_item",
1025 "target_record": "test_target_record",
1026 "target_record_id": "test_target_record_id",
1027 # values coming from extra_dict
1029 "depends_on": "test_depends_on",
1034 task_index
= "task_index_12"
1035 self
.target_vim
.new_network
.side_effect
= VimConnConnectionException(
1036 "VimConnConnectionException occurred."
1038 with self
.assertLogs() as captured
:
1039 instance
.new(ro_task
, task_index
, self
.task_depends
)
1040 self
.assertEqual(captured
.records
[0].levelname
, "ERROR")
1042 def test__refresh_ro_task_vim_status_active(self
):
1044 vim_info.get('status') is ACTIVE
1047 logger
= "test_logger"
1048 my_vims
= "test-vim"
1050 "vim_openstack_1": {
1052 "vim_type": "openstack",
1055 instance
= VimInteractionNet(db
, logger
, my_vims
, db_vims
)
1057 instance
, "my_vims", {"vim_openstack_1": self
.target_vim
}
1058 ), patch
.object(instance
, "logger", logging
), patch
.object(
1059 instance
, "db_vims", db_vims
1065 "target_id": "vim_openstack_1",
1068 "created_items": None,
1069 "vim_id": "test-vim-id",
1070 "vim_name": "test-vim",
1072 "vim_details": "some-details",
1073 "vim_message": None,
1076 "modified_at": 1637324200.994312,
1077 "created_at": 1637324200.994312,
1078 "to_check_at": 1637324200.994312,
1082 self
.target_vim
.refresh_nets_status
.return_value
= {
1084 "vim_info": "some-details",
1090 task_status
= "DONE"
1091 ro_vim_item_update
= {
1092 "vim_status": "ACTIVE",
1094 result
= instance
.refresh(ro_task
)
1095 self
.assertEqual(result
[0], task_status
)
1096 self
.assertDictEqual(result
[1], ro_vim_item_update
)
1098 def test__refresh_ro_task_vim_status_build(self
):
1100 vim_info.get('status') is BUILD
1103 logger
= "test_logger"
1104 my_vims
= "test-vim"
1106 "vim_openstack_1": {
1108 "vim_type": "openstack",
1111 instance
= VimInteractionNet(db
, logger
, my_vims
, db_vims
)
1113 instance
, "my_vims", {"vim_openstack_1": self
.target_vim
}
1114 ), patch
.object(instance
, "logger", logging
), patch
.object(
1115 instance
, "db_vims", db_vims
1121 "target_id": "vim_openstack_1",
1124 "created_items": None,
1125 "vim_id": "test-vim-id",
1126 "vim_name": "test-vim",
1127 "vim_status": "BUILD",
1129 "vim_message": None,
1132 "modified_at": 1637324200.994312,
1133 "created_at": 1637324200.994312,
1134 "to_check_at": 1637324200.994312,
1138 self
.target_vim
.refresh_nets_status
.return_value
= {
1140 "vim_info": "some-details",
1142 "name": "other-vim",
1146 task_status
= "BUILD"
1147 ro_vim_item_update
= {
1148 "vim_name": "other-vim",
1149 "vim_details": "some-details",
1151 result
= instance
.refresh(ro_task
)
1152 self
.assertEqual(result
[0], task_status
)
1153 self
.assertDictEqual(result
[1], ro_vim_item_update
)
1155 def test__refresh_ro_task_vim_status_error(self
):
1157 vim_info.get('status') is ERROR
1160 logger
= "test_logger"
1161 my_vims
= "test-vim"
1163 "vim_openstack_1": {
1165 "vim_type": "openstack",
1168 instance
= VimInteractionNet(db
, logger
, my_vims
, db_vims
)
1170 instance
, "my_vims", {"vim_openstack_1": self
.target_vim
}
1171 ), patch
.object(instance
, "logger", logging
), patch
.object(
1172 instance
, "db_vims", db_vims
1178 "target_id": "vim_openstack_1",
1181 "created_items": None,
1182 "vim_id": "test-vim-id",
1183 "vim_name": "test-vim",
1184 "vim_status": "BUILD",
1186 "vim_message": None,
1189 "modified_at": 1637324200.994312,
1190 "created_at": 1637324200.994312,
1191 "to_check_at": 1637324200.994312,
1195 self
.target_vim
.refresh_nets_status
.return_value
= {
1197 "vim_info": "some-details",
1200 "error_msg": "some error message",
1203 task_status
= "FAILED"
1204 ro_vim_item_update
= {
1205 "vim_status": "ERROR",
1206 "vim_message": "some error message",
1208 result
= instance
.refresh(ro_task
)
1209 self
.assertEqual(result
[0], task_status
)
1210 self
.assertDictEqual(result
[1], ro_vim_item_update
)
1212 def test__refresh_ro_task_VimConnException_occurred(self
):
1214 vimconn.VimConnException has occured
1217 logger
= "test_logger"
1218 my_vims
= "test-vim"
1220 "vim_openstack_1": {
1222 "vim_type": "openstack",
1225 instance
= VimInteractionNet(db
, logger
, my_vims
, db_vims
)
1227 instance
, "my_vims", {"vim_openstack_1": self
.target_vim
}
1228 ), patch
.object(instance
, "logger", logging
), patch
.object(
1229 instance
, "db_vims", db_vims
1235 "target_id": "vim_openstack_1",
1238 "created_items": None,
1239 "vim_id": "test-vim-id",
1240 "vim_name": "test-vim",
1241 "vim_status": "BUILD",
1243 "vim_message": None,
1246 "modified_at": 1637324200.994312,
1247 "created_at": 1637324200.994312,
1248 "to_check_at": 1637324200.994312,
1251 self
.target_vim
.refresh_nets_status
.side_effect
= VimConnException(
1252 "VimConnException occurred."
1254 with self
.assertLogs() as captured
:
1255 instance
.refresh(ro_task
)
1256 self
.assertEqual(captured
.records
[0].levelname
, "ERROR")
1258 def test__refresh_ro_task_vim_status_deleted(self
):
1260 vim_info.get('status') is DELETED
1263 logger
= "test_logger"
1264 my_vims
= "test-vim"
1266 "vim_openstack_1": {
1268 "vim_type": "openstack",
1271 instance
= VimInteractionNet(db
, logger
, my_vims
, db_vims
)
1273 instance
, "my_vims", {"vim_openstack_1": self
.target_vim
}
1274 ), patch
.object(instance
, "logger", logging
), patch
.object(
1275 instance
, "db_vims", db_vims
1281 "target_id": "vim_openstack_1",
1284 "created_items": None,
1285 "vim_id": "test-vim-id",
1286 "vim_name": "test-vim",
1287 "vim_status": "BUILD",
1289 "vim_message": None,
1292 "modified_at": 163724200.994312,
1293 "created_at": 1637324200.994312,
1294 "to_check_at": 1637324200.994312,
1297 self
.target_vim
.refresh_nets_status
.return_value
= {
1299 "vim_info": "some-details",
1300 "status": "DELETED",
1302 "error_msg": "some error message",
1305 task_status
= "FAILED"
1306 ro_vim_item_update
= {
1307 "vim_status": "DELETED",
1308 "vim_message": "Deleted externally",
1311 result
= instance
.refresh(ro_task
)
1312 self
.assertEqual(result
[0], task_status
)
1313 self
.assertDictEqual(result
[1], ro_vim_item_update
)
1315 def test__refresh_ro_task_empty_vim_dict(self
):
1317 vim_dict does not include vim_id key
1321 logger
= "test_logger"
1322 my_vims
= "test-vim"
1324 "vim_openstack_2": {
1328 instance
= VimInteractionNet(db
, logger
, my_vims
, db_vims
)
1330 instance
, "my_vims", {"vim_openstack_2": self
.target_vim
}
1331 ), patch
.object(instance
, "logger", logging
), patch
.object(
1332 instance
, "db_vims", db_vims
1338 "target_id": "vim_openstack_2",
1341 "created_items": None,
1342 "vim_id": "test-vim-id",
1343 "vim_name": "test-vim",
1344 "vim_status": "BUILD",
1346 "vim_message": None,
1349 "modified_at": 163724211.994312,
1350 "created_at": 1637324211.994312,
1351 "to_check_at": 1637324211.994312,
1354 self
.target_vim
.refresh_nets_status
.return_value
= {}
1355 with self
.assertRaises(KeyError):
1356 instance
.refresh(ro_task
)
1359 class TestVimInteractionAffinityGroup(unittest
.TestCase
):
1361 module_name
= "osm_ro_plugin"
1362 self
.target_vim
= MagicMock(name
=f
"{module_name}.vimconn.VimConnector")
1363 self
.task_depends
= None
1365 patches
= [patch(f
"{module_name}.vimconn.VimConnector", self
.target_vim
)]
1367 # Enabling mocks and add cleanups
1368 for mock
in patches
:
1370 self
.addCleanup(mock
.stop
)
1372 def test__new_affinity_group_ok(self
):
1374 create affinity group with attributes set in params
1377 logger
= "test_logger"
1378 my_vims
= "test-vim"
1385 instance
= VimInteractionAffinityGroup(db
, logger
, my_vims
, db_vims
)
1386 with patch
.object(instance
, "my_vims", [self
.target_vim
]), patch
.object(
1387 instance
, "logger", logging
1388 ), patch
.object(instance
, "db_vims", db_vims
):
1394 "action_id": "123456",
1396 "task_id": "123456:1",
1397 "status": "SCHEDULED",
1399 "item": "test_item",
1400 "target_record": "test_target_record",
1401 "target_record_id": "test_target_record_id",
1402 # values coming from extra_dict
1404 "affinity_group_data": {
1405 "name": "affinity_group_1",
1407 "scope": "nfvi-node",
1411 "depends_on": "test_depends_on",
1416 task_index
= "task_index_1"
1417 self
.target_vim
.new_affinity_group
.return_value
= (
1418 "sample_affinity_group_id_1"
1420 result
= instance
.new(ro_task
, task_index
, self
.task_depends
)
1421 self
.assertEqual(result
[0], "DONE")
1422 self
.assertEqual(result
[1].get("vim_id"), "sample_affinity_group_id_1")
1423 self
.assertEqual(result
[1].get("created"), True)
1424 self
.assertEqual(result
[1].get("vim_status"), "DONE")
1426 def test__new_affinity_group_failed(self
):
1428 create affinity group with no attributes set in params
1431 logger
= "test_logger"
1432 my_vims
= "test-vim"
1439 instance
= VimInteractionAffinityGroup(db
, logger
, my_vims
, db_vims
)
1440 with patch
.object(instance
, "my_vims", [self
.target_vim
]), patch
.object(
1441 instance
, "logger", logging
1442 ), patch
.object(instance
, "db_vims", db_vims
):
1448 "action_id": "123456",
1450 "task_id": "123456:1",
1451 "status": "SCHEDULED",
1453 "item": "test_item",
1454 "target_record": "test_target_record",
1455 "target_record_id": "test_target_record_id",
1456 # values coming from extra_dict
1459 "depends_on": "test_depends_on",
1464 task_index
= "task_index_2"
1465 self
.target_vim
.new_affinity_group
.return_value
= (
1466 "sample_affinity_group_id_1"
1468 result
= instance
.new(ro_task
, task_index
, self
.task_depends
)
1469 self
.assertEqual(result
[0], "DONE")
1470 self
.assertEqual(result
[1].get("vim_id"), None)
1471 self
.assertEqual(result
[1].get("created"), False)
1472 self
.assertEqual(result
[1].get("vim_status"), "DONE")
1474 def test__delete_affinity_group_ok(self
):
1476 delete affinity group with a proper vim_id
1479 logger
= "test_logger"
1480 my_vims
= "test-vim"
1487 instance
= VimInteractionAffinityGroup(db
, logger
, my_vims
, db_vims
)
1488 with patch
.object(instance
, "my_vims", [self
.target_vim
]), patch
.object(
1489 instance
, "logger", logging
1490 ), patch
.object(instance
, "db_vims", db_vims
):
1496 "task_id": "123456:1",
1501 "created_items": None,
1502 "vim_id": "sample_affinity_group_id_3",
1503 "vim_name": "sample_affinity_group_id_3",
1505 "vim_details": "some-details",
1506 "vim_message": None,
1511 task_index
= "task_index_3"
1512 self
.target_vim
.delete_affinity_group
.return_value
= (
1513 "sample_affinity_group_id_3"
1515 result
= instance
.delete(ro_task
, task_index
)
1516 self
.assertEqual(result
[0], "DONE")
1517 self
.assertEqual(result
[1].get("vim_message"), "DELETED")
1518 self
.assertEqual(result
[1].get("created"), False)
1519 self
.assertEqual(result
[1].get("vim_status"), "DELETED")
1521 def test__delete_affinity_group_failed(self
):
1523 delete affinity group with missing vim_id
1526 logger
= "test_logger"
1527 my_vims
= "test-vim"
1534 instance
= VimInteractionAffinityGroup(db
, logger
, my_vims
, db_vims
)
1535 with patch
.object(instance
, "my_vims", [self
.target_vim
]), patch
.object(
1536 instance
, "logger", logging
1537 ), patch
.object(instance
, "db_vims", db_vims
):
1543 "task_id": "123456:1",
1548 "created_items": None,
1552 "vim_details": "some-details",
1553 "vim_message": None,
1558 task_index
= "task_index_4"
1559 self
.target_vim
.delete_affinity_group
.return_value
= ""
1560 result
= instance
.delete(ro_task
, task_index
)
1561 self
.assertEqual(result
[0], "DONE")
1562 self
.assertEqual(result
[1].get("vim_message"), "DELETED")
1563 self
.assertEqual(result
[1].get("created"), False)
1564 self
.assertEqual(result
[1].get("vim_status"), "DELETED")
1567 class TestVimInteractionResize(unittest
.TestCase
):
1569 module_name
= "osm_ro_plugin"
1570 self
.target_vim
= MagicMock(name
=f
"{module_name}.vimconn.VimConnector")
1571 self
.task_depends
= None
1573 patches
= [patch(f
"{module_name}.vimconn.VimConnector", self
.target_vim
)]
1575 # Enabling mocks and add cleanups
1576 for mock
in patches
:
1578 self
.addCleanup(mock
.stop
)
1580 def test__exec_resize_done(self
):
1582 create verticalscale task
1585 logger
= "test_logger"
1586 my_vims
= "test-vim"
1592 target_record_id
= (
1593 "vnfrs:665b4165-ce24-4320-bf19-b9a45bade49f:"
1594 "vdur.bb9c43f9-10a2-4569-a8a8-957c3528b6d1"
1597 instance
= VimInteractionResize(db
, logger
, my_vims
, db_vims
)
1598 with patch
.object(instance
, "my_vims", [self
.target_vim
]), patch
.object(
1599 instance
, "logger", logging
1600 ), patch
.object(instance
, "db_vims", db_vims
):
1606 "action_id": "bb937f49-3870-4169-b758-9732e1ff40f3",
1607 "nsr_id": "993166fe-723e-4680-ac4b-b1af2541ae31",
1608 "task_id": "bb937f49-3870-4169-b758-9732e1ff40f3:0",
1609 "status": "SCHEDULED",
1611 "item": "verticalscale",
1612 "target_record": "vnfrs:665b4165-ce24-4320-bf19-b9a45bade49f:vdur.0",
1613 "target_record_id": target_record_id
,
1615 "vim_vm_id": "f37b18ef-3caa-4dc9-ab91-15c669b16396",
1616 "flavor_dict": "flavor_dict",
1621 task_index
= "task_index_1"
1622 result
= instance
.exec(ro_task
, task_index
, self
.task_depends
)
1623 self
.assertEqual(result
[0], "DONE")
1624 self
.assertEqual(result
[1].get("vim_status"), "DONE")
1627 class TestVimInteractionMigration(unittest
.TestCase
):
1629 module_name
= "osm_ro_plugin"
1630 self
.target_vim
= MagicMock(name
=f
"{module_name}.vimconn.VimConnector")
1631 self
.task_depends
= None
1633 patches
= [patch(f
"{module_name}.vimconn.VimConnector", self
.target_vim
)]
1635 # Enabling mocks and add cleanups
1636 for mock
in patches
:
1638 self
.addCleanup(mock
.stop
)
1640 def test__exec_migration_done(self
):
1645 logger
= "test_logger"
1646 my_vims
= "test-vim"
1652 target_record_id
= (
1653 "vnfrs:665b4165-ce24-4320-bf19-b9a45bade49f:"
1654 "vdur.bb9c43f9-10a2-4569-a8a8-957c3528b6d1"
1657 instance
= VimInteractionMigration(db
, logger
, my_vims
, db_vims
)
1658 with patch
.object(instance
, "my_vims", [self
.target_vim
]), patch
.object(
1659 instance
, "logger", logging
1660 ), patch
.object(instance
, "db_vims", db_vims
):
1666 "action_id": "bb937f49-3870-4169-b758-9732e1ff40f3",
1667 "nsr_id": "993166fe-723e-4680-ac4b-b1af2541ae31",
1668 "task_id": "bb937f49-3870-4169-b758-9732e1ff40f3:0",
1669 "status": "SCHEDULED",
1672 "target_record": "vnfrs:665b4165-ce24-4320-bf19-b9a45bade49f:vdur.0",
1673 "target_record_id": target_record_id
,
1675 "vim_vm_id": "f37b18ef-3caa-4dc9-ab91-15c669b16396",
1676 "migrate_host": "osm-test2",
1677 "vdu_vim_info": {0: {"interfaces": []}},
1682 self
.target_vim
.migrate_instance
.return_value
= "ACTIVE", "test"
1684 task_index
= "task_index_1"
1685 result
= instance
.exec(ro_task
, task_index
, self
.task_depends
)
1686 self
.assertEqual(result
[0], "DONE")
1687 self
.assertEqual(result
[1].get("vim_status"), "ACTIVE")