]> git.proxmox.com Git - ovs.git/blame - tests/ovsdb-cluster.at
netlink linux: enable listening to all nsids
[ovs.git] / tests / ovsdb-cluster.at
CommitLineData
1b1d2e6d
BP
1OVS_START_SHELL_HELPERS
2# ovsdb_check_cluster N_SERVERS SCHEMA_FUNC OUTPUT TRANSACTION...
3ovsdb_check_cluster () {
4 local n=$1 schema_func=$2 output=$3
5 shift; shift; shift
6
7 $schema_func > schema
8 schema=`ovsdb-tool schema-name schema`
9 AT_CHECK([ovsdb-tool '-vPATTERN:console:%c|%p|%m' create-cluster s1.db schema unix:s1.raft], [0], [], [stderr])
10 AT_CHECK([grep -v 'from ephemeral to persistent' stderr], [1])
11 cid=`ovsdb-tool db-cid s1.db`
12 for i in `seq 2 $n`; do
13 AT_CHECK([ovsdb-tool join-cluster s$i.db $schema unix:s$i.raft unix:s1.raft])
14 done
15
16 on_exit 'kill `cat *.pid`'
17 for i in `seq $n`; do
18 AT_CHECK([ovsdb-server -vraft -vconsole:off -vsyslog:off --detach --no-chdir --log-file=s$i.log --pidfile=s$i.pid --unixctl=s$i --remote=punix:s$i.ovsdb s$i.db])
19 done
20 for i in `seq $n`; do
21 AT_CHECK([ovsdb-client --timeout=30 wait unix:s$i.ovsdb $schema connected])
22 done
23
24 for txn
25 do
26 AT_CHECK([ovsdb-client --timeout=30 -vjsonrpc -vconsole:off -vsyslog:off -vvlog:off --log-file transact unix:s1.ovsdb,unix:s2.ovsdb,unix:s3.ovsdb "$txn"], [0], [stdout])
27 cat stdout >> output
28 done
29 AT_CHECK_UNQUOTED([uuidfilt output], [0], [$output])
30 for i in `seq $n`; do
31 OVS_APP_EXIT_AND_WAIT_BY_TARGET([`pwd`/s$i], [s$i.pid])
32 done
33
34 AT_CHECK([ovsdb-tool check-cluster s*.db])
35}
36OVS_END_SHELL_HELPERS
37
38# Test a 1-server cluster.
39AT_BANNER([OVSDB - clustered transactions (1 server)])
40m4_define([OVSDB_CHECK_EXECUTION],
41 [AT_SETUP([$1 - cluster of 1])
42 AT_KEYWORDS([ovsdb server positive unix cluster cluster1 $5])
43 ovsdb_check_cluster 1 "$2" '$4' m4_foreach([txn], [$3], ['txn' ])
44 AT_CLEANUP])
45EXECUTION_EXAMPLES
46
47# Test a 3-server cluster.
48AT_BANNER([OVSDB - clustered transactions (3 servers)])
49m4_define([OVSDB_CHECK_EXECUTION],
50 [AT_SETUP([$1 - cluster of 3])
51 AT_KEYWORDS([ovsdb server positive unix cluster cluster3 $5])
52 ovsdb_check_cluster 3 "$2" '$4' m4_foreach([txn], [$3], ['txn' ])
53 AT_CLEANUP])
54EXECUTION_EXAMPLES
55
56# Test a 5-server cluster.
57AT_BANNER([OVSDB - clustered transactions (5 servers)])
58m4_define([OVSDB_CHECK_EXECUTION],
59 [AT_SETUP([$1 - cluster of 5])
60 AT_KEYWORDS([ovsdb server positive unix cluster cluster5 $5])
61 ovsdb_check_cluster 5 "$2" '$4' m4_foreach([txn], [$3], ['txn' ])
62 AT_CLEANUP])
63EXECUTION_EXAMPLES
64\f
65AT_BANNER([OVSDB - cluster tests])
66
67# Torture test.
68OVS_START_SHELL_HELPERS
69ovsdb_torture_test () {
70 local n=$1 # Number of cluster members
71 local victim=$2 # Cluster member to kill or remove
72 local variant=$3 # 'kill' and restart or 'remove' and add
73 cp $top_srcdir/ovn/ovn-sb.ovsschema schema
74 schema=`ovsdb-tool schema-name schema`
75 AT_CHECK([ovsdb-tool '-vPATTERN:console:%c|%p|%m' create-cluster s1.db schema unix:s1.raft], [0], [], [dnl
76ovsdb|WARN|schema: changed 2 columns in 'OVN_Southbound' database from ephemeral to persistent, including 'status' column in 'Connection' table, because clusters do not support ephemeral columns
77])
78
79 join_cluster() {
80 local i=$1
81 others=
82 for j in `seq 1 $n`; do
83 if test $i != $j; then
84 others="$others unix:s$j.raft"
85 fi
86 done
87 AT_CHECK([ovsdb-tool join-cluster s$i.db $schema unix:s$i.raft $others])
88 }
89
90 start_server() {
91 local i=$1
92 printf "\ns$i: starting\n"
93 AT_CHECK([ovsdb-server -vjsonrpc -vconsole:off -vsyslog:off --detach --no-chdir --log-file=s$i.log --pidfile=s$i.pid --unixctl=s$i --remote=punix:s$i.ovsdb s$i.db])
94 }
95 stop_server() {
96 local i=$1
97 printf "\ns$i: stopping\n"
98 OVS_APP_EXIT_AND_WAIT_BY_TARGET([`pwd`/s$i], [s$i.pid])
99 }
100 connect_server() {
101 local i=$1
102 printf "\ns$i: waiting to connect to storage\n"
103 AT_CHECK([ovsdb-client --timeout=30 -vfile -vsyslog:off -vvlog:off --log-file=connect$i.log wait unix:s$i.ovsdb $schema connected])
104 }
105 remove_server() {
106 local i=$1
107 printf "\ns$i: removing from cluster\n"
108 AT_CHECK([ovs-appctl --timeout=30 -t "`pwd`"/s$i cluster/leave OVN_Southbound])
109 printf "\ns$i: waiting for removal to complete\n"
110 AT_CHECK([ovsdb-client --timeout=30 -vfile -vsyslog:off -vvlog:off --log-file=remove$i.log wait unix:s$i.ovsdb $schema removed])
111 stop_server $victim
112 }
113 add_server() {
114 local i=$1
115 rm s$i.db
116 join_cluster $i
117 start_server $i
118 connect_server $i
119 }
120
121 cid=`ovsdb-tool db-cid s1.db`
122 for i in `seq 2 $n`; do join_cluster $i; done
123
124 on_exit 'kill `cat *.pid`'
125 for i in `seq $n`; do start_server $i; done
126 for i in `seq $n`; do connect_server $i; done
127
128 OVN_SB_DB=unix:s1.ovsdb
129 for i in `seq 2 $n`; do
130 OVN_SB_DB=$OVN_SB_DB,unix:s$i.ovsdb
131 done
132 export OVN_SB_DB
133
134 n1=10 n2=5
135 echo "starting $n1*$n2 ovn-sbctl processes..."
136 for i in $(seq 0 $(expr $n1 - 1) ); do
137 (for j in $(seq $n2); do
138 : > $i-$j.running
139 run_as "ovn-sbctl($i-$j)" ovn-sbctl "-vPATTERN:console:ovn-sbctl($i-$j)|%D{%H:%M:%S}|%05N|%c|%p|%m" --log-file=$i-$j.log -vfile -vsyslog:off -vtimeval:off --timeout=120 --no-leader-only add SB_Global . external_ids $i-$j=$i-$j
140 status=$?
141 if test $status != 0; then
142 echo "$i-$j exited with status $status" > $i-$j:$status
143 fi
144 rm $i-$j.running
145 done
146 : > $i.done)&
147 done
148 echo "...done"
149 sleep 2
150
151 echo "waiting for ovn-sbctl processes to exit..."
152 i=0
153 phase=0
154 while :; do
155 printf "t=%2d s:" $i
156 done=0
157 for j in $(seq 0 $(expr $n1 - 1)); do
158 if test -f $j.done; then
159 printf " $j"
160 done=$(expr $done + 1)
161 fi
162 done
163 printf '\n'
164 if test $done = $n1; then
165 break
166 fi
167
168 case $phase in # (
169 0)
170 if test $done -ge $(expr $n1 / 4); then
171 if test $variant = kill; then
172 stop_server $victim
173 else
174 remove_server $victim
175 fi
176 phase=1
177 next=$(expr $i + 2)
178 fi
179 ;; # (
180 1)
181 if test $i -ge $next; then
182 if test $variant = kill; then
183 start_server $victim
184 connect_server $victim
185 else
186 add_server $victim
187 fi
188 phase=2
189 fi
190 ;;
191 esac
192
193 sleep 1
194 i=$(expr $i + 1)
195 done
196 echo "...done"
197 AT_CHECK([if test $phase != 2; then exit 77; fi])
198
199 for i in `seq 0 9`; do
200 for j in `seq 5`; do
201 echo "$i-$j=$i-$j"
202 done
203 done > expout
204 AT_CHECK([ovn-sbctl --timeout=30 --log-file=finalize.log -vtimeval:off -vfile -vsyslog:off --bare get SB_Global . external-ids | sed 's/, /\n/g; s/[[{}""]]//g;'], [0], [expout])
205
206 for i in `seq $n`; do
207 if test $i != $victim || test $phase != 1; then
208 stop_server $i
209 fi
210 done
211
212 # We ignore stdout because non-fatal warnings get printed there.
213 AT_CHECK([ovsdb-tool check-cluster s*.db], [0], [ignore])
214}
215OVS_END_SHELL_HELPERS
216
217AT_SETUP([OVSDB 3-server torture test - kill/restart leader])
218AT_KEYWORDS([ovsdb server positive unix cluster cluster3])
219ovsdb_torture_test 3 1 kill
220AT_CLEANUP
221AT_SETUP([OVSDB 3-server torture test - kill/restart follower 1])
222AT_KEYWORDS([ovsdb server positive unix cluster cluster3])
223ovsdb_torture_test 3 2 kill
224AT_CLEANUP
225AT_SETUP([OVSDB 3-server torture test - kill/restart follower 2])
226AT_KEYWORDS([ovsdb server positive unix cluster cluster3])
227ovsdb_torture_test 3 3 kill
228AT_CLEANUP
229AT_SETUP([OVSDB 5-server torture test - kill/restart leader])
230AT_KEYWORDS([ovsdb server positive unix cluster cluster5])
231ovsdb_torture_test 5 1 kill
232AT_CLEANUP
233AT_SETUP([OVSDB 5-server torture test - kill/restart follower 1])
234AT_KEYWORDS([ovsdb server positive unix cluster cluster5])
235ovsdb_torture_test 5 2 kill
236AT_CLEANUP
237AT_SETUP([OVSDB 5-server torture test - kill/restart follower 2])
238AT_KEYWORDS([ovsdb server positive unix cluster cluster5])
239ovsdb_torture_test 5 3 kill
240AT_CLEANUP
241AT_SETUP([OVSDB 5-server torture test - kill/restart follower 3])
242AT_KEYWORDS([ovsdb server positive unix cluster cluster5])
243ovsdb_torture_test 5 4 kill
244AT_CLEANUP
245AT_SETUP([OVSDB 5-server torture test - kill/restart follower 4])
246AT_KEYWORDS([ovsdb server positive unix cluster cluster5])
247ovsdb_torture_test 5 5 kill
248AT_CLEANUP
249
250AT_SETUP([OVSDB 3-server torture test - remove/re-add leader])
251AT_KEYWORDS([ovsdb server positive unix cluster cluster3])
252ovsdb_torture_test 3 1 remove
253AT_CLEANUP
254AT_SETUP([OVSDB 3-server torture test - remove/re-add follower 1])
255AT_KEYWORDS([ovsdb server positive unix cluster cluster3])
256ovsdb_torture_test 3 2 remove
257AT_CLEANUP
258AT_SETUP([OVSDB 3-server torture test - remove/re-add follower 2])
259AT_KEYWORDS([ovsdb server positive unix cluster cluster3])
260ovsdb_torture_test 3 3 remove
261AT_CLEANUP
262AT_SETUP([OVSDB 5-server torture test - remove/re-add leader])
263AT_KEYWORDS([ovsdb server positive unix cluster cluster5])
264ovsdb_torture_test 5 1 remove
265AT_CLEANUP
266AT_SETUP([OVSDB 5-server torture test - remove/re-add follower 1])
267AT_KEYWORDS([ovsdb server positive unix cluster cluster5])
268ovsdb_torture_test 5 2 remove
269AT_CLEANUP
270AT_SETUP([OVSDB 5-server torture test - remove/re-add follower 2])
271AT_KEYWORDS([ovsdb server positive unix cluster cluster5])
272ovsdb_torture_test 5 3 remove
273AT_CLEANUP
274AT_SETUP([OVSDB 5-server torture test - remove/re-add follower 3])
275AT_KEYWORDS([ovsdb server positive unix cluster cluster5])
276ovsdb_torture_test 5 4 remove
277AT_CLEANUP
278AT_SETUP([OVSDB 5-server torture test - remove/re-add follower 4])
279AT_KEYWORDS([ovsdb server positive unix cluster cluster5])
280ovsdb_torture_test 5 5 remove
281AT_CLEANUP