From f59be6d05752234f131c359b845bd66b2fd04a1b Mon Sep 17 00:00:00 2001 From: Antoine Millet Date: Fri, 4 Mar 2016 16:33:37 +0100 Subject: [PATCH] Handle update of devices added/removed from a VM --- cloudcontrol/node/hypervisor/kvm.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/cloudcontrol/node/hypervisor/kvm.py b/cloudcontrol/node/hypervisor/kvm.py index a20e3dd..2cffad0 100644 --- a/cloudcontrol/node/hypervisor/kvm.py +++ b/cloudcontrol/node/hypervisor/kvm.py @@ -83,12 +83,20 @@ class KVM(object): logger.debug('Domains: %s', self.domains) self.vir_con.domainEventRegister(self.vir_cb, None) + self.vir_cb_id_dev_add = self.vir_con.domainEventRegisterAny(None, + libvirt.VIR_DOMAIN_EVENT_ID_DEVICE_ADDED, + self.vir_cb_devices, None) + self.vir_cb_id_dev_del = self.vir_con.domainEventRegisterAny(None, + libvirt.VIR_DOMAIN_EVENT_ID_DEVICE_REMOVED, + self.vir_cb_devices, None) def stop(self): self.vir_event_loop.stop() # unregister callback try: self.vir_con.domainEventDeregister(self.vir_cb) + self.vir_con.domainEventDeregisterAny(self.vir_cb_id_dev_add) + self.vir_con.domainEventDeregisterAny(self.vir_cb_id_dev_del) except libvirt.libvirtError: # in case the libvirt connection is broken, it will raise the error pass @@ -167,6 +175,15 @@ class KVM(object): vm.state = state self.update_domain_count() + def vir_cb_devices(self, conn, dom, device, opaque): + """Callback for device add/removed from a domain.""" + logger.debug('Received device event on domain %s, dev %s', dom.name(), device) + vm = self.domains.get(dom.name()) + if vm is not None: + # Unregister/register VM to update devices list: + self.vm_unregister(vm.name) + self.vm_register(dom) + def vm_register(self, dom, redefine_on_stop=False): """Register a VM to the hypervisor object. -- GitLab