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

Finished libvirt events handling for vm lifecycle.

parent 5a78eded
No related branches found
No related tags found
No related merge requests found
......@@ -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."""
......
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