[Optimize] Validate configured scheduler filters when initialize

The correctness of default scheduler filters will be validated
only when processing filter requests, this means administrators
will be unware of that until creating requests keep failing.
This patch moves that logic into initialization code.

Change-Id: I596c94fae33767b6b8d4816e572ff5e9dda621b7
This commit is contained in:
TommyLike 2018-04-02 14:34:21 +08:00
parent b3b5779119
commit fe7b3812a6
2 changed files with 28 additions and 14 deletions

View File

@ -414,6 +414,8 @@ class HostManager(object):
self.filter_handler = filters.BackendFilterHandler('cinder.scheduler.'
'filters')
self.filter_classes = self.filter_handler.get_all_classes()
self.enabled_filters = self._choose_backend_filters(
CONF.scheduler_default_filters)
self.weight_handler = importutils.import_object(
CONF.scheduler_weight_handler,
'cinder.scheduler.weights')
@ -430,8 +432,6 @@ class HostManager(object):
of acceptable filters (all loaded filters). If input is None,
it uses CONF.scheduler_default_filters instead.
"""
if filter_cls_names is None:
filter_cls_names = CONF.scheduler_default_filters
if not isinstance(filter_cls_names, (list, tuple)):
filter_cls_names = [filter_cls_names]
good_filters = []
@ -481,7 +481,10 @@ class HostManager(object):
def get_filtered_backends(self, backends, filter_properties,
filter_class_names=None):
"""Filter backends and return only ones passing all filters."""
filter_classes = self._choose_backend_filters(filter_class_names)
if filter_class_names is not None:
filter_classes = self._choose_backend_filters(filter_class_names)
else:
filter_classes = self.enabled_filters
return self.filter_handler.get_filtered_objects(filter_classes,
backends,
filter_properties)

View File

@ -64,20 +64,31 @@ class HostManagerTestCase(test.TestCase):
# For a second scheduler service.
self.host_manager_1 = host_manager.HostManager()
@mock.patch(
'cinder.scheduler.filters.BackendFilterHandler.get_all_classes')
def test_initialzie_with_default_filters(self, mock_get_all_classes):
self.flags(scheduler_default_filters=
'FakeFilterClass1,FakeFilterClass2')
mock_get_all_classes.return_value = [
FakeFilterClass1, FakeFilterClass2, FakeFilterClass3]
h_manager = host_manager.HostManager()
self.assertListEqual([FakeFilterClass1, FakeFilterClass2],
h_manager.enabled_filters)
def test_choose_backend_filters_not_found(self):
self.flags(scheduler_default_filters='FakeFilterClass3')
self.host_manager.filter_classes = [FakeFilterClass1,
FakeFilterClass2]
self.assertRaises(exception.SchedulerHostFilterNotFound,
self.host_manager._choose_backend_filters, None)
self.host_manager._choose_backend_filters,
'FakeFilterClass3')
def test_choose_backend_filters(self):
self.flags(scheduler_default_filters=['FakeFilterClass2'])
self.host_manager.filter_classes = [FakeFilterClass1,
FakeFilterClass2]
# Test 'volume' returns 1 correct function
filter_classes = self.host_manager._choose_backend_filters(None)
filter_classes = self.host_manager._choose_backend_filters(
'FakeFilterClass2')
self.assertEqual(1, len(filter_classes))
self.assertEqual('FakeFilterClass2', filter_classes[0].__name__)
@ -94,9 +105,9 @@ class HostManagerTestCase(test.TestCase):
expected = []
for fake_backend in self.fake_backends:
expected.append(mock.call(fake_backend, fake_properties))
result = self.host_manager.get_filtered_backends(self.fake_backends,
fake_properties)
host_manager1 = host_manager.HostManager()
result = host_manager1.get_filtered_backends(self.fake_backends,
fake_properties)
self.assertEqual(expected, mock_func.call_args_list)
self.assertEqual(set(self.fake_backends), set(result))
@ -1066,10 +1077,10 @@ class HostManagerTestCase(test.TestCase):
'volume_backend_name': 'AAA',
'qos_specs': 'BBB',
}
res = self.host_manager._filter_pools_by_volume_type(context,
mock_volume_type,
hosts)
host_manager1 = host_manager.HostManager()
res = host_manager1._filter_pools_by_volume_type(context,
mock_volume_type,
hosts)
expected = {'host1': {'volume_backend_name': 'AAA',
'total_capacity_gb': 512,
'free_capacity_gb': 200,