Code Coverage

Cobertura Coverage Report > NG-RO.osm_ng_ro.tests >

test_monitor.py

Trend

File Coverage summary

NameClassesLinesConditionals
test_monitor.py
100%
1/1
99%
1417/1421
100%
0/0

Coverage Breakdown by Class

NameLinesConditionals
test_monitor.py
99%
1417/1421
N/A

Source

NG-RO/osm_ng_ro/tests/test_monitor.py
1 #######################################################################################
2 # Copyright ETSI Contributors and Others.
3 #
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
7 #
8 #    http://www.apache.org/licenses/LICENSE-2.0
9 #
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
13 # implied.
14 # See the License for the specific language governing permissions and
15 # limitations under the License.
16 #######################################################################################
17 1 from copy import deepcopy
18 1 import logging
19 1 import threading
20 1 import unittest
21 1 from unittest.mock import MagicMock, mock_open, patch
22
23 1 from novaclient.v2.servers import Server as NovaServer
24 1 from osm_common import dbmongo
25 1 from osm_common.dbbase import DbException
26 1 from osm_ng_ro.monitor import (
27     MonitorDbException,
28     MonitorVimException,
29     MonitorVms,
30     MonitorVmsException,
31     start_monitoring,
32     stop_monitoring,
33     VimToMonitor,
34     VmToMonitor,
35 )
36 1 from osm_ng_ro.tests.sample_data import (
37     config,
38     db_vim_cacert,
39     db_vim_collection,
40     deleted_externally,
41     file_name,
42     interface_info2,
43     interface_with_binding,
44     ip1_addr,
45     mac1_addr,
46     mac2_addr,
47     net1_id,
48     old_interface,
49     old_interface2,
50     plugin_name,
51     port1,
52     port2,
53     ro_task1,
54     ro_task2,
55     sample_vim,
56     sample_vim_info,
57     sample_vnfr,
58     serialized_interface_info,
59     serialized_server_info,
60     server_other_info,
61     target_id,
62     target_record,
63     target_record2,
64     vdur_path,
65     vim1_id,
66     vim2_id,
67     vim3_id,
68     vim4_id,
69     vim_info_path,
70     vims,
71     vims_to_monitor,
72     vm1_id,
73     vm2_id,
74     vnfr_id,
75     wrong_ro_task,
76 )
77 1 from osm_ro_plugin.vimconn import VimConnector
78 1 import yaml
79
80
81 1 def create_server(id: str, name: str, status: str = "ACTIVE", info: dict = {}):
82 1     instance = NovaServer(manager="manager", info=info)
83 1     instance.id = id
84 1     instance.name = name
85 1     instance.status = status
86 1     return instance
87
88
89 # The preparation for the tests
90 1 sample_vim_connector_instance = VimConnector(
91     uuid=sample_vim["_id"],
92     name=sample_vim["name"],
93     tenant_id=sample_vim.get("vim_tenant_id"),
94     tenant_name=sample_vim.get("vim_tenant_name"),
95     url=sample_vim["vim_url"],
96 )
97 1 sample_vm = VmToMonitor(vm1_id, target_record)
98 1 sample_vm2 = VmToMonitor(vm2_id, target_record)
99 1 sample_vm3 = VmToMonitor("deleted-vm-id", target_record)
100 1 server1 = create_server(vm1_id, "server1")
101 1 server2 = create_server(vm2_id, "server2")
102 1 server3 = create_server("other-vm-id3", "other-vm3")
103 1 server4 = create_server("other-vm-id4", "other-vm4")
104 1 all_server_info = deepcopy(server_other_info)
105 1 server7 = create_server(vm1_id, "server7", info=all_server_info)
106
107
108 1 class CopyingMock(MagicMock):
109 1     def __call__(self, *args, **kwargs):
110 1         args = deepcopy(args)
111 1         kwargs = deepcopy(kwargs)
112 1         return super(CopyingMock, self).__call__(*args, **kwargs)
113
114
115 1 def check_if_assert_not_called(mocks: list):
116 1     for mocking in mocks:
117 1         mocking.assert_not_called()
118
119
120 1 class TestMonitorVms(unittest.TestCase):
121 1     @patch("osm_ng_ro.monitor.MonitorVms.__init__")
122 1     @patch("osm_ng_ro.ns_thread.ConfigValidate")
123 1     @patch("osm_ng_ro.monitor.MonitorVms.get_db_vims")
124 1     @patch("osm_ng_ro.monitor.MonitorVms.load_vims")
125 1     @patch("logging.getLogger", autospec=True)
126 1     def setUp(
127         self,
128         mock_logger,
129         mock_load_vims,
130         mock_get_db_vims,
131         mock_config_validate,
132         mock_init,
133     ):
134         # We are disabling the logging of exception not to print them to console.
135 1         mock_logger = logging.getLogger()
136 1         mock_logger.disabled = True
137 1         mock_init.return_value = None
138 1         self.monitor = MonitorVms(config=config)
139 1         self.monitor.db_vims = []
140 1         self.monitor.db = CopyingMock(dbmongo.DbMongo(), autospec=True)
141 1         self.monitor.config = config
142 1         self.monitor.logger = mock_logger
143 1         self.monitor.my_vims = {}
144 1         self.monitor.refresh_config = mock_config_validate
145
146 1     @patch("osm_ng_ro.ns_thread.ConfigValidate.__init__")
147 1     @patch("osm_ng_ro.monitor.MonitorVms.get_db_vims")
148 1     @patch("osm_ng_ro.monitor.MonitorVms.load_vims")
149 1     @patch("logging.getLogger", autospec=True)
150 1     @patch("osm_ng_ro.monitor.MonitorVms.connect_db")
151 1     def test_init(
152         self,
153         mock_connect_db,
154         mock_logger,
155         mock_load_vims,
156         mock_get_db_vims,
157         mock_config_validate_init,
158     ):
159 1         mock_config_validate_init.return_value = None
160 1         mock_get_db_vims.return_value = vims
161 1         instance = MonitorVms(config)
162 1         mock_config_validate_init.assert_called_once_with(config)
163 1         self.assertDictEqual(instance.config, config)
164 1         mock_load_vims.assert_called_once()
165 1         self.assertEqual(instance.db_vims, vims)
166 1         mock_connect_db.assert_called_once()
167 1         self.assertIsNone(instance.db)
168 1         self.assertIsNotNone(instance.db_vims)
169 1         mock_logger.assert_called_once_with("ro.monitor")
170
171 1     @patch("osm_ng_ro.monitor.MonitorVms._load_vim")
172 1     def test_load_vims_empty_db_vims(self, mock_load_vim):
173 1         self.monitor.load_vims()
174 1         mock_load_vim.assert_not_called()
175
176 1     @patch("osm_ng_ro.monitor.MonitorVms._load_vim")
177 1     def test_load_vims_vim_id_not_in_my_vims(self, mock_load_vim):
178 1         self.monitor.db_vims = vims
179 1         self.monitor.my_vims = {vim3_id: "vim-obj3"}
180 1         self.monitor.load_vims()
181 1         _call_mock_load_vim = mock_load_vim.call_args_list
182 1         self.assertEqual(mock_load_vim.call_count, 2)
183 1         self.assertEqual(
184             _call_mock_load_vim[0][0],
185             (vim1_id,),
186         )
187 1         self.assertEqual(
188             _call_mock_load_vim[1][0],
189             (vim2_id,),
190         )
191
192 1     @patch("osm_ng_ro.monitor.MonitorVms._load_vim")
193 1     def test_load_vims_vim_id_in_my_vims(self, mock_load_vim):
194 1         self.monitor.db_vims = vims
195 1         self.monitor.my_vims = {vim1_id: "vim-obj1", vim2_id: "vim-obj2"}
196 1         self.monitor.load_vims()
197 1         mock_load_vim.assert_not_called()
198
199 1     @patch("osm_common.dbmongo.DbMongo.db_connect")
200 1     @patch("osm_common.dbmongo.DbMongo.__init__")
201 1     @patch("osm_common.dbmemory.DbMemory.db_connect")
202 1     @patch("osm_common.dbmemory.DbMemory.__init__")
203 1     def test_connect_db_type_mongo(
204         self,
205         mock_dbmemory_init,
206         mock_dbmemory_connect,
207         mock_dbmongo_init,
208         mock_dbmongo_connect,
209     ):
210 1         self.monitor.db = None
211 1         self.monitor.config["database"]["driver"] = "mongo"
212 1         mock_dbmongo_init.return_value = None
213 1         self.monitor.connect_db()
214 1         mock_dbmongo_init.assert_called_once()
215 1         mock_dbmongo_connect.assert_called_once()
216 1         self.monitor.db.db_connect.assert_called_once_with(
217             self.monitor.config["database"]
218         )
219 1         check_if_assert_not_called([mock_dbmemory_init, mock_dbmemory_connect])
220
221 1     @patch("osm_common.dbmongo.DbMongo.db_connect")
222 1     @patch("osm_common.dbmongo.DbMongo.__init__")
223 1     @patch("osm_common.dbmemory.DbMemory.db_connect")
224 1     @patch("osm_common.dbmemory.DbMemory.__init__")
225 1     def test_connect_db_type_mongo_initialize_exception(
226         self,
227         mock_dbmemory_init,
228         mock_dbmemory_connect,
229         mock_dbmongo_init,
230         mock_dbmongo_connect,
231     ):
232 1         self.monitor.db = None
233 1         self.monitor.config["database"]["driver"] = "mongo"
234 1         mock_dbmongo_init.side_effect = ValueError("Db object could not be created.")
235 1         with self.assertRaises(MonitorDbException) as err:
236 1             self.monitor.connect_db()
237 1         self.assertEqual(str(err.exception), "Db object could not be created.")
238 1         mock_dbmongo_init.assert_called_once()
239 1         check_if_assert_not_called(
240             [mock_dbmongo_connect, mock_dbmemory_init, mock_dbmemory_connect]
241         )
242
243 1     @patch("osm_common.dbmongo.DbMongo.db_connect")
244 1     @patch("osm_common.dbmongo.DbMongo.__init__")
245 1     @patch("osm_common.dbmemory.DbMemory.db_connect")
246 1     @patch("osm_common.dbmemory.DbMemory.__init__")
247 1     def test_connect_db_type_mongo_connection_exception(
248         self,
249         mock_dbmemory_init,
250         mock_dbmemory_connect,
251         mock_dbmongo_init,
252         mock_dbmongo_connect,
253     ):
254 1         self.monitor.db = None
255 1         self.monitor.config["database"]["driver"] = "mongo"
256 1         mock_dbmongo_init.return_value = None
257 1         mock_dbmongo_connect.side_effect = DbException("Connection failed")
258 1         with self.assertRaises(MonitorDbException) as err:
259 1             self.monitor.connect_db()
260 1         self.assertEqual(str(err.exception), "database exception Connection failed")
261 1         mock_dbmongo_init.assert_called_once()
262 1         mock_dbmongo_connect.assert_called_once_with(self.monitor.config["database"])
263 1         check_if_assert_not_called([mock_dbmemory_init, mock_dbmemory_connect])
264
265 1     @patch("osm_common.dbmongo.DbMongo.db_connect")
266 1     @patch("osm_common.dbmongo.DbMongo.__init__")
267 1     @patch("osm_common.dbmemory.DbMemory.db_connect")
268 1     @patch("osm_common.dbmemory.DbMemory.__init__")
269 1     def test_connect_db_type_memory(
270         self,
271         mock_dbmemory_init,
272         mock_dbmemory_connect,
273         mock_dbmongo_init,
274         mock_dbmongo_connect,
275     ):
276 1         self.monitor.db = None
277 1         self.monitor.config["database"]["driver"] = "memory"
278 1         mock_dbmemory_init.return_value = None
279 1         self.monitor.connect_db()
280 1         mock_dbmemory_init.assert_called_once()
281 1         mock_dbmemory_connect.assert_called_once_with(self.monitor.config["database"])
282 1         check_if_assert_not_called([mock_dbmongo_init, mock_dbmongo_connect])
283
284 1     @patch("osm_common.dbmongo.DbMongo.db_connect")
285 1     @patch("osm_common.dbmongo.DbMongo.__init__")
286 1     @patch("osm_common.dbmemory.DbMemory.db_connect")
287 1     @patch("osm_common.dbmemory.DbMemory.__init__")
288 1     def test_connect_db_existing_db(
289         self,
290         mock_dbmemory_init,
291         mock_dbmemory_connect,
292         mock_dbmongo_init,
293         mock_dbmongo_connect,
294     ):
295 1         self.monitor.connect_db()
296 1         check_if_assert_not_called(
297             [
298                 mock_dbmemory_init,
299                 mock_dbmongo_init,
300                 mock_dbmemory_connect,
301                 mock_dbmongo_connect,
302             ]
303         )
304
305 1     @patch("osm_common.dbmongo.DbMongo.db_connect")
306 1     @patch("osm_common.dbmongo.DbMongo.__init__")
307 1     @patch("osm_common.dbmemory.DbMemory.db_connect")
308 1     @patch("osm_common.dbmemory.DbMemory.__init__")
309 1     def test_connect_db_wrong_driver_type(
310         self,
311         mock_dbmemory_init,
312         mock_dbmemory_connect,
313         mock_dbmongo_init,
314         mock_dbmongo_connect,
315     ):
316 1         self.monitor.db = None
317 1         self.monitor.config["database"]["driver"] = "posgresql"
318 1         with self.assertRaises(MonitorDbException) as err:
319 1             self.monitor.connect_db()
320 1         self.assertEqual(
321             str(err.exception),
322             "Invalid configuration param 'posgresql' at '[database]':'driver'",
323         )
324 1         check_if_assert_not_called(
325             [
326                 mock_dbmemory_init,
327                 mock_dbmongo_init,
328                 mock_dbmemory_connect,
329                 mock_dbmongo_connect,
330             ]
331         )
332
333 1     def test_get_db_vims(self):
334 1         self.monitor.db.get_list.return_value = vims
335 1         result = self.monitor.get_db_vims()
336 1         self.assertEqual(result, vims)
337 1         self.monitor.db.get_list.assert_called_once_with(
338             "vim_accounts", {"vim_type": "openstack"}
339         )
340
341 1     def test_get_db_vims_db_raises(self):
342 1         self.monitor.db.get_list.side_effect = DbException("Connection failed.")
343 1         with self.assertRaises(DbException) as err:
344 1             result = self.monitor.get_db_vims()
345 0             self.assertEqual(result, None)
346 1         self.assertEqual(str(err.exception), "database exception Connection failed.")
347 1         self.monitor.db.get_list.assert_called_once_with(
348             "vim_accounts", {"vim_type": "openstack"}
349         )
350
351 1     def test_find_ro_tasks_to_monitor(self):
352 1         self.monitor.db.get_list.return_value = [ro_task1]
353 1         result = self.monitor.find_ro_tasks_to_monitor()
354 1         self.assertEqual(result, [ro_task1])
355 1         self.monitor.db.get_list.assert_called_once_with(
356             "ro_tasks",
357             q_filter={
358                 "tasks.status": ["DONE"],
359                 "tasks.item": ["vdu"],
360             },
361         )
362
363 1     def test_find_ro_tasks_to_monitor_db_exception(self):
364 1         self.monitor.db.get_list.side_effect = DbException("Wrong database status")
365 1         with self.assertRaises(DbException) as err:
366 1             result = self.monitor.find_ro_tasks_to_monitor()
367 0             self.assertEqual(result, None)
368 1         self.assertEqual(str(err.exception), "database exception Wrong database status")
369 1         self.monitor.db.get_list.assert_called_once_with(
370             "ro_tasks",
371             q_filter={
372                 "tasks.status": ["DONE"],
373                 "tasks.item": ["vdu"],
374             },
375         )
376
377 1     def test_initialize_target_vim(self):
378 1         vim_module_conn = VimConnector
379 1         vim_connector_instance = self.monitor._initialize_target_vim(
380             vim_module_conn, sample_vim
381         )
382 1         self.assertIsInstance(vim_connector_instance, VimConnector)
383 1         self.assertListEqual(
384             [vim_connector_instance.id, vim_connector_instance.name],
385             [target_id, "openstackETSI1"],
386         )
387
388 1     def test_initialize_target_vim_invalid_vim_connector_input(self):
389 1         vim_module_conn = "openstack_vim_connector"
390 1         with self.assertRaises(TypeError) as err:
391 1             self.monitor._initialize_target_vim(vim_module_conn, sample_vim)
392 1         self.assertEqual(str(err.exception), "'str' object is not callable")
393
394 1     def test_initialize_target_vim_missing_vim_keys(self):
395 1         vim_module_conn = VimConnector
396 1         sample_vim = {
397             "_id": target_id,
398             "name": "openstackETSI1",
399             "vim_type": "openstack",
400         }
401 1         with self.assertRaises(KeyError) as err:
402 1             self.monitor._initialize_target_vim(vim_module_conn, sample_vim)
403 1         self.assertEqual(str(err.exception.args[0]), "vim_url")
404
405 1     def test_initialize_target_vim_invalid_vim_input_type(self):
406 1         vim_module_conn = VimConnector
407 1         sample_vim = [target_id, "openstackETSI1"]
408 1         with self.assertRaises(TypeError) as err:
409 1             self.monitor._initialize_target_vim(vim_module_conn, sample_vim)
410 1         self.assertEqual(
411             str(err.exception), "list indices must be integers or slices, not str"
412         )
413
414 1     @patch("osm_ng_ro.monitor.MonitorVms._process_vim_config")
415 1     @patch("osm_ng_ro.monitor.MonitorVms._load_plugin")
416 1     @patch("osm_ng_ro.monitor.MonitorVms._initialize_target_vim")
417 1     def test_load_vim(self, mock_target_vim, mock_load_plugin, mock_vim_config):
418 1         self.monitor.my_vims = {}
419 1         sample_vim["schema_version"] = "1.11"
420 1         self.monitor.db.get_one.return_value = sample_vim
421 1         mock_load_plugin.return_value = VimConnector
422 1         mock_target_vim.return_value = sample_vim_connector_instance
423 1         self.monitor._load_vim(target_id)
424 1         self.assertEqual(self.monitor.my_vims[target_id], sample_vim_connector_instance)
425 1         mock_vim_config.assert_called_once()
426 1         self.monitor.db.get_one.assert_called_once_with(
427             db_vim_collection, {"_id": target_id}
428         )
429 1         self.monitor.db.encrypt_decrypt_fields.assert_called_once_with(
430             sample_vim,
431             "decrypt",
432             fields=("password", "secret"),
433             schema_version="1.11",
434             salt=target_id,
435         )
436 1         mock_vim_config.assert_called_once_with(target_id, sample_vim)
437 1         mock_load_plugin.assert_called_once_with(plugin_name)
438 1         mock_target_vim.assert_called_once_with(VimConnector, sample_vim)
439
440 1     @patch("osm_ng_ro.monitor.MonitorVms._process_vim_config")
441 1     @patch("osm_ng_ro.monitor.MonitorVms._load_plugin")
442 1     @patch("osm_ng_ro.monitor.MonitorVms._initialize_target_vim")
443 1     def test_load_vim_target_vim_not_found(
444         self, mock_target_vim, mock_load_plugin, mock_vim_config
445     ):
446 1         self.monitor.my_vims = {}
447 1         self.monitor.db.get_one.return_value = None
448 1         with self.assertRaises(MonitorVimException) as err:
449 1             self.monitor._load_vim(target_id)
450 1         self.assertEqual(
451             str(err.exception),
452             "Cannot load 55b2219a-7bb9-4644-9612-980dada84e83 plugin=rovim_openstack: "
453             "'NoneType' object has no attribute 'get'",
454         )
455 1         self.monitor.db.get_one.assert_called_once_with(
456             db_vim_collection, {"_id": target_id}
457         )
458 1         check_if_assert_not_called(
459             [
460                 self.monitor.db.encrypt_decrypt_fields,
461                 mock_vim_config,
462                 mock_load_plugin,
463                 mock_target_vim,
464             ]
465         )
466
467 1     @patch("osm_ng_ro.monitor.MonitorVms._process_vim_config")
468 1     @patch("osm_ng_ro.monitor.MonitorVms._load_plugin")
469 1     @patch("osm_ng_ro.monitor.MonitorVms._initialize_target_vim")
470 1     def test_load_vim_decrypt_fields_raises(
471         self, mock_target_vim, mock_load_plugin, mock_vim_config
472     ):
473 1         self.monitor.my_vims = {}
474 1         sample_vim["schema_version"] = "1.11"
475 1         self.monitor.db.get_one.return_value = sample_vim
476 1         self.monitor.db.encrypt_decrypt_fields.side_effect = DbException(
477             "Value could not decrypted."
478         )
479 1         with self.assertRaises(MonitorVimException) as err:
480 1             self.monitor._load_vim(target_id)
481 1         self.assertEqual(
482             str(err.exception),
483             "Cannot load 55b2219a-7bb9-4644-9612-980dada84e83 plugin=rovim_openstack: "
484             "database exception Value could not decrypted.",
485         )
486 1         self.monitor.db.get_one.assert_called_once_with(
487             db_vim_collection, {"_id": target_id}
488         )
489 1         self.monitor.db.encrypt_decrypt_fields.assert_called_once_with(
490             sample_vim,
491             "decrypt",
492             fields=("password", "secret"),
493             schema_version="1.11",
494             salt=target_id,
495         )
496 1         check_if_assert_not_called([mock_vim_config, mock_load_plugin, mock_target_vim])
497
498 1     @patch("osm_ng_ro.monitor.MonitorVms._process_vim_config")
499 1     @patch("osm_ng_ro.monitor.MonitorVms._load_plugin")
500 1     @patch("osm_ng_ro.monitor.MonitorVms._initialize_target_vim")
501 1     def test_load_vim_process_vim_config_raises(
502         self, mock_target_vim, mock_load_plugin, mock_vim_config
503     ):
504 1         self.monitor.my_vims = {}
505 1         sample_vim["schema_version"] = "1.11"
506 1         self.monitor.db.get_one.return_value = sample_vim
507 1         mock_vim_config.side_effect = MonitorVimException(
508             "Error writing file config_1234"
509         )
510 1         with self.assertRaises(MonitorVimException) as err:
511 1             self.monitor._load_vim(target_id)
512 1         self.assertEqual(
513             str(err.exception),
514             "Cannot load 55b2219a-7bb9-4644-9612-980dada84e83 plugin=rovim_openstack: "
515             "Error writing file config_1234",
516         )
517 1         self.monitor.db.get_one.assert_called_once_with(
518             db_vim_collection, {"_id": target_id}
519         )
520 1         self.monitor.db.encrypt_decrypt_fields.assert_called_once_with(
521             sample_vim,
522             "decrypt",
523             fields=("password", "secret"),
524             schema_version="1.11",
525             salt=target_id,
526         )
527 1         mock_vim_config.assert_called_once_with(target_id, sample_vim)
528 1         check_if_assert_not_called([mock_load_plugin, mock_target_vim])
529
530 1     @patch("osm_ng_ro.monitor.MonitorVms._process_vim_config")
531 1     @patch("osm_ng_ro.monitor.MonitorVms._load_plugin")
532 1     @patch("osm_ng_ro.monitor.MonitorVms._initialize_target_vim")
533 1     def test_load_vim_load_plugin_raises(
534         self, mock_target_vim, mock_load_plugin, mock_vim_config
535     ):
536 1         self.monitor.my_vims = {}
537 1         sample_vim["schema_version"] = "1.11"
538 1         self.monitor.db.get_one.return_value = sample_vim
539 1         mock_load_plugin.side_effect = MonitorVimException(
540             "Cannot load plugin osm_rovim_openstack"
541         )
542 1         with self.assertRaises(MonitorVimException) as err:
543 1             self.monitor._load_vim(target_id)
544 1         self.assertEqual(
545             str(err.exception),
546             "Cannot load 55b2219a-7bb9-4644-9612-980dada84e83 plugin=rovim_openstack: "
547             "Cannot load plugin osm_rovim_openstack",
548         )
549 1         self.monitor.db.get_one.assert_called_once_with(
550             db_vim_collection, {"_id": target_id}
551         )
552 1         self.monitor.db.encrypt_decrypt_fields.assert_called_once_with(
553             sample_vim,
554             "decrypt",
555             fields=("password", "secret"),
556             schema_version="1.11",
557             salt=target_id,
558         )
559 1         mock_vim_config.assert_called_once_with(target_id, sample_vim)
560 1         mock_load_plugin.assert_called_once_with(plugin_name)
561 1         mock_target_vim.assert_not_called()
562
563 1     @patch("osm_ng_ro.monitor.MonitorVms._process_vim_config")
564 1     @patch("osm_ng_ro.monitor.MonitorVms._load_plugin")
565 1     @patch("osm_ng_ro.monitor.MonitorVms._initialize_target_vim")
566 1     def test_load_vim_initialize_target_vim_raises(
567         self, mock_target_vim, mock_load_plugin, mock_vim_config
568     ):
569 1         self.monitor.my_vims = {}
570 1         self.monitor.db.get_one.return_value = sample_vim
571 1         sample_vim["schema_version"] = "1.0"
572 1         mock_load_plugin.return_value = VimConnector
573 1         mock_target_vim.side_effect = TypeError("'module' object is not callable")
574 1         with self.assertRaises(MonitorVimException) as err:
575 1             self.monitor._load_vim(target_id)
576 1         self.assertEqual(
577             str(err.exception),
578             "Cannot load 55b2219a-7bb9-4644-9612-980dada84e83 plugin=rovim_openstack: "
579             "'module' object is not callable",
580         )
581 1         self.monitor.db.get_one.assert_called_once_with(
582             db_vim_collection, {"_id": target_id}
583         )
584 1         self.monitor.db.encrypt_decrypt_fields.assert_called_once_with(
585             sample_vim,
586             "decrypt",
587             fields=("password", "secret"),
588             schema_version="1.0",
589             salt=target_id,
590         )
591 1         mock_vim_config.assert_called_once_with(target_id, sample_vim)
592 1         mock_load_plugin.assert_called_once_with(plugin_name)
593 1         mock_target_vim.assert_called_once_with(VimConnector, sample_vim)
594
595 1     @patch("osm_ng_ro.monitor.makedirs")
596 1     @patch("osm_ng_ro.monitor.path")
597 1     @patch("builtins.open", new_callable=mock_open())
598 1     def test_process_vim_config_vim_without_config(
599         self, mock_open, mock_path, mock_makedirs
600     ):
601 1         db_vim = {}
602 1         self.monitor._process_vim_config(target_id, db_vim)
603 1         check_if_assert_not_called([mock_open, mock_path.isdir, mock_makedirs])
604
605 1     @patch("osm_ng_ro.monitor.random")
606 1     @patch("osm_ng_ro.monitor.makedirs")
607 1     @patch("osm_ng_ro.monitor.path")
608 1     @patch("builtins.open", new_callable=mock_open())
609 1     def test_process_vim_config_vim_with_ca_cert(
610         self, mock_open, mock_path, mock_makedirs, mock_random
611     ):
612 1         db_vim = {"config": {"ca_cert_content": "my_vim_cert"}}
613 1         mock_path.isdir.return_value = False
614 1         mock_random.randint.return_value = 23242
615 1         self.monitor._process_vim_config(target_id, db_vim)
616 1         self.assertEqual(db_vim["config"].get("ca_cert_content"), None)
617 1         self.assertEqual(
618             db_vim["config"].get("ca_cert"),
619             db_vim_cacert,
620         )
621 1         mock_path.isdir.asssert_called_once_with(file_name)
622 1         mock_makedirs.assert_called_once_with(file_name)
623 1         mock_random.randint.assert_called_once()
624 1         mock_open.assert_called_once_with(file_name + "/ca_cert", "w")
625
626 1     @patch("osm_ng_ro.monitor.random")
627 1     @patch("osm_ng_ro.monitor.makedirs")
628 1     @patch("osm_ng_ro.monitor.path")
629 1     @patch("builtins.open", new_callable=mock_open())
630 1     def test_process_vim_config_vim_with_cacert_path_is_dir(
631         self, mock_open, mock_path, mock_makedirs, mock_random
632     ):
633 1         db_vim = {"config": {"ca_cert_content": "my_vim_cert"}}
634 1         mock_path.isdir.return_value = True
635 1         mock_random.randint.return_value = 23242
636 1         self.monitor._process_vim_config(target_id, db_vim)
637 1         self.assertEqual(db_vim["config"].get("ca_cert_content"), None)
638 1         self.assertEqual(
639             db_vim["config"].get("ca_cert"),
640             db_vim_cacert,
641         )
642 1         mock_path.isdir.asssert_called_once_with(file_name)
643 1         mock_makedirs.assert_not_called()
644 1         mock_random.randint.assert_called_once()
645 1         mock_open.assert_called_once_with(file_name + "/ca_cert", "w")
646
647 1     @patch("osm_ng_ro.monitor.random")
648 1     @patch("osm_ng_ro.monitor.makedirs")
649 1     @patch("osm_ng_ro.monitor.path")
650 1     @patch("builtins.open", new_callable=mock_open())
651 1     def test_process_vim_config_vim_with_cacert_makedir_raises(
652         self, mock_open, mock_path, mock_makedirs, mock_random
653     ):
654 1         db_vim = {"config": {"ca_cert_content": "my_vim_cert"}}
655 1         mock_path.isdir.return_value = False
656 1         mock_random.randint.return_value = 23242
657 1         mock_makedirs.side_effect = OSError("Can not create directory")
658 1         with self.assertRaises(MonitorVimException) as err:
659 1             self.monitor._process_vim_config(target_id, db_vim)
660 1         self.assertEqual(
661             str(err.exception),
662             "Error writing to file '/app/osm_ro/certs/55b2219a-7bb9-4644-9612-980dada84e83:23242': "
663             "Can not create directory",
664         )
665 1         self.assertEqual(db_vim["config"].get("ca_cert_content"), "my_vim_cert")
666 1         self.assertEqual(db_vim["config"].get("ca_cert"), None)
667 1         mock_path.isdir.asssert_called_once_with(file_name)
668 1         mock_makedirs.assert_called_once_with(file_name)
669 1         mock_random.randint.assert_called_once()
670 1         mock_open.assert_not_called()
671
672 1     @patch("osm_ng_ro.monitor.random")
673 1     @patch("osm_ng_ro.monitor.makedirs")
674 1     @patch("osm_ng_ro.monitor.path")
675 1     @patch("builtins.open", new_callable=mock_open())
676 1     def test_process_vim_config_vim_with_cacert_mock_open_raises(
677         self, mock_open, mock_path, mock_makedirs, mock_random
678     ):
679 1         db_vim = {"config": {"ca_cert_content": "my_vim_cert"}}
680 1         mock_path.isdir.return_value = False
681 1         mock_random.randint.return_value = 23242
682 1         mock_open.side_effect = FileNotFoundError("File is not found.")
683 1         with self.assertRaises(MonitorVimException) as err:
684 1             self.monitor._process_vim_config(target_id, db_vim)
685 1         self.assertEqual(
686             str(err.exception),
687             "Error writing to file '/app/osm_ro/certs/55b2219a-7bb9-4644-9612-980dada84e83:23242/ca_cert': "
688             "File is not found.",
689         )
690 1         self.assertEqual(db_vim["config"].get("ca_cert_content"), "my_vim_cert")
691 1         self.assertEqual(db_vim["config"].get("ca_cert"), None)
692 1         mock_path.isdir.asssert_called_once_with(file_name)
693 1         mock_makedirs.assert_called_once_with(file_name)
694 1         mock_random.randint.assert_called_once()
695 1         mock_open.assert_called_once_with(file_name + "/ca_cert", "w")
696
697 1     @patch("osm_ng_ro.monitor.random")
698 1     @patch("osm_ng_ro.monitor.makedirs")
699 1     @patch("osm_ng_ro.monitor.path")
700 1     @patch("builtins.open", new_callable=mock_open())
701 1     def test_process_vim_config_vim_without_cacert(
702         self, mock_open, mock_path, mock_makedirs, mock_random
703     ):
704 1         db_vim = {"config": {}}
705 1         self.monitor._process_vim_config(target_id, db_vim)
706 1         self.assertEqual(db_vim["config"].get("ca_cert"), None)
707 1         check_if_assert_not_called(
708             [mock_path.isdir, mock_makedirs, mock_random.randint, mock_open]
709         )
710
711 1     @patch("osm_ng_ro.monitor.entry_points")
712 1     def test_load_plugin_name_exists(self, mock_entry_points):
713 1         self.monitor.plugins = {plugin_name: VimConnector}
714 1         result = self.monitor._load_plugin(plugin_name)
715 1         mock_entry_points.assert_not_called()
716 1         self.assertEqual(self.monitor.plugins, {plugin_name: VimConnector})
717 1         self.assertEqual(result, VimConnector)
718
719 1     @patch("osm_ng_ro.monitor.entry_points")
720 1     def test_load_plugin_name_does_not_exist(self, mock_entry_points):
721 1         self.monitor.plugins = {}
722 1         mock_ep = MagicMock()
723 1         mock_ep.load.return_value = sample_vim_connector_instance
724 1         mock_entry_points.return_value = [mock_ep]
725 1         result = self.monitor._load_plugin(plugin_name)
726 1         self.assertEqual(mock_entry_points.call_count, 1)
727 1         mock_entry_points.assert_called_once_with(
728             group="osm_rovim.plugins", name=plugin_name
729         )
730 1         self.assertEqual(
731             self.monitor.plugins, {plugin_name: sample_vim_connector_instance}
732         )
733 1         self.assertEqual(result, sample_vim_connector_instance)
734
735 1     @patch("osm_ng_ro.monitor.entry_points")
736 1     def test_load_plugin_load_raises(self, mock_entry_points):
737 1         self.monitor.plugins = {}
738 1         mock_entry_points.return_value = None
739 1         with self.assertRaises(MonitorVimException) as err:
740 1             self.monitor._load_plugin(plugin_name)
741 1         self.assertEqual(
742             str(err.exception),
743             "Cannot load plugin osm_rovim_openstack: 'NoneType' object is not iterable",
744         )
745 1         self.assertEqual(mock_entry_points.call_count, 1)
746 1         mock_entry_points.assert_called_once_with(
747             group="osm_rovim.plugins", name=plugin_name
748         )
749 1         self.assertEqual(self.monitor.plugins, {})
750
751 1     @patch("osm_ng_ro.monitor.VmToMonitor")
752 1     def test_create_vm_to_monitor_empty_ro_task(self, mock_vm_to_monitor):
753 1         ro_task = {}
754 1         result = self.monitor.create_vm_to_monitor(ro_task)
755 1         self.assertEqual(result, None)
756 1         mock_vm_to_monitor.assert_not_called()
757
758 1     @patch("osm_ng_ro.monitor.VmToMonitor")
759 1     def test_create_vm_to_monitor(self, mock_vm_to_monitor):
760 1         sample_vm = VmToMonitor("sample_id", "sample_target_record")
761 1         mock_vm_to_monitor.return_value = sample_vm
762 1         result = self.monitor.create_vm_to_monitor(ro_task1)
763 1         self.assertEqual(result, sample_vm)
764 1         mock_vm_to_monitor.assert_called_once_with(
765             "ebd39f37-e607-4bce-9f10-ea4c5635f726", target_record
766         )
767
768 1     @patch("osm_ng_ro.monitor.VmToMonitor")
769 1     def test_create_vm_to_monitor_wrong_ro_task_format(self, mock_vm_to_monitor):
770 1         mock_vm_to_monitor.return_value = "VmtoMonitor"
771 1         with self.assertRaises(KeyError) as err:
772 1             self.monitor.create_vm_to_monitor(wrong_ro_task)
773 1         self.assertEqual(str(err.exception.args[0]), "vim_info")
774 1         mock_vm_to_monitor.assert_not_called()
775
776 1     @patch("osm_ng_ro.monitor.MonitorVms.create_vm_to_monitor")
777 1     def test_add_vm_to_existing_vim(self, mock_create_vm_to_monitor):
778 1         sample_vim1 = VimToMonitor(vim1_id, [vm1_id])
779 1         vims_to_monitor = [sample_vim1]
780 1         result = self.monitor.add_vm_to_existing_vim(vims_to_monitor, ro_task2, vim1_id)
781 1         self.assertEqual(result, True)
782 1         mock_create_vm_to_monitor.assert_called_once_with(ro_task2)
783 1         self.assertEqual(2, len(sample_vim1.vms))
784
785 1     @patch("osm_ng_ro.monitor.MonitorVms.create_vm_to_monitor")
786 1     def test_add_vm_to_existing_vim_empty_vims_list(self, mock_create_vm_to_monitor):
787 1         vims_to_monitor = []
788 1         result = self.monitor.add_vm_to_existing_vim(vims_to_monitor, ro_task1, vim1_id)
789 1         self.assertEqual(result, False)
790 1         mock_create_vm_to_monitor.assert_not_called()
791
792 1     @patch("osm_ng_ro.monitor.MonitorVms.create_vm_to_monitor")
793 1     def test_add_vm_to_existing_vim_different_target_vim_id(
794         self, mock_create_vm_to_monitor
795     ):
796 1         sample_vim1 = VimToMonitor(vim1_id, [vm1_id])
797 1         vims_to_monitor = [sample_vim1]
798 1         result = self.monitor.add_vm_to_existing_vim(vims_to_monitor, ro_task2, vim2_id)
799 1         self.assertEqual(result, False)
800 1         mock_create_vm_to_monitor.assert_not_called()
801 1         self.assertEqual(1, len(sample_vim1.vms))
802
803 1     @patch("osm_ng_ro.monitor.MonitorVms.create_vm_to_monitor")
804 1     def test_add_vm_to_existing_vim_create_vm_to_monitor_raises(
805         self, mock_create_vm_to_monitor
806     ):
807 1         sample_vim1 = VimToMonitor(vim1_id, [vm1_id])
808 1         vims_to_monitor = [sample_vim1]
809 1         mock_create_vm_to_monitor.side_effect = KeyError(
810             "target_record does not exist."
811         )
812 1         with self.assertRaises(KeyError) as err:
813 1             self.monitor.add_vm_to_existing_vim(vims_to_monitor, ro_task2, vim1_id)
814 1         self.assertEqual(str(err.exception.args[0]), "target_record does not exist.")
815 1         mock_create_vm_to_monitor.assert_called_once_with(ro_task2)
816 1         self.assertEqual(1, len(sample_vim1.vms))
817
818 1     @patch("osm_ng_ro.monitor.MonitorVms.create_vm_to_monitor")
819 1     @patch("osm_ng_ro.monitor.VimToMonitor")
820 1     def test_add_new_vim_for_monitoring(
821         self, mock_vim_to_monitor, mock_create_vm_to_monitor
822     ):
823 1         sample_vim = VimToMonitor(vim1_id, [])
824 1         mock_vim_to_monitor.return_value = sample_vim
825 1         self.monitor.add_new_vim_for_monitoring(vims_to_monitor, ro_task1, vim1_id)
826 1         mock_vim_to_monitor.assert_called_once_with(vim1_id, [])
827 1         mock_create_vm_to_monitor.assert_called_once_with(ro_task1)
828 1         self.assertEqual(len(sample_vim.vms), 1)
829 1         self.assertEqual(len(vims_to_monitor), 1)
830
831 1     @patch("osm_ng_ro.monitor.MonitorVms.create_vm_to_monitor")
832 1     @patch("osm_ng_ro.monitor.VimToMonitor")
833 1     def test_add_new_vim_for_monitoring_vim_to_monitor_raises(
834         self, mock_vim_to_monitor, mock_create_vm_to_monitor
835     ):
836 1         vims_to_monitor = []
837 1         mock_vim_to_monitor.side_effect = TypeError(
838             "Missing required positional arguments"
839         )
840 1         with self.assertRaises(TypeError) as err:
841 1             self.monitor.add_new_vim_for_monitoring(vims_to_monitor, ro_task1, None)
842 1         self.assertEqual(
843             str(err.exception.args[0]), "Missing required positional arguments"
844         )
845 1         mock_vim_to_monitor.assert_called_once_with(None, [])
846 1         mock_create_vm_to_monitor.assert_not_called()
847 1         self.assertEqual(len(vims_to_monitor), 0)
848
849 1     @patch("osm_ng_ro.monitor.MonitorVms.create_vm_to_monitor")
850 1     @patch("osm_ng_ro.monitor.VimToMonitor")
851 1     def test_add_new_vim_for_monitoring_create_vm_to_monitor_raises(
852         self, mock_vim_to_monitor, mock_create_vm_to_monitor
853     ):
854 1         vims_to_monitor = []
855 1         mock_create_vm_to_monitor.side_effect = KeyError("target_record is not found.")
856 1         with self.assertRaises(KeyError) as err:
857 1             self.monitor.add_new_vim_for_monitoring(vims_to_monitor, ro_task1, vim1_id)
858 1         self.assertEqual(str(err.exception.args[0]), "target_record is not found.")
859 1         mock_vim_to_monitor.assert_called_once_with(vim1_id, [])
860 1         mock_create_vm_to_monitor.assert_called_once_with(ro_task1)
861 1         self.assertEqual(len(vims_to_monitor), 0)
862
863 1     @patch("osm_ng_ro.monitor.MonitorVms.add_vm_to_existing_vim")
864 1     @patch("osm_ng_ro.monitor.MonitorVms.add_new_vim_for_monitoring")
865 1     def test_prepare_vims_to_monitor_no_proper_existing_vim(
866         self, mock_add_new_vim_for_monitoring, mock_add_vm_to_existing_vim
867     ):
868 1         mock_add_vm_to_existing_vim.return_value = False
869 1         self.monitor.prepare_vims_to_monitor(vims_to_monitor, ro_task1, vim1_id)
870 1         mock_add_vm_to_existing_vim.assert_called_once_with(
871             vims_to_monitor, ro_task1, vim1_id
872         )
873 1         mock_add_new_vim_for_monitoring.assert_called_once_with(
874             vims_to_monitor, ro_task1, vim1_id
875         )
876
877 1     @patch("osm_ng_ro.monitor.MonitorVms.add_vm_to_existing_vim")
878 1     @patch("osm_ng_ro.monitor.MonitorVms.add_new_vim_for_monitoring")
879 1     def test_prepare_vims_to_monitor_proper_existing_vim(
880         self, mock_add_new_vim_for_monitoring, mock_add_vm_to_existing_vim
881     ):
882 1         mock_add_vm_to_existing_vim.return_value = True
883 1         self.monitor.prepare_vims_to_monitor(vims_to_monitor, ro_task1, vim1_id)
884 1         mock_add_vm_to_existing_vim.assert_called_once_with(
885             vims_to_monitor, ro_task1, vim1_id
886         )
887 1         mock_add_new_vim_for_monitoring.assert_not_called()
888
889 1     @patch("osm_ng_ro.monitor.MonitorVms.add_vm_to_existing_vim")
890 1     @patch("osm_ng_ro.monitor.MonitorVms.add_new_vim_for_monitoring")
891 1     def test_prepare_vims_to_monitor_add_vm_to_existing_vim_raises(
892         self, mock_add_new_vim_for_monitoring, mock_add_vm_to_existing_vim
893     ):
894 1         mock_add_vm_to_existing_vim.side_effect = KeyError(
895             "target_record is not found."
896         )
897 1         with self.assertRaises(KeyError) as err:
898 1             self.monitor.prepare_vims_to_monitor(vims_to_monitor, ro_task1, vim1_id)
899 1         self.assertEqual(str(err.exception.args[0]), "target_record is not found.")
900 1         mock_add_vm_to_existing_vim.assert_called_once_with(
901             vims_to_monitor, ro_task1, vim1_id
902         )
903 1         mock_add_new_vim_for_monitoring.assert_not_called()
904
905 1     @patch("osm_ng_ro.monitor.MonitorVms.add_vm_to_existing_vim")
906 1     @patch("osm_ng_ro.monitor.MonitorVms.add_new_vim_for_monitoring")
907 1     def test_prepare_vims_to_monitor_add_new_vim_for_monitoring_raises(
908         self, mock_add_new_vim_for_monitoring, mock_add_vm_to_existing_vim
909     ):
910 1         mock_add_vm_to_existing_vim.return_value = False
911 1         mock_add_new_vim_for_monitoring.side_effect = KeyError(
912             "target_record is not found."
913         )
914 1         with self.assertRaises(KeyError) as err:
915 1             self.monitor.prepare_vims_to_monitor(vims_to_monitor, ro_task1, vim1_id)
916 1         self.assertEqual(str(err.exception.args[0]), "target_record is not found.")
917 1         mock_add_vm_to_existing_vim.assert_called_once_with(
918             vims_to_monitor, ro_task1, vim1_id
919         )
920 1         mock_add_new_vim_for_monitoring.assert_called_once_with(
921             vims_to_monitor, ro_task1, vim1_id
922         )
923
924 1     def test_get_db_paths(self):
925 1         self.monitor.db.get_one.return_value = sample_vnfr
926 1         (
927             vim_info_path,
928             vim_id,
929             vnfr_id,
930             vdur_path,
931             vdur_index,
932             db_vnfr,
933         ) = self.monitor._get_db_paths(target_record)
934 1         self.assertEqual(
935             vim_info_path, "vdur.0.vim_info.vim:f239ed93-756b-408e-89f8-fcbf47a9d8f7"
936         )
937 1         self.assertEqual(vim_id, vim4_id)
938 1         self.assertEqual(vdur_path, "vdur.0")
939 1         self.assertEqual(vdur_index, 0)
940 1         self.assertEqual(vnfr_id, vnfr_id)
941 1         self.assertDictEqual(db_vnfr, sample_vnfr)
942 1         self.monitor.db.get_one.assert_called_once_with(
943             "vnfrs",
944             {"_id": vnfr_id},
945             fail_on_empty=False,
946         )
947
948 1     def test_get_db_paths_empty_vnfr(self):
949 1         self.monitor.db.get_one.return_value = None
950 1         (
951             vim_info_path,
952             vim_id,
953             vnfr_id,
954             vdur_path,
955             vdur_index,
956             db_vnfr,
957         ) = self.monitor._get_db_paths(target_record)
958 1         self.assertEqual(
959             vim_info_path, "vdur.0.vim_info.vim:f239ed93-756b-408e-89f8-fcbf47a9d8f7"
960         )
961 1         self.assertEqual(vim_id, vim4_id)
962 1         self.assertEqual(vdur_path, "vdur.0")
963 1         self.assertEqual(vdur_index, 0)
964 1         self.assertEqual(vnfr_id, vnfr_id)
965 1         self.assertEqual(db_vnfr, None)
966 1         self.monitor.db.get_one.assert_called_once_with(
967             "vnfrs",
968             {"_id": vnfr_id},
969             fail_on_empty=False,
970         )
971
972 1     def test_get_db_paths_invalid_target_record(self):
973 1         invalid_target_record = "vnfrs:35c034cc-8c5b-48c4-bfa2-17a71577ef19:f239ed93-756b-408e-89f8-fcbf47a9d8f7"
974 1         with self.assertRaises(MonitorVmsException) as err:
975 1             self.monitor._get_db_paths(invalid_target_record)
976 1         self.assertEqual(
977             str(err.exception.args[0]),
978             "not enough values to unpack (expected 4, got 3)",
979         )
980 1         self.monitor.db.get_one.assert_not_called()
981
982 1     def test_get_db_paths_db_raises(self):
983 1         self.monitor.db.get_one.side_effect = DbException("Connection Failed.")
984 1         with self.assertRaises(MonitorVmsException) as err:
985 1             self.monitor._get_db_paths(target_record)
986 1         self.assertEqual(
987             str(err.exception.args[0]), "database exception Connection Failed."
988         )
989 1         self.monitor.db.get_one.assert_called_once_with(
990             "vnfrs",
991             {"_id": vnfr_id},
992             fail_on_empty=False,
993         )
994
995 1     def test_check_if_vdur_vim_info_exists(self):
996 1         vdur_index = 0
997 1         result = self.monitor._check_if_vdur_vim_info_exists(sample_vnfr, vdur_index)
998 1         self.assertEqual(result, True)
999
1000 1     def test_check_if_vdur_vim_info_exists_wrong_vdur_index(self):
1001 1         vdur_index = 3
1002 1         result = self.monitor._check_if_vdur_vim_info_exists(sample_vnfr, vdur_index)
1003 1         self.assertEqual(result, None)
1004
1005 1     def test_check_if_vdur_vim_info_exists_empty_vnfr(self):
1006 1         vdur_index = 2
1007 1         result = self.monitor._check_if_vdur_vim_info_exists({}, vdur_index)
1008 1         self.assertEqual(result, None)
1009
1010 1     def test_check_if_vdur_vim_info_exists_str_vdur_index(self):
1011 1         vdur_index = "2"
1012 1         result = self.monitor._check_if_vdur_vim_info_exists({}, vdur_index)
1013 1         self.assertEqual(result, None)
1014
1015 1     def test_check_if_vdur_vim_info_exists_none_vnfr(self):
1016 1         vdur_index = 2
1017 1         result = self.monitor._check_if_vdur_vim_info_exists(None, vdur_index)
1018 1         self.assertEqual(result, None)
1019
1020 1     @patch("osm_ng_ro.monitor.MonitorVms._get_db_paths")
1021 1     @patch("osm_ng_ro.monitor.MonitorVms._check_if_vdur_vim_info_exists")
1022 1     @patch("osm_ng_ro.monitor.deepcopy")
1023 1     def test_get_vm_data_from_db(
1024         self, mock_deepcopy, mock_vim_info_exists, mock_get_db_paths
1025     ):
1026 1         vim_id = vim4_id
1027 1         vdur_index = 0
1028 1         db_vnfr = sample_vnfr
1029 1         mock_get_db_paths.return_value = (
1030             vim_info_path,
1031             vim_id,
1032             vnfr_id,
1033             vdur_path,
1034             vdur_index,
1035             db_vnfr,
1036         )
1037 1         mock_vim_info_exists.return_value = True
1038 1         mock_deepcopy.return_value = sample_vim_info
1039 1         (
1040             vdur_path_result,
1041             vdur_vim_info_update_result,
1042             db_vnfr_result,
1043             existing_vim_info_result,
1044             vnfr_id_result,
1045             vim_info_path_result,
1046         ) = self.monitor._get_vm_data_from_db(sample_vm)
1047 1         self.assertEqual(vdur_path_result, vdur_path)
1048 1         self.assertEqual(vdur_vim_info_update_result, sample_vim_info)
1049 1         self.assertEqual(db_vnfr_result, db_vnfr)
1050 1         self.assertEqual(existing_vim_info_result, sample_vim_info)
1051 1         self.assertEqual(vnfr_id_result, vnfr_id)
1052 1         self.assertEqual(vim_info_path_result, vim_info_path)
1053 1         mock_deepcopy.assert_called_once_with(sample_vim_info)
1054 1         mock_get_db_paths.assert_called_once_with(target_record)
1055 1         mock_vim_info_exists.assert_called_once_with(db_vnfr, vdur_index)
1056
1057 1     @patch("osm_ng_ro.monitor.MonitorVms._get_db_paths")
1058 1     @patch("osm_ng_ro.monitor.MonitorVms._check_if_vdur_vim_info_exists")
1059 1     @patch("osm_ng_ro.monitor.deepcopy")
1060 1     def test_get_vm_data_from_db_no_vim_info(
1061         self, mock_deepcopy, mock_vim_info_exists, mock_get_db_paths
1062     ):
1063 1         vim_id = vim4_id
1064 1         vdur_index = 0
1065 1         db_vnfr = sample_vnfr
1066 1         mock_get_db_paths.return_value = (
1067             vim_info_path,
1068             vim_id,
1069             vnfr_id,
1070             vdur_path,
1071             vdur_index,
1072             db_vnfr,
1073         )
1074 1         mock_vim_info_exists.return_value = False
1075 1         result = self.monitor._get_vm_data_from_db(sample_vm)
1076 1         self.assertEqual(result, None)
1077 1         mock_deepcopy.assert_not_called()
1078 1         mock_get_db_paths.assert_called_once_with(target_record)
1079 1         mock_vim_info_exists.assert_called_once_with(db_vnfr, vdur_index)
1080
1081 1     @patch("osm_ng_ro.monitor.MonitorVms._get_db_paths")
1082 1     @patch("osm_ng_ro.monitor.MonitorVms._check_if_vdur_vim_info_exists")
1083 1     @patch("osm_ng_ro.monitor.deepcopy")
1084 1     def test_get_vm_data_from_db_get_db_path_raises(
1085         self, mock_deepcopy, mock_vim_info_exists, mock_get_db_paths
1086     ):
1087 1         mock_get_db_paths.side_effect = DbException("Connection failed.")
1088 1         with self.assertRaises(DbException) as err:
1089 1             self.monitor._get_vm_data_from_db(sample_vm)
1090 1         self.assertEqual(
1091             str(err.exception.args[0]), "database exception Connection failed."
1092         )
1093 1         mock_get_db_paths.assert_called_once_with(target_record)
1094 1         check_if_assert_not_called([mock_deepcopy, mock_vim_info_exists])
1095
1096 1     @patch("osm_ng_ro.monitor.MonitorVms._get_db_paths")
1097 1     @patch("osm_ng_ro.monitor.MonitorVms._check_if_vdur_vim_info_exists")
1098 1     @patch("osm_ng_ro.monitor.deepcopy")
1099 1     def test_get_vm_data_from_db_vnfr_without_correct_vdur_index(
1100         self, mock_deepcopy, mock_vim_info_exists, mock_get_db_paths
1101     ):
1102 1         vim_id = vim4_id
1103 1         vdur_index = 2
1104 1         db_vnfr = sample_vnfr
1105 1         mock_get_db_paths.return_value = (
1106             vim_info_path,
1107             vim_id,
1108             vnfr_id,
1109             vdur_path,
1110             vdur_index,
1111             db_vnfr,
1112         )
1113 1         mock_vim_info_exists.return_value = True
1114 1         with self.assertRaises(IndexError) as err:
1115 1             self.monitor._get_vm_data_from_db(sample_vm)
1116 1         self.assertEqual(str(err.exception.args[0]), "list index out of range")
1117 1         mock_deepcopy.assert_not_called()
1118 1         mock_get_db_paths.assert_called_once_with(target_record)
1119 1         mock_vim_info_exists.assert_called_once_with(db_vnfr, vdur_index)
1120
1121 1     @patch("osm_ng_ro.monitor.MonitorVms._get_db_paths")
1122 1     @patch("osm_ng_ro.monitor.MonitorVms._check_if_vdur_vim_info_exists")
1123 1     @patch("osm_ng_ro.monitor.deepcopy")
1124 1     def test_get_vm_data_from_db_vnfr_without_proper_vim_id(
1125         self, mock_deepcopy, mock_vim_info_exists, mock_get_db_paths
1126     ):
1127 1         vim_id = "5239ed93-756b-408e-89f8-fcbf47a9d8f7"
1128 1         vdur_index = 0
1129 1         db_vnfr = sample_vnfr
1130 1         mock_get_db_paths.return_value = (
1131             vim_info_path,
1132             vim_id,
1133             vnfr_id,
1134             vdur_path,
1135             vdur_index,
1136             db_vnfr,
1137         )
1138 1         mock_vim_info_exists.return_value = True
1139 1         self.monitor._get_vm_data_from_db(sample_vm)
1140 1         mock_deepcopy.assert_not_called()
1141 1         mock_get_db_paths.assert_called_once_with(target_record)
1142 1         mock_vim_info_exists.assert_called_once_with(db_vnfr, vdur_index)
1143
1144 1     def test_update_vim_info_for_deleted_vm_empty_input_dict(self):
1145 1         vdur_vim_info_update = {}
1146 1         self.monitor.update_vim_info_for_deleted_vm(vdur_vim_info_update)
1147 1         self.assertEqual(
1148             vdur_vim_info_update,
1149             deleted_externally,
1150         )
1151
1152 1     def test_update_vim_info_for_deleted_vm_update_existing_info(self):
1153 1         vdur_vim_info_update = {
1154             "vim_status": "ACTIVE",
1155             "vim_message": None,
1156             "vim_id": vm1_id,
1157             "vim_name": "test7-vnf-hackfest_basic-VM-000000",
1158         }
1159 1         self.monitor.update_vim_info_for_deleted_vm(vdur_vim_info_update)
1160 1         self.assertEqual(
1161             vdur_vim_info_update,
1162             deleted_externally,
1163         )
1164
1165 1     @patch("osm_ng_ro.monitor.MonitorVms._get_vm_data_from_db")
1166 1     @patch("osm_ng_ro.monitor.MonitorVms.update_vim_info_for_deleted_vm")
1167 1     @patch("osm_ng_ro.monitor.MonitorVms.backup_vdu_interfaces")
1168 1     @patch("osm_ng_ro.monitor.MonitorVms.update_in_database")
1169 1     def test_report_deleted_vdur_no_vm_data_in_db(
1170         self,
1171         mock_update_in_database,
1172         mock_backup_vdu_interfaces,
1173         mock_update_vim_info_for_deleted_vm,
1174         mock_get_vm_data_from_db,
1175     ):
1176 1         mock_get_vm_data_from_db.return_value = None
1177 1         self.monitor.report_deleted_vdur(sample_vm)
1178 1         self.assertEqual(mock_get_vm_data_from_db.call_count, 1)
1179 1         check_if_assert_not_called(
1180             [
1181                 mock_update_in_database,
1182                 mock_backup_vdu_interfaces,
1183                 mock_update_vim_info_for_deleted_vm,
1184             ]
1185         )
1186
1187 1     @patch("osm_ng_ro.monitor.MonitorVms._get_vm_data_from_db")
1188 1     @patch("osm_ng_ro.monitor.MonitorVms.update_vim_info_for_deleted_vm")
1189 1     @patch("osm_ng_ro.monitor.MonitorVms.backup_vdu_interfaces")
1190 1     @patch("osm_ng_ro.monitor.MonitorVms.update_in_database")
1191 1     def test_report_deleted_vdur(
1192         self,
1193         mock_update_in_database,
1194         mock_backup_vdu_interfaces,
1195         mock_update_vim_info_for_deleted_vm,
1196         mock_get_vm_data_from_db,
1197     ):
1198 1         existing_vim_info = sample_vim_info
1199 1         vdur_vim_info_update = deleted_externally
1200 1         mock_get_vm_data_from_db.return_value = (
1201             vdur_path,
1202             vdur_vim_info_update,
1203             None,
1204             existing_vim_info,
1205             vnfr_id,
1206             vim_info_path,
1207         )
1208 1         vdur_update = {
1209             vdur_path + ".status": "DELETED",
1210         }
1211 1         self.monitor.report_deleted_vdur(sample_vm)
1212 1         self.assertEqual(mock_get_vm_data_from_db.call_count, 1)
1213 1         mock_get_vm_data_from_db.assert_called_with(sample_vm)
1214 1         mock_update_vim_info_for_deleted_vm.assert_called_once_with(
1215             vdur_vim_info_update
1216         )
1217 1         mock_backup_vdu_interfaces.assert_called_once_with(vdur_vim_info_update)
1218 1         mock_update_in_database.assert_called_once_with(
1219             [vdur_update, {vim_info_path: vdur_vim_info_update}], vnfr_id
1220         )
1221
1222 1     @patch("osm_ng_ro.monitor.MonitorVms._get_vm_data_from_db")
1223 1     @patch("osm_ng_ro.monitor.MonitorVms.update_vim_info_for_deleted_vm")
1224 1     @patch("osm_ng_ro.monitor.MonitorVms.backup_vdu_interfaces")
1225 1     @patch("osm_ng_ro.monitor.MonitorVms.update_in_database")
1226 1     def test_report_deleted_vdur_vm_db_already_updated(
1227         self,
1228         mock_update_in_database,
1229         mock_backup_vdu_interfaces,
1230         mock_update_vim_info_for_deleted_vm,
1231         mock_get_vm_data_from_db,
1232     ):
1233 1         vdur_vim_info_update = existing_vim_info = deleted_externally
1234 1         mock_get_vm_data_from_db.return_value = (
1235             vdur_path,
1236             vdur_vim_info_update,
1237             None,
1238             existing_vim_info,
1239             vnfr_id,
1240             vim_info_path,
1241         )
1242 1         self.monitor.report_deleted_vdur(sample_vm)
1243 1         self.assertEqual(mock_get_vm_data_from_db.call_count, 1)
1244 1         mock_get_vm_data_from_db.assert_called_with(sample_vm)
1245 1         mock_update_vim_info_for_deleted_vm.assert_called_once_with(
1246             vdur_vim_info_update
1247         )
1248 1         check_if_assert_not_called(
1249             [mock_backup_vdu_interfaces, mock_update_in_database]
1250         )
1251
1252 1     @patch("osm_ng_ro.monitor.MonitorVms._get_vm_data_from_db")
1253 1     @patch("osm_ng_ro.monitor.MonitorVms.update_vim_info_for_deleted_vm")
1254 1     @patch("osm_ng_ro.monitor.MonitorVms.backup_vdu_interfaces")
1255 1     @patch("osm_ng_ro.monitor.MonitorVms.update_in_database")
1256 1     def test_report_deleted_vdur_get_vm_data_raises(
1257         self,
1258         mock_update_in_database,
1259         mock_backup_vdu_interfaces,
1260         mock_update_vim_info_for_deleted_vm,
1261         mock_get_vm_data_from_db,
1262     ):
1263 1         mock_get_vm_data_from_db.side_effect = IndexError("list index out of range.")
1264 1         with self.assertRaises(IndexError) as err:
1265 1             self.monitor.report_deleted_vdur(sample_vm)
1266 1         self.assertEqual(str(err.exception.args[0]), "list index out of range.")
1267 1         self.assertEqual(mock_get_vm_data_from_db.call_count, 1)
1268 1         mock_get_vm_data_from_db.assert_called_with(sample_vm)
1269 1         check_if_assert_not_called(
1270             [
1271                 mock_update_vim_info_for_deleted_vm,
1272                 mock_backup_vdu_interfaces,
1273                 mock_update_in_database,
1274             ]
1275         )
1276
1277 1     @patch("osm_ng_ro.monitor.MonitorVms._get_vm_data_from_db")
1278 1     @patch("osm_ng_ro.monitor.MonitorVms.update_vim_info_for_deleted_vm")
1279 1     @patch("osm_ng_ro.monitor.MonitorVms.backup_vdu_interfaces")
1280 1     @patch("osm_ng_ro.monitor.MonitorVms.update_in_database")
1281 1     def test_report_deleted_vdur_update_in_database_raises(
1282         self,
1283         mock_update_in_database,
1284         mock_backup_vdu_interfaces,
1285         mock_update_vim_info_for_deleted_vm,
1286         mock_get_vm_data_from_db,
1287     ):
1288 1         existing_vim_info = sample_vim_info
1289 1         vdur_vim_info_update = deleted_externally
1290 1         mock_update_in_database.side_effect = MonitorDbException(
1291             "Error while updating differences in VNFR."
1292         )
1293 1         mock_get_vm_data_from_db.return_value = (
1294             vdur_path,
1295             vdur_vim_info_update,
1296             None,
1297             existing_vim_info,
1298             vnfr_id,
1299             vim_info_path,
1300         )
1301 1         vdur_update = {
1302             vdur_path + ".status": "DELETED",
1303         }
1304 1         with self.assertRaises(MonitorDbException) as err:
1305 1             self.monitor.report_deleted_vdur(sample_vm)
1306 1         self.assertEqual(
1307             str(err.exception.args[0]), "Error while updating differences in VNFR."
1308         )
1309 1         self.assertEqual(mock_get_vm_data_from_db.call_count, 1)
1310 1         mock_get_vm_data_from_db.assert_called_with(sample_vm)
1311 1         mock_update_vim_info_for_deleted_vm.assert_called_once_with(
1312             vdur_vim_info_update
1313         )
1314 1         mock_backup_vdu_interfaces.assert_called_once_with(vdur_vim_info_update)
1315 1         mock_update_in_database.assert_called_once_with(
1316             [vdur_update, {vim_info_path: vdur_vim_info_update}], vnfr_id
1317         )
1318
1319 1     @patch("osm_ng_ro.monitor.MonitorVms.report_vdur_updates")
1320 1     @patch("osm_ng_ro.monitor.MonitorVms.report_deleted_vdur")
1321 1     def test_update_vnfrs(self, mock_report_deleted_vdur, mock_report_vdur_updates):
1322 1         vms_to_monitor = [sample_vm, sample_vm2, sample_vm3]
1323 1         servers = [server1, server2, server3, server4]
1324 1         ports = {"ports": [port1, port2]}
1325 1         self.monitor.update_vnfrs(servers, ports, vms_to_monitor)
1326 1         self.assertEqual(mock_report_vdur_updates.call_count, 2)
1327 1         mock_report_deleted_vdur.assert_called_once_with(sample_vm3)
1328 1         _call_mock_report_vdur_updates = mock_report_vdur_updates.call_args_list
1329 1         self.assertEqual(
1330             _call_mock_report_vdur_updates[0].args,
1331             (server1, sample_vm, ports),
1332         )
1333 1         self.assertEqual(
1334             _call_mock_report_vdur_updates[1].args,
1335             (server2, sample_vm2, ports),
1336         )
1337
1338 1     @patch("osm_ng_ro.monitor.MonitorVms.report_vdur_updates")
1339 1     @patch("osm_ng_ro.monitor.MonitorVms.report_deleted_vdur")
1340 1     def test_update_vnfrs_empty_vms_to_monitor(
1341         self, mock_report_deleted_vdur, mock_report_vdur_updates
1342     ):
1343 1         vms_to_monitor = []
1344 1         servers = [server1, server2, server3, server4]
1345 1         ports = {"ports": [port1, port2]}
1346 1         self.monitor.update_vnfrs(servers, ports, vms_to_monitor)
1347 1         check_if_assert_not_called([mock_report_deleted_vdur, mock_report_vdur_updates])
1348
1349 1     @patch("osm_ng_ro.monitor.MonitorVms.report_vdur_updates")
1350 1     @patch("osm_ng_ro.monitor.MonitorVms.report_deleted_vdur")
1351 1     def test_update_vnfrs_empty_servers(
1352         self, mock_report_deleted_vdur, mock_report_vdur_updates
1353     ):
1354 1         vms_to_monitor = [sample_vm, sample_vm2, sample_vm3]
1355 1         servers = []
1356 1         ports = {"ports": [port1, port2]}
1357 1         self.monitor.update_vnfrs(servers, ports, vms_to_monitor)
1358 1         mock_report_vdur_updates.assert_not_called()
1359 1         self.assertEqual(mock_report_deleted_vdur.call_count, 3)
1360 1         _call_mock_report_deleted_vdur = mock_report_deleted_vdur.call_args_list
1361 1         self.assertEqual(
1362             _call_mock_report_deleted_vdur[0].args[0],
1363             (sample_vm),
1364         )
1365 1         self.assertEqual(
1366             _call_mock_report_deleted_vdur[1].args[0],
1367             (sample_vm2),
1368         )
1369 1         self.assertEqual(
1370             _call_mock_report_deleted_vdur[2].args[0],
1371             (sample_vm3),
1372         )
1373
1374 1     @patch("osm_ng_ro.monitor.MonitorVms.report_vdur_updates")
1375 1     @patch("osm_ng_ro.monitor.MonitorVms.report_deleted_vdur")
1376 1     def test_update_vnfrs_report_vdur_updates_raises(
1377         self, mock_report_deleted_vdur, mock_report_vdur_updates
1378     ):
1379 1         vms_to_monitor = [sample_vm, sample_vm2, sample_vm3]
1380 1         servers = [server1, server2, server3, server4]
1381 1         ports = {"ports": [port1, port2]}
1382 1         mock_report_vdur_updates.side_effect = IndexError("list index out of range.")
1383 1         with self.assertRaises(IndexError) as err:
1384 1             self.monitor.update_vnfrs(servers, ports, vms_to_monitor)
1385 1         self.assertEqual(str(err.exception.args[0]), "list index out of range.")
1386 1         self.assertEqual(mock_report_vdur_updates.call_count, 1)
1387 1         mock_report_deleted_vdur.assert_not_called()
1388 1         _call_mock_report_vdur_updates = mock_report_vdur_updates.call_args_list
1389 1         self.assertEqual(
1390             _call_mock_report_vdur_updates[0].args,
1391             (server1, sample_vm, ports),
1392         )
1393
1394 1     @patch("osm_ng_ro.monitor.MonitorVms.report_vdur_updates")
1395 1     @patch("osm_ng_ro.monitor.MonitorVms.report_deleted_vdur")
1396 1     def test_update_vnfrs_report_deleted_vdur_raises(
1397         self, mock_report_deleted_vdur, mock_report_vdur_updates
1398     ):
1399 1         vms_to_monitor = [sample_vm, sample_vm2, sample_vm3]
1400 1         servers = [server1, server2, server3, server4]
1401 1         ports = {"ports": [port1, port2]}
1402 1         mock_report_deleted_vdur.side_effect = DbException("DB is not in active state.")
1403 1         with self.assertRaises(DbException) as err:
1404 1             self.monitor.update_vnfrs(servers, ports, vms_to_monitor)
1405 1         self.assertEqual(
1406             str(err.exception.args[0]), "database exception DB is not in active state."
1407         )
1408 1         self.assertEqual(mock_report_vdur_updates.call_count, 2)
1409 1         mock_report_deleted_vdur.assert_called_once_with(sample_vm3)
1410 1         _call_mock_report_vdur_updates = mock_report_vdur_updates.call_args_list
1411 1         self.assertEqual(
1412             _call_mock_report_vdur_updates[0].args,
1413             (server1, sample_vm, ports),
1414         )
1415 1         self.assertEqual(
1416             _call_mock_report_vdur_updates[1].args,
1417             (server2, sample_vm2, ports),
1418         )
1419
1420 1     @patch("osm_ng_ro.monitor.yaml")
1421 1     def test_serialize_string_value(self, mock_yaml):
1422 1         value = "some string"
1423 1         result = self.monitor.serialize(value)
1424 1         mock_yaml.dump.assert_not_called()
1425 1         self.assertEqual(result, value)
1426
1427 1     @patch("osm_ng_ro.monitor.yaml")
1428 1     def test_serialize_list_value(self, mock_yaml):
1429 1         value = [
1430             {"version": 3.4},
1431             ["image", "ghcr.io/foo/mysvc"],
1432             {"MYSVC_ENV": "to_nice_yaml"},
1433         ]
1434 1         output = [
1435             {"version": 3.4},
1436             ["image", "ghcr.io/foo/mysvc"],
1437             {"MYSVC_ENV": "to_nice_yaml"},
1438         ]
1439 1         mock_yaml.dump.return_value = output
1440 1         result = self.monitor.serialize(value)
1441 1         mock_yaml.dump.assert_called_once()
1442 1         self.assertEqual(result, output)
1443
1444 1     @patch("osm_ng_ro.monitor.yaml")
1445 1     def test_serialize_dict_value(self, mock_yaml):
1446 1         value = {
1447             "version": 3.4,
1448             "MYSVC_ENV": "to_nice_yaml_to_nice_yaml_to_nice_yaml_to_nice_yaml_to_nice_yaml",
1449         }
1450 1         output = {
1451             "MYSVC_ENV": "to_nice_yaml_to_nice_yaml_to_nice_yaml_to_nice_yaml_to_nice_yaml",
1452             "version": 3.4,
1453         }
1454 1         mock_yaml.dump.return_value = output
1455 1         result = self.monitor.serialize(value)
1456 1         mock_yaml.dump.assert_called_once()
1457 1         self.assertEqual(result, output)
1458
1459 1     @patch("osm_ng_ro.monitor.yaml")
1460 1     def test_serialize_raise_representer_error(self, mock_yaml):
1461 1         value = {
1462             "name": {"firstname": str, "lastname": str},
1463             "age": int,
1464         }
1465 1         mock_yaml.dump.side_effect = yaml.representer.RepresenterError(
1466             "cannot represent an object"
1467         )
1468 1         result = self.monitor.serialize(value)
1469 1         mock_yaml.dump.assert_called_once()
1470 1         self.assertEqual(result, str(value))
1471
1472 1     @patch("osm_ng_ro.monitor.yaml")
1473 1     def test_serialize_raise_yaml_error(self, mock_yaml):
1474 1         value = {
1475             "name": {"firstname": str, "lastname": str},
1476             "age": int,
1477         }
1478
1479 1         mock_yaml.dump.side_effect = yaml.YAMLError("cannot represent an object.")
1480 1         with self.assertRaises(yaml.YAMLError) as err:
1481 1             result = self.monitor.serialize(value)
1482 0             self.assertEqual(result, None)
1483 1         self.assertEqual(str(err.exception.args[0]), "cannot represent an object.")
1484 1         mock_yaml.dump.assert_called_once()
1485
1486 1     @patch("osm_ng_ro.monitor.MonitorVms.serialize")
1487 1     def test_get_server_info_with_user_data(self, mock_serialize):
1488 1         all_server_info = deepcopy(server_other_info)
1489 1         user_data = {
1490             "OS-EXT-SRV-ATTR:user_data": "EXT-USER-DATA",
1491             "user_data": "some-data",
1492         }
1493 1         mock_serialize.return_value = serialized_server_info
1494 1         all_server_info.update(user_data)
1495 1         server5 = create_server(vm1_id, "server5", info=all_server_info)
1496 1         result = self.monitor._get_server_info(server5)
1497 1         self.assertEqual(result, serialized_server_info)
1498 1         mock_serialize.assert_called_once_with(server_other_info)
1499
1500 1     @patch("osm_ng_ro.monitor.MonitorVms.serialize")
1501 1     def test_get_server_info_without_user_data(self, mock_serialize):
1502 1         mock_serialize.return_value = serialized_server_info
1503 1         server5 = create_server(vm1_id, "server5", info=server_other_info)
1504 1         result = self.monitor._get_server_info(server5)
1505 1         self.assertEqual(result, serialized_server_info)
1506 1         mock_serialize.assert_called_once_with(server_other_info)
1507
1508 1     @patch("osm_ng_ro.monitor.MonitorVms.serialize")
1509 1     def test_get_server_info_empty_server_info(self, mock_serialize):
1510 1         server_other_info = {}
1511 1         expected_result = {}
1512 1         mock_serialize.return_value = expected_result
1513 1         server5 = create_server(vm1_id, "server5", info=server_other_info)
1514 1         result = self.monitor._get_server_info(server5)
1515 1         self.assertEqual(result, expected_result)
1516 1         mock_serialize.assert_called_once_with(server_other_info)
1517
1518 1     @patch("osm_ng_ro.monitor.MonitorVms.serialize")
1519 1     def test_get_server_info_serialize_raises(self, mock_serialize):
1520 1         server_other_info = {
1521             "admin_state_up": "true",
1522             "binding:host_id": int,
1523             "binding:profile": {},
1524             "binding:vif_type": str,
1525             "binding:vnic_type": "normal",
1526             "created_at": "2023-02-22T05:35:46Z",
1527         }
1528 1         mock_serialize.side_effect = yaml.YAMLError("cannot represent an object.")
1529 1         server5 = create_server(vm1_id, "server5", info=server_other_info)
1530 1         with self.assertRaises(yaml.YAMLError) as err:
1531 1             self.monitor._get_server_info(server5)
1532 1         self.assertEqual(str(err.exception.args[0]), "cannot represent an object.")
1533 1         mock_serialize.assert_called_once_with(server_other_info)
1534
1535 1     @patch("osm_ng_ro.monitor.MonitorVms._get_server_info")
1536 1     def test_check_vm_status_updates_server_status_ok(self, mock_server_info):
1537 1         server6 = create_server("server6-id", "server6", status="PAUSED")
1538 1         mock_server_info.return_value = serialized_server_info
1539 1         vdur_vim_info_update = {}
1540 1         vdur_update = {}
1541 1         expected_vdur_vim_info_update = {
1542             "vim_status": "PAUSED",
1543             "vim_details": serialized_server_info,
1544             "vim_id": server6.id,
1545             "vim_name": server6.name,
1546         }
1547 1         expected_vdur_update = {
1548             "vdur.0.status": "PAUSED",
1549             "vdur.0.name": server6.name,
1550         }
1551 1         self.monitor.check_vm_status_updates(
1552             vdur_vim_info_update, vdur_update, server6, vdur_path
1553         )
1554 1         self.assertDictEqual(vdur_vim_info_update, expected_vdur_vim_info_update)
1555 1         self.assertDictEqual(vdur_update, expected_vdur_update)
1556 1         mock_server_info.assert_called_once_with(server6)
1557
1558 1     @patch("osm_ng_ro.monitor.MonitorVms._get_server_info")
1559 1     def test_check_vm_status_updates_server_status_nok(self, mock_server_info):
1560 1         server8 = create_server("server8-id", "server8", status="FAILED")
1561 1         mock_server_info.return_value = serialized_server_info
1562 1         vdur_vim_info_update = {}
1563 1         vdur_update = {}
1564 1         expected_vdur_vim_info_update = {
1565             "vim_status": "FAILED",
1566             "vim_details": serialized_server_info,
1567             "vim_id": server8.id,
1568             "vim_name": server8.name,
1569             "vim_message": "VIM status reported FAILED",
1570         }
1571 1         expected_vdur_update = {
1572             "vdur.0.status": "FAILED",
1573             "vdur.0.name": server8.name,
1574         }
1575 1         self.monitor.check_vm_status_updates(
1576             vdur_vim_info_update, vdur_update, server8, vdur_path
1577         )
1578 1         self.assertDictEqual(vdur_vim_info_update, expected_vdur_vim_info_update)
1579 1         self.assertDictEqual(vdur_update, expected_vdur_update)
1580 1         mock_server_info.assert_called_once_with(server8)
1581
1582 1     @patch("osm_ng_ro.monitor.MonitorVms._get_server_info")
1583 1     def test_check_vm_status_updates_get_server_info_raises(self, mock_server_info):
1584 1         server8 = create_server("server8-id", "server8", status="FAILED")
1585 1         mock_server_info.side_effect = yaml.YAMLError("Cannot represent an object.")
1586 1         vdur_vim_info_update = {}
1587 1         vdur_update = {}
1588 1         expected_vdur_vim_info_update = {
1589             "vim_status": "FAILED",
1590             "vim_message": "VIM status reported FAILED",
1591         }
1592 1         expected_vdur_update = {
1593             "vdur.0.status": "FAILED",
1594         }
1595 1         with self.assertRaises(yaml.YAMLError) as err:
1596 1             self.monitor.check_vm_status_updates(
1597                 vdur_vim_info_update, vdur_update, server8, vdur_path
1598             )
1599 1         self.assertEqual(str(err.exception.args[0]), "Cannot represent an object.")
1600 1         self.assertDictEqual(vdur_vim_info_update, expected_vdur_vim_info_update)
1601 1         self.assertDictEqual(vdur_update, expected_vdur_update)
1602 1         mock_server_info.assert_called_once_with(server8)
1603
1604 1     def test_get_interface_info(self):
1605 1         interface = {"vim_interface_id": "4d081f50-e13a-4306-a67e-1edb28d76013"}
1606 1         ports = {"ports": [port1, port2]}
1607 1         result = self.monitor.get_interface_info(ports, interface, server1)
1608 1         self.assertEqual(result, port1)
1609
1610 1     def test_get_interface_info_port_id_mismatch(self):
1611 1         interface = {"vim_interface_id": "4d081f50-e13a-4306-a67e-1edb28d76013"}
1612 1         ports = {"ports": [port2]}
1613 1         result = self.monitor.get_interface_info(ports, interface, server1)
1614 1         self.assertEqual(result, None)
1615
1616 1     def test_get_interface_info_device_id_mismatch(self):
1617 1         interface = {"vim_interface_id": "4d081f50-e13a-4306-a67e-1edb28d76013"}
1618 1         ports = {"ports": [port1, port2]}
1619 1         result = self.monitor.get_interface_info(ports, interface, server2)
1620 1         self.assertEqual(result, None)
1621
1622 1     def test_get_interface_info_empty_ports(self):
1623 1         interface = {"vim_interface_id": "4d081f50-e13a-4306-a67e-1edb28d76013"}
1624 1         ports = {"ports": []}
1625 1         result = self.monitor.get_interface_info(ports, interface, server2)
1626 1         self.assertEqual(result, None)
1627
1628 1     def test_check_vlan_pci_update(self):
1629 1         interface_info = interface_with_binding
1630 1         index = 1
1631 1         vdur_vim_info_update = {"interfaces": [{}, {}]}
1632 1         expected_vdur_vim_info_update = {
1633             "interfaces": [{}, {"pci": "0000:86:17.4", "vlan": 400}]
1634         }
1635 1         self.monitor.check_vlan_pci_updates(interface_info, index, vdur_vim_info_update)
1636 1         self.assertDictEqual(vdur_vim_info_update, expected_vdur_vim_info_update)
1637
1638 1     def test_check_vlan_pci_update_empty_interface_info(self):
1639 1         interface_info = {}
1640 1         index = 1
1641 1         vdur_vim_info_update = {"interfaces": [{}, {}]}
1642 1         expected_vdur_vim_info_update = {"interfaces": [{}, {}]}
1643 1         self.monitor.check_vlan_pci_updates(interface_info, index, vdur_vim_info_update)
1644 1         self.assertDictEqual(vdur_vim_info_update, expected_vdur_vim_info_update)
1645
1646 1     def test_check_vlan_pci_update_index_out_of_range(self):
1647 1         interface_info = interface_with_binding
1648 1         index = 3
1649 1         vdur_vim_info_update = {"interfaces": [{}]}
1650 1         expected_vdur_vim_info_update = {"interfaces": [{}]}
1651 1         with self.assertRaises(IndexError) as err:
1652 1             self.monitor.check_vlan_pci_updates(
1653                 interface_info, index, vdur_vim_info_update
1654             )
1655 1         self.assertEqual(str(err.exception.args[0]), "list index out of range")
1656 1         self.assertEqual(vdur_vim_info_update, expected_vdur_vim_info_update)
1657
1658 1     def test_check_vlan_pci_update_empty_vdur_vim_info_update(self):
1659 1         interface_info = interface_with_binding
1660 1         index = 0
1661 1         vdur_vim_info_update = {}
1662 1         expected_vdur_vim_info_update = {}
1663 1         with self.assertRaises(KeyError) as err:
1664 1             self.monitor.check_vlan_pci_updates(
1665                 interface_info, index, vdur_vim_info_update
1666             )
1667 1         self.assertEqual(str(err.exception.args[0]), "interfaces")
1668 1         self.assertEqual(vdur_vim_info_update, expected_vdur_vim_info_update)
1669
1670 1     @patch("osm_ng_ro.monitor.MonitorVms._get_current_ip_address")
1671 1     def test_check_vdur_interface_updates(self, mock_get_current_ip_address):
1672 1         vdur_update, vnfr_update = {}, {}
1673 1         index = 0
1674 1         interface_info = {
1675             "fixed_ips": [{"ip_address": ip1_addr}],
1676             "mac_address": mac1_addr,
1677         }
1678 1         mock_get_current_ip_address.return_value = ip1_addr
1679 1         expected_vdur_update = {
1680             "vdur.0.interfaces.0.ip-address": ip1_addr,
1681             "vdur.0.ip-address": ip1_addr,
1682             "vdur.0.interfaces.0.mac-address": mac1_addr,
1683         }
1684 1         expected_vnfr_update = {
1685             "35c034cc-8c5b-48c4-bfa2-17a71577ef19.ip-address": ip1_addr
1686         }
1687 1         self.monitor.check_vdur_interface_updates(
1688             vdur_update,
1689             vdur_path,
1690             index,
1691             interface_info,
1692             old_interface2,
1693             vnfr_update,
1694             vnfr_id,
1695         )
1696 1         self.assertEqual(vnfr_update, expected_vnfr_update)
1697 1         self.assertEqual(vdur_update, expected_vdur_update)
1698 1         mock_get_current_ip_address.assert_called_once_with(interface_info)
1699
1700 1     @patch("osm_ng_ro.monitor.MonitorVms._get_current_ip_address")
1701 1     def test_check_vdur_interface_updates_not_mgmt_interface(
1702         self, mock_get_current_ip_address
1703     ):
1704 1         vdur_update, vnfr_update = {}, {}
1705 1         index = 0
1706 1         interface_info = {
1707             "fixed_ips": [{"ip_address": ip1_addr}],
1708             "mac_address": mac1_addr,
1709         }
1710 1         mock_get_current_ip_address.return_value = ip1_addr
1711 1         old_interface = {}
1712 1         expected_vdur_update = {
1713             "vdur.0.interfaces.0.ip-address": ip1_addr,
1714             "vdur.0.interfaces.0.mac-address": mac1_addr,
1715         }
1716 1         self.monitor.check_vdur_interface_updates(
1717             vdur_update,
1718             vdur_path,
1719             index,
1720             interface_info,
1721             old_interface,
1722             vnfr_update,
1723             vnfr_id,
1724         )
1725 1         self.assertEqual(vnfr_update, {})
1726 1         self.assertEqual(vdur_update, expected_vdur_update)
1727 1         mock_get_current_ip_address.assert_called_once_with(interface_info)
1728
1729 1     @patch("osm_ng_ro.monitor.MonitorVms._get_current_ip_address")
1730 1     def test_check_vdur_interface_updates_without_mac_address(
1731         self, mock_get_current_ip_address
1732     ):
1733 1         vdur_update, vnfr_update = {}, {}
1734 1         index = 0
1735 1         interface_info = {"fixed_ips": [{"ip_address": ip1_addr}]}
1736 1         mock_get_current_ip_address.return_value = ip1_addr
1737 1         expected_vdur_update = {
1738             "vdur.0.interfaces.0.ip-address": ip1_addr,
1739             "vdur.0.ip-address": ip1_addr,
1740             "vdur.0.interfaces.0.mac-address": None,
1741         }
1742 1         expected_vnfr_update = {
1743             "35c034cc-8c5b-48c4-bfa2-17a71577ef19.ip-address": ip1_addr
1744         }
1745 1         self.monitor.check_vdur_interface_updates(
1746             vdur_update,
1747             vdur_path,
1748             index,
1749             interface_info,
1750             old_interface2,
1751             vnfr_update,
1752             vnfr_id,
1753         )
1754 1         self.assertEqual(vnfr_update, expected_vnfr_update)
1755 1         self.assertEqual(vdur_update, expected_vdur_update)
1756 1         mock_get_current_ip_address.assert_called_once_with(interface_info)
1757
1758 1     @patch("osm_ng_ro.monitor.MonitorVms._get_current_ip_address")
1759 1     def test_check_vdur_interface_updates_without_ip_address(
1760         self, mock_get_current_ip_address
1761     ):
1762 1         vdur_update, vnfr_update = {}, {}
1763 1         index = 0
1764 1         interface_info = {"fixed_ips": [], "mac_address": mac1_addr}
1765 1         mock_get_current_ip_address.return_value = None
1766 1         expected_vdur_update = {
1767             "vdur.0.interfaces.0.mac-address": mac1_addr,
1768         }
1769 1         expected_vnfr_update = {}
1770 1         self.monitor.check_vdur_interface_updates(
1771             vdur_update,
1772             vdur_path,
1773             index,
1774             interface_info,
1775             old_interface2,
1776             vnfr_update,
1777             vnfr_id,
1778         )
1779 1         self.assertEqual(vnfr_update, expected_vnfr_update)
1780 1         self.assertEqual(vdur_update, expected_vdur_update)
1781 1         mock_get_current_ip_address.assert_called_once_with(interface_info)
1782
1783 1     @patch("osm_ng_ro.monitor.MonitorVms._get_current_ip_address")
1784 1     def test_check_vdur_interface_updates_wrong_interface_info_format(
1785         self, mock_get_current_ip_address
1786     ):
1787 1         vdur_update, vnfr_update = {}, {}
1788 1         index = 0
1789 1         interface_info = {"fixed_ips": ip1_addr, "mac_address": mac1_addr}
1790 1         mock_get_current_ip_address.side_effect = TypeError(
1791             "str is not list like object."
1792         )
1793 1         old_interface = {}
1794 1         with self.assertRaises(TypeError) as err:
1795 1             self.monitor.check_vdur_interface_updates(
1796                 vdur_update,
1797                 vdur_path,
1798                 index,
1799                 interface_info,
1800                 old_interface,
1801                 vnfr_update,
1802                 vnfr_id,
1803             )
1804 1         self.assertEqual(str(err.exception), "str is not list like object.")
1805 1         self.assertEqual(vnfr_update, {})
1806 1         self.assertEqual(vdur_update, {})
1807 1         mock_get_current_ip_address.assert_called_once_with(interface_info)
1808
1809 1     def test_get_current_ip_address(self):
1810 1         interface_info = {
1811             "fixed_ips": [{"ip_address": ip1_addr}],
1812             "mac_address": mac1_addr,
1813         }
1814 1         result = self.monitor._get_current_ip_address(interface_info)
1815 1         self.assertEqual(result, ip1_addr)
1816
1817 1     def test_get_current_ip_address_no_ip(self):
1818 1         interface_info = {"fixed_ips": [{}], "mac_address": mac1_addr}
1819 1         result = self.monitor._get_current_ip_address(interface_info)
1820 1         self.assertEqual(result, None)
1821
1822 1     def test_backup_vdu_interfaces_without_vim_message(self):
1823 1         vdur_vim_info_update = {
1824             "interfaces": {"mac_address": mac1_addr},
1825         }
1826 1         expected_vdur_vim_info_update = {
1827             "interfaces": {"mac_address": mac1_addr},
1828             "interfaces_backup": {"mac_address": mac1_addr},
1829         }
1830 1         self.monitor.backup_vdu_interfaces(vdur_vim_info_update)
1831 1         self.assertDictEqual(expected_vdur_vim_info_update, vdur_vim_info_update)
1832
1833 1     def test_backup_vdu_interfaces_with_vim_message(self):
1834 1         vdur_vim_info_update = {
1835             "interfaces": {"mac_address": mac1_addr},
1836             "vim_message": "Deleted Externally",
1837         }
1838 1         expected_vdur_vim_info_update = {
1839             "interfaces": {"mac_address": mac1_addr},
1840             "vim_message": "Deleted Externally",
1841         }
1842 1         self.monitor.backup_vdu_interfaces(vdur_vim_info_update)
1843 1         self.assertDictEqual(expected_vdur_vim_info_update, vdur_vim_info_update)
1844
1845 1     def test_backup_vdu_interfaces_with_empty_interfaces(self):
1846 1         vdur_vim_info_update = {
1847             "interfaces": {},
1848         }
1849 1         expected_vdur_vim_info_update = {
1850             "interfaces": {},
1851         }
1852 1         self.monitor.backup_vdu_interfaces(vdur_vim_info_update)
1853 1         self.assertDictEqual(expected_vdur_vim_info_update, vdur_vim_info_update)
1854
1855 1     @patch("osm_ng_ro.monitor.MonitorVms.serialize")
1856 1     def test_update_vdur_vim_info_interfaces(self, mock_serialize):
1857 1         index = 1
1858 1         vdur_vim_info_update = {
1859             "interfaces": [{}, {"mac_address": mac1_addr, "compute_node": "host1"}]
1860         }
1861 1         all_server_info = deepcopy(server_other_info)
1862 1         host_data = {"OS-EXT-SRV-ATTR:host": "nova"}
1863 1         mock_serialize.return_value = serialized_interface_info
1864 1         all_server_info.update(host_data)
1865 1         server7 = create_server(vm1_id, "server7", info=all_server_info)
1866 1         expected_vdur_vim_info_update = {
1867             "interfaces": [
1868                 {},
1869                 {
1870                     "mac_address": mac2_addr,
1871                     "compute_node": "nova",
1872                     "vim_info": serialized_interface_info,
1873                     "vim_net_id": net1_id,
1874                     "ip_address": ip1_addr,
1875                 },
1876             ]
1877         }
1878 1         self.monitor.update_vdur_vim_info_interfaces(
1879             vdur_vim_info_update, index, interface_info2, server7
1880         )
1881 1         self.assertDictEqual(vdur_vim_info_update, expected_vdur_vim_info_update)
1882 1         mock_serialize.assert_called_once_with(interface_info2)
1883
1884 1     @patch("osm_ng_ro.monitor.MonitorVms.serialize")
1885 1     def test_update_vdur_vim_info_interfaces_serialize_raises(self, mock_serialize):
1886 1         index = 1
1887 1         vdur_vim_info_update = {
1888             "interfaces": [{}, {"mac_address": mac1_addr, "compute_node": "host1"}]
1889         }
1890 1         all_server_info = deepcopy(server_other_info)
1891 1         host_data = {"OS-EXT-SRV-ATTR:host": "nova"}
1892 1         mock_serialize.side_effect = yaml.YAMLError("Cannot represent an object.")
1893 1         all_server_info.update(host_data)
1894 1         server7 = create_server(vm1_id, "server7", info=all_server_info)
1895 1         expected_vdur_vim_info = deepcopy(vdur_vim_info_update)
1896 1         with self.assertRaises(yaml.YAMLError) as err:
1897 1             self.monitor.update_vdur_vim_info_interfaces(
1898                 vdur_vim_info_update, index, interface_info2, server7
1899             )
1900 1         self.assertEqual(str(err.exception), "Cannot represent an object.")
1901 1         self.assertDictEqual(vdur_vim_info_update, expected_vdur_vim_info)
1902 1         mock_serialize.assert_called_once_with(interface_info2)
1903
1904 1     @patch("osm_ng_ro.monitor.MonitorVms.serialize")
1905 1     def test_update_vdur_vim_info_interfaces_empty_interface_info(self, mock_serialize):
1906 1         index = 1
1907 1         vdur_vim_info_update = {
1908             "interfaces": [{}, {"mac_address": mac1_addr, "compute_node": "host1"}]
1909         }
1910 1         interface_info = {}
1911 1         all_server_info = deepcopy(server_other_info)
1912 1         host_data = {"OS-EXT-SRV-ATTR:host": "nova"}
1913 1         all_server_info.update(host_data)
1914 1         server7 = create_server(vm1_id, "server7", info=all_server_info)
1915 1         expected_vdur_vim_info = deepcopy(vdur_vim_info_update)
1916 1         with self.assertRaises(KeyError) as err:
1917 1             self.monitor.update_vdur_vim_info_interfaces(
1918                 vdur_vim_info_update, index, interface_info, server7
1919             )
1920 1         self.assertEqual(str(err.exception.args[0]), "mac_address")
1921 1         self.assertDictEqual(vdur_vim_info_update, expected_vdur_vim_info)
1922 1         mock_serialize.assert_not_called()
1923
1924 1     @patch("osm_ng_ro.monitor.MonitorVms.serialize")
1925 1     def test_update_vdur_vim_info_interfaces_invalid_vdur_vim_info(
1926         self, mock_serialize
1927     ):
1928 1         index = 1
1929 1         vdur_vim_info_update = {
1930             "interfaces": [{"mac_address": mac1_addr, "compute_node": "host1"}, {}]
1931         }
1932 1         expected_vdur_vim_info = deepcopy(vdur_vim_info_update)
1933 1         with self.assertRaises(MonitorVmsException) as err:
1934 1             self.monitor.update_vdur_vim_info_interfaces(
1935                 vdur_vim_info_update, index, interface_info2, server7
1936             )
1937 1         self.assertEqual(
1938             str(err.exception.args[0]), "Existing interfaces info could not found."
1939         )
1940 1         self.assertDictEqual(vdur_vim_info_update, expected_vdur_vim_info)
1941 1         mock_serialize.assert_not_called()
1942
1943 1     @patch("osm_ng_ro.monitor.MonitorVms.update_vdur_vim_info_interfaces")
1944 1     @patch("osm_ng_ro.monitor.MonitorVms.check_vlan_pci_updates")
1945 1     @patch("osm_ng_ro.monitor.MonitorVms.check_vdur_interface_updates")
1946 1     def test_prepare_interface_updates(
1947         self,
1948         mock_check_vdur_interface_updates,
1949         mock_check_vlan_pci_updates,
1950         mock_update_vdur_vim_info_interfaces,
1951     ):
1952 1         vdur_vim_info_update = {
1953             "interfaces": [{"mac_address": mac1_addr, "compute_node": "host1"}]
1954         }
1955 1         interface_info = {
1956             "fixed_ips": [{"ip_address": ip1_addr}],
1957             "mac_address": mac2_addr,
1958             "network_id": net1_id,
1959         }
1960 1         old_interface = {
1961             "mgmt_vdu_interface": True,
1962             "mgmt_vnf_interface": True,
1963         }
1964 1         index = 0
1965 1         vnfr_update, vdur_update = {}, {}
1966 1         self.monitor.prepare_interface_updates(
1967             vdur_vim_info_update,
1968             index,
1969             interface_info,
1970             server7,
1971             vdur_path,
1972             vnfr_update,
1973             old_interface2,
1974             vdur_update,
1975             vnfr_id,
1976         )
1977 1         mock_update_vdur_vim_info_interfaces.assert_called_once_with(
1978             vdur_vim_info_update, index, interface_info, server7
1979         )
1980 1         mock_check_vlan_pci_updates.assert_called_once_with(
1981             interface_info, index, vdur_vim_info_update
1982         )
1983 1         mock_check_vdur_interface_updates.assert_called_once_with(
1984             vdur_update,
1985             vdur_path,
1986             index,
1987             interface_info,
1988             old_interface,
1989             vnfr_update,
1990             vnfr_id,
1991         )
1992
1993 1     @patch("osm_ng_ro.monitor.MonitorVms.update_vdur_vim_info_interfaces")
1994 1     @patch("osm_ng_ro.monitor.MonitorVms.check_vlan_pci_updates")
1995 1     @patch("osm_ng_ro.monitor.MonitorVms.check_vdur_interface_updates")
1996 1     def test_prepare_interface_updates_update_vdur_vim_info_interfaces_raises(
1997         self,
1998         mock_check_vdur_interface_updates,
1999         mock_check_vlan_pci_updates,
2000         mock_update_vdur_vim_info_interfaces,
2001     ):
2002 1         vdur_vim_info_update = {
2003             "interfaces": [{"mac_address": mac1_addr, "compute_node": "host1"}]
2004         }
2005 1         index = 0
2006 1         vnfr_update, vdur_update = {}, {}
2007 1         mock_update_vdur_vim_info_interfaces.side_effect = MonitorVmsException(
2008             "Existing interfaces info could not found."
2009         )
2010 1         with self.assertRaises(MonitorVmsException) as err:
2011 1             self.monitor.prepare_interface_updates(
2012                 vdur_vim_info_update,
2013                 index,
2014                 interface_info2,
2015                 server7,
2016                 vdur_path,
2017                 vnfr_update,
2018                 old_interface2,
2019                 vdur_update,
2020                 vnfr_id,
2021             )
2022 1         self.assertEqual(
2023             str(err.exception.args[0]), "Existing interfaces info could not found."
2024         )
2025 1         mock_update_vdur_vim_info_interfaces.assert_called_once_with(
2026             vdur_vim_info_update, index, interface_info2, server7
2027         )
2028 1         check_if_assert_not_called(
2029             [mock_check_vlan_pci_updates, mock_check_vdur_interface_updates]
2030         )
2031
2032 1     @patch("osm_ng_ro.monitor.MonitorVms.update_vdur_vim_info_interfaces")
2033 1     @patch("osm_ng_ro.monitor.MonitorVms.check_vlan_pci_updates")
2034 1     @patch("osm_ng_ro.monitor.MonitorVms.check_vdur_interface_updates")
2035 1     def test_prepare_interface_updates_check_vlan_pci_updates_raises(
2036         self,
2037         mock_check_vdur_interface_updates,
2038         mock_check_vlan_pci_updates,
2039         mock_update_vdur_vim_info_interfaces,
2040     ):
2041 1         vdur_vim_info_update = {
2042             "interfaces": [{"mac_address": mac1_addr, "compute_node": "host1"}]
2043         }
2044 1         index = 0
2045 1         vnfr_update, vdur_update = {}, {}
2046 1         mock_check_vlan_pci_updates.side_effect = KeyError("vlan is not found.")
2047 1         with self.assertRaises(KeyError) as err:
2048 1             self.monitor.prepare_interface_updates(
2049                 vdur_vim_info_update,
2050                 index,
2051                 interface_info2,
2052                 server7,
2053                 vdur_path,
2054                 vnfr_update,
2055                 old_interface2,
2056                 vdur_update,
2057                 vnfr_id,
2058             )
2059 1         self.assertEqual(str(err.exception.args[0]), "vlan is not found.")
2060 1         mock_update_vdur_vim_info_interfaces.assert_called_once_with(
2061             vdur_vim_info_update, index, interface_info2, server7
2062         )
2063 1         mock_check_vlan_pci_updates.assert_called_once_with(
2064             interface_info2, index, vdur_vim_info_update
2065         )
2066 1         mock_check_vdur_interface_updates.assert_not_called()
2067
2068 1     @patch("osm_ng_ro.monitor.MonitorVms.get_interface_info")
2069 1     @patch("osm_ng_ro.monitor.MonitorVms.prepare_interface_updates")
2070 1     def test_check_vm_interface_updates(
2071         self, mock_prepare_interface_updates, mock_get_interface_info
2072     ):
2073 1         vdur_vim_info_update = {
2074             "interfaces": [{"mac_address": mac1_addr, "compute_node": "host1"}]
2075         }
2076 1         index = 0
2077 1         interface_info = {
2078             "fixed_ips": [{"ip_address": ip1_addr}],
2079             "mac_address": mac2_addr,
2080             "network_id": net1_id,
2081             "status": "ACTIVE",
2082         }
2083 1         vnfr_update, vdur_update = {}, {}
2084 1         ports = {"ports": [port1, port2]}
2085 1         existing_vim_info = sample_vim_info
2086 1         mock_get_interface_info.return_value = interface_info
2087 1         self.monitor.check_vm_interface_updates(
2088             server7,
2089             existing_vim_info,
2090             ports,
2091             vdur_vim_info_update,
2092             vdur_update,
2093             vdur_path,
2094             vnfr_update,
2095             vnfr_id,
2096         )
2097 1         mock_get_interface_info.assert_called_once_with(ports, old_interface, server7)
2098 1         mock_prepare_interface_updates.assert_called_once_with(
2099             vdur_vim_info_update,
2100             index,
2101             interface_info,
2102             server7,
2103             vdur_path,
2104             vnfr_update,
2105             old_interface,
2106             vdur_update,
2107             vnfr_id,
2108         )
2109 1         self.assertNotIn("vim_message", vdur_vim_info_update)
2110
2111 1     @patch("osm_ng_ro.monitor.MonitorVms.get_interface_info")
2112 1     @patch("osm_ng_ro.monitor.MonitorVms.prepare_interface_updates")
2113 1     def test_check_vm_interface_updates_interface_new_status_is_nok(
2114         self, mock_prepare_interface_updates, mock_get_interface_info
2115     ):
2116 1         vdur_vim_info_update = {
2117             "interfaces": [{"mac_address": mac1_addr, "compute_node": "host1"}]
2118         }
2119 1         interface_info = {
2120             "fixed_ips": [{"ip_address": ip1_addr}],
2121             "mac_address": mac2_addr,
2122             "network_id": net1_id,
2123             "status": "DOWN",
2124         }
2125 1         vnfr_update, vdur_update = {}, {}
2126 1         ports = {"ports": [port1, port2]}
2127 1         existing_vim_info = sample_vim_info
2128 1         mock_get_interface_info.return_value = interface_info
2129 1         self.monitor.check_vm_interface_updates(
2130             server7,
2131             existing_vim_info,
2132             ports,
2133             vdur_vim_info_update,
2134             vdur_update,
2135             vdur_path,
2136             vnfr_update,
2137             vnfr_id,
2138         )
2139 1         mock_get_interface_info.assert_called_once_with(ports, old_interface, server7)
2140 1         mock_prepare_interface_updates.assert_not_called()
2141 1         self.assertEqual(
2142             vdur_vim_info_update["vim_message"],
2143             "Interface 4d081f50-e13a-4306-a67e-1edb28d76013 status: DOWN",
2144         )
2145
2146 1     @patch("osm_ng_ro.monitor.MonitorVms.get_interface_info")
2147 1     @patch("osm_ng_ro.monitor.MonitorVms.prepare_interface_updates")
2148 1     def test_check_vm_interface_updates_no_new_interface_info(
2149         self, mock_prepare_interface_updates, mock_get_interface_info
2150     ):
2151 1         vdur_vim_info_update = {
2152             "interfaces": [{"mac_address": mac1_addr, "compute_node": "host1"}]
2153         }
2154 1         vnfr_update, vdur_update = {}, {}
2155 1         ports = {"ports": [port1, port2]}
2156 1         existing_vim_info = sample_vim_info
2157 1         mock_get_interface_info.return_value = None
2158 1         self.monitor.check_vm_interface_updates(
2159             server7,
2160             existing_vim_info,
2161             ports,
2162             vdur_vim_info_update,
2163             vdur_update,
2164             vdur_path,
2165             vnfr_update,
2166             vnfr_id,
2167         )
2168 1         mock_get_interface_info.assert_called_once_with(ports, old_interface, server7)
2169 1         mock_prepare_interface_updates.assert_not_called()
2170 1         self.assertEqual(
2171             vdur_vim_info_update["vim_message"],
2172             "Interface 4d081f50-e13a-4306-a67e-1edb28d76013 deleted externally.",
2173         )
2174
2175 1     @patch("osm_ng_ro.monitor.MonitorVms.get_interface_info")
2176 1     @patch("osm_ng_ro.monitor.MonitorVms.prepare_interface_updates")
2177 1     def test_check_vm_interface_updates_no_existing_interface(
2178         self, mock_prepare_interface_updates, mock_get_interface_info
2179     ):
2180 1         vdur_vim_info_update = {
2181             "interfaces": [{"mac_address": mac1_addr, "compute_node": "host1"}]
2182         }
2183 1         interface_info = {
2184             "fixed_ips": [{"ip_address": ip1_addr}],
2185             "mac_address": mac2_addr,
2186             "network_id": net1_id,
2187             "status": "ACTIVE",
2188         }
2189 1         vnfr_update, vdur_update = {}, {}
2190 1         ports = {"ports": [port1, port2]}
2191 1         updated_sample_vim_info = deepcopy(sample_vim_info)
2192 1         updated_sample_vim_info["interfaces"] = []
2193 1         existing_vim_info = updated_sample_vim_info
2194 1         mock_get_interface_info.return_value = interface_info
2195 1         self.monitor.check_vm_interface_updates(
2196             server7,
2197             existing_vim_info,
2198             ports,
2199             vdur_vim_info_update,
2200             vdur_update,
2201             vdur_path,
2202             vnfr_update,
2203             vnfr_id,
2204         )
2205 1         check_if_assert_not_called(
2206             [mock_get_interface_info, mock_prepare_interface_updates]
2207         )
2208 1         self.assertNotIn("vim_message", vdur_vim_info_update)
2209
2210 1     def test_update_in_database(self):
2211 1         all_updates = [{"some-key": "some-value"}, {"other-key": "other-value"}]
2212 1         self.monitor.update_in_database(all_updates, vnfr_id)
2213 1         self.assertEqual(self.monitor.db.set_list.call_count, 2)
2214 1         _call_mock_set_list = self.monitor.db.set_list.call_args_list
2215 1         self.assertEqual(
2216             _call_mock_set_list[0][0],
2217             ("vnfrs",),
2218         )
2219 1         self.assertEqual(
2220             _call_mock_set_list[0][1],
2221             (
2222                 {
2223                     "q_filter": {"_id": vnfr_id},
2224                     "update_dict": {"some-key": "some-value"},
2225                 }
2226             ),
2227         )
2228 1         self.assertEqual(
2229             _call_mock_set_list[1][0],
2230             ("vnfrs",),
2231         )
2232 1         self.assertEqual(
2233             _call_mock_set_list[1][1],
2234             (
2235                 {
2236                     "q_filter": {"_id": vnfr_id},
2237                     "update_dict": {"other-key": "other-value"},
2238                 }
2239             ),
2240         )
2241
2242 1     def test_update_in_database_set_list_raises(self):
2243 1         all_updates = [{"some-key": "some-value"}, {"other-key": "other-value"}]
2244 1         self.monitor.db.set_list.side_effect = DbException("Connection failed.")
2245 1         with self.assertRaises(MonitorDbException) as err:
2246 1             self.monitor.update_in_database(all_updates, vnfr_id)
2247 1         self.assertEqual(
2248             str(err.exception.args[0]),
2249             "Error while updating differences in VNFR database exception Connection failed.",
2250         )
2251 1         self.assertEqual(self.monitor.db.set_list.call_count, 1)
2252 1         _call_mock_set_list = self.monitor.db.set_list.call_args_list
2253 1         self.assertEqual(
2254             _call_mock_set_list[0][0],
2255             ("vnfrs",),
2256         )
2257 1         self.assertEqual(
2258             _call_mock_set_list[0][1],
2259             (
2260                 {
2261                     "q_filter": {"_id": vnfr_id},
2262                     "update_dict": {"some-key": "some-value"},
2263                 }
2264             ),
2265         )
2266
2267 1     def test_update_in_database_empty_all_updates(self):
2268 1         all_updates = []
2269 1         self.monitor.update_in_database(all_updates, vnfr_id)
2270 1         self.monitor.db.set_list.assert_not_called()
2271
2272 1     @patch("osm_ng_ro.monitor.MonitorVms._get_vm_data_from_db")
2273 1     @patch("osm_ng_ro.monitor.MonitorVms.check_vm_status_updates")
2274 1     @patch("osm_ng_ro.monitor.MonitorVms.check_vm_interface_updates")
2275 1     @patch("osm_ng_ro.monitor.MonitorVms.backup_vdu_interfaces")
2276 1     @patch("osm_ng_ro.monitor.MonitorVms.update_in_database")
2277 1     def test_report_vdur_updates_no_change_in_vdur(
2278         self,
2279         mock_update_in_database,
2280         mock_backup_vdu_interfaces,
2281         mock_check_vm_interface_updates,
2282         mock_check_vm_status_updates,
2283         mock_get_vm_data_from_db,
2284     ):
2285 1         existing_vim_info = sample_vim_info
2286 1         vdur_vim_info_update = deepcopy(existing_vim_info)
2287 1         mock_get_vm_data_from_db.return_value = (
2288             vdur_path,
2289             vdur_vim_info_update,
2290             None,
2291             existing_vim_info,
2292             vnfr_id,
2293             vim_info_path,
2294         )
2295 1         ports = {"ports": [port1, port2]}
2296 1         self.monitor.report_vdur_updates(server7, sample_vm, ports)
2297 1         check_if_assert_not_called(
2298             [mock_update_in_database, mock_backup_vdu_interfaces]
2299         )
2300 1         mock_get_vm_data_from_db.assert_called_with(sample_vm)
2301 1         self.assertEqual(mock_get_vm_data_from_db.call_count, 1)
2302 1         mock_check_vm_status_updates.assert_called_once_with(
2303             vdur_vim_info_update, {}, server7, vdur_path
2304         )
2305 1         mock_check_vm_interface_updates.assert_called_once_with(
2306             server7,
2307             existing_vim_info,
2308             ports,
2309             vdur_vim_info_update,
2310             {},
2311             vdur_path,
2312             {},
2313             vnfr_id,
2314         )
2315
2316 1     @patch("osm_ng_ro.monitor.MonitorVms._get_vm_data_from_db")
2317 1     @patch("osm_ng_ro.monitor.MonitorVms.check_vm_status_updates")
2318 1     @patch("osm_ng_ro.monitor.MonitorVms.check_vm_interface_updates")
2319 1     @patch("osm_ng_ro.monitor.MonitorVms.backup_vdu_interfaces")
2320 1     @patch("osm_ng_ro.monitor.MonitorVms.update_in_database")
2321 1     def test_report_vdur_updates_vdur_changed(
2322         self,
2323         mock_update_in_database,
2324         mock_backup_vdu_interfaces,
2325         mock_check_vm_interface_updates,
2326         mock_check_vm_status_updates,
2327         mock_get_vm_data_from_db,
2328     ):
2329 1         existing_vim_info = sample_vim_info
2330 1         vdur_vim_info_update = {
2331             "interfaces": [{"mac_address": mac1_addr, "compute_node": "host1"}]
2332         }
2333 1         mock_get_vm_data_from_db.return_value = (
2334             vdur_path,
2335             vdur_vim_info_update,
2336             None,
2337             existing_vim_info,
2338             vnfr_id,
2339             vim_info_path,
2340         )
2341 1         all_updates = [{}, {vim_info_path: vdur_vim_info_update}, {}]
2342 1         ports = {"ports": [port1, port2]}
2343 1         self.monitor.report_vdur_updates(server7, sample_vm, ports)
2344 1         mock_get_vm_data_from_db.assert_called_with(sample_vm)
2345 1         self.assertEqual(mock_get_vm_data_from_db.call_count, 1)
2346 1         mock_check_vm_status_updates.assert_called_once_with(
2347             vdur_vim_info_update, {}, server7, vdur_path
2348         )
2349 1         mock_check_vm_interface_updates.assert_called_once_with(
2350             server7,
2351             existing_vim_info,
2352             ports,
2353             vdur_vim_info_update,
2354             {},
2355             vdur_path,
2356             {},
2357             vnfr_id,
2358         )
2359 1         mock_backup_vdu_interfaces.assert_called_once_with(vdur_vim_info_update)
2360 1         mock_update_in_database.assert_called_once_with(all_updates, vnfr_id)
2361
2362 1     @patch("osm_ng_ro.monitor.MonitorVms._get_vm_data_from_db")
2363 1     @patch("osm_ng_ro.monitor.MonitorVms.check_vm_status_updates")
2364 1     @patch("osm_ng_ro.monitor.MonitorVms.check_vm_interface_updates")
2365 1     @patch("osm_ng_ro.monitor.MonitorVms.backup_vdu_interfaces")
2366 1     @patch("osm_ng_ro.monitor.MonitorVms.update_in_database")
2367 1     def test_report_vdur_updates_check_vm_status_updates_raises(
2368         self,
2369         mock_update_in_database,
2370         mock_backup_vdu_interfaces,
2371         mock_check_vm_interface_updates,
2372         mock_check_vm_status_updates,
2373         mock_get_vm_data_from_db,
2374     ):
2375 1         existing_vim_info = sample_vim_info
2376 1         vdur_vim_info_update = {
2377             "interfaces": [{"mac_address": mac1_addr, "compute_node": "host1"}]
2378         }
2379 1         mock_get_vm_data_from_db.return_value = (
2380             vdur_path,
2381             vdur_vim_info_update,
2382             None,
2383             existing_vim_info,
2384             vnfr_id,
2385             vim_info_path,
2386         )
2387 1         ports = {"ports": [port1, port2]}
2388 1         mock_check_vm_status_updates.side_effect = yaml.YAMLError(
2389             "Cannot represent an object."
2390         )
2391 1         with self.assertRaises(yaml.YAMLError) as err:
2392 1             self.monitor.report_vdur_updates(server7, sample_vm, ports)
2393 1         self.assertEqual(str(err.exception), "Cannot represent an object.")
2394 1         mock_get_vm_data_from_db.assert_called_with(sample_vm)
2395 1         self.assertEqual(mock_get_vm_data_from_db.call_count, 1)
2396 1         mock_check_vm_status_updates.assert_called_once_with(
2397             vdur_vim_info_update, {}, server7, vdur_path
2398         )
2399 1         check_if_assert_not_called(
2400             [
2401                 mock_check_vm_interface_updates,
2402                 mock_backup_vdu_interfaces,
2403                 mock_update_in_database,
2404             ]
2405         )
2406
2407 1     @patch("osm_ng_ro.monitor.MonitorVms._get_vm_data_from_db")
2408 1     @patch("osm_ng_ro.monitor.MonitorVms.check_vm_status_updates")
2409 1     @patch("osm_ng_ro.monitor.MonitorVms.check_vm_interface_updates")
2410 1     @patch("osm_ng_ro.monitor.MonitorVms.backup_vdu_interfaces")
2411 1     @patch("osm_ng_ro.monitor.MonitorVms.update_in_database")
2412 1     def test_report_vdur_updates_database_update_raises(
2413         self,
2414         mock_update_in_database,
2415         mock_backup_vdu_interfaces,
2416         mock_check_vm_interface_updates,
2417         mock_check_vm_status_updates,
2418         mock_get_vm_data_from_db,
2419     ):
2420 1         existing_vim_info = sample_vim_info
2421 1         vdur_vim_info_update = {
2422             "interfaces": [{"mac_address": mac1_addr, "compute_node": "host1"}]
2423         }
2424 1         mock_get_vm_data_from_db.return_value = (
2425             vdur_path,
2426             vdur_vim_info_update,
2427             None,
2428             existing_vim_info,
2429             vnfr_id,
2430             vim_info_path,
2431         )
2432 1         all_updates = [{}, {vim_info_path: vdur_vim_info_update}, {}]
2433 1         ports = {"ports": [port1, port2]}
2434 1         mock_update_in_database.side_effect = MonitorDbException(
2435             f"Error while updating differences in VNFR {vnfr_id}."
2436         )
2437 1         with self.assertRaises(MonitorDbException) as err:
2438 1             self.monitor.report_vdur_updates(server7, sample_vm, ports)
2439 1         self.assertEqual(
2440             str(err.exception), f"Error while updating differences in VNFR {vnfr_id}."
2441         )
2442 1         mock_get_vm_data_from_db.assert_called_with(sample_vm)
2443 1         self.assertEqual(mock_get_vm_data_from_db.call_count, 1)
2444 1         mock_check_vm_status_updates.assert_called_once_with(
2445             vdur_vim_info_update, {}, server7, vdur_path
2446         )
2447 1         mock_check_vm_interface_updates.assert_called_once_with(
2448             server7,
2449             existing_vim_info,
2450             ports,
2451             vdur_vim_info_update,
2452             {},
2453             vdur_path,
2454             {},
2455             vnfr_id,
2456         )
2457 1         mock_backup_vdu_interfaces.assert_called_once_with(vdur_vim_info_update)
2458 1         mock_update_in_database.assert_called_once_with(all_updates, vnfr_id)
2459
2460 1     @patch("osm_ng_ro.monitor.MonitorVms._get_vm_data_from_db")
2461 1     @patch("osm_ng_ro.monitor.MonitorVms.check_vm_status_updates")
2462 1     @patch("osm_ng_ro.monitor.MonitorVms.check_vm_interface_updates")
2463 1     @patch("osm_ng_ro.monitor.MonitorVms.backup_vdu_interfaces")
2464 1     @patch("osm_ng_ro.monitor.MonitorVms.update_in_database")
2465 1     def test_report_vdur_updates_no_vm_data(
2466         self,
2467         mock_update_in_database,
2468         mock_backup_vdu_interfaces,
2469         mock_check_vm_interface_updates,
2470         mock_check_vm_status_updates,
2471         mock_get_vm_data_from_db,
2472     ):
2473 1         mock_get_vm_data_from_db.return_value = None
2474 1         ports = {"ports": [port1, port2]}
2475 1         self.monitor.report_vdur_updates(server7, sample_vm, ports)
2476 1         check_if_assert_not_called(
2477             [
2478                 mock_update_in_database,
2479                 mock_backup_vdu_interfaces,
2480                 mock_check_vm_interface_updates,
2481                 mock_check_vm_status_updates,
2482             ]
2483         )
2484 1         mock_get_vm_data_from_db.assert_called_once_with(sample_vm)
2485
2486 1     @patch("osm_ng_ro.monitor.MonitorVms.find_ro_tasks_to_monitor")
2487 1     @patch("osm_ng_ro.monitor.MonitorVms.prepare_vims_to_monitor")
2488 1     @patch("osm_ng_ro.monitor.MonitorVms.update_vnfrs")
2489 1     def test_run_no_db_vims(
2490         self,
2491         mock_update_vnfrs,
2492         mock_prepare_vims_to_monitor,
2493         mock_find_ro_tasks_to_monitor,
2494     ):
2495 1         self.monitor.db_vims = None
2496 1         self.monitor.run()
2497 1         check_if_assert_not_called(
2498             [
2499                 mock_prepare_vims_to_monitor,
2500                 mock_find_ro_tasks_to_monitor,
2501                 mock_update_vnfrs,
2502             ]
2503         )
2504
2505 1     @patch("osm_ng_ro.monitor.MonitorVms.find_ro_tasks_to_monitor")
2506 1     @patch("osm_ng_ro.monitor.MonitorVms.prepare_vims_to_monitor")
2507 1     @patch("osm_ng_ro.monitor.MonitorVms.update_vnfrs")
2508 1     def test_run_refresh_disabled(
2509         self,
2510         mock_update_vnfrs,
2511         mock_prepare_vims_to_monitor,
2512         mock_find_ro_tasks_to_monitor,
2513     ):
2514 1         self.monitor.db_vims = vims
2515 1         self.monitor.refresh_config.active = -1
2516 1         self.monitor.run()
2517 1         check_if_assert_not_called(
2518             [
2519                 mock_prepare_vims_to_monitor,
2520                 mock_find_ro_tasks_to_monitor,
2521                 mock_update_vnfrs,
2522             ]
2523         )
2524
2525 1     @patch("osm_ng_ro.monitor.MonitorVms.find_ro_tasks_to_monitor")
2526 1     @patch("osm_ng_ro.monitor.MonitorVms.prepare_vims_to_monitor")
2527 1     @patch("osm_ng_ro.monitor.MonitorVms.update_vnfrs")
2528 1     def test_run_no_proper_ro_task(
2529         self,
2530         mock_update_vnfrs,
2531         mock_prepare_vims_to_monitor,
2532         mock_find_ro_tasks_to_monitor,
2533     ):
2534 1         self.monitor.db_vims = vims
2535 1         self.monitor.refresh_config.active = 60
2536 1         mock_find_ro_tasks_to_monitor.return_value = []
2537 1         self.monitor.run()
2538 1         check_if_assert_not_called([mock_prepare_vims_to_monitor, mock_update_vnfrs])
2539 1         mock_find_ro_tasks_to_monitor.assert_called_once()
2540
2541 1     @patch("osm_ng_ro.monitor.MonitorVms.find_ro_tasks_to_monitor")
2542 1     @patch("osm_ng_ro.monitor.MonitorVms.update_vnfrs")
2543 1     def test_run_with_proper_ro_task(
2544         self, mock_update_vnfrs, mock_find_ro_tasks_to_monitor
2545     ):
2546 1         self.monitor.db_vims = vims
2547 1         all_servers = [server1, server2]
2548 1         vim1_vms = [
2549             VmToMonitor(
2550                 vm_id=vm1_id,
2551                 target_record=target_record,
2552             )
2553         ]
2554 1         vim2_vms = [
2555             VmToMonitor(
2556                 vm_id=vm2_id,
2557                 target_record=target_record2,
2558             )
2559         ]
2560 1         all_ports = {"ports": [port1, port2]}
2561 1         mock_vim_connector = MagicMock()
2562 1         mock_vim_connector.get_monitoring_data.return_value = all_servers, all_ports
2563 1         self.monitor.my_vims = {
2564             vim1_id: mock_vim_connector,
2565             vim2_id: mock_vim_connector,
2566             vim3_id: mock_vim_connector,
2567         }
2568 1         self.monitor.refresh_config.active = 60
2569 1         mock_find_ro_tasks_to_monitor.return_value = [ro_task1, ro_task2]
2570 1         self.monitor.run()
2571 1         mock_find_ro_tasks_to_monitor.assert_called_once()
2572 1         _call_mock_update_vnfrs = mock_update_vnfrs.call_args_list
2573 1         self.assertEqual(mock_update_vnfrs.call_count, 2)
2574 1         self.assertEqual(
2575             _call_mock_update_vnfrs[0][0],
2576             (all_servers, all_ports, vim1_vms),
2577         )
2578 1         self.assertEqual(
2579             _call_mock_update_vnfrs[1][0],
2580             (all_servers, all_ports, vim2_vms),
2581         )
2582 1         self.assertEqual(mock_vim_connector.get_monitoring_data.call_count, 2)
2583
2584 1     @patch("osm_ng_ro.monitor.MonitorVms.find_ro_tasks_to_monitor")
2585 1     @patch("osm_ng_ro.monitor.MonitorVms.update_vnfrs")
2586 1     def test_run_update_vnfrs_raises(
2587         self, mock_update_vnfrs, mock_find_ro_tasks_to_monitor
2588     ):
2589 1         self.monitor.db_vims = vims
2590 1         all_servers = [server1, server2]
2591 1         vim1_vms = [
2592             VmToMonitor(
2593                 vm_id=vm1_id,
2594                 target_record=target_record,
2595             )
2596         ]
2597 1         all_ports = {"ports": [port1, port2]}
2598 1         mock_vim_connector = MagicMock()
2599 1         mock_vim_connector.get_monitoring_data.return_value = all_servers, all_ports
2600 1         self.monitor.my_vims = {
2601             vim1_id: mock_vim_connector,
2602             vim2_id: mock_vim_connector,
2603             vim3_id: mock_vim_connector,
2604         }
2605 1         self.monitor.refresh_config.active = 60
2606 1         mock_find_ro_tasks_to_monitor.return_value = [ro_task1, ro_task2]
2607 1         mock_update_vnfrs.side_effect = DbException("DB is not active state.")
2608 1         with self.assertRaises(MonitorVmsException) as err:
2609 1             self.monitor.run()
2610 1         self.assertEqual(
2611             str(err.exception),
2612             "Exception while monitoring Openstack VMs: database exception DB is not active state.",
2613         )
2614 1         mock_find_ro_tasks_to_monitor.assert_called_once()
2615 1         _call_mock_update_vnfrs = mock_update_vnfrs.call_args_list
2616 1         self.assertEqual(mock_update_vnfrs.call_count, 1)
2617 1         self.assertEqual(
2618             _call_mock_update_vnfrs[0][0],
2619             (all_servers, all_ports, vim1_vms),
2620         )
2621 1         self.assertEqual(mock_vim_connector.get_monitoring_data.call_count, 1)
2622
2623 1     @patch("osm_ng_ro.monitor.MonitorVms.prepare_vims_to_monitor")
2624 1     @patch("osm_ng_ro.monitor.MonitorVms.find_ro_tasks_to_monitor")
2625 1     @patch("osm_ng_ro.monitor.MonitorVms.update_vnfrs")
2626 1     def test_run_prepare_vims_to_monitor_raises(
2627         self,
2628         mock_update_vnfrs,
2629         mock_find_ro_tasks_to_monitor,
2630         mock_prepare_vims_to_monitor,
2631     ):
2632 1         self.monitor.db_vims = vims
2633 1         mock_vim_connector = MagicMock()
2634 1         self.monitor.my_vims = {
2635             vim1_id: mock_vim_connector,
2636             vim2_id: mock_vim_connector,
2637             vim3_id: mock_vim_connector,
2638         }
2639 1         self.monitor.refresh_config.active = 60
2640 1         mock_find_ro_tasks_to_monitor.return_value = [ro_task1, ro_task2]
2641 1         mock_prepare_vims_to_monitor.side_effect = KeyError("vim_id")
2642 1         with self.assertRaises(MonitorVmsException) as err:
2643 1             self.monitor.run()
2644 1         self.assertEqual(
2645             str(err.exception), "Exception while monitoring Openstack VMs: 'vim_id'"
2646         )
2647 1         mock_find_ro_tasks_to_monitor.assert_called_once()
2648 1         check_if_assert_not_called(
2649             [mock_update_vnfrs, mock_vim_connector.get_monitoring_data]
2650         )
2651
2652 1     @patch("osm_ng_ro.monitor.monitoring_task")
2653 1     @patch("osm_ng_ro.monitor.threading.Timer")
2654 1     @patch("osm_ng_ro.monitor.MonitorVms")
2655 1     def test_start_monitoring(
2656         self, mock_monitor_vms, mock_threading_timer, mock_monitoring_task
2657     ):
2658 1         mock_monitor_vms.return_value.refresh_config.active = 20
2659 1         mock_threading_timer.return_value = mock_monitoring_task
2660 1         start_monitoring(config)
2661 1         mock_threading_timer.assert_called_once_with(
2662             20, start_monitoring, args=(config,)
2663         )
2664 1         mock_threading_timer.return_value = CopyingMock(threading.Timer)
2665 1         self.assertEqual(mock_threading_timer.call_count, 1)
2666 1         mock_monitor_vms.return_value.run.assert_called_once()
2667 1         mock_monitor_vms.assert_called_once_with(config)
2668 1         mock_monitoring_task.start.assert_called_once()
2669
2670 1     @patch("osm_ng_ro.monitor.monitoring_task")
2671 1     @patch("osm_ng_ro.monitor.threading.Timer")
2672 1     @patch("osm_ng_ro.monitor.MonitorVms")
2673 1     def test_start_monitoring_empty_config(
2674         self, mock_monitor_vms, mock_threading_timer, mock_monitoring_task
2675     ):
2676 1         with self.assertRaises(MonitorVmsException) as err:
2677 1             start_monitoring(config={})
2678 1         self.assertEqual(
2679             str(err.exception),
2680             "Wrong configuration format is provided.",
2681         )
2682 1         check_if_assert_not_called(
2683             [mock_threading_timer, mock_monitor_vms, mock_monitoring_task]
2684         )
2685
2686 1     @patch("osm_ng_ro.monitor.monitoring_task")
2687 1     @patch("osm_ng_ro.monitor.threading.Timer")
2688 1     @patch("osm_ng_ro.monitor.MonitorVms")
2689 1     def test_start_monitoring_monitor_vms_raises(
2690         self, mock_monitor_vms, mock_threading_timer, mock_monitoring_task
2691     ):
2692 1         mock_monitor_vms.side_effect = MonitorDbException("Can not connect to DB.")
2693 1         with self.assertRaises(MonitorDbException) as err:
2694 1             start_monitoring(config)
2695 1         self.assertEqual(str(err.exception), "Can not connect to DB.")
2696 1         mock_monitor_vms.assert_called_once_with(config)
2697 1         check_if_assert_not_called([mock_threading_timer, mock_monitoring_task])
2698
2699 1     @patch("osm_ng_ro.monitor.monitoring_task")
2700 1     @patch("osm_ng_ro.monitor.threading.Timer")
2701 1     @patch("osm_ng_ro.monitor.MonitorVms")
2702 1     def test_start_monitoring_timer_thread_raises(
2703         self, mock_monitor_vms, mock_threading_timer, mock_monitoring_task
2704     ):
2705 1         mock_threading_timer.side_effect = RuntimeError(
2706             "cannot release un-acquired lock"
2707         )
2708 1         mock_monitor_vms.return_value.refresh_config.active = 2
2709 1         with self.assertRaises(RuntimeError) as err:
2710 1             start_monitoring(config)
2711 1         self.assertEqual(str(err.exception), "cannot release un-acquired lock")
2712 1         mock_monitor_vms.assert_called_once_with(config)
2713 1         mock_monitor_vms.return_value.run.assert_called_once()
2714 1         mock_threading_timer.assert_called_once_with(
2715             2, start_monitoring, args=(config,)
2716         )
2717 1         mock_monitoring_task.start.assert_not_called()
2718
2719 1     @patch("osm_ng_ro.monitor.monitoring_task")
2720 1     def test_stop_monitoring(self, mock_monitoring_task):
2721 1         mock_monitoring_task.return_value = CopyingMock(threading.Timer)
2722 1         stop_monitoring()
2723 1         self.assertIsNotNone(mock_monitoring_task)
2724 1         mock_monitoring_task.cancel.assert_called_once()
2725
2726 1     @patch("osm_ng_ro.monitor.monitoring_task")
2727 1     def test_stop_monitoring_no_task(self, mock_monitoring_task):
2728 1         mock_monitoring_task = CopyingMock(threading.Timer, return_value=None)
2729 1         stop_monitoring()
2730 1         mock_monitoring_task.cancel.assert_not_called()
2731
2732
2733 1 if __name__ == "__main__":
2734 0     unittest.main()