Skip to content

Commit a1e814f

Browse files
committed
fixup! lsblk.py: add devid in output
Signed-off-by: Arnaud Garcia-Fernandez <arnaud.garcia-fernandez@vates.tech>
1 parent 8a829b7 commit a1e814f

2 files changed

Lines changed: 39 additions & 27 deletions

File tree

SOURCES/etc/xapi.d/plugins/lsblk.py

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,24 +14,26 @@ def _run(cmd):
1414
"""Small helper to run a [cmd, ...] and get its decoded and stripped output."""
1515
return run_command(cmd)["stdout"].decode("utf-8").strip()
1616

17-
def get_byid_paths_from_dev(devname):
18-
"""Return all generated links to a /dev/<devname> in /dev/disk/by-id/."""
19-
return [
20-
"/dev/" + path
21-
for path in _run(["udevadm", "info", "-q", "symlink", "/dev/" + devname]).split()
22-
if path.startswith("disk/by-id/")
23-
]
17+
def udev_export_db():
18+
"""Check udev database to extract a dict of {device_name: [list, of, symlinks], ...}."""
19+
return {
20+
re.search(r'N: (.*)', device).group(1):
21+
sorted("/dev/" + path for path in re.findall(r'S: (disk/.*)', device))
22+
for device in _run(["udevadm", "info", "--export-db"]).split("\n\n")
23+
if "S: disk/" in device and "N: " in device
24+
}
2425

2526
@error_wrapped
2627
def list_block_devices(session, args):
2728
results = []
2829
blockdevices = {}
30+
symlinks = udev_export_db()
2931
for output in _run(["lsblk", "-P", "-b", "-o", LSBLK_COLUMNS]).splitlines():
3032
device = {
3133
key.lower(): value.strip('"')
3234
for key, value in re.findall(r'(\S+)=(".*?"|\S+)', output)
3335
}
34-
device["device-id-paths"] = get_byid_paths_from_dev(device["kname"])
36+
device["device-id-paths"] = symlinks.get(device["kname"], [])
3537
if device["pkname"]:
3638
blockdevices[device["pkname"]].setdefault("children", []).append(device)
3739
else:

tests/test_lsblk.py

