Skip to content
Snippets Groups Projects
Commit 80ef8890 authored by Anael Beutot's avatar Anael Beutot
Browse files

Getting libvirt event loop to work.

TODO: Need to handle event.
parent 2468362c
No related branches found
No related tags found
No related merge requests found
......@@ -33,7 +33,7 @@ class Handler(HostHandler):
# register domains
proxy = kwargs.pop('proxy')
for dom in hypervisor.domains:
for dom in hypervisor.domains.itervalues():
name = dom.name
logger.debug(u'Registered domain %s' % name)
proxy.register(name, 'vm')
......@@ -75,29 +75,49 @@ class Handler(HostHandler):
class Hypervisor(object):
"""Container for all hypervisor related state."""
def __init__(self):
# initialize connection to libvirt
self.event_loop = EventLoop()
# This tells libvirt what event loop implementation it
# should use
libvirt.virEventRegisterImpl(
self.event_loop.add_handle,
self.event_loop.update_handle,
self.event_loop.remove_handle,
self.event_loop.add_timer,
self.event_loop.update_timer,
self.event_loop.remove_timer,
)
self.event_loop.start()
# TODO cleanup connection on stop
_libvirt.connection = libvirt.open('qemu:///system') # currently only support KVM
#: domains: vms, containers...
self.domains = [
VirtualMachine(
_libvirt.connection.lookupByID(id),
) for id in _libvirt.connection.listDomainsID()
]
self.domains = dict()
# find defined domains
for dom_name in _libvirt.connection.listDefinedDomains():
dom = _libvirt.connection.lookupByName(dom_name)
self.domains[dom.UUID()] = VirtualMachine(dom)
# find started domains
for dom_id in _libvirt.connection.listDomainsID():
dom = _libvirt.connection.lookupByID(dom_id)
self.domains[dom.UUID()] = VirtualMachine(dom)
logger.debug('Domains: %s', self.domains)
self.event_loop = EventLoop()
self.event_loop.start()
self.event_loop.register_callbacks(self.callback)
# TODO cleanup connection on stop
def callback(self, conn, dom, event, detail, opaque):
"""Callback for libvrit event loop."""
"""Callback for libvirt event loop."""
logger.debug("myDomainEventCallback1 EVENT: Domain %s(%s) %s %d" % (dom.name(), dom.UUIDString(), EVENTS[event], detail))
event = EVENTS[event]
if event == 'Added':
self.domains[dom.UUID()] = VirtualMachine(dom)
def get_domain_by_name(self, name):
"""Get a domain by name."""
for d in self.domains:
for d in self.domains.itervalues():
if d.name == name:
return d
......@@ -106,7 +126,7 @@ class Hypervisor(object):
def _count_domain(self, filter=lambda d: True):
count = 0
for dom in self.domains:
for dom in self.domains.itervalues():
if filter(dom):
count += 1
......
......@@ -141,22 +141,10 @@ class EventLoop(object):
self.debug("Self pipe watch %d write %d" %(self.pipetrick[0], self.pipetrick[1]))
self.poll.register(self.pipetrick[0], select.POLLIN)
# This tells libvirt what event loop implementation it
# should use
libvirt.virEventRegisterImpl(
self.add_handle,
self.update_handle,
self.remove_handle,
self.add_timer,
self.update_timer,
self.remove_timer,
)
def debug(self, msg):
if self.debugOn:
print msg
def next_timeout(self):
"""Calculate when the next timeout is due to occurr, returning
the absolute timestamp for the next timeout, or 0 if there is
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment