Merge "libvirt: introduce method to get domain XML"

This commit is contained in:
Jenkins 2015-06-11 08:35:17 +00:00 committed by Gerrit Code Review
commit 72db29d8fd
4 changed files with 126 additions and 74 deletions

View File

@ -248,7 +248,7 @@ class FakeVirtDomain(object):
def createWithFlags(self, launch_flags):
pass
def XMLDesc(self, *args):
def XMLDesc(self, flags):
return self._fake_dom_xml
def UUIDString(self):
@ -449,7 +449,7 @@ class FakeNodeDevice(object):
def __init__(self, fakexml):
self.xml = fakexml
def XMLDesc(self, *args):
def XMLDesc(self, flags):
return self.xml
@ -812,7 +812,7 @@ class LibvirtConnTestCase(test.NoDBTestCase):
pci_devices[0]['hypervisor_name'] = 'marked'
pass
def XMLDesc(self, flag):
def XMLDesc(self, flags):
return fake_domXML1
guest = libvirt_guest.Guest(FakeDomain())
@ -856,7 +856,7 @@ class LibvirtConnTestCase(test.NoDBTestCase):
def detachDeviceFlags(self, xml, flags):
pass
def XMLDesc(self, flag):
def XMLDesc(self, flags):
return fake_domXML1
guest = libvirt_guest.Guest(FakeDomain())
@ -5712,7 +5712,7 @@ class LibvirtConnTestCase(test.NoDBTestCase):
vdmock = self.mox.CreateMock(fakelibvirt.virDomain)
self.mox.StubOutWithMock(vdmock, "migrateToURI2")
_bandwidth = CONF.libvirt.live_migration_bandwidth
vdmock.XMLDesc(fakelibvirt.VIR_DOMAIN_XML_MIGRATABLE).AndReturn(
vdmock.XMLDesc(flags=fakelibvirt.VIR_DOMAIN_XML_MIGRATABLE).AndReturn(
initial_xml)
vdmock.migrateToURI2(CONF.libvirt.live_migration_uri % 'dest',
None,
@ -6017,8 +6017,8 @@ class LibvirtConnTestCase(test.NoDBTestCase):
_bandwidth).AndRaise(
fakelibvirt.libvirtError('ERR'))
else:
vdmock.XMLDesc(fakelibvirt.VIR_DOMAIN_XML_MIGRATABLE).AndReturn(
FakeVirtDomain().XMLDesc(0))
vdmock.XMLDesc(flags=fakelibvirt.VIR_DOMAIN_XML_MIGRATABLE
).AndReturn(FakeVirtDomain().XMLDesc(flags=0))
vdmock.migrateToURI2(CONF.libvirt.live_migration_uri % 'dest',
None,
mox.IgnoreArg(),
@ -6053,8 +6053,8 @@ class LibvirtConnTestCase(test.NoDBTestCase):
self.mox.StubOutWithMock(vdmock, 'migrateToURI2')
self.mox.StubOutWithMock(vdmock, 'migrateToURI')
_bandwidth = CONF.libvirt.live_migration_bandwidth
vdmock.XMLDesc(fakelibvirt.VIR_DOMAIN_XML_MIGRATABLE).AndReturn(
FakeVirtDomain().XMLDesc(0))
vdmock.XMLDesc(flags=fakelibvirt.VIR_DOMAIN_XML_MIGRATABLE).AndReturn(
FakeVirtDomain().XMLDesc(flags=0))
unsupported_config_error = fakelibvirt.libvirtError('ERR')
unsupported_config_error.err = (
fakelibvirt.VIR_ERR_CONFIG_UNSUPPORTED,)
@ -6810,7 +6810,7 @@ class LibvirtConnTestCase(test.NoDBTestCase):
# Preparing mocks
vdmock = self.mox.CreateMock(fakelibvirt.virDomain)
self.mox.StubOutWithMock(vdmock, "XMLDesc")
vdmock.XMLDesc(0).AndReturn(dummyxml)
vdmock.XMLDesc(flags=0).AndReturn(dummyxml)
def fake_lookup(instance_name):
if instance_name == instance.name:
@ -6900,7 +6900,7 @@ class LibvirtConnTestCase(test.NoDBTestCase):
# Preparing mocks
vdmock = self.mox.CreateMock(fakelibvirt.virDomain)
self.mox.StubOutWithMock(vdmock, "XMLDesc")
vdmock.XMLDesc(0).AndReturn(dummyxml)
vdmock.XMLDesc(flags=0).AndReturn(dummyxml)
def fake_lookup(instance_name):
if instance_name == instance.name:
@ -6967,7 +6967,7 @@ class LibvirtConnTestCase(test.NoDBTestCase):
# Preparing mocks
vdmock = self.mox.CreateMock(fakelibvirt.virDomain)
self.mox.StubOutWithMock(vdmock, "XMLDesc")
vdmock.XMLDesc(0).AndReturn(dummyxml)
vdmock.XMLDesc(flags=0).AndReturn(dummyxml)
def fake_lookup(instance_name):
if instance_name == instance.name:
@ -10198,7 +10198,7 @@ class LibvirtConnTestCase(test.NoDBTestCase):
vdmock = self.mox.CreateMock(fakelibvirt.virDomain)
self.mox.StubOutWithMock(vdmock, "XMLDesc")
vdmock.XMLDesc(0).AndReturn(dummyxml)
vdmock.XMLDesc(flags=0).AndReturn(dummyxml)
def fake_lookup(instance_name):
if instance_name == instance['name']:
@ -10217,7 +10217,7 @@ class LibvirtConnTestCase(test.NoDBTestCase):
vdmock = self.mox.CreateMock(fakelibvirt.virDomain)
self.mox.StubOutWithMock(vdmock, "XMLDesc")
vdmock.XMLDesc(0).AndReturn(dummyxml)
vdmock.XMLDesc(flags=0).AndReturn(dummyxml)
def fake_lookup(instance_name):
if instance_name == instance['name']:
@ -10238,7 +10238,7 @@ class LibvirtConnTestCase(test.NoDBTestCase):
vdmock = self.mox.CreateMock(fakelibvirt.virDomain)
self.mox.StubOutWithMock(vdmock, "XMLDesc")
vdmock.XMLDesc(0).AndReturn(dummyxml)
vdmock.XMLDesc(flags=0).AndReturn(dummyxml)
def fake_lookup(instance_name):
if instance_name == instance['name']:
@ -10257,7 +10257,7 @@ class LibvirtConnTestCase(test.NoDBTestCase):
vdmock = self.mox.CreateMock(fakelibvirt.virDomain)
self.mox.StubOutWithMock(vdmock, "XMLDesc")
vdmock.XMLDesc(0).AndReturn(dummyxml)
vdmock.XMLDesc(flags=0).AndReturn(dummyxml)
def fake_lookup(instance_name):
if instance_name == instance['name']:
@ -10884,8 +10884,8 @@ class LibvirtConnTestCase(test.NoDBTestCase):
drvr._swap_volume(mock_dom, srcfile, dstfile, 1)
mock_dom.XMLDesc.assert_called_once_with(
fakelibvirt.VIR_DOMAIN_XML_INACTIVE |
fakelibvirt.VIR_DOMAIN_XML_SECURE)
flags=(fakelibvirt.VIR_DOMAIN_XML_INACTIVE |
fakelibvirt.VIR_DOMAIN_XML_SECURE))
mock_dom.blockRebase.assert_called_once_with(
srcfile, dstfile, 0,
fakelibvirt.VIR_DOMAIN_BLOCK_REBASE_COPY |
@ -10980,9 +10980,9 @@ class LibvirtConnTestCase(test.NoDBTestCase):
drvr._live_snapshot(self.context, self.test_instance, mock_dom,
srcfile, dstfile, "qcow2", {})
mock_dom.XMLDesc.assert_called_once_with(
mock_dom.XMLDesc.assert_called_once_with(flags=(
fakelibvirt.VIR_DOMAIN_XML_INACTIVE |
fakelibvirt.VIR_DOMAIN_XML_SECURE)
fakelibvirt.VIR_DOMAIN_XML_SECURE))
mock_dom.blockRebase.assert_called_once_with(
srcfile, dltfile, 0,
fakelibvirt.VIR_DOMAIN_BLOCK_REBASE_COPY |
@ -12029,7 +12029,7 @@ class LibvirtDriverTestCase(test.NoDBTestCase):
def __init__(self):
super(FakeExceptionDomain, self).__init__()
def XMLDesc(self, *args):
def XMLDesc(self, flags):
raise fakelibvirt.libvirtError("Libvirt error")
def fake_get_domain(self, instance):
@ -13014,7 +13014,7 @@ class LibvirtVolumeSnapshotTestCase(test.NoDBTestCase):
domain = FakeVirtDomain(fake_xml=self.dom_xml)
self.mox.StubOutWithMock(domain, 'XMLDesc')
self.mox.StubOutWithMock(domain, 'snapshotCreateXML')
domain.XMLDesc(0).AndReturn(self.dom_xml)
domain.XMLDesc(flags=0).AndReturn(self.dom_xml)
snap_xml_src = (
'<domainsnapshot>\n'
@ -13083,7 +13083,7 @@ class LibvirtVolumeSnapshotTestCase(test.NoDBTestCase):
domain = FakeVirtDomain(fake_xml=self.dom_xml)
self.mox.StubOutWithMock(domain, 'XMLDesc')
self.mox.StubOutWithMock(domain, 'snapshotCreateXML')
domain.XMLDesc(0).AndReturn(self.dom_xml)
domain.XMLDesc(flags=0).AndReturn(self.dom_xml)
snap_xml_src = (
'<domainsnapshot>\n'
@ -13198,7 +13198,7 @@ class LibvirtVolumeSnapshotTestCase(test.NoDBTestCase):
domain = FakeVirtDomain(fake_xml=self.dom_xml)
self.mox.StubOutWithMock(domain, 'XMLDesc')
domain.XMLDesc(0).AndReturn(self.dom_xml)
domain.XMLDesc(flags=0).AndReturn(self.dom_xml)
self.mox.StubOutWithMock(self.drvr._host, 'get_domain')
self.mox.StubOutWithMock(self.drvr._host, 'has_min_version')
@ -13232,7 +13232,7 @@ class LibvirtVolumeSnapshotTestCase(test.NoDBTestCase):
domain = FakeVirtDomain(fake_xml=self.dom_xml)
self.mox.StubOutWithMock(domain, 'XMLDesc')
domain.XMLDesc(0).AndReturn(self.dom_xml)
domain.XMLDesc(flags=0).AndReturn(self.dom_xml)
self.mox.StubOutWithMock(self.drvr._host, 'get_domain')
self.mox.StubOutWithMock(self.drvr._host, 'has_min_version')
@ -13268,7 +13268,7 @@ class LibvirtVolumeSnapshotTestCase(test.NoDBTestCase):
domain = FakeVirtDomain(fake_xml=self.dom_xml)
self.mox.StubOutWithMock(domain, 'XMLDesc')
domain.XMLDesc(0).AndReturn(self.dom_xml)
domain.XMLDesc(flags=0).AndReturn(self.dom_xml)
self.mox.StubOutWithMock(self.drvr._host, 'get_domain')
self.mox.StubOutWithMock(self.drvr._host, 'has_min_version')
@ -13301,7 +13301,7 @@ class LibvirtVolumeSnapshotTestCase(test.NoDBTestCase):
domain = FakeVirtDomain(fake_xml=self.dom_xml)
self.mox.StubOutWithMock(domain, 'XMLDesc')
domain.XMLDesc(0).AndReturn(self.dom_xml)
domain.XMLDesc(flags=0).AndReturn(self.dom_xml)
self.mox.StubOutWithMock(self.drvr._host, 'get_domain')
self.mox.StubOutWithMock(self.drvr._host, 'has_min_version')
@ -13419,7 +13419,7 @@ class LibvirtVolumeSnapshotTestCase(test.NoDBTestCase):
def __init__(self, *args, **kwargs):
super(FakeNetdiskDomain, self).__init__(*args, **kwargs)
def XMLDesc(self, *args):
def XMLDesc(self, flags):
return self.dom_netdisk_xml
# libvirt lib doesn't have VIR_DOMAIN_BLOCK_REBASE_RELATIVE
@ -13431,7 +13431,7 @@ class LibvirtVolumeSnapshotTestCase(test.NoDBTestCase):
domain = FakeNetdiskDomain(fake_xml=self.dom_netdisk_xml)
self.mox.StubOutWithMock(domain, 'XMLDesc')
domain.XMLDesc(0).AndReturn(self.dom_netdisk_xml)
domain.XMLDesc(flags=0).AndReturn(self.dom_netdisk_xml)
self.mox.StubOutWithMock(self.drvr._host, 'get_domain')
self.mox.StubOutWithMock(self.drvr._host, 'has_min_version')
@ -13461,7 +13461,7 @@ class LibvirtVolumeSnapshotTestCase(test.NoDBTestCase):
def __init__(self, *args, **kwargs):
super(FakeNetdiskDomain, self).__init__(*args, **kwargs)
def XMLDesc(self, *args):
def XMLDesc(self, flags):
return self.dom_netdisk_xml
self.stubs.Set(libvirt_driver, 'libvirt', fakelibvirt)
@ -13471,7 +13471,7 @@ class LibvirtVolumeSnapshotTestCase(test.NoDBTestCase):
domain = FakeNetdiskDomain(fake_xml=self.dom_netdisk_xml)
self.mox.StubOutWithMock(domain, 'XMLDesc')
domain.XMLDesc(0).AndReturn(self.dom_netdisk_xml)
domain.XMLDesc(flags=0).AndReturn(self.dom_netdisk_xml)
self.mox.StubOutWithMock(self.drvr._host, 'get_domain')
self.mox.StubOutWithMock(self.drvr._host, 'has_min_version')
@ -13502,7 +13502,7 @@ class LibvirtVolumeSnapshotTestCase(test.NoDBTestCase):
def __init__(self, *args, **kwargs):
super(FakeNetdiskDomain, self).__init__(*args, **kwargs)
def XMLDesc(self, *args):
def XMLDesc(self, flags):
return self.dom_netdisk_xml
# libvirt lib doesn't have VIR_DOMAIN_BLOCK_COMMIT_RELATIVE
@ -13514,7 +13514,7 @@ class LibvirtVolumeSnapshotTestCase(test.NoDBTestCase):
domain = FakeNetdiskDomain(fake_xml=self.dom_netdisk_xml)
self.mox.StubOutWithMock(domain, 'XMLDesc')
domain.XMLDesc(0).AndReturn(self.dom_netdisk_xml)
domain.XMLDesc(flags=0).AndReturn(self.dom_netdisk_xml)
self.mox.StubOutWithMock(self.drvr._host, 'get_domain')
self.mox.StubOutWithMock(self.drvr._host, 'has_min_version')
@ -13543,7 +13543,7 @@ class LibvirtVolumeSnapshotTestCase(test.NoDBTestCase):
def __init__(self, *args, **kwargs):
super(FakeNetdiskDomain, self).__init__(*args, **kwargs)
def XMLDesc(self, *args):
def XMLDesc(self, flags):
return self.dom_netdisk_xml
self.stubs.Set(libvirt_driver, 'libvirt', fakelibvirt)
@ -13553,7 +13553,7 @@ class LibvirtVolumeSnapshotTestCase(test.NoDBTestCase):
domain = FakeNetdiskDomain(fake_xml=self.dom_netdisk_xml)
self.mox.StubOutWithMock(domain, 'XMLDesc')
domain.XMLDesc(0).AndReturn(self.dom_netdisk_xml)
domain.XMLDesc(flags=0).AndReturn(self.dom_netdisk_xml)
self.mox.StubOutWithMock(self.drvr._host, 'get_domain')
self.mox.StubOutWithMock(self.drvr._host, 'has_min_version')

View File

@ -272,3 +272,43 @@ class GuestTestCase(test.NoDBTestCase):
domain.detachDeviceFlags.assert_called_once_with(
"</xml>", flags=(fakelibvirt.VIR_DOMAIN_AFFECT_CONFIG |
fakelibvirt.VIR_DOMAIN_AFFECT_LIVE))
def test_get_xml_desc(self):
domain = mock.Mock(spec=fakelibvirt.virDomain)
guest = libvirt_guest.Guest(domain)
guest.get_xml_desc()
domain.XMLDesc.assert_called_once_with(flags=0)
def test_get_xml_desc_dump_inactive(self):
domain = mock.Mock(spec=fakelibvirt.virDomain)
guest = libvirt_guest.Guest(domain)
guest.get_xml_desc(dump_inactive=True)
domain.XMLDesc.assert_called_once_with(
flags=fakelibvirt.VIR_DOMAIN_XML_INACTIVE)
def test_get_xml_desc_dump_sensitive(self):
domain = mock.Mock(spec=fakelibvirt.virDomain)
guest = libvirt_guest.Guest(domain)
guest.get_xml_desc(dump_sensitive=True)
domain.XMLDesc.assert_called_once_with(
flags=fakelibvirt.VIR_DOMAIN_XML_SECURE)
def test_get_xml_desc_dump_inactive_dump_sensitive(self):
domain = mock.Mock(spec=fakelibvirt.virDomain)
guest = libvirt_guest.Guest(domain)
guest.get_xml_desc(dump_inactive=True, dump_sensitive=True)
domain.XMLDesc.assert_called_once_with(
flags=(fakelibvirt.VIR_DOMAIN_XML_INACTIVE |
fakelibvirt.VIR_DOMAIN_XML_SECURE))
def test_get_xml_desc_dump_migratable(self):
domain = mock.Mock(spec=fakelibvirt.virDomain)
guest = libvirt_guest.Guest(domain)
guest.get_xml_desc(dump_migratable=True)
domain.XMLDesc.assert_called_once_with(
flags=fakelibvirt.VIR_DOMAIN_XML_MIGRATABLE)

View File

@ -898,8 +898,7 @@ class LibvirtDriver(driver.ComputeDriver):
"""
guest = self._host.get_guest(instance)
# TODO(sahid): Should be moved in Guest object.
xml = guest._domain.XMLDesc(0)
xml = guest.get_xml_desc()
tree = etree.fromstring(xml)
# The 'serial' device is the base for x86 platforms. Other platforms
@ -1100,9 +1099,7 @@ class LibvirtDriver(driver.ComputeDriver):
guest = libvirt_guest.Guest(domain)
# Save a copy of the domain's persistent XML file
xml = domain.XMLDesc(
libvirt.VIR_DOMAIN_XML_INACTIVE |
libvirt.VIR_DOMAIN_XML_SECURE)
xml = guest.get_xml_desc(dump_inactive=True, dump_sensitive=True)
# Abort is an idempotent operation, so make sure any block
# jobs which may have failed are ended.
@ -1180,7 +1177,7 @@ class LibvirtDriver(driver.ComputeDriver):
block_device_info=None):
try:
guest = self._host.get_guest(instance)
xml = guest._domain.XMLDesc(0)
xml = guest.get_xml_desc()
except exception.InstanceNotFound:
image_meta = utils.get_image_from_system_metadata(
instance.system_metadata)
@ -1524,9 +1521,7 @@ class LibvirtDriver(driver.ComputeDriver):
guest = libvirt_guest.Guest(domain)
# Save a copy of the domain's persistent XML file
xml = domain.XMLDesc(
libvirt.VIR_DOMAIN_XML_INACTIVE |
libvirt.VIR_DOMAIN_XML_SECURE)
xml = guest.get_xml_desc(dump_inactive=True, dump_sensitive=True)
# Abort is an idempotent operation, so make sure any block
# jobs which may have failed are ended.
@ -1615,7 +1610,10 @@ class LibvirtDriver(driver.ComputeDriver):
"""
xml = domain.XMLDesc(0)
# TODO(sahid): An object Guest should be passed instead of
# a "domain" as virDomain.
guest = libvirt_guest.Guest(domain)
xml = guest.get_xml_desc()
xml_doc = etree.fromstring(xml)
device_info = vconfig.LibvirtConfigGuest()
@ -1843,7 +1841,7 @@ class LibvirtDriver(driver.ComputeDriver):
my_dev = None
active_disk = None
xml = virt_dom.XMLDesc(0)
xml = guest.get_xml_desc()
xml_doc = etree.fromstring(xml)
device_info = vconfig.LibvirtConfigGuest()
@ -2467,8 +2465,7 @@ class LibvirtDriver(driver.ComputeDriver):
def get_console_output(self, context, instance):
guest = self._host.get_guest(instance)
# TODO(sahid): Should be moved in Guest object.
xml = guest._domain.XMLDesc(0)
xml = guest.get_xml_desc()
tree = etree.fromstring(xml)
console_types = {}
@ -2549,8 +2546,7 @@ class LibvirtDriver(driver.ComputeDriver):
def get_vnc_port_for_instance(instance_name):
guest = self._host.get_guest(instance)
# TODO(sahid): Should be moved in Guest object.
xml = guest._domain.XMLDesc(0)
xml = guest.get_xml_desc()
xml_dom = etree.fromstring(xml)
graphic = xml_dom.find("./devices/graphics[@type='vnc']")
@ -2569,11 +2565,7 @@ class LibvirtDriver(driver.ComputeDriver):
def get_spice_ports_for_instance(instance_name):
guest = self._host.get_guest(instance)
# TODO(sahid): We are converting all calls from a
# virDomain object to use nova.virt.libvirt.Guest.
# We should be able to remove virt_dom at the end.
virt_dom = guest._domain
xml = virt_dom.XMLDesc(0)
xml = guest.get_xml_desc()
xml_dom = etree.fromstring(xml)
graphic = xml_dom.find("./devices/graphics[@type='spice']")
@ -2979,7 +2971,7 @@ class LibvirtDriver(driver.ComputeDriver):
guest.detach_device(self._get_guest_pci_device(dev), live=True)
# after detachDeviceFlags returned, we should check the dom to
# ensure the detaching is finished
xml = guest._domain.XMLDesc(0)
xml = guest.get_xml_desc()
xml_doc = etree.fromstring(xml)
guest_config = vconfig.LibvirtConfigGuest()
guest_config.parse_dom(xml_doc)
@ -4485,11 +4477,15 @@ class LibvirtDriver(driver.ComputeDriver):
devices = []
for dom in self._host.list_instance_domains():
try:
doc = etree.fromstring(dom.XMLDesc(0))
# TODO(sahid): list_instance_domain should
# be renamed as list_guest and so returning
# Guest objects.
guest = libvirt_guest.Guest(dom)
doc = etree.fromstring(guest.get_xml_desc())
except libvirt.libvirtError as e:
LOG.warn(_LW("couldn't obtain the XML from domain:"
" %(uuid)s, exception: %(ex)s") %
{"uuid": dom.UUIDString(), "ex": e})
{"uuid": guest.id, "ex": e})
continue
except Exception:
continue
@ -5449,6 +5445,8 @@ class LibvirtDriver(driver.ComputeDriver):
This method is intended to be run in a background thread and will
block that thread until the migration is finished or failed.
"""
# TODO(sahid): Should pass a guest to this method.
guest = libvirt_guest.Guest(dom)
try:
if block_migration:
@ -5474,7 +5472,7 @@ class LibvirtDriver(driver.ComputeDriver):
None,
CONF.libvirt.live_migration_bandwidth)
else:
old_xml_str = dom.XMLDesc(migratable_flag)
old_xml_str = guest.get_xml_desc(dump_migratable=True)
new_xml_str = self._update_xml(old_xml_str,
volume,
listen_addrs)
@ -6139,13 +6137,7 @@ class LibvirtDriver(driver.ComputeDriver):
block_device_info=None):
try:
guest = self._host.get_guest(instance)
# TODO(sahid): We are converting all calls from a
# virDomain object to use nova.virt.libvirt.Guest.
# We should be able to remove dom at the end.
dom = guest._domain
xml = dom.XMLDesc(0)
xml = guest.get_xml_desc()
except libvirt.libvirtError as ex:
error_code = ex.get_error_code()
LOG.warn(_LW('Error from libvirt while getting description of '
@ -6167,8 +6159,13 @@ class LibvirtDriver(driver.ComputeDriver):
disk_over_committed_size = 0
for dom in self._host.list_instance_domains():
try:
xml = dom.XMLDesc(0)
disk_infos = self._get_instance_disk_info(dom.name(), xml)
# TODO(sahid): list_instance_domain should
# be renamed as list_guest and so returning
# Guest objects.
guest = libvirt_guest.Guest(dom)
xml = guest.get_xml_desc()
disk_infos = self._get_instance_disk_info(guest.name, xml)
for info in disk_infos:
disk_over_committed_size += int(
info['over_committed_disk_size'])
@ -6177,7 +6174,7 @@ class LibvirtDriver(driver.ComputeDriver):
LOG.warn(_LW(
'Error from libvirt while getting description of '
'%(instance_name)s: [Error Code %(error_code)s] %(ex)s'
) % {'instance_name': dom.name(),
) % {'instance_name': guest.name,
'error_code': error_code,
'ex': ex})
except OSError as e:
@ -6186,14 +6183,14 @@ class LibvirtDriver(driver.ComputeDriver):
'it is trying to get disk %(i_name)s, '
'but disk file was removed by concurrent '
'operations such as resize.'),
{'i_name': dom.name()})
{'i_name': guest.name})
elif e.errno == errno.EACCES:
LOG.warn(_LW('Periodic task is updating the host stat, '
'it is trying to get disk %(i_name)s, '
'but access is denied. It is most likely '
'due to a VM that exists on the compute '
'node but is not managed by Nova.'),
{'i_name': dom.name()})
{'i_name': guest.name})
else:
raise
except exception.VolumeBDMPathNotFound as e:
@ -6202,7 +6199,7 @@ class LibvirtDriver(driver.ComputeDriver):
'but the backing volume block device was removed '
'by concurrent operations such as resize. '
'Error: %(error)s'),
{'i_name': dom.name(),
{'i_name': guest.name,
'error': e})
# NOTE(gtt116): give other tasks a chance.
greenthread.sleep(0)
@ -6575,7 +6572,7 @@ class LibvirtDriver(driver.ComputeDriver):
except libvirt.libvirtError:
pass
# get io status
xml = domain.XMLDesc(0)
xml = guest.get_xml_desc()
dom_io = LibvirtDriver._get_io_devices(xml)
for guest_disk in dom_io["volumes"]:
try:
@ -6626,7 +6623,7 @@ class LibvirtDriver(driver.ComputeDriver):
# We should be able to remove domain at the end.
domain = guest._domain
xml = domain.XMLDesc(0)
xml = guest.get_xml_desc()
xml_doc = etree.fromstring(xml)
(state, max_mem, mem, num_cpu, cpu_time) = \

View File

@ -220,6 +220,21 @@ class Guest(object):
flags |= live and libvirt.VIR_DOMAIN_AFFECT_LIVE or 0
self._domain.detachDeviceFlags(conf.to_xml(), flags=flags)
def get_xml_desc(self, dump_inactive=False, dump_sensitive=False,
dump_migratable=False):
"""Returns xml description of guest.
:param dump_inactive: Dump inactive domain information
:param dump_sensitive: Dump security sensitive information
:param dump_migratable: Dump XML suitable for migration
:returns string: XML description of the guest
"""
flags = dump_inactive and libvirt.VIR_DOMAIN_XML_INACTIVE or 0
flags |= dump_sensitive and libvirt.VIR_DOMAIN_XML_SECURE or 0
flags |= dump_migratable and libvirt.VIR_DOMAIN_XML_MIGRATABLE or 0
return self._domain.XMLDesc(flags=flags)
class GuestVCPUInfo(object):
def __init__(self, id, cpu, state, time):