ovs-vswitchd.at 6.2 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
AT_BANNER([ovs-vswitchd])

dnl The OVS initscripts never make an empty database (one without even an
dnl Open_vSwitch record) visible to ovs-vswitchd, but hand-rolled scripts
dnl sometimes do.  At one point, "ovs-vswitchd --detach" would never detach
dnl and use 100% CPU if this happened, so this test checks for regression.
AT_SETUP([ovs-vswitchd detaches correctly with empty db])
OVS_RUNDIR=`pwd`; export OVS_RUNDIR
OVS_LOGDIR=`pwd`; export OVS_LOGDIR
OVS_DBDIR=`pwd`; export OVS_DBDIR
OVS_SYSCONFDIR=`pwd`; export OVS_SYSCONFDIR
ON_EXIT([kill `cat ovsdb-server.pid ovs-vswitchd.pid`])

dnl Create database.
touch .conf.db.~lock~
AT_CHECK([ovsdb-tool create conf.db $abs_top_srcdir/vswitchd/vswitch.ovsschema])

dnl Start ovsdb-server.  *Don't* initialize database.
AT_CHECK([ovsdb-server --detach --no-chdir --pidfile --log-file --remote=punix:$OVS_RUNDIR/db.sock], [0], [ignore], [ignore])
AT_CAPTURE_FILE([ovsdb-server.log])

dnl Start ovs-vswitchd.
AT_CHECK([ovs-vswitchd --detach --no-chdir --pidfile --enable-dummy --disable-system --log-file], [0], [], [stderr])
AT_CAPTURE_FILE([ovs-vswitchd.log])

dnl ovs-vswitchd detached OK or we wouldn't have made it this far.  Success.
AT_CLEANUP
28 29 30 31


dnl ----------------------------------------------------------------------
m4_define([OVS_VSCTL_CHECK_RX_PKT], [
32
AT_CHECK([ovs-vsctl list int $1 | grep statistics | sed -n 's/^.*\(rx_packets=[[0-9]][[0-9]]*\).*$/\1/p'],[0],
33 34 35 36 37 38 39 40 41
[dnl
rx_packets=$2
])
])

AT_SETUP([ovs-vswitchd -- stats-update-interval])
OVS_VSWITCHD_START([add-port br0 p1 -- set int p1 type=internal])
ovs-appctl time/stop

