1 AT_BANNER([OVSDB -- execution])
3 m4_define([ORDINAL_SCHEMA],
8 "number": {"type": "integer"},
9 "name": {"type": "string"}}}}}]])
11 m4_define([CONSTRAINT_SCHEMA],
12 [[{"name": "constraints",
16 "a": {"type": "integer"},
17 "a2a": {"type": {"key": {"type": "uuid", "refTable": "a"},
18 "min": 0, "max": "unlimited"}},
19 "a2b": {"type": {"key": {"type": "uuid", "refTable": "b"},
20 "min": 0, "max": "unlimited"}}}},
23 "b": {"type": "integer"},
24 "b2a": {"type": {"key": {"type": "uuid", "refTable": "a"},
25 "min": 0, "max": "unlimited"}},
26 "b2b": {"type": {"key": {"type": "uuid", "refTable": "b"},
27 "min": 0, "max": "unlimited"}}}},
30 "positive": {"type": {"key": {"type": "integer",
31 "minInteger": 1}}}}}}}]])
33 # OVSDB_CHECK_EXECUTION(TITLE, SCHEMA, TRANSACTIONS, OUTPUT, [KEYWORDS])
35 # Runs "test-ovsdb execute" with the given SCHEMA and each of the
36 # TRANSACTIONS (which should be a quoted list of quoted strings).
38 # Checks that the overall output is OUTPUT, but UUIDs in the output
39 # are replaced by markers of the form <N> where N is a number. The
40 # first unique UUID is replaced by <0>, the next by <1>, and so on.
41 # If a given UUID appears more than once it is always replaced by the
44 # TITLE is provided to AT_SETUP and KEYWORDS to AT_KEYWORDS.
45 m4_define([OVSDB_CHECK_EXECUTION],
47 AT_KEYWORDS([ovsdb execute execution positive $5])
48 AT_CHECK([test-ovsdb execute '$2' m4_foreach([txn], [$3], [ 'txn'])],
50 AT_CHECK([perl $srcdir/uuidfilt.pl stdout], [0], [$4])
53 m4_define([EXECUTION_EXAMPLES], [
54 dnl At one point the "commit" code ignored new rows with all-default values,
55 dnl so this checks for that problem.
56 OVSDB_CHECK_EXECUTION([insert default row, query table],
66 [[[{"uuid":["uuid","<0>"]}]
67 [{"rows":[{"_uuid":["uuid","<0>"],"_version":["uuid","<1>"],"name":"","number":0}]}]
70 OVSDB_CHECK_EXECUTION([insert row, query table],
75 "row": {"number": 0, "name": "zero"}}]]],
80 [[[{"uuid":["uuid","<0>"]}]
81 [{"rows":[{"_uuid":["uuid","<0>"],"_version":["uuid","<1>"],"name":"zero","number":0}]}]
84 OVSDB_CHECK_EXECUTION([insert rows, query by value],
89 "row": {"number": 0, "name": "zero"}}]]],
93 "row": {"number": 1, "name": "one"}}]]],
97 "where": [["name", "==", "zero"]]}]]],
101 "where": [["name", "==", "one"]]}]]]],
102 [[[{"uuid":["uuid","<0>"]}]
103 [{"uuid":["uuid","<1>"]}]
104 [{"rows":[{"_uuid":["uuid","<0>"],"_version":["uuid","<2>"],"name":"zero","number":0}]}]
105 [{"rows":[{"_uuid":["uuid","<1>"],"_version":["uuid","<3>"],"name":"one","number":1}]}]
108 OVSDB_CHECK_EXECUTION([insert rows, query by named-uuid],
113 "row": {"number": 0, "name": "zero"},
114 "uuid-name": "first"},
117 "row": {"number": 1, "name": "one"},
118 "uuid-name": "second"},
121 "where": [["_uuid", "==", ["named-uuid", "first"]]]},
124 "where": [["_uuid", "==", ["named-uuid", "second"]]]}]]]],
125 [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{"rows":[{"_uuid":["uuid","<0>"],"_version":["uuid","<2>"],"name":"zero","number":0}]},{"rows":[{"_uuid":["uuid","<1>"],"_version":["uuid","<3>"],"name":"one","number":1}]}]
128 OVSDB_CHECK_EXECUTION([insert rows, update rows by value],
133 "row": {"number": 0, "name": "zero"},
134 "uuid-name": "first"}]]],
138 "row": {"number": 1, "name": "one"},
139 "uuid-name": "first"}]]],
143 "where": [["name", "==", "zero"]],
144 "row": {"name": "nought"}}]]],
149 "sort": ["number"]}]]]],
150 [[[{"uuid":["uuid","<0>"]}]
151 [{"uuid":["uuid","<1>"]}]
153 [{"rows":[{"_uuid":["uuid","<0>"],"_version":["uuid","<2>"],"name":"nought","number":0},{"_uuid":["uuid","<1>"],"_version":["uuid","<3>"],"name":"one","number":1}]}]
156 OVSDB_CHECK_EXECUTION([insert rows, mutate rows],
161 "row": {"number": 0, "name": "zero"},
162 "uuid-name": "first"}]]],
166 "row": {"number": 1, "name": "one"},
167 "uuid-name": "first"}]]],
171 "where": [["name", "==", "zero"]],
172 "mutations": [["number", "+=", 2]]}]]],
177 "sort": ["number"]}]]]],
178 [[[{"uuid":["uuid","<0>"]}]
179 [{"uuid":["uuid","<1>"]}]
181 [{"rows":[{"_uuid":["uuid","<1>"],"_version":["uuid","<2>"],"name":"one","number":1},{"_uuid":["uuid","<0>"],"_version":["uuid","<3>"],"name":"zero","number":2}]}]
184 OVSDB_CHECK_EXECUTION([insert rows, delete by named-uuid],
189 "row": {"number": 0, "name": "zero"},
190 "uuid-name": "first"},
193 "row": {"number": 1, "name": "one"},
194 "uuid-name": "second"},
197 "where": [["_uuid", "==", ["named-uuid", "first"]]]},
201 "columns": ["name","number"]}]]]],
202 [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{"count":1},{"rows":[{"name":"one","number":1}]}]
205 OVSDB_CHECK_EXECUTION([insert rows, delete rows by value],
210 "row": {"number": 0, "name": "zero"},
211 "uuid-name": "first"}]]],
215 "row": {"number": 1, "name": "one"},
216 "uuid-name": "first"}]]],
220 "where": [["name", "==", "zero"]]}]]],
225 [[[{"uuid":["uuid","<0>"]}]
226 [{"uuid":["uuid","<1>"]}]
228 [{"rows":[{"_uuid":["uuid","<1>"],"_version":["uuid","<2>"],"name":"one","number":1}]}]
231 OVSDB_CHECK_EXECUTION([insert rows, delete by (non-matching) value],
236 "row": {"number": 0, "name": "zero"},
237 "uuid-name": "first"}]]],
241 "row": {"number": 1, "name": "one"},
242 "uuid-name": "first"}]]],
246 "where": [["name", "==", "nought"]]}]]],
251 "sort": ["number"]}]]]],
252 [[[{"uuid":["uuid","<0>"]}]
253 [{"uuid":["uuid","<1>"]}]
255 [{"rows":[{"_uuid":["uuid","<0>"],"_version":["uuid","<2>"],"name":"zero","number":0},{"_uuid":["uuid","<1>"],"_version":["uuid","<3>"],"name":"one","number":1}]}]
258 OVSDB_CHECK_EXECUTION([insert rows, delete all],
263 "row": {"number": 0, "name": "zero"},
264 "uuid-name": "first"},
267 "row": {"number": 1, "name": "one"},
268 "uuid-name": "second"},
275 "columns": ["name","number"]}]]]],
276 [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{"count":2},{"rows":[]}]
279 OVSDB_CHECK_EXECUTION([insert row, query table, commit],
284 "row": {"number": 0, "name": "zero"}},
289 "durable": false}]]]],
290 [[[{"uuid":["uuid","<0>"]},{"rows":[{"_uuid":["uuid","<0>"],"_version":["uuid","<1>"],"name":"zero","number":0}]},{}]
293 OVSDB_CHECK_EXECUTION([insert row, query table, commit durably],
298 "row": {"number": 0, "name": "zero"}},
303 "durable": true}]]]],
304 [[[{"uuid":["uuid","<0>"]},{"rows":[{"_uuid":["uuid","<0>"],"_version":["uuid","<1>"],"name":"zero","number":0}]},{}]
307 OVSDB_CHECK_EXECUTION([equality wait with correct rows],
312 "row": {"number": 0, "name": "zero"}},
315 "row": {"number": 1, "name": "one"}},
320 "columns": ["name", "number"],
322 "rows": [{"name": "zero", "number": 0},
323 {"name": "one", "number": 1}]}]]]],
324 [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{}]
327 OVSDB_CHECK_EXECUTION([equality wait with extra row],
332 "row": {"number": 0, "name": "zero"}},
335 "row": {"number": 1, "name": "one"}},
340 "columns": ["name", "number"],
342 "rows": [{"name": "zero", "number": 0},
343 {"name": "one", "number": 1},
344 {"name": "two", "number": 2}]}]]]],
345 [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{"details":"\"wait\" timed out","error":"timed out"}]
348 OVSDB_CHECK_EXECUTION([equality wait with missing row],
353 "row": {"number": 0, "name": "zero"}},
356 "row": {"number": 1, "name": "one"}},
361 "columns": ["name", "number"],
363 "rows": [{"name": "one", "number": 1}]}]]]],
364 [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{"details":"\"wait\" timed out","error":"timed out"}]
367 OVSDB_CHECK_EXECUTION([inequality wait with correct rows],
372 "row": {"number": 0, "name": "zero"}},
375 "row": {"number": 1, "name": "one"}},
380 "columns": ["name", "number"],
382 "rows": [{"name": "zero", "number": 0},
383 {"name": "one", "number": 1}]}]]]],
384 [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{"details":"\"wait\" timed out","error":"timed out"}]
387 OVSDB_CHECK_EXECUTION([inequality wait with extra row],
392 "row": {"number": 0, "name": "zero"}},
395 "row": {"number": 1, "name": "one"}},
400 "columns": ["name", "number"],
402 "rows": [{"name": "zero", "number": 0},
403 {"name": "one", "number": 1},
404 {"name": "two", "number": 2}]}]]]],
405 [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{}]
408 OVSDB_CHECK_EXECUTION([inequality wait with missing row],
413 "row": {"number": 0, "name": "zero"}},
416 "row": {"number": 1, "name": "one"}},
421 "columns": ["name", "number"],
423 "rows": [{"name": "one", "number": 1}]}]]]],
424 [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{}]
427 OVSDB_CHECK_EXECUTION([insert and update constraints],
431 "table": "constrained",
435 "table": "constrained",
436 "row": {"positive": -1}}]]],
439 "table": "constrained",
441 "row": {"positive": -2}}]]]],
442 [[[{"details":"0 is less than minimum allowed value 1","error":"constraint violation"}]
443 [{"details":"-1 is less than minimum allowed value 1","error":"constraint violation"}]
444 [{"details":"-2 is less than minimum allowed value 1","error":"constraint violation"}]
447 OVSDB_CHECK_EXECUTION([referential integrity -- simple],
453 "uuid-name": "brow"},
457 "a2b": ["set", [["named-uuid", "brow"]]]}},
461 "a2b": ["set", [["named-uuid", "brow"]]]}},
465 "a2b": ["set", [["named-uuid", "brow"]]]}}]]],
473 "where": [["a", "==", 0]]}]]],
481 "where": [["a", "==", 1]]}]]],
489 "where": [["a", "==", 2]]}]]],
494 [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{"uuid":["uuid","<2>"]},{"uuid":["uuid","<3>"]}]
495 [{"count":1},{"details":"cannot delete b row <0> because of 3 remaining reference(s)","error":"referential integrity violation"}]
497 [{"count":1},{"details":"cannot delete b row <0> because of 2 remaining reference(s)","error":"referential integrity violation"}]
499 [{"count":1},{"details":"cannot delete b row <0> because of 1 remaining reference(s)","error":"referential integrity violation"}]
504 OVSDB_CHECK_EXECUTION([referential integrity -- mutual references],
510 "a2b": ["set", [["named-uuid", "row2"]]],
511 "a2a": ["set", [["named-uuid", "row1"]]]},
512 "uuid-name": "row1"},
516 "b2b": ["set", [["named-uuid", "row2"]]],
517 "b2a": ["set", [["named-uuid", "row1"]]]},
518 "uuid-name": "row2"}]]],
522 "row": {"a2b": ["set", [["uuid", "b516b960-5b19-4fc2-bb82-fe1cbd6d0241"]]]}}]]],
526 "where": [["a", "==", 0]]}]]],
530 "where": [["b", "==", 1]]}]]],
531 dnl Try the deletions again to make sure that the refcounts got rolled back.
535 "where": [["a", "==", 0]]}]]],
539 "where": [["b", "==", 1]]}]]],
543 "where": [["a", "==", 0]]},
546 "where": [["b", "==", 1]]}]]]],
547 [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]}]
548 [{"uuid":["uuid","<2>"]},{"details":"reference to nonexistent row <3>","error":"referential integrity violation"}]
549 [{"count":1},{"details":"cannot delete a row <0> because of 1 remaining reference(s)","error":"referential integrity violation"}]
550 [{"count":1},{"details":"cannot delete b row <1> because of 1 remaining reference(s)","error":"referential integrity violation"}]
551 [{"count":1},{"details":"cannot delete a row <0> because of 1 remaining reference(s)","error":"referential integrity violation"}]
552 [{"count":1},{"details":"cannot delete b row <1> because of 1 remaining reference(s)","error":"referential integrity violation"}]
553 [{"count":1},{"count":1}]