summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry Tantsur <dtantsur@protonmail.com>2022-06-14 19:06:53 +0200
committerDmitry Tantsur <dtantsur@protonmail.com>2022-06-22 14:01:19 +0000
commit0849a1bd7989d5dd034df6df98f2365b7e2b857f (patch)
tree97ac8bf3418591308cb150d5c36ea172be475a62
parentfee66d22aa5aca4437e50d9f9d24d71f70b6bdb4 (diff)
downloadironic-python-agent-0849a1bd7989d5dd034df6df98f2365b7e2b857f.tar.gz
Fix discovering WWN/serial for devicemapper devices
UDev prefix is DM_ not ID_ for them. On top of that, they don't have short serials (or at least don't always have). Change-Id: I5b6075fbff72201a2fd620f789978acceafc417b (cherry picked from commit 69e22545033f544d628f9c4ecd5a665ba0b5b85e)
-rw-r--r--ironic_python_agent/hardware.py22
-rw-r--r--ironic_python_agent/tests/unit/test_hardware.py21
-rw-r--r--releasenotes/notes/multipath-serial-615fc925984abbf7.yaml4
3 files changed, 31 insertions, 16 deletions
diff --git a/ironic_python_agent/hardware.py b/ironic_python_agent/hardware.py
index 35faba14..70843f8e 100644
--- a/ironic_python_agent/hardware.py
+++ b/ironic_python_agent/hardware.py
@@ -635,26 +635,34 @@ def list_all_block_devices(block_type='disk',
name = os.path.join('/dev', device['KNAME'])
+ extra = {}
try:
udev = pyudev.Devices.from_device_file(context, name)
except pyudev.DeviceNotFoundByFileError as e:
LOG.warning("Device %(dev)s is inaccessible, skipping... "
"Error: %(error)s", {'dev': name, 'error': e})
- extra = {}
except pyudev.DeviceNotFoundByNumberError as e:
LOG.warning("Device %(dev)s is not supported by pyudev, "
"skipping... Error: %(error)s",
{'dev': name, 'error': e})
- extra = {}
else:
# TODO(lucasagomes): Since lsblk only supports
# returning the short serial we are using
- # ID_SERIAL_SHORT here to keep compatibility with the
+ # ID_SERIAL_SHORT first to keep compatibility with the
# bash deploy ramdisk
- extra = {key: udev.get('ID_%s' % udev_key) for key, udev_key in
- [('wwn', 'WWN'), ('serial', 'SERIAL_SHORT'),
- ('wwn_with_extension', 'WWN_WITH_EXTENSION'),
- ('wwn_vendor_extension', 'WWN_VENDOR_EXTENSION')]}
+ for key, udev_key in [
+ ('serial', 'SERIAL_SHORT'),
+ ('serial', 'SERIAL'),
+ ('wwn', 'WWN'),
+ ('wwn_with_extension', 'WWN_WITH_EXTENSION'),
+ ('wwn_vendor_extension', 'WWN_VENDOR_EXTENSION')
+ ]:
+ if key in extra:
+ continue
+ value = (udev.get(f'ID_{udev_key}')
+ or udev.get(f'DM_{udev_key}')) # devicemapper
+ if value:
+ extra[key] = value
# NOTE(lucasagomes): Newer versions of the lsblk tool supports
# HCTL as a parameter but let's get it from sysfs to avoid breaking
diff --git a/ironic_python_agent/tests/unit/test_hardware.py b/ironic_python_agent/tests/unit/test_hardware.py
index 17d67822..dfe4f872 100644
--- a/ironic_python_agent/tests/unit/test_hardware.py
+++ b/ironic_python_agent/tests/unit/test_hardware.py
@@ -1585,13 +1585,16 @@ class TestGenericHardwareManager(base.IronicAgentTest):
('', ''),
]
- mocked_mpath.return_value = False
- mocked_udev.side_effect = iter([
+ mocked_mpath.return_value = True
+ mocked_udev.side_effect = [
{'ID_WWN': 'wwn%d' % i, 'ID_SERIAL_SHORT': 'serial%d' % i,
+ 'ID_SERIAL': 'do not use me',
'ID_WWN_WITH_EXTENSION': 'wwn-ext%d' % i,
'ID_WWN_VENDOR_EXTENSION': 'wwn-vendor-ext%d' % i}
- for i in range(5)
- ])
+ for i in range(3)
+ ] + [
+ {'DM_WWN': 'wwn3', 'DM_SERIAL': 'serial3'},
+ ]
mocked_dev_vendor.return_value = 'Super Vendor'
devices = hardware.list_all_block_devices()
expected_devices = [
@@ -1625,19 +1628,19 @@ class TestGenericHardwareManager(base.IronicAgentTest):
wwn_vendor_extension='wwn-vendor-ext2',
serial='serial2',
hctl='1:0:0:0'),
- hardware.BlockDevice(name='/dev/sdd',
+ hardware.BlockDevice(name='/dev/dm-0',
model='NWD-BLP4-1600',
size=1765517033472,
rotational=False,
vendor='Super Vendor',
wwn='wwn3',
- wwn_with_extension='wwn-ext3',
- wwn_vendor_extension='wwn-vendor-ext3',
+ wwn_with_extension=None,
+ wwn_vendor_extension=None,
serial='serial3',
hctl='1:0:0:0')
]
- self.assertEqual(4, len(expected_devices))
+ self.assertEqual(4, len(devices))
for expected, device in zip(expected_devices, devices):
# Compare all attrs of the objects
for attr in ['name', 'model', 'size', 'rotational',
@@ -1646,7 +1649,7 @@ class TestGenericHardwareManager(base.IronicAgentTest):
self.assertEqual(getattr(expected, attr),
getattr(device, attr))
expected_calls = [mock.call('/sys/block/%s/device/scsi_device' % dev)
- for dev in ('sda', 'sdb', 'sdc', 'sdd')]
+ for dev in ('sda', 'sdb', 'sdc', 'dm-0')]
mocked_listdir.assert_has_calls(expected_calls)
mocked_mpath.assert_called_once_with()
diff --git a/releasenotes/notes/multipath-serial-615fc925984abbf7.yaml b/releasenotes/notes/multipath-serial-615fc925984abbf7.yaml
new file mode 100644
index 00000000..4a13352b
--- /dev/null
+++ b/releasenotes/notes/multipath-serial-615fc925984abbf7.yaml
@@ -0,0 +1,4 @@
+---
+fixes:
+ - |
+ Fixes discovering WWN/serial numbers for devicemapper devices.