From 5e846cb1320e32db1e3d200743f8fc08732d4c9e Mon Sep 17 00:00:00 2001 From: Beniamino Galvani Date: Tue, 7 Feb 2023 15:28:57 +0100 Subject: [PATCH] fix(test): improve test 60 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. --- .../client-init.sh | 50 ++++++- test/TEST-60-BONDBRIDGEVLANIFCFG/exports | 2 +- .../server-init.sh | 19 ++- test/TEST-60-BONDBRIDGEVLANIFCFG/test.sh | 127 +++++++++--------- 4 files changed, 127 insertions(+), 71 deletions(-) diff --git a/test/TEST-60-BONDBRIDGEVLANIFCFG/client-init.sh b/test/TEST-60-BONDBRIDGEVLANIFCFG/client-init.sh index b0851116c..b1d1db4e2 100755 --- a/test/TEST-60-BONDBRIDGEVLANIFCFG/client-init.sh +++ b/test/TEST-60-BONDBRIDGEVLANIFCFG/client-init.sh @@ -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 diff --git a/test/TEST-60-BONDBRIDGEVLANIFCFG/exports b/test/TEST-60-BONDBRIDGEVLANIFCFG/exports index ff5f29b1b..9c07923f3 100644 --- a/test/TEST-60-BONDBRIDGEVLANIFCFG/exports +++ b/test/TEST-60-BONDBRIDGEVLANIFCFG/exports @@ -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) diff --git a/test/TEST-60-BONDBRIDGEVLANIFCFG/server-init.sh b/test/TEST-60-BONDBRIDGEVLANIFCFG/server-init.sh index c125d0f4a..3b0f55e22 100755 --- a/test/TEST-60-BONDBRIDGEVLANIFCFG/server-init.sh +++ b/test/TEST-60-BONDBRIDGEVLANIFCFG/server-init.sh @@ -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 diff --git a/test/TEST-60-BONDBRIDGEVLANIFCFG/test.sh b/test/TEST-60-BONDBRIDGEVLANIFCFG/test.sh index ac33ba9f8..5da968fea 100755 --- a/test/TEST-60-BONDBRIDGEVLANIFCFG/test.sh +++ b/test/TEST-60-BONDBRIDGEVLANIFCFG/test.sh @@ -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 -- 2.47.2