]> git.ipfire.org Git - thirdparty/dracut.git/commitdiff
fix(test): improve test 60
authorBeniamino Galvani <bgalvani@redhat.com>
Tue, 7 Feb 2023 14:28:57 +0000 (15:28 +0100)
committerAntonio Álvarez Feijoo <antonio.feijoo@suse.com>
Mon, 13 Feb 2023 07:53:39 +0000 (08:53 +0100)
The test has the following issues:

 - it sets up a bridge on net1 and net2, however those interfaces
   are part of the same qemu hub and this causes switching loops;

 - the bonds are created on two interfaces but only one has a DHCP server, and
   this causes random failures;

 - the checks performed on the client are pretty limited.

Rework the test:

 - avoid the bridging loop;

 - update the topology to use a bond interface on the server side;

 - introduce additional checks on the client: start a ping and check that ports
   are properly attached to bonds and bridge;

 - make it possible to return module-specific information from the client; in
   the future this can be added for example to check that the NetworkManager or
   systemd-networkd configuration is correct.

test/TEST-60-BONDBRIDGEVLANIFCFG/client-init.sh
test/TEST-60-BONDBRIDGEVLANIFCFG/exports
test/TEST-60-BONDBRIDGEVLANIFCFG/server-init.sh
test/TEST-60-BONDBRIDGEVLANIFCFG/test.sh

index b0851116ca5b49d60a50797616bfd33cd7debc2b..b1d1db4e27abeaf869e431298b5e6d62e24f175e 100755 (executable)
@@ -8,13 +8,55 @@ export PS1='initramfs-test:\w\$ '
 stty sane
 echo "made it to the rootfs! Powering down."
 
+testnum=$(grep -Eo "rd.dracut.test.num=[^[:space:]]+" /proc/cmdline | sed -nr 's/.*=(.*)/\1/p')
+netmodule=$(grep -Eo "rd.dracut.test.net-module=[^[:space:]]+" /proc/cmdline | sed -nr 's/.*=(.*)/\1/p')
+
 (
     echo OK
+
     ip -o -4 address show scope global | while read -r _ if rest; do echo "$if"; done | sort
-    for i in /run/initramfs/state/etc/sysconfig/network-scripts/ifcfg-*; do
-        echo "$i"
-        grep -v 'UUID=' "$i"
-    done
+
+    case "$testnum" in
+        1)
+            ping -c 2 192.168.50.1 > /dev/null
+            echo PING1=$?
+            ping -c 2 192.168.54.1 > /dev/null
+            echo PING2=$?
+            ping -c 2 192.168.55.1 > /dev/null
+            echo PING3=$?
+            ping -c 2 192.168.56.1 > /dev/null
+            echo PING4=$?
+            ping -c 2 192.168.57.1 > /dev/null
+            echo PING5=$?
+            ;;
+        2)
+            ping -c 2 192.168.51.1 > /dev/null
+            echo PING1=$?
+            ip link show net3 | grep "master bond0" > /dev/null
+            echo NET3=$?
+            ip link show net4 | grep "master bond0" > /dev/null
+            echo NET4=$?
+            ;;
+        3)
+            ping -c 2 192.168.51.1 > /dev/null
+            echo PING1=$?
+            ip link show net1 | grep "master br0" > /dev/null
+            echo NET1=$?
+            ip link show net5 | grep "master br0" > /dev/null
+            echo NET5=$?
+
+            ;;
+    esac
+
+    case "$netmodule" in
+        network-legacy)
+            for i in /run/initramfs/state/etc/sysconfig/network-scripts/ifcfg-*; do
+                basename "$i"
+                grep -v 'UUID=' "$i"
+            done
+            ;;
+    esac
+
     echo EOF
 ) | dd oflag=direct,dsync of=/dev/sda
 
