Skip to content

Commit 2805364

Browse files
Zuulopenstack-gerrit
authored andcommitted
Merge "add mixed matching of root device hints"
2 parents 2b67f27 + 84a1195 commit 2805364

File tree

6 files changed

+323
-107
lines changed

6 files changed

+323
-107
lines changed

ironic_python_agent/hardware.py

Lines changed: 56 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -480,7 +480,8 @@ def list_all_block_devices(block_type='disk',
480480
ignore_raid=False,
481481
ignore_floppy=True,
482482
ignore_empty=True,
483-
ignore_multipath=False):
483+
ignore_multipath=False,
484+
all_serial_and_wwn=False):
484485
"""List all physical block devices
485486
486487
The switches we use for lsblk: P for KEY="value" output, b for size output
@@ -500,6 +501,13 @@ def list_all_block_devices(block_type='disk',
500501
:param ignore_multipath: Whether to ignore devices backing multipath
501502
devices. Default is to consider multipath
502503
devices, if possible.
504+
:param all_serial_and_wwn: Don't collect serial and wwn numbers based
505+
on a priority order, instead collect wwn
506+
numbers from both udevadm and lsblk. When
507+
enabled this option will allso collect both
508+
the short and the long serial from udevadm if
509+
possible.
510+
503511
:return: A list of BlockDevices
504512
"""
505513

@@ -646,8 +654,15 @@ def _is_known_device(existing, new_device_name):
646654

647655
extra = {}
648656
lsblk_serial = device_raw.get('serial')
649-
if lsblk_serial:
650-
extra['serial'] = lsblk_serial
657+
lsblk_wwn = device_raw.get('wwn')
658+
if all_serial_and_wwn:
659+
extra['serial'] = [lsblk_serial]
660+
extra['wwn'] = [lsblk_wwn]
661+
else:
662+
if lsblk_serial:
663+
extra['serial'] = lsblk_serial
664+
if lsblk_wwn:
665+
extra['wwn'] = lsblk_wwn
651666
try:
652667
udev = pyudev.Devices.from_device_file(context, name)
653668
except pyudev.DeviceNotFoundByFileError as e:
@@ -667,18 +682,23 @@ def _is_known_device(existing, new_device_name):
667682
]
668683
# Only check device serial information from udev
669684
# when lsblk returned None
670-
if not lsblk_serial:
685+
if all_serial_and_wwn or not lsblk_serial:
671686
udev_property_mappings += [
672687
('serial', 'SERIAL_SHORT'),
673688
('serial', 'SERIAL')
674689
]
675690
for key, udev_key in udev_property_mappings:
676-
if key in extra:
677-
continue
678-
value = (udev.get(f'ID_{udev_key}')
679-
or udev.get(f'DM_{udev_key}')) # devicemapper
680-
if value:
681-
extra[key] = value
691+
if all_serial_and_wwn and (key == 'wwn' or key == 'serial'):
692+
value = (udev.get(f'ID_{udev_key}')
693+
or udev.get(f'DM_{udev_key}')) # devicemapper
694+
extra[key].append(value)
695+
else:
696+
if key in extra:
697+
continue
698+
value = (udev.get(f'ID_{udev_key}')
699+
or udev.get(f'DM_{udev_key}')) # devicemapper
700+
if value:
701+
extra[key] = value
682702

683703
# NOTE(lucasagomes): Newer versions of the lsblk tool supports
684704
# HCTL as a parameter but let's get it from sysfs to avoid breaking
@@ -1546,8 +1566,10 @@ def get_memory(self):
15461566

15471567
return Memory(total=total, physical_mb=physical)
15481568

