def test_live_migration_find_type_bad_err(self, mock_active): mock_active.side_effect = fakelibvirt.make_libvirtError( fakelibvirt.libvirtError, "Something weird happened", error_code=fakelibvirt.VIR_ERR_INTERNAL_ERROR) self.assertEqual(migration.find_job_type(self.guest, self.instance), fakelibvirt.VIR_DOMAIN_JOB_FAILED)
def test_live_migration_find_type_no_domain(self, mock_active): mock_active.side_effect = fakelibvirt.make_libvirtError( fakelibvirt.libvirtError, "No domain with ID", error_code=fakelibvirt.VIR_ERR_NO_DOMAIN) self.assertEqual(migration.find_job_type(self.guest, self.instance), fakelibvirt.VIR_DOMAIN_JOB_COMPLETED)
def _event_lifecycle_callback(conn, dom, event, detail, opaque): """Receives lifecycle events from libvirt. NB: this method is executing in a native thread, not an eventlet coroutine. It can only invoke other libvirt APIs, or use self._queue_event(). Any use of logging APIs in particular is forbidden. """ self = opaque uuid = dom.UUIDString() transition = None if event == libvirt.VIR_DOMAIN_EVENT_STOPPED: transition = virtevent.EVENT_LIFECYCLE_STOPPED elif event == libvirt.VIR_DOMAIN_EVENT_STARTED: transition = virtevent.EVENT_LIFECYCLE_STARTED elif event == libvirt.VIR_DOMAIN_EVENT_SUSPENDED: if detail == libvirt.VIR_DOMAIN_EVENT_SUSPENDED_POSTCOPY: transition = virtevent.EVENT_LIFECYCLE_POSTCOPY_STARTED elif detail == libvirt.VIR_DOMAIN_EVENT_SUSPENDED_MIGRATED: # VIR_DOMAIN_EVENT_SUSPENDED_MIGRATED is also sent when live # migration of the guest fails, so we cannot simply rely # on the event itself but need to check if the job itself was # successful. # NOTE(mriedem): The job check logic here is copied from # LibvirtDriver._live_migration_monitor. guest = libvirt_guest.Guest(dom) info = guest.get_job_info() if info.type == libvirt.VIR_DOMAIN_JOB_NONE: # Either still running, or failed or completed, # lets untangle the mess. info.type = libvirt_migrate.find_job_type(guest, instance=None, logging_ok=False) if info.type == libvirt.VIR_DOMAIN_JOB_COMPLETED: transition = virtevent.EVENT_LIFECYCLE_MIGRATION_COMPLETED else: # Failed or some other status we don't know about, so just # opt to report the guest is paused. transition = virtevent.EVENT_LIFECYCLE_PAUSED else: transition = virtevent.EVENT_LIFECYCLE_PAUSED elif event == libvirt.VIR_DOMAIN_EVENT_RESUMED: transition = virtevent.EVENT_LIFECYCLE_RESUMED if transition is not None: self._queue_event(virtevent.LifecycleEvent(uuid, transition))
def test_live_migration_find_type_inactive(self, mock_active): self.assertEqual(migration.find_job_type(self.guest, self.instance), fakelibvirt.VIR_DOMAIN_JOB_COMPLETED)
def test_live_migration_find_type_no_logging(self, mock_active, _mock_log): self.assertEqual( fakelibvirt.VIR_DOMAIN_JOB_FAILED, migration.find_job_type(self.guest, self.instance, logging_ok=False))