ovsdb: add conditions utilities to support monitor_cond
[cascardo/ovs.git] / tests / ovs-vswitchd.at
1 AT_BANNER([ovs-vswitchd])
2
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`'
9
10 dnl Create database.
11 touch .conf.db.~lock~
12 AT_CHECK([ovsdb-tool create conf.db $abs_top_srcdir/vswitchd/vswitch.ovsschema])
13
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])
17
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])
21
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])
25 AT_CLEANUP
26
27
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],
31 [dnl
32 rx_packets=$2
33 ])
34 ])
35
36 AT_SETUP([ovs-vswitchd -- stats-update-interval])
37 OVS_VSWITCHD_START([add-port br0 p1 -- set int p1 type=internal])
38 ovs-appctl time/stop
39
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])
46
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)'])
52 done
53
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])
58
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])
64
65 OVS_VSWITCHD_STOP
66 AT_CLEANUP
67
68 dnl ----------------------------------------------------------------------
69 AT_SETUP([ovs-vswitchd -- start additional ovs-vswitchd process])
70 OVS_VSWITCHD_START
71
72 # start another ovs-vswitchd process.
73 ovs-vswitchd --log-file=fakelog --unixctl="`pwd`"/unixctl --pidfile=`pwd`/ovs-vswitchd-2.pid &
74 on_exit 'kill `cat ovs-vswitchd-2.pid`'
75
76 # sleep for a while
77 sleep 5
78
79 # stop the process.
80 OVS_APP_EXIT_AND_WAIT_BY_TARGET([`pwd`/unixctl], [`pwd`/ovs-vswitchd-2.pid])
81
82 # check the fakelog, should only see one ERR for reporting
83 # the existing ovs-vswitchd process.
84 AT_CHECK([test `grep ERR fakelog | wc -l` -eq 1])
85
86 AT_CHECK([tail -n1 fakelog | sed -e 's/^.*ERR|//; s/pid [[0-9]]*//'], [0], [dnl
87 another ovs-vswitchd process is running, disabling this process () until it goes away
88 ])
89
90 OVS_VSWITCHD_STOP
91 AT_CLEANUP
92
93 dnl ----------------------------------------------------------------------
94 AT_SETUP([ovs-vswitchd -- switch over to another ovs-vswitchd process])
95 OVS_VSWITCHD_START
96
97 # start a new ovs-vswitchd process.
98 ovs-vswitchd --log-file=fakelog --enable-dummy --unixctl="`pwd`"/unixctl --pidfile=ovs-vswitchd-2.pid &
99 on_exit 'kill `cat ovs-vswitchd-2.pid`'
100
101 # sleep for a while.
102 sleep 5
103
104 # kill the current active ovs-vswitchd process.
105 kill `cat ovs-vswitchd.pid`
106
107 sleep 5
108
109 # check the creation of br0 on the new ovs-vswitchd process.
110 AT_CHECK([grep "bridge br0" fakelog | sed -e 's/port [[0-9]]*$/port/;
111 s/datapath ID [[a-z0-9]]*$/datapath ID/;s/^.*INFO|//'], [0], [dnl
112 bridge br0: added interface br0 on port
113 bridge br0: using datapath ID
114 ])
115
116 # stop the process.
117 OVS_APP_EXIT_AND_WAIT_BY_TARGET([`pwd`/unixctl], [ovs-vswitchd-2.pid])
118
119 # check the fakelog, should not see WARN/ERR/EMER log other than the one
120 # for reporting the existing ovs-vswitchd process and the one for killing
121 # the process.
122 AT_CHECK([sed -n "
123 /|ERR|another ovs-vswitchd process is running/d
124 /|WARN|/p
125 /|ERR|/p
126 /|EMER|/p" fakelog
127 ])
128
129 # cleanup.
130 kill `cat ovsdb-server.pid`
131 AT_CLEANUP
132
133 dnl ----------------------------------------------------------------------
134 AT_SETUP([ovs-vswitchd -- invalid database path])
135
136 # start an ovs-vswitchd process with invalid db path.
137 ovs-vswitchd unix:invalid.db.sock --log-file=fakelog --enable-dummy --unixctl="`pwd`"/unixctl --pidfile=ovs-vswitchd-2.pid &
138 on_exit 'kill `cat ovs-vswitchd-2.pid`'
139
140 # sleep for a while.
141 sleep 10
142
143 # stop the process.
144 OVS_APP_EXIT_AND_WAIT_BY_TARGET([`pwd`/unixctl], [ovs-vswitchd-2.pid])
145
146 # should not see this log (which indicates high cpu utilization).
147 AT_CHECK([grep "wakeup due to" fakelog], [ignore])
148
149 # check the fakelog, should not see any WARN/ERR/EMER log.
150 AT_CHECK([sed -n "
151 /|WARN|/p
152 /|ERR|/p
153 /|EMER|/p" fakelog
154 ])
155
156 AT_CLEANUP
157
158 dnl ----------------------------------------------------------------------
159 AT_SETUP([ovs-vswitchd -- set service controller])
160 AT_SKIP_IF([test "$IS_WIN32" = "yes"])
161 OVS_VSWITCHD_START
162
163 AT_CHECK([ovs-vsctl set-controller br0 punix:$(pwd)/br0.void])
164 OVS_WAIT_UNTIL([test -e br0.void])
165
166 AT_CHECK([ovs-vsctl set-controller br0 punix:$(pwd)/br0.void/../overwrite.file])
167 OVS_WAIT_UNTIL([test -n "`grep ERR ovs-vswitchd.log | grep overwrite.file`"])
168
169 OVS_VSWITCHD_STOP(["/Not adding Unix domain socket controller/d"])
170 AT_CLEANUP
171
172 dnl ----------------------------------------------------------------------
173 dnl OVSDB server before release version 2.5 does not support the monitor2
174 dnl method.  This test defeatures the OVSDB server to simulate an older
175 dnl OVSDB server and make sure ovs-vswitchd can still work with it
176 AT_SETUP([ovs-vswitchd -- Compatible with OVSDB server - w/o monitor2])
177 OVS_VSWITCHD_START
178
179 dnl defeature OVSDB server -- no monitor2
180 AT_CHECK([ovs-appctl -t ovsdb-server ovsdb-server/disable-monitor2])
181
182 sleep 1
183
184 AT_CHECK([ovs-vsctl add-port br0 p0  -- set interface p0 type=internal])
185 AT_CHECK([ovs-vsctl add-port br0 p1  -- set interface p1 type=internal])
186
187 dnl ovs-vswitchd should still 'see' ovsdb change with the 'monitor' method
188 AT_CHECK([ovs-appctl dpif/show | tail -n +3], [0], [dnl
189                 br0 65534/100: (dummy)
190                 p0 1/1: (dummy)
191                 p1 2/2: (dummy)
192 ])
193 OVS_VSWITCHD_STOP
194 AT_CLEANUP
195
196 dnl ----------------------------------------------------------------------
197 AT_SETUP([ovs-vswitchd - do not create sockets with unsafe names])
198 OVS_VSWITCHD_START
199
200 # On Unix systems, test for sockets with "test -S".
201 #
202 # On Windows systems, we simulate a socket with a regular file that contains
203 # a TCP port number, so use "test -f" there instead.
204 if test $IS_WIN32 = yes; then
205    S=f
206 else
207    S=S
208 fi
209
210 # Create a bridge with an ordinary name and make sure that the management
211 # socket gets creatd.
212 AT_CHECK([ovs-vsctl add-br a -- set bridge a datapath-type=dummy])
213 AT_CHECK([test -$S a.mgmt])
214
215 # Create a bridge with an unsafe name and make sure that the management
216 # socket does not get created.
217 mkdir b
218 AT_CHECK([ovs-vsctl add-br b/c -- set bridge b/c datapath-type=dummy], [0],
219   [], [ovs-vsctl: Error detected while setting up 'b/c'.  See ovs-vswitchd log for details.
220 ])
221 AT_CHECK([test ! -e b/c.mgmt])
222
223 OVS_VSWITCHD_STOP(['/ignoring bridge with invalid name/d'])
224 AT_CLEANUP