From 6479d492c0237e54defdd4cdf5e43e8bf0b9d231 Mon Sep 17 00:00:00 2001 From: Matt Riedemann Date: Thu, 7 Nov 2019 16:33:41 -0500 Subject: [PATCH] Implement update_provider_tree for mocked driver in test_resource_tracker This resolves the TODO in the test_resource_tracker module by implementing the update_provider_tree method on the mocked virt driver. As a result a few tests need to mock out the call to _sync_compute_service_disabled_trait since we no longer hit the NotImplementedError block and skip that method. The same is done in the functional test as well even though there was no TODO for it in that module. This is part of a series of changes to eventually drop compat for non-update_provider_tree implementations. Change-Id: Iff7805deb041596db30465b52658ca77ddf598dd --- .../compute/test_resource_tracker.py | 26 ++++---- .../unit/compute/test_resource_tracker.py | 61 ++++++++++++++++++- 2 files changed, 74 insertions(+), 13 deletions(-) diff --git a/nova/tests/functional/compute/test_resource_tracker.py b/nova/tests/functional/compute/test_resource_tracker.py index 7f7eb6a228..8880472965 100644 --- a/nova/tests/functional/compute/test_resource_tracker.py +++ b/nova/tests/functional/compute/test_resource_tracker.py @@ -151,7 +151,21 @@ class IronicResourceTrackerTest(test_base.SchedulerReportClientTestBase): driver = mock.MagicMock(autospec=virt_driver.ComputeDriver) driver.node_is_available.return_value = True - driver.update_provider_tree.side_effect = NotImplementedError + + def fake_upt(provider_tree, nodename, allocations=None): + inventory = { + 'CUSTOM_SMALL_IRON': { + 'total': 1, + 'reserved': 0, + 'min_unit': 1, + 'max_unit': 1, + 'step_size': 1, + 'allocation_ratio': 1.0, + }, + } + provider_tree.update_inventory(nodename, inventory) + + driver.update_provider_tree.side_effect = fake_upt self.driver_mock = driver self.rt = resource_tracker.ResourceTracker(COMPUTE_HOST, driver) self.instances = self.create_fixtures() @@ -229,16 +243,6 @@ class IronicResourceTrackerTest(test_base.SchedulerReportClientTestBase): 'resource_class': None, # Act like admin hasn't set yet... 'stats': stats, } - self.driver_mock.get_inventory.return_value = { - 'CUSTOM_SMALL_IRON': { - 'total': 1, - 'reserved': 0, - 'min_unit': 1, - 'max_unit': 1, - 'step_size': 1, - 'allocation_ratio': 1.0, - }, - } self.rt.update_available_resource(self.ctx, nodename) self.assertEqual(3, len(self.rt.compute_nodes)) diff --git a/nova/tests/unit/compute/test_resource_tracker.py b/nova/tests/unit/compute/test_resource_tracker.py index 0b401b5f35..37a3507b58 100644 --- a/nova/tests/unit/compute/test_resource_tracker.py +++ b/nova/tests/unit/compute/test_resource_tracker.py @@ -28,6 +28,7 @@ from nova.compute import power_state from nova.compute import provider_tree from nova.compute import resource_tracker from nova.compute import task_states +from nova.compute import utils as compute_utils from nova.compute import vm_states from nova import context from nova import exception as exc @@ -449,8 +450,44 @@ def setup_rt(hostname, virt_resources=_VIRT_DRIVER_AVAIL_RESOURCES): virt_resources = copy.deepcopy(virt_resources) vd.get_available_resource.return_value = virt_resources vd.get_inventory.side_effect = NotImplementedError - # TODO(mriedem): Need to make this mocked virt driver implement upt. - vd.update_provider_tree.side_effect = NotImplementedError + + def fake_upt(provider_tree, nodename, allocations=None): + inventory = { + 'VCPU': { + 'total': virt_resources['vcpus'], + 'min_unit': 1, + 'max_unit': virt_resources['vcpus'], + 'step_size': 1, + 'allocation_ratio': ( + CONF.cpu_allocation_ratio or + CONF.initial_cpu_allocation_ratio), + 'reserved': CONF.reserved_host_cpus, + }, + 'MEMORY_MB': { + 'total': virt_resources['memory_mb'], + 'min_unit': 1, + 'max_unit': virt_resources['memory_mb'], + 'step_size': 1, + 'allocation_ratio': ( + CONF.ram_allocation_ratio or + CONF.initial_ram_allocation_ratio), + 'reserved': CONF.reserved_host_memory_mb, + }, + 'DISK_GB': { + 'total': virt_resources['local_gb'], + 'min_unit': 1, + 'max_unit': virt_resources['local_gb'], + 'step_size': 1, + 'allocation_ratio': ( + CONF.disk_allocation_ratio or + CONF.initial_disk_allocation_ratio), + 'reserved': compute_utils.convert_mb_to_ceil_gb( + CONF.reserved_host_disk_mb), + }, + } + provider_tree.update_inventory(nodename, inventory) + + vd.update_provider_tree.side_effect = fake_upt vd.get_host_ip_addr.return_value = _NODENAME vd.rebalances_nodes = False @@ -1481,6 +1518,7 @@ class TestUpdateComputeNode(BaseTestCase): @mock.patch('nova.objects.ComputeNode.save') def test_existing_compute_node_updated_same_resources(self, save_mock): self._setup_rt() + self.driver_mock.update_provider_tree.side_effect = NotImplementedError # This is the same set of resources as the fixture, deliberately. We # are checking below to see that compute_node.save is not needlessly @@ -1496,6 +1534,8 @@ class TestUpdateComputeNode(BaseTestCase): # Even the compute node is not updated, get_inventory still got called. self.driver_mock.get_inventory.assert_called_once_with(_NODENAME) + @mock.patch('nova.compute.resource_tracker.ResourceTracker.' + '_sync_compute_service_disabled_trait', new=mock.Mock()) @mock.patch('nova.objects.ComputeNode.save') def test_existing_compute_node_updated_diff_updated_at(self, save_mock): # if only updated_at is changed, it won't call compute_node.save() @@ -1516,6 +1556,8 @@ class TestUpdateComputeNode(BaseTestCase): self.rt._update(mock.sentinel.ctx, new_compute) self.assertFalse(save_mock.called) + @mock.patch('nova.compute.resource_tracker.ResourceTracker.' + '_sync_compute_service_disabled_trait', new=mock.Mock()) @mock.patch('nova.compute.resource_tracker.' '_normalize_inventory_from_cn_obj') @mock.patch('nova.objects.ComputeNode.save') @@ -1552,6 +1594,7 @@ class TestUpdateComputeNode(BaseTestCase): node/provider in a way that the placement API better understands. """ self._setup_rt() + self.driver_mock.update_provider_tree.side_effect = NotImplementedError # Emulate a driver that has implemented the newish get_inventory() virt # driver method @@ -2369,6 +2412,8 @@ class TestInstanceClaim(BaseTestCase): self.assertEqual( 0, len(self.rt.assigned_resources[cn.uuid]['CUSTOM_RESOURCE_0'])) + @mock.patch('nova.compute.resource_tracker.ResourceTracker.' + '_sync_compute_service_disabled_trait', new=mock.Mock()) @mock.patch('nova.compute.utils.is_volume_backed_instance') @mock.patch('nova.objects.InstancePCIRequests.get_by_instance_uuid') @mock.patch('nova.objects.MigrationList.get_in_progress_by_host_and_node') @@ -2412,6 +2457,8 @@ class TestInstanceClaim(BaseTestCase): self.assertEqual(0, cn.memory_mb_used) self.assertEqual(0, cn.running_vms) + @mock.patch('nova.compute.resource_tracker.ResourceTracker.' + '_sync_compute_service_disabled_trait', new=mock.Mock()) @mock.patch('nova.compute.utils.is_volume_backed_instance') @mock.patch('nova.objects.InstancePCIRequests.get_by_instance_uuid') @mock.patch('nova.objects.MigrationList.get_in_progress_by_host_and_node') @@ -2484,6 +2531,8 @@ class TestInstanceClaim(BaseTestCase): class TestResize(BaseTestCase): + @mock.patch('nova.compute.resource_tracker.ResourceTracker.' + '_sync_compute_service_disabled_trait', new=mock.Mock()) @mock.patch('nova.compute.utils.is_volume_backed_instance', return_value=False) @mock.patch('nova.objects.Service.get_minimum_version', @@ -2588,6 +2637,8 @@ class TestResize(BaseTestCase): self.assertEqual(128, cn.memory_mb_used) self.assertEqual(0, len(self.rt.tracked_migrations)) + @mock.patch('nova.compute.resource_tracker.ResourceTracker.' + '_sync_compute_service_disabled_trait', new=mock.Mock()) @mock.patch('nova.compute.utils.is_volume_backed_instance', return_value=False) @mock.patch('nova.objects.Service.get_minimum_version', @@ -2759,6 +2810,8 @@ class TestResize(BaseTestCase): def test_instance_build_resize_confirm(self): self._test_instance_build_resize() + @mock.patch('nova.compute.resource_tracker.ResourceTracker.' + '_sync_compute_service_disabled_trait', new=mock.Mock()) @mock.patch('nova.compute.utils.is_volume_backed_instance', return_value=False) @mock.patch('nova.objects.Service.get_minimum_version', @@ -2917,6 +2970,8 @@ class TestResize(BaseTestCase): mock_update_usage.assert_called_once_with( mock_get_usage.return_value, _NODENAME, sign=-1) + @mock.patch('nova.compute.resource_tracker.ResourceTracker.' + '_sync_compute_service_disabled_trait', new=mock.Mock()) @mock.patch('nova.compute.utils.is_volume_backed_instance', return_value=False) @mock.patch('nova.objects.Service.get_minimum_version', @@ -3050,6 +3105,8 @@ class TestResize(BaseTestCase): class TestRebuild(BaseTestCase): + @mock.patch('nova.compute.resource_tracker.ResourceTracker.' + '_sync_compute_service_disabled_trait', new=mock.Mock()) @mock.patch('nova.compute.utils.is_volume_backed_instance') @mock.patch('nova.objects.Service.get_minimum_version', return_value=22)