#!/bin/bash
# vim: dict=/usr/share/beakerlib/dictionary.vim cpt=.,w,b,u,t,i,k
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#
# runtest.sh of /CoreOS/iproute/Sanity/bridge-utility
# Description: Test basic bridge funcionality
# Author: David Spurek <dspurek@redhat.com>
#
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#
# Copyright (c) 2013 Red Hat, Inc. All rights reserved.
#
# This copyrighted material is made available to anyone wishing
# to use, modify, copy, or redistribute it subject to the terms
# and conditions of the GNU General Public License version 2.
#
# This program is distributed in the hope that it will be
# useful, but WITHOUT ANY WARRANTY; without even the implied
# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
# PURPOSE. See the GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public
# License along with this program; if not, write to the Free
# Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
# Boston, MA 02110-1301, USA.
#
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Include Beaker environment
. /usr/bin/rhts-environment.sh || exit 1
. /usr/share/beakerlib/beakerlib.sh || exit 1
PACKAGE="iproute"
PACKAGES="$PACKAGE"
rlIsRHEL 6 && PACKAGES=( ${PACKAGES[@]} "bridge-utils" )
vxlan_name="testvxlan"
bridge_name="testbridge"
lsmod | grep dummy
dummy_loaded=$?
rlJournalStart
rlPhaseStartSetup
# Check reqiured packages.
for P in ${PACKAGES[@]}; do rlCheckRpm $P || rlDie "Package $P is missing"; done
rlRun "TmpDir=\$(mktemp -d)" 0 "Creating tmp directory"
rlRun "pushd $TmpDir"
no_dummy=0
if [ $dummy_loaded -eq 1 ] ; then
# dummy module doesn't loaded before the test
modprobe dummy numdummies=2
else
# dummy module loaded before the test, backup number of loaded dummy devices (nmdumies parameter), it is doesn't show under /sys/module/dummy/parameters
dummies_count=`ip a | grep dummy | tail -n 1 | sed -r 's/.*dummy([0-9]+).*/\1/'`
if [ -z $dummies_count] ; then
# dummy module is loaded but no dummy device exists
no_dummy=1
else
# get correct count, dummy0 is the first
let "dummies_count=$dummies_count+1"
fi
rmmod dummy
modprobe dummy numdummies=2
fi
rlRun "ip addr flush dev dummy0"
rlRun "ip link set dummy0 up"
rlRun "ip addr flush dev dummy1"
rlRun "ip link set dummy1 up"
rlRun "ip addr add 127.0.0.13/24 dev dummy0" 0 "Setting IPv4 address to
dummy0 interface"
rlRun "ip addr add 127.0.0.14/24 dev dummy1" 0 "Setting IPv4 address to
dummy1 interface"
rlPhaseEnd
rlPhaseStartTest "Test bridge fdb basic funcionality with vxlan device"
rlRun "ip link add $vxlan_name type vxlan id 10 group 239.0.0.10 ttl 4 dev dummy0" 0 "add vxlan interface"
rlRun "ip addr add 192.168.1.1/24 broadcast 192.168.1.255 dev $vxlan_name" 0 "setting address to vxlan interface"
rlRun "ip -d link show $vxlan_name" 0 "show details about vxlan device"
vxlan_ether_address=`ip -d link show $vxlan_name | grep link/ether | awk '{print $2}'`
echo "ethernet address of vxlan device is: $vxlan_ether_address"
# add new entry to bridge fdb database (device must by type vxlan)
rlRun "bridge fdb add $vxlan_ether_address dst 192.19.0.2 dev $vxlan_name"
# check if entry was successfuly added
bridge fdb show dev $vxlan_name &> bridge_show.out
cat bridge_show.out
rlAssertGrep "$vxlan_ether_address dst 192.19.0.2" bridge_show.out "-i"
# try replace entry in bridge fdb database
rlRun "bridge fdb replace $vxlan_ether_address dst 192.19.0.3 dev $vxlan_name"
# check if entry was successfuly changed
bridge fdb show dev $vxlan_name &> bridge_show.out
cat bridge_show.out
rlAssertGrep "$vxlan_ether_address dst 192.19.0.3" bridge_show.out "-i"
rlRun "bridge fdb del $vxlan_ether_address dev $vxlan_name"
# check if entry was successfuly deleted
# 'default' entry added by ip link command should be still listed
bridge fdb show dev $vxlan_name &> bridge_show.out
cat bridge_show.out
rlAssertNotGrep "$vxlan_ether_address dst 192.19.0.2" bridge_show.out "-i"
rlAssertGrep "dst 239.0.0.10 via dummy0" bridge_show.out "-i"
# add new entry to bridge fdb database with port,vni and via options
rlRun "bridge fdb add $vxlan_ether_address dst 192.19.0.2 dev $vxlan_name port 10000 vni 100 via dummy0"
# check if entry was successfuly added
bridge fdb show dev $vxlan_name &> bridge_show.out
cat bridge_show.out
rlAssertGrep "$vxlan_ether_address dst 192.19.0.2 port 10000 vni 100 via dummy0" bridge_show.out "-i"
rlRun "bridge fdb del $vxlan_ether_address dev $vxlan_name"
# add new entry to bridge fdb database with self option
rlRun "bridge fdb add $vxlan_ether_address dst 192.19.0.2 dev $vxlan_name self"
# check if entry was successfuly added
bridge fdb show dev $vxlan_name &> bridge_show.out
cat bridge_show.out
rlAssertGrep "$vxlan_ether_address dst 192.19.0.2 self" bridge_show.out "-i"
# replace entry in bridge fdb database with temp option
rlRun "bridge fdb replace $vxlan_ether_address dst 192.19.0.2 dev $vxlan_name temp"
# check if entry was successfuly changed
bridge fdb show dev $vxlan_name &> bridge_show.out
cat bridge_show.out
rlAssertGrep "$vxlan_ether_address dst 192.19.0.2 self static" bridge_show.out "-i"
# replace entry in bridge fdb database with local option
rlRun "bridge fdb replace $vxlan_ether_address dst 192.19.0.2 dev $vxlan_name local"
# check if entry was successfuly changed
bridge fdb show dev $vxlan_name &> bridge_show.out
cat bridge_show.out
rlAssertGrep "$vxlan_ether_address dst 192.19.0.2 self permanent" bridge_show.out "-i"
# replace entry in bridge fdb database with router option
rlRun "bridge fdb replace $vxlan_ether_address dst 192.19.0.2 dev $vxlan_name router"
# check if entry was successfuly changed
bridge fdb show dev $vxlan_name &> bridge_show.out
cat bridge_show.out
rlAssertGrep "$vxlan_ether_address dst 192.19.0.2 self router permanent" bridge_show.out "-i"
rlRun "bridge fdb del $vxlan_ether_address dev $vxlan_name"
rlRun "ip link del $vxlan_name" 0
rlPhaseEnd
rlPhaseStartTest "Test bridge fdb basic funcionality with bridge device, test bridge link set command"
# on rhels < 7 must be bridge device added with brctl (add type bridge is not supported)
rlIsRHEL '>=7' && rlRun "ip link add $bridge_name type bridge" 0 || rlRun "brctl addbr $bridge_name" 0
if rlIsRHEL '>=7'; then
rlRun "ip link set dummy0 master $bridge_name" 0 "Add dummy interface to bridge"
rlRun "bridge link show dev dummy0"
# test bridge link set, command is not supported on rhel < 7 (->ndo_bridge_setlink() is not in our kernel.)
rlRun "bridge link set dev dummy0 cost 10"
rlRun "bridge link show dev dummy0 &> bridge_show.out" 0
cat bridge_show.out
rlAssertGrep "dummy0.*cost 10 $" bridge_show.out "-i"
# add new entry to bridge fdb database with self option
rlRun "bridge fdb add 00:1b:21:55:23:61 dev dummy0 self"
bridge fdb show dev dummy0 &> bridge_show.out
cat bridge_show.out
rlAssertGrep "00:1b:21:55:23:61 self" bridge_show.out "-i"
# add new entry to bridge fdb database with master option
rlRun "bridge fdb add 00:1b:21:55:23:62 dev dummy0 master"
bridge fdb show dev dummy0 &> bridge_show.out
cat bridge_show.out
rlAssertGrep "00:1b:21:55:23:62 vlan 1" bridge_show.out "-i"
# add new entry to bridge fdb database with master and self options (entries for both should be added)
rlRun "bridge fdb add 00:1b:21:55:23:63 dev dummy0 self master"
bridge fdb show dev dummy0 &> bridge_show.out
cat bridge_show.out
rlAssertGrep "00:1b:21:55:23:63 self" bridge_show.out "-i"
rlAssertGrep "00:1b:21:55:23:63 vlan 1" bridge_show.out "-i"
else
rlRun "brctl addif $bridge_name dummy0" 0 "Add dummy interface to bridge"
rlRun "brctl show $bridge_name"
fi
rlIsRHEL '>=7' && rlRun "ip link set dummy0 nomaster" 0 "Remove dummy vlan interface from bridge" || rlRun "brctl delif $bridge_name dummy0" 0 "Remove dummy interface from bridge"
rlIsRHEL '>=7' && rlRun "ip link del $bridge_name" 0 || rlRun "brctl delbr $bridge_name" 0
rlPhaseEnd
rlPhaseStartTest "Test bridge vlan basic funcionality"
# on rhels < 7 must be bridge device added with brctl (add type bridge is not supported)
rlIsRHEL '>=7' && rlRun "ip link add $bridge_name type bridge" 0 || rlRun "brctl addbr $bridge_name" 0
rlRun "ip link add link dummy0 name dummy0.10 type vlan id 10"
if rlIsRHEL '>=7' ; then
rlRun "ip link set dummy0.10 master $bridge_name" 0 "Add dummy vlan interface to bridge"
rlRun "bridge link show dev dummy0.10"
else
rlRun "brctl addif $bridge_name dummy0.10" 0 "Add dummy vlan interface to bridge"
rlRun "brctl show $bridge_name"
fi
# bridge vlan is not supported on rhel < 6.8
if rlIsRHEL '>=7' || rlIsRHEL '>=6.8' || rlIsFedora; then
rlRun "bridge vlan add dev dummy0.10 vid 5" 0
else
rlRun "bridge vlan add dev dummy0.10 vid 5" 2
fi
# test correct funcionality only on rhel 7
if rlIsRHEL '>=7' ; then
bridge vlan &> bridge_vlan.out
cat bridge_vlan.out
#rlAssertGrep "dummy0.10.*5" bridge_vlan.out "-i"
#rlAssertGrep "dummy0.10.*10" bridge_vlan.out "-i"
rlRun "grep -A 2 'dummy0.10' bridge_vlan.out | grep '5'"
rlRun "bridge vlan del dev dummy0.10 vid 5"
bridge vlan &> bridge_vlan.out
cat bridge_vlan.out
#rlAssertNotGrep "dummy0.10" bridge_vlan.out "-i"
rlRun "grep -A 2 'dummy0.10' bridge_vlan.out | grep '5'" 1
fi
rlIsRHEL '>=7' && rlRun "ip link set dummy0.10 nomaster" 0 "Remove dummy vlan interface from bridge" || rlRun "brctl delif $bridge_name dummy0.10" 0 "Remove dummy vlan interface from bridge"
rlRun "ip link del dev dummy0.10"
rlIsRHEL '>=7' && rlRun "ip link del $bridge_name" 0 || rlRun "brctl delbr $bridge_name" 0
rlPhaseEnd
rlPhaseStartTest "Test bridge mdb basic funcionality"
rlRun "bridge mdb show" 0
rlPhaseEnd
if rlIsRHEL '>=7'; then
rlPhaseStartTest
rlRun "ip link add test_bridge type bridge"
rlRun "bridge fdb show | grep 'dev test_bridge' | grep 'master test_bridge'"
rlRun "ip link del test_bridge"
rlPhaseEnd
fi
rlPhaseStartCleanup
rlRun "ip route flush dev dummy0"
rlRun "ip link set dummy0 down"
rlRun "ip addr flush dev dummy0"
rlRun "ip route flush dev dummy1"
rlRun "ip link set dummy1 down"
rlRun "ip addr flush dev dummy1"
if [ $dummy_loaded -eq 1 ] ; then
rmmod dummy
else
rmmod dummy
if [ $no_dummy -eq 1 ] ; then
# load dummy module and delete dummy0 with ip link
modprobe dummy
rlIsRHEL '>=7' && rlRun "ip link del dummy0"
else
modprobe dummy numdummies=$dummies_count
fi
fi
rlRun "service network restart" 0,1 "Restarting network, just for sure"
rlRun "popd"
rlRun "rm -r $TmpDir" 0 "Removing tmp directory"
rlPhaseEnd
rlJournalPrintText
rlJournalEnd