42
dnl at the beginning, the update of rx_packets should happen every 5 seconds.
43
ovs-appctl time/warp 11000 1000
44 45
OVS_VSCTL_CHECK_RX_PKT([p1], [0])
AT_CHECK([ovs-appctl netdev-dummy/receive p1 'eth(src=50:54:00:00:00:09,dst=50:54:00:00:00:0a),eth_type(0x0800),ipv4(src=10.0.0.2,dst=10.0.0.1,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
46
ovs-appctl time/warp 11000 1000
47 48 49 50
OVS_VSCTL_CHECK_RX_PKT([p1], [1])

dnl set the stats update interval to 100K ms, the following 'recv' should not be updated.
AT_CHECK([ovs-vsctl set O . other_config:stats-update-interval=100000])
51
ovs-appctl time/warp 51000 1000
52 53 54 55 56 57
for i in `seq 1 5`; do
    AT_CHECK([ovs-appctl netdev-dummy/receive p1 'eth(src=50:54:00:00:00:09,dst=50:54:00:00:00:0a),eth_type(0x0800),ipv4(src=10.0.0.2,dst=10.0.0.1,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
done

OVS_VSCTL_CHECK_RX_PKT([p1], [1])
dnl advance the clock by 100K ms, the previous 'recv' should be updated.
58
ovs-appctl time/warp 100000 1000
59 60 61 62 63
OVS_VSCTL_CHECK_RX_PKT([p1], [6])

dnl now remove the configuration. 'recv' one packet.  there should be an update after 5000 ms.
AT_CHECK([ovs-vsctl clear O . other_config])
AT_CHECK([ovs-appctl netdev-dummy/receive p1 'eth(src=50:54:00:00:00:09,dst=50:54:00:00:00:0a),eth_type(0x0800),ipv4(src=10.0.0.2,dst=10.0.0.1,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
64
ovs-appctl time/warp 11000 1000
65 66 67
OVS_VSCTL_CHECK_RX_PKT([p1], [7])

OVS_VSWITCHD_STOP
68
AT_CLEANUP
Alex Wang's avatar
Alex Wang committed
69 70 71 72 73 74

dnl ----------------------------------------------------------------------
AT_SETUP([ovs-vswitchd -- start additional ovs-vswitchd process])
OVS_VSWITCHD_START

# start another ovs-vswitchd process.
75
ovs-vswitchd --log-file=fakelog --unixctl="`pwd`"/unixctl &
Alex Wang's avatar
Alex Wang committed
76 77 78 79 80

# sleep for a while
sleep 5

# stop the process.
81
ovs-appctl -t `pwd`/unixctl exit
Alex Wang's avatar
Alex Wang committed
82 83

# check the fakelog, should only see one ERR for reporting
84
# the existing ovs-vswitchd process.
85
AT_CHECK([test `grep ERR fakelog | wc -l` -eq 1])
Alex Wang's avatar
Alex Wang committed
86

87
AT_CHECK([tail -n1 fakelog | sed -e 's/^.*ERR|//; s/pid [[0-9]]*//'], [0], [dnl
Alex Wang's avatar
Alex Wang committed
88 89 90 91 92
another ovs-vswitchd process is running, disabling this process () until it goes away
])

OVS_VSWITCHD_STOP
AT_CLEANUP
93 94 95 96 97 98

dnl ----------------------------------------------------------------------
AT_SETUP([ovs-vswitchd -- switch over to another ovs-vswitchd process])
OVS_VSWITCHD_START

# start a new ovs-vswitchd process.
99
ovs-vswitchd --log-file=fakelog --enable-dummy --unixctl="`pwd`"/unixctl &
100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116

# sleep for a while.
sleep 5

# kill the current active ovs-vswitchd process.
kill `cat ovs-vswitchd.pid`

sleep 5

# check the creation of br0 on the new ovs-vswitchd process.
AT_CHECK([grep "bridge br0" fakelog | sed -e 's/port [[0-9]]*$/port/;
s/datapath ID [[a-z0-9]]*$/datapath ID/;s/^.*INFO|//'], [0], [dnl
bridge br0: added interface br0 on port
bridge br0: using datapath ID
])

# stop the process.
117
ovs-appctl -t `pwd`/unixctl exit
118 119 120 121 122 123 124 125 126 127 128 129 130 131

# check the fakelog, should not see WARN/ERR/EMER log other than the one
# for reporting the existing ovs-vswitchd process and the one for killing
# the process.
AT_CHECK([sed -n "
/|ERR|another ovs-vswitchd process is running/d
/|WARN|/p
/|ERR|/p
/|EMER|/p" fakelog
])

# cleanup.
kill `cat ovsdb-server.pid`
AT_CLEANUP
132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155

dnl ----------------------------------------------------------------------
AT_SETUP([ovs-vswitchd -- invalid database path])

# start an ovs-vswitchd process with invalid db path.
ovs-vswitchd unix:invalid.db.sock --log-file=fakelog --enable-dummy --unixctl="`pwd`"/unixctl &

# sleep for a while.
sleep 10

# stop the process.
ovs-appctl -t `pwd`/unixctl exit

# should not see this log (which indicates high cpu utilization).
AT_CHECK([grep "wakeup due to" fakelog], [ignore])

# check the fakelog, should not see any WARN/ERR/EMER log.
AT_CHECK([sed -n "
/|WARN|/p
/|ERR|/p
/|EMER|/p" fakelog
])

AT_CLEANUP
156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185

dnl ----------------------------------------------------------------------
AT_SETUP([ovs-vswitchd - do not create sockets with unsafe names])
OVS_VSWITCHD_START

# On Unix systems, test for sockets with "test -S".
#
# On Windows systems, we simulate a socket with a regular file that contains
# a TCP port number, so use "test -f" there instead.
if test $IS_WIN32 = yes; then
   S=f
else
   S=S
fi

# Create a bridge with an ordinary name and make sure that the management
# socket gets creatd.
AT_CHECK([ovs-vsctl add-br a -- set bridge a datapath-type=dummy])
AT_CHECK([test -$S a.mgmt])

# Create a bridge with an unsafe name and make sure that the management
# socket does not get created.
mkdir b
AT_CHECK([ovs-vsctl add-br b/c -- set bridge b/c datapath-type=dummy], [0],
  [], [ovs-vsctl: Error detected while setting up 'b/c'.  See ovs-vswitchd log for details.
])
AT_CHECK([test ! -e b/c.mgmt])

OVS_VSWITCHD_STOP(['/ignoring bridge with invalid name/d'])
AT_CLEANUP