我可以使用带有QEMU后端的libvirt Python模块注册事件回调吗?

lar*_*sks 7 python virtualization qemu libvirt

我想编写一些代码来监控由libvirt管理的QEMU下运行的域的事件.但是,尝试注册事件处理程序会产生以下错误:

>>> 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
Run Code Online (Sandbox Code Playgroud)

(在这种情况下,"回调"是一个简单打印其​​参数的存根函数.)

我能够找到关于libvirt事件处理的示例似乎并不具体说明哪些后端虚拟机管理程序支持哪些功能.这预计适用于QEMU后端吗?

我正在运行Fedora 16系统,其中包括libvirt 0.9.6qemu-kvm 0.15.1.

对于那些通过<searchengine>找到自己的人:

更新2013-10-04

许多月和一些Fedora版本之后,libvirt git存储库中的event-test.py代码在Fedora 19上正确运行.

Set*_*dor 8

在注册事件之前,请确保已在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)
Run Code Online (Sandbox Code Playgroud)

祝好运!

//濑