ovsdb-client: support monitor-cond method
[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 monitor_cond
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 monitor_cond])
177 OVS_VSWITCHD_START
178
179 dnl defeature OVSDB server -- no monitor_cond
180 AT_CHECK([ovs-appctl -t ovsdb-server ovsdb-server/disable-monitor-cond])
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