Include partiton name and flags from parted output
Currently list_partitions method fails if partition name is defined on any GPT partition, it also only extract one partition flag. Updated _PARTED_PRINT_RE is now set to capture partition name/description and partition flags. Change-Id: I40410622829453a485aa33047848922ab134d725 Task: 30250 Story: 2005322
This commit is contained in:
parent
2020575580
commit
9a95e14512
@ -67,7 +67,7 @@ CONF.register_opts(opts, group='disk_utils')
|
|||||||
LOG = logging.getLogger(__name__)
|
LOG = logging.getLogger(__name__)
|
||||||
|
|
||||||
_PARTED_PRINT_RE = re.compile(r"^(\d+):([\d\.]+)MiB:"
|
_PARTED_PRINT_RE = re.compile(r"^(\d+):([\d\.]+)MiB:"
|
||||||
"([\d\.]+)MiB:([\d\.]+)MiB:(\w*)::(\w*)")
|
"([\d\.]+)MiB:([\d\.]+)MiB:(\w*):(.*):(.*);")
|
||||||
|
|
||||||
CONFIGDRIVE_LABEL = "config-2"
|
CONFIGDRIVE_LABEL = "config-2"
|
||||||
MAX_CONFIG_DRIVE_SIZE_MB = 64
|
MAX_CONFIG_DRIVE_SIZE_MB = 64
|
||||||
@ -84,7 +84,8 @@ def list_partitions(device):
|
|||||||
|
|
||||||
:param device: The device path.
|
:param device: The device path.
|
||||||
:returns: list of dictionaries (one per partition) with keys:
|
:returns: list of dictionaries (one per partition) with keys:
|
||||||
number, start, end, size (in MiB), filesystem, flags
|
number, start, end, size (in MiB), filesystem, partition_name,
|
||||||
|
flags
|
||||||
"""
|
"""
|
||||||
output = utils.execute(
|
output = utils.execute(
|
||||||
'parted', '-s', '-m', device, 'unit', 'MiB', 'print',
|
'parted', '-s', '-m', device, 'unit', 'MiB', 'print',
|
||||||
@ -93,7 +94,8 @@ def list_partitions(device):
|
|||||||
output = output.decode("utf-8")
|
output = output.decode("utf-8")
|
||||||
lines = [line for line in output.split('\n') if line.strip()][2:]
|
lines = [line for line in output.split('\n') if line.strip()][2:]
|
||||||
# Example of line: 1:1.00MiB:501MiB:500MiB:ext4::boot
|
# Example of line: 1:1.00MiB:501MiB:500MiB:ext4::boot
|
||||||
fields = ('number', 'start', 'end', 'size', 'filesystem', 'flags')
|
fields = ('number', 'start', 'end', 'size', 'filesystem', 'partition_name',
|
||||||
|
'flags')
|
||||||
result = []
|
result = []
|
||||||
for line in lines:
|
for line in lines:
|
||||||
match = _PARTED_PRINT_RE.match(line)
|
match = _PARTED_PRINT_RE.match(line)
|
||||||
|
@ -47,9 +47,9 @@ BYT;
|
|||||||
"""
|
"""
|
||||||
expected = [
|
expected = [
|
||||||
{'number': 1, 'start': 1, 'end': 501, 'size': 500,
|
{'number': 1, 'start': 1, 'end': 501, 'size': 500,
|
||||||
'filesystem': 'ext4', 'flags': 'boot'},
|
'filesystem': 'ext4', 'partition_name': '', 'flags': 'boot'},
|
||||||
{'number': 2, 'start': 501, 'end': 476940, 'size': 476439,
|
{'number': 2, 'start': 501, 'end': 476940, 'size': 476439,
|
||||||
'filesystem': '', 'flags': ''},
|
'filesystem': '', 'partition_name': '', 'flags': ''},
|
||||||
]
|
]
|
||||||
execute_mock.return_value = (output, '')
|
execute_mock.return_value = (output, '')
|
||||||
result = disk_utils.list_partitions('/dev/fake')
|
result = disk_utils.list_partitions('/dev/fake')
|
||||||
@ -70,6 +70,46 @@ BYT;
|
|||||||
self.assertEqual(1, log_mock.call_count)
|
self.assertEqual(1, log_mock.call_count)
|
||||||
|
|
||||||
|
|
||||||
|
@mock.patch.object(utils, 'execute', autospec=True)
|
||||||
|
class ListPartitionsGPTTestCase(base.IronicLibTestCase):
|
||||||
|
|
||||||
|
def test_correct(self, execute_mock):
|
||||||
|
output = """
|
||||||
|
BYT;
|
||||||
|
/dev/vda:40960MiB:virtblk:512:512:gpt:Virtio Block Device:;
|
||||||
|
2:1.00MiB:2.00MiB:1.00MiB::Bios partition:bios_grub;
|
||||||
|
1:4.00MiB:5407MiB:5403MiB:ext4:Root partition:;
|
||||||
|
3:5407MiB:5507MiB:100MiB:fat16:Boot partition:boot, esp;
|
||||||
|
"""
|
||||||
|
expected = [
|
||||||
|
{'end': 2, 'number': 2, 'start': 1, 'flags': 'bios_grub',
|
||||||
|
'filesystem': '', 'partition_name': 'Bios partition', 'size': 1},
|
||||||
|
{'end': 5407, 'number': 1, 'start': 4, 'flags': '',
|
||||||
|
'filesystem': 'ext4', 'partition_name': 'Root partition',
|
||||||
|
'size': 5403},
|
||||||
|
{'end': 5507, 'number': 3, 'start': 5407,
|
||||||
|
'flags': 'boot, esp', 'filesystem': 'fat16',
|
||||||
|
'partition_name': 'Boot partition', 'size': 100},
|
||||||
|
]
|
||||||
|
execute_mock.return_value = (output, '')
|
||||||
|
result = disk_utils.list_partitions('/dev/fake')
|
||||||
|
self.assertEqual(expected, result)
|
||||||
|
execute_mock.assert_called_once_with(
|
||||||
|
'parted', '-s', '-m', '/dev/fake', 'unit', 'MiB', 'print',
|
||||||
|
use_standard_locale=True, run_as_root=True)
|
||||||
|
|
||||||
|
@mock.patch.object(disk_utils.LOG, 'warning', autospec=True)
|
||||||
|
def test_incorrect(self, log_mock, execute_mock):
|
||||||
|
output = """
|
||||||
|
BYT;
|
||||||
|
/dev/vda:40960MiB:virtblk:512:512:gpt:Virtio Block Device:;
|
||||||
|
2:XX1.00MiB:---:1.00MiB::primary:bios_grub;
|
||||||
|
"""
|
||||||
|
execute_mock.return_value = (output, '')
|
||||||
|
self.assertEqual([], disk_utils.list_partitions('/dev/fake'))
|
||||||
|
self.assertEqual(1, log_mock.call_count)
|
||||||
|
|
||||||
|
|
||||||
@mock.patch.object(disk_partitioner.DiskPartitioner, 'commit', lambda _: None)
|
@mock.patch.object(disk_partitioner.DiskPartitioner, 'commit', lambda _: None)
|
||||||
class WorkOnDiskTestCase(base.IronicLibTestCase):
|
class WorkOnDiskTestCase(base.IronicLibTestCase):
|
||||||
|
|
||||||
|
@ -0,0 +1,6 @@
|
|||||||
|
---
|
||||||
|
fixes:
|
||||||
|
- |
|
||||||
|
Fixes an issues when parsing GPT partitions with names or multiple flags.
|
||||||
|
See `story 2005322 <https://storyboard.openstack.org/#!/story/2005322>`_
|
||||||
|
for details.
|
Loading…
x
Reference in New Issue
Block a user