Lines changed: 29 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,17 @@ def test_lsblk(self, run_command):
1919
PKNAME="sda3" SIZE="19847446528" TYPE="lvm" RO="0" MOUNTPOINT="/run/sr-mount/1fad55d2-4f07-8145-c78a-297b173e06b0"
2020
NAME="sda1" KNAME="sda1" PKNAME="sda" SIZE="19327352832" TYPE="part" RO="0" MOUNTPOINT="/"
2121
NAME="sda6" KNAME="sda6" PKNAME="sda" SIZE="1073741824" TYPE="part" RO="0" MOUNTPOINT="[SWAP]"'''}
22-
udevadm_return_value = {"stdout": b'''disk/by-id/wwn-0x6c81f660e6c1d5002a0a4ad00dacf429 \
23-
disk/by-id/scsi-36c81f660e6c1d5002a0a4ad00dacf429'''}
22+
udevadm_return_value = {
23+
"stdout": b"\n\n".join(
24+
b"\n".join([
25+
b'''N: ''' + dev,
26+
b'''S: disk/by-id/wwn-0x6c81f660e6c1d5002a0a4ad00dacf429''',
27+
b'''S: disk/by-id/scsi-36c81f660e6c1d5002a0a4ad00dacf429''',
28+
])
29+
for dev in (
30+
b"sdb", b"sda", b"sda1", b"sda2", b"sda3", b"sda4", b"sda5", b"sda6",
31+
b"XSLocalEXT--1fad55d2--4f07--8145--c78a--297b173e06b0-1fad55d2--4f07--8145--c78a--297b173e06b0"))
32+
}
2433

2534
def mock_run_command(command):
2635
if command[0] == "lsblk":
@@ -32,30 +41,30 @@ def mock_run_command(command):
3241

3342
expected = ' \
3443
{"blockdevices": [{"kname": "sdb", "name": "sdb", "pkname": "", "mountpoint": "", "ro": "0", "type": \
35-
"disk", "size": "64424509440", "device-id-paths": ["/dev/disk/by-id/wwn-0x6c81f660e6c1d5002a0a4ad00dacf429", \
36-
"/dev/disk/by-id/scsi-36c81f660e6c1d5002a0a4ad00dacf429"]}, {"kname": "sda", "name": "sda", "pkname": "", \
44+
"disk", "size": "64424509440", "device-id-paths": ["/dev/disk/by-id/scsi-36c81f660e6c1d5002a0a4ad00dacf429", \
45+
"/dev/disk/by-id/wwn-0x6c81f660e6c1d5002a0a4ad00dacf429"]}, {"kname": "sda", "name": "sda", "pkname": "", \
3746
"mountpoint": "", "ro": "0", "type": "disk", \
3847
"children": [{"kname": "sda4", "name": "sda4", "pkname": "sda", "mountpoint": "", "ro": "0", "type": "part", \
39-
"size": "536870912", "device-id-paths": ["/dev/disk/by-id/wwn-0x6c81f660e6c1d5002a0a4ad00dacf429", \
40-
"/dev/disk/by-id/scsi-36c81f660e6c1d5002a0a4ad00dacf429"]}, \
48+
"size": "536870912", "device-id-paths": ["/dev/disk/by-id/scsi-36c81f660e6c1d5002a0a4ad00dacf429", \
49+
"/dev/disk/by-id/wwn-0x6c81f660e6c1d5002a0a4ad00dacf429"]}, \
4150
{"kname": "sda2", "name": "sda2", "pkname": "sda", "mountpoint": "", "ro": "0", "type": "part", \
42-
"size": "19327352832", "device-id-paths": ["/dev/disk/by-id/wwn-0x6c81f660e6c1d5002a0a4ad00dacf429", \
43-
"/dev/disk/by-id/scsi-36c81f660e6c1d5002a0a4ad00dacf429"]}, {"kname": "sda5", "name": "sda5", \
51+
"size": "19327352832", "device-id-paths": ["/dev/disk/by-id/scsi-36c81f660e6c1d5002a0a4ad00dacf429", \
52+
"/dev/disk/by-id/wwn-0x6c81f660e6c1d5002a0a4ad00dacf429"]}, {"kname": "sda5", "name": "sda5", \
4453
"pkname": "sda", "mountpoint": "/var/log", "ro": "0", "type": "part", "size": "4294967296", \
45-
"device-id-paths": ["/dev/disk/by-id/wwn-0x6c81f660e6c1d5002a0a4ad00dacf429", \
46-
"/dev/disk/by-id/scsi-36c81f660e6c1d5002a0a4ad00dacf429"]}, {"kname": "sda3", "name": "sda3", \
54+
"device-id-paths": ["/dev/disk/by-id/scsi-36c81f660e6c1d5002a0a4ad00dacf429", \
55+
"/dev/disk/by-id/wwn-0x6c81f660e6c1d5002a0a4ad00dacf429"]}, {"kname": "sda3", "name": "sda3", \
4756
"pkname": "sda", "mountpoint": "", "ro": "0", "type": "part", "children": [{"kname": "dm-0", "name": \
4857
"XSLocalEXT--1fad55d2--4f07--8145--c78a--297b173e06b0-1fad55d2--4f07--8145--c78a--297b173e06b0", "pkname": "sda3", \
4958
"mountpoint": "/run/sr-mount/1fad55d2-4f07-8145-c78a-297b173e06b0", "ro": "0", "type": "lvm", "size": "19847446528", \
50-
"device-id-paths": ["/dev/disk/by-id/wwn-0x6c81f660e6c1d5002a0a4ad00dacf429", \
51-
"/dev/disk/by-id/scsi-36c81f660e6c1d5002a0a4ad00dacf429"]}], "size": "19863158272", "device-id-paths": \
59+
"device-id-paths": ["/dev/disk/by-id/scsi-36c81f660e6c1d5002a0a4ad00dacf429", \
60+
"/dev/disk/by-id/wwn-0x6c81f660e6c1d5002a0a4ad00dacf429"]}], "size": "19863158272", "device-id-paths": \
5261
["/dev/disk/by-id/wwn-0x6c81f660e6c1d5002a0a4ad00dacf429", "/dev/disk/by-id/scsi-36c81f660e6c1d5002a0a4ad00dacf429"]}, \
5362
{"kname": "sda1", "name": "sda1", "pkname": "sda", "mountpoint": "/", "ro": "0", "type": \
54-
"part", "size": "19327352832", "device-id-paths": ["/dev/disk/by-id/wwn-0x6c81f660e6c1d5002a0a4ad00dacf429", \
55-
"/dev/disk/by-id/scsi-36c81f660e6c1d5002a0a4ad00dacf429"]}, {"kname": "sda6", "name": "sda6", "pkname": "sda", \
63+
"part", "size": "19327352832", "device-id-paths": ["/dev/disk/by-id/scsi-36c81f660e6c1d5002a0a4ad00dacf429", \
64+
"/dev/disk/by-id/wwn-0x6c81f660e6c1d5002a0a4ad00dacf429"]}, {"kname": "sda6", "name": "sda6", "pkname": "sda", \
5665
"mountpoint": "[SWAP]", "ro": "0", "type": "part", "size": "1073741824", "device-id-paths": \
57-
["/dev/disk/by-id/wwn-0x6c81f660e6c1d5002a0a4ad00dacf429", \
58-
"/dev/disk/by-id/scsi-36c81f660e6c1d5002a0a4ad00dacf429"]}], "size": "64424509440", "device-id-paths": \
66+
["/dev/disk/by-id/scsi-36c81f660e6c1d5002a0a4ad00dacf429", \
67+
"/dev/disk/by-id/wwn-0x6c81f660e6c1d5002a0a4ad00dacf429"]}], "size": "64424509440", "device-id-paths": \
5968
["/dev/disk/by-id/wwn-0x6c81f660e6c1d5002a0a4ad00dacf429", "/dev/disk/by-id/scsi-36c81f660e6c1d5002a0a4ad00dacf429"]}]}'
6069
res = list_block_devices(None, None)
6170

@@ -66,8 +75,9 @@ def test_lsblk_error(self, run_command):
6675

6776
with pytest.raises(XenAPIPlugin.Failure) as e:
6877
list_block_devices(None, None)
69-
run_command.assert_called_once_with(
70-
["lsblk", "-P", "-b", "-o", "NAME,KNAME,PKNAME,SIZE,TYPE,RO,MOUNTPOINT"]
71-
)
78+
run_command.assert_has_calls([
79+
["udevadm", "info", "--export-db"],
80+
["lsblk", "-P", "-b", "-o", "NAME,KNAME,PKNAME,SIZE,TYPE,RO,MOUNTPOINT"],
81+
])
7282
assert e.value.params[0] == '-1'
7383
assert e.value.params[1] == 'Error!'

0 commit comments

Comments
 (0)