]> git.proxmox.com Git - mirror_ovs.git/blame - tests/ovsdb-execution.at
ovsdb: Don't count self-references in ovsdb_row's n_refs member.
[mirror_ovs.git] / tests / ovsdb-execution.at
CommitLineData
f85f8ebb
BP
1AT_BANNER([OVSDB -- execution])
2
3m4_define([ORDINAL_SCHEMA],
9cb53f26 4 [[{"name": "ordinals",
f85f8ebb
BP
5 "tables": {
6 "ordinals": {
7 "columns": {
8 "number": {"type": "integer"},
8159b984 9 "name": {"type": "string"}}}},
6aa09313
BP
10 "version": "5.1.3",
11 "cksum": "12345678 9"}]])
f85f8ebb 12
bd76d25d
BP
13m4_define([CONSTRAINT_SCHEMA],
14 [[{"name": "constraints",
15 "tables": {
0d0f05b9
BP
16 "a": {
17 "columns": {
18 "a": {"type": "integer"},
19 "a2a": {"type": {"key": {"type": "uuid", "refTable": "a"},
20 "min": 0, "max": "unlimited"}},
21 "a2b": {"type": {"key": {"type": "uuid", "refTable": "b"},
22 "min": 0, "max": "unlimited"}}}},
23 "b": {
24 "columns": {
25 "b": {"type": "integer"},
26 "b2a": {"type": {"key": {"type": "uuid", "refTable": "a"},
27 "min": 0, "max": "unlimited"}},
28 "b2b": {"type": {"key": {"type": "uuid", "refTable": "b"},
29 "min": 0, "max": "unlimited"}}}},
bd76d25d
BP
30 "constrained": {
31 "columns": {
32 "positive": {"type": {"key": {"type": "integer",
87ab878c
BP
33 "minInteger": 1}}}},
34 "maxRows": 1}}}]])
bd76d25d 35
7360012b
BP
36m4_define([WEAK_SCHEMA],
37 [[{"name": "weak",
38 "tables": {
39 "a": {
40 "columns": {
41 "a": {"type": "integer"},
42 "a2a": {"type": {"key": {"type": "uuid",
43 "refTable": "a",
44 "refType": "weak"},
45 "min": 0, "max": "unlimited"}},
46 "a2a1": {"type": {"key": {"type": "uuid",
47 "refTable": "a",
48 "refType": "weak"}}},
49 "a2b": {"type": {"key": {"type": "uuid",
50 "refTable": "b",
51 "refType": "weak"}}}}},
52 "b": {
53 "columns": {
54 "b": {"type": "integer"},
55 "b2a": {"type": {"key": {"type": "uuid",
56 "refTable": "a",
57 "refType": "weak"},
58 "min": 0, "max": "unlimited"}}}}}}]])
59
21ff1aee
BP
60# OVSDB_CHECK_EXECUTION(TITLE, SCHEMA, TRANSACTIONS, OUTPUT, [KEYWORDS])
61#
62# Runs "test-ovsdb execute" with the given SCHEMA and each of the
63# TRANSACTIONS (which should be a quoted list of quoted strings).
64#
65# Checks that the overall output is OUTPUT, but UUIDs in the output
f85f8ebb
BP
66# are replaced by markers of the form <N> where N is a number. The
67# first unique UUID is replaced by <0>, the next by <1>, and so on.
68# If a given UUID appears more than once it is always replaced by the
69# same marker.
21ff1aee
BP
70#
71# TITLE is provided to AT_SETUP and KEYWORDS to AT_KEYWORDS.
f85f8ebb
BP
72m4_define([OVSDB_CHECK_EXECUTION],
73 [AT_SETUP([$1])
21ff1aee 74 AT_KEYWORDS([ovsdb execute execution positive $5])
7c126fbb 75 AT_CHECK([test-ovsdb execute '$2' m4_foreach([txn], [$3], [ 'txn'])],
21ff1aee
BP
76 [0], [stdout], [])
77 AT_CHECK([perl $srcdir/uuidfilt.pl stdout], [0], [$4])
f85f8ebb
BP
78 AT_CLEANUP])
79
d198c4be
BP
80OVSDB_CHECK_EXECUTION([uuid-name must be <id>],
81 [CONSTRAINT_SCHEMA],
82 [[[["constraints",
83 {"op": "insert",
84 "table": "a",
85 "row": {},
86 "uuid-name": "0"}]]]],
87 [[[{"details":"Parsing ovsdb operation 1 of 1 failed: Type mismatch for member 'uuid-name'.","error":"syntax error","syntax":"{\"op\":\"insert\",\"row\":{},\"table\":\"a\",\"uuid-name\":\"0\"}"}]
88]])
89
90OVSDB_CHECK_EXECUTION([named-uuid must be <id>],
91 [CONSTRAINT_SCHEMA],
92 [[[["constraints",
93 {"op": "insert",
94 "table": "a",
95 "row": {"a2a": ["named-uuid", "0"]}}]]]],
96 [[[{"details":"named-uuid string is not a valid <id>","error":"syntax error","syntax":"[\"named-uuid\",\"0\"]"}]
97]])
98
19b48a81
BP
99OVSDB_CHECK_EXECUTION([duplicate uuid-name not allowed],
100 [ORDINAL_SCHEMA],
101 [[[["ordinals",
102 {"op": "insert",
103 "table": "ordinals",
104 "row": {},
105 "uuid-name": "x"},
106 {"op": "insert",
107 "table": "ordinals",
108 "row": {},
109 "uuid-name": "x"}]]]],
110 [[[{"uuid":["uuid","<0>"]},{"details":"This \"uuid-name\" appeared on an earlier \"insert\" operation.","error":"duplicate uuid-name","syntax":"\"x\""}]
111]])
112
21ff1aee 113m4_define([EXECUTION_EXAMPLES], [
88942565
BP
114dnl At one point the "commit" code ignored new rows with all-default values,
115dnl so this checks for that problem.
116OVSDB_CHECK_EXECUTION([insert default row, query table],
117 [ORDINAL_SCHEMA],
118 [[[["ordinals",
119 {"op": "insert",
120 "table": "ordinals",
121 "row": {}}]]],
122 [[["ordinals",
123 {"op": "select",
124 "table": "ordinals",
125 "where": []}]]]],
126 [[[{"uuid":["uuid","<0>"]}]
127[{"rows":[{"_uuid":["uuid","<0>"],"_version":["uuid","<1>"],"name":"","number":0}]}]
128]])
129
f85f8ebb 130OVSDB_CHECK_EXECUTION([insert row, query table],
21ff1aee 131 [ORDINAL_SCHEMA],
9cb53f26
BP
132 [[[["ordinals",
133 {"op": "insert",
f85f8ebb 134 "table": "ordinals",
21ff1aee 135 "row": {"number": 0, "name": "zero"}}]]],
9cb53f26
BP
136 [[["ordinals",
137 {"op": "select",
f85f8ebb 138 "table": "ordinals",
21ff1aee 139 "where": []}]]]],
f85f8ebb
BP
140 [[[{"uuid":["uuid","<0>"]}]
141[{"rows":[{"_uuid":["uuid","<0>"],"_version":["uuid","<1>"],"name":"zero","number":0}]}]
142]])
143
144OVSDB_CHECK_EXECUTION([insert rows, query by value],
21ff1aee 145 [ORDINAL_SCHEMA],
9cb53f26
BP
146 [[[["ordinals",
147 {"op": "insert",
f85f8ebb 148 "table": "ordinals",
21ff1aee 149 "row": {"number": 0, "name": "zero"}}]]],
9cb53f26
BP
150 [[["ordinals",
151 {"op": "insert",
f85f8ebb 152 "table": "ordinals",
21ff1aee 153 "row": {"number": 1, "name": "one"}}]]],
9cb53f26
BP
154 [[["ordinals",
155 {"op": "select",
f85f8ebb 156 "table": "ordinals",
21ff1aee 157 "where": [["name", "==", "zero"]]}]]],
9cb53f26
BP
158 [[["ordinals",
159 {"op": "select",
f85f8ebb 160 "table": "ordinals",
21ff1aee 161 "where": [["name", "==", "one"]]}]]]],
f85f8ebb
BP
162 [[[{"uuid":["uuid","<0>"]}]
163[{"uuid":["uuid","<1>"]}]
164[{"rows":[{"_uuid":["uuid","<0>"],"_version":["uuid","<2>"],"name":"zero","number":0}]}]
165[{"rows":[{"_uuid":["uuid","<1>"],"_version":["uuid","<3>"],"name":"one","number":1}]}]
166]])
167
168OVSDB_CHECK_EXECUTION([insert rows, query by named-uuid],
21ff1aee 169 [ORDINAL_SCHEMA],
9cb53f26
BP
170 [[[["ordinals",
171 {"op": "insert",
f85f8ebb
BP
172 "table": "ordinals",
173 "row": {"number": 0, "name": "zero"},
174 "uuid-name": "first"},
175 {"op": "insert",
176 "table": "ordinals",
177 "row": {"number": 1, "name": "one"},
178 "uuid-name": "second"},
179 {"op": "select",
180 "table": "ordinals",
181 "where": [["_uuid", "==", ["named-uuid", "first"]]]},
182 {"op": "select",
183 "table": "ordinals",
21ff1aee 184 "where": [["_uuid", "==", ["named-uuid", "second"]]]}]]]],
f85f8ebb
BP
185 [[[{"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}]}]
186]])
187
188OVSDB_CHECK_EXECUTION([insert rows, update rows by value],
21ff1aee 189 [ORDINAL_SCHEMA],
9cb53f26
BP
190 [[[["ordinals",
191 {"op": "insert",
f85f8ebb
BP
192 "table": "ordinals",
193 "row": {"number": 0, "name": "zero"},
21ff1aee 194 "uuid-name": "first"}]]],
9cb53f26
BP
195 [[["ordinals",
196 {"op": "insert",
f85f8ebb
BP
197 "table": "ordinals",
198 "row": {"number": 1, "name": "one"},
21ff1aee 199 "uuid-name": "first"}]]],
9cb53f26
BP
200 [[["ordinals",
201 {"op": "update",
f85f8ebb
BP
202 "table": "ordinals",
203 "where": [["name", "==", "zero"]],
21ff1aee 204 "row": {"name": "nought"}}]]],
9cb53f26
BP
205 [[["ordinals",
206 {"op": "select",
f85f8ebb
BP
207 "table": "ordinals",
208 "where": [],
21ff1aee 209 "sort": ["number"]}]]]],
f85f8ebb
BP
210 [[[{"uuid":["uuid","<0>"]}]
211[{"uuid":["uuid","<1>"]}]
212[{"count":1}]
213[{"rows":[{"_uuid":["uuid","<0>"],"_version":["uuid","<2>"],"name":"nought","number":0},{"_uuid":["uuid","<1>"],"_version":["uuid","<3>"],"name":"one","number":1}]}]
214]])
215
e9f8f936
BP
216OVSDB_CHECK_EXECUTION([insert rows, mutate rows],
217 [ORDINAL_SCHEMA],
9cb53f26
BP
218 [[[["ordinals",
219 {"op": "insert",
e9f8f936
BP
220 "table": "ordinals",
221 "row": {"number": 0, "name": "zero"},
222 "uuid-name": "first"}]]],
9cb53f26
BP
223 [[["ordinals",
224 {"op": "insert",
e9f8f936
BP
225 "table": "ordinals",
226 "row": {"number": 1, "name": "one"},
227 "uuid-name": "first"}]]],
9cb53f26
BP
228 [[["ordinals",
229 {"op": "mutate",
e9f8f936
BP
230 "table": "ordinals",
231 "where": [["name", "==", "zero"]],
232 "mutations": [["number", "+=", 2]]}]]],
9cb53f26
BP
233 [[["ordinals",
234 {"op": "select",
e9f8f936
BP
235 "table": "ordinals",
236 "where": [],
237 "sort": ["number"]}]]]],
238 [[[{"uuid":["uuid","<0>"]}]
239[{"uuid":["uuid","<1>"]}]
240[{"count":1}]
241[{"rows":[{"_uuid":["uuid","<1>"],"_version":["uuid","<2>"],"name":"one","number":1},{"_uuid":["uuid","<0>"],"_version":["uuid","<3>"],"name":"zero","number":2}]}]
242]])
243
f85f8ebb 244OVSDB_CHECK_EXECUTION([insert rows, delete by named-uuid],
21ff1aee 245 [ORDINAL_SCHEMA],
9cb53f26
BP
246 [[[["ordinals",
247 {"op": "insert",
f85f8ebb
BP
248 "table": "ordinals",
249 "row": {"number": 0, "name": "zero"},
250 "uuid-name": "first"},
251 {"op": "insert",
252 "table": "ordinals",
253 "row": {"number": 1, "name": "one"},
254 "uuid-name": "second"},
255 {"op": "delete",
256 "table": "ordinals",
257 "where": [["_uuid", "==", ["named-uuid", "first"]]]},
258 {"op": "select",
259 "table": "ordinals",
260 "where": [],
21ff1aee 261 "columns": ["name","number"]}]]]],
f85f8ebb
BP
262 [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{"count":1},{"rows":[{"name":"one","number":1}]}]
263]])
264
265OVSDB_CHECK_EXECUTION([insert rows, delete rows by value],
21ff1aee 266 [ORDINAL_SCHEMA],
9cb53f26
BP
267 [[[["ordinals",
268 {"op": "insert",
f85f8ebb
BP
269 "table": "ordinals",
270 "row": {"number": 0, "name": "zero"},
21ff1aee 271 "uuid-name": "first"}]]],
9cb53f26
BP
272 [[["ordinals",
273 {"op": "insert",
f85f8ebb
BP
274 "table": "ordinals",
275 "row": {"number": 1, "name": "one"},
21ff1aee 276 "uuid-name": "first"}]]],
9cb53f26
BP
277 [[["ordinals",
278 {"op": "delete",
f85f8ebb 279 "table": "ordinals",
21ff1aee 280 "where": [["name", "==", "zero"]]}]]],
9cb53f26
BP
281 [[["ordinals",
282 {"op": "select",
f85f8ebb 283 "table": "ordinals",
21ff1aee 284 "where": []}]]]],
f85f8ebb
BP
285 [[[{"uuid":["uuid","<0>"]}]
286[{"uuid":["uuid","<1>"]}]
287[{"count":1}]
288[{"rows":[{"_uuid":["uuid","<1>"],"_version":["uuid","<2>"],"name":"one","number":1}]}]
289]])
290
291OVSDB_CHECK_EXECUTION([insert rows, delete by (non-matching) value],
21ff1aee 292 [ORDINAL_SCHEMA],
9cb53f26
BP
293 [[[["ordinals",
294 {"op": "insert",
f85f8ebb
BP
295 "table": "ordinals",
296 "row": {"number": 0, "name": "zero"},
21ff1aee 297 "uuid-name": "first"}]]],
9cb53f26
BP
298 [[["ordinals",
299 {"op": "insert",
f85f8ebb
BP
300 "table": "ordinals",
301 "row": {"number": 1, "name": "one"},
21ff1aee 302 "uuid-name": "first"}]]],
9cb53f26
BP
303 [[["ordinals",
304 {"op": "delete",
f85f8ebb 305 "table": "ordinals",
21ff1aee 306 "where": [["name", "==", "nought"]]}]]],
9cb53f26
BP
307 [[["ordinals",
308 {"op": "select",
f85f8ebb
BP
309 "table": "ordinals",
310 "where": [],
21ff1aee 311 "sort": ["number"]}]]]],
f85f8ebb
BP
312 [[[{"uuid":["uuid","<0>"]}]
313[{"uuid":["uuid","<1>"]}]
314[{"count":0}]
315[{"rows":[{"_uuid":["uuid","<0>"],"_version":["uuid","<2>"],"name":"zero","number":0},{"_uuid":["uuid","<1>"],"_version":["uuid","<3>"],"name":"one","number":1}]}]
316]])
317
318OVSDB_CHECK_EXECUTION([insert rows, delete all],
21ff1aee 319 [ORDINAL_SCHEMA],
9cb53f26
BP
320 [[[["ordinals",
321 {"op": "insert",
f85f8ebb
BP
322 "table": "ordinals",
323 "row": {"number": 0, "name": "zero"},
324 "uuid-name": "first"},
325 {"op": "insert",
326 "table": "ordinals",
327 "row": {"number": 1, "name": "one"},
328 "uuid-name": "second"},
329 {"op": "delete",
330 "table": "ordinals",
331 "where": []},
332 {"op": "select",
333 "table": "ordinals",
334 "where": [],
21ff1aee 335 "columns": ["name","number"]}]]]],
f85f8ebb
BP
336 [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{"count":2},{"rows":[]}]
337]])
338
339OVSDB_CHECK_EXECUTION([insert row, query table, commit],
21ff1aee 340 [ORDINAL_SCHEMA],
9cb53f26
BP
341 [[[["ordinals",
342 {"op": "insert",
f85f8ebb
BP
343 "table": "ordinals",
344 "row": {"number": 0, "name": "zero"}},
345 {"op": "select",
346 "table": "ordinals",
347 "where": []},
348 {"op": "commit",
21ff1aee 349 "durable": false}]]]],
f85f8ebb
BP
350 [[[{"uuid":["uuid","<0>"]},{"rows":[{"_uuid":["uuid","<0>"],"_version":["uuid","<1>"],"name":"zero","number":0}]},{}]
351]])
352
353OVSDB_CHECK_EXECUTION([insert row, query table, commit durably],
21ff1aee 354 [ORDINAL_SCHEMA],
9cb53f26
BP
355 [[[["ordinals",
356 {"op": "insert",
f85f8ebb
BP
357 "table": "ordinals",
358 "row": {"number": 0, "name": "zero"}},
359 {"op": "select",
360 "table": "ordinals",
361 "where": []},
362 {"op": "commit",
21ff1aee 363 "durable": true}]]]],
f85f8ebb
BP
364 [[[{"uuid":["uuid","<0>"]},{"rows":[{"_uuid":["uuid","<0>"],"_version":["uuid","<1>"],"name":"zero","number":0}]},{}]
365]])
366
367OVSDB_CHECK_EXECUTION([equality wait with correct rows],
21ff1aee 368 [ORDINAL_SCHEMA],
9cb53f26
BP
369 [[[["ordinals",
370 {"op": "insert",
f85f8ebb
BP
371 "table": "ordinals",
372 "row": {"number": 0, "name": "zero"}},
373 {"op": "insert",
374 "table": "ordinals",
375 "row": {"number": 1, "name": "one"}},
376 {"op": "wait",
377 "timeout": 0,
378 "table": "ordinals",
379 "where": [],
380 "columns": ["name", "number"],
381 "until": "==",
382 "rows": [{"name": "zero", "number": 0},
21ff1aee 383 {"name": "one", "number": 1}]}]]]],
f85f8ebb
BP
384 [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{}]
385]])
386
387OVSDB_CHECK_EXECUTION([equality wait with extra row],
21ff1aee 388 [ORDINAL_SCHEMA],
9cb53f26
BP
389 [[[["ordinals",
390 {"op": "insert",
f85f8ebb
BP
391 "table": "ordinals",
392 "row": {"number": 0, "name": "zero"}},
393 {"op": "insert",
394 "table": "ordinals",
395 "row": {"number": 1, "name": "one"}},
396 {"op": "wait",
397 "timeout": 0,
398 "table": "ordinals",
399 "where": [],
400 "columns": ["name", "number"],
401 "until": "==",
402 "rows": [{"name": "zero", "number": 0},
403 {"name": "one", "number": 1},
21ff1aee 404 {"name": "two", "number": 2}]}]]]],
f85f8ebb
BP
405 [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{"details":"\"wait\" timed out","error":"timed out"}]
406]])
407
408OVSDB_CHECK_EXECUTION([equality wait with missing row],
21ff1aee 409 [ORDINAL_SCHEMA],
9cb53f26
BP
410 [[[["ordinals",
411 {"op": "insert",
f85f8ebb
BP
412 "table": "ordinals",
413 "row": {"number": 0, "name": "zero"}},
414 {"op": "insert",
415 "table": "ordinals",
416 "row": {"number": 1, "name": "one"}},
417 {"op": "wait",
418 "timeout": 0,
419 "table": "ordinals",
420 "where": [],
421 "columns": ["name", "number"],
422 "until": "==",
21ff1aee 423 "rows": [{"name": "one", "number": 1}]}]]]],
f85f8ebb
BP
424 [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{"details":"\"wait\" timed out","error":"timed out"}]
425]])
426
427OVSDB_CHECK_EXECUTION([inequality wait with correct rows],
21ff1aee 428 [ORDINAL_SCHEMA],
9cb53f26
BP
429 [[[["ordinals",
430 {"op": "insert",
f85f8ebb
BP
431 "table": "ordinals",
432 "row": {"number": 0, "name": "zero"}},
433 {"op": "insert",
434 "table": "ordinals",
435 "row": {"number": 1, "name": "one"}},
436 {"op": "wait",
437 "timeout": 0,
438 "table": "ordinals",
439 "where": [],
440 "columns": ["name", "number"],
441 "until": "!=",
442 "rows": [{"name": "zero", "number": 0},
21ff1aee 443 {"name": "one", "number": 1}]}]]]],
f85f8ebb
BP
444 [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{"details":"\"wait\" timed out","error":"timed out"}]
445]])
446
447OVSDB_CHECK_EXECUTION([inequality wait with extra row],
21ff1aee 448 [ORDINAL_SCHEMA],
9cb53f26
BP
449 [[[["ordinals",
450 {"op": "insert",
f85f8ebb
BP
451 "table": "ordinals",
452 "row": {"number": 0, "name": "zero"}},
453 {"op": "insert",
454 "table": "ordinals",
455 "row": {"number": 1, "name": "one"}},
456 {"op": "wait",
457 "timeout": 0,
458 "table": "ordinals",
459 "where": [],
460 "columns": ["name", "number"],
461 "until": "!=",
462 "rows": [{"name": "zero", "number": 0},
463 {"name": "one", "number": 1},
21ff1aee 464 {"name": "two", "number": 2}]}]]]],
f85f8ebb
BP
465 [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{}]
466]])
467
468OVSDB_CHECK_EXECUTION([inequality wait with missing row],
21ff1aee 469 [ORDINAL_SCHEMA],
9cb53f26
BP
470 [[[["ordinals",
471 {"op": "insert",
f85f8ebb
BP
472 "table": "ordinals",
473 "row": {"number": 0, "name": "zero"}},
474 {"op": "insert",
475 "table": "ordinals",
476 "row": {"number": 1, "name": "one"}},
477 {"op": "wait",
478 "timeout": 0,
479 "table": "ordinals",
480 "where": [],
481 "columns": ["name", "number"],
482 "until": "!=",
21ff1aee 483 "rows": [{"name": "one", "number": 1}]}]]]],
f85f8ebb
BP
484 [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{}]
485]])
bd76d25d
BP
486
487OVSDB_CHECK_EXECUTION([insert and update constraints],
488 [CONSTRAINT_SCHEMA],
9cb53f26
BP
489 [[[["constraints",
490 {"op": "insert",
bd76d25d
BP
491 "table": "constrained",
492 "row": {}}]]],
9cb53f26
BP
493 [[["constraints",
494 {"op": "insert",
bd76d25d
BP
495 "table": "constrained",
496 "row": {"positive": -1}}]]],
9cb53f26
BP
497 [[["constraints",
498 {"op": "update",
bd76d25d
BP
499 "table": "constrained",
500 "where": [],
87ab878c
BP
501 "row": {"positive": -2}}]]],
502 [[["constraints",
503 {"op": "insert",
504 "table": "constrained",
505 "row": {"positive": 1}}]]],
506 [[["constraints",
507 {"op": "insert",
508 "table": "constrained",
509 "row": {"positive": 2}}]]]],
bd76d25d
BP
510 [[[{"details":"0 is less than minimum allowed value 1","error":"constraint violation"}]
511[{"details":"-1 is less than minimum allowed value 1","error":"constraint violation"}]
512[{"details":"-2 is less than minimum allowed value 1","error":"constraint violation"}]
87ab878c
BP
513[{"uuid":["uuid","<0>"]}]
514[{"uuid":["uuid","<1>"]},{"details":"transaction causes \"constrained\" table to contain 2 rows, greater than the schema-defined limit of 1 row(s)","error":"constraint violation"}]
0d0f05b9
BP
515]])
516
517OVSDB_CHECK_EXECUTION([referential integrity -- simple],
518 [CONSTRAINT_SCHEMA],
9cb53f26
BP
519 [[[["constraints",
520 {"op": "insert",
0d0f05b9
BP
521 "table": "b",
522 "row": {"b": 1},
523 "uuid-name": "brow"},
524 {"op": "insert",
525 "table": "a",
526 "row": {"a": 0,
527 "a2b": ["set", [["named-uuid", "brow"]]]}},
528 {"op": "insert",
529 "table": "a",
530 "row": {"a": 1,
531 "a2b": ["set", [["named-uuid", "brow"]]]}},
532 {"op": "insert",
533 "table": "a",
534 "row": {"a": 2,
535 "a2b": ["set", [["named-uuid", "brow"]]]}}]]],
9cb53f26
BP
536 [[["constraints",
537 {"op": "delete",
0d0f05b9
BP
538 "table": "b",
539 "where": []}]]],
9cb53f26
BP
540 [[["constraints",
541 {"op": "delete",
0d0f05b9
BP
542 "table": "a",
543 "where": [["a", "==", 0]]}]]],
9cb53f26
BP
544 [[["constraints",
545 {"op": "delete",
0d0f05b9
BP
546 "table": "b",
547 "where": []}]]],
9cb53f26
BP
548 [[["constraints",
549 {"op": "delete",
0d0f05b9
BP
550 "table": "a",
551 "where": [["a", "==", 1]]}]]],
9cb53f26
BP
552 [[["constraints",
553 {"op": "delete",
0d0f05b9
BP
554 "table": "b",
555 "where": []}]]],
9cb53f26
BP
556 [[["constraints",
557 {"op": "delete",
0d0f05b9
BP
558 "table": "a",
559 "where": [["a", "==", 2]]}]]],
9cb53f26
BP
560 [[["constraints",
561 {"op": "delete",
0d0f05b9
BP
562 "table": "b",
563 "where": []}]]]],
564 [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{"uuid":["uuid","<2>"]},{"uuid":["uuid","<3>"]}]
565[{"count":1},{"details":"cannot delete b row <0> because of 3 remaining reference(s)","error":"referential integrity violation"}]
566[{"count":1}]
567[{"count":1},{"details":"cannot delete b row <0> because of 2 remaining reference(s)","error":"referential integrity violation"}]
568[{"count":1}]
569[{"count":1},{"details":"cannot delete b row <0> because of 1 remaining reference(s)","error":"referential integrity violation"}]
570[{"count":1}]
571[{"count":1}]
572]])
573
574OVSDB_CHECK_EXECUTION([referential integrity -- mutual references],
575 [CONSTRAINT_SCHEMA],
9cb53f26
BP
576 [[[["constraints",
577 {"op": "insert",
0d0f05b9
BP
578 "table": "a",
579 "row": {"a": 0,
580 "a2b": ["set", [["named-uuid", "row2"]]],
581 "a2a": ["set", [["named-uuid", "row1"]]]},
582 "uuid-name": "row1"},
583 {"op": "insert",
584 "table": "b",
585 "row": {"b": 1,
586 "b2b": ["set", [["named-uuid", "row2"]]],
587 "b2a": ["set", [["named-uuid", "row1"]]]},
588 "uuid-name": "row2"}]]],
9cb53f26
BP
589 [[["constraints",
590 {"op": "insert",
0d0f05b9
BP
591 "table": "a",
592 "row": {"a2b": ["set", [["uuid", "b516b960-5b19-4fc2-bb82-fe1cbd6d0241"]]]}}]]],
9cb53f26
BP
593 [[["constraints",
594 {"op": "delete",
0d0f05b9
BP
595 "table": "a",
596 "where": [["a", "==", 0]]}]]],
9cb53f26
BP
597 [[["constraints",
598 {"op": "delete",
0d0f05b9
BP
599 "table": "b",
600 "where": [["b", "==", 1]]}]]],
601 dnl Try the deletions again to make sure that the refcounts got rolled back.
9cb53f26
BP
602 [[["constraints",
603 {"op": "delete",
0d0f05b9
BP
604 "table": "a",
605 "where": [["a", "==", 0]]}]]],
9cb53f26
BP
606 [[["constraints",
607 {"op": "delete",
0d0f05b9
BP
608 "table": "b",
609 "where": [["b", "==", 1]]}]]],
9cb53f26
BP
610 [[["constraints",
611 {"op": "delete",
0d0f05b9
BP
612 "table": "a",
613 "where": [["a", "==", 0]]},
614 {"op": "delete",
615 "table": "b",
616 "where": [["b", "==", 1]]}]]]],
fbf925e4 617 [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]}]
97f7803b 618[{"uuid":["uuid","<2>"]},{"details":"Table a column a2b row <2> references nonexistent row <3> in table b.","error":"referential integrity violation"}]
0d0f05b9
BP
619[{"count":1},{"details":"cannot delete a row <0> because of 1 remaining reference(s)","error":"referential integrity violation"}]
620[{"count":1},{"details":"cannot delete b row <1> because of 1 remaining reference(s)","error":"referential integrity violation"}]
621[{"count":1},{"details":"cannot delete a row <0> because of 1 remaining reference(s)","error":"referential integrity violation"}]
622[{"count":1},{"details":"cannot delete b row <1> because of 1 remaining reference(s)","error":"referential integrity violation"}]
623[{"count":1},{"count":1}]
7360012b
BP
624]])
625
626OVSDB_CHECK_EXECUTION([weak references],
627 [WEAK_SCHEMA],
628 [[[["weak",
629 {"op": "insert",
630 "table": "a",
631 "row": {"a": 0,
632 "a2a": ["set", [["named-uuid", "row1"],
633 ["named-uuid", "row2"],
634 ["uuid", "0e767b36-6822-4044-8307-d58467e04669"]]],
635 "a2a1": ["named-uuid", "row1"],
636 "a2b": ["named-uuid", "row3"]},
637 "uuid-name": "row1"},
638 {"op": "insert",
639 "table": "a",
640 "row": {"a": 1,
641 "a2a": ["set", [["named-uuid", "row1"],
642 ["named-uuid", "row2"]]],
643 "a2a1": ["named-uuid", "row2"],
644 "a2b": ["named-uuid", "row3"]},
645 "uuid-name": "row2"},
646 {"op": "insert",
647 "table": "a",
648 "row": {"a": 2,
649 "a2a": ["set", [["named-uuid", "row1"],
650 ["named-uuid", "row2"]]],
651 "a2a1": ["named-uuid", "row2"],
652 "a2b": ["named-uuid", "row4"]}},
653 {"op": "insert",
654 "table": "b",
655 "row": {"b": 2,
656 "b2a": ["named-uuid", "row1"]},
657 "uuid-name": "row3"},
658 {"op": "insert",
659 "table": "b",
660 "row": {"b": 3,
661 "b2a": ["named-uuid", "row2"]},
662 "uuid-name": "row4"}]]],
663 dnl Check that the nonexistent row UUID we added to row a0 was deleted,
664 dnl and that other rows were inserted as requested.
665 [[["weak",
666 {"op": "select",
667 "table": "a",
668 "where": [],
669 "columns": ["_uuid", "a2a", "a2a1", "a2b"],
670 "sort": ["a"]}]]],
671 [[["weak",
672 {"op": "select",
673 "table": "b",
674 "where": [],
675 "columns": ["_uuid", "b", "b2a"],
676 "sort": ["b"]}]]],
677 dnl Try to insert invalid all-zeros weak reference (the default) into
678 dnl "a2b", which requires exactly one value.
679 [[["weak",
680 {"op": "insert",
681 "table": "a",
1f4f3cd7
BP
682 "row": {"a2a1": ["named-uuid", "me"]},
683 "uuid-name": "me"}]]],
7360012b
BP
684 dnl Try to delete row from "b" that is referred to by weak references
685 dnl from "a" table "a2b" column that requires exactly one value.
686 [[["weak",
687 {"op": "delete",
688 "table": "b",
689 "where": [["b", "==", 3]]}]]],
690 dnl Try to delete row from "a" that is referred to by weak references
691 dnl from "a" table "a2a1" column that requires exactly one value.
692 [[["weak",
693 {"op": "delete",
694 "table": "a",
695 "where": [["a", "==", 1]]}]]],
696 dnl Delete the row that had the reference that caused the previous
697 dnl deletion to fail, then check that other rows are unchanged.
698 [[["weak",
699 {"op": "delete",
700 "table": "a",
701 "where": [["a", "==", 2]]}]]],
702 [[["weak",
703 {"op": "select",
704 "table": "a",
705 "where": [],
706 "columns": ["_uuid", "a2a", "a2a1", "a2b"],
707 "sort": ["a"]}]]],
708 [[["weak",
709 {"op": "select",
710 "table": "b",
711 "where": [],
712 "columns": ["_uuid", "b", "b2a"],
713 "sort": ["b"]}]]],
714 dnl Delete row a0 then check that references to it were removed.
715 [[["weak",
716 {"op": "delete",
717 "table": "a",
718 "where": [["a", "==", 0]]}]]],
719 [[["weak",
720 {"op": "select",
721 "table": "a",
722 "where": [],
723 "columns": ["_uuid", "a2a", "a2a1", "a2b"],
724 "sort": ["a"]}]]],
725 [[["weak",
726 {"op": "select",
727 "table": "b",
728 "where": [],
729 "columns": ["_uuid", "b", "b2a"],
730 "sort": ["b"]}]]],
731 dnl Delete row a1 then check that references to it were removed.
732 [[["weak",
733 {"op": "delete",
734 "table": "a",
735 "where": [["a", "==", 1]]}]]],
736 [[["weak",
737 {"op": "select",
738 "table": "a",
739 "where": [],
740 "columns": ["_uuid", "a2a", "a2a1", "a2b"],
741 "sort": ["a"]}]]],
742 [[["weak",
743 {"op": "select",
744 "table": "b",
745 "where": [],
746 "columns": ["_uuid", "b", "b2a"],
747 "sort": ["b"]}]]]],
748 [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{"uuid":["uuid","<2>"]},{"uuid":["uuid","<3>"]},{"uuid":["uuid","<4>"]}]
749[{"rows":[{"_uuid":["uuid","<0>"],"a2a":["set",[["uuid","<0>"],["uuid","<1>"]]],"a2a1":["uuid","<0>"],"a2b":["uuid","<3>"]},{"_uuid":["uuid","<1>"],"a2a":["set",[["uuid","<0>"],["uuid","<1>"]]],"a2a1":["uuid","<1>"],"a2b":["uuid","<3>"]},{"_uuid":["uuid","<2>"],"a2a":["set",[["uuid","<0>"],["uuid","<1>"]]],"a2a1":["uuid","<1>"],"a2b":["uuid","<4>"]}]}]
750[{"rows":[{"_uuid":["uuid","<3>"],"b":2,"b2a":["uuid","<0>"]},{"_uuid":["uuid","<4>"],"b":3,"b2a":["uuid","<1>"]}]}]
751[{"uuid":["uuid","<5>"]},{"details":"Weak reference column \"a2b\" in \"a\" row <5> (inserted within this transaction) contained all-zeros UUID (probably as the default value for this column) but deleting this value caused a constraint volation because this column is not allowed to be empty.","error":"constraint violation"}]
752[{"count":1},{"details":"Deletion of 1 weak reference(s) to deleted (or never-existing) rows from column \"a2b\" in \"a\" row <2> caused this column to become empty, but constraints on this column disallow an empty column.","error":"constraint violation"}]
753[{"count":1},{"details":"Deletion of 1 weak reference(s) to deleted (or never-existing) rows from column \"a2a1\" in \"a\" row <2> caused this column to become empty, but constraints on this column disallow an empty column.","error":"constraint violation"}]
754[{"count":1}]
755[{"rows":[{"_uuid":["uuid","<0>"],"a2a":["set",[["uuid","<0>"],["uuid","<1>"]]],"a2a1":["uuid","<0>"],"a2b":["uuid","<3>"]},{"_uuid":["uuid","<1>"],"a2a":["set",[["uuid","<0>"],["uuid","<1>"]]],"a2a1":["uuid","<1>"],"a2b":["uuid","<3>"]}]}]
756[{"rows":[{"_uuid":["uuid","<3>"],"b":2,"b2a":["uuid","<0>"]},{"_uuid":["uuid","<4>"],"b":3,"b2a":["uuid","<1>"]}]}]
757[{"count":1}]
758[{"rows":[{"_uuid":["uuid","<1>"],"a2a":["uuid","<1>"],"a2a1":["uuid","<1>"],"a2b":["uuid","<3>"]}]}]
759[{"rows":[{"_uuid":["uuid","<3>"],"b":2,"b2a":["set",[]]},{"_uuid":["uuid","<4>"],"b":3,"b2a":["uuid","<1>"]}]}]
760[{"count":1}]
761[{"rows":[]}]
762[{"rows":[{"_uuid":["uuid","<3>"],"b":2,"b2a":["set",[]]},{"_uuid":["uuid","<4>"],"b":3,"b2a":["set",[]]}]}]
bd76d25d 763]])])
21ff1aee
BP
764
765EXECUTION_EXAMPLES