69ec7a17d22660844204e961b490feb90524fca2
[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 \r\\]"])
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   [${PERL} $srcdir/uuidfilt.pl 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 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 (TCP sockets)])
706
707 AT_SETUP([ovsdb-client get-schema-version - tcp socket])
708 AT_KEYWORDS([ovsdb server positive tcp])
709 ordinal_schema > schema
710 AT_CHECK([ovsdb-tool create db schema], [0], [ignore], [ignore])
711 OVS_LOGDIR=`pwd`; export OVS_LOGDIR
712 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])
713 TCP_PORT=`parse_listening_port < ovsdb-server.log`
714 AT_CHECK([ovsdb-client get-schema-version tcp:127.0.0.1:$TCP_PORT ordinals], [0], [5.1.3
715 ])
716 OVSDB_SERVER_SHUTDOWN
717 AT_CLEANUP])
718
719 # OVSDB_CHECK_EXECUTION(TITLE, SCHEMA, TRANSACTIONS, OUTPUT, [KEYWORDS])
720 #
721 # Creates a database with the given SCHEMA, starts an ovsdb-server on
722 # that database, and runs each of the TRANSACTIONS (which should be a
723 # quoted list of quoted strings) against it with ovsdb-client one at a
724 # time.
725 #
726 # Checks that the overall output is OUTPUT, but UUIDs in the output
727 # are replaced by markers of the form <N> where N is a number.  The
728 # first unique UUID is replaced by <0>, the next by <1>, and so on.
729 # If a given UUID appears more than once it is always replaced by the
730 # same marker.
731 #
732 # TITLE is provided to AT_SETUP and KEYWORDS to AT_KEYWORDS.
733 m4_define([OVSDB_CHECK_EXECUTION],
734   [AT_SETUP([$1])
735    AT_KEYWORDS([ovsdb server positive tcp $5])
736    OVS_RUNDIR=`pwd`; export OVS_RUNDIR
737    OVS_LOGDIR=`pwd`; export OVS_LOGDIR
738    $2 > schema
739    PKIDIR=$abs_top_builddir/tests
740    AT_CHECK([ovsdb-tool create db schema], [0], [stdout], [ignore])
741    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])
742    TCP_PORT=`parse_listening_port < ovsdb-server.log`
743    m4_foreach([txn], [$3],
744      [AT_CHECK([ovsdb-client transact tcp:127.0.0.1:$TCP_PORT 'txn'], [0], [stdout], [ignore],
745      [test ! -e pid || kill `cat pid`])
746 cat stdout >> output
747 ])
748    AT_CHECK([${PERL} $srcdir/uuidfilt.pl output], [0], [$4], [ignore],
749             [test ! -e pid || kill `cat pid`])
750    OVSDB_SERVER_SHUTDOWN
751    AT_CLEANUP])
752
753 EXECUTION_EXAMPLES
754 \f
755 AT_BANNER([OVSDB -- transactions on transient ovsdb-server])
756
757 # OVSDB_CHECK_EXECUTION(TITLE, SCHEMA, TRANSACTIONS, OUTPUT, [KEYWORDS])
758 #
759 # Creates a database with the given SCHEMA and runs each of the
760 # TRANSACTIONS (which should be a quoted list of quoted strings)
761 # against it with ovsdb-client one at a time.  Each ovsdb-client
762 # is run against a separately started ovsdb-server that executes
763 # only that single transaction.  (The idea is that this should
764 # help to ferret out any differences between what ovsdb-server has
765 # in memory and what actually gets committed to disk.)
766 #
767 # Checks that the overall output is OUTPUT, but UUIDs in the output
768 # are replaced by markers of the form <N> where N is a number.  The
769 # first unique UUID is replaced by <0>, the next by <1>, and so on.
770 # If a given UUID appears more than once it is always replaced by the
771 # same marker.
772 #
773 # TITLE is provided to AT_SETUP and KEYWORDS to AT_KEYWORDS.
774 m4_define([OVSDB_CHECK_EXECUTION], 
775   [AT_SETUP([$1])
776    AT_KEYWORDS([ovsdb server positive transient $5])
777    OVS_RUNDIR=`pwd`; export OVS_RUNDIR
778    $2 > schema
779    AT_CHECK([ovsdb-tool create db schema], [0], [stdout], [ignore])
780    m4_foreach([txn], [$3], 
781      [AT_DATA([txnfile], [ovsdb-client transact unix:socket 'txn'
782 ])
783       AT_CHECK([ovsdb-server --remote=punix:socket --unixctl="`pwd`"/unixctl db --run="sh txnfile"], [0], [stdout], [ignore])
784       cat stdout >> output
785 ])
786    AT_CHECK([${PERL} $srcdir/uuidfilt.pl output], [0], [$4], [ignore])
787    AT_CLEANUP])
788
789 EXECUTION_EXAMPLES