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 69e2254503)
			
			
This commit is contained in:
		@@ -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
 | 
			
		||||
 
 | 
			
		||||
@@ -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()
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -0,0 +1,4 @@
 | 
			
		||||
---
 | 
			
		||||
fixes:
 | 
			
		||||
  - |
 | 
			
		||||
    Fixes discovering WWN/serial numbers for devicemapper devices.
 | 
			
		||||
		Reference in New Issue
	
	Block a user