]> git.ipfire.org Git - thirdparty/dracut.git/blobdiff - test/TEST-30-ISCSI/test.sh
test: make dracut directory configurable
[thirdparty/dracut.git] / test / TEST-30-ISCSI / test.sh
index fc4bdce9e55ff3a6fb1d38e94eb5196f54fd57a1..a3d7058a4b7e64e3a825efc5030ae15504c115a3 100755 (executable)
@@ -1,59 +1,74 @@
 #!/bin/bash
-TEST_DESCRIPTION="root filesystem over iSCSI"
 
-KVERSION=${KVERSION-$(uname -r)}
+# shellcheck disable=SC2034
+TEST_DESCRIPTION="root filesystem over iSCSI with $USE_NETWORK"
 
-DEBUGFAIL="loglevel=1"
 #DEBUGFAIL="rd.shell rd.break rd.debug loglevel=7 "
-#DEBUGFAIL="rd.debug loglevel=7 "
 #SERVER_DEBUG="rd.debug loglevel=7"
-SERIAL="tcp:127.0.0.1:9999"
-SERIAL="null"
+#SERIAL="tcp:127.0.0.1:9999"
 
 run_server() {
     # Start server first
     echo "iSCSI TEST SETUP: Starting DHCP/iSCSI server"
 
-    $testdir/run-qemu \
-        -drive format=raw,index=0,media=disk,file=$TESTDIR/server.ext3 \
-        -drive format=raw,index=1,media=disk,file=$TESTDIR/root.ext3 \
-        -drive format=raw,index=2,media=disk,file=$TESTDIR/iscsidisk2.img \
-        -drive format=raw,index=3,media=disk,file=$TESTDIR/iscsidisk3.img \
-        -m 512M  -smp 2 \
-        -display none \
-        -serial $SERIAL \
+    declare -a disk_args=()
+    declare -i disk_index=0
+    qemu_add_drive_args disk_index disk_args "$TESTDIR"/server.img serverroot 0 1
+    qemu_add_drive_args disk_index disk_args "$TESTDIR"/singleroot.img singleroot
+    qemu_add_drive_args disk_index disk_args "$TESTDIR"/raid0-1.img raid0-1
+    qemu_add_drive_args disk_index disk_args "$TESTDIR"/raid0-2.img raid0-2
+
+    "$testdir"/run-qemu \
+        "${disk_args[@]}" \
+        -serial "${SERIAL:-"file:$TESTDIR/server.log"}" \
         -net nic,macaddr=52:54:00:12:34:56,model=e1000 \
         -net nic,macaddr=52:54:00:12:34:57,model=e1000 \
         -net socket,listen=127.0.0.1:12330 \
-        -append "root=/dev/sda rootfstype=ext3 rw console=ttyS0,115200n81 selinux=0 $SERVER_DEBUG" \
-        -initrd $TESTDIR/initramfs.server \
-        -pidfile $TESTDIR/server.pid -daemonize || return 1
-    sudo chmod 644 $TESTDIR/server.pid || return 1
+        -append "panic=1 oops=panic softlockup_panic=1 quiet root=/dev/disk/by-id/ata-disk_serverroot rootfstype=ext4 rw console=ttyS0,115200n81 selinux=0 $SERVER_DEBUG" \
+        -initrd "$TESTDIR"/initramfs.server \
+        -pidfile "$TESTDIR"/server.pid -daemonize || return 1
+    chmod 644 "$TESTDIR"/server.pid || return 1
 
     # Cleanup the terminal if we have one
     tty -s && stty sane
 
-    echo Sleeping 10 seconds to give the server a head start
-    sleep 10
+    if ! [[ $SERIAL ]]; then
+        while :; do
+            grep Serving "$TESTDIR"/server.log && break
+            echo "Waiting for the server to startup"
+            tail "$TESTDIR"/server.log
+            sleep 1
+        done
+    else
+        echo Sleeping 10 seconds to give the server a head start
+        sleep 10
+    fi
+
 }
 
 run_client() {
-    local test_name=$1; shift
+    local test_name=$1
+    shift
     echo "CLIENT TEST START: $test_name"
 
-    dd if=/dev/zero of=$TESTDIR/client.img bs=1M count=1
+    declare -a disk_args=()
+    declare -i disk_index=0
+    qemu_add_drive_args disk_index disk_args "$TESTDIR"/marker.img marker
 
-    $testdir/run-qemu \
-        -drive format=raw,index=0,media=disk,file=$TESTDIR/client.img \
-        -m 512M -smp 2 -nographic \
+    test_marker_reset
+    "$testdir"/run-qemu \
+        "${disk_args[@]}" \
         -net nic,macaddr=52:54:00:12:34:00,model=e1000 \
         -net nic,macaddr=52:54:00:12:34:01,model=e1000 \
         -net socket,connect=127.0.0.1:12330 \
-        -append "rw rd.auto rd.retry=50 console=ttyS0,115200n81 selinux=0 rd.debug=0 $DEBUGFAIL $*" \
-        -initrd $TESTDIR/initramfs.testing
-    if ! grep -F -m 1 -q iscsi-OK $TESTDIR/client.img; then
-       echo "CLIENT TEST END: $test_name [FAILED - BAD EXIT]"
-       return 1
+        -acpitable file=ibft.table \
+        -append "$*" \
+        -initrd "$TESTDIR"/initramfs.testing
+
+    # shellcheck disable=SC2181
+    if [[ $? -ne 0 ]] || ! test_marker_check iscsi-OK; then
+        echo "CLIENT TEST END: $test_name [FAILED - BAD EXIT]"
+        return 1
     fi
 
     echo "CLIENT TEST END: $test_name [OK]"
@@ -64,60 +79,31 @@ do_test_run() {
     initiator=$(iscsi-iname)
 
     run_client "root=dhcp" \
-               "root=/dev/root netroot=dhcp ip=ens3:dhcp" \
-               "rd.iscsi.initiator=$initiator" \
+        "root=/dev/root netroot=dhcp ip=enp0s1:dhcp" \
+        "rd.iscsi.initiator=$initiator" \
         || return 1
 
-    run_client "netroot=iscsi target0"\
-               "root=LABEL=singleroot netroot=iscsi:192.168.50.1::::iqn.2009-06.dracut:target0" \
-               "ip=192.168.50.101::192.168.50.1:255.255.255.0:iscsi-1:ens3:off" \
-               "rd.iscsi.firmware" \
-               "rd.iscsi.initiator=$initiator" \
+    run_client "netroot=iscsi target0" \
+        "root=LABEL=singleroot netroot=iscsi:192.168.50.1::::iqn.2009-06.dracut:target0" \
+        "ip=192.168.50.101::192.168.50.1:255.255.255.0:iscsi-1:enp0s1:off" \
+        "rd.iscsi.initiator=$initiator" \
         || return 1
 
     run_client "netroot=iscsi target1 target2" \
-               "root=LABEL=sysroot" \
-               "ip=192.168.50.101:::255.255.255.0::ens3:off" \
-               "ip=192.168.51.101:::255.255.255.0::ens4:off" \
-               "netroot=iscsi:192.168.51.1::::iqn.2009-06.dracut:target1" \
-               "netroot=iscsi:192.168.50.1::::iqn.2009-06.dracut:target2" \
-               "rd.iscsi.firmware" \
-               "rd.iscsi.initiator=$initiator" \
+        "root=LABEL=sysroot" \
+        "ip=dhcp" \
+        "netroot=iscsi:192.168.51.1::::iqn.2009-06.dracut:target1" \
+        "netroot=iscsi:192.168.50.1::::iqn.2009-06.dracut:target2" \
+        "rd.iscsi.initiator=$initiator" \
         || return 1
 
-    run_client "netroot=iscsi target1 target2 rd.iscsi.waitnet=0" \
-              "root=LABEL=sysroot" \
-               "ip=192.168.50.101:::255.255.255.0::ens3:off" \
-               "ip=192.168.51.101:::255.255.255.0::ens4:off" \
-              "netroot=iscsi:192.168.51.1::::iqn.2009-06.dracut:target1" \
-               "netroot=iscsi:192.168.50.1::::iqn.2009-06.dracut:target2" \
-               "rd.iscsi.firmware" \
-               "rd.iscsi.initiator=$initiator" \
-               "rd.iscsi.waitnet=0" \
-       || return 1
-
-    run_client "netroot=iscsi target1 target2 rd.iscsi.waitnet=0 rd.iscsi.testroute=0" \
-              "root=LABEL=sysroot" \
-               "ip=192.168.50.101:::255.255.255.0::ens3:off" \
-               "ip=192.168.51.101:::255.255.255.0::ens4:off" \
-              "netroot=iscsi:192.168.51.1::::iqn.2009-06.dracut:target1" \
-               "netroot=iscsi:192.168.50.1::::iqn.2009-06.dracut:target2" \
-               "rd.iscsi.firmware" \
-               "rd.iscsi.initiator=$initiator" \
-               "rd.iscsi.waitnet=0 rd.iscsi.testroute=0" \
-       || return 1
-
-    run_client "netroot=iscsi target1 target2 rd.iscsi.waitnet=0 rd.iscsi.testroute=0 default GW" \
-              "root=LABEL=sysroot" \
-               "ip=192.168.50.101::192.168.50.1:255.255.255.0::ens3:off" \
-               "ip=192.168.51.101::192.168.51.1:255.255.255.0::ens4:off" \
-              "netroot=iscsi:192.168.51.1::::iqn.2009-06.dracut:target1" \
-               "netroot=iscsi:192.168.50.1::::iqn.2009-06.dracut:target2" \
-               "rd.iscsi.firmware" \
-               "rd.iscsi.initiator=$initiator" \
-               "rd.iscsi.waitnet=0 rd.iscsi.testroute=0" \
-       || return 1
+    run_client "root=ibft" \
+        "root=LABEL=singleroot" \
+        "rd.iscsi.ibft=1" \
+        "rd.iscsi.firmware=1" \
+        || return 1
 
+    echo "All tests passed [OK]"
     return 0
 }
 
@@ -129,157 +115,126 @@ test_run() {
     do_test_run
     ret=$?
     if [[ -s $TESTDIR/server.pid ]]; then
-        sudo kill -TERM $(cat $TESTDIR/server.pid)
-        rm -f -- $TESTDIR/server.pid
+        kill -TERM "$(cat "$TESTDIR"/server.pid)"
+        rm -f -- "$TESTDIR"/server.pid
     fi
     return $ret
 }
 
-test_setup() {
-    if [ ! -x /usr/sbin/iscsi-target ]; then
-        echo "Need iscsi-target from netbsd-iscsi"
+test_check() {
+    if ! command -v tgtd &> /dev/null || ! command -v tgtadm &> /dev/null; then
+        echo "Need tgtd and tgtadm from scsi-target-utils"
         return 1
     fi
+}
 
-    # Create the blank file to use as a root filesystem
-    dd if=/dev/null of=$TESTDIR/root.ext3 bs=1M seek=20
-    dd if=/dev/null of=$TESTDIR/iscsidisk2.img bs=1M seek=20
-    dd if=/dev/null of=$TESTDIR/iscsidisk3.img bs=1M seek=20
-
-    kernel=$KVERSION
-    # Create what will eventually be our root filesystem onto an overlay
-    (
-        export initdir=$TESTDIR/overlay/source
-        . $basedir/dracut-init.sh
-        (
-            cd "$initdir"
-            mkdir -p -- dev sys proc etc var/run tmp
-            mkdir -p root usr/bin usr/lib usr/lib64 usr/sbin
-            for i in bin sbin lib lib64; do
-                ln -sfnr usr/$i $i
-            done
-            mkdir -p -- var/lib/nfs/rpc_pipefs
-        )
-        inst_multiple sh shutdown poweroff stty cat ps ln ip \
-            mount dmesg mkdir cp ping grep setsid
-        for _terminfodir in /lib/terminfo /etc/terminfo /usr/share/terminfo; do
-            [ -f ${_terminfodir}/l/linux ] && break
-        done
-        inst_multiple -o ${_terminfodir}/l/linux
-        inst_simple /etc/os-release
-        inst ./client-init.sh /sbin/init
-        cp -a /etc/ld.so.conf* $initdir/etc
-        sudo ldconfig -r "$initdir"
-    )
-
-    # second, install the files needed to make the root filesystem
-    (
-        export initdir=$TESTDIR/overlay
-        . $basedir/dracut-init.sh
-        inst_multiple sfdisk mkfs.ext3 poweroff cp umount setsid
-        inst_hook initqueue 01 ./create-root.sh
-        inst_hook initqueue/finished 01 ./finished-false.sh
-        inst_simple ./99-idesymlinks.rules /etc/udev/rules.d/99-idesymlinks.rules
-    )
+test_setup() {
+    # Create what will eventually be the client root filesystem onto an overlay
+    "$DRACUT" -l --keep --tmpdir "$TESTDIR" \
+        -m "test-root" \
+        -i ./client-init.sh /sbin/init \
+        -I "ip ping grep setsid" \
+        -i "${basedir}/modules.d/99base/dracut-lib.sh" "/lib/dracut-lib.sh" \
+        -i "${basedir}/modules.d/99base/dracut-dev-lib.sh" "/lib/dracut-dev-lib.sh" \
+        --no-hostonly --no-hostonly-cmdline --nohardlink \
+        -f "$TESTDIR"/initramfs.root "$KVERSION" || return 1
+    mkdir -p "$TESTDIR"/overlay/source && mv "$TESTDIR"/dracut.*/initramfs/* "$TESTDIR"/overlay/source && rm -rf "$TESTDIR"/dracut.*
+
+    mkdir -p -- "$TESTDIR"/overlay/source/var/lib/nfs/rpc_pipefs
 
     # create an initramfs that will create the target root filesystem.
     # We do it this way so that we do not risk trashing the host mdraid
     # devices, volume groups, encrypted partitions, etc.
-    $basedir/dracut.sh -l -i $TESTDIR/overlay / \
-        -m "dash crypt lvm mdraid udev-rules base rootfs-block fs-lib kernel-modules" \
-        -d "piix ide-gd_mod ata_piix ext3 sd_mod" \
+    "$DRACUT" -l -i "$TESTDIR"/overlay / \
+        -m "test-makeroot crypt lvm mdraid" \
+        -I "mkfs.ext4 setsid blockdev" \
+        -i ./create-client-root.sh /lib/dracut/hooks/initqueue/01-create-client-root.sh \
         --no-hostonly-cmdline -N \
-        -f $TESTDIR/initramfs.makeroot $KVERSION || return 1
-    rm -rf -- $TESTDIR/overlay
+        -f "$TESTDIR"/initramfs.makeroot "$KVERSION" || return 1
+    rm -rf -- "$TESTDIR"/overlay
 
+    declare -a disk_args=()
+    declare -i disk_index=0
+    qemu_add_drive_args disk_index disk_args "$TESTDIR"/marker.img marker 1
+    qemu_add_drive_args disk_index disk_args "$TESTDIR"/singleroot.img singleroot 200
+    qemu_add_drive_args disk_index disk_args "$TESTDIR"/raid0-1.img raid0-1 100
+    qemu_add_drive_args disk_index disk_args "$TESTDIR"/raid0-2.img raid0-2 100
 
-    # Need this so kvm-qemu will boot (needs non-/dev/zero local disk)
-    if ! dd if=/dev/null of=$TESTDIR/client.img bs=1M seek=1; then
-        echo "Unable to make client sdb image" 1>&2
-        return 1
-    fi
     # Invoke KVM and/or QEMU to actually create the target filesystem.
-    $testdir/run-qemu \
-        -drive format=raw,index=0,media=disk,file=$TESTDIR/root.ext3 \
-        -drive format=raw,index=1,media=disk,file=$TESTDIR/client.img \
-        -drive format=raw,index=2,media=disk,file=$TESTDIR/iscsidisk2.img \
-        -drive format=raw,index=3,media=disk,file=$TESTDIR/iscsidisk3.img \
-        -smp 2 -m 256M -nographic -net none \
-        -append "root=/dev/fakeroot rw rootfstype=ext3 quiet console=ttyS0,115200n81 selinux=0" \
-        -initrd $TESTDIR/initramfs.makeroot  || return 1
-    grep -F -m 1 -q dracut-root-block-created $TESTDIR/client.img || return 1
-    rm -- $TESTDIR/client.img
-    (
-        export initdir=$TESTDIR/overlay
-        . $basedir/dracut-init.sh
-        inst_multiple poweroff shutdown
-        inst_hook emergency 000 ./hard-off.sh
-        inst_simple ./99-idesymlinks.rules /etc/udev/rules.d/99-idesymlinks.rules
-    )
-    sudo $basedir/dracut.sh -l -i $TESTDIR/overlay / \
-        -o "dash plymouth dmraid nfs" \
-        -a "debug" \
-        -d "af_packet piix ide-gd_mod ata_piix ext3 sd_mod" \
+    "$testdir"/run-qemu \
+        "${disk_args[@]}" \
+        -append "root=/dev/fakeroot rw rootfstype=ext4 quiet console=ttyS0,115200n81 selinux=0" \
+        -initrd "$TESTDIR"/initramfs.makeroot || return 1
+    test_marker_check dracut-root-block-created || return 1
+    rm -- "$TESTDIR"/marker.img
+
+    # Create what will eventually be the server root filesystem onto an overlay
+    "$DRACUT" -l --keep --tmpdir "$TESTDIR" \
+        -m "test-root network network-legacy" \
+        -d "iscsi_tcp crc32c ipv6" \
+        -i ./server-init.sh /sbin/init \
+        -i "${basedir}/modules.d/99base/dracut-lib.sh" "/lib/dracut-lib.sh" \
+        -i "${basedir}/modules.d/99base/dracut-dev-lib.sh" "/lib/dracut-dev-lib.sh" \
+        -I "modprobe chmod ip ping tcpdump setsid pidof tgtd tgtadm /etc/passwd" \
+        --install-optional "/etc/netconfig dhcpd /etc/group /etc/nsswitch.conf /etc/rpc /etc/protocols /etc/services /usr/etc/nsswitch.conf /usr/etc/rpc /usr/etc/protocols /usr/etc/services" \
+        -i "./hosts" "/etc/hosts" \
+        -i "./dhcpd.conf" "/etc/dhcpd.conf" \
+        --no-hostonly --no-hostonly-cmdline --nohardlink \
+        -f "$TESTDIR"/initramfs.root "$KVERSION" || return 1
+    mkdir -p "$TESTDIR"/overlay/source && mv "$TESTDIR"/dracut.*/initramfs/* "$TESTDIR"/overlay/source && rm -rf "$TESTDIR"/dracut.*
+
+    mkdir -p "$TESTDIR"/overlay/source/var/lib/dhcpd
+
+    # second, install the files needed to make the root filesystem
+    # create an initramfs that will create the target root filesystem.
+    # We do it this way so that we do not risk trashing the host mdraid
+    # devices, volume groups, encrypted partitions, etc.
+    "$DRACUT" -l -i "$TESTDIR"/overlay / \
+        -m "test-makeroot" \
+        -I "mkfs.ext4" \
+        -i ./create-server-root.sh /lib/dracut/hooks/initqueue/01-create-server-root.sh \
+        --nomdadmconf \
         --no-hostonly-cmdline -N \
-        -f $TESTDIR/initramfs.testing $KVERSION || return 1
-
-    # Make server root
-    dd if=/dev/null of=$TESTDIR/server.ext3 bs=1M seek=60
-    mkfs.ext3 -j -F $TESTDIR/server.ext3
-    mkdir $TESTDIR/mnt
-    sudo mount -o loop $TESTDIR/server.ext3 $TESTDIR/mnt
-
-    kernel=$KVERSION
-    (
-        export initdir=$TESTDIR/mnt
-        . $basedir/dracut-init.sh
-        (
-            cd "$initdir";
-            mkdir -p dev sys proc etc var/run tmp var/lib/dhcpd /etc/iscsi
-        )
-        inst /etc/passwd /etc/passwd
-        inst_multiple sh ls shutdown poweroff stty cat ps ln ip \
-            dmesg mkdir cp ping \
-            modprobe tcpdump setsid \
-            /etc/services sleep mount chmod
-        inst_multiple tgtd tgtadm
-        for _terminfodir in /lib/terminfo /etc/terminfo /usr/share/terminfo; do
-            [ -f ${_terminfodir}/l/linux ] && break
-        done
-        inst_multiple -o ${_terminfodir}/l/linux
-        instmods iscsi_tcp crc32c ipv6
-        [ -f /etc/netconfig ] && inst_multiple /etc/netconfig
-        type -P dhcpd >/dev/null && inst_multiple dhcpd
-        [ -x /usr/sbin/dhcpd3 ] && inst /usr/sbin/dhcpd3 /usr/sbin/dhcpd
-        inst_simple /etc/os-release
-        inst ./server-init.sh /sbin/init
-        inst ./hosts /etc/hosts
-        inst ./dhcpd.conf /etc/dhcpd.conf
-        inst_multiple /etc/nsswitch.conf /etc/rpc /etc/protocols
-        inst /etc/group /etc/group
-
-        cp -a /etc/ld.so.conf* $initdir/etc
-        sudo ldconfig -r "$initdir"
-        dracut_kernel_post
-    )
-
-    sudo umount $TESTDIR/mnt
-    rm -fr -- $TESTDIR/mnt
+        -f "$TESTDIR"/initramfs.makeroot "$KVERSION" || return 1
+    rm -rf -- "$TESTDIR"/overlay
+
+    declare -a disk_args=()
+    # shellcheck disable=SC2034
+    declare -i disk_index=0
+    qemu_add_drive_args disk_index disk_args "$TESTDIR"/marker.img marker 1
+    qemu_add_drive_args disk_index disk_args "$TESTDIR"/server.img root 240
+
+    # Invoke KVM and/or QEMU to actually create the target filesystem.
+    "$testdir"/run-qemu \
+        "${disk_args[@]}" \
+        -append "root=/dev/dracut/root rw rootfstype=ext4 quiet console=ttyS0,115200n81 selinux=0" \
+        -initrd "$TESTDIR"/initramfs.makeroot || return 1
+    test_marker_check dracut-root-block-created || return 1
+    rm -- "$TESTDIR"/marker.img
 
     # Make server's dracut image
-    $basedir/dracut.sh -l -i $TESTDIR/overlay / \
-        -a "dash udev-rules base rootfs-block fs-lib debug kernel-modules" \
-        -d "af_packet piix ide-gd_mod ata_piix ext3 sd_mod e1000 drbg" \
+    "$DRACUT" -l \
+        -a "dash rootfs-block test kernel-modules network network-legacy" \
+        -d "piix ide-gd_mod ata_piix ext4 sd_mod e1000 drbg" \
+        -i "./server.link" "/etc/systemd/network/01-server.link" \
+        -i ./wait-if-server.sh /lib/dracut/hooks/pre-mount/99-wait-if-server.sh \
         --no-hostonly-cmdline -N \
-        -f $TESTDIR/initramfs.server $KVERSION || return 1
-
+        -f "$TESTDIR"/initramfs.server "$KVERSION" || return 1
+
+    # Make client's dracut image
+    test_dracut \
+        --add "$USE_NETWORK" \
+        --include "./client.link" "/etc/systemd/network/01-client.link" \
+        --kernel-cmdline "rw rd.auto rd.retry=50" \
+        "$TESTDIR"/initramfs.testing
 }
 
 test_cleanup() {
     if [[ -s $TESTDIR/server.pid ]]; then
-        sudo kill -TERM $(cat $TESTDIR/server.pid)
-        rm -f -- $TESTDIR/server.pid
+        kill -TERM "$(cat "$TESTDIR"/server.pid)"
+        rm -f -- "$TESTDIR"/server.pid
     fi
 }
 
-. $testdir/test-functions
+# shellcheck disable=SC1090
+. "$testdir"/test-functions