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: