frr/Sanity/basic-ospf/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

242 lines
14 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_1_IF_ADDR="192.168.101.0"
SERVER_STUB_1_IF_PREFIX="24"
SERVER_STUB_2_IF_ADDR="192.168.102.0"
SERVER_STUB_2_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_1_IF_ADDR="192.168.201.0"
CLIENT_STUB_1_IF_PREFIX="24"
CLIENT_STUB_2_IF_ADDR="192.168.202.0"
CLIENT_STUB_2_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 1 network available only from SERVER network
vnRunServer "ip link add VNS_STUB_1 type veth peer name VNS_STUB_PEER_1"
vnRunServer "ip link set VNS_STUB_1 netns ${vnSERVER_NAMESPACE}"
vnRunServer "ip netns exec ${vnSERVER_NAMESPACE} ip addr add ${SERVER_STUB_1_IF_ADDR}/${SERVER_STUB_1_IF_PREFIX} dev VNS_STUB_1"
vnRunServer "ip netns exec ${vnSERVER_NAMESPACE} ip link set VNS_STUB_1 up"
vnRunServer "ip link set VNS_STUB_PEER_1 up"
# Create isolated stub 2 network available only from SERVER network
vnRunServer "ip link add VNS_STUB_2 type veth peer name VNS_STUB_PEER_2"
vnRunServer "ip link set VNS_STUB_2 netns ${vnSERVER_NAMESPACE}"
vnRunServer "ip netns exec ${vnSERVER_NAMESPACE} ip addr add ${SERVER_STUB_2_IF_ADDR}/${SERVER_STUB_2_IF_PREFIX} dev VNS_STUB_2"
vnRunServer "ip netns exec ${vnSERVER_NAMESPACE} ip link set VNS_STUB_2 up"
vnRunServer "ip link set VNS_STUB_PEER_2 up"
# Create isolated stub 1 network available only from CLIENT network
vnRunClient "ip link add VNC_STUB_1 type veth peer name VNC_STUB_PEER_1"
vnRunClient "ip link set VNC_STUB_1 netns ${vnCLIENT_NAMESPACE}"
vnRunClient "ip netns exec ${vnCLIENT_NAMESPACE} ip addr add ${CLIENT_STUB_1_IF_ADDR}/${CLIENT_STUB_1_IF_PREFIX} dev VNC_STUB_1"
vnRunClient "ip netns exec ${vnCLIENT_NAMESPACE} ip link set VNC_STUB_1 up"
vnRunClient "ip link set VNC_STUB_PEER_1 up"
# Create isolated stub 2 network available only from CLIENT network
vnRunClient "ip link add VNC_STUB_2 type veth peer name VNC_STUB_PEER_2"
vnRunClient "ip link set VNC_STUB_2 netns ${vnCLIENT_NAMESPACE}"
vnRunClient "ip netns exec ${vnCLIENT_NAMESPACE} ip addr add ${CLIENT_STUB_2_IF_ADDR}/${CLIENT_STUB_2_IF_PREFIX} dev VNC_STUB_2"
vnRunClient "ip netns exec ${vnCLIENT_NAMESPACE} ip link set VNC_STUB_2 up"
vnRunClient "ip link set VNC_STUB_PEER_2 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|<ROUTER_ID>|${SERVER_IF_ADDR}|g' ${SERVER_CONF_DIR}frr.conf"
rlRun "sed -i 's|<SERVER_STUB_1_IF_ADDR>|${SERVER_STUB_1_IF_ADDR}|g' ${SERVER_CONF_DIR}frr.conf"
rlRun "sed -i 's|<SERVER_STUB_1_IF_PREFIX>|${SERVER_STUB_1_IF_PREFIX}|g' ${SERVER_CONF_DIR}frr.conf"
rlRun "sed -i 's|<SERVER_STUB_2_IF_ADDR>|${SERVER_STUB_2_IF_ADDR}|g' ${SERVER_CONF_DIR}frr.conf"
rlRun "sed -i 's|<SERVER_STUB_2_IF_PREFIX>|${SERVER_STUB_2_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|<ROUTER_ID>|${CLIENT_IF_ADDR}|g' ${CLIENT_CONF_DIR}frr.conf"
rlRun "sed -i 's|<CLIENT_STUB_1_IF_ADDR>|${CLIENT_STUB_1_IF_ADDR}|g' ${CLIENT_CONF_DIR}frr.conf"
rlRun "sed -i 's|<CLIENT_STUB_1_IF_PREFIX>|${CLIENT_STUB_1_IF_PREFIX}|g' ${CLIENT_CONF_DIR}frr.conf"
rlRun "sed -i 's|<CLIENT_STUB_2_IF_ADDR>|${CLIENT_STUB_2_IF_ADDR}|g' ${CLIENT_CONF_DIR}frr.conf"
rlRun "sed -i 's|<CLIENT_STUB_2_IF_PREFIX>|${CLIENT_STUB_2_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_1_IF_ADDR}" 0 "Server should be capable to ping its stub 1"
vnRunServer "ping -c 1 ${SERVER_STUB_2_IF_ADDR}" 0 "Server should be capable to ping its stub 2"
vnRunServer "ping -c 1 ${CLIENT_STUB_1_IF_ADDR}" 2 "Server should NOT be capable to ping client's stub 1 before FRR with OSPF is run"
vnRunServer "ping -c 1 ${CLIENT_STUB_1_IF_ADDR}" 2 "Server should NOT be capable to ping client's stub 2 before FRR with OSPF is run"
vnRunClient "ping -c 1 ${CLIENT_STUB_1_IF_ADDR}" 0 "Client should be capable to ping its stub 1"
vnRunClient "ping -c 1 ${CLIENT_STUB_2_IF_ADDR}" 0 "Client should be capable to ping its stub 2"
vnRunClient "ping -c 1 ${SERVER_STUB_1_IF_ADDR}" 2 "Client should NOT be capable to ping server's stub 1 before FRR with OSPF is run"
vnRunClient "ping -c 1 ${SERVER_STUB_2_IF_ADDR}" 2 "Client should NOT be capable to ping server's stub 2 before FRR with OSPF 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 60" 0 "Waiting for peers to exchange routes and converge"
# check server
rlRun "vtysh -N vns -c 'show ip ospf database' | grep \"OSPF Router with ID (${SERVER_IF_ADDR})\"" 0 "Checking if server with its router-id is in ospf database"
rlRun "vtysh -N vns -c 'show ip ospf database' | grep \"${CLIENT_IP_ADDR}\"" 0 "Check if client's ip is in ospf database of server"
rlRun "vtysh -N vns -c 'show ip ospf database' | grep \"Area 0.0.0.1\"" 0 "Check if area 1 is loaded in ospf"
rlRun "vtysh -N vns -c 'show ip ospf database' | grep \"Area 0.0.0.2\"" 0 "Check if area 2 is loaded in ospf"
rlRun "vtysh -N vns -c 'show ip ospf' | grep \"OSPF Routing Process, Router ID: $ROUTER_ID\"" 0 "Check if server with its router-id is in show ip ospf"
rlRun "vtysh -N vns -c 'show ip ospf' | grep \"Area ID: 0.0.0.1\"" 0 "Check if area 1 in show ip ospf"
rlRun "vtysh -N vns -c 'show ip ospf' | grep \"Area ID: 0.0.0.2\"" 0 "Check if area 2 in show ip ospf"
rlRun "vtysh -N vns -c 'show ip ospf neighbor' | grep \"${CLIENT_IF_ADDR}\"" 0 "Check if server has client's ip in ospf neighbor"
rlRun "vtysh -N vns -c 'show ip ospf route' | grep \"${CLIENT_IF_ADDR}\"" 0 "Check if server has client's ip in ip ospf routes"
rlRun "vtysh -N vns -c 'show ip route' | grep \"O>\* ${CLIENT_STUB_1_IF_ADDR}\"" 0 "Check if client's stub 1 in ip routes of server"
rlRun "vtysh -N vns -c 'show ip route' | grep \"O>\* ${CLIENT_STUB_2_IF_ADDR}\"" 0 "Check if client's stub 2 in ip routes of server"
rlRun "vtysh -N vns -c 'show ip ospf route' | grep \"IA ${CLIENT_STUB_1_IF_ADDR}\"" 0 "Check if client's stub 1 is in ip ospf routes of server"
rlRun "vtysh -N vns -c 'show ip ospf route' | grep \"IA ${CLIENT_STUB_2_IF_ADDR}\"" 0 "Check if client's stub 2 is in ip ospf routes of server"
# check client}
rlRun "vtysh -N vnc -c 'show ip ospf database' | grep \"OSPF Router with ID (${CLIENT_IF_ADDR})\"" 0 "Checking if client with its router-id is in ospf database"
rlRun "vtysh -N vnc -c 'show ip ospf database' | grep \"${SERVER_IP_ADDR}\"" 0 "Check if server's ip is in ospf database of client"
rlRun "vtysh -N vnc -c 'show ip ospf database' | grep \"Area 0.0.0.1\"" 0 "Check if area 1 is loaded in ospf"
rlRun "vtysh -N vnc -c 'show ip ospf database' | grep \"Area 0.0.0.2\"" 0 "Check if area 2 is loaded in ospf"
rlRun "vtysh -N vnc -c 'show ip ospf' | grep \"OSPF Routing Process, Router ID: $ROUTER_ID\"" 0 "Check if client with its router-id is in show ip ospf"
rlRun "vtysh -N vnc -c 'show ip ospf' | grep \"Area ID: 0.0.0.1\"" 0 "Check if area 1 in show ip ospf"
rlRun "vtysh -N vnc -c 'show ip ospf' | grep \"Area ID: 0.0.0.2\"" 0 "Check if area 2 in show ip ospf"
rlRun "vtysh -N vnc -c 'show ip ospf neighbor' | grep \"${SERVER_IF_ADDR}\"" 0 "Check if client has server's ip in ospf neighbor"
rlRun "vtysh -N vnc -c 'show ip ospf route' | grep \"${SERVER_IF_ADDR}\"" 0 "Check if server has server's ip in ip ospf routes"
rlRun "vtysh -N vnc -c 'show ip route' | grep \"O>\* ${SERVER_STUB_1_IF_ADDR}\"" 0 "Check if server's stub 1 in ip routes of client"
rlRun "vtysh -N vnc -c 'show ip route' | grep \"O>\* ${SERVER_STUB_2_IF_ADDR}\"" 0 "Check if server's stub 2 in ip routes of client"
rlRun "vtysh -N vnc -c 'show ip ospf route' | grep \"IA ${SERVER_STUB_1_IF_ADDR}\"" 0 "Check if server's stub 1 is in ip ospf routes of client"
rlRun "vtysh -N vnc -c 'show ip ospf route' | grep \"IA ${SERVER_STUB_2_IF_ADDR}\"" 0 "Check if server's stub 2 is in ip ospf routes of client"
vnRunServer "ping -c 1 ${CLIENT_STUB_1_IF_ADDR}" 0 "Server should be capable to ping client's stub 1 since FRR with OSPF is run"
vnRunServer "ping -c 1 ${CLIENT_STUB_2_IF_ADDR}" 0 "Server should be capable to ping client's stub 2 since FRR with OSPF is run"
vnRunClient "ping -c 1 ${SERVER_STUB_1_IF_ADDR}" 0 "Client should be capable to ping server's stub since FRR with OSPF is run"
vnRunClient "ping -c 1 ${SERVER_STUB_2_IF_ADDR}" 0 "Client should be capable to ping server's stub since FRR with OSPF 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