diff --git a/ironic_python_agent/hardware.py b/ironic_python_agent/hardware.py index 32aa45159..cae30228b 100644 --- a/ironic_python_agent/hardware.py +++ b/ironic_python_agent/hardware.py @@ -272,7 +272,8 @@ def _md_scan_and_assemble(): def list_all_block_devices(block_type='disk', ignore_raid=False, - ignore_floppy=True): + ignore_floppy=True, + ignore_empty=True): """List all physical block devices The switches we use for lsblk: P for KEY="value" output, b for size output @@ -288,6 +289,7 @@ def list_all_block_devices(block_type='disk', devices and should be treated as such if encountered. :param ignore_floppy: Ignore floppy disk devices in the block device list. By default, these devices are filtered out. + :param ignore_empty: Whether to ignore disks with size equal 0. :return: A list of BlockDevices """ @@ -381,6 +383,12 @@ def list_all_block_devices(block_type='disk', LOG.debug('Skipping RAM device %s', device) continue + # NOTE(dtantsur): some hardware represents virtual floppy devices as + # normal block devices with size 0. Filter them out. + if ignore_empty and not int(device['SIZE'] or 0): + LOG.debug('Skipping device %s with zero size', device) + continue + name = os.path.join('/dev', device['KNAME']) try: @@ -1776,7 +1784,8 @@ class GenericHardwareManager(HardwareManager): utils.execute('mdadm', '--assemble', '--scan', check_exit_code=False) raid_devices = list_all_block_devices(block_type='raid', - ignore_raid=False) + ignore_raid=False, + ignore_empty=False) return raid_devices raid_devices = _scan_raids() diff --git a/ironic_python_agent/tests/unit/test_hardware.py b/ironic_python_agent/tests/unit/test_hardware.py index 25558fc5e..4a69692fa 100644 --- a/ironic_python_agent/tests/unit/test_hardware.py +++ b/ironic_python_agent/tests/unit/test_hardware.py @@ -141,7 +141,8 @@ BLK_DEVICE_TEMPLATE = ( 'KNAME="ram1" MODEL="" SIZE="8388608" ROTA="0" TYPE="disk"\n' 'KNAME="ram2" MODEL="" SIZE="8388608" ROTA="0" TYPE="disk"\n' 'KNAME="ram3" MODEL="" SIZE="8388608" ROTA="0" TYPE="disk"\n' - 'KNAME="fd1" MODEL="magic" SIZE="4096" ROTA="1" TYPE="disk"' + 'KNAME="fd1" MODEL="magic" SIZE="4096" ROTA="1" TYPE="disk"\n' + 'KNAME="sdf" MODEL="virtual floppy" SIZE="0" ROTA="1" TYPE="disk"' ) # NOTE(pas-ha) largest device is 1 byte smaller than 4GiB @@ -172,7 +173,8 @@ RAID_BLK_DEVICE_TEMPLATE = ( 'KNAME="md0" MODEL="RAID" SIZE="1765517033470" ' 'ROTA="0" TYPE="raid1"\n' 'KNAME="md0" MODEL="RAID" SIZE="1765517033470" ' - 'ROTA="0" TYPE="raid1"' + 'ROTA="0" TYPE="raid1"\n' + 'KNAME="md1" MODEL="RAID" SIZE="" ROTA="0" TYPE="raid1"' ) RAID_BLK_DEVICE_TEMPLATE_DEVICES = [ hardware.BlockDevice(name='/dev/sda', model='DRIVE 0', @@ -184,6 +186,9 @@ RAID_BLK_DEVICE_TEMPLATE_DEVICES = [ hardware.BlockDevice(name='/dev/md0', model='RAID', size=1765517033470, rotational=False, vendor="FooTastic"), + hardware.BlockDevice(name='/dev/md1', model='RAID', + size=0, rotational=False, + vendor="FooTastic"), ] SHRED_OUTPUT_0_ITERATIONS_ZERO_FALSE = () @@ -4268,7 +4273,7 @@ class TestModuleFunctions(base.IronicAgentTest): mocked_readlink.return_value = '../../sda' mocked_fromdevfile.return_value = {} mocked_execute.return_value = (RAID_BLK_DEVICE_TEMPLATE, '') - result = hardware.list_all_block_devices() + result = hardware.list_all_block_devices(ignore_empty=False) mocked_execute.assert_called_once_with( 'lsblk', '-Pbia', '-oKNAME,MODEL,SIZE,ROTA,TYPE', check_exit_code=[0]) diff --git a/releasenotes/notes/zero-size-78d3be2ac8fd59c2.yaml b/releasenotes/notes/zero-size-78d3be2ac8fd59c2.yaml new file mode 100644 index 000000000..d395e9d5e --- /dev/null +++ b/releasenotes/notes/zero-size-78d3be2ac8fd59c2.yaml @@ -0,0 +1,6 @@ +--- +fixes: + - | + Devices with size 0 are now ignored when collecting inventory. Some + hardware represents virtual floppy devices this way, see e.g. + https://www.dell.com/community/Systems-Management-General/How-to-disable-iDRAC-Virtual-CD/td-p/4734424