diff options
| author | Vishvananda Ishaya <vishvananda@gmail.com> | 2012-08-16 11:28:27 -0700 |
|---|---|---|
| committer | Vishvananda Ishaya <vishvananda@gmail.com> | 2012-08-16 11:48:24 -0700 |
| commit | 3a47c02c58cefed0e230190b4bcef14527c82709 (patch) | |
| tree | e111f037f0fb985db6a474c10839a3aabafb0d25 | |
| parent | 1e7769cf5587c1ce92f206b39fe646975b19fc95 (diff) | |
| download | nova-3a47c02c58cefed0e230190b4bcef14527c82709.tar.gz nova-3a47c02c58cefed0e230190b4bcef14527c82709.tar.xz nova-3a47c02c58cefed0e230190b4bcef14527c82709.zip | |
Allows libvirt to set a serial number for a volume
The serial number defaults to the volume_id of the volume being
attached. We may expose a method in the future to set a different
serial number when creating or attaching a volume.
The purpose of this change is to give users a consistent place
they can find their volume. It should show up now in most flavors
of linux under /disk/by-id/virtio-<volume_uuid>
Fixes bug 1004328
Change-Id: Id1c56b5b23d799deb7da2d39ae57ecb48965c55f
| -rw-r--r-- | nova/compute/manager.py | 13 | ||||
| -rw-r--r-- | nova/tests/test_libvirt.py | 18 | ||||
| -rw-r--r-- | nova/virt/libvirt/volume.py | 3 |
3 files changed, 33 insertions, 1 deletions
diff --git a/nova/compute/manager.py b/nova/compute/manager.py index 75e6f1f8a..c9c52d560 100644 --- a/nova/compute/manager.py +++ b/nova/compute/manager.py @@ -811,6 +811,8 @@ class ComputeManager(manager.SchedulerDependentManager): for bdm in bdms: try: cinfo = jsonutils.loads(bdm['connection_info']) + if cinfo and 'serial' not in cinfo: + cinfo['serial'] = bdm['volume_id'] bdmap = {'connection_info': cinfo, 'mount_device': bdm['device_name'], 'delete_on_termination': bdm['delete_on_termination']} @@ -2076,6 +2078,10 @@ class ComputeManager(manager.SchedulerDependentManager): LOG.exception(msg % locals(), context=context, instance=instance) self.volume_api.unreserve_volume(context, volume) + + if 'serial' not in connection_info: + connection_info['serial'] = volume_id + try: self.driver.attach_volume(connection_info, instance['name'], @@ -2117,7 +2123,12 @@ class ComputeManager(manager.SchedulerDependentManager): if instance['name'] not in self.driver.list_instances(): LOG.warn(_('Detaching volume from unknown instance'), context=context, instance=instance) - self.driver.detach_volume(jsonutils.loads(bdm['connection_info']), + connection_info = jsonutils.loads(bdm['connection_info']) + # NOTE(vish): We currently don't use the serial when disconnecting, + # but added for completeness in case we ever do. + if connection_info and 'serial' not in connection_info: + connection_info['serial'] = volume_id + self.driver.detach_volume(connection_info, instance['name'], mp) diff --git a/nova/tests/test_libvirt.py b/nova/tests/test_libvirt.py index 469b48b01..83f83f9d6 100644 --- a/nova/tests/test_libvirt.py +++ b/nova/tests/test_libvirt.py @@ -154,6 +154,24 @@ class LibvirtVolumeTestCase(test.TestCase): 'host': 'fake_host' } + def test_libvirt_volume_driver_serial(self): + vol_driver = volume_driver.VolumeDriver() + libvirt_driver = volume.LibvirtVolumeDriver(self.fake_conn) + name = 'volume-00000001' + vol = {'id': 1, 'name': name} + connection_info = { + 'driver_volume_type': 'fake', + 'data': { + 'device_path': '/foo', + }, + 'serial': 'fake_serial', + } + mount_device = "vde" + conf = libvirt_driver.connect_volume(connection_info, mount_device) + tree = conf.format_dom() + self.assertEqual(tree.get('type'), 'block') + self.assertEqual(tree.find('./serial').text, 'fake_serial') + def test_libvirt_iscsi_driver(self): # NOTE(vish) exists is to make driver assume connecting worked self.stubs.Set(os.path, 'exists', lambda x: True) diff --git a/nova/virt/libvirt/volume.py b/nova/virt/libvirt/volume.py index 3c286a901..54e6bfbf6 100644 --- a/nova/virt/libvirt/volume.py +++ b/nova/virt/libvirt/volume.py @@ -47,6 +47,7 @@ class LibvirtVolumeDriver(object): conf.source_path = connection_info['data']['device_path'] conf.target_dev = mount_device conf.target_bus = "virtio" + conf.serial = connection_info.get('serial') return conf def disconnect_volume(self, connection_info, mount_device): @@ -67,6 +68,7 @@ class LibvirtFakeVolumeDriver(LibvirtVolumeDriver): conf.source_host = "fake" conf.target_dev = mount_device conf.target_bus = "virtio" + conf.serial = connection_info.get('serial') return conf @@ -83,6 +85,7 @@ class LibvirtNetVolumeDriver(LibvirtVolumeDriver): conf.source_host = connection_info['data']['name'] conf.target_dev = mount_device conf.target_bus = "virtio" + conf.serial = connection_info.get('serial') netdisk_properties = connection_info['data'] if netdisk_properties.get('auth_enabled'): conf.auth_username = netdisk_properties['auth_username'] |
