kmod
knot
less
+ lvm2
man
+ mdadm
mtools
nano
nftables
iputils
linux
man-db
+ multipath-tools
+ open-iscsi
openbsd-netcat
openssh
openssl
shadow
squashfs-tools
stress
+ tgt
tpm2-tools
tpm2-tss
vim
bind-utils
bpftool
cryptsetup
+ device-mapper-event
+ device-mapper-multipath
dfuzzer
dhcp-server
dnf
iproute
iproute-tc
iputils
+ iscsi-initiator-utils
kernel-core
+ kernel-modules # For squashfs and megasas2
libasan
libcap-ng-utils
libubsan
[Content]
Packages=
rpmautospec-rpm-macros
- kernel-modules # For squashfs
libtss2-tcti-device0
locales
man-db
+ multipath-tools
netcat-openbsd
+ open-iscsi
openssh-client
openssh-server
passwd
sbsigntool
squashfs-tools
stress
+ tgt
tpm2-tools
tzdata
xxd
[Match]
Distribution=debian
+
+[Content]
+Packages=
+ linux-image-generic
+++ /dev/null
-# SPDX-License-Identifier: LGPL-2.1-or-later
-
-[Match]
-Architecture=x86-64
-
-[Content]
-Packages=
- linux-image-cloud-amd64
+++ /dev/null
-# SPDX-License-Identifier: LGPL-2.1-or-later
-
-[Match]
-Architecture=arm64
-
-[Content]
-Packages=
- linux-image-cloud-arm64
Packages=
btrfs-progs
compsize
- f2fs-tools
dnf5
+ f2fs-tools
+ scsi-target-utils
InitrdPackages=
btrfs-progs
libasan8
libkmod2
libubsan1
+ multipath-tools
+ open-iscsi
openssh-clients
openssh-server
pam
sed
shadow
squashfs
+ tgt
timezone
tpm2.0-tools
user(bin)
--- /dev/null
+# SPDX-License-Identifier: LGPL-2.1-or-later
+
+iscsid.startup = /usr/bin/systemctl start iscsid.socket
--- /dev/null
+#!/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)
--- /dev/null
+#!/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)
--- /dev/null
+#!/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)
--- /dev/null
+#!/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)
--- /dev/null
+#!/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)
--- /dev/null
+#!/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)
--- /dev/null
+#!/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)
# 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
--- /dev/null
+#!/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)
--- /dev/null
+#!/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)
--- /dev/null
+#!/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)
--- /dev/null
+#!/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)
--- /dev/null
+#!/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)