diff options
| author | Clay Gerrard <clay.gerrard@gmail.com> | 2012-10-04 18:50:39 -0500 |
|---|---|---|
| committer | Clay Gerrard <clay.gerrard@gmail.com> | 2012-10-04 18:59:43 -0500 |
| commit | 07845ad68f83952bbae36b4b115ff6c433e81fa3 (patch) | |
| tree | 5d5e82b6731287b81aaadff2781193d50e142b42 /nova | |
| parent | b1896ede6999b37757f73d1a31d53789c341ef7f (diff) | |
| download | nova-07845ad68f83952bbae36b4b115ff6c433e81fa3.tar.gz nova-07845ad68f83952bbae36b4b115ff6c433e81fa3.tar.xz nova-07845ad68f83952bbae36b4b115ff6c433e81fa3.zip | |
Always use bdm in instance_block_mapping on Xen
It doesn't seem that Xen will set the 'root_device_name' property on
instances. This is causing instance_block_mapping to return early
without evaluating the bdm before returning the list of device_names
in use. I'm not sure why instance_block_mapping does this
(optimization?) but on Xen at least it seems that it should not.
Added a check for Xen compute_driver flag in instance_block_mapping to
"guess" the root_device_name (similarlly to what is done in
compute.utils for swap and ephemeral).
fixes bug #1061944
Change-Id: If5b1a2b7377232c78f0629a3624552ecf6ceb0ee
Diffstat (limited to 'nova')
| -rw-r--r-- | nova/block_device.py | 9 | ||||
| -rw-r--r-- | nova/tests/compute/test_compute_utils.py | 40 |
2 files changed, 36 insertions, 13 deletions
diff --git a/nova/block_device.py b/nova/block_device.py index bce71e183..031fcae16 100644 --- a/nova/block_device.py +++ b/nova/block_device.py @@ -17,6 +17,9 @@ import re +from nova import flags + +FLAGS = flags.FLAGS DEFAULT_ROOT_DEV_NAME = '/dev/sda1' _DEFAULT_MAPPINGS = {'ami': 'sda1', @@ -89,8 +92,12 @@ def strip_prefix(device_name): def instance_block_mapping(instance, bdms): root_device_name = instance['root_device_name'] + # NOTE(clayg): remove this when xenapi is setting default_root_device if root_device_name is None: - return _DEFAULT_MAPPINGS + if FLAGS.compute_driver.endswith('xenapi.XenAPIDriver'): + root_device_name = '/dev/xvda' + else: + return _DEFAULT_MAPPINGS mappings = {} mappings['ami'] = strip_dev(root_device_name) diff --git a/nova/tests/compute/test_compute_utils.py b/nova/tests/compute/test_compute_utils.py index 1573d4919..056450708 100644 --- a/nova/tests/compute/test_compute_utils.py +++ b/nova/tests/compute/test_compute_utils.py @@ -44,12 +44,21 @@ class ComputeValidateDeviceTestCase(test.TestCase): def setUp(self): super(ComputeValidateDeviceTestCase, self).setUp() self.context = context.RequestContext('fake', 'fake') - self.instance = { - 'uuid': 'fake', - 'root_device_name': '/dev/vda', - 'default_ephemeral_device': '/dev/vdb', - 'instance_type_id': 'fake', - } + # check if test name includes "xen" + if 'xen' in self.id(): + self.flags(compute_driver='xenapi.XenAPIDriver') + self.instance = { + 'uuid': 'fake', + 'root_device_name': None, + 'instance_type_id': 'fake', + } + else: + self.instance = { + 'uuid': 'fake', + 'root_device_name': '/dev/vda', + 'default_ephemeral_device': '/dev/vdb', + 'instance_type_id': 'fake', + } self.data = [] def fake_get(instance_type_id, ctxt=None): @@ -150,8 +159,6 @@ class ComputeValidateDeviceTestCase(test.TestCase): self.assertEqual(device, '/dev/vdc') def test_ephemeral_xenapi(self): - self.flags(compute_driver='xenapi.XenAPIDriver') - del self.instance['default_ephemeral_device'] self.instance_type = { 'ephemeral_gb': 10, 'swap': 0, @@ -162,8 +169,6 @@ class ComputeValidateDeviceTestCase(test.TestCase): self.assertEqual(device, '/dev/xvdc') def test_swap_xenapi(self): - self.flags(compute_driver='xenapi.XenAPIDriver') - del self.instance['default_ephemeral_device'] self.instance_type = { 'ephemeral_gb': 0, 'swap': 10, @@ -174,8 +179,6 @@ class ComputeValidateDeviceTestCase(test.TestCase): self.assertEqual(device, '/dev/xvdb') def test_swap_and_ephemeral_xenapi(self): - self.flags(compute_driver='xenapi.XenAPIDriver') - del self.instance['default_ephemeral_device'] self.instance_type = { 'ephemeral_gb': 10, 'swap': 10, @@ -185,6 +188,19 @@ class ComputeValidateDeviceTestCase(test.TestCase): device = self._validate_device() self.assertEqual(device, '/dev/xvdd') + def test_swap_and_one_attachment_xenapi(self): + self.instance_type = { + 'ephemeral_gb': 0, + 'swap': 10, + } + self.stubs.Set(instance_types, 'get_instance_type', + lambda instance_type_id, ctxt=None: self.instance_type) + device = self._validate_device() + self.assertEqual(device, '/dev/xvdb') + self.data.append(self._fake_bdm(device)) + device = self._validate_device() + self.assertEqual(device, '/dev/xvdd') + class UsageInfoTestCase(test.TestCase): |
