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
Loading
Loading
Loading
Loading
+34 −14
Original line number Diff line number Diff line
@@ -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

+0 −12
Original line number Diff line number Diff line
@@ -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