【问题标题】:ClassNotFound exception when adding custom filter to OpenStack向 OpenStack 添加自定义过滤器时出现 ClassNotFound 异常
【发布时间】:2013-04-12 18:13:11
【问题描述】:

我正在尝试使用他们的 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 日。

对此问题的更新,仍在苦苦挣扎。在 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

【问题讨论】:

    标签: python openstack openstack-nova


    【解决方案1】:

    我认为您不必将文件放入/usr/lib/python2.7/dist-packages/nova/scheduler/filters。您可以放在任何地方并确保该路径位于PYTHONPATH 中。

    As metnion in example

    如果您想创建自己的过滤器,您只需要从 BaseHostFilter 继承并实现一种方法:host_passes。如果主机通过过滤器,此方法应返回 True。它以 host_state(描述主机)和 filter_properties 字典作为参数。

    例如,nova.conf 可以包含以下与调度程序相关的设置:

    ......
    --scheduler_available_filters=myfilter.MyFilter
    .......
    

    你必须提到myfilet.MyFilter而不是nova.scheduler.filters

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-05
      • 2017-04-20
      • 1970-01-01
      • 2012-06-25
      • 2011-07-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多