diff --git a/cloudcontrol/node/hypervisor/kvm.py b/cloudcontrol/node/hypervisor/kvm.py index a20e3ddad458148d70962eb81c61282a4f0b3808..2cffad0778c8364005c1f6e87bb91ea474dc8896 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.