1 AT_BANNER([OVSDB -- ovsdb-server transactions (Unix sockets)])
3 m4_define([OVSDB_SERVER_SHUTDOWN],
5 AT_CHECK([ovs-appctl -t "`pwd`"/unixctl -e exit], [0], [ignore], [ignore])
6 OVS_WAIT_WHILE([kill -0 `cat savepid`], [kill `cat savepid`])])
8 # OVSDB_CHECK_EXECUTION(TITLE, SCHEMA, TRANSACTIONS, OUTPUT, [KEYWORDS])
10 # Creates a database with the given SCHEMA, starts an ovsdb-server on
11 # that database, and runs each of the TRANSACTIONS (which should be a
12 # quoted list of quoted strings) against it with ovsdb-client one at a
15 # Checks that the overall output is OUTPUT, but UUIDs in the output
16 # are replaced by markers of the form <N> where N is a number. The
17 # first unique UUID is replaced by <0>, the next by <1>, and so on.
18 # If a given UUID appears more than once it is always replaced by the
21 # TITLE is provided to AT_SETUP and KEYWORDS to AT_KEYWORDS.
22 m4_define([OVSDB_CHECK_EXECUTION],
24 OVS_RUNDIR=`pwd`; export OVS_RUNDIR
25 AT_KEYWORDS([ovsdb server positive unix $5])
27 AT_CHECK([ovsdb-tool create db schema], [0], [stdout], [ignore])
28 AT_CHECK([ovsdb-server --detach --no-chdir --pidfile="`pwd`"/pid --remote=punix:socket --unixctl="`pwd`"/unixctl db], [0], [ignore], [ignore])
29 m4_foreach([txn], [$3],
30 [AT_CHECK([ovsdb-client transact unix:socket 'txn'], [0], [stdout], [ignore],
31 [test ! -e pid || kill `cat pid`])
34 AT_CHECK([${PERL} $srcdir/uuidfilt.pl output], [0], [$4], [ignore],
35 [test ! -e pid || kill `cat pid`])
41 AT_SETUP([truncating corrupted database log])
42 AT_KEYWORDS([ovsdb server positive unix])
43 OVS_RUNDIR=`pwd`; export OVS_RUNDIR
44 ordinal_schema > schema
45 AT_CHECK([ovsdb-tool create db schema], [0], [stdout], [ignore])
46 dnl Do one transaction and save the output.
47 AT_DATA([txnfile], [[ovsdb-client transact unix:socket \
51 "row": {"number": 0, "name": "zero"}}]'
53 AT_CHECK([ovsdb-server --remote=punix:socket --unixctl="`pwd`"/unixctl db --run="sh txnfile"], [0], [stdout], [])
55 dnl Add some crap to the database log and run another transaction, which should
56 dnl ignore the crap and truncate it out of the log.
58 AT_DATA([txnfile], [[ovsdb-client transact unix:socket \
62 "row": {"number": 1, "name": "one"}}]'
64 AT_CHECK([ovsdb-server --remote=punix:socket --unixctl="`pwd`"/unixctl db --run="sh txnfile"], [0], [stdout], [stderr])
65 AT_CHECK([grep 'syntax error: db: parse error.* in header line "xxx"' stderr],
68 dnl Run a final transaction to verify that both transactions succeeeded.
69 dnl The crap that we added should have been truncated by the previous run,
70 dnl so ovsdb-server shouldn't log a warning this time.
71 AT_DATA([txnfile], [[ovsdb-client transact unix:socket \
78 AT_CHECK([ovsdb-server --remote=punix:socket --unixctl="`pwd`"/unixctl db --run="sh txnfile"], [0], [stdout], [])
80 AT_CHECK([${PERL} $srcdir/uuidfilt.pl output], [0],
81 [[[{"uuid":["uuid","<0>"]}]
82 [{"uuid":["uuid","<1>"]}]
83 [{"rows":[{"_uuid":["uuid","<0>"],"_version":["uuid","<2>"],"name":"zero","number":0},{"_uuid":["uuid","<1>"],"_version":["uuid","<3>"],"name":"one","number":1}]}]
85 [test ! -e pid || kill `cat pid`])
88 AT_SETUP([truncating database log with bad transaction])
89 AT_KEYWORDS([ovsdb server positive unix])
90 OVS_RUNDIR=`pwd`; export OVS_RUNDIR
91 ordinal_schema > schema
92 AT_CHECK([ovsdb-tool create db schema], [0], [stdout], [ignore])
93 dnl Do one transaction and save the output.
94 AT_DATA([txnfile], [[ovsdb-client transact unix:socket \
98 "row": {"number": 0, "name": "zero"}}]'
100 AT_CHECK([ovsdb-server --remote=punix:socket --unixctl="`pwd`"/unixctl db --run="sh txnfile"], [0], [stdout], [])
102 dnl Add some crap to the database log and run another transaction, which should
103 dnl ignore the crap and truncate it out of the log.
104 echo 'OVSDB JSON 15 ffbcdae4b0386265f9ea3280dd7c8f0b72a20e56
105 {"invalid":{}}' >> db
106 AT_DATA([txnfile], [[ovsdb-client transact unix:socket \
110 "row": {"number": 1, "name": "one"}}]'
112 AT_CHECK([ovsdb-server --remote=punix:socket --unixctl="`pwd`"/unixctl db --run="sh txnfile"], [0], [stdout], [stderr])
113 AT_CHECK([grep 'syntax "{"invalid":{}}": unknown table: No table named invalid.' stderr],
116 dnl Run a final transaction to verify that both transactions succeeeded.
117 dnl The crap that we added should have been truncated by the previous run,
118 dnl so ovsdb-server shouldn't log a warning this time.
119 AT_DATA([txnfile], [[ovsdb-client transact unix:socket \
124 "sort": ["number"]}]'
126 AT_CHECK([ovsdb-server --remote=punix:socket --unixctl="`pwd`"/unixctl db --run="sh txnfile"], [0], [stdout], [])
128 AT_CHECK([${PERL} $srcdir/uuidfilt.pl output], [0],
129 [[[{"uuid":["uuid","<0>"]}]
130 [{"uuid":["uuid","<1>"]}]
131 [{"rows":[{"_uuid":["uuid","<0>"],"_version":["uuid","<2>"],"name":"zero","number":0},{"_uuid":["uuid","<1>"],"_version":["uuid","<3>"],"name":"one","number":1}]}]
133 [test ! -e pid || kill `cat pid`])
136 AT_SETUP([ovsdb-client get-schema-version])
137 AT_KEYWORDS([ovsdb server positive])
138 OVS_RUNDIR=`pwd`; export OVS_RUNDIR
139 ordinal_schema > schema
140 AT_CHECK([ovsdb-tool create db schema], [0], [ignore], [ignore])
141 AT_CHECK([ovsdb-server --detach --no-chdir --pidfile="`pwd`"/pid --unixctl="`pwd`"/unixctl --remote=punix:socket db], [0], [ignore], [ignore])
142 AT_CHECK([ovsdb-client get-schema-version unix:socket ordinals], [0], [5.1.3
144 OVSDB_SERVER_SHUTDOWN
147 AT_SETUP([database multiplexing implementation])
148 AT_KEYWORDS([ovsdb server positive])
149 OVS_RUNDIR=`pwd`; export OVS_RUNDIR
150 ordinal_schema > schema1
151 constraint_schema > schema2
152 AT_CHECK([ovsdb-tool create db1 schema1], [0], [ignore], [ignore])
153 AT_CHECK([ovsdb-tool create db2 schema2], [0], [ignore], [ignore])
154 AT_CHECK([ovsdb-server --detach --no-chdir --pidfile="`pwd`"/pid --unixctl="`pwd`"/unixctl --remote=punix:socket db1 db2], [0], [ignore], [ignore])
156 [[ovsdb-client list-dbs unix:socket]],
159 ], [ignore], [test ! -e pid || kill `cat pid`])
161 [[test-jsonrpc request unix:socket get_schema [\"nonexistent\"]]], [0],
162 [[{"error":null,"id":0,"result":{"details":"get_schema request specifies unknown database nonexistent","error":"unknown database","syntax":"[\"nonexistent\"]"}}
163 ]], [], [test ! -e pid || kill `cat pid`])
164 OVSDB_SERVER_SHUTDOWN
167 AT_SETUP([ovsdb-server/add-db and remove-db])
168 AT_KEYWORDS([ovsdb server positive])
169 ON_EXIT([kill `cat ovsdb-server.pid`])
170 OVS_RUNDIR=`pwd`; export OVS_RUNDIR
171 OVS_LOGDIR=`pwd`; export OVS_LOGDIR
172 ordinal_schema > schema1
173 constraint_schema > schema2
174 AT_CHECK([ovsdb-tool create db1 schema1], [0], [ignore], [ignore])
175 AT_CHECK([ovsdb-tool create db2 schema2], [0], [ignore], [ignore])
177 # Start ovsdb-server with just a single database - db1.
178 AT_CHECK([ovsdb-server --detach --no-chdir --pidfile --remote=punix:socket db1], [0])
179 AT_CHECK([ovs-appctl -t ovsdb-server ovsdb-server/list-dbs],
183 # Add the second database.
184 AT_CHECK([ovs-appctl -t ovsdb-server ovsdb-server/add-db db2], [0])
185 AT_CHECK([ovs-appctl -t ovsdb-server ovsdb-server/list-dbs],
190 # The databases are responsive.
191 AT_CHECK([ovsdb-client list-tables unix:socket constraints], [0], [ignore], [ignore])
192 AT_CHECK([ovsdb-client list-tables unix:socket ordinals], [0], [ignore], [ignore])
194 # Add an already added database.
195 AT_CHECK([ovs-appctl -t ovsdb-server ovsdb-server/add-db db2], 2, [], [stderr])
196 AT_CHECK([sed 's/(.*)/(...)/' stderr], [0],
197 [I/O error: db2: failed to lock lockfile (...)
198 ovs-appctl: ovsdb-server: server returned an error
201 # Add a non-existing database.
202 AT_CHECK([ovs-appctl -t ovsdb-server ovsdb-server/add-db db3], 2, [], [stderr])
203 AT_CHECK([sed 's/(.*)/(...)/' stderr], [0],
204 [I/O error: open: db3 failed (...)
205 ovs-appctl: ovsdb-server: server returned an error
208 # Add a remote through a db path in db1.
209 AT_CHECK([ovs-appctl -t ovsdb-server ovsdb-server/add-remote db:ordinals,ordinals,name], [0])
210 AT_CHECK([ovs-appctl -t ovsdb-server ovsdb-server/list-remotes],
211 [0], [db:ordinals,ordinals,name
215 # Removing db1 has no effect on its remote.
216 AT_CHECK([ovs-appctl -t ovsdb-server ovsdb-server/remove-db ordinals], [0])
217 AT_CHECK([ovs-appctl -t ovsdb-server ovsdb-server/list-dbs],
220 AT_CHECK([ovs-appctl -t ovsdb-server ovsdb-server/list-remotes],
221 [0], [db:ordinals,ordinals,name
224 AT_CHECK([ovsdb-client list-tables unix:socket ordinals], [1], [ignore], [ignore])
227 AT_CHECK([ovs-appctl -t ovsdb-server ovsdb-server/remove-db constraints], [0])
228 AT_CHECK([ovs-appctl -t ovsdb-server ovsdb-server/list-dbs],
230 AT_CHECK([ovsdb-client list-tables unix:socket constraints], [1], [ignore], [ignore])
232 # Remove a non-existent database.
233 AT_CHECK([ovs-appctl -t ovsdb-server ovsdb-server/remove-db ordinals], [2],
234 [], [Failed to find the database.
235 ovs-appctl: ovsdb-server: server returned an error
238 # Add a removed database.
239 AT_CHECK([ovs-appctl -t ovsdb-server ovsdb-server/add-db db2], [0])
240 AT_CHECK([ovs-appctl -t ovsdb-server ovsdb-server/list-dbs],
243 AT_CHECK([ovsdb-client list-tables unix:socket constraints], [0], [ignore], [ignore])
246 AT_SETUP([ovsdb-server/add-db with --monitor])
247 AT_KEYWORDS([ovsdb server positive])
248 # Start ovsdb-server, initially with one db.
249 OVS_RUNDIR=`pwd`; export OVS_RUNDIR
250 OVS_LOGDIR=`pwd`; export OVS_LOGDIR
251 ordinal_schema > schema
252 AT_CHECK([ovsdb-tool create db1 schema], [0], [ignore], [ignore])
253 ON_EXIT([kill `cat *.pid`])
254 AT_CHECK([ovsdb-server -v -vvlog:off --monitor --detach --no-chdir --pidfile --log-file db1])
256 # Add the second database.
257 constraint_schema > schema2
258 AT_CHECK([ovsdb-tool create db2 schema2], [0], [ignore], [ignore])
259 AT_CHECK([ovs-appctl -t ovsdb-server ovsdb-server/add-db db2], [0])
260 AT_CHECK([ovs-appctl -t ovsdb-server ovsdb-server/list-dbs],
265 # Kill the daemon process, making it look like a segfault,
266 # and wait for a new daemon process to get spawned.
267 cp ovsdb-server.pid old.pid
268 AT_CHECK([kill -SEGV `cat ovsdb-server.pid`])
269 OVS_WAIT_WHILE([kill -0 `cat old.pid`])
271 [test -s ovsdb-server.pid && test `cat ovsdb-server.pid` != `cat old.pid`])
272 AT_CHECK([ovs-appctl -t ovsdb-server ovsdb-server/list-dbs],
278 AT_SETUP([ovsdb-server/add-db and remove-db with --monitor])
279 AT_KEYWORDS([ovsdb server positive])
280 # Start ovsdb-server, initially with one db.
281 OVS_RUNDIR=`pwd`; export OVS_RUNDIR
282 OVS_LOGDIR=`pwd`; export OVS_LOGDIR
283 ordinal_schema > schema
284 AT_CHECK([ovsdb-tool create db1 schema], [0], [ignore], [ignore])
285 constraint_schema > schema2
286 AT_CHECK([ovsdb-tool create db2 schema2], [0], [ignore], [ignore])
287 ON_EXIT([kill `cat *.pid`])
288 AT_CHECK([ovsdb-server -v -vvlog:off --monitor --detach --no-chdir --pidfile --log-file db1 db2])
290 # Remove the second database.
291 AT_CHECK([ovs-appctl -t ovsdb-server ovsdb-server/remove-db constraints])
292 AT_CHECK([ovs-appctl -t ovsdb-server ovsdb-server/list-dbs],
296 # Kill the daemon process, making it look like a segfault,
297 # and wait for a new daemon process to get spawned.
298 cp ovsdb-server.pid old.pid
299 AT_CHECK([kill -SEGV `cat ovsdb-server.pid`])
300 OVS_WAIT_WHILE([kill -0 `cat old.pid`])
302 [test -s ovsdb-server.pid && test `cat ovsdb-server.pid` != `cat old.pid`])
303 AT_CHECK([ovs-appctl -t ovsdb-server ovsdb-server/list-dbs],
308 AT_SETUP([--remote=db: implementation])
309 AT_KEYWORDS([ovsdb server positive])
310 OVS_RUNDIR=`pwd`; export OVS_RUNDIR
311 OVS_LOGDIR=`pwd`; export OVS_LOGDIR
321 "max": "unlimited"}},
324 "key": {"type": "uuid", "refTable": "Manager"},
326 "max": "unlimited"}}}},
337 AT_CHECK([ovsdb-tool create db schema], [0], [ignore], [ignore])
339 [[ovsdb-tool transact db \
344 "managers": "punix:socket1",
345 "manager_options": ["set", [["named-uuid", "x"]]]}},
349 "row": {"target": "punix:socket2"}}]']], [0], [ignore], [ignore])
350 ON_EXIT([kill `cat ovsdb-server.pid`])
351 AT_CHECK([ovsdb-server --enable-dummy --detach --no-chdir --pidfile --remote=db:mydb,Root,managers --remote=db:mydb,Root,manager_options --log-file db], [0], [ignore], [ignore])
352 for i in 1 2 3 4 5 6; do ovs-appctl -t ovsdb-server time/warp 1000; done
354 [[ovsdb-client transact unix:socket1 \
359 "columns": ["managers"]},
363 "columns": ["target", "is_connected"]}]']],
364 [0], [stdout], [ignore])
366 [${PERL} $srcdir/uuidfilt.pl stdout],
368 [[[{"rows":[{"managers":"punix:socket1"}]},{"rows":[{"is_connected":false,"target":"punix:socket2"}]}]
373 AT_SETUP([ovsdb-server/add-remote and remove-remote])
374 AT_KEYWORDS([ovsdb server positive])
375 OVS_RUNDIR=`pwd`; export OVS_RUNDIR
376 OVS_LOGDIR=`pwd`; export OVS_LOGDIR
377 ordinal_schema > schema
378 AT_CHECK([ovsdb-tool create db schema], [0], [ignore], [ignore])
379 ON_EXIT([kill `cat *.pid`])
380 AT_CHECK([ovsdb-server --detach --no-chdir --pidfile db])
382 AT_CHECK([test ! -e socket1])
383 AT_CHECK([ovs-appctl -t ovsdb-server ovsdb-server/add-remote punix:socket1])
384 OVS_WAIT_UNTIL([test -S socket1])
385 AT_CHECK([ovs-appctl -t ovsdb-server ovsdb-server/list-remotes],
389 AT_CHECK([test ! -e socket2])
390 AT_CHECK([ovs-appctl -t ovsdb-server ovsdb-server/add-remote punix:socket2])
391 OVS_WAIT_UNTIL([test -S socket2])
392 AT_CHECK([ovs-appctl -t ovsdb-server ovsdb-server/list-remotes],
397 AT_CHECK([ovs-appctl -t ovsdb-server ovsdb-server/add-remote db:x,y,z], [2],
398 [], ["db:x,y,z": no database named x
399 ovs-appctl: ovsdb-server: server returned an error
402 AT_CHECK([ovs-appctl -t ovsdb-server ovsdb-server/remove-remote punix:socket1])
403 OVS_WAIT_UNTIL([test ! -e socket1])
404 AT_CHECK([test -S socket2])
405 AT_CHECK([ovs-appctl -t ovsdb-server ovsdb-server/list-remotes],
409 AT_CHECK([ovs-appctl -t ovsdb-server ovsdb-server/remove-remote punix:socket2])
410 OVS_WAIT_UNTIL([test ! -e socket2])
411 AT_CHECK([test ! -e socket1])
412 AT_CHECK([ovs-appctl -t ovsdb-server ovsdb-server/list-remotes])
415 AT_SETUP([ovsdb-server/add-remote with --monitor])
416 AT_KEYWORDS([ovsdb server positive])
417 # Start ovsdb-server, initially with no remotes.
418 OVS_RUNDIR=`pwd`; export OVS_RUNDIR
419 OVS_LOGDIR=`pwd`; export OVS_LOGDIR
420 ordinal_schema > schema
421 AT_CHECK([ovsdb-tool create db schema], [0], [ignore], [ignore])
422 ON_EXIT([kill `cat *.pid`])
423 AT_CHECK([ovsdb-server -v -vvlog:off --monitor --detach --no-chdir --pidfile --log-file db])
426 AT_CHECK([test ! -e socket1])
427 AT_CHECK([ovs-appctl -t ovsdb-server ovsdb-server/add-remote punix:socket1])
428 OVS_WAIT_UNTIL([test -S socket1])
429 AT_CHECK([ovs-appctl -t ovsdb-server ovsdb-server/list-remotes],
433 # Kill the daemon process, making it look like a segfault,
434 # and wait for a new daemon process to get spawned and for it to
435 # start listening on 'socket1'.
436 cp ovsdb-server.pid old.pid
438 AT_CHECK([kill -SEGV `cat ovsdb-server.pid`])
439 OVS_WAIT_WHILE([kill -0 `cat old.pid`])
441 [test -s ovsdb-server.pid && test `cat ovsdb-server.pid` != `cat old.pid`])
442 OVS_WAIT_UNTIL([test -S socket1])
445 AT_SETUP([ovsdb-server/add-remote and remove-remote with --monitor])
446 AT_KEYWORDS([ovsdb server positive])
447 # Start ovsdb-server, initially with no remotes.
448 OVS_RUNDIR=`pwd`; export OVS_RUNDIR
449 OVS_LOGDIR=`pwd`; export OVS_LOGDIR
450 ordinal_schema > schema
451 AT_CHECK([ovsdb-tool create db schema], [0], [ignore], [ignore])
452 ON_EXIT([kill `cat *.pid`])
453 AT_CHECK([ovsdb-server -v -vvlog:off --monitor --detach --no-chdir --pidfile --log-file db])
456 AT_CHECK([test ! -e socket1])
457 AT_CHECK([ovs-appctl -t ovsdb-server ovsdb-server/add-remote punix:socket1])
458 OVS_WAIT_UNTIL([test -S socket1])
459 AT_CHECK([ovs-appctl -t ovsdb-server ovsdb-server/list-remotes],
464 AT_CHECK([ovs-appctl -t ovsdb-server ovsdb-server/remove-remote punix:socket1])
465 OVS_WAIT_UNTIL([test ! -e socket1])
466 AT_CHECK([ovs-appctl -t ovsdb-server ovsdb-server/list-remotes])
468 # Kill the daemon process, making it look like a segfault,
469 # and wait for a new daemon process to get spawned and make sure that it
470 # does not listen on 'socket1'.
471 cp ovsdb-server.pid old.pid
472 AT_CHECK([kill -SEGV `cat ovsdb-server.pid`])
473 OVS_WAIT_WHILE([kill -0 `cat old.pid`])
475 [test -s ovsdb-server.pid && test `cat ovsdb-server.pid` != `cat old.pid`])
476 AT_CHECK([test ! -e socket1])
479 AT_SETUP([SSL db: implementation])
480 AT_KEYWORDS([ovsdb server positive ssl $5])
481 AT_SKIP_IF([test "$HAVE_OPENSSL" = no])
482 PKIDIR=$abs_top_builddir/tests
483 AT_SKIP_IF([expr "$PKIDIR" : ".*[ '\"
490 "private_key": {"type": "string"},
491 "certificate": {"type": "string"},
492 "ca_cert": {"type": "string"}}}}}
494 AT_CHECK([ovsdb-tool create db schema], [0], [stdout], [ignore])
496 [[ovsdb-tool transact db \
500 "row": {"private_key": "'"$PKIDIR/testpki-privkey2.pem"'",
501 "certificate": "'"$PKIDIR/testpki-cert2.pem"'",
502 "ca_cert": "'"$PKIDIR/testpki-cacert.pem"'"}}]']],
503 [0], [ignore], [ignore])
504 OVS_LOGDIR=`pwd`; export OVS_LOGDIR
506 [ovsdb-server --log-file --detach --no-chdir --pidfile="`pwd`"/pid \
507 --private-key=db:mydb,SSL,private_key \
508 --certificate=db:mydb,SSL,certificate \
509 --ca-cert=db:mydb,SSL,ca_cert \
510 --remote=pssl:0:127.0.0.1 --unixctl="`pwd`"/unixctl db],
511 [0], [ignore], [ignore])
512 SSL_PORT=`parse_listening_port < ovsdb-server.log`
515 --private-key=$PKIDIR/testpki-privkey.pem \
516 --certificate=$PKIDIR/testpki-cert.pem \
517 --ca-cert=$PKIDIR/testpki-cacert.pem \
518 transact ssl:127.0.0.1:$SSL_PORT \
523 "columns": ["private_key"]}]']],
524 [0], [stdout], [ignore], [test ! -e pid || kill `cat pid`])
528 [[[{"rows":[{"private_key":"$PKIDIR/testpki-privkey2.pem"}]}]
529 ]], [ignore], [test ! -e pid || kill `cat pid`])
530 OVSDB_SERVER_SHUTDOWN
533 AT_SETUP([compacting online])
534 AT_KEYWORDS([ovsdb server compact])
535 OVS_RUNDIR=`pwd`; export OVS_RUNDIR
536 ordinal_schema > schema
537 dnl Make sure that "ovsdb-tool create" works with a dangling symlink for
538 dnl the database and the lockfile, creating the target of each symlink rather
539 dnl than replacing the symlinks with regular files.
542 ln -s dir/.db.~lock~ .db.~lock~
543 AT_SKIP_IF([test ! -h db || test ! -h .db.~lock~])
544 AT_CHECK([ovsdb-tool create db schema], [0], [ignore], [ignore])
545 dnl Start ovsdb-server.
546 AT_CHECK([ovsdb-server --detach --no-chdir --pidfile="`pwd`"/pid --unixctl="`pwd`"/unixctl --remote=punix:socket --log-file="`pwd`"/ovsdb-server.log db], [0], [ignore], [ignore])
547 AT_CAPTURE_FILE([ovsdb-server.log])
548 dnl Do a bunch of random transactions that put crap in the database log.
550 [[for pair in 'zero 0' 'one 1' 'two 2' 'three 3' 'four 4' 'five 5'; do
552 ovsdb-client transact unix:socket '
556 "row": {"name": "'$1'", "number": '$2'}},
558 "comment": "add row for '"$pair"'"}]'
559 ovsdb-client transact unix:socket '
563 "where": [["number", "==", '$2']]},
565 "comment": "delete row for '"$2"'"}]'
566 ovsdb-client transact unix:socket '
570 "row": {"name": "'$1'", "number": '$2'}},
572 "comment": "add back row for '"$pair"'"}]'
574 [0], [stdout], [ignore], [test ! -e pid || kill `cat pid`])
575 dnl Check that all the crap is in fact in the database log.
576 AT_CHECK([[${PERL} $srcdir/uuidfilt.pl db | grep -v ^OVSDB | sed 's/"_date":[0-9]*/"_date":0/' | test-json --multiple -]], [0],
577 [[{"cksum":"12345678 9","name":"ordinals","tables":{"ordinals":{"columns":{"name":{"type":"string"},"number":{"type":"integer"}},"indexes":[["number"]]}},"version":"5.1.3"}
578 {"_comment":"add row for zero 0","_date":0,"ordinals":{"<0>":{"name":"zero"}}}
579 {"_comment":"delete row for 0","_date":0,"ordinals":{"<0>":null}}
580 {"_comment":"add back row for zero 0","_date":0,"ordinals":{"<1>":{"name":"zero"}}}
581 {"_comment":"add row for one 1","_date":0,"ordinals":{"<2>":{"name":"one","number":1}}}
582 {"_comment":"delete row for 1","_date":0,"ordinals":{"<2>":null}}
583 {"_comment":"add back row for one 1","_date":0,"ordinals":{"<3>":{"name":"one","number":1}}}
584 {"_comment":"add row for two 2","_date":0,"ordinals":{"<4>":{"name":"two","number":2}}}
585 {"_comment":"delete row for 2","_date":0,"ordinals":{"<4>":null}}
586 {"_comment":"add back row for two 2","_date":0,"ordinals":{"<5>":{"name":"two","number":2}}}
587 {"_comment":"add row for three 3","_date":0,"ordinals":{"<6>":{"name":"three","number":3}}}
588 {"_comment":"delete row for 3","_date":0,"ordinals":{"<6>":null}}
589 {"_comment":"add back row for three 3","_date":0,"ordinals":{"<7>":{"name":"three","number":3}}}
590 {"_comment":"add row for four 4","_date":0,"ordinals":{"<8>":{"name":"four","number":4}}}
591 {"_comment":"delete row for 4","_date":0,"ordinals":{"<8>":null}}
592 {"_comment":"add back row for four 4","_date":0,"ordinals":{"<9>":{"name":"four","number":4}}}
593 {"_comment":"add row for five 5","_date":0,"ordinals":{"<10>":{"name":"five","number":5}}}
594 {"_comment":"delete row for 5","_date":0,"ordinals":{"<10>":null}}
595 {"_comment":"add back row for five 5","_date":0,"ordinals":{"<11>":{"name":"five","number":5}}}
596 ]], [], [test ! -e pid || kill `cat pid`])
597 dnl Dump out and check the actual database contents.
598 AT_CHECK([[ovsdb-client dump unix:socket ordinals]],
599 [0], [stdout], [ignore])
600 AT_CHECK([${PERL} $srcdir/uuidfilt.pl stdout], [0], [dnl
603 ------------------------------------ ----- ------
610 ], [], [test ! -e pid || kill `cat pid`])
611 dnl Now compact the database in-place.
612 AT_CHECK([[ovs-appctl -t "`pwd`"/unixctl ovsdb-server/compact]],
613 [0], [], [ignore], [test ! -e pid || kill `cat pid`])
614 dnl Make sure that "db" is still a symlink to dir/db instead of getting
615 dnl replaced by a regular file, ditto for .db.~lock~.
616 AT_CHECK([test -h db])
617 AT_CHECK([test -h .db.~lock~])
618 AT_CHECK([test -f dir/db])
619 AT_CHECK([test -f dir/.db.~lock~])
620 dnl We can't fully re-check the contents of the database log, because the
621 dnl order of the records is not predictable, but there should only be 4 lines
623 AT_CAPTURE_FILE([db])
624 AT_CHECK([test `wc -l < db` -eq 4], [0], [], [],
625 [test ! -e pid || kill `cat pid`])
626 dnl And check that the dumped data is the same too:
627 AT_CHECK([ovsdb-client dump unix:socket ordinals], [0], [stdout], [ignore],
628 [test ! -e pid || kill `cat pid`])
629 AT_CHECK([${PERL} $srcdir/uuidfilt.pl stdout], [0], [dnl
632 ------------------------------------ ----- ------
639 ], [], [test ! -e pid || kill `cat pid`])
640 dnl Now do some more transactions.
642 [[ovsdb-client transact unix:socket '
646 "where": [["number", "<", 3]]}]']],
648 ]], [ignore], [test ! -e pid || kill `cat pid`])
649 dnl There should be 6 lines in the log now.
650 AT_CHECK([test `wc -l < db` -eq 6], [0], [], [],
651 [test ! -e pid || kill `cat pid`])
652 dnl Then check that the dumped data is correct.
653 AT_CHECK([ovsdb-client dump unix:socket ordinals], [0], [stdout], [ignore],
654 [test ! -e pid || kill `cat pid`])
655 AT_CHECK([${PERL} $srcdir/uuidfilt.pl stdout], [0], [dnl
658 ------------------------------------ ----- ------
662 ], [], [test ! -e pid || kill `cat pid`])
663 OVSDB_SERVER_SHUTDOWN
666 AT_BANNER([OVSDB -- ovsdb-server transactions (SSL IPv4 sockets)])
668 # OVSDB_CHECK_EXECUTION(TITLE, SCHEMA, TRANSACTIONS, OUTPUT, [KEYWORDS])
670 # Creates a database with the given SCHEMA, starts an ovsdb-server on
671 # that database, and runs each of the TRANSACTIONS (which should be a
672 # quoted list of quoted strings) against it with ovsdb-client one at a
675 # Checks that the overall output is OUTPUT, but UUIDs in the output
676 # are replaced by markers of the form <N> where N is a number. The
677 # first unique UUID is replaced by <0>, the next by <1>, and so on.
678 # If a given UUID appears more than once it is always replaced by the
681 # TITLE is provided to AT_SETUP and KEYWORDS to AT_KEYWORDS.
682 m4_define([OVSDB_CHECK_EXECUTION],
684 AT_KEYWORDS([ovsdb server positive ssl $5])
685 AT_SKIP_IF([test "$HAVE_OPENSSL" = no])
686 OVS_RUNDIR=`pwd`; export OVS_RUNDIR
687 OVS_LOGDIR=`pwd`; export OVS_LOGDIR
689 PKIDIR=$abs_top_builddir/tests
690 AT_CHECK([ovsdb-tool create db schema], [0], [stdout], [ignore])
691 AT_CHECK([ovsdb-server --log-file --detach --no-chdir --pidfile="`pwd`"/pid --private-key=$PKIDIR/testpki-privkey2.pem --certificate=$PKIDIR/testpki-cert2.pem --ca-cert=$PKIDIR/testpki-cacert.pem --remote=pssl:0:127.0.0.1 --unixctl="`pwd`"/unixctl db], [0], [ignore], [ignore])
692 SSL_PORT=`parse_listening_port < ovsdb-server.log`
693 m4_foreach([txn], [$3],
694 [AT_CHECK([ovsdb-client --private-key=$PKIDIR/testpki-privkey.pem --certificate=$PKIDIR/testpki-cert.pem --ca-cert=$PKIDIR/testpki-cacert.pem transact ssl:127.0.0.1:$SSL_PORT 'txn'], [0], [stdout], [ignore],
695 [test ! -e pid || kill `cat pid`])
698 AT_CHECK([${PERL} $srcdir/uuidfilt.pl output], [0], [$4], [ignore],
699 [test ! -e pid || kill `cat pid`])
700 OVSDB_SERVER_SHUTDOWN
705 AT_BANNER([OVSDB -- ovsdb-server transactions (SSL IPv6 sockets)])
707 # OVSDB_CHECK_EXECUTION(TITLE, SCHEMA, TRANSACTIONS, OUTPUT, [KEYWORDS])
709 # Creates a database with the given SCHEMA, starts an ovsdb-server on
710 # that database, and runs each of the TRANSACTIONS (which should be a
711 # quoted list of quoted strings) against it with ovsdb-client one at a
714 # Checks that the overall output is OUTPUT, but UUIDs in the output
715 # are replaced by markers of the form <N> where N is a number. The
716 # first unique UUID is replaced by <0>, the next by <1>, and so on.
717 # If a given UUID appears more than once it is always replaced by the
720 # TITLE is provided to AT_SETUP and KEYWORDS to AT_KEYWORDS.
721 m4_define([OVSDB_CHECK_EXECUTION],
723 AT_KEYWORDS([ovsdb server positive ssl6 $5])
724 AT_SKIP_IF([test "$HAVE_OPENSSL" = no])
725 OVS_RUNDIR=`pwd`; export OVS_RUNDIR
726 OVS_LOGDIR=`pwd`; export OVS_LOGDIR
728 PKIDIR=$abs_top_builddir/tests
729 AT_CHECK([ovsdb-tool create db schema], [0], [stdout], [ignore])
730 AT_CHECK([ovsdb-server --log-file --detach --no-chdir --pidfile="`pwd`"/pid --private-key=$PKIDIR/testpki-privkey2.pem --certificate=$PKIDIR/testpki-cert2.pem --ca-cert=$PKIDIR/testpki-cacert.pem --remote=pssl:0:[[::1]] --unixctl="`pwd`"/unixctl db], [0], [ignore], [ignore])
731 SSL_PORT=`parse_listening_port < ovsdb-server.log`
732 m4_foreach([txn], [$3],
733 [AT_CHECK([ovsdb-client --private-key=$PKIDIR/testpki-privkey.pem --certificate=$PKIDIR/testpki-cert.pem --ca-cert=$PKIDIR/testpki-cacert.pem transact ssl:[[::1]]:$SSL_PORT 'txn'], [0], [stdout], [ignore],
734 [test ! -e pid || kill `cat pid`])
737 AT_CHECK([${PERL} $srcdir/uuidfilt.pl output], [0], [$4], [ignore],
738 [test ! -e pid || kill `cat pid`])
739 OVSDB_SERVER_SHUTDOWN
742 ONE_EXECUTION_EXAMPLE
744 AT_BANNER([OVSDB -- ovsdb-server transactions (TCP IPv4 sockets)])
746 AT_SETUP([ovsdb-client get-schema-version - tcp socket])
747 AT_KEYWORDS([ovsdb server positive tcp])
748 ordinal_schema > schema
749 AT_CHECK([ovsdb-tool create db schema], [0], [ignore], [ignore])
750 OVS_LOGDIR=`pwd`; export OVS_LOGDIR
751 AT_CHECK([ovsdb-server --log-file --detach --no-chdir --pidfile="`pwd`"/pid --unixctl="`pwd`"/unixctl --remote=ptcp:0:127.0.0.1 db], [0], [ignore], [ignore])
752 TCP_PORT=`parse_listening_port < ovsdb-server.log`
753 AT_CHECK([ovsdb-client get-schema-version tcp:127.0.0.1:$TCP_PORT ordinals], [0], [5.1.3
755 OVSDB_SERVER_SHUTDOWN
758 # OVSDB_CHECK_EXECUTION(TITLE, SCHEMA, TRANSACTIONS, OUTPUT, [KEYWORDS])
760 # Creates a database with the given SCHEMA, starts an ovsdb-server on
761 # that database, and runs each of the TRANSACTIONS (which should be a
762 # quoted list of quoted strings) against it with ovsdb-client one at a
765 # Checks that the overall output is OUTPUT, but UUIDs in the output
766 # are replaced by markers of the form <N> where N is a number. The
767 # first unique UUID is replaced by <0>, the next by <1>, and so on.
768 # If a given UUID appears more than once it is always replaced by the
771 # TITLE is provided to AT_SETUP and KEYWORDS to AT_KEYWORDS.
772 m4_define([OVSDB_CHECK_EXECUTION],
774 AT_KEYWORDS([ovsdb server positive tcp $5])
775 OVS_RUNDIR=`pwd`; export OVS_RUNDIR
776 OVS_LOGDIR=`pwd`; export OVS_LOGDIR
778 PKIDIR=$abs_top_builddir/tests
779 AT_CHECK([ovsdb-tool create db schema], [0], [stdout], [ignore])
780 AT_CHECK([ovsdb-server --log-file --detach --no-chdir --pidfile="`pwd`"/pid --remote=ptcp:0:127.0.0.1 --unixctl="`pwd`"/unixctl db], [0], [ignore], [ignore])
781 TCP_PORT=`parse_listening_port < ovsdb-server.log`
782 m4_foreach([txn], [$3],
783 [AT_CHECK([ovsdb-client transact tcp:127.0.0.1:$TCP_PORT 'txn'], [0], [stdout], [ignore],
784 [test ! -e pid || kill `cat pid`])
787 AT_CHECK([${PERL} $srcdir/uuidfilt.pl output], [0], [$4], [ignore],
788 [test ! -e pid || kill `cat pid`])
789 OVSDB_SERVER_SHUTDOWN
794 AT_BANNER([OVSDB -- ovsdb-server transactions (TCP IPv6 sockets)])
796 # OVSDB_CHECK_EXECUTION(TITLE, SCHEMA, TRANSACTIONS, OUTPUT, [KEYWORDS])
798 # Creates a database with the given SCHEMA, starts an ovsdb-server on
799 # that database, and runs each of the TRANSACTIONS (which should be a
800 # quoted list of quoted strings) against it with ovsdb-client one at a
803 # Checks that the overall output is OUTPUT, but UUIDs in the output
804 # are replaced by markers of the form <N> where N is a number. The
805 # first unique UUID is replaced by <0>, the next by <1>, and so on.
806 # If a given UUID appears more than once it is always replaced by the
809 # TITLE is provided to AT_SETUP and KEYWORDS to AT_KEYWORDS.
810 m4_define([OVSDB_CHECK_EXECUTION],
812 AT_KEYWORDS([ovsdb server positive tcp6 $5])
813 OVS_RUNDIR=`pwd`; export OVS_RUNDIR
814 OVS_LOGDIR=`pwd`; export OVS_LOGDIR
816 PKIDIR=$abs_top_builddir/tests
817 AT_CHECK([ovsdb-tool create db schema], [0], [stdout], [ignore])
818 AT_CHECK([ovsdb-server --log-file --detach --no-chdir --pidfile="`pwd`"/pid --remote=ptcp:0:[[::1]] --unixctl="`pwd`"/unixctl db], [0], [ignore], [ignore])
819 TCP_PORT=`parse_listening_port < ovsdb-server.log`
820 m4_foreach([txn], [$3],
821 [AT_CHECK([ovsdb-client transact tcp:[[::1]]:$TCP_PORT 'txn'], [0], [stdout], [ignore],
822 [test ! -e pid || kill `cat pid`])
825 AT_CHECK([${PERL} $srcdir/uuidfilt.pl output], [0], [$4], [ignore],
826 [test ! -e pid || kill `cat pid`])
827 OVSDB_SERVER_SHUTDOWN
830 ONE_EXECUTION_EXAMPLE
832 AT_BANNER([OVSDB -- transactions on transient ovsdb-server])
834 # OVSDB_CHECK_EXECUTION(TITLE, SCHEMA, TRANSACTIONS, OUTPUT, [KEYWORDS])
836 # Creates a database with the given SCHEMA and runs each of the
837 # TRANSACTIONS (which should be a quoted list of quoted strings)
838 # against it with ovsdb-client one at a time. Each ovsdb-client
839 # is run against a separately started ovsdb-server that executes
840 # only that single transaction. (The idea is that this should
841 # help to ferret out any differences between what ovsdb-server has
842 # in memory and what actually gets committed to disk.)
844 # Checks that the overall output is OUTPUT, but UUIDs in the output
845 # are replaced by markers of the form <N> where N is a number. The
846 # first unique UUID is replaced by <0>, the next by <1>, and so on.
847 # If a given UUID appears more than once it is always replaced by the
850 # TITLE is provided to AT_SETUP and KEYWORDS to AT_KEYWORDS.
851 m4_define([OVSDB_CHECK_EXECUTION],
853 AT_KEYWORDS([ovsdb server positive transient $5])
854 OVS_RUNDIR=`pwd`; export OVS_RUNDIR
856 AT_CHECK([ovsdb-tool create db schema], [0], [stdout], [ignore])
857 m4_foreach([txn], [$3],
858 [AT_DATA([txnfile], [ovsdb-client transact unix:socket 'txn'
860 AT_CHECK([ovsdb-server --remote=punix:socket --unixctl="`pwd`"/unixctl db --run="sh txnfile"], [0], [stdout], [ignore])
863 AT_CHECK([${PERL} $srcdir/uuidfilt.pl output], [0], [$4], [ignore])