1549-
def list_block_devices(self, include_partitions=False):
1550-
block_devices = list_all_block_devices()
1569+
def list_block_devices(self, include_partitions=False,
1570+
all_serial_and_wwn=False):
1571+
block_devices = \
1572+
list_all_block_devices(all_serial_and_wwn=all_serial_and_wwn)
15511573
if include_partitions:
15521574
block_devices.extend(
15531575
list_all_block_devices(block_type='part',
@@ -1581,9 +1603,11 @@ def get_skip_list_from_node(self, node,
15811603
return skip_list
15821604

15831605
def list_block_devices_check_skip_list(self, node,
1584-
include_partitions=False):
1606+
include_partitions=False,
1607+
all_serial_and_wwn=False):
15851608
block_devices = self.list_block_devices(
1586-
include_partitions=include_partitions)
1609+
include_partitions=include_partitions,
1610+
all_serial_and_wwn=all_serial_and_wwn)
15871611
skip_list = self.get_skip_list_from_node(
15881612
node, block_devices)
15891613
if skip_list is not None:
@@ -1606,13 +1630,29 @@ def get_os_install_device(self, permit_refresh=False):
16061630
LOG.debug('Looking for a device matching root hints %s',
16071631
root_device_hints)
16081632
block_devices = self.list_block_devices_check_skip_list(
1609-
cached_node)
1633+
cached_node, all_serial_and_wwn=True)
16101634
else:
1611-
block_devices = self.list_block_devices()
1635+
block_devices = self.list_block_devices(all_serial_and_wwn=True)
16121636
if not root_device_hints:
16131637
dev_name = utils.guess_root_disk(block_devices).name
16141638
else:
16151639
serialized_devs = [dev.serialize() for dev in block_devices]
1640+
orig_size = len(serialized_devs)
1641+
for dev_idx in range(orig_size):
1642+
ser_dev = serialized_devs.pop(0)
1643+
serials = ser_dev.get('serial')
1644+
wwns = ser_dev.get('wwn')
1645+
# (rozzi) static serial and static wwn are used to avoid
1646+
# reundancy in the number of wwns and serials, if the code
1647+
# would just loop over both serials and wwns it could be that
1648+
# there would be an uncesarry duplication of the first wwn
1649+
# number
1650+
for serial in serials:
1651+
for wwn in wwns:
1652+
tmp_ser_dev = ser_dev.copy()
1653+
tmp_ser_dev['wwn'] = wwn
1654+
tmp_ser_dev['serial'] = serial
1655+
serialized_devs.append(tmp_ser_dev)
16161656
try:
16171657
device = il_utils.match_root_device_hints(serialized_devs,
16181658
root_device_hints)

