1 AT_BANNER([ovs-vswitchd])
3 dnl The OVS initscripts never make an empty database (one without even an
4 dnl Open_vSwitch record) visible to ovs-vswitchd, but hand-rolled scripts
5 dnl sometimes do. At one point, "ovs-vswitchd --detach" would never detach
6 dnl and use 100% CPU if this happened, so this test checks for regression.
7 AT_SETUP([ovs-vswitchd detaches correctly with empty db])
8 on_exit 'kill `cat ovsdb-server.pid ovs-vswitchd.pid`'
12 AT_CHECK([ovsdb-tool create conf.db $abs_top_srcdir/vswitchd/vswitch.ovsschema])
14 dnl Start ovsdb-server. *Don't* initialize database.
15 AT_CHECK([ovsdb-server --detach --no-chdir --pidfile --log-file --remote=punix:$OVS_RUNDIR/db.sock], [0], [ignore], [ignore])
16 AT_CAPTURE_FILE([ovsdb-server.log])
18 dnl Start ovs-vswitchd.
19 AT_CHECK([ovs-vswitchd --detach --no-chdir --pidfile --enable-dummy --disable-system --log-file], [0], [], [stderr])
20 AT_CAPTURE_FILE([ovs-vswitchd.log])
22 dnl ovs-vswitchd detached OK or we wouldn't have made it this far. Success.
23 OVS_APP_EXIT_AND_WAIT([ovs-vswitchd])
24 OVS_APP_EXIT_AND_WAIT([ovsdb-server])
28 dnl ----------------------------------------------------------------------
29 m4_define([OVS_VSCTL_CHECK_RX_PKT], [
30 AT_CHECK([ovs-vsctl list int $1 | grep statistics | sed -n 's/^.*\(rx_packets=[[0-9]][[0-9]]*\).*$/\1/p'],[0],
36 AT_SETUP([ovs-vswitchd -- stats-update-interval])
37 OVS_VSWITCHD_START([add-port br0 p1 -- set int p1 type=internal])
40 dnl at the beginning, the update of rx_packets should happen every 5 seconds.
41 ovs-appctl time/warp 11000 1000
42 OVS_VSCTL_CHECK_RX_PKT([p1], [0])
43 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)'])
44 ovs-appctl time/warp 11000 1000
45 OVS_VSCTL_CHECK_RX_PKT([p1], [1])
47 dnl set the stats update interval to 100K ms, the following 'recv' should not be updated.
48 AT_CHECK([ovs-vsctl set O . other_config:stats-update-interval=100000])
49 ovs-appctl time/warp 51000 1000
50 for i in `seq 1 5`; do
51 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)'])
54 OVS_VSCTL_CHECK_RX_PKT([p1], [1])
55 dnl advance the clock by 100K ms, the previous 'recv' should be updated.
56 ovs-appctl time/warp 100000 1000
57 OVS_VSCTL_CHECK_RX_PKT([p1], [6])
59 dnl now remove the configuration. 'recv' one packet. there should be an update after 5000 ms.
60 AT_CHECK([ovs-vsctl clear O . other_config])
61 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)'])
62 ovs-appctl time/warp 11000 1000
63 OVS_VSCTL_CHECK_RX_PKT([p1], [7])
68 dnl ----------------------------------------------------------------------
69 AT_SETUP([ovs-vswitchd -- start additional ovs-vswitchd process])
72 # start another ovs-vswitchd process.
73 ovs-vswitchd --log-file=fakelog --unixctl="`pwd`"/unixctl &
79 OVS_APP_EXIT_AND_WAIT([`pwd`/unixctl])
81 # check the fakelog, should only see one ERR for reporting
82 # the existing ovs-vswitchd process.
83 AT_CHECK([test `grep ERR fakelog | wc -l` -eq 1])
85 AT_CHECK([tail -n1 fakelog | sed -e 's/^.*ERR|//; s/pid [[0-9]]*//'], [0], [dnl
86 another ovs-vswitchd process is running, disabling this process () until it goes away
92 dnl ----------------------------------------------------------------------
93 AT_SETUP([ovs-vswitchd -- switch over to another ovs-vswitchd process])
96 # start a new ovs-vswitchd process.
97 ovs-vswitchd --log-file=fakelog --enable-dummy --unixctl="`pwd`"/unixctl &
102 # kill the current active ovs-vswitchd process.
103 kill `cat ovs-vswitchd.pid`
107 # check the creation of br0 on the new ovs-vswitchd process.
108 AT_CHECK([grep "bridge br0" fakelog | sed -e 's/port [[0-9]]*$/port/;
109 s/datapath ID [[a-z0-9]]*$/datapath ID/;s/^.*INFO|//'], [0], [dnl
110 bridge br0: added interface br0 on port
111 bridge br0: using datapath ID
115 OVS_APP_EXIT_AND_WAIT([`pwd`/unixctl])
117 # check the fakelog, should not see WARN/ERR/EMER log other than the one
118 # for reporting the existing ovs-vswitchd process and the one for killing
121 /|ERR|another ovs-vswitchd process is running/d
128 kill `cat ovsdb-server.pid`
131 dnl ----------------------------------------------------------------------
132 AT_SETUP([ovs-vswitchd -- invalid database path])
134 # start an ovs-vswitchd process with invalid db path.
135 ovs-vswitchd unix:invalid.db.sock --log-file=fakelog --enable-dummy --unixctl="`pwd`"/unixctl &
141 OVS_APP_EXIT_AND_WAIT([`pwd`/unixctl])
143 # should not see this log (which indicates high cpu utilization).
144 AT_CHECK([grep "wakeup due to" fakelog], [ignore])
146 # check the fakelog, should not see any WARN/ERR/EMER log.
155 dnl ----------------------------------------------------------------------
156 AT_SETUP([ovs-vswitchd -- set service controller])
157 AT_SKIP_IF([test "$IS_WIN32" = "yes"])
160 AT_CHECK([ovs-vsctl set-controller br0 punix:$(pwd)/br0.void])
161 OVS_WAIT_UNTIL([test -e br0.void])
163 AT_CHECK([ovs-vsctl set-controller br0 punix:$(pwd)/br0.void/../overwrite.file])
164 OVS_WAIT_UNTIL([test -n "`grep ERR ovs-vswitchd.log | grep overwrite.file`"])
166 OVS_VSWITCHD_STOP(["/Not adding Unix domain socket controller/d"])
169 dnl ----------------------------------------------------------------------
170 dnl OVSDB server before release version 2.5 does not support the monitor2
171 dnl method. This test defeatures the OVSDB server to simulate an older
172 dnl OVSDB server and make sure ovs-vswitchd can still work with it
173 AT_SETUP([ovs-vswitchd -- Compatible with OVSDB server - w/o monitor2])
176 dnl defeature OVSDB server -- no monitor2
177 AT_CHECK([ovs-appctl -t ovsdb-server ovsdb-server/disable-monitor2])
181 AT_CHECK([ovs-vsctl add-port br0 p0 -- set interface p0 type=internal])
182 AT_CHECK([ovs-vsctl add-port br0 p1 -- set interface p1 type=internal])
184 dnl ovs-vswitchd should still 'see' ovsdb change with the 'monitor' method
185 AT_CHECK([ovs-appctl dpif/show | tail -n +3], [0], [dnl
186 br0 65534/100: (dummy)
193 dnl ----------------------------------------------------------------------
194 AT_SETUP([ovs-vswitchd - do not create sockets with unsafe names])
197 # On Unix systems, test for sockets with "test -S".
199 # On Windows systems, we simulate a socket with a regular file that contains
200 # a TCP port number, so use "test -f" there instead.
201 if test $IS_WIN32 = yes; then
207 # Create a bridge with an ordinary name and make sure that the management
208 # socket gets creatd.
209 AT_CHECK([ovs-vsctl add-br a -- set bridge a datapath-type=dummy])
210 AT_CHECK([test -$S a.mgmt])
212 # Create a bridge with an unsafe name and make sure that the management
213 # socket does not get created.
215 AT_CHECK([ovs-vsctl add-br b/c -- set bridge b/c datapath-type=dummy], [0],
216 [], [ovs-vsctl: Error detected while setting up 'b/c'. See ovs-vswitchd log for details.
218 AT_CHECK([test ! -e b/c.mgmt])
220 OVS_VSWITCHD_STOP(['/ignoring bridge with invalid name/d'])