diff --git a/sysinv/sysinv/sysinv/sysinv/tests/agent/test_manager.py b/sysinv/sysinv/sysinv/sysinv/tests/agent/test_manager.py new file mode 100644 index 0000000000..de8ba84149 --- /dev/null +++ b/sysinv/sysinv/sysinv/sysinv/tests/agent/test_manager.py @@ -0,0 +1,300 @@ +# +# Copyright (c) 2021 Wind River Systems, Inc. +# +# SPDX-License-Identifier: Apache-2.0 +# + +""" +Tests for the sysinv agent manager. +""" + +import mock + +from tsconfig import tsconfig + +from sysinv.agent.manager import AgentManager +from sysinv.common import constants +from sysinv.openstack.common import context +from sysinv.tests import base + + +class FakeConductorAPI(object): + + def __init__(self): + self.create_host_filesystems = mock.MagicMock() + self.is_virtual_system_config_result = False + + def is_virtual_system_config(self, ctxt): + return self.is_virtual_system_config_result + + +class TestAgentManager(base.TestCase): + + def setUp(self): + super(TestAgentManager, self).setUp() + + # Set up objects for testing + self.agent_manager = AgentManager('test-host', 'test-topic') + self.agent_manager._ihost_uuid = "FAKEUUID" + self.agent_manager._ihost_rootfs_device = "fake_rootfs_dev" + self.context = context.get_admin_context() + self.fake_conductor_api = FakeConductorAPI() + + # Mock get_disk_capacity utility + self.mock_get_disk_capacity = mock.MagicMock() + p = mock.patch('sysinv.common.utils.get_disk_capacity_mib', + self.mock_get_disk_capacity) + p.start().return_value = 512000 + self.addCleanup(p.stop) + + # Mock get_current_fs_size utility + self.scratch_fs_size = 16 + self.backup_fs_size = 20 + self.docker_fs_size = 30 + self.kubelet_fs_size = 10 + + def mock_get_current_fs_size(fs_name): + if fs_name == constants.FILESYSTEM_NAME_SCRATCH: + return self.scratch_fs_size + elif fs_name == constants.FILESYSTEM_NAME_BACKUP: + return self.backup_fs_size + elif fs_name == constants.FILESYSTEM_NAME_DOCKER: + return self.docker_fs_size + elif fs_name == constants.FILESYSTEM_NAME_KUBELET: + return self.kubelet_fs_size + self.mocked_get_current_fs_size = mock.patch( + 'sysinv.common.utils.get_current_fs_size', + mock_get_current_fs_size) + self.mocked_get_current_fs_size.start() + self.addCleanup(self.mocked_get_current_fs_size.stop) + + def tearDown(self): + super(TestAgentManager, self).tearDown() + + def test_create_host_filesystems_controller_large(self): + + self.agent_manager._ihost_personality = constants.CONTROLLER + self.mock_get_disk_capacity.return_value = 241 * 1024 + + self.agent_manager._create_host_filesystems(self.fake_conductor_api, + self.context) + + # Verify expected filesystems and sizes + expected_filesystems = [ + {'logical_volume': 'scratch-lv', 'name': 'scratch', 'size': 16}, + {'logical_volume': 'backup-lv', 'name': 'backup', 'size': 25}, + {'logical_volume': 'docker-lv', 'name': 'docker', 'size': 30}, + {'logical_volume': 'kubelet-lv', 'name': 'kubelet', 'size': 10}] + + self.fake_conductor_api.create_host_filesystems.assert_called_with( + self.context, + self.agent_manager._ihost_uuid, + expected_filesystems) + self.assertEqual(self.agent_manager._prev_fs, expected_filesystems) + + def test_create_host_filesystems_controller_small(self): + + self.agent_manager._ihost_personality = constants.CONTROLLER + self.mock_get_disk_capacity.return_value = 181 * 1024 + + self.agent_manager._create_host_filesystems(self.fake_conductor_api, + self.context) + + # Verify expected filesystems and sizes + expected_filesystems = [ + {'logical_volume': 'scratch-lv', 'name': 'scratch', 'size': 16}, + {'logical_volume': 'backup-lv', 'name': 'backup', 'size': 20}, + {'logical_volume': 'docker-lv', 'name': 'docker', 'size': 30}, + {'logical_volume': 'kubelet-lv', 'name': 'kubelet', 'size': 10}] + + self.fake_conductor_api.create_host_filesystems.assert_called_with( + self.context, + self.agent_manager._ihost_uuid, + expected_filesystems) + self.assertEqual(self.agent_manager._prev_fs, expected_filesystems) + + def test_create_host_filesystems_controller_tiny_virtual_fail(self): + + self.agent_manager._ihost_personality = constants.CONTROLLER + self.mock_get_disk_capacity.return_value = 60 * 1024 + self.fake_conductor_api.is_virtual_system_config_result = True + + # Verify filesystems were not created + self.fake_conductor_api.create_host_filesystems.assert_not_called() + self.assertEqual(self.agent_manager._prev_fs, None) + + def test_create_host_filesystems_controller_too_small_fail(self): + + self.agent_manager._ihost_personality = constants.CONTROLLER + self.mock_get_disk_capacity.return_value = 59 * 1024 + + # Verify filesystems were not created + self.fake_conductor_api.create_host_filesystems.assert_not_called() + self.assertEqual(self.agent_manager._prev_fs, None) + + def test_create_host_filesystems_aio_tiny_virtual(self): + + tsconfig.system_type = constants.TIS_AIO_BUILD + self.agent_manager._ihost_personality = constants.CONTROLLER + self.mock_get_disk_capacity.return_value = 60 * 1024 + self.fake_conductor_api.is_virtual_system_config_result = True + + self.agent_manager._create_host_filesystems(self.fake_conductor_api, + self.context) + + # Verify expected filesystems and sizes + expected_filesystems = [ + {'logical_volume': 'scratch-lv', 'name': 'scratch', 'size': 16}, + {'logical_volume': 'backup-lv', 'name': 'backup', 'size': 1}, + {'logical_volume': 'docker-lv', 'name': 'docker', 'size': 20}, + {'logical_volume': 'kubelet-lv', 'name': 'kubelet', 'size': 2}] + + self.fake_conductor_api.create_host_filesystems.assert_called_with( + self.context, + self.agent_manager._ihost_uuid, + expected_filesystems) + self.assertEqual(self.agent_manager._prev_fs, expected_filesystems) + + def test_create_host_filesystems_worker_large(self): + + self.agent_manager._ihost_personality = constants.WORKER + self.mock_get_disk_capacity.return_value = 241 * 1024 + + self.agent_manager._create_host_filesystems(self.fake_conductor_api, + self.context) + + # Verify expected filesystems and sizes + expected_filesystems = [ + {'logical_volume': 'scratch-lv', 'name': 'scratch', 'size': 16}, + {'logical_volume': 'docker-lv', 'name': 'docker', 'size': 30}, + {'logical_volume': 'kubelet-lv', 'name': 'kubelet', 'size': 10}] + + self.fake_conductor_api.create_host_filesystems.assert_called_with( + self.context, + self.agent_manager._ihost_uuid, + expected_filesystems) + self.assertEqual(self.agent_manager._prev_fs, expected_filesystems) + + def test_create_host_filesystems_worker_small(self): + + self.agent_manager._ihost_personality = constants.WORKER + self.mock_get_disk_capacity.return_value = 181 * 1024 + + self.agent_manager._create_host_filesystems(self.fake_conductor_api, + self.context) + + # Verify expected filesystems and sizes + expected_filesystems = [ + {'logical_volume': 'scratch-lv', 'name': 'scratch', 'size': 16}, + {'logical_volume': 'docker-lv', 'name': 'docker', 'size': 30}, + {'logical_volume': 'kubelet-lv', 'name': 'kubelet', 'size': 10}] + + self.fake_conductor_api.create_host_filesystems.assert_called_with( + self.context, + self.agent_manager._ihost_uuid, + expected_filesystems) + self.assertEqual(self.agent_manager._prev_fs, expected_filesystems) + + def test_create_host_filesystems_worker_tiny(self): + + self.skipTest("Skipping because code fix required - LP1915215") + + self.agent_manager._ihost_personality = constants.WORKER + self.mock_get_disk_capacity.return_value = 60 * 1024 + self.fake_conductor_api.is_virtual_system_config_result = True + + self.agent_manager._create_host_filesystems(self.fake_conductor_api, + self.context) + + # Verify expected filesystems and sizes + expected_filesystems = [ + {'logical_volume': 'scratch-lv', 'name': 'scratch', 'size': 16}, + {'logical_volume': 'docker-lv', 'name': 'docker', 'size': 30}, + {'logical_volume': 'kubelet-lv', 'name': 'kubelet', 'size': 10}] + + self.fake_conductor_api.create_host_filesystems.assert_called_with( + self.context, + self.agent_manager._ihost_uuid, + expected_filesystems) + self.assertEqual(self.agent_manager._prev_fs, expected_filesystems) + + def test_create_host_filesystems_worker_too_small_fail(self): + + self.agent_manager._ihost_personality = constants.WORKER + self.mock_get_disk_capacity.return_value = 59 * 1024 + + # Verify filesystems were not created + self.fake_conductor_api.create_host_filesystems.assert_not_called() + self.assertEqual(self.agent_manager._prev_fs, None) + + def test_create_host_filesystems_storage_large(self): + + self.agent_manager._ihost_personality = constants.STORAGE + self.mock_get_disk_capacity.return_value = 241 * 1024 + + self.agent_manager._create_host_filesystems(self.fake_conductor_api, + self.context) + + # Verify expected filesystems and sizes + expected_filesystems = [ + {'logical_volume': 'scratch-lv', 'name': 'scratch', 'size': 16}, + {'logical_volume': 'docker-lv', 'name': 'docker', 'size': 30}, + {'logical_volume': 'kubelet-lv', 'name': 'kubelet', 'size': 10}] + + self.fake_conductor_api.create_host_filesystems.assert_called_with( + self.context, + self.agent_manager._ihost_uuid, + expected_filesystems) + self.assertEqual(self.agent_manager._prev_fs, expected_filesystems) + + def test_create_host_filesystems_storage_small(self): + + self.agent_manager._ihost_personality = constants.STORAGE + self.mock_get_disk_capacity.return_value = 181 * 1024 + + self.agent_manager._create_host_filesystems(self.fake_conductor_api, + self.context) + + # Verify expected filesystems and sizes + expected_filesystems = [ + {'logical_volume': 'scratch-lv', 'name': 'scratch', 'size': 16}, + {'logical_volume': 'docker-lv', 'name': 'docker', 'size': 30}, + {'logical_volume': 'kubelet-lv', 'name': 'kubelet', 'size': 10}] + + self.fake_conductor_api.create_host_filesystems.assert_called_with( + self.context, + self.agent_manager._ihost_uuid, + expected_filesystems) + self.assertEqual(self.agent_manager._prev_fs, expected_filesystems) + + def test_create_host_filesystems_storage_tiny(self): + + self.skipTest("Skipping because code fix required - LP1915215") + + self.agent_manager._ihost_personality = constants.STORAGE + self.mock_get_disk_capacity.return_value = 60 * 1024 + self.fake_conductor_api.is_virtual_system_config_result = True + + self.agent_manager._create_host_filesystems(self.fake_conductor_api, + self.context) + + # Verify expected filesystems and sizes + expected_filesystems = [ + {'logical_volume': 'scratch-lv', 'name': 'scratch', 'size': 16}, + {'logical_volume': 'docker-lv', 'name': 'docker', 'size': 30}, + {'logical_volume': 'kubelet-lv', 'name': 'kubelet', 'size': 10}] + + self.fake_conductor_api.create_host_filesystems.assert_called_with( + self.context, + self.agent_manager._ihost_uuid, + expected_filesystems) + self.assertEqual(self.agent_manager._prev_fs, expected_filesystems) + + def test_create_host_filesystems_storage_too_small_fail(self): + + self.agent_manager._ihost_personality = constants.STORAGE + self.mock_get_disk_capacity.return_value = 59 * 1024 + + # Verify filesystems were not created + self.fake_conductor_api.create_host_filesystems.assert_not_called() + self.assertEqual(self.agent_manager._prev_fs, None) diff --git a/sysinv/sysinv/sysinv/test-requirements.txt b/sysinv/sysinv/sysinv/test-requirements.txt index caa1705d86..8c83c22fb7 100644 --- a/sysinv/sysinv/sysinv/test-requirements.txt +++ b/sysinv/sysinv/sysinv/test-requirements.txt @@ -2,6 +2,7 @@ # of appearance. Changing the order has an impact on the overall integration # process, which may cause wedges in the gate later. hacking>=1.1.0,<=2.0.0 # Apache-2.0 +astroid <= 2.2.5 bandit;python_version>="3.0" coverage>=3.6 fixtures>=3.0.0 # Apache-2.0/BSD