|
|
a8930ab |
#!/bin/bash
|
|
|
a8930ab |
# vim: dict+=/usr/share/beakerlib/dictionary.vim cpt=.,w,b,u,t,i,k
|
|
|
a8930ab |
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
a8930ab |
#
|
|
|
a8930ab |
# runtest.sh of
|
|
|
a8930ab |
# Description: Test that frr correctly changes inbound route filter after a config reload
|
|
|
a8930ab |
# Author: Michal Ruprich <mruprich@redhat.com>
|
|
|
a8930ab |
#
|
|
|
a8930ab |
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
a8930ab |
#
|
|
|
a8930ab |
# Copyright (c) 2019 Red Hat, Inc.
|
|
|
a8930ab |
#
|
|
|
a8930ab |
# This program is free software: you can redistribute it and/or
|
|
|
a8930ab |
# modify it under the terms of the GNU General Public License as
|
|
|
a8930ab |
# published by the Free Software Foundation, either version 2 of
|
|
|
a8930ab |
# the License, or (at your option) any later version.
|
|
|
a8930ab |
#
|
|
|
a8930ab |
# This program is distributed in the hope that it will be
|
|
|
a8930ab |
# useful, but WITHOUT ANY WARRANTY; without even the implied
|
|
|
a8930ab |
# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
|
|
a8930ab |
# PURPOSE. See the GNU General Public License for more details.
|
|
|
a8930ab |
#
|
|
|
a8930ab |
# You should have received a copy of the GNU General Public License
|
|
|
a8930ab |
# along with this program. If not, see http://www.gnu.org/licenses/.
|
|
|
a8930ab |
#
|
|
|
a8930ab |
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
a8930ab |
|
|
|
a8930ab |
# Include Beaker environment
|
|
|
a8930ab |
. /usr/share/beakerlib/beakerlib.sh || exit 1
|
|
|
a8930ab |
|
|
|
a8930ab |
PACKAGE="frr"
|
|
|
a8930ab |
|
|
|
a8930ab |
vnSIDE='server'
|
|
|
a8930ab |
vnSERVER_IFACE='VNS'
|
|
|
a8930ab |
vnCLIENT_IFACE='VNC'
|
|
|
a8930ab |
vnSERVER_NAMESPACE='vns'
|
|
|
a8930ab |
vnCLIENT_NAMESPACE='vnc'
|
|
|
a8930ab |
|
|
|
a8930ab |
#Very simple case where we need two routers R1 and R2 to establish neighborship and send some data
|
|
|
a8930ab |
SRV_DUMMY1_IF_NAME="dummy1"
|
|
|
a8930ab |
SRV_DUMMY1_IF_ADDR="192.168.212.1"
|
|
|
a8930ab |
SRV_DUMMY1_IF_NETWORK="192.168.212.0"
|
|
|
a8930ab |
SRV_DUMMY1_IF_PREFIX="24"
|
|
|
a8930ab |
SRV_DUMMY1_IF_BCAST="192.168.212.255"
|
|
|
a8930ab |
|
|
|
a8930ab |
SERVER_IF_ADDR="192.168.222.240"
|
|
|
a8930ab |
SERVER_IF_PREFIX="31"
|
|
|
a8930ab |
SERVER_IF_BCAST="255.255.255.255"
|
|
|
a8930ab |
|
|
|
a8930ab |
SERVER_FRR_LOG="/var/log/frr/frr-r1.log"
|
|
|
a8930ab |
SERVER_CONF_DIR="/etc/frr/vns/"
|
|
|
a8930ab |
|
|
|
a8930ab |
CLIENT_IF_ADDR="192.168.222.241"
|
|
|
a8930ab |
CLIENT_IF_PREFIX="31"
|
|
|
a8930ab |
CLIENT_IF_BCAST="255.255.255.255"
|
|
|
a8930ab |
|
|
|
a8930ab |
CLIENT_FRR_LOG="/var/log/frr/frr-r2.log"
|
|
|
a8930ab |
CLIENT_CONF_DIR="/etc/frr/vnc/"
|
|
|
a8930ab |
|
|
|
a8930ab |
#These functions help with setting up the network namespaces
|
|
|
a8930ab |
vnCreateServerClientNetwork()
|
|
|
a8930ab |
{
|
|
|
a8930ab |
rlRun "ip link add ${vnSERVER_IFACE} type veth peer name ${vnCLIENT_IFACE}" 0 "Creating network ifaces for SERVER: '${vnSERVER_IFACE}' and CLIENT: '${vnCLIENT_IFACE}'."
|
|
|
a8930ab |
|
|
|
a8930ab |
rlRun "ip netns add ${vnSERVER_NAMESPACE}" 0 "Creating SERVER namespace: '${vnSERVER_NAMESPACE}'."
|
|
|
a8930ab |
rlRun "ip netns add ${vnCLIENT_NAMESPACE}" 0 "Creating CLIENT namespace: '${vnCLIENT_NAMESPACE}'."
|
|
|
a8930ab |
|
|
|
a8930ab |
rlRun "ip link set ${vnSERVER_IFACE} netns ${vnSERVER_NAMESPACE}" 0 "Adding iface: '${vnSERVER_IFACE}' into the namespace: '${vnSERVER_NAMESPACE}'."
|
|
|
a8930ab |
rlRun "ip link set ${vnCLIENT_IFACE} netns ${vnCLIENT_NAMESPACE}" 0 "Adding iface: '${vnCLIENT_IFACE}' into the namespace: '${vnCLIENT_NAMESPACE}'."
|
|
|
a8930ab |
}
|
|
|
a8930ab |
|
|
|
a8930ab |
vnRemoveServerClientNetwork()
|
|
|
a8930ab |
{
|
|
|
a8930ab |
rlRun "ip netns exec ${vnSERVER_NAMESPACE} ip link del ${vnSERVER_IFACE}" 0 "Removing network for SERVER and CLIENT."
|
|
|
a8930ab |
|
|
|
a8930ab |
rlRun "ip netns del ${vnSERVER_NAMESPACE}" 0 "Removing SERVER namespace: '${vnSERVER_NAMESPACE}'."
|
|
|
a8930ab |
rlRun "ip netns del ${vnCLIENT_NAMESPACE}" 0 "Removing CLIENT namespace: '${vnCLIENT_NAMESPACE}'."
|
|
|
a8930ab |
}
|
|
|
a8930ab |
|
|
|
a8930ab |
vnRunServer()
|
|
|
a8930ab |
{
|
|
|
a8930ab |
local command="$1"
|
|
|
a8930ab |
local ret_val="${2:-0}"
|
|
|
a8930ab |
local message="${3:-Running command on the SERVER: '${command}'}"
|
|
|
a8930ab |
|
|
|
a8930ab |
rlRun "ip netns exec ${vnSERVER_NAMESPACE} ${command}" "$ret_val" "$message"
|
|
|
a8930ab |
}
|
|
|
a8930ab |
|
|
|
a8930ab |
vnRunClient()
|
|
|
a8930ab |
{
|
|
|
a8930ab |
local command="$1"
|
|
|
a8930ab |
local ret_val="${2:-0}"
|
|
|
a8930ab |
local message="${3:-Running command on the CLIENT: '${command}'}"
|
|
|
a8930ab |
|
|
|
a8930ab |
rlRun "ip netns exec ${vnCLIENT_NAMESPACE} ${command}" "$ret_val" "$message"
|
|
|
a8930ab |
}
|
|
|
a8930ab |
|
|
|
a8930ab |
vnRun()
|
|
|
a8930ab |
{
|
|
|
a8930ab |
if [ "$vnSIDE" = 'server' ]; then
|
|
|
a8930ab |
vnRunServer "$1" "$2" "$3"
|
|
|
a8930ab |
elif [ "$vnSIDE" = 'client' ]; then
|
|
|
a8930ab |
vnRunClient "$1" "$2" "$3"
|
|
|
a8930ab |
else
|
|
|
a8930ab |
rlLogError "'vnSIDE' variable is not set properly."
|
|
|
a8930ab |
fi
|
|
|
a8930ab |
}
|
|
|
a8930ab |
|
|
|
a8930ab |
rlJournalStart
|
|
|
a8930ab |
rlPhaseStartSetup
|
|
|
a8930ab |
rlAssertRpm $PACKAGE
|
|
|
1d7553d |
|
|
|
a8930ab |
# Need to disable SeLinux, because it does not allow to start service via unit file
|
|
|
a8930ab |
# in a network namespace using "ip netns exec". And there are other issues with pid files, log files, etc.
|
|
|
a8930ab |
rlRun "setenforce 0" 0 "Disabling SELinux"
|
|
|
a8930ab |
rlRun "ORIG_AVC_ERROR=${AVC_ERROR}"
|
|
|
a8930ab |
rlRun "AVC_ERROR=+no_avc_check"
|
|
|
a8930ab |
|
|
|
a8930ab |
# set up network
|
|
|
a8930ab |
vnCreateServerClientNetwork
|
|
|
a8930ab |
vnRunServer "ip link set ${vnSERVER_IFACE} up" 0 "Setting the SERVER side of veth UP"
|
|
|
a8930ab |
vnRunServer "ip link set lo up" 0 "Setting the SERVER side loopback UP"
|
|
|
a8930ab |
vnRunClient "ip link set ${vnCLIENT_IFACE} up" 0 "Setting the CLIENT side of veth UP"
|
|
|
a8930ab |
vnRunClient "ip link set lo up" 0 "Setting the CLIENT side loopback UP"
|
|
|
a8930ab |
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"
|
|
|
a8930ab |
# client IP is not configured here, as the only way how to trigger warning is to configure the IP while zebra is already running
|
|
|
a8930ab |
vnRunServer "ip link add ${SRV_DUMMY1_IF_NAME} type dummy" 0 "Adding dummy interface on the SERVER side"
|
|
|
a8930ab |
vnRunServer "ip link set ${SRV_DUMMY1_IF_NAME} up" 0 "Setting the dummy interface UP"
|
|
|
a8930ab |
vnRunServer "ip addr add ${SRV_DUMMY1_IF_ADDR}/${SRV_DUMMY1_IF_PREFIX} dev ${SRV_DUMMY1_IF_NAME}" 0 "Configuring IPv4 address on dummy interface of the SERVER side"
|
|
|
a8930ab |
|
|
|
a8930ab |
rlFileBackup --clean "/etc/frr/"
|
|
|
a8930ab |
rlFileBackup --clean "/etc/systemd/system/"
|
|
|
a8930ab |
rlFileBackup --clean "/var/log/frr/"
|
|
|
1d7553d |
rlFileBackup --clean "/var/log/audit/audit.log"
|
|
|
a8930ab |
rlRun "mkdir /etc/frr/{vns,vnc}"
|
|
|
a8930ab |
#vtysh.conf and frr.conf are in /etc/frr/vns for the server namespace
|
|
|
a8930ab |
rlRun "cp -f vtysh-vns.conf ${SERVER_CONF_DIR}vtysh.conf" 0 "Copying vtysh configuration for the SERVER"
|
|
|
a8930ab |
rlRun "cp -f frr-vns.conf ${SERVER_CONF_DIR}frr.conf" 0 "Copying frr configuration for the SERVER"
|
|
|
a8930ab |
|
|
|
a8930ab |
#vtysh.conf and frr.conf are in /etc/frr/vnc for the client namespace
|
|
|
a8930ab |
rlRun "cp -f vtysh-vnc.conf ${CLIENT_CONF_DIR}vtysh.conf" 0 "Copying vtysh configuration for the CLIENT"
|
|
|
a8930ab |
rlRun "cp -f frr-vnc.conf ${CLIENT_CONF_DIR}frr.conf" 0 "Copying frr configuration for the CLIENT"
|
|
|
a8930ab |
rlRun "cp -f frr-vnc-reload.conf ${CLIENT_CONF_DIR}frr-vnc-reload.conf" 0 "Copying frr configuration for the CLIENT"
|
|
|
a8930ab |
|
|
|
a8930ab |
#I need separate daemons files as well for watchfrr options
|
|
|
a8930ab |
rlRun "cp -f daemons-vns ${SERVER_CONF_DIR}daemons" 0 "Copying daemons file for the SERVER"
|
|
|
a8930ab |
rlRun "cp -f daemons-vnc ${CLIENT_CONF_DIR}daemons" 0 "Copying daemons file for the CLIENT"
|
|
|
a8930ab |
|
|
|
a8930ab |
rlRun "ls -lR /etc/frr/*"
|
|
|
a8930ab |
rlRun "cp -f frr-vn{s,c}.service /etc/systemd/system/" 0 "Copying custom unit files to run frr in network namespaces"
|
|
|
a8930ab |
|
|
|
a8930ab |
# /etc/frr/vns/frr.conf
|
|
|
a8930ab |
rlRun "sed -i 's|<VNSIF>|${vnSERVER_IFACE}|g' ${SERVER_CONF_DIR}frr.conf"
|
|
|
a8930ab |
rlRun "sed -i 's|<DUMMYIF1>|${SRV_DUMMY1_IF_NAME}|g' ${SERVER_CONF_DIR}frr.conf"
|
|
|
a8930ab |
rlRun "sed -i 's|<SERVER_FRR_LOG>|${SERVER_FRR_LOG}|g' ${SERVER_CONF_DIR}frr.conf"
|
|
|
a8930ab |
rlRun "sed -i 's|<SERVER_IF_ADDR>|${SERVER_IF_ADDR}|g' ${SERVER_CONF_DIR}frr.conf"
|
|
|
a8930ab |
rlRun "sed -i 's|<SRV_DUMMY1_IF_NETWORK>|${SRV_DUMMY1_IF_NETWORK}|g' ${SERVER_CONF_DIR}frr.conf"
|
|
|
a8930ab |
rlRun "sed -i 's|<SRV_DUMMY1_IF_PREFIX>|${SRV_DUMMY1_IF_PREFIX}|g' ${SERVER_CONF_DIR}frr.conf"
|
|
|
a8930ab |
rlRun "sed -i 's|<CLIENT_IF_ADDR>|${CLIENT_IF_ADDR}|g' ${SERVER_CONF_DIR}frr.conf"
|
|
|
a8930ab |
|
|
|
a8930ab |
# /etc/frr/vnc/frr.conf
|
|
|
a8930ab |
rlRun "sed -i 's|<CLIENT_FRR_LOG>|${CLIENT_FRR_LOG}|g' ${CLIENT_CONF_DIR}frr.conf"
|
|
|
a8930ab |
rlRun "sed -i 's|<SERVER_IF_ADDR>|${SERVER_IF_ADDR}|g' ${CLIENT_CONF_DIR}frr.conf"
|
|
|
a8930ab |
rlRun "sed -i 's|<CLIENT_IF_ADDR>|${CLIENT_IF_ADDR}|g' ${CLIENT_CONF_DIR}frr.conf"
|
|
|
a8930ab |
|
|
|
a8930ab |
# /etc/frr/vnc/frr-vnc-reload.conf
|
|
|
a8930ab |
rlRun "sed -i 's|<CLIENT_FRR_LOG>|${CLIENT_FRR_LOG}|g' ${CLIENT_CONF_DIR}frr-vnc-reload.conf"
|
|
|
a8930ab |
rlRun "sed -i 's|<SERVER_IF_ADDR>|${SERVER_IF_ADDR}|g' ${CLIENT_CONF_DIR}frr-vnc-reload.conf"
|
|
|
a8930ab |
rlRun "sed -i 's|<CLIENT_IF_ADDR>|${CLIENT_IF_ADDR}|g' ${CLIENT_CONF_DIR}frr-vnc-reload.conf"
|
|
|
a8930ab |
|
|
|
a8930ab |
rlRun "systemctl daemon-reload"
|
|
|
a8930ab |
rlPhaseEnd
|
|
|
a8930ab |
|
|
|
a8930ab |
rlPhaseStartTest
|
|
|
a8930ab |
rlRun "systemctl start frr-vns.service" 0 "Starting FRR on SERVER side"
|
|
|
a8930ab |
rlRun "systemctl start frr-vnc.service" 0 "Starting FRR on CLIENT side"
|
|
|
a8930ab |
|
|
|
a8930ab |
#vtysh also needs to run for a specific namespace
|
|
|
a8930ab |
rlRun "vtysh -N vns -c 'sh run'"
|
|
|
a8930ab |
rlRun "vtysh -N vnc -c 'sh run'"
|
|
|
a8930ab |
|
|
|
a8930ab |
vnRunClient "ip addr add ${CLIENT_IF_ADDR}/${CLIENT_IF_PREFIX} broadcast ${CLIENT_IF_BCAST} dev ${vnCLIENT_IFACE}"
|
|
|
a8930ab |
|
|
|
a8930ab |
vnRunServer "ping -c 1 ${CLIENT_IF_ADDR}" 0 "Testing that server can ping client IP"
|
|
|
a8930ab |
vnRunClient "ping -c 1 ${SERVER_IF_ADDR}" 0 "Testing that client can ping server IP"
|
|
|
a8930ab |
# THIS IS THE ONLY BUG THAT CAN BE REPRODUCED, everything else works...
|
|
|
a8930ab |
rlAssertNotGrep "warning: interface ${vnCLIENT_IFACE} broadcast addr ${CLIENT_IF_BCAST}/${CLIENT_IF_PREFIX} != calculated ${SERVER_IF_ADDR}, routing protocols may malfunction" "${CLIENT_FRR_LOG}"
|
|
|
a8930ab |
|
|
|
a8930ab |
rlRun "sleep 30" 0 "Waiting for BGP peers to exchange routes and converge"
|
|
|
a8930ab |
|
|
|
a8930ab |
#First let's see that the neighborship is established
|
|
|
a8930ab |
rlRun "vtysh -N vns -c 'show ip bgp nei' | grep \"BGP neighbor is ${CLIENT_IF_ADDR}\"" 0 "Show BGP neighborship on SERVER"
|
|
|
a8930ab |
rlRun "vtysh -N vns -c 'show ip bgp nei' | grep \"BGP state = Established\"" 0 "BGP neighborship on SERVER is Established"
|
|
|
a8930ab |
rlRun "vtysh -N vnc -c 'show ip bgp nei' | grep \"BGP neighbor is ${SERVER_IF_ADDR}\"" 0 "Show BGP neighborship on CLIENT"
|
|
|
a8930ab |
rlRun "vtysh -N vnc -c 'show ip bgp nei' | grep \"BGP state = Established\"" 0 "GP neighborship on CLIENT is Established"
|
|
|
a8930ab |
|
|
|
a8930ab |
#At first, the route to the advertised network should be visible ONLY on the SERVER, CLIENT has filter
|
|
|
a8930ab |
rlRun -s "vtysh -N vns -c 'show ip route' | grep \"${SRV_DUMMY1_IF_NETWORK}/${SRV_DUMMY1_IF_PREFIX} is directly connected\"" 0 "Show routes on SERVER"
|
|
|
a8930ab |
rlRun -s "vtysh -N vnc -c 'show ip route' | grep -v \"${SRV_DUMMY1_IF_NETWORK}/${SRV_DUMMY1_IF_PREFIX}\"" 0 "Show routes on CLIENT"
|
|
|
a8930ab |
|
|
|
a8930ab |
#Reload CLIENT config with permit clause in the prefix-list
|
|
|
a8930ab |
rlRun "/usr/libexec/frr/frr-reload.py -N vnc --reload ${CLIENT_CONF_DIR}frr-vnc-reload.conf"
|
|
|
a8930ab |
|
|
|
a8930ab |
rlRun "vtysh -N vnc -c 'sh ip route'"
|
|
|
a8930ab |
rlRun "sleep 30" 0 "Waiting for the routes to exchange"
|
|
|
a8930ab |
rlRun "vtysh -N vnc -c 'sh ip route'"
|
|
|
a8930ab |
|
|
|
a8930ab |
#Check that the route from SERVER is available
|
|
|
a8930ab |
rlRun -s "vtysh -N vnc -c 'show ip route' | grep \"${SRV_DUMMY1_IF_NETWORK}/${SRV_DUMMY1_IF_PREFIX}\"" 0 "Show routes on CLIENT"
|
|
|
a8930ab |
rlPhaseEnd
|
|
|
a8930ab |
|
|
|
a8930ab |
rlPhaseStartCleanup
|
|
|
a8930ab |
rlRun "systemctl stop frr-vns.service frr-vnc.service" 0 "Stopping FRR"
|
|
|
a8930ab |
|
|
|
a8930ab |
vnRunServer "ip link del ${SRV_DUMMY1_IF_NAME} type dummy"
|
|
|
a8930ab |
vnRemoveServerClientNetwork
|
|
|
a8930ab |
|
|
|
a8930ab |
rlFileRestore
|
|
|
a8930ab |
rlRun "systemctl daemon-reload"
|
|
|
a8930ab |
|
|
|
a8930ab |
# restoring SELinux
|
|
|
a8930ab |
rlRun "setenforce 1" 0 "re-Enabling SELinux"
|
|
|
a8930ab |
rlRun "AVC_ERROR=${ORIG_AVC_ERROR}"
|
|
|
a8930ab |
rlPhaseEnd
|
|
|
a8930ab |
rlJournalPrintText
|
|
|
a8930ab |
rlJournalEnd
|