Skip to content

Commit

Permalink
fix(test): improve test 60
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
bengal authored and aafeijoo-suse committed Feb 13, 2023
1 parent 8f44740 commit 5e846cb
Show file tree
Hide file tree
Showing 4 changed files with 127 additions and 71 deletions.
50 changes: 46 additions & 4 deletions test/TEST-60-BONDBRIDGEVLANIFCFG/client-init.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
2 changes: 1 addition & 1 deletion test/TEST-60-BONDBRIDGEVLANIFCFG/exports
Original file line number Diff line number Diff line change
@@ -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)
19 changes: 14 additions & 5 deletions test/TEST-60-BONDBRIDGEVLANIFCFG/server-init.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand Down Expand Up @@ -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
Expand Down
127 changes: 66 additions & 61 deletions test/TEST-60-BONDBRIDGEVLANIFCFG/test.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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 "
Expand All @@ -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

Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down

0 comments on commit 5e846cb

Please sign in to comment.