diff --git a/nova/tests/unit/virt/libvirt/test_config.py b/nova/tests/unit/virt/libvirt/test_config.py index 2c96bd2a67..01c5e43485 100644 --- a/nova/tests/unit/virt/libvirt/test_config.py +++ b/nova/tests/unit/virt/libvirt/test_config.py @@ -13,6 +13,8 @@ # under the License. import ddt +from unittest import mock + from lxml import etree from oslo_utils.fixture import uuidsentinel as uuids from oslo_utils import units @@ -80,6 +82,17 @@ class LibvirtConfigTest(LibvirtConfigBaseTest): obj = config.LibvirtConfigObject(root_name="demo") obj.parse_str(inxml) + @mock.patch.object(config.LOG, 'debug') + def test_config_parse_error_xml_logged(self, mock_debug): + inxml = "6<1" + obj = config.LibvirtConfigObject(root_name="demo") + + self.assertRaises(etree.XMLSyntaxError, obj.parse_str, inxml) + + mock_debug.assert_called_once_with( + 'Failed to parse the libvirt XML: %s', + "6<1") + def test_parse_on_off_str(self): obj = config.LibvirtConfigObject(root_name="demo") self.assertTrue(obj.parse_on_off_str('on')) diff --git a/nova/virt/libvirt/config.py b/nova/virt/libvirt/config.py index 76657231d5..a4395b4d28 100644 --- a/nova/virt/libvirt/config.py +++ b/nova/virt/libvirt/config.py @@ -28,6 +28,7 @@ import typing as ty from collections import OrderedDict from lxml import etree +from oslo_log import log as logging from oslo_utils import strutils from oslo_utils import units @@ -37,6 +38,7 @@ from nova.objects import fields from nova.pci import utils as pci_utils from nova.virt import hardware +LOG = logging.getLogger(__name__) # Namespace to use for Nova specific metadata items in XML NOVA_NS = "http://openstack.org/xmlns/libvirt/nova/1.1" @@ -83,7 +85,11 @@ class LibvirtConfigObject(object): return self._new_node(self.root_name) def parse_str(self, xmlstr): - self.parse_dom(etree.fromstring(xmlstr)) + try: + self.parse_dom(etree.fromstring(xmlstr)) + except etree.Error: + LOG.debug("Failed to parse the libvirt XML: %s", xmlstr) + raise def parse_dom(self, xmldoc): if self.root_name != xmldoc.tag: