def dispatchLibvirtEvents(self, conn, dom, *args): try: eventid = args[-1] vmid = dom.UUIDString() v = self.vmContainer.get(vmid) if not v: self.log.debug('unknown vm %s event %s args %s', vmid, events.event_name(eventid), args) self._unknown_vm_ids.add(vmid) return # pylint cannot tell that unpacking the args tuple is safe, so we # must disbale this check here. # TODO: The real solution is to create a method per callback with # fixed number of arguments, and register the callbacks separately # in libvirt. # pylint: disable=unbalanced-tuple-unpacking if eventid == libvirt.VIR_DOMAIN_EVENT_ID_LIFECYCLE: event, detail = args[:-1] v.onLibvirtLifecycleEvent(event, detail, None) elif eventid == libvirt.VIR_DOMAIN_EVENT_ID_REBOOT: v.onReboot() elif eventid == libvirt.VIR_DOMAIN_EVENT_ID_RTC_CHANGE: utcoffset, = args[:-1] v.onRTCUpdate(utcoffset) elif eventid == libvirt.VIR_DOMAIN_EVENT_ID_IO_ERROR_REASON: srcPath, devAlias, action, reason = args[:-1] v.onIOError(devAlias, reason, action) elif eventid == libvirt.VIR_DOMAIN_EVENT_ID_GRAPHICS: phase, localAddr, remoteAddr, authScheme, subject = args[:-1] v.log.debug( 'graphics event phase ' '%s localAddr %s remoteAddr %s' 'authScheme %s subject %s', phase, localAddr, remoteAddr, authScheme, subject) if phase == libvirt.VIR_DOMAIN_EVENT_GRAPHICS_INITIALIZE: v.onConnect(remoteAddr['node'], remoteAddr['service']) elif phase == libvirt.VIR_DOMAIN_EVENT_GRAPHICS_DISCONNECT: v.onDisconnect(clientIp=remoteAddr['node'], clientPort=remoteAddr['service']) elif eventid == libvirt.VIR_DOMAIN_EVENT_ID_WATCHDOG: action, = args[:-1] v.onWatchdogEvent(action) elif eventid == libvirt.VIR_DOMAIN_EVENT_ID_JOB_COMPLETED: v.onJobCompleted(args) elif eventid == libvirt.VIR_DOMAIN_EVENT_ID_DEVICE_REMOVED: device_alias, = args[:-1] v.onDeviceRemoved(device_alias) elif eventid == libvirt.VIR_DOMAIN_EVENT_ID_BLOCK_THRESHOLD: dev, path, threshold, excess = args[:-1] v.drive_monitor.on_block_threshold(dev, path, threshold, excess) else: v.log.debug('unhandled libvirt event (event_name=%s, args=%s)', events.event_name(eventid), args) except: self.log.error("Error running VM callback", exc_info=True)
def dispatchLibvirtEvents(self, conn, dom, *args): try: eventid = args[-1] vmid = dom.UUIDString() v = self.vmContainer.get(vmid) if not v: self.log.debug('unknown vm %s event %s args %s', vmid, events.event_name(eventid), args) self._unknown_vm_ids.add(vmid) return if eventid == libvirt.VIR_DOMAIN_EVENT_ID_LIFECYCLE: event, detail = args[:-1] v.onLibvirtLifecycleEvent(event, detail, None) elif eventid == libvirt.VIR_DOMAIN_EVENT_ID_REBOOT: v.onReboot() elif eventid == libvirt.VIR_DOMAIN_EVENT_ID_RTC_CHANGE: utcoffset, = args[:-1] v.onRTCUpdate(utcoffset) elif eventid == libvirt.VIR_DOMAIN_EVENT_ID_IO_ERROR_REASON: srcPath, devAlias, action, reason = args[:-1] v.onIOError(devAlias, reason, action) elif eventid == libvirt.VIR_DOMAIN_EVENT_ID_GRAPHICS: phase, localAddr, remoteAddr, authScheme, subject = args[:-1] v.log.debug( 'graphics event phase ' '%s localAddr %s remoteAddr %s' 'authScheme %s subject %s', phase, localAddr, remoteAddr, authScheme, subject) if phase == libvirt.VIR_DOMAIN_EVENT_GRAPHICS_INITIALIZE: v.onConnect(remoteAddr['node'], remoteAddr['service']) elif phase == libvirt.VIR_DOMAIN_EVENT_GRAPHICS_DISCONNECT: v.onDisconnect(clientIp=remoteAddr['node'], clientPort=remoteAddr['service']) elif eventid == libvirt.VIR_DOMAIN_EVENT_ID_WATCHDOG: action, = args[:-1] v.onWatchdogEvent(action) elif eventid == libvirt.VIR_DOMAIN_EVENT_ID_JOB_COMPLETED: v.onJobCompleted(args) elif eventid == libvirt.VIR_DOMAIN_EVENT_ID_DEVICE_REMOVED: device_alias, = args[:-1] v.onDeviceRemoved(device_alias) else: v.log.debug('unhandled libvirt event (event_name=%s, args=%s)', events.event_name(eventid), args) except: self.log.error("Error running VM callback", exc_info=True)
def dispatchLibvirtEvents(self, conn, dom, *args): try: eventid = args[-1] vmid = dom.UUIDString() v = self.vmContainer.get(vmid) if not v: self.log.debug('unknown vm %s event %s args %s', vmid, events.event_name(eventid), args) return if eventid == libvirt.VIR_DOMAIN_EVENT_ID_LIFECYCLE: event, detail = args[:-1] v.onLibvirtLifecycleEvent(event, detail, None) elif eventid == libvirt.VIR_DOMAIN_EVENT_ID_REBOOT: v.onReboot() elif eventid == libvirt.VIR_DOMAIN_EVENT_ID_RTC_CHANGE: utcoffset, = args[:-1] v.onRTCUpdate(utcoffset) elif eventid == libvirt.VIR_DOMAIN_EVENT_ID_IO_ERROR_REASON: srcPath, devAlias, action, reason = args[:-1] v.onIOError(devAlias, reason, action) elif eventid == libvirt.VIR_DOMAIN_EVENT_ID_GRAPHICS: phase, localAddr, remoteAddr, authScheme, subject = args[:-1] v.log.debug('graphics event phase ' '%s localAddr %s remoteAddr %s' 'authScheme %s subject %s', phase, localAddr, remoteAddr, authScheme, subject) if phase == libvirt.VIR_DOMAIN_EVENT_GRAPHICS_INITIALIZE: v.onConnect(remoteAddr['node'], remoteAddr['service']) elif phase == libvirt.VIR_DOMAIN_EVENT_GRAPHICS_DISCONNECT: v.onDisconnect(clientIp=remoteAddr['node'], clientPort=remoteAddr['service']) elif eventid == libvirt.VIR_DOMAIN_EVENT_ID_WATCHDOG: action, = args[:-1] v.onWatchdogEvent(action) elif eventid == libvirt.VIR_DOMAIN_EVENT_ID_JOB_COMPLETED: v.onJobCompleted(args) elif eventid == libvirt.VIR_DOMAIN_EVENT_ID_DEVICE_REMOVED: device_alias, = args[:-1] v.onDeviceRemoved(device_alias) else: v.log.debug('unhandled libvirt event (event_name=%s, args=%s)', events.event_name(eventid), args) except: self.log.error("Error running VM callback", exc_info=True)
def dispatchLibvirtEvents(self, conn, dom, *args): eventid, v = self.lookup_vm_from_event(dom, *args) if v is None: return try: # pylint cannot tell that unpacking the args tuple is safe, so we # must disbale this check here. # TODO: The real solution is to create a method per callback with # fixed number of arguments, and register the callbacks separately # in libvirt. # pylint: disable=unbalanced-tuple-unpacking if eventid == libvirt.VIR_DOMAIN_EVENT_ID_LIFECYCLE: event, detail = args[:-1] v.onLibvirtLifecycleEvent(event, detail, None) elif eventid == libvirt.VIR_DOMAIN_EVENT_ID_REBOOT: v.onReboot() elif eventid == libvirt.VIR_DOMAIN_EVENT_ID_RTC_CHANGE: utcoffset, = args[:-1] v.onRTCUpdate(utcoffset) elif eventid == libvirt.VIR_DOMAIN_EVENT_ID_IO_ERROR_REASON: srcPath, devAlias, action, reason = args[:-1] v.onIOError(devAlias, reason, action) elif eventid == libvirt.VIR_DOMAIN_EVENT_ID_GRAPHICS: phase, localAddr, remoteAddr, authScheme, subject = args[:-1] v.log.debug('graphics event phase ' '%s localAddr %s remoteAddr %s' 'authScheme %s subject %s', phase, localAddr, remoteAddr, authScheme, subject) if phase == libvirt.VIR_DOMAIN_EVENT_GRAPHICS_INITIALIZE: v.onConnect(remoteAddr['node'], remoteAddr['service']) elif phase == libvirt.VIR_DOMAIN_EVENT_GRAPHICS_DISCONNECT: v.onDisconnect(clientIp=remoteAddr['node'], clientPort=remoteAddr['service']) elif eventid == libvirt.VIR_DOMAIN_EVENT_ID_WATCHDOG: action, = args[:-1] v.onWatchdogEvent(action) elif eventid == libvirt.VIR_DOMAIN_EVENT_ID_JOB_COMPLETED: v.onJobCompleted(args) elif eventid == libvirt.VIR_DOMAIN_EVENT_ID_DEVICE_REMOVED: device_alias, = args[:-1] v.onDeviceRemoved(device_alias) elif eventid == libvirt.VIR_DOMAIN_EVENT_ID_BLOCK_THRESHOLD: dev, path, threshold, excess = args[:-1] v.drive_monitor.on_block_threshold( dev, path, threshold, excess) else: v.log.debug('unhandled libvirt event (event_name=%s, args=%s)', events.event_name(eventid), args) except: self.log.error("Error running VM callback", exc_info=True)
def lookup_vm_from_event(self, dom, *args): eventid = args[-1] vmid = dom.UUIDString() v = self.vmContainer.get(vmid) if v is None: self.log.debug('unknown vm %s event %s args %s', vmid, events.event_name(eventid), args) if (eventid != libvirt.VIR_DOMAIN_EVENT_ID_LIFECYCLE or args[0] != libvirt.VIR_DOMAIN_EVENT_UNDEFINED): self._unknown_vm_ids.add(vmid) return eventid, v
def test_unknown(self): UNKNOWN_FAKE_EVENT_ID = 424242 # given unknown events, it must still return a meaningful string) assert UNKNOWN_FAKE_EVENT_ID not in events.LIBVIRT_EVENTS assert events.event_name(UNKNOWN_FAKE_EVENT_ID)
def test_known(self): for event_id in events.LIBVIRT_EVENTS: assert events.event_name(event_id)
def test_unknown(self): UNKNOWN_FAKE_EVENT_ID = 424242 # given unknown events, it must still return a meaningful string) self.assertNotIn(UNKNOWN_FAKE_EVENT_ID, events.LIBVIRT_EVENTS) self.assertTrue(events.event_name(UNKNOWN_FAKE_EVENT_ID))
def test_known(self): for event_id in events.LIBVIRT_EVENTS: self.assertTrue(events.event_name(event_id))