Могу ли я зарегистрировать обратные вызовы событий, используя модуль Python libvirt с бэкэндом QEMU? - PullRequest
7 голосов
/ 06 января 2012

Я хотел бы написать некоторый код для мониторинга событий для доменов, работающих под управлением QEMU, управляемым libvirt. Однако попытка зарегистрировать обработчик события приводит к следующей ошибке:

>>> import libvirt
>>> conn = libvirt.openReadOnly('qemu:///system')
>>> conn.domainEventRegister(callback, None)
libvir: Remote error : this function is not supported by the connection driver: no event support

(в этом случае «обратный вызов» является функцией-заглушкой, которая просто печатает свои аргументы.)

Примеры, которые я смог найти в отношении обработки событий в libvirt, не кажутся специфическими в отношении того, какие бэкенд-гипервизоры поддерживают какие функции. Ожидается ли это работать для бэкэндов QEMU?

Я использую систему Fedora 16, которая включает libvirt 0.9.6 и qemu-kvm 0.15.1 .

Для людей, оказавшихся здесь через :

ОБНОВЛЕНИЕ 2013-10-04

Через несколько месяцев и несколько выпусков Fedora код event-test.py в репозитории libvirt git корректно работает в Fedora 19.

1 Ответ

8 голосов
/ 24 января 2012

Убедитесь, что вы зарегистрировались в цикле событий libvirt (или настроили свой собственный) перед регистрацией событий.

Есть хороший пример обработки событий, поставляемый с исходным кодом libvirt (файл называется event-test.py). Я прилагаю пример, основанный на этом коде;

import libvirt
import time
import threading

def callback(conn, dom, event, detail, opaque):
    print "EVENT: Domain %s(%s) %s %s" % (dom.name(),
                                          dom.ID(),
                                          event,
                                          detail)

eventLoopThread = None

def virEventLoopNativeRun():
    while True:
        libvirt.virEventRunDefaultImpl()

def virEventLoopNativeStart():
    global eventLoopThread
    libvirt.virEventRegisterDefaultImpl()
    eventLoopThread = threading.Thread(target=virEventLoopNativeRun,
                                       name="libvirtEventLoop")
    eventLoopThread.setDaemon(True)
    eventLoopThread.start()

if __name__ == '__main__':

    virEventLoopNativeStart()

    conn = libvirt.openReadOnly('qemu:///system')

    conn.domainEventRegister(callback, None)
    conn.setKeepAlive(5, 3)

    while conn.isAlive() == 1:
        time.sleep(1)

Удачи!

// Seto

...