diff --git a/nova/tests/unit/virt/libvirt/test_driver.py b/nova/tests/unit/virt/libvirt/test_driver.py index 89e237aa6589..617349526e9d 100644 --- a/nova/tests/unit/virt/libvirt/test_driver.py +++ b/nova/tests/unit/virt/libvirt/test_driver.py @@ -1401,6 +1401,26 @@ class LibvirtConnTestCase(test.NoDBTestCase, self.assertRaises(exception.NovaException, drvr.set_admin_password, instance, "123") + @mock.patch('nova.utils.get_image_from_system_metadata') + @mock.patch.object(host.Host, + 'has_min_version', return_value=True) + @mock.patch('nova.virt.libvirt.host.Host.get_guest') + def test_set_admin_password_error_with_unicode( + self, mock_get_guest, ver, mock_image): + self.flags(virt_type='kvm', group='libvirt') + instance = objects.Instance(**self.test_instance) + mock_image.return_value = {"properties": { + "hw_qemu_guest_agent": "yes"}} + mock_guest = mock.Mock(spec=libvirt_guest.Guest) + mock_guest.set_user_password.side_effect = ( + fakelibvirt.libvirtError( + b"failed: \xe9\x94\x99\xe8\xaf\xaf\xe3\x80\x82")) + mock_get_guest.return_value = mock_guest + + drvr = libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), True) + self.assertRaises(exception.NovaException, + drvr.set_admin_password, instance, "123") + @mock.patch.object(objects.Service, 'save') @mock.patch.object(objects.Service, 'get_by_compute_host') def test_set_host_enabled_with_disable(self, mock_svc, mock_save): diff --git a/nova/virt/libvirt/driver.py b/nova/virt/libvirt/driver.py index d98ff6567197..422538ac927e 100644 --- a/nova/virt/libvirt/driver.py +++ b/nova/virt/libvirt/driver.py @@ -53,6 +53,7 @@ from oslo_concurrency import processutils from oslo_log import log as logging from oslo_serialization import jsonutils from oslo_service import loopingcall +from oslo_utils import encodeutils from oslo_utils import excutils from oslo_utils import fileutils from oslo_utils import importutils @@ -1814,9 +1815,10 @@ class LibvirtDriver(driver.ComputeDriver): guest.set_user_password(user, new_pass) except libvirt.libvirtError as ex: error_code = ex.get_error_code() + err_msg = encodeutils.exception_to_unicode(ex) msg = (_('Error from libvirt while set password for username ' '"%(user)s": [Error Code %(error_code)s] %(ex)s') - % {'user': user, 'error_code': error_code, 'ex': ex}) + % {'user': user, 'error_code': error_code, 'ex': err_msg}) raise exception.InternalError(msg) def _can_quiesce(self, instance, image_meta): @@ -1840,10 +1842,11 @@ class LibvirtDriver(driver.ComputeDriver): guest.thaw_filesystems() except libvirt.libvirtError as ex: error_code = ex.get_error_code() + err_msg = encodeutils.exception_to_unicode(ex) msg = (_('Error from libvirt while quiescing %(instance_name)s: ' '[Error Code %(error_code)s] %(ex)s') % {'instance_name': instance.name, - 'error_code': error_code, 'ex': ex}) + 'error_code': error_code, 'ex': err_msg}) raise exception.InternalError(msg) def quiesce(self, context, instance, image_meta):