Merge "Log xml in libvirt _create_domain failures"

This commit is contained in:
Jenkins
2013-06-27 16:29:23 +00:00
committed by Gerrit Code Review
2 changed files with 104 additions and 3 deletions

View File

@@ -44,6 +44,7 @@ from nova.openstack.common import fileutils
from nova.openstack.common import importutils
from nova.openstack.common import jsonutils
from nova.openstack.common import loopingcall
from nova.openstack.common import processutils
from nova.openstack.common import uuidutils
from nova import test
from nova.tests import fake_network
@@ -4022,6 +4023,88 @@ class LibvirtConnTestCase(test.TestCase):
self.mox.ReplayAll()
self.assertTrue(conn._is_storage_shared_with('foo', '/path'))
def test_create_domain_define_xml_fails(self):
"""
Tests that the xml is logged when defining the domain fails.
"""
fake_xml = "<test>this is a test</test>"
def fake_defineXML(xml):
self.assertEquals(fake_xml, xml)
raise libvirt.libvirtError('virDomainDefineXML() failed')
self.log_error_called = False
def fake_error(msg):
self.log_error_called = True
self.assertTrue(fake_xml in msg)
self.stubs.Set(nova.virt.libvirt.driver.LOG, 'error', fake_error)
self.create_fake_libvirt_mock(defineXML=fake_defineXML)
self.mox.ReplayAll()
conn = libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), True)
self.assertRaises(libvirt.libvirtError, conn._create_domain, fake_xml)
self.assertTrue(self.log_error_called)
def test_create_domain_with_flags_fails(self):
"""
Tests that the xml is logged when creating the domain with flags fails.
"""
fake_xml = "<test>this is a test</test>"
fake_domain = FakeVirtDomain(fake_xml)
def fake_createWithFlags(launch_flags):
raise libvirt.libvirtError('virDomainCreateWithFlags() failed')
self.log_error_called = False
def fake_error(msg):
self.log_error_called = True
self.assertTrue(fake_xml in msg)
self.stubs.Set(fake_domain, 'createWithFlags', fake_createWithFlags)
self.stubs.Set(nova.virt.libvirt.driver.LOG, 'error', fake_error)
self.create_fake_libvirt_mock()
self.mox.ReplayAll()
conn = libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), True)
self.assertRaises(libvirt.libvirtError, conn._create_domain,
domain=fake_domain)
self.assertTrue(self.log_error_called)
def test_create_domain_enable_hairpin_fails(self):
"""
Tests that the xml is logged when enabling hairpin mode for the domain
fails.
"""
fake_xml = "<test>this is a test</test>"
fake_domain = FakeVirtDomain(fake_xml)
def fake_enable_hairpin(launch_flags):
raise processutils.ProcessExecutionError('error')
self.log_error_called = False
def fake_error(msg):
self.log_error_called = True
self.assertTrue(fake_xml in msg)
self.stubs.Set(nova.virt.libvirt.driver.LOG, 'error', fake_error)
self.create_fake_libvirt_mock()
self.mox.ReplayAll()
conn = libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), True)
self.stubs.Set(conn, '_enable_hairpin', fake_enable_hairpin)
self.assertRaises(processutils.ProcessExecutionError,
conn._create_domain,
domain=fake_domain,
power_on=False)
self.assertTrue(self.log_error_called)
class HostStateTestCase(test.TestCase):

View File

@@ -2506,10 +2506,28 @@ class LibvirtDriver(driver.ComputeDriver):
use_cow=CONF.use_cow_images)
if xml:
domain = self._conn.defineXML(xml)
try:
domain = self._conn.defineXML(xml)
except Exception as e:
LOG.error(_("An error occurred while trying to define a domain"
" with xml: %s") % xml)
raise e
if power_on:
domain.createWithFlags(launch_flags)
self._enable_hairpin(domain.XMLDesc(0))
try:
domain.createWithFlags(launch_flags)
except Exception as e:
with excutils.save_and_reraise_exception():
LOG.error(_("An error occurred while trying to launch a "
"defined domain with xml: %s") %
domain.XMLDesc(0))
try:
self._enable_hairpin(domain.XMLDesc(0))
except Exception:
with excutils.save_and_reraise_exception():
LOG.error(_("An error occurred while enabling hairpin mode on "
"domain with xml: %s") % domain.XMLDesc(0))
# NOTE(uni): Now the container is running with its own private mount
# namespace and so there is no need to keep the container rootfs