From 2b57b3d867f568a1539d4419b441ae8d666b77c4 Mon Sep 17 00:00:00 2001 From: Matt Riedemann Date: Thu, 8 Sep 2016 11:14:52 -0400 Subject: [PATCH] virt: handle unicode when logging LifecycleEvents The repr on the LifecycleEvent object includes a translated name, which blows up with a UnicodeEncodeError in the emit_event method because of str(event) and non-English locales. This change uses six.text_type on the object rather than str and adds a test to recreate the bug and show the fix. Change-Id: I9b7b52739883043b7aae9759f500e5e21cfe8b30 Closes-Bug: #1621392 --- nova/tests/unit/virt/test_virt_drivers.py | 12 ++++++++++++ nova/virt/driver.py | 5 +++-- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/nova/tests/unit/virt/test_virt_drivers.py b/nova/tests/unit/virt/test_virt_drivers.py index 256ab9999838..9d4b82edeac2 100644 --- a/nova/tests/unit/virt/test_virt_drivers.py +++ b/nova/tests/unit/virt/test_virt_drivers.py @@ -800,6 +800,18 @@ class _VirtDriverTestCase(_FakeDriverBackendTestCase): self.connection.emit_event(event1) + def test_emit_unicode_event(self): + """Tests that we do not fail on translated unicode events.""" + started_event = virtevent.LifecycleEvent( + "cef19ce0-0ca2-11df-855d-b19fbce37686", + virtevent.EVENT_LIFECYCLE_STARTED) + callback = mock.Mock() + self.connection.register_event_listener(callback) + with mock.patch.object(started_event, 'get_name', + return_value=u'\xF0\x9F\x92\xA9'): + self.connection.emit_event(started_event) + callback.assert_called_once_with(started_event) + def test_set_bootable(self): self.assertRaises(NotImplementedError, self.connection.set_bootable, 'instance', True) diff --git a/nova/virt/driver.py b/nova/virt/driver.py index 961ff32c5d09..1ca49a40fb8e 100644 --- a/nova/virt/driver.py +++ b/nova/virt/driver.py @@ -24,6 +24,7 @@ import sys from oslo_log import log as logging from oslo_utils import importutils +import six import nova.conf from nova.i18n import _, _LE, _LI @@ -1428,7 +1429,7 @@ class ComputeDriver(object): """ if not self._compute_event_callback: - LOG.debug("Discarding event %s", str(event)) + LOG.debug("Discarding event %s", six.text_type(event)) return if not isinstance(event, virtevent.Event): @@ -1436,7 +1437,7 @@ class ComputeDriver(object): _("Event must be an instance of nova.virt.event.Event")) try: - LOG.debug("Emitting event %s", str(event)) + LOG.debug("Emitting event %s", six.text_type(event)) self._compute_event_callback(event) except Exception as ex: LOG.error(_LE("Exception dispatching event %(event)s: %(ex)s"),