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],
58 "row": {"number": 0, "name": "zero"}}]]],
62 [[[{"uuid":["uuid","<0>"]}]
63 [{"rows":[{"_uuid":["uuid","<0>"],"_version":["uuid","<1>"],"name":"zero","number":0}]}]
66 OVSDB_CHECK_EXECUTION([insert rows, query by value],
70 "row": {"number": 0, "name": "zero"}}]]],
73 "row": {"number": 1, "name": "one"}}]]],
76 "where": [["name", "==", "zero"]]}]]],
79 "where": [["name", "==", "one"]]}]]]],
80 [[[{"uuid":["uuid","<0>"]}]
81 [{"uuid":["uuid","<1>"]}]
82 [{"rows":[{"_uuid":["uuid","<0>"],"_version":["uuid","<2>"],"name":"zero","number":0}]}]
83 [{"rows":[{"_uuid":["uuid","<1>"],"_version":["uuid","<3>"],"name":"one","number":1}]}]
86 OVSDB_CHECK_EXECUTION([insert rows, query by named-uuid],
90 "row": {"number": 0, "name": "zero"},
91 "uuid-name": "first"},
94 "row": {"number": 1, "name": "one"},
95 "uuid-name": "second"},
98 "where": [["_uuid", "==", ["named-uuid", "first"]]]},
101 "where": [["_uuid", "==", ["named-uuid", "second"]]]}]]]],
102 [[[{"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}]}]
105 OVSDB_CHECK_EXECUTION([insert rows, update rows by value],
109 "row": {"number": 0, "name": "zero"},
110 "uuid-name": "first"}]]],
113 "row": {"number": 1, "name": "one"},
114 "uuid-name": "first"}]]],
117 "where": [["name", "==", "zero"]],
118 "row": {"name": "nought"}}]]],
122 "sort": ["number"]}]]]],
123 [[[{"uuid":["uuid","<0>"]}]
124 [{"uuid":["uuid","<1>"]}]
126 [{"rows":[{"_uuid":["uuid","<0>"],"_version":["uuid","<2>"],"name":"nought","number":0},{"_uuid":["uuid","<1>"],"_version":["uuid","<3>"],"name":"one","number":1}]}]
129 OVSDB_CHECK_EXECUTION([insert rows, mutate rows],
133 "row": {"number": 0, "name": "zero"},
134 "uuid-name": "first"}]]],
137 "row": {"number": 1, "name": "one"},
138 "uuid-name": "first"}]]],
141 "where": [["name", "==", "zero"]],
142 "mutations": [["number", "+=", 2]]}]]],
146 "sort": ["number"]}]]]],
147 [[[{"uuid":["uuid","<0>"]}]
148 [{"uuid":["uuid","<1>"]}]
150 [{"rows":[{"_uuid":["uuid","<1>"],"_version":["uuid","<2>"],"name":"one","number":1},{"_uuid":["uuid","<0>"],"_version":["uuid","<3>"],"name":"zero","number":2}]}]
153 OVSDB_CHECK_EXECUTION([insert rows, delete by named-uuid],
157 "row": {"number": 0, "name": "zero"},
158 "uuid-name": "first"},
161 "row": {"number": 1, "name": "one"},
162 "uuid-name": "second"},
165 "where": [["_uuid", "==", ["named-uuid", "first"]]]},
169 "columns": ["name","number"]}]]]],
170 [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{"count":1},{"rows":[{"name":"one","number":1}]}]
173 OVSDB_CHECK_EXECUTION([insert rows, delete rows by value],
177 "row": {"number": 0, "name": "zero"},
178 "uuid-name": "first"}]]],
181 "row": {"number": 1, "name": "one"},
182 "uuid-name": "first"}]]],
185 "where": [["name", "==", "zero"]]}]]],
189 [[[{"uuid":["uuid","<0>"]}]
190 [{"uuid":["uuid","<1>"]}]
192 [{"rows":[{"_uuid":["uuid","<1>"],"_version":["uuid","<2>"],"name":"one","number":1}]}]
195 OVSDB_CHECK_EXECUTION([insert rows, delete by (non-matching) value],
199 "row": {"number": 0, "name": "zero"},
200 "uuid-name": "first"}]]],
203 "row": {"number": 1, "name": "one"},
204 "uuid-name": "first"}]]],
207 "where": [["name", "==", "nought"]]}]]],
211 "sort": ["number"]}]]]],
212 [[[{"uuid":["uuid","<0>"]}]
213 [{"uuid":["uuid","<1>"]}]
215 [{"rows":[{"_uuid":["uuid","<0>"],"_version":["uuid","<2>"],"name":"zero","number":0},{"_uuid":["uuid","<1>"],"_version":["uuid","<3>"],"name":"one","number":1}]}]
218 OVSDB_CHECK_EXECUTION([insert rows, delete all],
222 "row": {"number": 0, "name": "zero"},
223 "uuid-name": "first"},
226 "row": {"number": 1, "name": "one"},
227 "uuid-name": "second"},
234 "columns": ["name","number"]}]]]],
235 [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{"count":2},{"rows":[]}]
238 OVSDB_CHECK_EXECUTION([insert row, query table, commit],
242 "row": {"number": 0, "name": "zero"}},
247 "durable": false}]]]],
248 [[[{"uuid":["uuid","<0>"]},{"rows":[{"_uuid":["uuid","<0>"],"_version":["uuid","<1>"],"name":"zero","number":0}]},{}]
251 OVSDB_CHECK_EXECUTION([insert row, query table, commit durably],
255 "row": {"number": 0, "name": "zero"}},
260 "durable": true}]]]],
261 [[[{"uuid":["uuid","<0>"]},{"rows":[{"_uuid":["uuid","<0>"],"_version":["uuid","<1>"],"name":"zero","number":0}]},{}]
264 OVSDB_CHECK_EXECUTION([equality wait with correct rows],
268 "row": {"number": 0, "name": "zero"}},
271 "row": {"number": 1, "name": "one"}},
276 "columns": ["name", "number"],
278 "rows": [{"name": "zero", "number": 0},
279 {"name": "one", "number": 1}]}]]]],
280 [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{}]
283 OVSDB_CHECK_EXECUTION([equality wait with extra row],
287 "row": {"number": 0, "name": "zero"}},
290 "row": {"number": 1, "name": "one"}},
295 "columns": ["name", "number"],
297 "rows": [{"name": "zero", "number": 0},
298 {"name": "one", "number": 1},
299 {"name": "two", "number": 2}]}]]]],
300 [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{"details":"\"wait\" timed out","error":"timed out"}]
303 OVSDB_CHECK_EXECUTION([equality wait with missing row],
307 "row": {"number": 0, "name": "zero"}},
310 "row": {"number": 1, "name": "one"}},
315 "columns": ["name", "number"],
317 "rows": [{"name": "one", "number": 1}]}]]]],
318 [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{"details":"\"wait\" timed out","error":"timed out"}]
321 OVSDB_CHECK_EXECUTION([inequality wait with correct rows],
325 "row": {"number": 0, "name": "zero"}},
328 "row": {"number": 1, "name": "one"}},
333 "columns": ["name", "number"],
335 "rows": [{"name": "zero", "number": 0},
336 {"name": "one", "number": 1}]}]]]],
337 [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{"details":"\"wait\" timed out","error":"timed out"}]
340 OVSDB_CHECK_EXECUTION([inequality wait with extra row],
344 "row": {"number": 0, "name": "zero"}},
347 "row": {"number": 1, "name": "one"}},
352 "columns": ["name", "number"],
354 "rows": [{"name": "zero", "number": 0},
355 {"name": "one", "number": 1},
356 {"name": "two", "number": 2}]}]]]],
357 [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{}]
360 OVSDB_CHECK_EXECUTION([inequality wait with missing row],
364 "row": {"number": 0, "name": "zero"}},
367 "row": {"number": 1, "name": "one"}},
372 "columns": ["name", "number"],
374 "rows": [{"name": "one", "number": 1}]}]]]],
375 [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{}]
378 OVSDB_CHECK_EXECUTION([insert and update constraints],
381 "table": "constrained",
384 "table": "constrained",
385 "row": {"positive": -1}}]]],
387 "table": "constrained",
389 "row": {"positive": -2}}]]]],
390 [[[{"details":"0 is less than minimum allowed value 1","error":"constraint violation"}]
391 [{"details":"-1 is less than minimum allowed value 1","error":"constraint violation"}]
392 [{"details":"-2 is less than minimum allowed value 1","error":"constraint violation"}]
395 OVSDB_CHECK_EXECUTION([referential integrity -- simple],
400 "uuid-name": "brow"},
404 "a2b": ["set", [["named-uuid", "brow"]]]}},
408 "a2b": ["set", [["named-uuid", "brow"]]]}},
412 "a2b": ["set", [["named-uuid", "brow"]]]}}]]],
418 "where": [["a", "==", 0]]}]]],
424 "where": [["a", "==", 1]]}]]],
430 "where": [["a", "==", 2]]}]]],
434 [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{"uuid":["uuid","<2>"]},{"uuid":["uuid","<3>"]}]
435 [{"count":1},{"details":"cannot delete b row <0> because of 3 remaining reference(s)","error":"referential integrity violation"}]
437 [{"count":1},{"details":"cannot delete b row <0> because of 2 remaining reference(s)","error":"referential integrity violation"}]
439 [{"count":1},{"details":"cannot delete b row <0> because of 1 remaining reference(s)","error":"referential integrity violation"}]
444 OVSDB_CHECK_EXECUTION([referential integrity -- mutual references],
446 [[[[{"op": "declare",
447 "uuid-name": "row1"},
449 "uuid-name": "row2"},
453 "a2b": ["set", [["named-uuid", "row2"]]],
454 "a2a": ["set", [["named-uuid", "row1"]]]},
455 "uuid-name": "row1"},
459 "b2b": ["set", [["named-uuid", "row2"]]],
460 "b2a": ["set", [["named-uuid", "row1"]]]},
461 "uuid-name": "row2"}]]],
464 "row": {"a2b": ["set", [["uuid", "b516b960-5b19-4fc2-bb82-fe1cbd6d0241"]]]}}]]],
467 "where": [["a", "==", 0]]}]]],
470 "where": [["b", "==", 1]]}]]],
471 dnl Try the deletions again to make sure that the refcounts got rolled back.
474 "where": [["a", "==", 0]]}]]],
477 "where": [["b", "==", 1]]}]]],
480 "where": [["a", "==", 0]]},
483 "where": [["b", "==", 1]]}]]]],
484 [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]}]
485 [{"uuid":["uuid","<2>"]},{"details":"reference to nonexistent row <3>","error":"referential integrity violation"}]
486 [{"count":1},{"details":"cannot delete a row <0> because of 1 remaining reference(s)","error":"referential integrity violation"}]
487 [{"count":1},{"details":"cannot delete b row <1> because of 1 remaining reference(s)","error":"referential integrity violation"}]
488 [{"count":1},{"details":"cannot delete a row <0> because of 1 remaining reference(s)","error":"referential integrity violation"}]
489 [{"count":1},{"details":"cannot delete b row <1> because of 1 remaining reference(s)","error":"referential integrity violation"}]
490 [{"count":1},{"count":1}]