Fixes error on live-migration of volume-backed vm

Live-migrating a volume-backed vm (i.e. booted from volume)
is currently broken.

This patch fixes the case where a volume-backed vm is to be
live-migrated without shared storage on compute nodes or
ephemeral volumes attached to the instance. Specifically, it
stops create_images_and_backing() from blowing up when no disk
info is supplied.

Change-Id: Icec7a6e7225ebe029e24d3be303c9ab01818f30e
Fixes: bug 1235182
(cherry picked from commit 0cbb231cd1)
This commit is contained in:
Edward Hope-Morley 2013-10-04 20:13:44 +01:00 committed by Russell Bryant
parent 49d60d1f13
commit 27e6f05a42
2 changed files with 32 additions and 1 deletions

View File

@ -2997,6 +2997,34 @@ class LibvirtConnTestCase(test.TestCase):
db.instance_destroy(self.context, instance_ref['uuid'])
def test_create_images_and_backing(self):
conn = libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), False)
self.mox.StubOutWithMock(conn, '_fetch_instance_kernel_ramdisk')
self.mox.StubOutWithMock(libvirt_driver.libvirt_utils, 'create_image')
libvirt_driver.libvirt_utils.create_image(mox.IgnoreArg(),
mox.IgnoreArg(),
mox.IgnoreArg())
conn._fetch_instance_kernel_ramdisk(self.context, self.test_instance)
self.mox.ReplayAll()
self.stubs.Set(os.path, 'exists', lambda *args: False)
disk_info_json = jsonutils.dumps([{'path': 'foo', 'type': None,
'disk_size': 0,
'backing_file': None}])
conn._create_images_and_backing(self.context, self.test_instance,
"/fake/instance/dir", disk_info_json)
def test_create_images_and_backing_disk_info_none(self):
conn = libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), False)
self.mox.StubOutWithMock(conn, '_fetch_instance_kernel_ramdisk')
conn._fetch_instance_kernel_ramdisk(self.context, self.test_instance)
self.mox.ReplayAll()
conn._create_images_and_backing(self.context, self.test_instance,
"/fake/instance/dir", None)
def test_pre_live_migration_works_correctly_mocked(self):
# Creating testdata
vol = {'block_device_mapping': [

View File

@ -4169,7 +4169,10 @@ class LibvirtDriver(driver.ComputeDriver):
json strings specified in get_instance_disk_info
"""
disk_info = jsonutils.loads(disk_info_json)
if not disk_info_json:
disk_info = []
else:
disk_info = jsonutils.loads(disk_info_json)
for info in disk_info:
base = os.path.basename(info['path'])