1
0
mirror of https://github.com/systemd/systemd.git synced 2025-03-28 02:50:16 +03:00

test: Run TEST-64-UDEV-STORAGE with mkosi

We add a configure script for each subtest to add the required
qemu arguments.

Co-authored-by: Richard Maw <richard.maw@codethink.co.uk>
This commit is contained in:
Daan De Meyer 2024-05-12 21:27:58 +02:00
parent 8e8a1b832d
commit 5692f87160
25 changed files with 419 additions and 23 deletions

View File

@ -42,7 +42,9 @@ Packages=
kmod
knot
less
lvm2
man
mdadm
mtools
nano
nftables

View File

@ -30,6 +30,8 @@ Packages=
iputils
linux
man-db
multipath-tools
open-iscsi
openbsd-netcat
openssh
openssl
@ -44,6 +46,7 @@ Packages=
shadow
squashfs-tools
stress
tgt
tpm2-tools
tpm2-tss
vim

View File

@ -24,6 +24,8 @@ Packages=
bind-utils
bpftool
cryptsetup
device-mapper-event
device-mapper-multipath
dfuzzer
dhcp-server
dnf
@ -35,7 +37,9 @@ Packages=
iproute
iproute-tc
iputils
iscsi-initiator-utils
kernel-core
kernel-modules # For squashfs and megasas2
libasan
libcap-ng-utils
libubsan

View File

@ -9,4 +9,3 @@ RepartDirectories=mkosi.repart
[Content]
Packages=
rpmautospec-rpm-macros
kernel-modules # For squashfs

View File

@ -54,7 +54,9 @@ Packages=
libtss2-tcti-device0
locales
man-db
multipath-tools
netcat-openbsd
open-iscsi
openssh-client
openssh-server
passwd
@ -66,6 +68,7 @@ Packages=
sbsigntool
squashfs-tools
stress
tgt
tpm2-tools
tzdata
xxd

View File

@ -2,3 +2,7 @@
[Match]
Distribution=debian
[Content]
Packages=
linux-image-generic

View File

@ -1,8 +0,0 @@
# SPDX-License-Identifier: LGPL-2.1-or-later
[Match]
Architecture=x86-64
[Content]
Packages=
linux-image-cloud-amd64

View File

@ -1,8 +0,0 @@
# SPDX-License-Identifier: LGPL-2.1-or-later
[Match]
Architecture=arm64
[Content]
Packages=
linux-image-cloud-arm64

View File

@ -7,8 +7,9 @@ Distribution=fedora
Packages=
btrfs-progs
compsize
f2fs-tools
dnf5
f2fs-tools
scsi-target-utils
InitrdPackages=
btrfs-progs

View File

@ -50,6 +50,8 @@ Packages=
libasan8
libkmod2
libubsan1
multipath-tools
open-iscsi
openssh-clients
openssh-server
pam
@ -65,6 +67,7 @@ Packages=
sed
shadow
squashfs
tgt
timezone
tpm2.0-tools
user(bin)

View File

@ -0,0 +1,3 @@
# SPDX-License-Identifier: LGPL-2.1-or-later
iscsid.startup = /usr/bin/systemctl start iscsid.socket

View File

@ -0,0 +1,26 @@
#!/usr/bin/python3
# SPDX-License-Identifier: LGPL-2.1-or-later
import json
import sys
config = json.load(sys.stdin)
config["QemuArgs"] += ["-device", "virtio-scsi-pci,id=scsi0"]
for i in range(4):
id = f"drivebtrfsbasic{i}"
config["QemuDrives"] += [
{
"Id": id,
"Size": "350M" if i == 0 else "128M",
"Options": "cache=unsafe",
}
]
config["QemuArgs"] += [
"-device",
f"scsi-hd,drive={id},vendor=systemd,product=foobar,serial=deadbeefbtrfs{i}",
]
json.dump(config, sys.stdout)

View File

@ -0,0 +1,26 @@
#!/usr/bin/python3
# SPDX-License-Identifier: LGPL-2.1-or-later
import json
import sys
config = json.load(sys.stdin)
config["QemuArgs"] += ["-device", "virtio-scsi-pci,id=scsi0"]
for i in range(4):
id = f"driveiscsibasic{i}"
config["QemuDrives"] += [
{
"Id": id,
"Size": "150M" if i == 0 else "70M",
"Options": "cache=unsafe",
}
]
config["QemuArgs"] += [
"-device",
f"scsi-hd,drive={id},vendor=systemd,product=foobar,serial=deadbeefiscsi{i}",
]
json.dump(config, sys.stdout)

View File

