Respect CONF.scheduler_use_baremetal_filters

This fixes an issue where the default filters are loaded before
IronicHostManager overrides the default, which is the intended behavior
when CONF.scheduler_use_baremetal_filters is True.

Creates a _load_filters method on the base HostManager class that
returns a list of filters to be loaded at initialization, and overrides
it in IronicHostManager to return the default baremetal filters when
scheduler_use_baremetal_filters is set.

Change-Id: I1801c62d85665a6a3423428e91e1aeeb546613d7
Closes-Bug: #1439868
This commit is contained in:
Jim Rollenhagen 2015-04-02 14:55:18 -07:00
parent 7c5e7effe4
commit c4dc66994c
4 changed files with 36 additions and 6 deletions

View File

@ -310,8 +310,7 @@ class HostManager(object):
CONF.scheduler_available_filters)
self.filter_cls_map = {cls.__name__: cls for cls in filter_classes}
self.filter_obj_map = {}
self.default_filters = self._choose_host_filters(
CONF.scheduler_default_filters)
self.default_filters = self._choose_host_filters(self._load_filters())
self.weight_handler = weights.HostWeightHandler()
weigher_classes = self.weight_handler.get_matching_classes(
CONF.scheduler_weight_classes)
@ -328,6 +327,9 @@ class HostManager(object):
if self.tracks_instance_changes:
self._init_instance_info()
def _load_filters(self):
return CONF.scheduler_default_filters
def _init_aggregates(self):
elevated = context_module.get_admin_context()
aggs = objects.AggregateList.get_all(elevated)

View File

@ -98,11 +98,10 @@ class IronicNodeState(host_manager.HostState):
class IronicHostManager(host_manager.HostManager):
"""Ironic HostManager class."""
def __init__(self):
super(IronicHostManager, self).__init__()
def _load_filters(self):
if CONF.scheduler_use_baremetal_filters:
baremetal_default = CONF.baremetal_scheduler_default_filters
CONF.scheduler_default_filters = baremetal_default
return CONF.baremetal_scheduler_default_filters
return super(IronicHostManager, self)._load_filters()
def host_state_cls(self, host, node, **kwargs):
"""Factory function/property to create a new HostState."""

View File

@ -69,6 +69,10 @@ class HostManagerTestCase(test.NoDBTestCase):
self.fake_hosts += [host_manager.HostState('fake_multihost',
'fake-node%s' % x) for x in xrange(1, 5)]
def test_load_filters(self):
filters = self.host_manager._load_filters()
self.assertEqual(filters, ['FakeFilterClass1'])
@mock.patch.object(nova.objects.InstanceList, 'get_by_filters')
@mock.patch.object(nova.objects.ComputeNodeList, 'get_all')
@mock.patch('nova.utils.spawn_n')

View File

@ -242,6 +242,7 @@ class IronicHostManagerTestFilters(test.NoDBTestCase):
cls in ['FakeFilterClass1',
'FakeFilterClass2']])
self.flags(scheduler_default_filters=['FakeFilterClass1'])
self.flags(baremetal_scheduler_default_filters=['FakeFilterClass2'])
self.host_manager = ironic_host_manager.IronicHostManager()
self.fake_hosts = [ironic_host_manager.IronicNodeState(
'fake_host%s' % x, 'fake-node') for x in range(1, 5)]
@ -270,6 +271,30 @@ class IronicHostManagerTestFilters(test.NoDBTestCase):
self.assertEqual(1, len(default_filters))
self.assertIsInstance(default_filters[0], FakeFilterClass1)
@mock.patch.object(host_manager.HostManager, '_init_instance_info')
@mock.patch.object(host_manager.HostManager, '_init_aggregates')
def test_host_manager_default_filters_uses_baremetal(self, mock_init_agg,
mock_init_inst):
self.flags(scheduler_use_baremetal_filters=True)
host_manager = ironic_host_manager.IronicHostManager()
# ensure the defaults come from baremetal_scheduler_default_filters
# and not scheduler_default_filters
default_filters = host_manager.default_filters
self.assertEqual(1, len(default_filters))
self.assertIsInstance(default_filters[0], FakeFilterClass2)
def test_load_filters(self):
# without scheduler_use_baremetal_filters
filters = self.host_manager._load_filters()
self.assertEqual(['FakeFilterClass1'], filters)
def test_load_filters_baremetal(self):
# with scheduler_use_baremetal_filters
self.flags(scheduler_use_baremetal_filters=True)
filters = self.host_manager._load_filters()
self.assertEqual(['FakeFilterClass2'], filters)
def _mock_get_filtered_hosts(self, info):
info['got_objs'] = []
info['got_fprops'] = []