Optimize hypervisor API calls
The nova CDM builder code and notification handling code had some inefficiencies when it came to looking up a hypevisor to get details. The general pattern used before was: 1. get the minimal hypervisor information by hypervisor_hostname 2. make another query to get the hypervisor details by id In the notifications case, it was actually three calls because the first is listing hyprvisors to filter client-side by service host. This change collapses 1 and 2 above into a single API call to get the hypervisor by hypervisor_hostname with details which will include the service (compute) host information which is what get_compute_node_by_id() was being used for. Now that nothing is using get_compute_node_by_id it is removed. There is more work we could do in get_compute_node_by_hostname if the compute API allowed filtering hypervisors by service host so a TODO is left for that. One final thing: the TODO in get_compute_node_by_hostname about there being more than one hypervisor per compute service host for vmware vcenter is not accurate - nova's vcenter driver hasn't supported a host:node 1:M topology like that since the Liberty release [1]. The only in-tree driver in nova that supports 1:M is the ironic baremetal driver, so the comment is updated. [1] Ifc17c5049e3ed29c8dd130339207907b00433960 Depends-On: https://review.opendev.org/661785/ Change-Id: I5e0e88d7b2dd1a69117ab03e0e66851c687606da
This commit is contained in:
@@ -66,7 +66,14 @@ class TestNovaClusterDataModelCollector(base.TestCase):
|
||||
servers=None, # Don't let the mock return a value for servers.
|
||||
**minimal_node
|
||||
)
|
||||
fake_compute_node_with_servers = mock.Mock(**minimal_node_with_servers)
|
||||
fake_detailed_node = mock.Mock(
|
||||
service={'id': 123, 'host': 'test_hostname',
|
||||
'disabled_reason': ''},
|
||||
memory_mb=333,
|
||||
free_disk_gb=222,
|
||||
local_gb=111,
|
||||
vcpus=4,
|
||||
**minimal_node_with_servers)
|
||||
fake_instance = mock.Mock(
|
||||
id='ef500f7e-dac8-470f-960c-169486fce71b',
|
||||
human_id='fake_instance',
|
||||
@@ -77,11 +84,10 @@ class TestNovaClusterDataModelCollector(base.TestCase):
|
||||
setattr(fake_instance, 'OS-EXT-STS:vm_state', 'VM_STATE')
|
||||
# Returns the hypervisors with details (service) but no servers.
|
||||
m_nova_helper.get_compute_node_list.return_value = [fake_compute_node]
|
||||
# Returns the hypervisor with servers but no details (service).
|
||||
# Returns the hypervisor with servers and details (service).
|
||||
m_nova_helper.get_compute_node_by_name.return_value = [
|
||||
fake_compute_node_with_servers]
|
||||
fake_detailed_node]
|
||||
# Returns the hypervisor with details (service) but no servers.
|
||||
m_nova_helper.get_compute_node_by_id.return_value = fake_compute_node
|
||||
m_nova_helper.get_instance_list.return_value = [fake_instance]
|
||||
|
||||
m_config = mock.Mock()
|
||||
@@ -105,5 +111,7 @@ class TestNovaClusterDataModelCollector(base.TestCase):
|
||||
self.assertEqual(node.uuid, 'test_hostname')
|
||||
self.assertEqual(instance.uuid, 'ef500f7e-dac8-470f-960c-169486fce71b')
|
||||
|
||||
m_nova_helper.get_compute_node_by_name.assert_called_once_with(
|
||||
minimal_node['hypervisor_hostname'], servers=True, detailed=True)
|
||||
m_nova_helper.get_instance_list.assert_called_once_with(
|
||||
{'host': fake_compute_node.service['host']})
|
||||
|
||||
Reference in New Issue
Block a user