Commit 68be0af6 authored by Anael Beutot's avatar Anael Beutot
Browse files

Finished libvirt events handling for vm lifecycle.

parent 5a78eded
Loading
Loading
Loading
Loading
+30 −5
Original line number Diff line number Diff line
@@ -9,7 +9,7 @@ from ccnode.host import Handler as HostHandler
from ccnode.tags import Tag, tag_inspector, get_tags
from ccnode.hypervisor import tags
from ccnode.hypervisor import lib as _libvirt
from ccnode.hypervisor.lib import EVENTS, STORAGE_STATES, EventLoop
from ccnode.hypervisor.lib import DOMAIN_STATES, EVENTS, STORAGE_STATES, EventLoop
from ccnode.hypervisor.domains import VirtualMachine


@@ -33,7 +33,10 @@ class Handler(HostHandler):
        # initialize hypervisor instance
        global hypervisor
        if hypervisor is None:
            hypervisor = Hypervisor(kwargs.pop('hypervisor_name', None))
            hypervisor = Hypervisor(
                name=kwargs.pop('hypervisor_name', None),
                proxy=kwargs['proxy'],
            )

        self.hypervisor = weakref.proxy(hypervisor)

@@ -91,7 +94,13 @@ class Handler(HostHandler):

class Hypervisor(object):
    """Container for all hypervisor related state."""
    def __init__(self, name=None):
    def __init__(self, name, proxy):
        """
        :param str name: name of hypervisor instance
        :param proxy: sjRpc proxy
        """
        self.sjproxy = weakref.proxy(proxy)

        #: hv attributes
        self.name = name
        self.type = u'kvm'
@@ -136,11 +145,27 @@ class Hypervisor(object):

    def callback(self, conn, dom, event, detail, opaque):
        """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)
            vm = VirtualMachine(dom, self)
            self.domains[vm.uuid] = vm
            self.sjproxy.register(vm.name, 'vm')
            logger.debug('Add domain: %s (%s)', vm.name, vm.uuid)
        elif event == 'Removed':
            vm = self.domains.pop(dom.UUID())
            self.sjproxy.unregister(vm.name)
            logger.debug('Delete domain: %s (%s)', vm.name, vm.uuid)
        elif event in ('Started', 'Suspended', 'Resumed', 'Stopped', 'Saved',
                       'Restored'):
            vm = self.domains.get(dom.UUID())
            # sometimes libvirt sent a start event before a created event so be
            # careful
            if vm is not None:
                state = DOMAIN_STATES[dom.info()[0]]
                logger.debug('Domain change state from %s to %s', vm.state,
                             state)
                vm.state = state

    def get_domain_by_name(self, name):
        """Get a domain by name."""