ironic_python_agent/tests/unit/extensions/test_image.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -833,7 +833,7 @@ def test__install_grub2_uefi_fstab(self, mock_get_part_uuid, mkdir_mock,
833833
mock.call('udevadm', 'settle'),
834834
mock.call('lsblk', '-bia', '--json',
835835
'-oKNAME,MODEL,SIZE,ROTA,'
836-
+ 'TYPE,UUID,PARTUUID,SERIAL',
836+
+ 'TYPE,UUID,PARTUUID,SERIAL,WWN',
837837
check_exit_code=[0]),
838838
mock.call('umount', self.fake_dir + '/boot/efi',
839839
attempts=3, delay_on_retry=True),
@@ -956,7 +956,7 @@ def test__install_grub2_uefi_no_fstab(
956956
mock.call('udevadm', 'settle'),
957957
mock.call('lsblk', '-bia', '--json',
958958
'-oKNAME,MODEL,SIZE,ROTA,'
959-
+ 'TYPE,UUID,PARTUUID,SERIAL',
959+
+ 'TYPE,UUID,PARTUUID,SERIAL,WWN',
960960
check_exit_code=[0]),
961961
mock.call('umount', self.fake_dir + '/boot/efi',
962962
attempts=3, delay_on_retry=True),

ironic_python_agent/tests/unit/samples/hardware_samples.py

Lines changed: 66 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -102,35 +102,42 @@
102102
"blockdevices": [
103103
{"kname":"sda", "model":"TinyUSB Drive", "size":3116853504,
104104
"rota":false, "type":"disk", "serial":"sda123", "uuid":"F531-BDC3",
105-
"partuuid":null},
105+
"partuuid":null, "wwn":"wwn0"},
106106
{"kname":"sdb", "model":"Fastable SD131 7", "size":10737418240,
107-
"rota":false, "type":"disk", "serial":"sdb123",
107+
"rota":false, "type":"disk", "serial":"sdb123", "wwn":"wwn1",
108108
"uuid":"9a5e5cca-e03d-4cbd-9054-9e6ca9048222", "partuuid":null},
109109
{"kname":"sdc", "model":"NWD-BLP4-1600", "size":1765517033472,
110110
"rota":false, "type":"disk", "serial":"sdc123", "uuid":null,
111-
"partuuid":null},
111+
"partuuid":null, "wwn":"wwn2"},
112112
{"kname":"sdd", "model":"NWD-BLP4-1600", "size":1765517033472,
113113
"rota":false, "type":"disk", "serial":"sdd123", "uuid":null,
114-
"partuuid":null},
114+
"partuuid":null, "wwn":"wwn3"},
115115
{"kname":"loop0", "model":null, "size":109109248, "rota":true,
116-
"type":"loop", "serial":null, "uuid":null, "partuuid": null},
116+
"type":"loop", "serial":null, "uuid":null, "partuuid": null,
117+
"wwn":"wwn03"},
117118
{"kname":"zram0", "model":null, "size":0, "rota":false, "type":"disk",
118-
"serial":null, "uuid":null, "partuuid":null},
119+
"serial":null, "uuid":null, "partuuid":null, "wwn":"wwn04"},
119120
{"kname":"ram0", "model":null, "size":8388608, "rota":false,
120-
"type":"disk", "serial":null, "uuid":null, "partuuid":null},
121+
"type":"disk", "serial":null, "uuid":null, "partuuid":null, "wwn":null
122+
},
121123
{"kname":"ram1", "model":null, "size":8388608, "rota":false,
122-
"type":"disk", "serial":null, "uuid":null, "partuuid":null},
124+
"type":"disk", "serial":null, "uuid":null, "partuuid":null, "wwn":null
125+
},
123126
{"kname":"ram2", "model":null, "size":8388608, "rota":false,
124-
"type":"disk", "serial":null, "uuid":null, "partuuid":null},
127+
"type":"disk", "serial":null, "uuid":null, "partuuid":null,"wwn":null
128+
},
125129
{"kname":"ram3", "model":null, "size":8388608, "rota":false,
126-
"type":"disk", "serial":null, "uuid":null, "partuuid":null},
130+
"type":"disk", "serial":null, "uuid":null, "partuuid":null, "wwn":null
131+
},
127132
{"kname":"fd1", "model":"magic", "size":4096, "rota":true,
128-
"type":"disk", "serial":null, "uuid":null, "partuuid":null},
133+
"type":"disk", "serial":null, "uuid":null, "partuuid":null, "wwn":null
134+
},
129135
{"kname":"sdf", "model":"virtual floppy", "size":0, "rota":true,
130-
"type":"disk", "serial":null, "uuid":null, "partuuid":null},
136+
"type":"disk", "serial":null, "uuid":null, "partuuid":null, "wwn":null
137+
},
131138
{"kname":"dm-0", "model":"NWD-BLP4-1600", "size":"1765517033472",
132139
"rota":false, "type":"mpath", "serial":null, "uuid":null,
133-
"partuuid":null}
140+
"partuuid":null, "wwn":null }
134141
]
135142
}
136143
"""
@@ -140,9 +147,11 @@
140147
{
141148
"blockdevices": [
142149
{"kname":"sda", "model":"TinyUSB Drive", "size":3116853504, "rota":false,
143-
"type":"disk", "serial":"123", "uuid":"F531-BDC", "partuuid":null},
150+
"type":"disk", "serial":"123", "uuid":"F531-BDC", "partuuid":null,
151+
"wwn":"wwn0" },
144152
{"kname":"sdb", "model":"AlmostBigEnough Drive", "size":"4294967295",
145-
"rota":false, "type":"disk", "serial":"456", "uuid":null, "partuuid":null}
153+
"rota":false, "type":"disk", "serial":"456", "uuid":null, "partuuid":null,
154+
"wwn":"wwn1" }
146155
]
147156
}
148157
"""
@@ -153,9 +162,10 @@
153162
{
154163
"blockdevices": [
155164
{"kname":"sda", "model":"TinyUSB Drive", "size":3116853504, "rota":false,
156-
"type":"disk", "serial":"", "uuid":"F531-BDC", "partuuid":null},
165+
"type":"disk", "serial":"", "uuid":"F531-BDC", "partuuid":null, "wwn":""},
157166
{"kname":"sdb", "model":"AlmostBigEnough Drive", "size":"4294967295",
158-
"rota":false, "type":"disk", "serial":"", "uuid":null, "partuuid":null}
167+
"rota":false, "type":"disk", "serial":"", "uuid":null, "partuuid":null,
168+
"wwn":null }
159169
]
160170
}
161171
"""
@@ -171,23 +181,27 @@
171181
{
172182
"blockdevices": [
173183
{"kname":"sda", "model":"DRIVE 0", "size":1765517033472, "rota":true,
174-
"type":"disk", "serial":"sda123", "uuid":null, "partuuid":null},
184+
"type":"disk", "serial":"sda123", "uuid":null, "partuuid":null,
185+
"wwn":"wwn1234" },
175186
{"kname":"sda1", "model":"DRIVE 0", "size":107373133824, "rota":true,
176-
"type":"part", "serial":"sda1123", "uuid":null, "partuuid":null},
187+
"type":"part", "serial":"sda1123", "uuid":null, "partuuid":null,
188+
"wwn":"wwn2222"},
177189
{"kname":"sdb", "model":"DRIVE 1", "size":1765517033472, "rota":true,
178-
"type":"disk", "serial":"sdb123", "uuid":null, "partuuid":null},
190+
"type":"disk", "serial":"sdb123", "uuid":null, "partuuid":null,
191+
"wwn":"wwn333"},
179192
{"kname":"sdb", "model":"DRIVE 1", "size":1765517033472, "rota":true,
180-
"type":"disk", "uuid":null, "partuuid":null},
193+
"type":"disk", "uuid":null, "partuuid":null, "wwn":"444"},
181194
{"kname":"sdb1", "model":"DRIVE 1", "size":107373133824, "rota":true,
182-
"type":"part", "serial":"sdb1123", "uuid":null, "partuuid":null},
195+
"type":"part", "serial":"sdb1123", "uuid":null, "partuuid":null,
196+
"wwn":"wwn5"},
183197
{"kname":"md0p1", "model":"RAID", "size":107236818944, "rota":false,
184-
"type":"md", "serial":null, "uuid":null, "partuuid":null},
198+
"type":"md", "serial":null, "uuid":null, "partuuid":null, "wwn":"wwn6"},
185199
{"kname":"md0", "model":"RAID", "size":1765517033470, "rota":false,
186-
"type":"raid1", "serial":null, "uuid":null, "partuuid":null},
200+
"type":"raid1", "serial":null, "uuid":null, "partuuid":null, "wwn":"12"},
187201
{"kname":"md0", "model":"RAID", "size":1765517033470, "rota":false,
188-
"type":"raid1", "serial":null, "uuid":null, "partuuid":null},
202+
"type":"raid1", "serial":null, "uuid":null, "partuuid":null, "wwn":"33"},
189203
{"kname":"md1", "model":"RAID", "size":0, "rota":false, "type":"raid1",
190-
"serial":null, "uuid":null, "partuuid":null}
204+
"serial":null, "uuid":null, "partuuid":null, "wwn":null}
191205
]
192206
}
193207
""")
@@ -197,51 +211,59 @@
197211
"blockdevices": [
198212
{"kname":"sda", "model":"INTEL_SSDSC2CT060A3", "size":"60022480896",
199213
"rota":false, "type":"disk", "serial":"sda123", "uuid":null,
200-
"partuuid":null},
214+
"partuuid":null, "wwn":null },
201215
{"kname":"sda2", "model":null, "size":"59162722304", "rota":false,
202216
"type":"part", "uuid":"f8b55d59-96c3-3982-b129-1b6b2ee8da86",
203-
"partuuid":"c97c8aac-7796-4433-b1fc-9b5fac43edf3", "serial":"sda2123"},
217+
"partuuid":"c97c8aac-7796-4433-b1fc-9b5fac43edf3", "serial":"sda2123",
218+
"wwn":"" },
204219
{"kname":"sda3", "model":null, "size":"650002432", "rota":false,
205220
"type":"part", "uuid":"b3b03565-5f13-3c93-b2a6-6d90e25be926",
206-
"partuuid":"6c85beff-b2bd-4a1c-91b7-8abb5256459d", "serial":"sda3123"},
221+
"partuuid":"6c85beff-b2bd-4a1c-91b7-8abb5256459d", "serial":"sda3123",
222+
"wwn":"wwn1" },
207223
{"kname":"sda1", "model":null, "size":"209715200", "rota":false,
208224
"type":"part", "uuid":"0a83355d-7500-3f5f-9abd-66f6fd03714c",
209-
"partuuid":"eba28b26-b76a-402c-94dd-0b66a523a485", "serial":"sda1123"},
225+
"partuuid":"eba28b26-b76a-402c-94dd-0b66a523a485", "serial":"sda1123",
226+
"wwn":"123" },
210227
{"kname":"dm-0", "model":null, "size":"60022480896", "rota":false,
211-
"type":"mpath", "serial":null, "uuid":null, "partuuid":null},
228+
"type":"mpath", "serial":null, "uuid":null, "partuuid":null,
229+
"wwn":"123aa" },
212230
{"kname":"dm-4", "model":null, "size":"650002432", "rota":false,
213231
"type":"part", "uuid":"b3b03565-5f13-3c93-b2a6-6d90e25be926",
214-
"partuuid":"6c85beff-b2bd-4a1c-91b7-8abb5256459d", "serial":null},
232+
"partuuid":"6c85beff-b2bd-4a1c-91b7-8abb5256459d", "serial":null,
233+
"wwn":"123bb" },
215234
{"kname":"dm-2", "model":null, "size":"209715200", "rota":false,
216235
"type":"part", "uuid":"0a83355d-7500-3f5f-9abd-66f6fd03714c",
217-
"partuuid":"eba28b26-b76a-402c-94dd-0b66a523a485", "serial":null},
236+
"partuuid":"eba28b26-b76a-402c-94dd-0b66a523a485", "serial":null,
237+
"wwn":"123cc" },
218238
{"kname":"dm-3", "model":null, "size":"59162722304", "rota":false,
219239
"type":"part", "uuid":"f8b55d59-96c3-3982-b129-1b6b2ee8da86",
220-
"partuuid":"c97c8aac-7796-4433-b1fc-9b5fac43edf3", "serial":null},
240+
"partuuid":"c97c8aac-7796-4433-b1fc-9b5fac43edf3", "serial":null,
241+
"wwn":"123dd" },
221242
{"kname":"sdb", "model":"INTEL_SSDSC2CT060A3", "size":"60022480896",
222243
"rota":false, "type":"disk", "serial":"sdb123", "uuid":null,
223-
"partuuid":null},
244+
"partuuid":null, "wwn":"123ee" },
224245
{"kname":"sdb2", "model":null, "size":"59162722304",
225246
"rota":false, "type":"part", "serial":"sdb2123",
226-
"uuid":"f8b55d59-96c3-3982-b129-1b6b2ee8da86",
247+
"uuid":"f8b55d59-96c3-3982-b129-1b6b2ee8da86", "wwn":"123gg",
227248
"partuuid":"c97c8aac-7796-4433-b1fc-9b5fac43edf3"},
228249
{"kname":"sdb3", "model":null, "size":"650002432",
229250
"rota":false, "type":"part", "serial":"sdv3123",
230-
"uuid":"b3b03565-5f13-3c93-b2a6-6d90e25be926",
251+
"uuid":"b3b03565-5f13-3c93-b2a6-6d90e25be926", "wwn":"123zz",
231252
"partuuid":"6c85beff-b2bd-4a1c-91b7-8abb5256459d"},
232253
{"kname":"sdb1", "model":null, "size":"209715200",
233254
"rota":false, "type":"part", "serial":"sdb1123",
234-
"uuid":"0a83355d-7500-3f5f-9abd-66f6fd03714c",
255+
"uuid":"0a83355d-7500-3f5f-9abd-66f6fd03714c", "wwn":"123ll",
235256
"partuuid":"eba28b26-b76a-402c-94dd-0b66a523a485"},
236257
{"kname":"sdc", "model":"ST1000DM003-1CH162", "size":"1000204886016",
237-
"rota":true, "type":"disk", "serial":"sdc123", "uuid":null,
258+
"rota":true, "type":"disk", "serial":"sdc123", "uuid":null, "wwn":"123g",
238259
"partuuid":null},
239260
{"kname":"sdc1", "model":null, "size":"899999072256",
240261
"rota":true, "type":"part", "serial":"sdc1123",
241-
"uuid":"457f7d3c-9376-4997-89bd-d1a7c8b04060",
262+
"uuid":"457f7d3c-9376-4997-89bd-d1a7c8b04060", "wwn":"123kc",
242263
"partuuid":"c9433d2e-3bbc-47b4-92bf-43c1d80f06e0"},
243264
{"kname":"dm-1", "model":null, "size":"1000204886016", "rota":false,
244-
"type":"mpath", "serial":null, "uuid":null, "partuuid":null}
265+
"type":"mpath", "serial":null, "uuid":null, "partuuid":null,
266+
"wwn":"sp0ng3b0b" }
245267
]
246268
}
247269
""")
@@ -250,9 +272,10 @@
250272
{
251273
"blockdevices": [
252274
{"kname":"sda", "model":"DRIVE 0", "size":1765517033472, "rota":true,
253-
"type":"disk", "serial":"sda123", "uuid":null, "partuuid":null},
275+
"type":"disk", "serial":"sda123", "uuid":null, "partuuid":null,
276+
"wwn":"4d4m" },
254277
{"kname":"sda1", "model":"DRIVE 0", "size":107373133824, "rota":true,
255-
"type":"part", "serial":"sda1123", "uuid":"987654-3210",
278+
"type":"part", "serial":"sda1123", "uuid":"987654-3210", "wwn":"k4k1",
256279
"partuuid":"1234-5678"}
257280
]
258281
}

0 commit comments

Comments
 (0)