Merge "Hook resource_tracker to remove stale node information" into stable/ocata

This commit is contained in:
Zuul 2020-03-19 21:09:46 +00:00 committed by Gerrit Code Review
commit 105626f650
4 changed files with 38 additions and 1 deletions

View File

@ -6663,6 +6663,7 @@ class ComputeManager(manager.Manager):
for nodename in nodenames:
self.update_available_resource_for_node(context, nodename)
rt = self._get_resource_tracker()
# Delete orphan compute node not reported by driver but still in db
for cn in compute_nodes_in_db:
if cn.hypervisor_hostname not in nodenames:
@ -6672,6 +6673,7 @@ class ComputeManager(manager.Manager):
{'id': cn.id, 'hh': cn.hypervisor_hostname,
'nodes': nodenames})
cn.destroy()
rt.remove_node(cn.hypervisor_hostname)
# Delete the corresponding resource provider in placement,
# along with any associated allocations and inventory.
# TODO(cdent): Move use of reportclient into resource tracker.

View File

@ -542,6 +542,16 @@ class ResourceTracker(object):
# now copy rest to compute_node
compute_node.update_from_virt_driver(resources)
def remove_node(self, nodename):
"""Handle node removal/rebalance.
Clean up any stored data about a compute node no longer
managed by this host.
"""
self.stats.pop(nodename, None)
self.compute_nodes.pop(nodename, None)
self.old_resources.pop(nodename, None)
def _get_host_metrics(self, context, nodename):
"""Get the metrics from monitors and
notify information to message bus.

View File

@ -212,6 +212,7 @@ class ComputeManagerUnitTestCase(test.NoDBTestCase):
self.assertTrue(log_mock.info.called)
self.assertIsNone(self.compute._resource_tracker)
@mock.patch.object(manager.ComputeManager, '_get_resource_tracker')
@mock.patch('nova.scheduler.client.report.SchedulerReportClient.'
'delete_resource_provider')
@mock.patch.object(manager.ComputeManager,
@ -219,7 +220,7 @@ class ComputeManagerUnitTestCase(test.NoDBTestCase):
@mock.patch.object(fake_driver.FakeDriver, 'get_available_nodes')
@mock.patch.object(manager.ComputeManager, '_get_compute_nodes_in_db')
def test_update_available_resource(self, get_db_nodes, get_avail_nodes,
update_mock, del_rp_mock):
update_mock, del_rp_mock, mock_get_rt):
db_nodes = [self._make_compute_node('node%s' % i, i)
for i in range(1, 5)]
avail_nodes = set(['node2', 'node3', 'node4', 'node5'])
@ -239,6 +240,8 @@ class ComputeManagerUnitTestCase(test.NoDBTestCase):
db_node.destroy.assert_called_once_with()
del_rp_mock.assert_called_once_with(self.context, db_node,
cascade=True)
mock_get_rt.return_value.remove_node.assert_called_once_with(
'node1')
else:
self.assertFalse(db_node.destroy.called)

View File

@ -1162,6 +1162,28 @@ class TestInitComputeNode(BaseTestCase):
42)
self.assertTrue(self.sched_client_mock.update_resource_stats.called)
@mock.patch('nova.objects.ComputeNodeList.get_by_hypervisor')
@mock.patch('nova.objects.PciDeviceList.get_by_compute_node',
return_value=objects.PciDeviceList(objects=[]))
@mock.patch('nova.objects.ComputeNode.create')
@mock.patch('nova.objects.ComputeNode.get_by_host_and_nodename')
@mock.patch('nova.compute.resource_tracker.ResourceTracker.'
'_update')
def test_node_removed(self, update_mock, get_mock,
create_mock, pci_tracker_mock,
get_by_hypervisor_mock):
self._test_compute_node_created(update_mock, get_mock, create_mock,
pci_tracker_mock,
get_by_hypervisor_mock)
self.rt.old_resources[_NODENAME] = mock.sentinel.foo
self.assertIn(_NODENAME, self.rt.compute_nodes)
self.assertIn(_NODENAME, self.rt.stats)
self.assertIn(_NODENAME, self.rt.old_resources)
self.rt.remove_node(_NODENAME)
self.assertNotIn(_NODENAME, self.rt.compute_nodes)
self.assertNotIn(_NODENAME, self.rt.stats)
self.assertNotIn(_NODENAME, self.rt.old_resources)
class TestUpdateComputeNode(BaseTestCase):