ovs-vswitchd.at: Port tests to run successfully on Windows.
[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 OVS_RUNDIR=`pwd`; export OVS_RUNDIR
9 OVS_LOGDIR=`pwd`; export OVS_LOGDIR
10 OVS_DBDIR=`pwd`; export OVS_DBDIR
11 OVS_SYSCONFDIR=`pwd`; export OVS_SYSCONFDIR
12 ON_EXIT([kill `cat ovsdb-server.pid ovs-vswitchd.pid`])
13
14 dnl Create database.
15 touch .conf.db.~lock~
16 AT_CHECK([ovsdb-tool create conf.db $abs_top_srcdir/vswitchd/vswitch.ovsschema])
17
18 dnl Start ovsdb-server.  *Don't* initialize database.
19 AT_CHECK([ovsdb-server --detach --no-chdir --pidfile --log-file --remote=punix:$OVS_RUNDIR/db.sock], [0], [ignore], [ignore])
20 AT_CAPTURE_FILE([ovsdb-server.log])
21
22 dnl Start ovs-vswitchd.
23 AT_CHECK([ovs-vswitchd --detach --no-chdir --pidfile --enable-dummy --disable-system --log-file], [0], [], [stderr])
24 AT_CAPTURE_FILE([ovs-vswitchd.log])
25
26 dnl ovs-vswitchd detached OK or we wouldn't have made it this far.  Success.
27 AT_CLEANUP
28
29
30 dnl ----------------------------------------------------------------------
31 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 [dnl
34 rx_packets=$2
35 ])
36 ])
37
38 AT_SETUP([ovs-vswitchd -- stats-update-interval])
39 OVS_VSWITCHD_START([add-port br0 p1 -- set int p1 type=internal])
40 ovs-appctl time/stop
41
42 dnl at the beginning, the update of rx_packets should happen every 5 seconds.
43 for i in `seq 0 10`; do ovs-appctl time/warp 1000; done
44 OVS_VSCTL_CHECK_RX_PKT([p1], [0])
45 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 for i in `seq 0 10`; do ovs-appctl time/warp 1000; done
47 OVS_VSCTL_CHECK_RX_PKT([p1], [1])
48
49 dnl set the stats update interval to 100K ms, the following 'recv' should not be updated.
50 AT_CHECK([ovs-vsctl set O . other_config:stats-update-interval=100000])
51 for i in `seq 0 50`; do ovs-appctl time/warp 1000; done
52 for i in `seq 1 5`; do
53     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 done
55
56 OVS_VSCTL_CHECK_RX_PKT([p1], [1])
57 dnl advance the clock by 100K ms, the previous 'recv' should be updated.
58 for i in `seq 0 99`; do ovs-appctl time/warp 1000; done
59 OVS_VSCTL_CHECK_RX_PKT([p1], [6])
60
61 dnl now remove the configuration. 'recv' one packet.  there should be an update after 5000 ms.
62 AT_CHECK([ovs-vsctl clear O . other_config])
63 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 for i in `seq 0 10`; do ovs-appctl time/warp 1000; done
65 OVS_VSCTL_CHECK_RX_PKT([p1], [7])
66
67 OVS_VSWITCHD_STOP
68 AT_CLEANUP
69
70 dnl ----------------------------------------------------------------------
71 AT_SETUP([ovs-vswitchd -- start additional ovs-vswitchd process])
72 OVS_VSWITCHD_START
73
74 # start another ovs-vswitchd process.
75 ovs-vswitchd --log-file=fakelog --unixctl="`pwd`"/unixctl &
76
77 # sleep for a while
78 sleep 5
79
80 # stop the process.
81 ovs-appctl -t `pwd`/unixctl exit
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])
86
87 AT_CHECK([tail -n1 fakelog | sed -e 's/^.*ERR|//; s/pid [[0-9]]*//'], [0], [dnl
88 another ovs-vswitchd process is running, disabling this process () until it goes away
89 ])
90
91 OVS_VSWITCHD_STOP
92 AT_CLEANUP
93
94 dnl ----------------------------------------------------------------------
95 AT_SETUP([ovs-vswitchd -- switch over to another ovs-vswitchd process])
96 OVS_VSWITCHD_START
97
98 # start a new ovs-vswitchd process.
99 ovs-vswitchd --log-file=fakelog --enable-dummy --unixctl="`pwd`"/unixctl &
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-appctl -t `pwd`/unixctl exit
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