summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVishvananda Ishaya <vishvananda@gmail.com>2012-08-16 11:28:27 -0700
committerVishvananda Ishaya <vishvananda@gmail.com>2012-08-16 11:48:24 -0700
commit3a47c02c58cefed0e230190b4bcef14527c82709 (patch)
treee111f037f0fb985db6a474c10839a3aabafb0d25
parent1e7769cf5587c1ce92f206b39fe646975b19fc95 (diff)
downloadnova-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.py13
-rw-r--r--nova/tests/test_libvirt.py18
-rw-r--r--nova/virt/libvirt/volume.py3
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']