Add UUID to BlockDevice object

It'd allow for example custom ansible playbooks to use UUIDs of the
introspected node's disks. In future it might also enable agent
to use UUID (or by_path value) to refer to a device instead of
name, as it happens currently.

Change-Id: Id00437d2295c39fb12f3c25a92b30b56a58eef13
This commit is contained in:
Vladyslav Drok
2020-10-16 13:03:32 +02:00
committed by Julia Kreger
parent f52863a4d8
commit c7858d3cc8
4 changed files with 49 additions and 41 deletions

View File

@@ -184,8 +184,8 @@ fields:
``disks`` ``disks``
list of disk block devices with fields: ``name``, ``model``, list of disk block devices with fields: ``name``, ``model``,
``size`` (in bytes), ``rotational`` (boolean), ``wwn``, ``serial``, ``size`` (in bytes), ``rotational`` (boolean), ``wwn``, ``serial``,
``vendor``, ``wwn_with_extension``, ``wwn_vendor_extension``, ``hctl`` ``uuid``, ``vendor``, ``wwn_with_extension``, ``wwn_vendor_extension``,
and ``by_path`` (the full disk path, in the form ``hctl`` and ``by_path`` (the full disk path, in the form
``/dev/disk/by-path/<rest-of-path>``). ``/dev/disk/by-path/<rest-of-path>``).
``interfaces`` ``interfaces``

View File

@@ -416,7 +416,7 @@ def list_all_block_devices(block_type='disk',
"Cause: %(error)s", {'path': disk_by_path_dir, 'error': e}) "Cause: %(error)s", {'path': disk_by_path_dir, 'error': e})
# NOTE(dtantsur): keep in sync with utils.LSBLK_COLUMNS # NOTE(dtantsur): keep in sync with utils.LSBLK_COLUMNS
columns = ['KNAME', 'MODEL', 'SIZE', 'ROTA', 'TYPE'] columns = ['KNAME', 'MODEL', 'SIZE', 'ROTA', 'TYPE', 'UUID']
report = utils.execute('lsblk', '-Pbia', '-o{}'.format(','.join(columns)), report = utils.execute('lsblk', '-Pbia', '-o{}'.format(','.join(columns)),
check_exit_code=[0])[0] check_exit_code=[0])[0]
lines = report.splitlines() lines = report.splitlines()
@@ -534,6 +534,7 @@ def list_all_block_devices(block_type='disk',
vendor=_get_device_info(device['KNAME'], vendor=_get_device_info(device['KNAME'],
'block', 'vendor'), 'block', 'vendor'),
by_path=by_path_name, by_path=by_path_name,
uuid=device['UUID'],
**extra)) **extra))
return devices return devices
@@ -600,11 +601,13 @@ class BlockDevice(encoding.SerializableComparable):
def __init__(self, name, model, size, rotational, wwn=None, serial=None, def __init__(self, name, model, size, rotational, wwn=None, serial=None,
vendor=None, wwn_with_extension=None, vendor=None, wwn_with_extension=None,
wwn_vendor_extension=None, hctl=None, by_path=None): wwn_vendor_extension=None, hctl=None, by_path=None,
uuid=None):
self.name = name self.name = name
self.model = model self.model = model
self.size = size self.size = size
self.rotational = rotational self.rotational = rotational
self.uuid = uuid
self.wwn = wwn self.wwn = wwn
self.serial = serial self.serial = serial
self.vendor = vendor self.vendor = vendor

View File

