Blame Regression/routes-are-not-refreshed-after-changing-the-inbound-route-rules-from-deny-to-permit/runtest.sh

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