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 OVSDB_CHECK_EXECUTION([insert row, query table],
59 "row": {"number": 0, "name": "zero"}}]]],
64 [[[{"uuid":["uuid","<0>"]}]
65 [{"rows":[{"_uuid":["uuid","<0>"],"_version":["uuid","<1>"],"name":"zero","number":0}]}]
68 OVSDB_CHECK_EXECUTION([insert rows, query by value],
73 "row": {"number": 0, "name": "zero"}}]]],
77 "row": {"number": 1, "name": "one"}}]]],
81 "where": [["name", "==", "zero"]]}]]],
85 "where": [["name", "==", "one"]]}]]]],
86 [[[{"uuid":["uuid","<0>"]}]
87 [{"uuid":["uuid","<1>"]}]
88 [{"rows":[{"_uuid":["uuid","<0>"],"_version":["uuid","<2>"],"name":"zero","number":0}]}]
89 [{"rows":[{"_uuid":["uuid","<1>"],"_version":["uuid","<3>"],"name":"one","number":1}]}]
92 OVSDB_CHECK_EXECUTION([insert rows, query by named-uuid],
97 "row": {"number": 0, "name": "zero"},
98 "uuid-name": "first"},
101 "row": {"number": 1, "name": "one"},
102 "uuid-name": "second"},
105 "where": [["_uuid", "==", ["named-uuid", "first"]]]},
108 "where": [["_uuid", "==", ["named-uuid", "second"]]]}]]]],
109 [[[{"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}]}]
112 OVSDB_CHECK_EXECUTION([insert rows, update rows by value],
117 "row": {"number": 0, "name": "zero"},
118 "uuid-name": "first"}]]],
122 "row": {"number": 1, "name": "one"},
123 "uuid-name": "first"}]]],
127 "where": [["name", "==", "zero"]],
128 "row": {"name": "nought"}}]]],
133 "sort": ["number"]}]]]],
134 [[[{"uuid":["uuid","<0>"]}]
135 [{"uuid":["uuid","<1>"]}]
137 [{"rows":[{"_uuid":["uuid","<0>"],"_version":["uuid","<2>"],"name":"nought","number":0},{"_uuid":["uuid","<1>"],"_version":["uuid","<3>"],"name":"one","number":1}]}]
140 OVSDB_CHECK_EXECUTION([insert rows, mutate rows],
145 "row": {"number": 0, "name": "zero"},
146 "uuid-name": "first"}]]],
150 "row": {"number": 1, "name": "one"},
151 "uuid-name": "first"}]]],
155 "where": [["name", "==", "zero"]],
156 "mutations": [["number", "+=", 2]]}]]],
161 "sort": ["number"]}]]]],
162 [[[{"uuid":["uuid","<0>"]}]
163 [{"uuid":["uuid","<1>"]}]
165 [{"rows":[{"_uuid":["uuid","<1>"],"_version":["uuid","<2>"],"name":"one","number":1},{"_uuid":["uuid","<0>"],"_version":["uuid","<3>"],"name":"zero","number":2}]}]
168 OVSDB_CHECK_EXECUTION([insert rows, delete by named-uuid],
173 "row": {"number": 0, "name": "zero"},
174 "uuid-name": "first"},
177 "row": {"number": 1, "name": "one"},
178 "uuid-name": "second"},
181 "where": [["_uuid", "==", ["named-uuid", "first"]]]},
185 "columns": ["name","number"]}]]]],
186 [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{"count":1},{"rows":[{"name":"one","number":1}]}]
189 OVSDB_CHECK_EXECUTION([insert rows, delete rows by value],
194 "row": {"number": 0, "name": "zero"},
195 "uuid-name": "first"}]]],
199 "row": {"number": 1, "name": "one"},
200 "uuid-name": "first"}]]],
204 "where": [["name", "==", "zero"]]}]]],
209 [[[{"uuid":["uuid","<0>"]}]
210 [{"uuid":["uuid","<1>"]}]
212 [{"rows":[{"_uuid":["uuid","<1>"],"_version":["uuid","<2>"],"name":"one","number":1}]}]
215 OVSDB_CHECK_EXECUTION([insert rows, delete by (non-matching) value],
220 "row": {"number": 0, "name": "zero"},
221 "uuid-name": "first"}]]],
225 "row": {"number": 1, "name": "one"},
226 "uuid-name": "first"}]]],
230 "where": [["name", "==", "nought"]]}]]],
235 "sort": ["number"]}]]]],
236 [[[{"uuid":["uuid","<0>"]}]
237 [{"uuid":["uuid","<1>"]}]
239 [{"rows":[{"_uuid":["uuid","<0>"],"_version":["uuid","<2>"],"name":"zero","number":0},{"_uuid":["uuid","<1>"],"_version":["uuid","<3>"],"name":"one","number":1}]}]
242 OVSDB_CHECK_EXECUTION([insert rows, delete all],
247 "row": {"number": 0, "name": "zero"},
248 "uuid-name": "first"},
251 "row": {"number": 1, "name": "one"},
252 "uuid-name": "second"},
259 "columns": ["name","number"]}]]]],
260 [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{"count":2},{"rows":[]}]
263 OVSDB_CHECK_EXECUTION([insert row, query table, commit],
268 "row": {"number": 0, "name": "zero"}},
273 "durable": false}]]]],
274 [[[{"uuid":["uuid","<0>"]},{"rows":[{"_uuid":["uuid","<0>"],"_version":["uuid","<1>"],"name":"zero","number":0}]},{}]
277 OVSDB_CHECK_EXECUTION([insert row, query table, commit durably],
282 "row": {"number": 0, "name": "zero"}},
287 "durable": true}]]]],
288 [[[{"uuid":["uuid","<0>"]},{"rows":[{"_uuid":["uuid","<0>"],"_version":["uuid","<1>"],"name":"zero","number":0}]},{}]
291 OVSDB_CHECK_EXECUTION([equality wait with correct rows],
296 "row": {"number": 0, "name": "zero"}},
299 "row": {"number": 1, "name": "one"}},
304 "columns": ["name", "number"],
306 "rows": [{"name": "zero", "number": 0},
307 {"name": "one", "number": 1}]}]]]],
308 [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{}]
311 OVSDB_CHECK_EXECUTION([equality wait with extra row],
316 "row": {"number": 0, "name": "zero"}},
319 "row": {"number": 1, "name": "one"}},
324 "columns": ["name", "number"],
326 "rows": [{"name": "zero", "number": 0},
327 {"name": "one", "number": 1},
328 {"name": "two", "number": 2}]}]]]],
329 [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{"details":"\"wait\" timed out","error":"timed out"}]
332 OVSDB_CHECK_EXECUTION([equality wait with missing row],
337 "row": {"number": 0, "name": "zero"}},
340 "row": {"number": 1, "name": "one"}},
345 "columns": ["name", "number"],
347 "rows": [{"name": "one", "number": 1}]}]]]],
348 [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{"details":"\"wait\" timed out","error":"timed out"}]
351 OVSDB_CHECK_EXECUTION([inequality wait with correct rows],
356 "row": {"number": 0, "name": "zero"}},
359 "row": {"number": 1, "name": "one"}},
364 "columns": ["name", "number"],
366 "rows": [{"name": "zero", "number": 0},
367 {"name": "one", "number": 1}]}]]]],
368 [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{"details":"\"wait\" timed out","error":"timed out"}]
371 OVSDB_CHECK_EXECUTION([inequality wait with extra row],
376 "row": {"number": 0, "name": "zero"}},
379 "row": {"number": 1, "name": "one"}},
384 "columns": ["name", "number"],
386 "rows": [{"name": "zero", "number": 0},
387 {"name": "one", "number": 1},
388 {"name": "two", "number": 2}]}]]]],
389 [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{}]
392 OVSDB_CHECK_EXECUTION([inequality wait with missing row],
397 "row": {"number": 0, "name": "zero"}},
400 "row": {"number": 1, "name": "one"}},
405 "columns": ["name", "number"],
407 "rows": [{"name": "one", "number": 1}]}]]]],
408 [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{}]
411 OVSDB_CHECK_EXECUTION([insert and update constraints],
415 "table": "constrained",
419 "table": "constrained",
420 "row": {"positive": -1}}]]],
423 "table": "constrained",
425 "row": {"positive": -2}}]]]],
426 [[[{"details":"0 is less than minimum allowed value 1","error":"constraint violation"}]
427 [{"details":"-1 is less than minimum allowed value 1","error":"constraint violation"}]
428 [{"details":"-2 is less than minimum allowed value 1","error":"constraint violation"}]
431 OVSDB_CHECK_EXECUTION([referential integrity -- simple],
437 "uuid-name": "brow"},
441 "a2b": ["set", [["named-uuid", "brow"]]]}},
445 "a2b": ["set", [["named-uuid", "brow"]]]}},
449 "a2b": ["set", [["named-uuid", "brow"]]]}}]]],
457 "where": [["a", "==", 0]]}]]],
465 "where": [["a", "==", 1]]}]]],
473 "where": [["a", "==", 2]]}]]],
478 [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{"uuid":["uuid","<2>"]},{"uuid":["uuid","<3>"]}]
479 [{"count":1},{"details":"cannot delete b row <0> because of 3 remaining reference(s)","error":"referential integrity violation"}]
481 [{"count":1},{"details":"cannot delete b row <0> because of 2 remaining reference(s)","error":"referential integrity violation"}]
483 [{"count":1},{"details":"cannot delete b row <0> because of 1 remaining reference(s)","error":"referential integrity violation"}]
488 OVSDB_CHECK_EXECUTION([referential integrity -- mutual references],
494 "a2b": ["set", [["named-uuid", "row2"]]],
495 "a2a": ["set", [["named-uuid", "row1"]]]},
496 "uuid-name": "row1"},
500 "b2b": ["set", [["named-uuid", "row2"]]],
501 "b2a": ["set", [["named-uuid", "row1"]]]},
502 "uuid-name": "row2"}]]],
506 "row": {"a2b": ["set", [["uuid", "b516b960-5b19-4fc2-bb82-fe1cbd6d0241"]]]}}]]],
510 "where": [["a", "==", 0]]}]]],
514 "where": [["b", "==", 1]]}]]],
515 dnl Try the deletions again to make sure that the refcounts got rolled back.
519 "where": [["a", "==", 0]]}]]],
523 "where": [["b", "==", 1]]}]]],
527 "where": [["a", "==", 0]]},
530 "where": [["b", "==", 1]]}]]]],
531 [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]}]
532 [{"uuid":["uuid","<2>"]},{"details":"reference to nonexistent row <3>","error":"referential integrity violation"}]
533 [{"count":1},{"details":"cannot delete a row <0> because of 1 remaining reference(s)","error":"referential integrity violation"}]
534 [{"count":1},{"details":"cannot delete b row <1> because of 1 remaining reference(s)","error":"referential integrity violation"}]
535 [{"count":1},{"details":"cannot delete a row <0> because of 1 remaining reference(s)","error":"referential integrity violation"}]
536 [{"count":1},{"details":"cannot delete b row <1> because of 1 remaining reference(s)","error":"referential integrity violation"}]
537 [{"count":1},{"count":1}]