Merge "Add missing unit tests for FilterScheduler._get_all_host_states"

This commit is contained in:
Jenkins
2017-09-06 07:54:18 +00:00
committed by Gerrit Code Review
3 changed files with 42 additions and 4 deletions

View File

@@ -321,10 +321,14 @@ class FilterScheduler(driver.Scheduler):
def _get_all_host_states(self, context, spec_obj, provider_summaries):
"""Template method, so a subclass can implement caching."""
# NOTE(jaypipes): None is treated differently from an empty dict. We
# pass None when we want to grab all compute nodes (for instance, when
# using the caching scheduler. We pass an empty dict when the Placement
# API found no providers that match the requested constraints.
# NOTE(jaypipes): provider_summaries being None is treated differently
# from an empty dict. provider_summaries is None when we want to grab
# all compute nodes, for instance when using the caching scheduler.
# The provider_summaries variable will be an empty dict when the
# Placement API found no providers that match the requested
# constraints, which in turn makes compute_uuids an empty list and
# get_host_states_by_uuids will return an empty tuple also, which will
# eventually result in a NoValidHost error.
compute_uuids = None
if provider_summaries is not None:
compute_uuids = list(provider_summaries.keys())

View File

@@ -596,6 +596,14 @@ class HostManager(object):
def _get_computes_for_cells(self, context, cells, compute_uuids=None):
"""Get a tuple of compute node and service information.
:param context: request context
:param cells: list of CellMapping objects
:param compute_uuids: list of ComputeNode UUIDs. If this is None, all
compute nodes from each specified cell will be returned, otherwise
only the ComputeNode objects with a UUID in the list of UUIDs in
any given cell is returned. If this is an empty list, the returned
compute_nodes tuple item will be an empty dict.
Returns a tuple (compute_nodes, services) where:
- compute_nodes is cell-uuid keyed dict of compute node lists
- services is a dict of services indexed by hostname

View File

@@ -599,3 +599,29 @@ class FilterSchedulerTestCase(test_scheduler.SchedulerTestCase):
mock.call(self.context, 'scheduler.select_destinations.end',
dict(request_spec=expected))]
self.assertEqual(expected, mock_info.call_args_list)
def test_get_all_host_states_provider_summaries_is_none(self):
"""Tests that HostManager.get_host_states_by_uuids is called with
compute_uuids being None when the incoming provider_summaries is None.
"""
with mock.patch.object(self.driver.host_manager,
'get_host_states_by_uuids') as get_host_states:
self.driver._get_all_host_states(
mock.sentinel.ctxt, mock.sentinel.spec_obj, None)
# Make sure get_host_states_by_uuids was called with
# compute_uuids being None.
get_host_states.assert_called_once_with(
mock.sentinel.ctxt, None, mock.sentinel.spec_obj)
def test_get_all_host_states_provider_summaries_is_empty(self):
"""Tests that HostManager.get_host_states_by_uuids is called with
compute_uuids being [] when the incoming provider_summaries is {}.
"""
with mock.patch.object(self.driver.host_manager,
'get_host_states_by_uuids') as get_host_states:
self.driver._get_all_host_states(
mock.sentinel.ctxt, mock.sentinel.spec_obj, {})
# Make sure get_host_states_by_uuids was called with
# compute_uuids being [].
get_host_states.assert_called_once_with(
mock.sentinel.ctxt, [], mock.sentinel.spec_obj)