Исключение ClassNotFound при добавлении пользовательского фильтра в OpenStack

Я пытаюсь создать собственный фильтр для OpenStack, используя их компонент FilterScheduler. Документация для 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

======

ОБНОВЛЕНИЕ: 15 апреля 20:00 по московскому времени.

Обновление этого вопроса, все еще пытающегося. Обсудив проблему с boris-42 на IRC-канале OpenStack, мы немного поинтересовались:

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

person James Smith    schedule 12.04.2013    source источник


Ответы (1)


Я не думаю, что вам нужно помещать свой файл в /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.

person Nilesh    schedule 18.04.2013