#!/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 # # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # # 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