index ff5f29b1bc9af510d81b9816654a8e90c5572de6..9c07923f3c93929de40d0727b0b03c06052a89d4 100644 (file)
@@ -1 +1 @@
-/nfs/client    192.168.50.0/24(rw,insecure,no_subtree_check,no_root_squash)
+/nfs/client    192.168.50.0/24(rw,insecure,no_subtree_check,no_root_squash) 192.168.51.0/24(rw,insecure,no_subtree_check,no_root_squash)
index c125d0f4a34f77c1793337098f20c1939c266979..3b0f55e2261269ecf7ca9a89fbef7326c0fc22d5 100755 (executable)
@@ -64,13 +64,16 @@ ip link set dev enx525401123457 name net2
 ip link set dev enx525401123458 name net3
 ip link set dev enx525401123459 name net4
 
-modprobe --all -b -q 8021q ipvlan macvlan
+modprobe --all -b -q 8021q bonding
 : > /dev/watchdog
+
 ip addr add 127.0.0.1/8 dev lo
 linkup lo
+
 ip addr add 192.168.50.1/24 dev net1
 linkup net1
 : > /dev/watchdog
+
 ip link add dev net2.1 link net2 type vlan id 1
 ip link add dev net2.2 link net2 type vlan id 2
 ip link add dev net2.3 link net2 type vlan id 3
@@ -84,9 +87,15 @@ ip link set dev net2.1 up
 ip link set dev net2.2 up
 ip link set dev net2.3 up
 ip link set dev net2.4 up
-ip addr add 192.168.51.1/24 dev net3
-linkup net3
-linkup net4
+
+ip link add bond0 type bond
+ip link set net3 master bond0
+ip link set net4 master bond0
+ip link set net3 up
+ip link set net4 up
+ip link set bond0 up
+ip addr add 192.168.51.1/24 dev bond0
+
 : > /dev/watchdog
 modprobe af_packet
 : > /dev/watchdog
@@ -117,7 +126,7 @@ exportfs -r
 : > /dev/watchdog
 chmod 777 /var/lib/dhcpd/dhcpd.leases
 : > /dev/watchdog
-dhcpd -cf /etc/dhcpd.conf -lf /var/lib/dhcpd/dhcpd.leases net1 net3
+dhcpd -cf /etc/dhcpd.conf -lf /var/lib/dhcpd/dhcpd.leases net1 bond0
 #echo -n 'V' : > /dev/watchdog
 #sh -i
 #tcpdump -i net1
index ac33ba9f8bcff3cdb030cb6b859e9b2093c3a3b0..5da968fea5251b9c601f2ef7816504a90eb958fa 100755 (executable)
@@ -11,9 +11,28 @@ KVERSION=${KVERSION-$(uname -r)}
 
 # Uncomment this to debug failures
 #DEBUGFAIL="rd.shell rd.break"
-#DEBUGFAIL="rd.shell rd.break rd.debug"
 #SERIAL="tcp:127.0.0.1:9999"
 