@@ -124,37 +124,37 @@ HDPARM_INFO_TEMPLATE = (
BLK_DEVICE_TEMPLATE = ( BLK_DEVICE_TEMPLATE = (
'KNAME="sda" MODEL="TinyUSB Drive" SIZE="3116853504" ' 'KNAME="sda" MODEL="TinyUSB Drive" SIZE="3116853504" '
'ROTA="0" TYPE="disk" SERIAL="123"\n' 'ROTA="0" TYPE="disk" SERIAL="123" UUID="F531-BDC3"\n'
'KNAME="sdb" MODEL="Fastable SD131 7" SIZE="10737418240" ' 'KNAME="sdb" MODEL="Fastable SD131 7" SIZE="10737418240" '
'ROTA="0" TYPE="disk"\n' 'ROTA="0" TYPE="disk" UUID="9a5e5cca-e03d-4cbd-9054-9e6ca9048222"\n'
'KNAME="sdc" MODEL="NWD-BLP4-1600 " SIZE="1765517033472" ' 'KNAME="sdc" MODEL="NWD-BLP4-1600 " SIZE="1765517033472" '
' ROTA="0" TYPE="disk"\n' ' ROTA="0" TYPE="disk" UUID=""\n'
'KNAME="sdd" MODEL="NWD-BLP4-1600 " SIZE="1765517033472" ' 'KNAME="sdd" MODEL="NWD-BLP4-1600 " SIZE="1765517033472" '
' ROTA="0" TYPE="disk"\n' ' ROTA="0" TYPE="disk" UUID=""\n'
'KNAME="loop0" MODEL="" SIZE="109109248" ROTA="1" TYPE="loop"\n' 'KNAME="loop0" MODEL="" SIZE="109109248" ROTA="1" TYPE="loop" UUID=""\n'
'KNAME="zram0" MODEL="" SIZE="" ROTA="0" TYPE="disk"\n' 'KNAME="zram0" MODEL="" SIZE="" ROTA="0" TYPE="disk" UUID=""\n'
'KNAME="ram0" MODEL="" SIZE="8388608" ROTA="0" TYPE="disk"\n' 'KNAME="ram0" MODEL="" SIZE="8388608" ROTA="0" TYPE="disk" UUID=""\n'
'KNAME="ram1" MODEL="" SIZE="8388608" ROTA="0" TYPE="disk"\n' 'KNAME="ram1" MODEL="" SIZE="8388608" ROTA="0" TYPE="disk" UUID=""\n'
'KNAME="ram2" MODEL="" SIZE="8388608" ROTA="0" TYPE="disk"\n' 'KNAME="ram2" MODEL="" SIZE="8388608" ROTA="0" TYPE="disk" UUID=""\n'
'KNAME="ram3" MODEL="" SIZE="8388608" ROTA="0" TYPE="disk"\n' 'KNAME="ram3" MODEL="" SIZE="8388608" ROTA="0" TYPE="disk" UUID=""\n'
'KNAME="fd1" MODEL="magic" SIZE="4096" ROTA="1" TYPE="disk"\n' 'KNAME="fd1" MODEL="magic" SIZE="4096" ROTA="1" TYPE="disk" UUID=""\n'
'KNAME="sdf" MODEL="virtual floppy" SIZE="0" ROTA="1" TYPE="disk"' 'KNAME="sdf" MODEL="virtual floppy" SIZE="0" ROTA="1" TYPE="disk" UUID=""'
) )
# NOTE(pas-ha) largest device is 1 byte smaller than 4GiB # NOTE(pas-ha) largest device is 1 byte smaller than 4GiB
BLK_DEVICE_TEMPLATE_SMALL = ( BLK_DEVICE_TEMPLATE_SMALL = (
'KNAME="sda" MODEL="TinyUSB Drive" SIZE="3116853504" ' 'KNAME="sda" MODEL="TinyUSB Drive" SIZE="3116853504" '
'ROTA="0" TYPE="disk"\n' 'ROTA="0" TYPE="disk" UUID="F531-BDC3"\n'
'KNAME="sdb" MODEL="AlmostBigEnough Drive" SIZE="4294967295" ' 'KNAME="sdb" MODEL="AlmostBigEnough Drive" SIZE="4294967295" '
'ROTA="0" TYPE="disk"' 'ROTA="0" TYPE="disk" UUID=""'
) )
BLK_DEVICE_TEMPLATE_SMALL_DEVICES = [ BLK_DEVICE_TEMPLATE_SMALL_DEVICES = [
hardware.BlockDevice(name='/dev/sda', model='TinyUSB Drive', hardware.BlockDevice(name='/dev/sda', model='TinyUSB Drive',
size=3116853504, rotational=False, size=3116853504, rotational=False,
vendor="FooTastic"), vendor="FooTastic", uuid="F531-BDC3"),
hardware.BlockDevice(name='/dev/sdb', model='AlmostBigEnough Drive', hardware.BlockDevice(name='/dev/sdb', model='AlmostBigEnough Drive',
size=4294967295, rotational=False, size=4294967295, rotational=False,
vendor="FooTastic"), vendor="FooTastic", uuid=""),
] ]
# NOTE(TheJulia): This list intentionally contains duplicates # NOTE(TheJulia): This list intentionally contains duplicates
@@ -166,36 +166,36 @@ BLK_DEVICE_TEMPLATE_SMALL_DEVICES = [
# devices, so in this example it would normally be 1. # devices, so in this example it would normally be 1.
RAID_BLK_DEVICE_TEMPLATE = ( RAID_BLK_DEVICE_TEMPLATE = (
'KNAME="sda" MODEL="DRIVE 0" SIZE="1765517033472" ' 'KNAME="sda" MODEL="DRIVE 0" SIZE="1765517033472" '
'ROTA="1" TYPE="disk"\n' 'ROTA="1" TYPE="disk" UUID=""\n'
'KNAME="sda1" MODEL="DRIVE 0" SIZE="107373133824" ' 'KNAME="sda1" MODEL="DRIVE 0" SIZE="107373133824" '
'ROTA="1" TYPE="part"\n' 'ROTA="1" TYPE="part" UUID=""\n'
'KNAME="sdb" MODEL="DRIVE 1" SIZE="1765517033472" ' 'KNAME="sdb" MODEL="DRIVE 1" SIZE="1765517033472" '
'ROTA="1" TYPE="disk"\n' 'ROTA="1" TYPE="disk" UUID=""\n'
'KNAME="sdb" MODEL="DRIVE 1" SIZE="1765517033472" ' 'KNAME="sdb" MODEL="DRIVE 1" SIZE="1765517033472" '
'ROTA="1" TYPE="disk"\n' 'ROTA="1" TYPE="disk" UUID=""\n'
'KNAME="sdb1" MODEL="DRIVE 1" SIZE="107373133824" ' 'KNAME="sdb1" MODEL="DRIVE 1" SIZE="107373133824" '
'ROTA="1" TYPE="part"\n' 'ROTA="1" TYPE="part" UUID=""\n'
'KNAME="md0p1" MODEL="RAID" SIZE="107236818944" ' 'KNAME="md0p1" MODEL="RAID" SIZE="107236818944" '
'ROTA="0" TYPE="md"\n' 'ROTA="0" TYPE="md" UUID=""\n'
'KNAME="md0" MODEL="RAID" SIZE="1765517033470" ' 'KNAME="md0" MODEL="RAID" SIZE="1765517033470" '
'ROTA="0" TYPE="raid1"\n' 'ROTA="0" TYPE="raid1" UUID=""\n'
'KNAME="md0" MODEL="RAID" SIZE="1765517033470" ' 'KNAME="md0" MODEL="RAID" SIZE="1765517033470" '
'ROTA="0" TYPE="raid1"\n' 'ROTA="0" TYPE="raid1" UUID=""\n'
'KNAME="md1" MODEL="RAID" SIZE="" ROTA="0" TYPE="raid1"' 'KNAME="md1" MODEL="RAID" SIZE="" ROTA="0" TYPE="raid1" UUID=""'
) )
RAID_BLK_DEVICE_TEMPLATE_DEVICES = [ RAID_BLK_DEVICE_TEMPLATE_DEVICES = [
hardware.BlockDevice(name='/dev/sda', model='DRIVE 0', hardware.BlockDevice(name='/dev/sda', model='DRIVE 0',
size=1765517033472, rotational=True, size=1765517033472, rotational=True,
vendor="FooTastic"), vendor="FooTastic", uuid=""),
hardware.BlockDevice(name='/dev/sdb', model='DRIVE 1', hardware.BlockDevice(name='/dev/sdb', model='DRIVE 1',
size=1765517033472, rotational=True, size=1765517033472, rotational=True,
vendor="FooTastic"), vendor="FooTastic", uuid=""),
hardware.BlockDevice(name='/dev/md0', model='RAID', hardware.BlockDevice(name='/dev/md0', model='RAID',
size=1765517033470, rotational=False, size=1765517033470, rotational=False,
vendor="FooTastic"), vendor="FooTastic", uuid=""),
hardware.BlockDevice(name='/dev/md1', model='RAID', hardware.BlockDevice(name='/dev/md1', model='RAID',
size=0, rotational=False, size=0, rotational=False,
vendor="FooTastic"), vendor="FooTastic", uuid=""),
] ]
SHRED_OUTPUT_0_ITERATIONS_ZERO_FALSE = () SHRED_OUTPUT_0_ITERATIONS_ZERO_FALSE = ()
@@ -1330,7 +1330,7 @@ class TestGenericHardwareManager(base.IronicAgentTest):
mocked_execute.return_value = (BLK_DEVICE_TEMPLATE, '') mocked_execute.return_value = (BLK_DEVICE_TEMPLATE, '')
self.assertEqual('/dev/sdb', self.hardware.get_os_install_device()) self.assertEqual('/dev/sdb', self.hardware.get_os_install_device())
mocked_execute.assert_called_once_with( mocked_execute.assert_called_once_with(
'lsblk', '-Pbia', '-oKNAME,MODEL,SIZE,ROTA,TYPE', 'lsblk', '-Pbia', '-oKNAME,MODEL,SIZE,ROTA,TYPE,UUID',
check_exit_code=[0]) check_exit_code=[0])
mock_cached_node.assert_called_once_with() mock_cached_node.assert_called_once_with()
@@ -1352,7 +1352,7 @@ class TestGenericHardwareManager(base.IronicAgentTest):
# should always be smaller # should always be smaller
self.assertEqual('/dev/md0', self.hardware.get_os_install_device()) self.assertEqual('/dev/md0', self.hardware.get_os_install_device())
mocked_execute.assert_called_once_with( mocked_execute.assert_called_once_with(
'lsblk', '-Pbia', '-oKNAME,MODEL,SIZE,ROTA,TYPE', 'lsblk', '-Pbia', '-oKNAME,MODEL,SIZE,ROTA,TYPE,UUID',
check_exit_code=[0]) check_exit_code=[0])
mock_cached_node.assert_called_once_with() mock_cached_node.assert_called_once_with()
@@ -1371,7 +1371,7 @@ class TestGenericHardwareManager(base.IronicAgentTest):
ex = self.assertRaises(errors.DeviceNotFound, ex = self.assertRaises(errors.DeviceNotFound,
self.hardware.get_os_install_device) self.hardware.get_os_install_device)
mocked_execute.assert_called_once_with( mocked_execute.assert_called_once_with(
'lsblk', '-Pbia', '-oKNAME,MODEL,SIZE,ROTA,TYPE', 'lsblk', '-Pbia', '-oKNAME,MODEL,SIZE,ROTA,TYPE,UUID',
check_exit_code=[0]) check_exit_code=[0])
self.assertIn(str(4 * units.Gi), ex.details) self.assertIn(str(4 * units.Gi), ex.details)
mock_cached_node.assert_called_once_with() mock_cached_node.assert_called_once_with()
@@ -4553,7 +4553,7 @@ class TestModuleFunctions(base.IronicAgentTest):
mocked_execute.return_value = (BLK_DEVICE_TEMPLATE_SMALL, '') mocked_execute.return_value = (BLK_DEVICE_TEMPLATE_SMALL, '')
result = hardware.list_all_block_devices() result = hardware.list_all_block_devices()
mocked_execute.assert_called_once_with( mocked_execute.assert_called_once_with(
'lsblk', '-Pbia', '-oKNAME,MODEL,SIZE,ROTA,TYPE', 'lsblk', '-Pbia', '-oKNAME,MODEL,SIZE,ROTA,TYPE,UUID',
check_exit_code=[0]) check_exit_code=[0])
self.assertEqual(BLK_DEVICE_TEMPLATE_SMALL_DEVICES, result) self.assertEqual(BLK_DEVICE_TEMPLATE_SMALL_DEVICES, result)
mocked_udev.assert_called_once_with() mocked_udev.assert_called_once_with()
@@ -4572,7 +4572,7 @@ class TestModuleFunctions(base.IronicAgentTest):
mocked_execute.return_value = (RAID_BLK_DEVICE_TEMPLATE, '') mocked_execute.return_value = (RAID_BLK_DEVICE_TEMPLATE, '')
result = hardware.list_all_block_devices(ignore_empty=False) result = hardware.list_all_block_devices(ignore_empty=False)
mocked_execute.assert_called_once_with( mocked_execute.assert_called_once_with(
'lsblk', '-Pbia', '-oKNAME,MODEL,SIZE,ROTA,TYPE', 'lsblk', '-Pbia', '-oKNAME,MODEL,SIZE,ROTA,TYPE,UUID',
check_exit_code=[0]) check_exit_code=[0])
self.assertEqual(RAID_BLK_DEVICE_TEMPLATE_DEVICES, result) self.assertEqual(RAID_BLK_DEVICE_TEMPLATE_DEVICES, result)
mocked_udev.assert_called_once_with() mocked_udev.assert_called_once_with()
@@ -4585,7 +4585,7 @@ class TestModuleFunctions(base.IronicAgentTest):
mocked_execute.return_value = ('TYPE="foo" MODEL="model"', '') mocked_execute.return_value = ('TYPE="foo" MODEL="model"', '')
result = hardware.list_all_block_devices() result = hardware.list_all_block_devices()
mocked_execute.assert_called_once_with( mocked_execute.assert_called_once_with(
'lsblk', '-Pbia', '-oKNAME,MODEL,SIZE,ROTA,TYPE', 'lsblk', '-Pbia', '-oKNAME,MODEL,SIZE,ROTA,TYPE,UUID',
check_exit_code=[0]) check_exit_code=[0])
self.assertEqual([], result) self.assertEqual([], result)
mocked_udev.assert_called_once_with() mocked_udev.assert_called_once_with()
@@ -4597,8 +4597,8 @@ class TestModuleFunctions(base.IronicAgentTest):
mocked_execute.return_value = ('TYPE="disk" MODEL="model"', '') mocked_execute.return_value = ('TYPE="disk" MODEL="model"', '')
self.assertRaisesRegex( self.assertRaisesRegex(
errors.BlockDeviceError, errors.BlockDeviceError,
r'^Block device caused unknown error: KNAME, ROTA, SIZE must be ' r'^Block device caused unknown error: KNAME, ROTA, SIZE, UUID '
r'returned by lsblk.$', r'must be returned by lsblk.$',
hardware.list_all_block_devices) hardware.list_all_block_devices)
mocked_udev.assert_called_once_with() mocked_udev.assert_called_once_with()

View File

@@ -0,0 +1,5 @@
---
features:
- |
Adds UUID of the disks to the inventory of block devices that is
collected during inspection.