Save connection info in libvirt after volume connect

The libvirt driver will connect volumes for BFV while processing
the guest configuration, but not save the connection_info into
the database. This adds a save there to make sure that any
storage driver details get persisted.

Change-Id: Ia99e04ad80a2823a6852debf0919e72b2f93bd26
Related-bug: #1328245
(cherry picked from commit a1a2d0605b)
This commit is contained in:
Dan Smith 2014-06-12 08:56:21 -07:00
parent 4c6b0f71c2
commit a365897a32
3 changed files with 48 additions and 25 deletions

View File

@ -141,6 +141,14 @@ _fake_NodeDevXml = \
</device>"""}
def mocked_bdm(id, bdm_info):
bdm_mock = mock.MagicMock()
bdm_mock.__getitem__ = lambda s, k: bdm_info[k]
bdm_mock.get = lambda *k, **kw: bdm_info.get(*k, **kw)
bdm_mock.id = id
return bdm_mock
def _concurrency(signal, wait, done, target, is_block_dev=False):
signal.send()
wait.wait()
@ -1043,8 +1051,11 @@ class LibvirtConnTestCase(test.TestCase):
instance_ref = db.instance_create(self.context, self.test_instance)
conn_info = {'driver_volume_type': 'fake'}
info = {'block_device_mapping': [
{'connection_info': conn_info, 'mount_device': '/dev/vdc'},
{'connection_info': conn_info, 'mount_device': '/dev/vdd'}]}
mocked_bdm(1, {'connection_info': conn_info,
'mount_device': '/dev/vdc'}),
mocked_bdm(2, {'connection_info': conn_info,
'mount_device': '/dev/vdd'}),
]}
disk_info = blockinfo.get_disk_info(CONF.libvirt.virt_type,
instance_ref, info)
@ -1056,6 +1067,8 @@ class LibvirtConnTestCase(test.TestCase):
self.assertIsInstance(cfg.devices[3],
vconfig.LibvirtConfigGuestDisk)
self.assertEqual(cfg.devices[3].target_dev, 'vdd')
self.assertTrue(info['block_device_mapping'][0].save.called)
self.assertTrue(info['block_device_mapping'][1].save.called)
def test_get_guest_config_with_configdrive(self):
conn = libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), True)
@ -1096,10 +1109,13 @@ class LibvirtConnTestCase(test.TestCase):
instance_ref = db.instance_create(self.context, self.test_instance)
conn_info = {'driver_volume_type': 'fake'}
bd_info = {'block_device_mapping': [
{'connection_info': conn_info, 'mount_device': '/dev/sdc',
'disk_bus': 'scsi'},
{'connection_info': conn_info, 'mount_device': '/dev/sdd',
'disk_bus': 'scsi'}]}
mocked_bdm(1, {'connection_info': conn_info,
'mount_device': '/dev/sdc',
'disk_bus': 'scsi'}),
mocked_bdm(2, {'connection_info': conn_info,
'mount_device': '/dev/sdd',
'disk_bus': 'scsi'}),
]}
disk_info = blockinfo.get_disk_info(CONF.libvirt.virt_type,
instance_ref, bd_info, image_meta)
@ -6887,19 +6903,21 @@ class LibvirtConnTestCase(test.TestCase):
'_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}
mocked_bdm(1, {'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)
self.assertTrue(
block_device_info['block_device_mapping'][0].save.called)
def test_create_without_pause(self):
self.flags(virt_type='lxc', group='libvirt')

View File

@ -30,6 +30,7 @@ from nova import test
from nova.tests.image import fake as fake_image
from nova.tests import utils as test_utils
from nova.tests.virt.libvirt import fake_libvirt_utils
from nova.tests.virt.libvirt import test_libvirt
from nova.virt import event as virtevent
from nova.virt import fake
from nova.virt.libvirt import imagebackend
@ -449,17 +450,19 @@ class _VirtDriverTestCase(_FakeDriverBackendTestCase):
'root_device_name': None,
'swap': None,
'ephemerals': [],
'block_device_mapping': [{
'instance_uuid': instance_ref['uuid'],
'connection_info': {'driver_volume_type': 'fake'},
'mount_device': '/dev/sda',
'delete_on_termination': False,
'virtual_name': None,
'snapshot_id': None,
'volume_id': 'abcdedf',
'volume_size': None,
'no_device': None
}]
'block_device_mapping': [
test_libvirt.mocked_bdm(1, {
'instance_uuid': instance_ref['uuid'],
'connection_info': {'driver_volume_type': 'fake'},
'mount_device': '/dev/sda',
'delete_on_termination': False,
'virtual_name': None,
'snapshot_id': None,
'volume_id': 'abcdedf',
'volume_size': None,
'no_device': None
}),
]
}
self.connection.power_on(self.ctxt, instance_ref, network_info, bdm)
self.connection.detach_volume(connection_info,

View File

@ -3034,6 +3034,8 @@ class LibvirtDriver(driver.ComputeDriver):
connection_info,
info)
devices.append(cfg)
vol['connection_info'] = connection_info
vol.save(nova_context.get_admin_context())
if 'disk.config' in disk_mapping:
diskconfig = self.get_guest_disk_config(instance,