@ -0,0 +1,32 @@
#!/usr/bin/python3
# SPDX-License-Identifier: LGPL-2.1-or-later
import json
import sys
config = json.load(sys.stdin)
config["QemuDrives"] += [
{
"Id": "drive0",
"Size": "64M",
"Options": "cache=unsafe",
}
]
config["QemuArgs"] += ["-device", "pci-bridge,id=pci_bridge0,chassis_nr=64"]
# Create 25 additional PCI bridges, each one connected to the previous one
# (basically a really long extension cable), and attach a virtio drive to
# the last one. This should force udev into attempting to create a device
# unit with a _really_ long name.
for bridge in range(1, 26):
config["QemuArgs"] += [
"-device",
f"pci-bridge,id=pci_bridge{bridge},bus=pci_bridge{bridge - 1},"
f"chassis_nr={64 + bridge}"
]
config["QemuArgs"] += ["-device", f"virtio-blk-pci,drive=drive0,scsi=off,bus=pci_bridge25"]
json.dump(config, sys.stdout)

View File

@ -0,0 +1,25 @@
#!/usr/bin/python3
# SPDX-License-Identifier: LGPL-2.1-or-later
import json
import sys
config = json.load(sys.stdin)
config["QemuArgs"] += ["-device", "virtio-scsi-pci,id=scsi0"]
for i in range(4):
id = f"drivelvmbasic{i}"
config["QemuDrives"] += [
{
"Id": id,
"Size": "32M",
"Options": "cache=unsafe",
}
]
config["QemuArgs"] += [
"-device", f"scsi-hd,drive={id},vendor=systemd,product=foobar,serial=deadbeeflvm{i}",
]
json.dump(config, sys.stdout)

View File

@ -0,0 +1,25 @@
#!/usr/bin/python3
# SPDX-License-Identifier: LGPL-2.1-or-later
import json
import sys
config = json.load(sys.stdin)
config["QemuArgs"] += ["-device", "virtio-scsi-pci,id=scsi0"]
for i in range(5):
id = f"drivemdadmbasic{i}"
config["QemuDrives"] += [
{
"Id": id,
"Size": "64M",
"Options": "cache=unsafe",
}
]
config["QemuArgs"] += [
"-device", f"scsi-hd,drive={id},vendor=systemd,product=foobar,serial=deadbeefmdadm{i}",
]
json.dump(config, sys.stdout)

View File

@ -0,0 +1,25 @@
#!/usr/bin/python3
# SPDX-License-Identifier: LGPL-2.1-or-later
import json
import sys
config = json.load(sys.stdin)
config["QemuArgs"] += ["-device", "virtio-scsi-pci,id=scsi0"]
for i in range(5):
id = f"drivemdadmlvm{i}"
config["QemuDrives"] += [
{
"Id": id,
"Size": "64M",
"Options": "cache=unsafe",
}
]
config["QemuArgs"] += [
"-device", f"scsi-hd,drive={id},vendor=systemd,product=foobar,serial=deadbeefmdadmlvm{i}",
]
json.dump(config, sys.stdout)

View File

@ -0,0 +1,36 @@
#!/usr/bin/python3
# SPDX-License-Identifier: LGPL-2.1-or-later
import json
import os
import subprocess
import sys
config = json.load(sys.stdin)
qemu = f"qemu-system-{os.environ["QEMU_ARCHITECTURE"]}"
result = subprocess.run([qemu, '-device', 'help'], check=True, text=True, stdout=subprocess.PIPE)
if 'name "megasas-gen2"' not in result.stdout:
print("megasas-gen2 device driver is not available, skipping test...", file=sys.stderr)
exit(77)
for i in range(4):
config["QemuArgs"] += ['-device', f"megasas-gen2,id=scsi{i}"]
for i in range(128):
id = f"drive{i}"
config["QemuDrives"] += [
{
"Id": id,
"Size": "1M",
"Options": "cache=unsafe",
}
]
config["QemuArgs"] += [
'-device',
f"scsi-hd,drive={id},bus=scsi{i // 32}.0,channel=0,"
f"scsi-id={i % 32},lun=0",
]
json.dump(config, sys.stdout)

View File

