frr/Sanity/basic-rip/test.sh
František Hrdina 4c90131510 Cleanup improvements
prevent propagating AVCs to the tests, that are following
2025-02-05 15:20:27 +01:00

192 lines
9.7 KiB
Bash
Executable file

#!/bin/bash
# vim: dict+=/usr/share/beakerlib/dictionary.vim cpt=.,w,b,u,t,i,k
. /usr/share/beakerlib/beakerlib.sh || exit 1
PACKAGE="frr"
SERVER_CLIENT_IF_ADDR="192.168.222.0"
SERVER_CLIENT_IF_PREFIX="24"
SERVER_IF_ADDR="192.168.222.1"
SERVER_IF_PREFIX="24"
SERVER_IF_BCAST="192.168.222.255"
SERVER_STUB_IF_ADDR="192.168.100.0"
SERVER_STUB_IF_PREFIX="24"
SERVER_FRR_LOG="/var/log/frr/frr-r1.log"
SERVER_CONF_DIR="/etc/frr/vns/"
CLIENT_IF_ADDR="192.168.222.2"
CLIENT_IF_PREFIX="24"
CLIENT_IF_BCAST="192.168.222.255"
CLIENT_STUB_IF_ADDR="192.168.200.0"
CLIENT_STUB_IF_PREFIX="24"
CLIENT_FRR_LOG="/var/log/frr/frr-r2.log"
CLIENT_CONF_DIR="/etc/frr/vnc/"
MAIN_LOG="/tmp/log_routes"
rlJournalStart
rlPhaseStartSetup "import virtual-network library"
rlRun "rlImport virtual-network/virtual-network" || rlDie "Import of the library required for the test failed"
rlPhaseEnd
rlPhaseStartSetup
rlAssertRpm $PACKAGE
TestDir=$(pwd)
rlRun "tmp=\$(mktemp -d)" 0 "Create tmp directory"
rlRun "pushd $tmp"
# Need to disable SeLinux, because it does not allow to start service via unit file
# in a network namespace using "ip netns exec". And there are other issues with pid files, log files, etc.
rlRun "setenforce 0" 0 "Disabling SELinux"
rlRun "ORIG_AVC_ERROR=${AVC_ERROR}"
rlRun "AVC_ERROR=+no_avc_check"
# set up the network, we want a specific IPv4 address for neighbor communication and two IPv6 addresses
# for the set src part of the configuration
vnCreateServerClientNetwork
vnRunServer "ip link set ${vnSERVER_IFACE} up" 0 "Setting the SERVER side of veth UP"
vnRunServer "ip link set lo up" 0 "Setting the SERVER side loopback UP"
vnRunClient "ip link set ${vnCLIENT_IFACE} up" 0 "Setting the CLIENT side of veth UP"
vnRunClient "ip link set lo up" 0 "Setting the CLIENT side loopback UP"
vnRunServer "ip addr add ${SERVER_IF_ADDR}/${SERVER_IF_PREFIX} broadcast ${SERVER_IF_BCAST} dev ${vnSERVER_IFACE}" 0 "Configuring IPv4 address on SERVER side of veth"
vnRunClient "ip addr add ${CLIENT_IF_ADDR}/${CLIENT_IF_PREFIX} broadcast ${CLIENT_IF_BCAST} dev ${vnCLIENT_IFACE}" 0 "Configuring IPv4 address on CLIENT side of veth"
# Create isolated stub network available only from SERVER network
vnRunServer "ip link add VNS_STUB type veth peer name VNS_STUB_PEER"
vnRunServer "ip link set VNS_STUB netns ${vnSERVER_NAMESPACE}"
vnRunServer "ip netns exec ${vnSERVER_NAMESPACE} ip addr add ${SERVER_STUB_IF_ADDR}/${SERVER_STUB_IF_PREFIX} dev VNS_STUB"
vnRunServer "ip netns exec ${vnSERVER_NAMESPACE} ip link set VNS_STUB up"
vnRunServer "ip link set VNS_STUB_PEER up"
# Create isolated stub network available only from CLIENT network
vnRunClient "ip link add VNC_STUB type veth peer name VNC_STUB_PEER"
vnRunClient "ip link set VNC_STUB netns ${vnCLIENT_NAMESPACE}"
vnRunClient "ip netns exec ${vnCLIENT_NAMESPACE} ip addr add ${CLIENT_STUB_IF_ADDR}/${CLIENT_STUB_IF_PREFIX} dev VNC_STUB"
vnRunClient "ip netns exec ${vnCLIENT_NAMESPACE} ip link set VNC_STUB up"
vnRunClient "ip link set VNC_STUB_PEER up"
rlRun "ip a"
vnRunClient "ip a"
vnRunServer "ip a"
rlRun "rlFileBackup --clean /etc/frr/"
rlRun "rlFileBackup --clean /etc/systemd/system/"
rlRun "rlFileBackup --clean /var/log/frr/"
rlRun "rlFileBackup --clean /var/log/audit/audit.log"
rlRun "rlFileBackup --clean /var/run/frr"
rlRun "rlFileBackup --clean /run/frr"
rlRun "rlFileBackup --clean /root/.history_frr"
rlRun "mkdir /etc/frr/{vns,vnc}"
rm -rf /etc/frr/frr.conf
#vtysh.conf and frr.conf are in /etc/frr/vns for the server namespace
rlRun "cp -f $TestDir/vtysh-vns.conf ${SERVER_CONF_DIR}vtysh.conf" 0 "Copying vtysh configuration for the SERVER"
rlRun "cp -f $TestDir/frr-vns.conf ${SERVER_CONF_DIR}frr.conf" 0 "Copying frr configuration for the SERVER"
#vtysh.conf and frr.conf are in /etc/frr/vnc for the client namespace
rlRun "cp -f $TestDir/vtysh-vnc.conf ${CLIENT_CONF_DIR}vtysh.conf" 0 "Copying vtysh configuration for the CLIENT"
rlRun "cp -f $TestDir/frr-vnc.conf ${CLIENT_CONF_DIR}frr.conf" 0 "Copying frr configuration for the CLIENT"
#I need separate daemons files as well for watchfrr options
rlRun "cp -f $TestDir/daemons-vns ${SERVER_CONF_DIR}daemons" 0 "Copying daemons file for the SERVER"
rlRun "cp -f $TestDir/daemons-vnc ${CLIENT_CONF_DIR}daemons" 0 "Copying daemons file for the CLIENT"
rlRun "ls -lR /etc/frr/*"
rlRun "cp -f $TestDir/frr-vn{s,c}.service /etc/systemd/system/" 0 "Copying custom unit files to run frr in network namespaces"
# /etc/frr/vns/frr.conf
rlRun "sed -i 's|<SERVER_FRR_LOG>|${SERVER_FRR_LOG}|g' ${SERVER_CONF_DIR}frr.conf"
rlRun "sed -i 's|<SERVER_IF_ADDR>|${SERVER_IF_ADDR}|g' ${SERVER_CONF_DIR}frr.conf"
rlRun "sed -i 's|<SERVER_IF_PREFIX>|${SERVER_IF_PREFIX}|g' ${SERVER_CONF_DIR}frr.conf"
rlRun "sed -i 's|<SERVER_STUB_IF_ADDR>|${SERVER_STUB_IF_ADDR}|g' ${SERVER_CONF_DIR}frr.conf"
rlRun "sed -i 's|<SERVER_STUB_IF_PREFIX>|${SERVER_STUB_IF_PREFIX}|g' ${SERVER_CONF_DIR}frr.conf"
rlRun "sed -i 's|<SERVER_CLIENT_IF_ADDR>|${SERVER_CLIENT_IF_ADDR}|g' ${SERVER_CONF_DIR}frr.conf"
rlRun "sed -i 's|<SERVER_CLIENT_IF_PREFIX>|${SERVER_CLIENT_IF_PREFIX}|g' ${SERVER_CONF_DIR}frr.conf"
rlRun "cat ${SERVER_CONF_DIR}frr.conf"
# /etc/frr/vnc/frr.conf
rlRun "sed -i 's|<CLIENT_FRR_LOG>|${CLIENT_FRR_LOG}|g' ${CLIENT_CONF_DIR}frr.conf"
rlRun "sed -i 's|<CLIENT_IF_ADDR>|${CLIENT_IF_ADDR}|g' ${CLIENT_CONF_DIR}frr.conf"
rlRun "sed -i 's|<CLIENT_IF_PREFIX>|${CLIENT_IF_PREFIX}|g' ${CLIENT_CONF_DIR}frr.conf"
rlRun "sed -i 's|<CLIENT_STUB_IF_ADDR>|${CLIENT_STUB_IF_ADDR}|g' ${CLIENT_CONF_DIR}frr.conf"
rlRun "sed -i 's|<CLIENT_STUB_IF_PREFIX>|${CLIENT_STUB_IF_PREFIX}|g' ${CLIENT_CONF_DIR}frr.conf"
rlRun "sed -i 's|<SERVER_CLIENT_IF_ADDR>|${SERVER_CLIENT_IF_ADDR}|g' ${CLIENT_CONF_DIR}frr.conf"
rlRun "sed -i 's|<SERVER_CLIENT_IF_PREFIX>|${SERVER_CLIENT_IF_PREFIX}|g' ${CLIENT_CONF_DIR}frr.conf"
rlRun "cat ${CLIENT_CONF_DIR}frr.conf"
rlRun "systemctl daemon-reload"
rlPhaseEnd
rlPhaseStartTest
vnRunServer "ping -c 1 ${SERVER_STUB_IF_ADDR}" 0 "Server should be capable to ping its stub"
vnRunServer "ping -c 1 ${CLIENT_STUB_IF_ADDR}" 2 "Server should NOT be capable to ping client's stub before FRR with RIP is run"
vnRunClient "ping -c 1 ${CLIENT_STUB_IF_ADDR}" 0 "Client should be capable to ping its stub"
vnRunClient "ping -c 1 ${SERVER_STUB_IF_ADDR}" 2 "Client should NOT be capable to ping server's stub before FRR with RIP is run"
rlRun "systemctl start frr-vns.service" 0 "Starting FRR on SERVER side"
rlRun "systemctl start frr-vnc.service" 0 "Starting FRR on CLIENT side"
#vtysh also needs to run for a specific namespace
rlRun "vtysh -N vns -c 'sh run'"
rlRun "vtysh -N vnc -c 'sh run'"
vnRunServer "ping -c 1 ${CLIENT_IF_ADDR}" 0 "Testing that server can ping client IP"
vnRunClient "ping -c 1 ${SERVER_IF_ADDR}" 0 "Testing that client can ping server IP"
rlRun "sleep 30" 0 "Waiting for peers to exchange routes and converge"
# check server
rlRun "vtysh -N vns -c 'show ip rip status' | grep \"${CLIENT_IF_ADDR}\"" 0 Check if client is set as gateway for server
rlRun "vtysh -N vns -c 'show ip rip' | grep \"C(i) ${SERVER_STUB_IF_ADDR}/${SERVER_STUB_IF_PREFIX}\"" 0 "Check if server's stub is connected to rip"
rlRun "vtysh -N vns -c 'show ip rip' | grep \"${SERVER_CLIENT_IF_ADDR}\"" 0 "Check if server-client network connected to rip"
rlRun "vtysh -N vns -c 'show ip rip' | grep \"R(n) ${CLIENT_STUB_IF_ADDR}/${CLIENT_STUB_IF_PREFIX}\"" 0 "Check if RIP connected client's stub"
rlRun "vtysh -N vns -c 'show ip route' | grep \"R>\* ${CLIENT_STUB_IF_ADDR}/${CLIENT_STUB_IF_PREFIX}\"" 0 "Check if RIP connected client's stub"
# check client
rlRun "vtysh -N vnc -c 'show ip rip status' | grep \"${SERVER_IF_ADDR}\"" 0 Check if server is set as gateway for client
rlRun "vtysh -N vnc -c 'show ip rip' | grep \"C(i) ${CLIENT_STUB_IF_ADDR}/${CLIENT_STUB_IF_PREFIX}\"" 0 "Check if client's stub connected to rip"
rlRun "vtysh -N vnc -c 'show ip rip' | grep \"${SERVER_CLIENT_IF_ADDR}\"" 0 "Check if server-client network connected to rip"
rlRun "vtysh -N vnc -c 'show ip rip' | grep \"R(n) ${SERVER_STUB_IF_ADDR}/${SERVER_STUB_IF_PREFIX}\"" 0 "Check if RIP connected server's stub"
rlRun "vtysh -N vnc -c 'show ip route' | grep \"R>\* ${SERVER_STUB_IF_ADDR}/${SERVER_STUB_IF_PREFIX}\"" 0 "Check if RIP connected server's stub"
vnRunServer "ping -c 1 ${CLIENT_STUB_IF_ADDR}" 0 "Server should be capable to ping client's stub since FRR with RIP is run"
vnRunClient "ping -c 1 ${SERVER_STUB_IF_ADDR}" 0 "Client should be capable to ping server's stub since FRR with RIP is run"
rlPhaseEnd
rlPhaseStartCleanup
rlRun "systemctl stop frr-vns.service frr-vnc.service" 0 "Stopping FRR"
vnRemoveServerClientNetwork
rlFileRestore
rlRun "systemctl daemon-reload"
# restoring SELinux
rlRun "setenforce 1" 0 "re-Enabling SELinux"
rlRun "AVC_ERROR=${ORIG_AVC_ERROR}"
# This should prevent propagating AVCs to the tests, that are following
rlRun "fixfiles restore"
rlRun "restorecon -R -v /"
rlRun "popd"
rlRun "rm -r $tmp" 0 "Remove tmp directory"
rlPhaseEnd
rlJournalPrintText
rlJournalEnd