Revert "jsonrpc-server: Add test for disconnecting connections with too long queues."
[sliver-openvswitch.git] / tests / ovsdb-server.at
1 AT_BANNER([OVSDB -- ovsdb-server transactions (Unix sockets)])
2
3 m4_define([OVSDB_SERVER_SHUTDOWN], 
4   [cp pid savepid
5    AT_CHECK([ovs-appctl -t "`pwd`"/unixctl -e exit], [0], [ignore], [ignore])
6    OVS_WAIT_WHILE([kill -0 `cat savepid`], [kill `cat savepid`])])
7
8 # OVSDB_CHECK_EXECUTION(TITLE, SCHEMA, TRANSACTIONS, OUTPUT, [KEYWORDS])
9 #
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
13 # time.
14 #
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
19 # same marker.
20 #
21 # TITLE is provided to AT_SETUP and KEYWORDS to AT_KEYWORDS.
22 m4_define([OVSDB_CHECK_EXECUTION], 
23   [AT_SETUP([$1])
24   OVS_RUNDIR=`pwd`; export OVS_RUNDIR
25    AT_KEYWORDS([ovsdb server positive unix $5])
26    $2 > schema
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`])
32 cat stdout >> output
33 ])
34    AT_CHECK([${PERL} $srcdir/uuidfilt.pl output], [0], [$4], [ignore],
35             [test ! -e pid || kill `cat pid`])
36    OVSDB_SERVER_SHUTDOWN
37    AT_CLEANUP])
38
39 EXECUTION_EXAMPLES
40 \f
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 \
48 '["ordinals",
49   {"op": "insert",
50    "table": "ordinals",
51    "row": {"number": 0, "name": "zero"}}]'
52 ]])
53 AT_CHECK([ovsdb-server --remote=punix:socket --unixctl="`pwd`"/unixctl db --run="sh txnfile"], [0], [stdout], [])
54 cat stdout >> output
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.
57 echo 'xxx' >> db
58 AT_DATA([txnfile], [[ovsdb-client transact unix:socket \
59 '["ordinals",
60   {"op": "insert",
61    "table": "ordinals",
62    "row": {"number": 1, "name": "one"}}]'
63 ]])
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],
66   [0], [ignore])
67 cat stdout >> output
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 \
72 '["ordinals",
73   {"op": "select",
74    "table": "ordinals",
75    "where": [],
76    "sort": ["number"]}]'
77 ]])
78 AT_CHECK([ovsdb-server --remote=punix:socket --unixctl="`pwd`"/unixctl db --run="sh txnfile"], [0], [stdout], [])
79 cat stdout >> output
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}]}]
84 ]], [],
85          [test ! -e pid || kill `cat pid`])
86 AT_CLEANUP
87
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 \
95 '["ordinals",
96   {"op": "insert",
97    "table": "ordinals",
98    "row": {"number": 0, "name": "zero"}}]'
99 ]])
100 AT_CHECK([ovsdb-server --remote=punix:socket --unixctl="`pwd`"/unixctl db --run="sh txnfile"], [0], [stdout], [])
101 cat stdout >> output
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 \
107 '["ordinals",
108   {"op": "insert",
109    "table": "ordinals",
110    "row": {"number": 1, "name": "one"}}]'
111 ]])
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],
114   [0], [ignore])
115 cat stdout >> output
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 \
120 '["ordinals",
121   {"op": "select",
122    "table": "ordinals",
123    "where": [],
124    "sort": ["number"]}]'
125 ]])
126 AT_CHECK([ovsdb-server --remote=punix:socket --unixctl="`pwd`"/unixctl db --run="sh txnfile"], [0], [stdout], [])
127 cat stdout >> output
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}]}]
132 ]], [],
133          [test ! -e pid || kill `cat pid`])
134 AT_CLEANUP
135
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
143 ])
144 OVSDB_SERVER_SHUTDOWN
145 AT_CLEANUP
146
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])
155 AT_CHECK(
156   [[ovsdb-client list-dbs unix:socket]], 
157   [0], [constraints
158 ordinals
159 ], [ignore], [test ! -e pid || kill `cat pid`])
160 AT_CHECK(
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
165 AT_CLEANUP
166
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])
176
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],
180   [0], [ordinals
181 ])
182
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],
186   [0], [constraints
187 ordinals
188 ])
189
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])
193
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
199 ])
200
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
206 ])
207
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
212 punix:socket
213 ])
214
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],
218   [0], [constraints
219 ])
220 AT_CHECK([ovs-appctl -t ovsdb-server ovsdb-server/list-remotes],
221   [0], [db:ordinals,ordinals,name
222 punix:socket
223 ])
224 AT_CHECK([ovsdb-client list-tables unix:socket ordinals], [1], [ignore], [ignore])
225
226 # Remove db2.
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],
229   [0], [])
230 AT_CHECK([ovsdb-client list-tables unix:socket constraints], [1], [ignore], [ignore])
231
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
236 ])
237
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],
241   [0], [constraints
242 ])
243 AT_CHECK([ovsdb-client list-tables unix:socket constraints], [0], [ignore], [ignore])
244 AT_CLEANUP
245
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])
255
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],
261   [0], [constraints
262 ordinals
263 ])
264
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`])
270 OVS_WAIT_UNTIL(
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],
273   [0], [constraints
274 ordinals
275 ])
276 AT_CLEANUP
277
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])
289
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],
293   [0], [ordinals
294 ])
295
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`])
301 OVS_WAIT_UNTIL(
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],
304   [0], [ordinals
305 ])
306 AT_CLEANUP
307
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
312 AT_DATA([schema],
313   [[{"name": "mydb",
314      "tables": {
315        "Root": {
316          "columns": {
317            "managers": {
318              "type": {
319                "key": "string",
320                "min": 0,
321                "max": "unlimited"}},
322            "manager_options": {
323              "type": {
324                "key": {"type": "uuid", "refTable": "Manager"},
325                "min": 0,
326                "max": "unlimited"}}}},
327        "Manager": {
328          "columns": {
329            "target": {
330              "type": "string"},
331            "is_connected": {
332              "type": {
333                "key": "boolean",
334                "min": 0,
335                "max": 1}}}}}}
336 ]])
337 AT_CHECK([ovsdb-tool create db schema], [0], [ignore], [ignore])
338 AT_CHECK(
339   [[ovsdb-tool transact db \
340      '["mydb",
341        {"op": "insert",
342         "table": "Root",
343         "row": {
344           "managers": "punix:socket1",
345           "manager_options": ["set", [["named-uuid", "x"]]]}},
346        {"op": "insert",
347         "table": "Manager",
348         "uuid-name": "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
353 AT_CHECK(
354   [[ovsdb-client transact unix:socket1 \
355      '["mydb",
356        {"op": "select",
357         "table": "Root",
358         "where": [],
359         "columns": ["managers"]},
360        {"op": "select",
361         "table": "Manager",
362         "where": [],
363         "columns": ["target", "is_connected"]}]']],
364   [0], [stdout], [ignore])
365 AT_CHECK(
366   [${PERL} $srcdir/uuidfilt.pl stdout], 
367   [0], 
368   [[[{"rows":[{"managers":"punix:socket1"}]},{"rows":[{"is_connected":false,"target":"punix:socket2"}]}]
369 ]], 
370   [ignore])
371 AT_CLEANUP
372
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])
381
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],
386   [0], [punix:socket1
387 ])
388
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],
393   [0], [punix:socket1
394 punix:socket2
395 ])
396
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
400 ])
401
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],
406   [0], [punix:socket2
407 ])
408
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])
413 AT_CLEANUP
414
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])
424
425 # Add a remote.
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],
430   [0], [punix:socket1
431 ])
432
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
437 rm socket1
438 AT_CHECK([kill -SEGV `cat ovsdb-server.pid`])
439 OVS_WAIT_WHILE([kill -0 `cat old.pid`])
440 OVS_WAIT_UNTIL(
441   [test -s ovsdb-server.pid && test `cat ovsdb-server.pid` != `cat old.pid`])
442 OVS_WAIT_UNTIL([test -S socket1])
443 AT_CLEANUP
444
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])
454
455 # Add a remote.
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],
460   [0], [punix:socket1
461 ])
462
463 # Remove the remote.
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])
467
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`])
474 OVS_WAIT_UNTIL(
475   [test -s ovsdb-server.pid && test `cat ovsdb-server.pid` != `cat old.pid`])
476 AT_CHECK([test ! -e socket1])
477 AT_CLEANUP
478
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" : ".*[       '\"
484 \\]"])
485 AT_DATA([schema],
486   [[{"name": "mydb",
487      "tables": {
488        "SSL": {
489          "columns": {
490            "private_key": {"type": "string"},
491            "certificate": {"type": "string"},
492            "ca_cert": {"type": "string"}}}}}
493 ]])
494 AT_CHECK([ovsdb-tool create db schema], [0], [stdout], [ignore])
495 AT_CHECK(
496   [[ovsdb-tool transact db \
497      '["mydb",
498        {"op": "insert",
499         "table": "SSL",
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
505 AT_CHECK(
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`
513 AT_CHECK(
514   [[ovsdb-client \
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 \
519         '["mydb",
520           {"op": "select",
521            "table": "SSL",
522            "where": [],
523            "columns": ["private_key"]}]']], 
524   [0], [stdout], [ignore], [test ! -e pid || kill `cat pid`])
525 cat stdout >> output
526 AT_CHECK_UNQUOTED(
527   [cat output], [0],
528   [[[{"rows":[{"private_key":"$PKIDIR/testpki-privkey2.pem"}]}]
529 ]], [ignore], [test ! -e pid || kill `cat pid`])
530 OVSDB_SERVER_SHUTDOWN
531 AT_CLEANUP
532
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.
540 mkdir dir
541 ln -s dir/db db
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.
549 AT_CHECK(
550   [[for pair in 'zero 0' 'one 1' 'two 2' 'three 3' 'four 4' 'five 5'; do
551       set -- $pair
552       ovsdb-client transact unix:socket '
553         ["ordinals",
554          {"op": "insert",
555           "table": "ordinals",
556           "row": {"name": "'$1'", "number": '$2'}},
557          {"op": "comment",
558           "comment": "add row for '"$pair"'"}]'
559       ovsdb-client transact unix:socket '
560         ["ordinals",
561          {"op": "delete",
562           "table": "ordinals",
563           "where": [["number", "==", '$2']]},
564          {"op": "comment",
565           "comment": "delete row for '"$2"'"}]'
566       ovsdb-client transact unix:socket '
567         ["ordinals",
568          {"op": "insert",
569           "table": "ordinals",
570           "row": {"name": "'$1'", "number": '$2'}},
571          {"op": "comment",
572           "comment": "add back row for '"$pair"'"}]'
573     done]],
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
601 ordinals table
602 _uuid                                name  number
603 ------------------------------------ ----- ------
604 <0> five  5     @&t@
605 <1> four  4     @&t@
606 <2> one   1     @&t@
607 <3> three 3     @&t@
608 <4> two   2     @&t@
609 <5> zero  0     @&t@
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
622 dnl in it now.
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
630 ordinals table
631 _uuid                                name  number
632 ------------------------------------ ----- ------
633 <0> five  5     @&t@
634 <1> four  4     @&t@
635 <2> one   1     @&t@
636 <3> three 3     @&t@
637 <4> two   2     @&t@
638 <5> zero  0     @&t@
639 ], [], [test ! -e pid || kill `cat pid`])
640 dnl Now do some more transactions.
641 AT_CHECK(
642   [[ovsdb-client transact unix:socket '
643      ["ordinals",
644       {"op": "delete",
645        "table": "ordinals",
646        "where": [["number", "<", 3]]}]']],
647   [0], [[[{"count":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
656 ordinals table
657 _uuid                                name  number
658 ------------------------------------ ----- ------
659 <0> five  5     @&t@
660 <1> four  4     @&t@
661 <2> three 3     @&t@
662 ], [], [test ! -e pid || kill `cat pid`])
663 OVSDB_SERVER_SHUTDOWN
664 AT_CLEANUP
665 \f
666 AT_BANNER([OVSDB -- ovsdb-server transactions (SSL IPv4 sockets)])
667
668 # OVSDB_CHECK_EXECUTION(TITLE, SCHEMA, TRANSACTIONS, OUTPUT, [KEYWORDS])
669 #
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
673 # time.
674 #
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
679 # same marker.
680 #
681 # TITLE is provided to AT_SETUP and KEYWORDS to AT_KEYWORDS.
682 m4_define([OVSDB_CHECK_EXECUTION], 
683   [AT_SETUP([$1])
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
688    $2 > schema
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`])
696 cat stdout >> output
697 ])
698    AT_CHECK([${PERL} $srcdir/uuidfilt.pl output], [0], [$4], [ignore],
699             [test ! -e pid || kill `cat pid`])
700    OVSDB_SERVER_SHUTDOWN
701    AT_CLEANUP])
702
703 EXECUTION_EXAMPLES
704
705 AT_BANNER([OVSDB -- ovsdb-server transactions (SSL IPv6 sockets)])
706
707 # OVSDB_CHECK_EXECUTION(TITLE, SCHEMA, TRANSACTIONS, OUTPUT, [KEYWORDS])
708 #
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
712 # time.
713 #
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
718 # same marker.
719 #
720 # TITLE is provided to AT_SETUP and KEYWORDS to AT_KEYWORDS.
721 m4_define([OVSDB_CHECK_EXECUTION],
722   [AT_SETUP([$1])
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
727    $2 > schema
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`])
735 cat stdout >> output
736 ])
737    AT_CHECK([${PERL} $srcdir/uuidfilt.pl output], [0], [$4], [ignore],
738             [test ! -e pid || kill `cat pid`])
739    OVSDB_SERVER_SHUTDOWN
740    AT_CLEANUP])
741
742 ONE_EXECUTION_EXAMPLE
743
744 AT_BANNER([OVSDB -- ovsdb-server transactions (TCP IPv4 sockets)])
745
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
754 ])
755 OVSDB_SERVER_SHUTDOWN
756 AT_CLEANUP])
757
758 # OVSDB_CHECK_EXECUTION(TITLE, SCHEMA, TRANSACTIONS, OUTPUT, [KEYWORDS])
759 #
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
763 # time.
764 #
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
769 # same marker.
770 #
771 # TITLE is provided to AT_SETUP and KEYWORDS to AT_KEYWORDS.
772 m4_define([OVSDB_CHECK_EXECUTION],
773   [AT_SETUP([$1])
774    AT_KEYWORDS([ovsdb server positive tcp $5])
775    OVS_RUNDIR=`pwd`; export OVS_RUNDIR
776    OVS_LOGDIR=`pwd`; export OVS_LOGDIR
777    $2 > schema
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`])
785 cat stdout >> output
786 ])
787    AT_CHECK([${PERL} $srcdir/uuidfilt.pl output], [0], [$4], [ignore],
788             [test ! -e pid || kill `cat pid`])
789    OVSDB_SERVER_SHUTDOWN
790    AT_CLEANUP])
791
792 EXECUTION_EXAMPLES
793
794 AT_BANNER([OVSDB -- ovsdb-server transactions (TCP IPv6 sockets)])
795
796 # OVSDB_CHECK_EXECUTION(TITLE, SCHEMA, TRANSACTIONS, OUTPUT, [KEYWORDS])
797 #
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
801 # time.
802 #
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
807 # same marker.
808 #
809 # TITLE is provided to AT_SETUP and KEYWORDS to AT_KEYWORDS.
810 m4_define([OVSDB_CHECK_EXECUTION],
811   [AT_SETUP([$1])
812    AT_KEYWORDS([ovsdb server positive tcp6 $5])
813    OVS_RUNDIR=`pwd`; export OVS_RUNDIR
814    OVS_LOGDIR=`pwd`; export OVS_LOGDIR
815    $2 > schema
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`])
823 cat stdout >> output
824 ])
825    AT_CHECK([${PERL} $srcdir/uuidfilt.pl output], [0], [$4], [ignore],
826             [test ! -e pid || kill `cat pid`])
827    OVSDB_SERVER_SHUTDOWN
828    AT_CLEANUP])
829
830 ONE_EXECUTION_EXAMPLE
831 \f
832 AT_BANNER([OVSDB -- transactions on transient ovsdb-server])
833
834 # OVSDB_CHECK_EXECUTION(TITLE, SCHEMA, TRANSACTIONS, OUTPUT, [KEYWORDS])
835 #
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.)
843 #
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
848 # same marker.
849 #
850 # TITLE is provided to AT_SETUP and KEYWORDS to AT_KEYWORDS.
851 m4_define([OVSDB_CHECK_EXECUTION], 
852   [AT_SETUP([$1])
853    AT_KEYWORDS([ovsdb server positive transient $5])
854    OVS_RUNDIR=`pwd`; export OVS_RUNDIR
855    $2 > schema
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'
859 ])
860       AT_CHECK([ovsdb-server --remote=punix:socket --unixctl="`pwd`"/unixctl db --run="sh txnfile"], [0], [stdout], [ignore])
861       cat stdout >> output
862 ])
863    AT_CHECK([${PERL} $srcdir/uuidfilt.pl output], [0], [$4], [ignore])
864    AT_CLEANUP])
865
866 EXECUTION_EXAMPLES