17
17
Scheduler host filters
23
from nova import exception
24
from nova.openstack.common import importutils
27
class BaseHostFilter(object):
20
from nova import filters
21
from nova.openstack.common import log as logging
23
LOG = logging.getLogger(__name__)
26
class BaseHostFilter(filters.BaseFilter):
28
27
"""Base class for host filters."""
28
def _filter_one(self, obj, filter_properties):
29
"""Return True if the object passes the filter, otherwise False."""
30
return self.host_passes(obj, filter_properties)
30
32
def host_passes(self, host_state, filter_properties):
33
"""Return True if the HostState passes the filter, otherwise False.
34
Override this in a subclass.
31
36
raise NotImplementedError()
34
"""module.classname of the filter."""
35
return "%s.%s" % (self.__module__, self.__class__.__name__)
38
def _is_filter_class(cls):
39
"""Return whether a class is a valid Host Filter class."""
40
return type(cls) is types.TypeType and issubclass(cls, BaseHostFilter)
43
def _get_filter_classes_from_module(module_name):
44
"""Get all filter classes from a module."""
46
module = importutils.import_module(module_name)
47
for obj_name in dir(module):
48
itm = getattr(module, obj_name)
49
if _is_filter_class(itm):
39
class HostFilterHandler(filters.BaseFilterHandler):
41
super(HostFilterHandler, self).__init__(BaseHostFilter)
45
"""Return a list of filter classes found in this directory.
47
This method is used as the default for available scheduler filters
48
and should return a list of all filter classes available.
50
return HostFilterHandler().get_all_classes()
54
53
def standard_filters():
55
"""Return a list of filter classes found in this directory."""
57
filters_dir = __path__[0]
58
for dirpath, dirnames, filenames in os.walk(filters_dir):
59
relpath = os.path.relpath(dirpath, filters_dir)
63
relpkg = '.%s' % '.'.join(relpath.split(os.sep))
64
for fname in filenames:
65
root, ext = os.path.splitext(fname)
66
if ext != '.py' or root == '__init__':
68
module_name = "%s%s.%s" % (__package__, relpkg, root)
69
mod_classes = _get_filter_classes_from_module(module_name)
70
classes.extend(mod_classes)
74
def get_filter_classes(filter_class_names):
75
"""Get filter classes from class names."""
77
for cls_name in filter_class_names:
78
obj = importutils.import_class(cls_name)
79
if _is_filter_class(obj):
81
elif type(obj) is types.FunctionType:
82
# Get list of classes from a function
85
raise exception.ClassNotFound(class_name=cls_name,
86
exception='Not a valid scheduler filter')
54
"""Deprecated. Configs should change to use all_filters()."""
55
LOG.deprecated(_("Use 'nova.scheduler.filters.all_filters' instead "
56
"of 'nova.scheduler.filters.standard_filters'"))