Run instance root device determination fix.
Legacy bdm in incoming parameters contains a number of devices specified by their names (e.g. "vdb" or "/dev/vdc"). Current code considers "vda" as root device and doesn't work on "/dev/vda", for example. This fix extracts the last significant character (digits are skipped in "..sda1") from the name like "a", "b", "c" and selects the root device by checking for "a". Change-Id: Iebaa117bb747d30ac9ceabd8805740dec9d1355c Closes-Bug: #1322180
This commit is contained in:
@@ -453,6 +453,16 @@ def strip_prefix(device_name):
|
||||
return _pref.sub('', device_name)
|
||||
|
||||
|
||||
_nums = re.compile('\d+')
|
||||
|
||||
|
||||
def get_device_letter(device_name):
|
||||
letter = strip_prefix(device_name)
|
||||
# NOTE(vish): delete numbers in case we have something like
|
||||
# /dev/sda1
|
||||
return _nums.sub('', letter)
|
||||
|
||||
|
||||
def instance_block_mapping(instance, bdms):
|
||||
root_device_name = instance['root_device_name']
|
||||
# NOTE(clayg): remove this when xenapi is setting default_root_device
|
||||
|
@@ -861,7 +861,9 @@ class API(base.Base):
|
||||
return {}
|
||||
|
||||
for bdm in block_device_mapping:
|
||||
if legacy_bdm and bdm.get('device_name') != 'vda':
|
||||
if (legacy_bdm and
|
||||
block_device.get_device_letter(
|
||||
bdm.get('device_name', '')) != 'a'):
|
||||
continue
|
||||
elif not legacy_bdm and bdm.get('boot_index') != 0:
|
||||
continue
|
||||
|
@@ -15,7 +15,6 @@
|
||||
"""Compute-related Utilities and helpers."""
|
||||
|
||||
import itertools
|
||||
import re
|
||||
import string
|
||||
import traceback
|
||||
|
||||
@@ -164,10 +163,7 @@ def get_next_device_name(instance, device_name_list,
|
||||
|
||||
used_letters = set()
|
||||
for device_path in device_name_list:
|
||||
letter = block_device.strip_prefix(device_path)
|
||||
# NOTE(vish): delete numbers in case we have something like
|
||||
# /dev/sda1
|
||||
letter = re.sub("\d+", "", letter)
|
||||
letter = block_device.get_device_letter(device_path)
|
||||
used_letters.add(letter)
|
||||
|
||||
# NOTE(vish): remove this when xenapi is properly setting
|
||||
|
@@ -94,6 +94,15 @@ class BlockDeviceTestCase(test.NoDBTestCase):
|
||||
self.assertEqual(block_device.strip_prefix('xvda'), 'a')
|
||||
self.assertEqual(block_device.strip_prefix('vda'), 'a')
|
||||
|
||||
def test_get_device_letter(self):
|
||||
self.assertEqual(block_device.get_device_letter(''), '')
|
||||
self.assertEqual(block_device.get_device_letter('/dev/sda1'), 'a')
|
||||
self.assertEqual(block_device.get_device_letter('/dev/xvdb'), 'b')
|
||||
self.assertEqual(block_device.get_device_letter('/dev/d'), 'd')
|
||||
self.assertEqual(block_device.get_device_letter('a'), 'a')
|
||||
self.assertEqual(block_device.get_device_letter('sdb2'), 'b')
|
||||
self.assertEqual(block_device.get_device_letter('vdc'), 'c')
|
||||
|
||||
def test_volume_in_mapping(self):
|
||||
swap = {'device_name': '/dev/sdb',
|
||||
'swap_size': 1}
|
||||
|
Reference in New Issue
Block a user