From 2e4172a0243ff1abf8a2945f4757a80ff3e32ee8 Mon Sep 17 00:00:00 2001 From: Kaifeng Wang Date: Thu, 24 Jul 2025 10:28:35 +0800 Subject: [PATCH] Support transport type as a root device hint Adds a tran field to the block device and allow to use it as a root device hint. Change-Id: I3fc83730a6100abb2b2aa98fc894713ecbbe3043 Closes-Bug: #2100951 Signed-off-by: Kaifeng Wang --- ironic_python_agent/device_hints.py | 2 +- ironic_python_agent/hardware.py | 6 +- .../tests/unit/extensions/test_image.py | 4 +- .../tests/unit/samples/hardware_samples.py | 92 ++++++++++--------- .../tests/unit/test_hardware.py | 72 ++++++++++----- ironic_python_agent/utils.py | 2 +- ...oot-device-hint-tran-48847d86d8cbcfbc.yaml | 6 ++ 7 files changed, 113 insertions(+), 71 deletions(-) create mode 100644 releasenotes/notes/root-device-hint-tran-48847d86d8cbcfbc.yaml diff --git a/ironic_python_agent/device_hints.py b/ironic_python_agent/device_hints.py index 5d6160409..826895005 100644 --- a/ironic_python_agent/device_hints.py +++ b/ironic_python_agent/device_hints.py @@ -26,7 +26,7 @@ LOG = logging.getLogger(__name__) VALID_ROOT_DEVICE_HINTS = { 'size': int, 'model': str, 'wwn': str, 'serial': str, 'vendor': str, 'wwn_with_extension': str, 'wwn_vendor_extension': str, 'name': str, - 'rotational': bool, 'hctl': str, 'by_path': str, + 'rotational': bool, 'hctl': str, 'by_path': str, 'tran': str, } ROOT_DEVICE_HINTS_GRAMMAR = specs_matcher.make_grammar() diff --git a/ironic_python_agent/hardware.py b/ironic_python_agent/hardware.py index d51e48698..44949c518 100644 --- a/ironic_python_agent/hardware.py +++ b/ironic_python_agent/hardware.py @@ -731,6 +731,7 @@ def list_all_block_devices(block_type='disk', partuuid=device_raw['partuuid'], logical_sectors=device_raw['log-sec'], physical_sectors=device_raw['phy-sec'], + tran=device_raw['tran'] or None, **extra)) return devices @@ -794,13 +795,13 @@ class BlockDevice(encoding.SerializableComparable): serializable_fields = ('name', 'model', 'size', 'rotational', 'wwn', 'serial', 'vendor', 'wwn_with_extension', 'wwn_vendor_extension', 'hctl', 'by_path', - 'logical_sectors', 'physical_sectors') + 'logical_sectors', 'physical_sectors', 'tran') def __init__(self, name, model, size, rotational, wwn=None, serial=None, vendor=None, wwn_with_extension=None, wwn_vendor_extension=None, hctl=None, by_path=None, uuid=None, partuuid=None, - logical_sectors=None, physical_sectors=None): + logical_sectors=None, physical_sectors=None, tran=None): self.name = name self.model = model self.size = size @@ -816,6 +817,7 @@ class BlockDevice(encoding.SerializableComparable): self.partuuid = partuuid self.logical_sectors = logical_sectors self.physical_sectors = physical_sectors + self.tran = tran class NetworkInterface(encoding.SerializableComparable): diff --git a/ironic_python_agent/tests/unit/extensions/test_image.py b/ironic_python_agent/tests/unit/extensions/test_image.py index e072feb7a..93f7717a8 100644 --- a/ironic_python_agent/tests/unit/extensions/test_image.py +++ b/ironic_python_agent/tests/unit/extensions/test_image.py @@ -834,7 +834,7 @@ Boot0004* ironic1 HD(1,GPT,55db8d03-c8f6-4a5b-9155-790dddc348fa,0x800,0x640 mock.call('lsblk', '-bia', '--json', '-oKNAME,MODEL,SIZE,ROTA,' + 'TYPE,UUID,PARTUUID,SERIAL,WWN,' - + 'LOG-SEC,PHY-SEC', + + 'LOG-SEC,PHY-SEC,TRAN', check_exit_code=[0]), mock.call('umount', self.fake_dir + '/boot/efi', attempts=3, delay_on_retry=True), @@ -958,7 +958,7 @@ Boot0004* ironic1 HD(1,GPT,55db8d03-c8f6-4a5b-9155-790dddc348fa,0x800,0x640 mock.call('lsblk', '-bia', '--json', '-oKNAME,MODEL,SIZE,ROTA,' + 'TYPE,UUID,PARTUUID,SERIAL,WWN,' - + 'LOG-SEC,PHY-SEC', + + 'LOG-SEC,PHY-SEC,TRAN', check_exit_code=[0]), mock.call('umount', self.fake_dir + '/boot/efi', attempts=3, delay_on_retry=True), diff --git a/ironic_python_agent/tests/unit/samples/hardware_samples.py b/ironic_python_agent/tests/unit/samples/hardware_samples.py index 82435e636..5a865871d 100644 --- a/ironic_python_agent/tests/unit/samples/hardware_samples.py +++ b/ironic_python_agent/tests/unit/samples/hardware_samples.py @@ -102,44 +102,48 @@ BLK_DEVICE_TEMPLATE = """ "blockdevices": [ {"kname":"sda", "model":"TinyUSB Drive", "size":3116853504, "rota":false, "type":"disk", "serial":"sda123", "uuid":"F531-BDC3", - "partuuid":null, "wwn":"wwn0", "log-sec": 512, "phy-sec": 512}, + "partuuid":null, "wwn":"wwn0", "log-sec": 512, "phy-sec": 512, + "tran": "sas"}, {"kname":"sdb", "model":"Fastable SD131 7", "size":10737418240, "rota":false, "type":"disk", "serial":"sdb123", "wwn":"wwn1", "uuid":"9a5e5cca-e03d-4cbd-9054-9e6ca9048222", "partuuid":null, - "log-sec": 512, "phy-sec": 512}, + "log-sec": 512, "phy-sec": 512, "tran": "sas"}, {"kname":"sdc", "model":"NWD-BLP4-1600", "size":1765517033472, "rota":false, "type":"disk", "serial":"sdc123", "uuid":null, - "partuuid":null, "wwn":"wwn2", "log-sec": 512, "phy-sec": 512}, + "partuuid":null, "wwn":"wwn2", "log-sec": 512, "phy-sec": 512, + "tran": "sas"}, {"kname":"sdd", "model":"NWD-BLP4-1600", "size":1765517033472, "rota":false, "type":"disk", "serial":"sdd123", "uuid":null, - "partuuid":null, "wwn":"wwn3", "log-sec": 512, "phy-sec": 512}, + "partuuid":null, "wwn":"wwn3", "log-sec": 512, "phy-sec": 512, + "tran": "sas"}, {"kname":"loop0", "model":null, "size":109109248, "rota":true, "type":"loop", "serial":null, "uuid":null, "partuuid": null, - "wwn":"wwn03", "log-sec": 512, "phy-sec": 512}, + "wwn":"wwn03", "log-sec": 512, "phy-sec": 512, "tran": null}, {"kname":"zram0", "model":null, "size":0, "rota":false, "type":"disk", "serial":null, "uuid":null, "partuuid":null, "wwn":"wwn04", - "log-sec": 512, "phy-sec": 512}, + "log-sec": 512, "phy-sec": 512, "tran": null}, {"kname":"ram0", "model":null, "size":8388608, "rota":false, "type":"disk", "serial":null, "uuid":null, "partuuid":null, "wwn":null, - "log-sec": 512, "phy-sec": 512}, + "log-sec": 512, "phy-sec": 512, "tran": null}, {"kname":"ram1", "model":null, "size":8388608, "rota":false, "type":"disk", "serial":null, "uuid":null, "partuuid":null, "wwn":null, - "log-sec": 512, "phy-sec": 512}, + "log-sec": 512, "phy-sec": 512, "tran": null}, {"kname":"ram2", "model":null, "size":8388608, "rota":false, "type":"disk", "serial":null, "uuid":null, "partuuid":null,"wwn":null, - "log-sec": 512, "phy-sec": 512}, + "log-sec": 512, "phy-sec": 512, "tran": null}, {"kname":"ram3", "model":null, "size":8388608, "rota":false, "type":"disk", "serial":null, "uuid":null, "partuuid":null, "wwn":null, - "log-sec": 512, "phy-sec": 512}, + "log-sec": 512, "phy-sec": 512, "tran": null}, {"kname":"fd1", "model":"magic", "size":4096, "rota":true, "type":"disk", "serial":null, "uuid":null, "partuuid":null, "wwn":null, - "log-sec": 512, "phy-sec": 512}, + "log-sec": 512, "phy-sec": 512, "tran": null}, {"kname":"sdf", "model":"virtual floppy", "size":0, "rota":true, "type":"disk", "serial":null, "uuid":null, "partuuid":null, "wwn":null, - "log-sec": 512, "phy-sec": 512}, + "log-sec": 512, "phy-sec": 512, "tran": "sas"}, {"kname":"dm-0", "model":"NWD-BLP4-1600", "size":"1765517033472", "rota":false, "type":"mpath", "serial":null, "uuid":null, - "partuuid":null, "wwn":null , "log-sec": 512, "phy-sec": 512} + "partuuid":null, "wwn":null , "log-sec": 512, "phy-sec": 512, + "tran": "sas"} ] } """ @@ -150,10 +154,10 @@ BLK_DEVICE_TEMPLATE_SMALL = """ "blockdevices": [ {"kname":"sda", "model":"TinyUSB Drive", "size":3116853504, "rota":false, "type":"disk", "serial":"123", "uuid":"F531-BDC", "partuuid":null, - "wwn":"wwn0", "log-sec": 512, "phy-sec": 512}, + "wwn":"wwn0", "log-sec": 512, "phy-sec": 512, "tran": "sas"}, {"kname":"sdb", "model":"AlmostBigEnough Drive", "size":"4294967295", "rota":false, "type":"disk", "serial":"456", "uuid":null, "partuuid":null, - "wwn":"wwn1", "log-sec": 512, "phy-sec": 512} + "wwn":"wwn1", "log-sec": 512, "phy-sec": 512, "tran": "sas"} ] } """ @@ -165,10 +169,10 @@ BLK_INCOMPLETE_DEVICE_TEMPLATE_SMALL = """ "blockdevices": [ {"kname":"sda", "model":"TinyUSB Drive", "size":3116853504, "rota":false, "type":"disk", "serial":"", "uuid":"F531-BDC", "partuuid":null, "wwn":"", - "log-sec": 512, "phy-sec": 512}, + "log-sec": 512, "phy-sec": 512, "tran": "sas"}, {"kname":"sdb", "model":"AlmostBigEnough Drive", "size":"4294967295", "rota":false, "type":"disk", "serial":"", "uuid":null, "partuuid":null, - "wwn":null , "log-sec": 512, "phy-sec": 512} + "wwn":null , "log-sec": 512, "phy-sec": 512, "tran": "sas"} ] } """ @@ -185,31 +189,31 @@ RAID_BLK_DEVICE_TEMPLATE = (""" "blockdevices": [ {"kname":"sda", "model":"DRIVE 0", "size":1765517033472, "rota":true, "type":"disk", "serial":"sda123", "uuid":null, "partuuid":null, - "wwn":"wwn1234" , "log-sec": 512, "phy-sec": 512}, + "wwn":"wwn1234" , "log-sec": 512, "phy-sec": 512, "tran": "sas"}, {"kname":"sda1", "model":"DRIVE 0", "size":107373133824, "rota":true, "type":"part", "serial":"sda1123", "uuid":null, "partuuid":null, - "wwn":"wwn2222", "log-sec": 512, "phy-sec": 512}, + "wwn":"wwn2222", "log-sec": 512, "phy-sec": 512, "tran": null}, {"kname":"sdb", "model":"DRIVE 1", "size":1765517033472, "rota":true, "type":"disk", "serial":"sdb123", "uuid":null, "partuuid":null, - "wwn":"wwn333", "log-sec": 512, "phy-sec": 512}, + "wwn":"wwn333", "log-sec": 512, "phy-sec": 512, "tran": "sas"}, {"kname":"sdb", "model":"DRIVE 1", "size":1765517033472, "rota":true, "type":"disk", "uuid":null, "partuuid":null, "wwn":"444", "log-sec": 512, - "phy-sec": 512}, + "phy-sec": 512, "tran": "sas"}, {"kname":"sdb1", "model":"DRIVE 1", "size":107373133824, "rota":true, "type":"part", "serial":"sdb1123", "uuid":null, "partuuid":null, - "wwn":"wwn5", "log-sec": 512, "phy-sec": 512}, + "wwn":"wwn5", "log-sec": 512, "phy-sec": 512, "tran": null}, {"kname":"md0p1", "model":"RAID", "size":107236818944, "rota":false, "type":"md", "serial":null, "uuid":null, "partuuid":null, "wwn":"wwn6", - "log-sec": 512, "phy-sec": 512}, + "log-sec": 512, "phy-sec": 512, "tran": null}, {"kname":"md0", "model":"RAID", "size":1765517033470, "rota":false, "type":"raid1", "serial":null, "uuid":null, "partuuid":null, "wwn":"12", - "log-sec": 512, "phy-sec": 512}, + "log-sec": 512, "phy-sec": 512, "tran": null}, {"kname":"md0", "model":"RAID", "size":1765517033470, "rota":false, "type":"raid1", "serial":null, "uuid":null, "partuuid":null, "wwn":"33", - "log-sec": 512, "phy-sec": 512}, + "log-sec": 512, "phy-sec": 512, "tran": null}, {"kname":"md1", "model":"RAID", "size":0, "rota":false, "type":"raid1", "serial":null, "uuid":null, "partuuid":null, "wwn":null, "log-sec": 512, - "phy-sec": 512} + "phy-sec": 512, "tran": null} ] } """) @@ -219,63 +223,65 @@ MULTIPATH_BLK_DEVICE_TEMPLATE = (""" "blockdevices": [ {"kname":"sda", "model":"INTEL_SSDSC2CT060A3", "size":"60022480896", "rota":false, "type":"disk", "serial":"sda123", "uuid":null, - "partuuid":null, "wwn":null , "log-sec": 512, "phy-sec": 512}, + "partuuid":null, "wwn":null , "log-sec": 512, "phy-sec": 512, + "tran": "sas"}, {"kname":"sda2", "model":null, "size":"59162722304", "rota":false, "type":"part", "uuid":"f8b55d59-96c3-3982-b129-1b6b2ee8da86", "partuuid":"c97c8aac-7796-4433-b1fc-9b5fac43edf3", "serial":"sda2123", - "wwn":"" , "log-sec": 512, "phy-sec": 512}, + "wwn":"" , "log-sec": 512, "phy-sec": 512, "tran": null}, {"kname":"sda3", "model":null, "size":"650002432", "rota":false, "type":"part", "uuid":"b3b03565-5f13-3c93-b2a6-6d90e25be926", "partuuid":"6c85beff-b2bd-4a1c-91b7-8abb5256459d", "serial":"sda3123", - "wwn":"wwn1" , "log-sec": 512, "phy-sec": 512}, + "wwn":"wwn1" , "log-sec": 512, "phy-sec": 512, "tran": null}, {"kname":"sda1", "model":null, "size":"209715200", "rota":false, "type":"part", "uuid":"0a83355d-7500-3f5f-9abd-66f6fd03714c", "partuuid":"eba28b26-b76a-402c-94dd-0b66a523a485", "serial":"sda1123", - "wwn":"123" , "log-sec": 512, "phy-sec": 512}, + "wwn":"123" , "log-sec": 512, "phy-sec": 512, "tran": null}, {"kname":"dm-0", "model":null, "size":"60022480896", "rota":false, "type":"mpath", "serial":null, "uuid":null, "partuuid":null, - "wwn":"123aa" , "log-sec": 512, "phy-sec": 512}, + "wwn":"123aa" , "log-sec": 512, "phy-sec": 512, "tran": null}, {"kname":"dm-4", "model":null, "size":"650002432", "rota":false, "type":"part", "uuid":"b3b03565-5f13-3c93-b2a6-6d90e25be926", "partuuid":"6c85beff-b2bd-4a1c-91b7-8abb5256459d", "serial":null, - "wwn":"123bb" , "log-sec": 512, "phy-sec": 512}, + "wwn":"123bb" , "log-sec": 512, "phy-sec": 512, "tran": null}, {"kname":"dm-2", "model":null, "size":"209715200", "rota":false, "type":"part", "uuid":"0a83355d-7500-3f5f-9abd-66f6fd03714c", "partuuid":"eba28b26-b76a-402c-94dd-0b66a523a485", "serial":null, - "wwn":"123cc" , "log-sec": 512, "phy-sec": 512}, + "wwn":"123cc" , "log-sec": 512, "phy-sec": 512, "tran": null}, {"kname":"dm-3", "model":null, "size":"59162722304", "rota":false, "type":"part", "uuid":"f8b55d59-96c3-3982-b129-1b6b2ee8da86", "partuuid":"c97c8aac-7796-4433-b1fc-9b5fac43edf3", "serial":null, - "wwn":"123dd" , "log-sec": 512, "phy-sec": 512}, + "wwn":"123dd" , "log-sec": 512, "phy-sec": 512, "tran": null}, {"kname":"sdb", "model":"INTEL_SSDSC2CT060A3", "size":"60022480896", "rota":false, "type":"disk", "serial":"sdb123", "uuid":null, - "partuuid":null, "wwn":"123ee" , "log-sec": 512, "phy-sec": 512}, + "partuuid":null, "wwn":"123ee" , "log-sec": 512, "phy-sec": 512, + "tran": "sas"}, {"kname":"sdb2", "model":null, "size":"59162722304", "rota":false, "type":"part", "serial":"sdb2123", "uuid":"f8b55d59-96c3-3982-b129-1b6b2ee8da86", "wwn":"123gg", "partuuid":"c97c8aac-7796-4433-b1fc-9b5fac43edf3", "log-sec": 512, - "phy-sec": 512}, + "phy-sec": 512, "tran": null}, {"kname":"sdb3", "model":null, "size":"650002432", "rota":false, "type":"part", "serial":"sdv3123", "uuid":"b3b03565-5f13-3c93-b2a6-6d90e25be926", "wwn":"123zz", "partuuid":"6c85beff-b2bd-4a1c-91b7-8abb5256459d", "log-sec": 512, - "phy-sec": 512}, + "phy-sec": 512, "tran": null}, {"kname":"sdb1", "model":null, "size":"209715200", "rota":false, "type":"part", "serial":"sdb1123", "uuid":"0a83355d-7500-3f5f-9abd-66f6fd03714c", "wwn":"123ll", "partuuid":"eba28b26-b76a-402c-94dd-0b66a523a485", "log-sec": 512, - "phy-sec": 512}, + "phy-sec": 512, "tran": null}, {"kname":"sdc", "model":"ST1000DM003-1CH162", "size":"1000204886016", "rota":true, "type":"disk", "serial":"sdc123", "uuid":null, "wwn":"123g", - "partuuid":null, "log-sec": 512, "phy-sec": 512}, + "partuuid":null, "log-sec": 512, "phy-sec": 512, "tran": null}, {"kname":"sdc1", "model":null, "size":"899999072256", "rota":true, "type":"part", "serial":"sdc1123", "uuid":"457f7d3c-9376-4997-89bd-d1a7c8b04060", "wwn":"123kc", "partuuid":"c9433d2e-3bbc-47b4-92bf-43c1d80f06e0", "log-sec": 512, - "phy-sec": 512}, + "phy-sec": 512, "tran": null}, {"kname":"dm-1", "model":null, "size":"1000204886016", "rota":false, "type":"mpath", "serial":null, "uuid":null, "partuuid":null, - "wwn":"sp0ng3b0b" , "log-sec": 512, "phy-sec": 512} + "wwn":"sp0ng3b0b" , "log-sec": 512, "phy-sec": 512, "tran": null} ] } """) @@ -285,10 +291,10 @@ PARTUUID_DEVICE_TEMPLATE = (""" "blockdevices": [ {"kname":"sda", "model":"DRIVE 0", "size":1765517033472, "rota":true, "type":"disk", "serial":"sda123", "uuid":null, "partuuid":null, - "wwn":"4d4m", "log-sec": 512, "phy-sec": 512}, + "wwn":"4d4m", "log-sec": 512, "phy-sec": 512, "tran": null}, {"kname":"sda1", "model":"DRIVE 0", "size":107373133824, "rota":true, "type":"part", "serial":"sda1123", "uuid":"987654-3210", "wwn":"k4k1", - "partuuid":"1234-5678", "log-sec": 512, "phy-sec": 512} + "partuuid":"1234-5678", "log-sec": 512, "phy-sec": 512, "tran": null} ] } """) diff --git a/ironic_python_agent/tests/unit/test_hardware.py b/ironic_python_agent/tests/unit/test_hardware.py index 08729ff5a..bb8c8a35f 100644 --- a/ironic_python_agent/tests/unit/test_hardware.py +++ b/ironic_python_agent/tests/unit/test_hardware.py @@ -53,12 +53,14 @@ BLK_DEVICE_TEMPLATE_SMALL_DEVICES = [ size=3116853504, rotational=False, vendor="FooTastic", uuid="F531-BDC3", serial="123", wwn="wwn0", - logical_sectors=512, physical_sectors=512), + logical_sectors=512, physical_sectors=512, + tran='sas'), hardware.BlockDevice(name='/dev/sdb', model='AlmostBigEnough Drive', size=4294967295, rotational=False, vendor="FooTastic", uuid="", serial="456", wwn="wwn1", - logical_sectors=512, physical_sectors=512), + logical_sectors=512, physical_sectors=512, + tran='sas'), ] RAID_BLK_DEVICE_TEMPLATE_DEVICES = [ @@ -66,22 +68,26 @@ RAID_BLK_DEVICE_TEMPLATE_DEVICES = [ size=1765517033472, rotational=True, vendor="FooTastic", uuid="", serial="sda123", wwn="wwn1234", - logical_sectors=512, physical_sectors=512), + logical_sectors=512, physical_sectors=512, + tran='sas'), hardware.BlockDevice(name='/dev/sdb', model='DRIVE 1', size=1765517033472, rotational=True, vendor="FooTastic", uuid="", serial="sdb123", wwn="wwn333", - logical_sectors=512, physical_sectors=512), + logical_sectors=512, physical_sectors=512, + tran='sas'), hardware.BlockDevice(name='/dev/md0', model='RAID', size=1765517033470, rotational=False, vendor="FooTastic", uuid="", serial=None, wwn="12", - logical_sectors=512, physical_sectors=512), + logical_sectors=512, physical_sectors=512, + tran=None), hardware.BlockDevice(name='/dev/md1', model='RAID', size=0, rotational=False, vendor="FooTastic", uuid="", serial=None, wwn=None, - logical_sectors=512, physical_sectors=512), + logical_sectors=512, physical_sectors=512, + tran=None), ] BLK_DEVICE_TEMPLATE_PARTUUID_DEVICE = [ @@ -89,7 +95,8 @@ BLK_DEVICE_TEMPLATE_PARTUUID_DEVICE = [ size=107373133824, rotational=True, vendor="FooTastic", uuid="987654-3210", partuuid="1234-5678", serial="sda1123", wwn="k4k1", - logical_sectors=512, physical_sectors=512), + logical_sectors=512, physical_sectors=512, + tran=None), ] @@ -475,7 +482,7 @@ class TestGenericHardwareManager(base.IronicAgentTest): expected = [ mock.call('lsblk', '-bia', '--json', '-oKNAME,MODEL,SIZE,ROTA,TYPE,UUID,PARTUUID,SERIAL,WWN,' - 'LOG-SEC,PHY-SEC', + 'LOG-SEC,PHY-SEC,TRAN', check_exit_code=[0]), mock.call('multipath', '-c', '/dev/sda'), mock.call('multipath', '-ll', '/dev/sda'), @@ -556,7 +563,7 @@ class TestGenericHardwareManager(base.IronicAgentTest): expected = [ mock.call('lsblk', '-bia', '--json', '-oKNAME,MODEL,SIZE,ROTA,TYPE,UUID,PARTUUID,SERIAL,WWN,' - 'LOG-SEC,PHY-SEC', + 'LOG-SEC,PHY-SEC,TRAN', check_exit_code=[0]), mock.call('multipath', '-c', '/dev/sda'), mock.call('multipath', '-ll', '/dev/sda'), @@ -612,7 +619,7 @@ class TestGenericHardwareManager(base.IronicAgentTest): expected = [ mock.call('lsblk', '-bia', '--json', '-oKNAME,MODEL,SIZE,ROTA,TYPE,UUID,PARTUUID,SERIAL,WWN,' - 'LOG-SEC,PHY-SEC', + 'LOG-SEC,PHY-SEC,TRAN', check_exit_code=[0]), ] @@ -639,7 +646,7 @@ class TestGenericHardwareManager(base.IronicAgentTest): expected = [ mock.call('lsblk', '-bia', '--json', '-oKNAME,MODEL,SIZE,ROTA,TYPE,UUID,PARTUUID,SERIAL,WWN,' - 'LOG-SEC,PHY-SEC', + 'LOG-SEC,PHY-SEC,TRAN', check_exit_code=[0]), ] @@ -647,7 +654,7 @@ class TestGenericHardwareManager(base.IronicAgentTest): mocked_execute.assert_called_once_with( 'lsblk', '-bia', '--json', '-oKNAME,MODEL,SIZE,ROTA,TYPE,UUID,PARTUUID,SERIAL,WWN,' - 'LOG-SEC,PHY-SEC', + 'LOG-SEC,PHY-SEC,TRAN', check_exit_code=[0]) self.assertIn(str(4 * units.Gi), ex.details) mock_cached_node.assert_called_once_with() @@ -670,7 +677,8 @@ class TestGenericHardwareManager(base.IronicAgentTest): wwn=['strangewwn', 'wwn0'], wwn_with_extension='wwn0ven0', wwn_vendor_extension='ven0', - serial=['wongserial', 'wrng0', 'serial0']), + serial=['wongserial', 'wrng0', 'serial0'], + tran='sas'), hardware.BlockDevice(name='/dev/sdb', model=model, size=10737418240, @@ -680,7 +688,19 @@ class TestGenericHardwareManager(base.IronicAgentTest): wwn_with_extension='fake-wwnven0', wwn_vendor_extension='ven0', serial=['fake-serial', 'serial1'], - by_path='/dev/disk/by-path/1:0:0:0'), + by_path='/dev/disk/by-path/1:0:0:0', + tran='sas'), + hardware.BlockDevice(name='/dev/nvme0n1', + model=model, + size=10737418240, + rotational=False, + vendor='fake-vendor', + wwn=['fake-wwn'], + wwn_with_extension='fake-wwnven0', + wwn_vendor_extension='ven0', + serial=['fake-serial', 'serial1'], + by_path='', + tran='nvme'), ] self.assertEqual(expected_device, @@ -730,6 +750,14 @@ class TestGenericHardwareManager(base.IronicAgentTest): self._get_os_install_device_root_device_hints( {'by_path': '/dev/disk/by-path/1:0:0:0'}, '/dev/sdb') + def test_get_os_install_device_root_device_hints_by_tran_sas(self): + self._get_os_install_device_root_device_hints( + {'tran': 'sas'}, '/dev/sda') + + def test_get_os_install_device_root_device_hints_by_tran_nvme(self): + self._get_os_install_device_root_device_hints( + {'tran': 'nvme'}, '/dev/nvme0n1') + @mock.patch.object(hardware, 'list_all_block_devices', autospec=True) @mock.patch.object(hardware, 'get_cached_node', autospec=True) def test_get_os_install_device_root_device_hints_no_device_found( @@ -1520,7 +1548,7 @@ class TestGenericHardwareManager(base.IronicAgentTest): expected_calls = [ mock.call('lsblk', '-bia', '--json', '-oKNAME,MODEL,SIZE,ROTA,TYPE,UUID,PARTUUID,SERIAL,WWN,' - 'LOG-SEC,PHY-SEC', + 'LOG-SEC,PHY-SEC,TRAN', check_exit_code=[0]), mock.call('multipath', '-c', '/dev/sda'), mock.call('multipath', '-c', '/dev/sdb'), @@ -1653,7 +1681,7 @@ class TestGenericHardwareManager(base.IronicAgentTest): expected_calls = [ mock.call('lsblk', '-bia', '--json', '-oKNAME,MODEL,SIZE,ROTA,TYPE,UUID,PARTUUID,SERIAL,WWN,' - 'LOG-SEC,PHY-SEC', + 'LOG-SEC,PHY-SEC,TRAN', check_exit_code=[0]), mock.call('multipath', '-c', '/dev/sda'), mock.call('multipath', '-c', '/dev/sdb'), @@ -5945,7 +5973,7 @@ class TestModuleFunctions(base.IronicAgentTest): expected_calls = [ mock.call('lsblk', '-bia', '--json', '-oKNAME,MODEL,SIZE,ROTA,TYPE,UUID,PARTUUID,SERIAL,WWN,' - 'LOG-SEC,PHY-SEC', + 'LOG-SEC,PHY-SEC,TRAN', check_exit_code=[0]), mock.call('multipath', '-c', '/dev/sda'), mock.call('multipath', '-c', '/dev/sdb') @@ -5993,7 +6021,7 @@ class TestModuleFunctions(base.IronicAgentTest): expected_calls = [ mock.call('lsblk', '-bia', '--json', '-oKNAME,MODEL,SIZE,ROTA,TYPE,UUID,PARTUUID,SERIAL,WWN,' - 'LOG-SEC,PHY-SEC', + 'LOG-SEC,PHY-SEC,TRAN', check_exit_code=[0]), mock.call('multipath', '-c', '/dev/sda'), mock.call('multipath', '-c', '/dev/sda1'), @@ -6033,7 +6061,7 @@ class TestModuleFunctions(base.IronicAgentTest): expected_calls = [ mock.call('lsblk', '-bia', '--json', '-oKNAME,MODEL,SIZE,ROTA,TYPE,UUID,PARTUUID,SERIAL,WWN,' - 'LOG-SEC,PHY-SEC', + 'LOG-SEC,PHY-SEC,TRAN', check_exit_code=[0]), mock.call('multipath', '-c', '/dev/sda'), mock.call('multipath', '-c', '/dev/sda1'), @@ -6057,7 +6085,7 @@ class TestModuleFunctions(base.IronicAgentTest): mocked_execute.assert_called_once_with( 'lsblk', '-bia', '--json', '-oKNAME,MODEL,SIZE,ROTA,TYPE,UUID,PARTUUID,SERIAL,WWN,' - 'LOG-SEC,PHY-SEC', + 'LOG-SEC,PHY-SEC,TRAN', check_exit_code=[0]) self.assertEqual([], result) mocked_udev.assert_called_once_with() @@ -6072,7 +6100,7 @@ class TestModuleFunctions(base.IronicAgentTest): expected_calls = [ mock.call('lsblk', '-bia', '--json', '-oKNAME,MODEL,SIZE,ROTA,TYPE,UUID,PARTUUID,SERIAL,WWN,' - 'LOG-SEC,PHY-SEC', + 'LOG-SEC,PHY-SEC,TRAN', check_exit_code=[0]), ] mocked_execute.return_value = ( @@ -6080,7 +6108,7 @@ class TestModuleFunctions(base.IronicAgentTest): self.assertRaisesRegex( errors.BlockDeviceError, r'Block device caused unknown error: kname, log-sec, partuuid, ' - r'phy-sec, rota, serial, size, uuid, wwn ' + r'phy-sec, rota, serial, size, tran, uuid, wwn ' r'must be returned by lsblk.', hardware.list_all_block_devices) mocked_udev.assert_called_once_with() diff --git a/ironic_python_agent/utils.py b/ironic_python_agent/utils.py index d43caa7e2..d01bfc145 100644 --- a/ironic_python_agent/utils.py +++ b/ironic_python_agent/utils.py @@ -65,7 +65,7 @@ AGENT_PARAMS_CACHED = dict() LSBLK_COLUMNS = ['KNAME', 'MODEL', 'SIZE', 'ROTA', 'TYPE', 'UUID', 'PARTUUID', 'SERIAL', 'WWN', - 'LOG-SEC', 'PHY-SEC'] + 'LOG-SEC', 'PHY-SEC', 'TRAN'] DEVICE_EXTRACTOR = re.compile(r'^(?:(.*\d)p|(.*\D))(?:\d+)$') diff --git a/releasenotes/notes/root-device-hint-tran-48847d86d8cbcfbc.yaml b/releasenotes/notes/root-device-hint-tran-48847d86d8cbcfbc.yaml new file mode 100644 index 000000000..a91265d96 --- /dev/null +++ b/releasenotes/notes/root-device-hint-tran-48847d86d8cbcfbc.yaml @@ -0,0 +1,6 @@ +--- +features: + - | + Adds device transport type ``tran`` that can be used as root device + hint that typically suited for locate devices with different bus types + like SSD and NVME. \ No newline at end of file