diff --git a/ironic_python_agent/hardware.py b/ironic_python_agent/hardware.py index b62daf53f..bc0eeff94 100644 --- a/ironic_python_agent/hardware.py +++ b/ironic_python_agent/hardware.py @@ -382,9 +382,10 @@ def get_holder_disks(raid_device): holder_parts = [] for line in lines[1:]: + if 'Events' in line or 'Name' in line: + continue device = re.findall(r'/dev/\w+', line) holder_parts += device - for part in holder_parts: # NOTE(mnaser): If the last character is not a digit and it is a valid # device, this means that instead of a partition, it's a diff --git a/ironic_python_agent/tests/unit/samples/hardware_samples.py b/ironic_python_agent/tests/unit/samples/hardware_samples.py index e402af45e..056f41ef8 100644 --- a/ironic_python_agent/tests/unit/samples/hardware_samples.py +++ b/ironic_python_agent/tests/unit/samples/hardware_samples.py @@ -1027,6 +1027,33 @@ MDADM_DETAIL_OUTPUT_BROKEN_RAID0 = ("""/dev/md126: - 8 2 - /dev/sda2 """) +# NOTE(TheJulia): The name and events field, in some cases can +# match the regex causing parsing of the text to fail. +MDADM_DETAIL_POISONED = ("""/dev/md0: + Version : 1.2 + Creation Time : Wed Aug 17 16:09:19 2022 + Raid Level : raid1 + Array Size : 4673536 (4.46 GiB 4.79 GB) + Used Dev Size : 4673536 (4.46 GiB 4.79 GB) + Raid Devices : 2 + Total Devices : 2 + Persistence : Superblock is persistent + + Update Time : Wed Aug 17 16:10:03 2022 + State : clean + Active Devices : 2 +Working Devices : 2 + Failed Devices : 0 + Spare Devices : 0 + + Name : box:/dev/md0 (local to host box) + UUID : e50fb152:aa80db1d:3c901b03:dd280e35 + Events : 21/dev/md/dev/md + + Number Major Minor RaidDevice State + 0 251 1 0 active sync /dev/vda1 + 1 251 17 1 active sync /dev/vdb1 +""") MDADM_EXAMINE_OUTPUT_MEMBER = ("""/dev/sda1: Magic : a92b4efc diff --git a/ironic_python_agent/tests/unit/test_hardware.py b/ironic_python_agent/tests/unit/test_hardware.py index 744f8d5f4..4daf481ea 100644 --- a/ironic_python_agent/tests/unit/test_hardware.py +++ b/ironic_python_agent/tests/unit/test_hardware.py @@ -4101,6 +4101,12 @@ class TestGenericHardwareManager(base.IronicAgentTest): holder_disks = hardware.get_holder_disks('/dev/md126') self.assertEqual(['/dev/sda'], holder_disks) + @mock.patch.object(il_utils, 'execute', autospec=True) + def test_get_holder_disks_poisoned_output(self, mocked_execute): + mocked_execute.side_effect = [(hws.MDADM_DETAIL_POISONED, '')] + holder_disks = hardware.get_holder_disks('/dev/md0') + self.assertEqual(['/dev/vda', '/dev/vdb'], holder_disks) + @mock.patch.object(hardware, 'get_holder_disks', autospec=True) @mock.patch.object(hardware, 'get_component_devices', autospec=True) @mock.patch.object(hardware, 'list_all_block_devices', autospec=True) diff --git a/releasenotes/notes/fix-softraid-name-poisoning-4e934dd4e60830b1.yaml b/releasenotes/notes/fix-softraid-name-poisoning-4e934dd4e60830b1.yaml new file mode 100644 index 000000000..9b80e30c6 --- /dev/null +++ b/releasenotes/notes/fix-softraid-name-poisoning-4e934dd4e60830b1.yaml @@ -0,0 +1,7 @@ +--- +fixes: + - | + Fixes handling of Software RAID device discovery so RAID device ``Names`` + and ``Events`` field values do not inadvertently cause the command to + return unexpected output. Previously this could cause a deployment to + when handling UEFI partitions.