summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJay Lee <jaesang50.lee@samsung.com>2014-01-23 01:51:42 +0000
committerYaguang Tang <yaguang.tang@canonical.com>2014-02-04 22:28:18 +0800
commitb508376f4309ea15cd1299480a1193055abbbf99 (patch)
tree920812295ab02beb29ac6ee939f883ba779cc053
parent2c44ed7587703fdc5d2be00a092d7b671982d609 (diff)
downloadnova-b508376f4309ea15cd1299480a1193055abbbf99.tar.gz
Use block_device_info at post_live_migration_at_destination
post_live_migration_at_destination make libvirt.xml to destination host. when execute (live) block migration for vm made by bootable volume, method post_live_migration_at_destination write a libvirt.xml in destination host. but it missed block disk information so moved libvirt.xml always has a wrong disk information. I add block_device_info in blockinfo.get_disk_info at post_live_migration_at_destination. This change will make libvirt.xml with valid block disk information. Closes-Bug: 1271780 (cherry picked from commit 0486647e1c85947bc48cbdd279b3f49824a6e692) Conflicts: nova/tests/virt/libvirt/test_libvirt.py nova/virt/libvirt/driver.py Change-Id: I31b3f2ef5f03f9ef61524bdb7ae089b18e4cd254
-rw-r--r--nova/tests/virt/libvirt/test_libvirt.py110
-rw-r--r--nova/virt/libvirt/driver.py7
2 files changed, 114 insertions, 3 deletions
diff --git a/nova/tests/virt/libvirt/test_libvirt.py b/nova/tests/virt/libvirt/test_libvirt.py
index dd7bda9046..e9496530c6 100644
--- a/nova/tests/virt/libvirt/test_libvirt.py
+++ b/nova/tests/virt/libvirt/test_libvirt.py
@@ -339,6 +339,16 @@ class FakeVolumeDriver(object):
def get_xml(self, *args):
return ""
+ def connect_volume(self, *args):
+ """Connect the volume to a fake device."""
+ conf = vconfig.LibvirtConfigGuestDisk()
+ conf.source_type = "network"
+ conf.source_protocol = "fake"
+ conf.source_name = "fake"
+ conf.target_dev = "fake"
+ conf.target_bus = "fake"
+ return conf
+
class FakeConfigGuestDisk(object):
def __init__(self, *args, **kwargs):
@@ -5549,6 +5559,106 @@ class LibvirtConnTestCase(test.TestCase):
self.assertEqual('foo', conn.get_hypervisor_hostname())
self.assertEqual('foo', conn.get_hypervisor_hostname())
+ def test_post_live_migration_at_destination_with_block_device_info(self):
+ # Preparing mocks
+ dummyxml = ("<domain type='kvm'><name>instance-00000001</name>"
+ "<devices>"
+ "<graphics type='vnc' port='5900'/>"
+ "</devices></domain>")
+ mock_domain = self.mox.CreateMock(libvirt.virDomain)
+ self.mox.StubOutWithMock(mock_domain, "XMLDesc")
+ mock_domain.XMLDesc(0).AndReturn(dummyxml)
+ self.resultXML = None
+
+ def fake_none(*args, **kwargs):
+ return
+
+ def fake_getLibVersion():
+ return 9007
+
+ def fake_getCapabilities():
+ return """
+ <capabilities>
+ <host>
+ <uuid>cef19ce0-0ca2-11df-855d-b19fbce37686</uuid>
+ <cpu>
+ <arch>x86_64</arch>
+ <model>Penryn</model>
+ <vendor>Intel</vendor>
+ <topology sockets='1' cores='2' threads='1'/>
+ <feature name='xtpr'/>
+ </cpu>
+ </host>
+ </capabilities>
+ """
+
+ def fake_to_xml(context, instance, network_info, disk_info,
+ image_meta=None, rescue=None,
+ block_device_info=None, write_to_disk=False):
+ conf = conn.get_guest_config(instance, network_info, image_meta,
+ disk_info, rescue, block_device_info)
+ self.resultXML = conf.to_xml()
+ return self.resultXML
+
+ def fake_lookup_name(instance_name):
+ return mock_domain
+
+ def fake_defineXML(xml):
+ return
+
+ def fake_baselineCPU(cpu, flag):
+ return """<cpu mode='custom' match='exact'>
+ <model fallback='allow'>Westmere</model>
+ <vendor>Intel</vendor>
+ <feature policy='require' name='aes'/>
+ </cpu>
+ """
+
+ network_info = _fake_network_info(self.stubs, 1)
+ self.create_fake_libvirt_mock(getLibVersion=fake_getLibVersion,
+ getCapabilities=fake_getCapabilities,
+ getVersion=lambda: 1005001)
+ instance_ref = self.test_instance
+ instance_ref['image_ref'] = 123456 # we send an int to test sha1 call
+ instance_type = db.flavor_get(self.context,
+ instance_ref['instance_type_id'])
+ sys_meta = flavors.save_flavor_info({}, instance_type)
+ instance_ref['system_metadata'] = sys_meta
+ instance = db.instance_create(self.context, instance_ref)
+
+ self.mox.StubOutWithMock(libvirt_driver.LibvirtDriver, '_conn')
+ libvirt_driver.LibvirtDriver._conn.listDefinedDomains = lambda: []
+ libvirt_driver.LibvirtDriver._conn.getCapabilities = \
+ fake_getCapabilities
+ libvirt_driver.LibvirtDriver._conn.getVersion = lambda: 1005001
+ libvirt_driver.LibvirtDriver._conn.lookupByName = fake_lookup_name
+ libvirt_driver.LibvirtDriver._conn.defineXML = fake_defineXML
+ libvirt_driver.LibvirtDriver._conn.baselineCPU = fake_baselineCPU
+
+ self.mox.ReplayAll()
+
+ conn = libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), False)
+ self.stubs.Set(conn,
+ 'to_xml',
+ fake_to_xml)
+ self.stubs.Set(conn,
+ '_lookup_by_name',
+ fake_lookup_name)
+ block_device_info = {'block_device_mapping': [
+ {'guest_format': None,
+ 'boot_index': 0,
+ 'mount_device': '/dev/vda',
+ 'connection_info':
+ {'driver_volume_type': 'iscsi'},
+ 'disk_bus': 'virtio',
+ 'device_type': 'disk',
+ 'delete_on_termination': False}
+ ]}
+ conn.post_live_migration_at_destination(self.context, instance,
+ network_info, True,
+ block_device_info=block_device_info)
+ self.assertTrue('fake' in self.resultXML)
+
class HostStateTestCase(test.TestCase):
diff --git a/nova/virt/libvirt/driver.py b/nova/virt/libvirt/driver.py
index 4a61bd26b0..08d5d34836 100644
--- a/nova/virt/libvirt/driver.py
+++ b/nova/virt/libvirt/driver.py
@@ -4288,10 +4288,11 @@ class LibvirtDriver(driver.ComputeDriver):
if instance["name"] not in dom_list:
# In case of block migration, destination does not have
# libvirt.xml
- disk_info = blockinfo.get_disk_info(CONF.libvirt_type,
- instance)
+ disk_info = blockinfo.get_disk_info(
+ CONF.libvirt_type, instance, block_device_info)
self.to_xml(context, instance, network_info, disk_info,
- block_device_info, write_to_disk=True)
+ block_device_info=block_device_info,
+ write_to_disk=True)
# libvirt.xml should be made by to_xml(), but libvirt
# does not accept to_xml() result, since uuid is not
# included in to_xml() result.