+# Network topology:
+#
+#  .---------------------.    .---------------.
+#  |      SERVER-VM      |    |   CLIENT-VM   |
+#  |                     |    |               |
+#  |    (DHCP) net1  <------------>  net1     |
+#  |                     |    |               |
+#  |           net2  <------------>  net2     |
+#  |   vlan 1 <-|        |    |               |
+#  |   vlan 2 <-|        |    |               |
+#  |   vlan 3 <-|        |    |               |
+#  |   vlan 4 <-.        |    |               |
+#  |                     |    |               |
+#  |         / net3  <------------>  net3     |
+#  |  bond0 |            |    |               |
+#  |  (DHCP) \ net4  <------------>  net4     |
+#  |                     |    |               |
+#  |                     |  X----->  net5     |
+#  .---------------------.    .---------------.
+
 run_server() {
     # Start server first
     echo "MULTINIC TEST SETUP: Starting DHCP/NFS server"
@@ -53,36 +72,24 @@ run_server() {
 
 client_test() {
     local test_name="$1"
-    local do_vlan13="$2"
-    local cmdline="$3"
-    local check="$4"
+    local cmdline="$2"
+    local check="$3"
     local CONF
 
     echo "CLIENT TEST START: $test_name"
 
-    [ "$do_vlan13" != "yes" ] && unset do_vlan13
-
     # Need this so kvm-qemu will boot (needs non-/dev/zero local disk)
     if ! dd if=/dev/zero of="$TESTDIR"/client.img bs=1M count=1; then
         echo "Unable to make client sda image" 1>&2
         return 1
     fi
-    if [[ $do_vlan13 ]]; then
-        nic1=("-netdev" "socket,connect=127.0.0.1:12371,id=n1")
-        nic3=("-netdev" "socket,connect=127.0.0.1:12373,id=n3")
-    else
-        nic1=("-netdev" "hubport,id=n1,hubid=2")
-        nic3=("-netdev" "hubport,id=n3,hubid=3")
-    fi
 
     "$testdir"/run-qemu \
-        -netdev socket,connect=127.0.0.1:12370,id=s1 \
-        -netdev hubport,hubid=1,id=h1,netdev=s1 \
-        -netdev hubport,hubid=1,id=h2 -device virtio-net-pci,mac=52:54:00:12:34:01,netdev=h2 \
-        -netdev hubport,hubid=1,id=h3 -device virtio-net-pci,mac=52:54:00:12:34:02,netdev=h3 \
-        "${nic1[@]}" -device virtio-net-pci,mac=52:54:00:12:34:03,netdev=n1 \
-        -netdev socket,connect=127.0.0.1:12372,id=n2 -device virtio-net-pci,mac=52:54:00:12:34:04,netdev=n2 \
-        "${nic3[@]}" -device virtio-net-pci,mac=52:54:00:12:34:05,netdev=n3 \
+        -netdev socket,connect=127.0.0.1:12370,id=n1 -device virtio-net-pci,mac=52:54:00:12:34:01,netdev=n1 \
+        -netdev socket,connect=127.0.0.1:12371,id=n2 -device virtio-net-pci,mac=52:54:00:12:34:02,netdev=n2 \
+        -netdev socket,connect=127.0.0.1:12372,id=n3 -device virtio-net-pci,mac=52:54:00:12:34:03,netdev=n3 \
+        -netdev socket,connect=127.0.0.1:12373,id=n4 -device virtio-net-pci,mac=52:54:00:12:34:04,netdev=n4 \
+        -netdev hubport,id=n5,hubid=1 -device virtio-net-pci,mac=52:54:00:12:34:05,netdev=n5 \
         -hda "$TESTDIR"/client.img \
         -device i6300esb -watchdog-action poweroff \
         -append "
@@ -92,7 +99,7 @@ client_test() {
         ifname=net3:52:54:00:12:34:03
         ifname=net4:52:54:00:12:34:04
         ifname=net5:52:54:00:12:34:05
-        $cmdline rd.net.timeout.dhcp=30 systemd.crash_reboot rd.debug
+        $cmdline rd.net.timeout.dhcp=30 systemd.crash_reboot
         $DEBUGFAIL rd.retry=5 rw console=ttyS0,115200n81 selinux=0 init=/sbin/init" \
         -initrd "$TESTDIR"/initramfs.testing || return 1
 
@@ -134,66 +141,64 @@ test_run() {
 }
 
 test_client() {
-    if [[ $NM ]]; then
-        EXPECT='net1 net3.0004 net3.3 vlan0001 vlan2 /run/initramfs/state/etc/sysconfig/network-scripts/ifcfg-* EOF '
-    else
-        EXPECT='net1 net3.0004 net3.3 vlan0001 vlan2 /run/initramfs/state/etc/sysconfig/network-scripts/ifcfg-net1 # Generated by dracut initrd NAME="net1" HWADDR="52:54:00:12:34:01" DEVICE="net1" ONBOOT=yes NETBOOT=yes IPV6INIT=yes BOOTPROTO=dhcp TYPE=Ethernet /run/initramfs/state/etc/sysconfig/network-scripts/ifcfg-net3.0004 # Generated by dracut initrd NAME="net3.0004" ONBOOT=yes NETBOOT=yes BOOTPROTO=none IPADDR="192.168.57.104" PREFIX="24" GATEWAY="192.168.57.1" TYPE=Vlan DEVICE="net3.0004" VLAN=yes PHYSDEV="net3" /run/initramfs/state/etc/sysconfig/network-scripts/ifcfg-net3.3 # Generated by dracut initrd NAME="net3.3" ONBOOT=yes NETBOOT=yes BOOTPROTO=none IPADDR="192.168.56.103" PREFIX="24" GATEWAY="192.168.56.1" TYPE=Vlan DEVICE="net3.3" VLAN=yes PHYSDEV="net3" /run/initramfs/state/etc/sysconfig/network-scripts/ifcfg-vlan0001 # Generated by dracut initrd NAME="vlan0001" ONBOOT=yes NETBOOT=yes BOOTPROTO=none IPADDR="192.168.54.101" PREFIX="24" GATEWAY="192.168.54.1" TYPE=Vlan DEVICE="vlan0001" VLAN=yes PHYSDEV="net3" /run/initramfs/state/etc/sysconfig/network-scripts/ifcfg-vlan2 # Generated by dracut initrd NAME="vlan2" ONBOOT=yes NETBOOT=yes BOOTPROTO=none IPADDR="192.168.55.102" PREFIX="24" GATEWAY="192.168.55.1" TYPE=Vlan DEVICE="vlan2" VLAN=yes PHYSDEV="net3" EOF '
+
+    ### TEST 1: VLANs
+    if [ "$USE_NETWORK" = network-legacy ]; then
+        NETCONF='ifcfg-net1 # Generated by dracut initrd NAME="net1" HWADDR="52:54:00:12:34:01" DEVICE="net1" ONBOOT=yes NETBOOT=yes IPV6INIT=yes BOOTPROTO=dhcp TYPE=Ethernet ifcfg-net2.0004 # Generated by dracut initrd NAME="net2.0004" ONBOOT=yes NETBOOT=yes BOOTPROTO=none IPADDR="192.168.57.104" PREFIX="24" GATEWAY="192.168.57.1" TYPE=Vlan DEVICE="net2.0004" VLAN=yes PHYSDEV="net2" ifcfg-net2.3 # Generated by dracut initrd NAME="net2.3" ONBOOT=yes NETBOOT=yes BOOTPROTO=none IPADDR="192.168.56.103" PREFIX="24" GATEWAY="192.168.56.1" TYPE=Vlan DEVICE="net2.3" VLAN=yes PHYSDEV="net2" ifcfg-vlan0001 # Generated by dracut initrd NAME="vlan0001" ONBOOT=yes NETBOOT=yes BOOTPROTO=none IPADDR="192.168.54.101" PREFIX="24" GATEWAY="192.168.54.1" TYPE=Vlan DEVICE="vlan0001" VLAN=yes PHYSDEV="net2" ifcfg-vlan2 # Generated by dracut initrd NAME="vlan2" ONBOOT=yes NETBOOT=yes BOOTPROTO=none IPADDR="192.168.55.102" PREFIX="24" GATEWAY="192.168.55.1" TYPE=Vlan DEVICE="vlan2" VLAN=yes PHYSDEV="net2" '
     fi
 
-    client_test "Multiple VLAN" \
-        "yes" \
+    client_test "VLANs" \
         "
-vlan=vlan0001:net3
-vlan=vlan2:net3
-vlan=net3.3:net3
-vlan=net3.0004:net3
+rd.dracut.test.num=1
+rd.dracut.test.net-module=$USE_NETWORK
+vlan=vlan0001:net2
+vlan=vlan2:net2
+vlan=net2.3:net2
+vlan=net2.0004:net2
 ip=net1:dhcp
 ip=192.168.54.101::192.168.54.1:24:test:vlan0001:none
 ip=192.168.55.102::192.168.55.1:24:test:vlan2:none
-ip=192.168.56.103::192.168.56.1:24:test:net3.3:none
-ip=192.168.57.104::192.168.57.1:24:test:net3.0004:none
+ip=192.168.56.103::192.168.56.1:24:test:net2.3:none
+ip=192.168.57.104::192.168.57.1:24:test:net2.0004:none
 rd.neednet=1
-root=nfs:192.168.50.1:/nfs/client bootdev=net1
+root=nfs:192.168.50.1:/nfs/client
+bootdev=net1
 " \
-        "$EXPECT" \
+        "net1 net2.0004 net2.3 vlan0001 vlan2 PING1=0 PING2=0 PING3=0 PING4=0 PING5=0 ${NETCONF}EOF " \
         || return 1
 
-    if [[ $NM ]]; then
-        EXPECT='bond0 /run/initramfs/state/etc/sysconfig/network-scripts/ifcfg-* EOF '
-    else
-        EXPECT='bond0 bond1 /run/initramfs/state/etc/sysconfig/network-scripts/ifcfg-bond0 # Generated by dracut initrd NAME="bond0" DEVICE="bond0" ONBOOT=yes NETBOOT=yes IPV6INIT=yes BOOTPROTO=dhcp BONDING_OPTS="" NAME="bond0" TYPE=Bond /run/initramfs/state/etc/sysconfig/network-scripts/ifcfg-bond1 # Generated by dracut initrd NAME="bond1" DEVICE="bond1" ONBOOT=yes NETBOOT=yes IPV6INIT=yes BOOTPROTO=dhcp BONDING_OPTS="" NAME="bond1" TYPE=Bond /run/initramfs/state/etc/sysconfig/network-scripts/ifcfg-net1 # Generated by dracut initrd NAME="net1" HWADDR="52:54:00:12:34:01" TYPE=Ethernet ONBOOT=yes NETBOOT=yes SLAVE=yes MASTER="bond0" DEVICE="net1" /run/initramfs/state/etc/sysconfig/network-scripts/ifcfg-net2 # Generated by dracut initrd NAME="net2" HWADDR="52:54:00:12:34:02" TYPE=Ethernet ONBOOT=yes NETBOOT=yes SLAVE=yes MASTER="bond0" DEVICE="net2" /run/initramfs/state/etc/sysconfig/network-scripts/ifcfg-net4 # Generated by dracut initrd NAME="net4" HWADDR="52:54:00:12:34:04" TYPE=Ethernet ONBOOT=yes NETBOOT=yes SLAVE=yes MASTER="bond1" DEVICE="net4" /run/initramfs/state/etc/sysconfig/network-scripts/ifcfg-net5 # Generated by dracut initrd NAME="net5" TYPE=Ethernet ONBOOT=yes NETBOOT=yes SLAVE=yes MASTER="bond1" DEVICE="net5" EOF '
+    ### TEST 2: bond
+    if [ "$USE_NETWORK" = network-legacy ]; then
+        NETCONF='ifcfg-bond0 # Generated by dracut initrd NAME="bond0" DEVICE="bond0" ONBOOT=yes NETBOOT=yes IPV6INIT=yes BOOTPROTO=dhcp BONDING_OPTS="miimon=100" NAME="bond0" TYPE=Bond ifcfg-net3 # Generated by dracut initrd NAME="net3" TYPE=Ethernet ONBOOT=yes NETBOOT=yes SLAVE=yes MASTER="bond0" DEVICE="net3" ifcfg-net4 # Generated by dracut initrd NAME="net4" TYPE=Ethernet ONBOOT=yes NETBOOT=yes SLAVE=yes MASTER="bond0" DEVICE="net4" '
     fi
-
-    client_test "Multiple Bonds" \
-        "yes" \
+    client_test "Bond" \
         "
-bond=bond0:net1,net2:miimon=100
-bond=bond1:net4,net5:miimon=100
+rd.dracut.test.num=2
+rd.dracut.test.net-module=$USE_NETWORK
+bond=bond0:net3,net4:miimon=100
 ip=bond0:dhcp
-ip=bond1:dhcp
 rd.neednet=1
-root=nfs:192.168.50.1:/nfs/client bootdev=bond0
+root=nfs:192.168.51.1:/nfs/client
+bootdev=bond0
 " \
-        "$EXPECT" \
+        "bond0 PING1=0 NET3=0 NET4=0 ${NETCONF}EOF " \
         || return 1
 
-    if [[ $NM ]]; then
-        EXPECT='br0 br1 /run/initramfs/state/etc/sysconfig/network-scripts/ifcfg-* EOF '
-    else
-        EXPECT='br0 br1 /run/initramfs/state/etc/sysconfig/network-scripts/ifcfg-br0 # Generated by dracut initrd NAME="br0" DEVICE="br0" ONBOOT=yes NETBOOT=yes IPV6INIT=yes BOOTPROTO=dhcp TYPE=Bridge NAME="br0" /run/initramfs/state/etc/sysconfig/network-scripts/ifcfg-br1 # Generated by dracut initrd NAME="br1" DEVICE="br1" ONBOOT=yes NETBOOT=yes IPV6INIT=yes BOOTPROTO=dhcp TYPE=Bridge NAME="br1" /run/initramfs/state/etc/sysconfig/network-scripts/ifcfg-net1 # Generated by dracut initrd NAME="net1" HWADDR="52:54:00:12:34:01" TYPE=Ethernet ONBOOT=yes NETBOOT=yes BRIDGE="br0" DEVICE="net1" /run/initramfs/state/etc/sysconfig/network-scripts/ifcfg-net2 # Generated by dracut initrd NAME="net2" HWADDR="52:54:00:12:34:02" TYPE=Ethernet ONBOOT=yes NETBOOT=yes BRIDGE="br0" DEVICE="net2" /run/initramfs/state/etc/sysconfig/network-scripts/ifcfg-net4 # Generated by dracut initrd NAME="net4" TYPE=Ethernet ONBOOT=yes NETBOOT=yes BRIDGE="br1" DEVICE="net4" /run/initramfs/state/etc/sysconfig/network-scripts/ifcfg-net5 # Generated by dracut initrd NAME="net5" TYPE=Ethernet ONBOOT=yes NETBOOT=yes BRIDGE="br1" DEVICE="net5" EOF '
+    ### TEST 3: bridge
+    if [ "$USE_NETWORK" = network-legacy ]; then
+        NETCONF='ifcfg-br0 # Generated by dracut initrd NAME="br0" DEVICE="br0" ONBOOT=yes NETBOOT=yes IPV6INIT=yes BOOTPROTO=dhcp TYPE=Bridge NAME="br0" ifcfg-net1 # Generated by dracut initrd NAME="net1" TYPE=Ethernet ONBOOT=yes NETBOOT=yes BRIDGE="br0" HWADDR="52:54:00:12:34:01" DEVICE="net1" ifcfg-net5 # Generated by dracut initrd NAME="net5" TYPE=Ethernet ONBOOT=yes NETBOOT=yes BRIDGE="br0" HWADDR="52:54:00:12:34:05" DEVICE="net5" '
     fi
-
-    client_test "Multiple Bridges" \
-        "no" \
+    client_test "Bridge" \
         "
-bridge=br0:net1,net2
-bridge=br1:net4,net5
+rd.dracut.test.num=3
+rd.dracut.test.net-module=$USE_NETWORK
+bridge=br0:net1,net5
 ip=br0:dhcp
-ip=br1:dhcp
 rd.neednet=1
-root=nfs:192.168.50.1:/nfs/client bootdev=br0
+root=nfs:192.168.50.1:/nfs/client
+bootdev=br0
 " \
-        "$EXPECT" \
+        "br0 PING1=0 NET1=0 NET5=0 ${NETCONF}EOF " \
         || return 1
 
     kill_server
@@ -244,7 +249,7 @@ test_setup() {
         [ -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
-        instmods nfsd sunrpc ipv6 lockd af_packet 8021q ipvlan macvlan
+        instmods nfsd sunrpc ipv6 lockd af_packet 8021q bonding
         inst_simple /etc/os-release
         inst ./server-init.sh /sbin/init
         inst ./hosts /etc/hosts
@@ -284,7 +289,7 @@ test_setup() {
         # shellcheck disable=SC1090
         . "$basedir"/dracut-init.sh
         inst_multiple sh shutdown poweroff stty cat ps ln ip \
-            mount dmesg mkdir cp ping grep ls sort dd
+            mount dmesg mkdir cp ping grep ls sort dd sed basename
         for _terminfodir in /lib/terminfo /etc/terminfo /usr/share/terminfo; do
             [[ -f ${_terminfodir}/l/linux ]] && break
         done