我正在尝试使用他们的FilterScheduler组件为OpenStack创建自定义过滤器。 FilterScheduler的文档位于:http://docs.openstack.org/developer/nova/devref/filter_scheduler.html#
现在,创建自己的自定义过滤器的文档并不多。事实上,完整的文档是:
If you want to create your own filter you just need to inherit from BaseHostFilter and implement one method: host_passes. This method should return True if host passes the filter. It takes host_state (describes host) and filter_properties dictionary as the parameters.
As an example, nova.conf could contain the following scheduler-related settings:
--scheduler_driver=nova.scheduler.FilterScheduler
--scheduler_available_filters=nova.scheduler.filters.standard_filters
--scheduler_available_filters=myfilter.MyFilter
--scheduler_default_filters=RamFilter,ComputeFilter,MyFilter
我创建了一个自定义“test_filter.py” - 它非常类似于“all_hosts_filter.py”,这是最简单的标准过滤器。
这是完整的:
from nova.scheduler import filters
from nova.openstack.common import log as logging
LOG = logging.getLogger(__name__)
class TestFilter(filters.BaseHostFilter):
"""NOOP host filter. Returns all hosts."""
def host_passes(self, host_state, filter_properties):
LOG.debug("COMING FROM: nova/scheduler/filters/test_filter.py")
return True
但是当我把这个文件“test_filter.py”放在nova/scheduler/filters
文件夹中并重新启动OpenStack时,我得到以下异常:
CRITICAL nova [-] Class test_filter could not be found: 'module' object has no attribute 'test_filter'
似乎OpenStack正在注册并尝试导入我的新过滤器,但是出现了一些错误。作为参考,这是我的/etc/nova/nova.conf
文件的相关部分:
scheduler_available_filters=nova.scheduler.filters.all_filters
scheduler_available_filters=nova.scheduler.filters.test_filter.TestFilter
scheduler_default_filters=TestFilter,RamFilter,ComputeFilter
==
更新:2000年4月15日BST。
这个问题的更新,仍然在苦苦挣扎。在OpenStack IRC频道讨论了boris-42的问题之后,我们进行了更多调查:
Openstack-scheduler作为来自/ usr / bin / nova-scheduler
的服务运行然后出现错误:
"Inner Exception: 'module' object has no attribute 'test_filter' from (pid=32696) import_class /usr/lib/python2.7/dist-packages/nova/utils.py:78"
这表明它使用/usr/lib/python2.7/dist-packages/nova/文件夹作为安装的源文件。
将我的自定义“test_filter.py”放入/usr/lib/python2.7/dist-packages/nova/scheduler/filters
会导致上述错误。
但是,仔细检查后,/usr/lib/python2.7/dist-packages/nova/scheduler/filters
文件夹中的所有其他文件实际上都是指向/usr/share/pyshared/nova/scheduler/filters
所以我将“test_filter.py”放在/usr/share/pyshared/nova/scheduler/filters
中 - 然后在原始文件夹中创建了一个符号链接。
这导致完全相同的文件夹。只要文件存在或文件夹/usr/lib/python2.7/dist-packages/nova/scheduler/filters
中存在链接,就会发生错误。
nova.conf文件已更新如下:
scheduler_available_filters=nova.scheduler.filters.TestFilter
scheduler_default_filters=TestFilter
答案 0 :(得分:0)
我认为您不得不将文件放在/usr/lib/python2.7/dist-packages/nova/scheduler/filters
中。您可以放在任何位置,并确保路径位于PYTHONPATH
。
如果要创建自己的过滤器,只需从BaseHostFilter继承并实现一个方法:host_passes。如果主机通过过滤器,则此方法应返回True。它将host_state(描述主机)和filter_properties字典作为参数。
例如,nova.conf可能包含以下与调度程序相关的设置:
......
--scheduler_available_filters=myfilter.MyFilter
.......
您必须在没有myfilet.MyFilter
的情况下提及nova.scheduler.filters
。