From 84edb10e060a83114dbb28c45ad65fdaf4b9ce83 Mon Sep 17 00:00:00 2001 From: kubajj Date: Wed, 15 Jan 2025 12:34:36 +0000 Subject: [PATCH] Fix RAID volume name Use just md as the default volume name if a volume name is not defined. The original change (https://review.opendev.org/c/openstack/ironic-python-agent/+/853182) introduced an error: mdadm: Value "/dev/md0" cannot be set as name. Reason: Not POSIX compatible.\n This change fixes it. Closes-Bug: #2073406 Change-Id: Ic8bd473801fcb92fc814f6ad4e1d6dc316783bf3 (cherry picked from commit 6dceb332091359ae11365e897fa579916ebbded5) (cherry picked from commit 2ece938671b60d2bee0f55120035afb8c4f2bbb4) --- ironic_python_agent/raid_utils.py | 2 +- .../tests/unit/test_hardware.py | 36 +++++++++---------- .../tests/unit/test_raid_utils.py | 4 +-- ...fix-raid-volume-name-ac9013e7b5cf3d46.yaml | 7 ++++ 4 files changed, 28 insertions(+), 21 deletions(-) create mode 100644 releasenotes/notes/fix-raid-volume-name-ac9013e7b5cf3d46.yaml diff --git a/ironic_python_agent/raid_utils.py b/ironic_python_agent/raid_utils.py index 8f3be1858..3809b1fd5 100644 --- a/ironic_python_agent/raid_utils.py +++ b/ironic_python_agent/raid_utils.py @@ -227,7 +227,7 @@ def create_raid_device(index, logical_disk): volume_name = logical_disk.get('volume_name') try: if volume_name is None: - volume_name = md_device + volume_name = 'md%d' % index LOG.debug("Creating md device %(dev)s with name %(name)s" "on %(comp)s", {'dev': md_device, 'name': volume_name, diff --git a/ironic_python_agent/tests/unit/test_hardware.py b/ironic_python_agent/tests/unit/test_hardware.py index 52d4ab79f..232432912 100644 --- a/ironic_python_agent/tests/unit/test_hardware.py +++ b/ironic_python_agent/tests/unit/test_hardware.py @@ -3093,10 +3093,10 @@ class TestGenericHardwareManager(base.IronicAgentTest): delay_on_retry=True), mock.call('udevadm', 'settle'), mock.call('mdadm', '--create', '/dev/md0', '--force', '--run', - '--metadata=1', '--level', '1', '--name', '/dev/md0', + '--metadata=1', '--level', '1', '--name', 'md0', '--raid-devices', 2, '/dev/sda1', '/dev/sdb1'), mock.call('mdadm', '--create', '/dev/md1', '--force', '--run', - '--metadata=1', '--level', '0', '--name', '/dev/md1', + '--metadata=1', '--level', '0', '--name', 'md1', '--raid-devices', 2, '/dev/sda2', '/dev/sdb2')]) self.assertEqual(raid_config, result) @@ -3198,11 +3198,11 @@ class TestGenericHardwareManager(base.IronicAgentTest): delay_on_retry=True), mock.call('udevadm', 'settle'), mock.call('mdadm', '--create', '/dev/md0', '--force', '--run', - '--metadata=1', '--level', '1', '--name', '/dev/md0', + '--metadata=1', '--level', '1', '--name', 'md0', '--raid-devices', 3, '/dev/sda1', '/dev/sdb1', '/dev/sdc1'), mock.call('mdadm', '--create', '/dev/md1', '--force', '--run', - '--metadata=1', '--level', '5', '--name', '/dev/md1', + '--metadata=1', '--level', '5', '--name', 'md1', '--raid-devices', 3, '/dev/sda2', '/dev/sdb2', '/dev/sdc2')]) self.assertEqual(raid_config, result) @@ -3316,11 +3316,11 @@ class TestGenericHardwareManager(base.IronicAgentTest): delay_on_retry=True), mock.call('udevadm', 'settle'), mock.call('mdadm', '--create', '/dev/md0', '--force', '--run', - '--metadata=1', '--level', '1', '--name', '/dev/md0', + '--metadata=1', '--level', '1', '--name', 'md0', '--raid-devices', 4, '/dev/sda1', '/dev/sdb1', '/dev/sdc1', '/dev/sdd1'), mock.call('mdadm', '--create', '/dev/md1', '--force', '--run', - '--metadata=1', '--level', '6', '--name', '/dev/md1', + '--metadata=1', '--level', '6', '--name', 'md1', '--raid-devices', 4, '/dev/sda2', '/dev/sdb2', '/dev/sdc2', '/dev/sdd2')]) self.assertEqual(raid_config, result) @@ -3399,10 +3399,10 @@ class TestGenericHardwareManager(base.IronicAgentTest): delay_on_retry=True), mock.call('udevadm', 'settle'), mock.call('mdadm', '--create', '/dev/md0', '--force', '--run', - '--metadata=1', '--level', '1', '--name', '/dev/md0', + '--metadata=1', '--level', '1', '--name', 'md0', '--raid-devices', 2, '/dev/sda1', '/dev/sdb1'), mock.call('mdadm', '--create', '/dev/md1', '--force', '--run', - '--metadata=1', '--level', '0', '--name', '/dev/md1', + '--metadata=1', '--level', '0', '--name', 'md1', '--raid-devices', 2, '/dev/sda2', '/dev/sdb2')]) self.assertEqual(raid_config, result) @@ -3486,10 +3486,10 @@ class TestGenericHardwareManager(base.IronicAgentTest): delay_on_retry=True), mock.call('udevadm', 'settle'), mock.call('mdadm', '--create', '/dev/md0', '--force', '--run', - '--metadata=1', '--level', '1', '--name', '/dev/md0', + '--metadata=1', '--level', '1', '--name', 'md0', '--raid-devices', 2, '/dev/sda1', '/dev/sdb1'), mock.call('mdadm', '--create', '/dev/md1', '--force', '--run', - '--metadata=1', '--level', '0', '--name', '/dev/md1', + '--metadata=1', '--level', '0', '--name', 'md1', '--raid-devices', 2, '/dev/sda2', '/dev/sdb2')]) self.assertEqual(raid_config, result) @@ -3568,10 +3568,10 @@ class TestGenericHardwareManager(base.IronicAgentTest): delay_on_retry=True), mock.call('udevadm', 'settle'), mock.call('mdadm', '--create', '/dev/md0', '--force', '--run', - '--metadata=1', '--level', '1', '--name', '/dev/md0', + '--metadata=1', '--level', '1', '--name', 'md0', '--raid-devices', 2, '/dev/sda1', '/dev/sdb1'), mock.call('mdadm', '--create', '/dev/md1', '--force', '--run', - '--metadata=1', '--level', '0', '--name', '/dev/md1', + '--metadata=1', '--level', '0', '--name', 'md1', '--raid-devices', 2, '/dev/sda2', '/dev/sdb2')]) self.assertEqual(raid_config, result) @@ -3652,10 +3652,10 @@ class TestGenericHardwareManager(base.IronicAgentTest): delay_on_retry=True), mock.call('udevadm', 'settle'), mock.call('mdadm', '--create', '/dev/md0', '--force', '--run', - '--metadata=1', '--level', '0', '--name', '/dev/md0', + '--metadata=1', '--level', '0', '--name', 'md0', '--raid-devices', 2, '/dev/sda1', '/dev/sdb1'), mock.call('mdadm', '--create', '/dev/md1', '--force', '--run', - '--metadata=1', '--level', '1', '--name', '/dev/md1', + '--metadata=1', '--level', '1', '--name', 'md1', '--raid-devices', 2, '/dev/sda2', '/dev/sdb2')]) self.assertEqual(raid_config, result) @@ -3745,10 +3745,10 @@ class TestGenericHardwareManager(base.IronicAgentTest): delay_on_retry=True), mock.call('udevadm', 'settle'), mock.call('mdadm', '--create', '/dev/md0', '--force', '--run', - '--metadata=1', '--level', '1', '--name', '/dev/md0', + '--metadata=1', '--level', '1', '--name', 'md0', '--raid-devices', 2, '/dev/sda1', '/dev/sdb1'), mock.call('mdadm', '--create', '/dev/md1', '--force', '--run', - '--metadata=1', '--level', '0', '--name', '/dev/md1', + '--metadata=1', '--level', '0', '--name', 'md1', '--raid-devices', 2, '/dev/sda2', '/dev/sdb2')]) self.assertEqual(raid_config, result) @@ -4093,11 +4093,11 @@ class TestGenericHardwareManager(base.IronicAgentTest): delay_on_retry=True), mock.call('udevadm', 'settle'), mock.call('mdadm', '--create', '/dev/md0', '--force', '--run', - '--metadata=1', '--level', '1', '--name', '/dev/md0', + '--metadata=1', '--level', '1', '--name', 'md0', '--raid-devices', 2, '/dev/nvme0n1p1', '/dev/nvme1n1p1'), mock.call('mdadm', '--create', '/dev/md1', '--force', '--run', - '--metadata=1', '--level', '0', '--name', '/dev/md1', + '--metadata=1', '--level', '0', '--name', 'md1', '--raid-devices', 2, '/dev/nvme0n1p2', '/dev/nvme1n1p2') ]) self.assertEqual(raid_config, result) diff --git a/ironic_python_agent/tests/unit/test_raid_utils.py b/ironic_python_agent/tests/unit/test_raid_utils.py index f68796056..73f0ded78 100644 --- a/ironic_python_agent/tests/unit/test_raid_utils.py +++ b/ironic_python_agent/tests/unit/test_raid_utils.py @@ -57,7 +57,7 @@ class TestRaidUtils(base.IronicAgentTest): mock_execute.assert_called_once_with( 'mdadm', '--create', '/dev/md0', '--force', '--run', - '--metadata=1', '--level', '1', '--name', '/dev/md0', + '--metadata=1', '--level', '1', '--name', 'md0', '--raid-devices', 3, '/dev/sda1', '/dev/sdb1', '/dev/sdc1') @mock.patch.object(raid_utils, '_get_actual_component_devices', @@ -97,7 +97,7 @@ class TestRaidUtils(base.IronicAgentTest): expected_calls = [ mock.call('mdadm', '--create', '/dev/md0', '--force', '--run', - '--metadata=1', '--level', '1', '--name', '/dev/md0', + '--metadata=1', '--level', '1', '--name', 'md0', '--raid-devices', 3, '/dev/sda1', '/dev/sdb1', '/dev/sdc1'), mock.call('mdadm', '--add', '/dev/md0', '/dev/sdb1', diff --git a/releasenotes/notes/fix-raid-volume-name-ac9013e7b5cf3d46.yaml b/releasenotes/notes/fix-raid-volume-name-ac9013e7b5cf3d46.yaml new file mode 100644 index 000000000..b3ba90768 --- /dev/null +++ b/releasenotes/notes/fix-raid-volume-name-ac9013e7b5cf3d46.yaml @@ -0,0 +1,7 @@ +--- +fixes: + - | + The use of md_device as the default volume name if the volume name of a RAID + array hasn't been specified caused a 'Not POSIX compatible' error. + This has been fixed by using just the last part of the md_device. + Fixes https://bugs.launchpad.net/ironic-python-agent/+bug/2073406