diff options
author | Yu Watanabe <watanabe.yu+github@gmail.com> | 2022-09-01 03:48:02 +0900 |
---|---|---|
committer | Yu Watanabe <watanabe.yu+github@gmail.com> | 2022-09-21 05:58:40 +0900 |
commit | 9c126b2c92c220fb7e87591d10a4f87e1d2d6f12 (patch) | |
tree | 2964df087f522aa19d2534e4024a9ab1cf97ec3b /test | |
parent | a4cb8afb8ff82ed55ca3667e1ccee9f3757a4a20 (diff) | |
download | systemd-9c126b2c92c220fb7e87591d10a4f87e1d2d6f12.tar.gz |
test-64-udev-storage: check device units
Diffstat (limited to 'test')
-rwxr-xr-x | test/units/testsuite-64.sh | 116 |
1 files changed, 116 insertions, 0 deletions
diff --git a/test/units/testsuite-64.sh b/test/units/testsuite-64.sh index 9a2540ad0c..dccb531242 100755 --- a/test/units/testsuite-64.sh +++ b/test/units/testsuite-64.sh @@ -83,6 +83,93 @@ helper_check_udev_watch() {( done < <(find /run/udev/watch -type l) )} +check_device_unit() {( + set +x + + local log_level link links path syspath unit + + log_level="${1?}" + path="${2?}" + unit=$(systemd-escape --path --suffix=device "$path") + + syspath=$(systemctl show --value --property SysFSPath "$unit" 2>/dev/null) + if [[ -z "$syspath" ]]; then + [[ "$log_level" == 1 ]] && echo >&2 "ERROR: $unit not found." + return 1 + fi + + if [[ ! -L "$path" ]]; then + if [[ ! -d "$syspath" ]]; then + [[ "$log_level" == 1 ]] && echo >&2 "ERROR: $unit exists for $syspath but it does not exist." + return 1 + fi + return 0 + fi + + if [[ ! -b "$path" && ! -c "$path" ]]; then + [[ "$log_level" == 1 ]] && echo >&2 "ERROR: invalid file type $path" + return 1 + fi + + read -r -a links < <(udevadm info -q symlink "$syspath" 2>/dev/null) + for link in "${links[@]}"; do + if [[ "/dev/$link" == "$path" ]]; then # DEVLINKS= given by -q symlink are relative to /dev + return 0 + fi + done + + read -r -a links < <(udevadm info "$syspath" | sed -ne '/SYSTEMD_ALIAS=/ { s/^E: SYSTEMD_ALIAS=//; p }' 2>/dev/null) + for link in "${links[@]}"; do + if [[ "$link" == "$path" ]]; then # SYSTEMD_ALIAS= are absolute + return 0 + fi + done + + [[ "$log_level" == 1 ]] && echo >&2 "ERROR: $unit exists for $syspath but it does not have the corresponding DEVLINKS or SYSTEMD_ALIAS." + return 1 +)} + +check_device_units() {( + set +x + + local log_level path paths + + log_level="${1?}" + shift + paths=("$@") + + for path in "${paths[@]}"; do + if ! check_device_unit "$log_level" "$path"; then + return 1 + fi + done + + while read -r unit _; do + path=$(systemd-escape --path --unescape "$unit") + if ! check_device_unit "$log_level" "$path"; then + return 1 + fi + done < <(systemctl list-units --all --type=device --no-legend dev-* | awk '{ print $1 }' | sed -e 's/\.device$//') + + return 0 +)} + +helper_check_device_units() {( + set +x + + local i + + for ((i = 0; i < 20; i++)); do + (( i == 0 )) || sleep .5 + + if check_device_units 0 "$@"; then + return 0 + fi + done + + check_device_units 1 "$@" +)} + testcase_megasas2_basic() { lsblk -S [[ "$(lsblk --scsi --noheadings | wc -l)" -ge 128 ]] @@ -160,6 +247,7 @@ EOF "/dev/disk/by-uuid/deadbeef-dead-dead-beef-111111111111" ) udevadm wait --settle --timeout=30 "${part_links[@]}" + helper_check_device_units "${part_links[@]}" # Choose a random symlink to the failover data partition each time, for # a better coverage @@ -191,6 +279,7 @@ EOF # Make sure all symlinks are still valid udevadm wait --settle --timeout=30 "${part_links[@]}" + helper_check_device_units "${part_links[@]}" done multipath -l "$path" @@ -287,6 +376,7 @@ EOF fi done + helper_check_device_units rm -f "$rule" "$partscript" udevadm control --reload @@ -317,16 +407,19 @@ testcase_lvm_basic() { mkfs.ext4 -L mylvpart1 "/dev/$vgroup/mypart1" udevadm wait --settle --timeout="$timeout" "/dev/disk/by-label/mylvpart1" helper_check_device_symlinks "/dev/disk" "/dev/$vgroup" + helper_check_device_units # Disable the VG and check symlinks... lvm vgchange -an "$vgroup" udevadm wait --settle --timeout="$timeout" --removed "/dev/$vgroup" "/dev/disk/by-label/mylvpart1" helper_check_device_symlinks "/dev/disk" + helper_check_device_units # reenable the VG and check the symlinks again if all LVs are properly activated lvm vgchange -ay "$vgroup" udevadm wait --settle --timeout="$timeout" "/dev/$vgroup/mypart1" "/dev/$vgroup/mypart2" "/dev/disk/by-label/mylvpart1" helper_check_device_symlinks "/dev/disk" "/dev/$vgroup" + helper_check_device_units # Same as above, but now with more "stress" [[ -n "${ASAN_OPTIONS:-}" ]] && iterations=10 || iterations=50 @@ -337,6 +430,7 @@ testcase_lvm_basic() { if ((i % 5 == 0)); then udevadm wait --settle --timeout="$timeout" "/dev/$vgroup/mypart1" "/dev/$vgroup/mypart2" "/dev/disk/by-label/mylvpart1" helper_check_device_symlinks "/dev/disk" "/dev/$vgroup" + helper_check_device_units fi done @@ -345,6 +439,7 @@ testcase_lvm_basic() { udevadm wait --settle --timeout="$timeout" --removed "/dev/$vgroup/mypart1" udevadm wait --timeout=0 "/dev/$vgroup/mypart2" helper_check_device_symlinks "/dev/disk" "/dev/$vgroup" + helper_check_device_units # Create & remove LVs in a loop, i.e. with more "stress" [[ -n "${ASAN_OPTIONS:-}" ]] && iterations=8 || iterations=16 @@ -364,6 +459,7 @@ testcase_lvm_basic() { udevadm wait --settle --timeout="$timeout" --removed "/dev/$vgroup/looppart$part" done helper_check_device_symlinks "/dev/disk" "/dev/$vgroup" + helper_check_device_units fi done } @@ -383,6 +479,7 @@ testcase_btrfs_basic() { udevadm wait --settle --timeout=30 "${devices[0]}" "/dev/disk/by-uuid/$uuid" "/dev/disk/by-label/$label" btrfs filesystem show helper_check_device_symlinks + helper_check_device_units echo "Multiple devices: using partitions, data: single, metadata: raid1" uuid="deadbeef-dead-dead-beef-000000000001" @@ -400,6 +497,7 @@ EOF udevadm wait --settle --timeout=30 "/dev/disk/by-uuid/$uuid" "/dev/disk/by-label/$label" btrfs filesystem show helper_check_device_symlinks + helper_check_device_units wipefs -a -f "${devices[0]}" udevadm wait --settle --timeout=30 --removed /dev/disk/by-partlabel/diskpart{1..4} @@ -415,6 +513,7 @@ EOF udevadm wait --settle --timeout=30 "/dev/disk/by-uuid/$uuid" "/dev/disk/by-label/$label" btrfs filesystem show helper_check_device_symlinks + helper_check_device_units echo "Multiple devices: using LUKS encrypted disks, data: raid1, metadata: raid1, mixed mode" uuid="deadbeef-dead-dead-beef-000000000003" @@ -441,6 +540,7 @@ EOF systemctl start "systemd-cryptsetup@encbtrfs$i" done helper_check_device_symlinks + helper_check_device_units # Check if we have all necessary DM devices ls -l /dev/mapper/encbtrfs{0..3} # Create a multi-device btrfs filesystem on the LUKS devices @@ -453,6 +553,7 @@ EOF udevadm wait --settle --timeout=30 "/dev/disk/by-uuid/$uuid" "/dev/disk/by-label/$label" btrfs filesystem show helper_check_device_symlinks + helper_check_device_units # Mount it and write some data to it we can compare later mount -t btrfs /dev/mapper/encbtrfs0 "$mpoint" echo "hello there" >"$mpoint/test" @@ -461,6 +562,7 @@ EOF systemctl stop systemd-cryptsetup@encbtrfs{0..3} udevadm wait --settle --timeout=30 --removed "/dev/disk/by-uuid/$uuid" helper_check_device_symlinks + helper_check_device_units # Add the mount point to /etc/fstab and check if the device can be put together # automagically. The source device is the DM name of the first LUKS device # (from /etc/crypttab). We have to specify all LUKS devices manually, as @@ -477,6 +579,7 @@ EOF udevadm wait --settle --timeout=30 "/dev/disk/by-uuid/$uuid" "/dev/disk/by-label/$label" btrfs filesystem show helper_check_device_symlinks + helper_check_device_units grep "hello there" "$mpoint/test" # Cleanup systemctl stop "${mpoint##*/}.mount" @@ -525,6 +628,7 @@ testcase_iscsi_lvm() { iscsiadm --mode node --targetname "$target_name" --portal "$target_ip:$target_port" --login udevadm wait --settle --timeout=30 "${expected_symlinks[@]}" helper_check_device_symlinks + helper_check_device_units # Cleanup iscsiadm --mode node --targetname "$target_name" --portal "$target_ip:$target_port" --logout tgtadm --lld iscsi --op delete --mode target --tid=1 @@ -560,6 +664,7 @@ testcase_iscsi_lvm() { iscsiadm --mode node --targetname "$target_name" --portal "$target_ip:$target_port" --login udevadm wait --settle --timeout=30 "${expected_symlinks[@]}" helper_check_device_symlinks + helper_check_device_units # Add all iSCSI devices into a LVM volume group, create two logical volumes, # and check if necessary symlinks exist (and are valid) lvm pvcreate -y "${expected_symlinks[@]}" @@ -574,6 +679,7 @@ testcase_iscsi_lvm() { mkfs.ext4 -L mylvpart1 "/dev/$vgroup/mypart1" udevadm wait --settle --timeout=30 "/dev/disk/by-label/mylvpart1" helper_check_device_symlinks "/dev/disk" "/dev/$vgroup" + helper_check_device_units # Disconnect the iSCSI devices and check all the symlinks iscsiadm --mode node --targetname "$target_name" --portal "$target_ip:$target_port" --logout # "Reset" the DM state, since we yanked the backing storage from under the LVM, @@ -582,11 +688,13 @@ testcase_iscsi_lvm() { # The LVM and iSCSI related symlinks should be gone udevadm wait --settle --timeout=30 --removed "/dev/$vgroup" "/dev/disk/by-label/mylvpart1" "${expected_symlinks[@]}" helper_check_device_symlinks "/dev/disk" + helper_check_device_units # Reconnect the iSCSI devices and check if everything get detected correctly iscsiadm --mode discoverydb --type sendtargets --portal "$target_ip" --discover iscsiadm --mode node --targetname "$target_name" --portal "$target_ip:$target_port" --login udevadm wait --settle --timeout=30 "${expected_symlinks[@]}" "/dev/$vgroup/mypart1" "/dev/$vgroup/mypart2" "/dev/disk/by-label/mylvpart1" helper_check_device_symlinks "/dev/disk" "/dev/$vgroup" + helper_check_device_units # Cleanup iscsiadm --mode node --targetname "$target_name" --portal "$target_ip:$target_port" --logout tgtadm --lld iscsi --op delete --mode target --tid=2 @@ -687,6 +795,7 @@ testcase_mdadm_basic() { udevadm wait --settle --timeout=30 "${expected_symlinks[@]}" done helper_check_device_symlinks + helper_check_device_units # Cleanup mdadm -v --stop "$raid_dev" udevadm wait --settle --timeout=30 --removed "${expected_symlinks[@]}" @@ -715,9 +824,11 @@ testcase_mdadm_basic() { udevadm wait --settle --timeout=30 "${expected_symlinks[@]}" done helper_check_device_symlinks + helper_check_device_units # Cleanup mdadm -v --stop "$raid_dev" udevadm wait --settle --timeout=30 --removed "${expected_symlinks[@]}" + helper_check_device_units echo "Mirror + parity raid (RAID 10) + multiple partitions" raid_name="mdmirpar" @@ -763,10 +874,12 @@ EOF udevadm wait --settle --timeout=30 "${expected_symlinks[@]}" done helper_check_device_symlinks + helper_check_device_units # Cleanup mdadm -v --stop "$raid_dev" # Check if all expected symlinks were removed after the cleanup udevadm wait --settle --timeout=30 --removed "${expected_symlinks[@]}" + helper_check_device_units } testcase_mdadm_lvm() { @@ -811,15 +924,18 @@ testcase_mdadm_lvm() { mdadm -v --stop "$raid_dev" udevadm wait --settle --timeout=30 --removed "${expected_symlinks[@]}" helper_check_device_symlinks + helper_check_device_units # Reassemble it and check if all required symlinks exist mdadm --assemble "$raid_dev" --name "$raid_name" -v udevadm wait --settle --timeout=30 "${expected_symlinks[@]}" helper_check_device_symlinks + helper_check_device_units # Cleanup lvm vgchange -an "$vgroup" mdadm -v --stop "$raid_dev" # Check if all expected symlinks were removed after the cleanup udevadm wait --settle --timeout=30 --removed "${expected_symlinks[@]}" + helper_check_device_units } : >/failed |