157157# Minimal: single plain disk, no children
158158# Minimal: md array across two disks, not mounted
159159LSBLK_MD_FREE = """\
160- NAME="nvme0n1" KNAME="nvme0n1" PKNAME="" SIZE="15360950534144" LOG-SEC="512" TYPE="disk" MOUNTPOINT=""
161- NAME="md0" KNAME="md0" PKNAME="nvme0n1" SIZE="30721630535680" LOG-SEC="512" TYPE="raid0" MOUNTPOINT=""
162- NAME="nvme1n1" KNAME="nvme1n1" PKNAME="" SIZE="15360950534144" LOG-SEC="512" TYPE="disk" MOUNTPOINT=""
163- NAME="md0" KNAME="md0" PKNAME="nvme1n1" SIZE="30721630535680" LOG-SEC="512" TYPE="raid0" MOUNTPOINT=""
160+ NAME="nvme0n1" KNAME="nvme0n1" PKNAME="" SIZE="15360950534144" LOG-SEC="512" TYPE="disk" MOUNTPOINT="" WWN=""
161+ NAME="md0" KNAME="md0" PKNAME="nvme0n1" SIZE="30721630535680" LOG-SEC="512" TYPE="raid0" MOUNTPOINT="" WWN=""
162+ NAME="nvme1n1" KNAME="nvme1n1" PKNAME="" SIZE="15360950534144" LOG-SEC="512" TYPE="disk" MOUNTPOINT="" WWN=""
163+ NAME="md0" KNAME="md0" PKNAME="nvme1n1" SIZE="30721630535680" LOG-SEC="512" TYPE="raid0" MOUNTPOINT="" WWN=""
164164"""
165165
166166
@@ -187,7 +187,7 @@ def _by_name(devices: list[Host.BlockDeviceInfo], name: str) -> Host.BlockDevice
187187
188188def test_plain_disk_no_children ():
189189 devices = _rescan (
190- 'NAME="sda" KNAME="sda" PKNAME="" SIZE="500107862016" LOG-SEC="512" TYPE="disk" MOUNTPOINT=""\n '
190+ 'NAME="sda" KNAME="sda" PKNAME="" SIZE="500107862016" LOG-SEC="512" TYPE="disk" MOUNTPOINT="" WWN="" \n '
191191 )
192192 assert len (devices ) == 1
193193 d = devices [0 ]
@@ -197,13 +197,21 @@ def test_plain_disk_no_children():
197197 assert d .size == 500107862016
198198 assert d .log_sec == 512
199199 assert d .available is True
200+ assert d .wwn == ''
201+
202+
203+ def test_plain_disk_wwn_stripped ():
204+ devices = _rescan (
205+ 'NAME="sda" KNAME="sda" PKNAME="" SIZE="500107862016" LOG-SEC="512" TYPE="disk" MOUNTPOINT="" WWN="0x6005076813810286"\n '
206+ )
207+ assert devices [0 ].wwn == '6005076813810286'
200208
201209
202210def test_disk_with_free_partitions_is_available ():
203211 devices = _rescan ("""\
204- NAME="sda" KNAME="sda" PKNAME="" SIZE="536870912000" LOG-SEC="512" TYPE="disk" MOUNTPOINT=""
205- NAME="sda1" KNAME="sda1" PKNAME="sda" SIZE="536870912" LOG-SEC="512" TYPE="part" MOUNTPOINT=""
206- NAME="sda2" KNAME="sda2" PKNAME="sda" SIZE="536334039040" LOG-SEC="512" TYPE="part" MOUNTPOINT=""
212+ NAME="sda" KNAME="sda" PKNAME="" SIZE="536870912000" LOG-SEC="512" TYPE="disk" MOUNTPOINT="" WWN=""
213+ NAME="sda1" KNAME="sda1" PKNAME="sda" SIZE="536870912" LOG-SEC="512" TYPE="part" MOUNTPOINT="" WWN=""
214+ NAME="sda2" KNAME="sda2" PKNAME="sda" SIZE="536334039040" LOG-SEC="512" TYPE="part" MOUNTPOINT="" WWN=""
207215""" )
208216 assert len (devices ) == 1
209217 d = devices [0 ]
@@ -214,19 +222,19 @@ def test_disk_with_free_partitions_is_available():
214222
215223def test_disk_with_mounted_partition_is_unavailable ():
216224 devices = _rescan ("""\
217- NAME="sda" KNAME="sda" PKNAME="" SIZE="536870912000" LOG-SEC="512" TYPE="disk" MOUNTPOINT=""
218- NAME="sda1" KNAME="sda1" PKNAME="sda" SIZE="536870912" LOG-SEC="512" TYPE="part" MOUNTPOINT="/"
219- NAME="sda2" KNAME="sda2" PKNAME="sda" SIZE="536334039040" LOG-SEC="512" TYPE="part" MOUNTPOINT=""
225+ NAME="sda" KNAME="sda" PKNAME="" SIZE="536870912000" LOG-SEC="512" TYPE="disk" MOUNTPOINT="" WWN=""
226+ NAME="sda1" KNAME="sda1" PKNAME="sda" SIZE="536870912" LOG-SEC="512" TYPE="part" MOUNTPOINT="/" WWN=""
227+ NAME="sda2" KNAME="sda2" PKNAME="sda" SIZE="536334039040" LOG-SEC="512" TYPE="part" MOUNTPOINT="" WWN=""
220228""" )
221229 assert len (devices ) == 1
222230 assert devices [0 ].available is False
223231
224232
225233def test_disk_with_partition_in_raid_is_unavailable ():
226234 devices = _rescan ("""\
227- NAME="sda" KNAME="sda" PKNAME="" SIZE="536870912000" LOG-SEC="512" TYPE="disk" MOUNTPOINT=""
228- NAME="sda1" KNAME="sda1" PKNAME="sda" SIZE="536870912" LOG-SEC="512" TYPE="part" MOUNTPOINT=""
229- NAME="md0" KNAME="md0" PKNAME="sda1" SIZE="536739586048" LOG-SEC="512" TYPE="raid1" MOUNTPOINT=""
235+ NAME="sda" KNAME="sda" PKNAME="" SIZE="536870912000" LOG-SEC="512" TYPE="disk" MOUNTPOINT="" WWN=""
236+ NAME="sda1" KNAME="sda1" PKNAME="sda" SIZE="536870912" LOG-SEC="512" TYPE="part" MOUNTPOINT="" WWN=""
237+ NAME="md0" KNAME="md0" PKNAME="sda1" SIZE="536739586048" LOG-SEC="512" TYPE="raid1" MOUNTPOINT="" WWN=""
230238""" )
231239 # sda is a disk (unavailable), md0 is the raid array
232240 disk = _by_name (devices , 'sda' )
@@ -255,10 +263,10 @@ def test_md_array_free_is_available():
255263
256264def test_md_array_mounted_is_unavailable ():
257265 devices = _rescan ("""\
258- NAME="nvme0n1" KNAME="nvme0n1" PKNAME="" SIZE="15360950534144" LOG-SEC="512" TYPE="disk" MOUNTPOINT=""
259- NAME="md0" KNAME="md0" PKNAME="nvme0n1" SIZE="30721630535680" LOG-SEC="512" TYPE="raid0" MOUNTPOINT="/mnt/data"
260- NAME="nvme1n1" KNAME="nvme1n1" PKNAME="" SIZE="15360950534144" LOG-SEC="512" TYPE="disk" MOUNTPOINT=""
261- NAME="md0" KNAME="md0" PKNAME="nvme1n1" SIZE="30721630535680" LOG-SEC="512" TYPE="raid0" MOUNTPOINT="/mnt/data"
266+ NAME="nvme0n1" KNAME="nvme0n1" PKNAME="" SIZE="15360950534144" LOG-SEC="512" TYPE="disk" MOUNTPOINT="" WWN=""
267+ NAME="md0" KNAME="md0" PKNAME="nvme0n1" SIZE="30721630535680" LOG-SEC="512" TYPE="raid0" MOUNTPOINT="/mnt/data" WWN=""
268+ NAME="nvme1n1" KNAME="nvme1n1" PKNAME="" SIZE="15360950534144" LOG-SEC="512" TYPE="disk" MOUNTPOINT="" WWN=""
269+ NAME="md0" KNAME="md0" PKNAME="nvme1n1" SIZE="30721630535680" LOG-SEC="512" TYPE="raid0" MOUNTPOINT="/mnt/data" WWN=""
262270""" )
263271 assert _by_name (devices , 'md0' ).available is False
264272
@@ -324,12 +332,32 @@ def test_full_output_free_plain_disks_available():
324332 assert _by_name (devices , name ).available is True , f"{ name } should be available"
325333
326334
335+ def test_full_output_disk_wwn ():
336+ devices = _rescan (LSBLK_FULL )
337+ # free disks: 0x prefix stripped
338+ for name in ('sdf' , 'sdb' , 'sdm' , 'sde' , 'sdn' , 'sdc' , 'sdj' , 'sdr' ):
339+ assert _by_name (devices , name ).wwn == '6005076813810286' , f"{ name } wwn mismatch"
340+ # dm-0 path disks
341+ for name in ('sdd' , 'sdk' , 'sdg' , 'sdh' , 'sdl' , 'sdp' , 'sdq' , 'sdt' ):
342+ assert _by_name (devices , name ).wwn == '6005076813810225' , f"{ name } wwn mismatch"
343+ # dm-8 path disks
344+ for name in ('sdo' , 'sds' , 'sdi' , 'sda' ):
345+ assert _by_name (devices , name ).wwn == '600507638081046d' , f"{ name } wwn mismatch"
346+
347+
348+ def test_full_output_mpath_wwn ():
349+ devices = _rescan (LSBLK_FULL )
350+ # mpath NAME is the WWN-based alias (no 0x prefix)
351+ assert _by_name (devices , 'dm-0' ).wwn == '3600507681381022548000000000001ec'
352+ assert _by_name (devices , 'dm-8' ).wwn == '3600507638081046dd800000000000043'
353+
354+
327355def test_disk_with_lvm_child_is_unavailable ():
328356 # part -> lvm (mounted): unavailability must propagate up through the partition to the disk
329357 devices = _rescan ("""\
330- NAME="sda" KNAME="sda" PKNAME="" SIZE="536870912000" LOG-SEC="512" TYPE="disk" MOUNTPOINT=""
331- NAME="sda1" KNAME="sda1" PKNAME="sda" SIZE="536334039040" LOG-SEC="512" TYPE="part" MOUNTPOINT=""
332- NAME="myvg-mylv" KNAME="dm-0" PKNAME="sda1" SIZE="536220073984" LOG-SEC="512" TYPE="lvm" MOUNTPOINT="/data"
358+ NAME="sda" KNAME="sda" PKNAME="" SIZE="536870912000" LOG-SEC="512" TYPE="disk" MOUNTPOINT="" WWN=""
359+ NAME="sda1" KNAME="sda1" PKNAME="sda" SIZE="536334039040" LOG-SEC="512" TYPE="part" MOUNTPOINT="" WWN=""
360+ NAME="myvg-mylv" KNAME="dm-0" PKNAME="sda1" SIZE="536220073984" LOG-SEC="512" TYPE="lvm" MOUNTPOINT="/data" WWN=""
333361""" )
334362 assert _by_name (devices , 'sda' ).available is False
335363
@@ -339,21 +367,21 @@ def test_disk_with_lvm_child_is_unavailable():
339367# - sdb: free disk with unused partitions
340368# - nvme0n1, nvme1n1: members of md0 (raid0)
341369LSBLK_RAID1_HOST = """\
342- NAME="nvme0n1" KNAME="nvme0n1" PKNAME="" SIZE="15360950534144" LOG-SEC="512" TYPE="disk" MOUNTPOINT=""
343- NAME="md0" KNAME="md0" PKNAME="nvme0n1" SIZE="30721630535680" LOG-SEC="512" TYPE="raid0" MOUNTPOINT=""
344- NAME="sdb" KNAME="sdb" PKNAME="" SIZE="240057409536" LOG-SEC="512" TYPE="disk" MOUNTPOINT=""
345- NAME="sdb9" KNAME="sdb9" PKNAME="sdb" SIZE="8388608" LOG-SEC="512" TYPE="part" MOUNTPOINT=""
346- NAME="sdb1" KNAME="sdb1" PKNAME="sdb" SIZE="240047357952" LOG-SEC="512" TYPE="part" MOUNTPOINT=""
347- NAME="nvme1n1" KNAME="nvme1n1" PKNAME="" SIZE="15360950534144" LOG-SEC="512" TYPE="disk" MOUNTPOINT=""
348- NAME="md0" KNAME="md0" PKNAME="nvme1n1" SIZE="30721630535680" LOG-SEC="512" TYPE="raid0" MOUNTPOINT=""
349- NAME="sda" KNAME="sda" PKNAME="" SIZE="240057409536" LOG-SEC="512" TYPE="disk" MOUNTPOINT=""
350- NAME="sda4" KNAME="sda4" PKNAME="sda" SIZE="536870912" LOG-SEC="512" TYPE="part" MOUNTPOINT="/boot/efi"
351- NAME="sda2" KNAME="sda2" PKNAME="sda" SIZE="19327352832" LOG-SEC="512" TYPE="part" MOUNTPOINT=""
352- NAME="sda5" KNAME="sda5" PKNAME="sda" SIZE="4294967296" LOG-SEC="512" TYPE="part" MOUNTPOINT="/var/log"
353- NAME="sda3" KNAME="sda3" PKNAME="sda" SIZE="195496058368" LOG-SEC="512" TYPE="part" MOUNTPOINT=""
354- NAME="XSLocalEXT--9cf600ab--221b--8deb--a1f6--51354b56fb85-9cf600ab--221b--8deb--a1f6--51354b56fb85" KNAME="dm-0" PKNAME="sda3" SIZE="195483926528" LOG-SEC="512" TYPE="lvm" MOUNTPOINT="/run/sr-mount/9cf600ab-221b-8deb-a1f6-51354b56fb85"
355- NAME="sda1" KNAME="sda1" PKNAME="sda" SIZE="19327352832" LOG-SEC="512" TYPE="part" MOUNTPOINT="/"
356- NAME="sda6" KNAME="sda6" PKNAME="sda" SIZE="1073741824" LOG-SEC="512" TYPE="part" MOUNTPOINT="[SWAP]"
370+ NAME="nvme0n1" KNAME="nvme0n1" PKNAME="" SIZE="15360950534144" LOG-SEC="512" TYPE="disk" MOUNTPOINT="" WWN=""
371+ NAME="md0" KNAME="md0" PKNAME="nvme0n1" SIZE="30721630535680" LOG-SEC="512" TYPE="raid0" MOUNTPOINT="" WWN=""
372+ NAME="sdb" KNAME="sdb" PKNAME="" SIZE="240057409536" LOG-SEC="512" TYPE="disk" MOUNTPOINT="" WWN=""
373+ NAME="sdb9" KNAME="sdb9" PKNAME="sdb" SIZE="8388608" LOG-SEC="512" TYPE="part" MOUNTPOINT="" WWN=""
374+ NAME="sdb1" KNAME="sdb1" PKNAME="sdb" SIZE="240047357952" LOG-SEC="512" TYPE="part" MOUNTPOINT="" WWN=""
375+ NAME="nvme1n1" KNAME="nvme1n1" PKNAME="" SIZE="15360950534144" LOG-SEC="512" TYPE="disk" MOUNTPOINT="" WWN=""
376+ NAME="md0" KNAME="md0" PKNAME="nvme1n1" SIZE="30721630535680" LOG-SEC="512" TYPE="raid0" MOUNTPOINT="" WWN=""
377+ NAME="sda" KNAME="sda" PKNAME="" SIZE="240057409536" LOG-SEC="512" TYPE="disk" MOUNTPOINT="" WWN=""
378+ NAME="sda4" KNAME="sda4" PKNAME="sda" SIZE="536870912" LOG-SEC="512" TYPE="part" MOUNTPOINT="/boot/efi" WWN=""
379+ NAME="sda2" KNAME="sda2" PKNAME="sda" SIZE="19327352832" LOG-SEC="512" TYPE="part" MOUNTPOINT="" WWN=""
380+ NAME="sda5" KNAME="sda5" PKNAME="sda" SIZE="4294967296" LOG-SEC="512" TYPE="part" MOUNTPOINT="/var/log" WWN=""
381+ NAME="sda3" KNAME="sda3" PKNAME="sda" SIZE="195496058368" LOG-SEC="512" TYPE="part" MOUNTPOINT="" WWN=""
382+ NAME="XSLocalEXT--9cf600ab--221b--8deb--a1f6--51354b56fb85-9cf600ab--221b--8deb--a1f6--51354b56fb85" KNAME="dm-0" PKNAME="sda3" SIZE="195483926528" LOG-SEC="512" TYPE="lvm" MOUNTPOINT="/run/sr-mount/9cf600ab-221b-8deb-a1f6-51354b56fb85" WWN=""
383+ NAME="sda1" KNAME="sda1" PKNAME="sda" SIZE="19327352832" LOG-SEC="512" TYPE="part" MOUNTPOINT="/" WWN=""
384+ NAME="sda6" KNAME="sda6" PKNAME="sda" SIZE="1073741824" LOG-SEC="512" TYPE="part" MOUNTPOINT="[SWAP]" WWN=""
357385"""
358386
359387
@@ -387,15 +415,15 @@ def test_raid1_host_nvme_members_unavailable():
387415# - nvme0n1: free disk, no children
388416# - sda: boot disk (mounted partitions, lvm child)
389417LSBLK_SIMPLE_HOST = """\
390- NAME="nvme0n1" KNAME="nvme0n1" PKNAME="" SIZE="512110190592" LOG-SEC="512" TYPE="disk" MOUNTPOINT=""
391- NAME="sda" KNAME="sda" PKNAME="" SIZE="120034123776" LOG-SEC="512" TYPE="disk" MOUNTPOINT=""
392- NAME="sda4" KNAME="sda4" PKNAME="sda" SIZE="536870912" LOG-SEC="512" TYPE="part" MOUNTPOINT="/boot/efi"
393- NAME="sda2" KNAME="sda2" PKNAME="sda" SIZE="19327352832" LOG-SEC="512" TYPE="part" MOUNTPOINT=""
394- NAME="sda5" KNAME="sda5" PKNAME="sda" SIZE="4294967296" LOG-SEC="512" TYPE="part" MOUNTPOINT="/var/log"
395- NAME="sda3" KNAME="sda3" PKNAME="sda" SIZE="75499053056" LOG-SEC="512" TYPE="part" MOUNTPOINT=""
396- NAME="XSLocalEXT--1fa367e3--84ac--b13d--7dc1--6c5ec5ad1808-1fa367e3--84ac--b13d--7dc1--6c5ec5ad1808" KNAME="dm-1" PKNAME="sda3" SIZE="75485585408" LOG-SEC="512" TYPE="lvm" MOUNTPOINT="/run/sr-mount/1fa367e3-84ac-b13d-7dc1-6c5ec5ad1808"
397- NAME="sda1" KNAME="sda1" PKNAME="sda" SIZE="19327352832" LOG-SEC="512" TYPE="part" MOUNTPOINT="/"
398- NAME="sda6" KNAME="sda6" PKNAME="sda" SIZE="1073741824" LOG-SEC="512" TYPE="part" MOUNTPOINT="[SWAP]"
418+ NAME="nvme0n1" KNAME="nvme0n1" PKNAME="" SIZE="512110190592" LOG-SEC="512" TYPE="disk" MOUNTPOINT="" WWN=""
419+ NAME="sda" KNAME="sda" PKNAME="" SIZE="120034123776" LOG-SEC="512" TYPE="disk" MOUNTPOINT="" WWN=""
420+ NAME="sda4" KNAME="sda4" PKNAME="sda" SIZE="536870912" LOG-SEC="512" TYPE="part" MOUNTPOINT="/boot/efi" WWN=""
421+ NAME="sda2" KNAME="sda2" PKNAME="sda" SIZE="19327352832" LOG-SEC="512" TYPE="part" MOUNTPOINT="" WWN=""
422+ NAME="sda5" KNAME="sda5" PKNAME="sda" SIZE="4294967296" LOG-SEC="512" TYPE="part" MOUNTPOINT="/var/log" WWN=""
423+ NAME="sda3" KNAME="sda3" PKNAME="sda" SIZE="75499053056" LOG-SEC="512" TYPE="part" MOUNTPOINT="" WWN=""
424+ NAME="XSLocalEXT--1fa367e3--84ac--b13d--7dc1--6c5ec5ad1808-1fa367e3--84ac--b13d--7dc1--6c5ec5ad1808" KNAME="dm-1" PKNAME="sda3" SIZE="75485585408" LOG-SEC="512" TYPE="lvm" MOUNTPOINT="/run/sr-mount/1fa367e3-84ac-b13d-7dc1-6c5ec5ad1808" WWN=""
425+ NAME="sda1" KNAME="sda1" PKNAME="sda" SIZE="19327352832" LOG-SEC="512" TYPE="part" MOUNTPOINT="/" WWN=""
426+ NAME="sda6" KNAME="sda6" PKNAME="sda" SIZE="1073741824" LOG-SEC="512" TYPE="part" MOUNTPOINT="[SWAP]" WWN=""
399427"""
400428
401429
0 commit comments