@ -1,8 +1,37 @@
# SPDX-License-Identifier: LGPL-2.1-or-later
integration_tests += [
integration_test_template + {
'name' : fs.name(meson.current_source_dir()),
'enabled' : false,
},
name = fs.name(meson.current_source_dir())
unit = configure_file(
input : files('../test.service.in'),
output : '@0@.service'.format(name),
configuration : integration_test_template['configuration'],
)
foreach testcase : [
'btrfs_basic',
'iscsi_lvm',
'long_sysfs_path',
'lvm_basic',
'mdadm_basic',
'mdadm_lvm',
'megasas2_basic',
'multipath_basic_failover',
'nvme_basic',
'nvme_subsystem',
'simultaneous_events',
'virtio_scsi_identically_named_partitions',
]
integration_tests += [
integration_test_template + {
'name' : '@0@-@1@'.format(name, testcase),
# Make sure the service is still named TEST-64-UDEV-STORAGE.service.
'unit' : unit,
'cmdline' : integration_test_template['cmdline'] + [
'systemd.setenv=TEST_FUNCTION_NAME=testcase_@0@'.format(testcase)
],
'mkosi-args' : integration_test_template['mkosi-args'] + [
'--configure-script', files('@0@.configure'.format(testcase)),
],
},
]
endforeach

View File

@ -0,0 +1,31 @@
#!/usr/bin/python3
# SPDX-License-Identifier: LGPL-2.1-or-later
import json
import sys
config = json.load(sys.stdin)
# Add 16 multipath devices, each backed by 4 paths
# We don't use --qemu-drive for this since they have to share the file.
for ndisk in range(16):
wwn = f"0xDEADDEADBEEF{ndisk:04d}"
if ndisk == 0:
size = "16M"
else:
size = "1M"
for nback in range(4):
id = f"drive{ndisk}x{nback}"
config["QemuDrives"] += [
{
"Id": id,
"Size": size,
"Options": "cache=unsafe",
"FileId": str(ndisk),
}
]
config["QemuArgs"] += ["-device", f"scsi-hd,drive={id},serial=MPIO{ndisk},wwn={wwn}"]
json.dump(config, sys.stdout)

View File

@ -0,0 +1,42 @@
#!/usr/bin/python3
# SPDX-License-Identifier: LGPL-2.1-or-later
import json
import os
import subprocess
import sys
config = json.load(sys.stdin)
qemu = f"qemu-system-{os.environ["QEMU_ARCHITECTURE"]}"
result = subprocess.run([qemu, '-device', 'help'], check=True, text=True, stdout=subprocess.PIPE)
if 'name "nvme"' not in result.stdout:
print("nvme device driver is not available, skipping test...", file=sys.stderr)
exit(77)
for i in range(4):
config["QemuArgs"] += ["-device", f"megasas-gen2,id=scsi{i}"]
def add_drive(i: int, serial: str) -> None:
global config
id = f"nvme{i}"
config["QemuDrives"] += [
{
"Id": id,
"Size": "1M",
"Options": "cache=unsafe",
}
]
config["QemuArgs"] += ["-device", f"nvme,drive={id},serial={serial},num_queues=8"]
for i in range(5):
add_drive(i, serial=f"deadbeef{i}")
for i in range(5, 10):
add_drive(i, serial=f" deadbeef {i} ")
for i in range(10, 15):
add_drive(i, serial=f" dead/beef/{i} ")
for i in range(15, 20):
add_drive(i, serial=f"dead/../../beef/{i}")
json.dump(config, sys.stdout)

View File

@ -0,0 +1,39 @@
#!/usr/bin/python3
# SPDX-License-Identifier: LGPL-2.1-or-later
import json
import os
import subprocess
import sys
config = json.load(sys.stdin)
qemu = f"qemu-system-{os.environ["QEMU_ARCHITECTURE"]}"
result = subprocess.run([qemu, '-device', 'help'], check=True, text=True, stdout=subprocess.PIPE)
if 'name "nvme"' not in result.stdout:
print("nvme device driver is not available, skipping test...", file=sys.stderr)
exit(77)
for id in ("nvme0", "nvme1"):
config["QemuDrives"] += [
{
"Id": id,
"Size": "1M",
"Options": "cache=unsafe",
}
]
config["QemuArgs"] += [
# Create an NVM Subsystem Device
"-device", "nvme-subsys,id=nvme-subsys-64,nqn=subsys64",
# Attach two NVM controllers to it
"-device", "nvme,subsys=nvme-subsys-64,serial=deadbeef",
"-device", "nvme,subsys=nvme-subsys-64,serial=deadbeef",
# And create two shared namespaces attached to both controllers
"-device", "nvme-ns,drive=nvme0,nsid=16,shared=on",
"-device", "nvme-ns,drive=nvme1,nsid=17,shared=on",
]
json.dump(config, sys.stdout)

View File

@ -0,0 +1,21 @@
#!/usr/bin/python3
# SPDX-License-Identifier: LGPL-2.1-or-later
import json
import sys
config = json.load(sys.stdin)
for i in range(10):
id = f"drivesimultaneousevents{i}"
config["QemuDrives"] += [
{
"Id": id,
"Size": "128M",
"Options": "cache=unsafe",
}
]
config["QemuArgs"] += ["-device", f"scsi-hd,drive={id},serial=deadbeeftest{i}"]
json.dump(config, sys.stdout)

View File

@ -0,0 +1,33 @@
#!/usr/bin/python3
# SPDX-License-Identifier: LGPL-2.1-or-later
import json
import os
import subprocess
import sys
config = json.load(sys.stdin)
qemu = f"qemu-system-{os.environ["QEMU_ARCHITECTURE"]}"
result = subprocess.run([qemu, '-device', 'help'], check=True, text=True, stdout=subprocess.PIPE)
if 'name "virtio-scsi-pci"' not in result.stdout:
print("virtio-scsi-pci device driver is not available, skipping test...", file=sys.stderr)
exit(77)
num_disk = 16
config["QemuArgs"] += ["-device", "virtio-scsi-pci,id=scsi0,num_queues=4"]
for i in range(0, num_disk):
id = f"drivenamedpart{i}"
config["QemuDrives"] += [
{
"Id": id,
"Size": "40M",
"Options": "cache=unsafe"
}
]
config["QemuArgs"] += ["-device", f"scsi-hd,drive={id},bus=scsi0.0,channel=0,scsi-id=0,lun={i}"]
json.dump(config, sys.stdout)