]> git.proxmox.com Git - mirror_ovs.git/blob - tests/ovsdb-idl.at
db-ctl-base: Add {in} and {not-in} set relational operators.
[mirror_ovs.git] / tests / ovsdb-idl.at
1 AT_BANNER([OVSDB -- interface description language (IDL)])
2
3 m4_divert_text([PREPARE_TESTS], [
4 # ovsdb_start_idltest [REMOTE] [SCHEMA]
5 #
6 # Creates a database using SCHEMA (default: idltest.ovsschema) and
7 # starts a database server listening on punix:socket and REMOTE (if
8 # specified).
9 ovsdb_start_idltest () {
10 ovsdb-tool create db ${2:-$abs_srcdir/idltest.ovsschema} || return $?
11 ovsdb-server -vconsole:warn --log-file --detach --no-chdir --pidfile --remote=punix:socket ${1:+--remote=$1} db || return $?
12 on_exit 'kill `cat ovsdb-server.pid`'
13 }
14
15 # ovsdb_cluster_leader [REMOTES] [DATABASE]
16 #
17 # Returns the leader of the DATABASE cluster.
18 ovsdb_cluster_leader () {
19 remotes=$(echo $1 | tr "," "\n")
20 for remote in $remotes; do
21 ovsdb-client dump $remote _Server Database name leader | grep $2 | grep -q true
22 if [[ $? == 0 ]]; then
23 port=$(echo $remote | cut -d':' -f 3)
24 log=$(grep --include=s\*.log -rlnw -e "listening on port $port" ./)
25 pid=$(echo $log | sed 's/\(.*\.\)log/\1pid/' )
26 echo "${remote}|${pid}"
27 return
28 fi
29 done
30 }])
31
32 # OVSDB_CLUSTER_START_IDLTEST([N], [REMOTE])
33 #
34 # Creates a clustered database using idltest.ovsschema and starts a database
35 # cluster of N servers listening on punix:socket and REMOTE (if specified).
36 m4_define([OVSDB_CLUSTER_START_IDLTEST],
37 [n=$1
38 AT_CHECK([ovsdb-tool create-cluster s1.db \
39 $abs_srcdir/idltest.ovsschema unix:s1.raft])
40 cid=$(ovsdb-tool db-cid s1.db)
41 schema_name=$(ovsdb-tool schema-name $abs_srcdir/idltest.ovsschema)
42 for i in $(seq 2 $n); do
43 AT_CHECK([ovsdb-tool join-cluster s$i.db \
44 $schema_name unix:s$i.raft unix:s1.raft])
45 done
46 on_exit 'kill $(cat s*.pid)'
47 for i in $(seq $n); do
48 AT_CHECK([ovsdb-server -vraft -vconsole:warn --detach --no-chdir \
49 --log-file=s$i.log --pidfile=s$i.pid --unixctl=s$i \
50 --remote=punix:s$i.ovsdb \
51 m4_if([$2], [], [], [--remote=$2]) s$i.db])
52 done
53
54 for i in $(seq $n); do
55 OVS_WAIT_UNTIL([ovs-appctl -t $(pwd)/s$i cluster/status ${schema_name} \
56 | grep -q 'Status: cluster member'])
57 done
58 ])
59
60
61 # OVSDB_CHECK_IDL_C(TITLE, [PRE-IDL-TXN], TRANSACTIONS, OUTPUT, [KEYWORDS],
62 # [FILTER])
63 #
64 # Creates a database with a schema derived from idltest.ovsidl, runs
65 # each PRE-IDL-TXN (if any), starts an ovsdb-server on that database,
66 # and runs "test-ovsdb idl" passing each of the TRANSACTIONS along.
67 #
68 # Checks that the overall output is OUTPUT. Before comparison, the
69 # output is sorted (using "sort") and UUIDs in the output are replaced
70 # by markers of the form <N> where N is a number. The first unique
71 # UUID is replaced by <0>, the next by <1>, and so on. If a given
72 # UUID appears more than once it is always replaced by the same
73 # marker. If FILTER is supplied then the output is also filtered
74 # through the specified program.
75 #
76 # TITLE is provided to AT_SETUP and KEYWORDS to AT_KEYWORDS.
77 m4_define([OVSDB_CHECK_IDL_C],
78 [AT_SETUP([$1 - C])
79 AT_KEYWORDS([ovsdb server idl positive $5])
80 AT_CHECK([ovsdb_start_idltest])
81 m4_if([$2], [], [],
82 [AT_CHECK([ovsdb-client transact unix:socket $2], [0], [ignore], [ignore])])
83 AT_CHECK([test-ovsdb '-vPATTERN:console:test-ovsdb|%c|%m' -vjsonrpc -t10 idl unix:socket $3],
84 [0], [stdout], [ignore])
85 AT_CHECK([sort stdout | uuidfilt]m4_if([$6],,, [[| $6]]),
86 [0], [$4])
87 OVSDB_SERVER_SHUTDOWN
88 AT_CLEANUP])
89
90 # same as OVSDB_CHECK_IDL but uses tcp.
91 m4_define([OVSDB_CHECK_IDL_TCP_C],
92 [AT_SETUP([$1 - C - tcp])
93 AT_KEYWORDS([ovsdb server idl positive tcp socket $5])
94 AT_CHECK([ovsdb_start_idltest "ptcp:0:127.0.0.1"])
95 PARSE_LISTENING_PORT([ovsdb-server.log], [TCP_PORT])
96
97 m4_if([$2], [], [],
98 [AT_CHECK([ovsdb-client transact tcp:127.0.0.1:$TCP_PORT $2], [0], [ignore], [ignore])])
99 AT_CHECK([test-ovsdb '-vPATTERN:console:test-ovsdb|%c|%m' -vjsonrpc -t10 idl tcp:127.0.0.1:$TCP_PORT $3],
100 [0], [stdout], [ignore])
101 AT_CHECK([sort stdout | uuidfilt]m4_if([$6],,, [[| $6]]),
102 [0], [$4])
103 OVSDB_SERVER_SHUTDOWN
104 AT_CLEANUP])
105
106 # same as OVSDB_CHECK_IDL but uses tcp6.
107 m4_define([OVSDB_CHECK_IDL_TCP6_C],
108 [AT_SETUP([$1 - C - tcp6])
109 AT_SKIP_IF([test "$IS_WIN32" = "yes"])
110 AT_SKIP_IF([test $HAVE_IPV6 = no])
111 AT_KEYWORDS([ovsdb server idl positive tcp6 socket $5])
112 AT_CHECK([ovsdb_start_idltest "ptcp:0:[[::1]]"])
113 PARSE_LISTENING_PORT([ovsdb-server.log], [TCP_PORT])
114
115 m4_if([$2], [], [],
116 [AT_CHECK([ovsdb-client transact tcp:[[::1]]:$TCP_PORT $2], [0], [ignore], [ignore])])
117 AT_CHECK([test-ovsdb '-vPATTERN:console:test-ovsdb|%c|%m' -vjsonrpc -t10 idl tcp:[[::1]]:$TCP_PORT $3],
118 [0], [stdout], [ignore])
119 AT_CHECK([sort stdout | uuidfilt]m4_if([$6],,, [[| $6]]),
120 [0], [$4])
121 OVSDB_SERVER_SHUTDOWN
122 AT_CLEANUP])
123
124 # same as OVSDB_CHECK_IDL but uses the Python IDL implementation.
125 m4_define([OVSDB_CHECK_IDL_PY],
126 [AT_SETUP([$1 - Python3])
127 AT_KEYWORDS([ovsdb server idl positive Python $5])
128 AT_CHECK([ovsdb_start_idltest])
129 m4_if([$2], [], [],
130 [AT_CHECK([ovsdb-client transact unix:socket $2], [0], [ignore], [ignore])])
131 AT_CHECK([$PYTHON3 $srcdir/test-ovsdb.py -t10 idl $srcdir/idltest.ovsschema unix:socket $3],
132 [0], [stdout], [ignore])
133 AT_CHECK([sort stdout | uuidfilt]m4_if([$6],,, [[| $6]]),
134 [0], [$4])
135 OVSDB_SERVER_SHUTDOWN
136 AT_CLEANUP])
137
138 m4_define([OVSDB_CHECK_IDL_REGISTER_COLUMNS_PY],
139 [AT_SETUP([$1 - Python3 - register_columns])
140 AT_KEYWORDS([ovsdb server idl positive Python register_columns $5])
141 AT_CHECK([ovsdb_start_idltest])
142 m4_if([$2], [], [],
143 [AT_CHECK([ovsdb-client transact unix:socket $2], [0], [ignore], [ignore])])
144 AT_CHECK([$PYTHON3 $srcdir/test-ovsdb.py -t10 idl $srcdir/idltest.ovsschema unix:socket ?simple:b,ba,i,ia,r,ra,s,sa,u,ua?link1:i,k,ka,l2?link2:i,l1?singleton:name $3],
145 [0], [stdout], [ignore])
146 AT_CHECK([sort stdout | uuidfilt]m4_if([$6],,, [[| $6]]),
147 [0], [$4])
148 OVSDB_SERVER_SHUTDOWN
149 AT_CLEANUP])
150
151 # same as OVSDB_CHECK_IDL but uses the Python IDL implementation with tcp
152 m4_define([OVSDB_CHECK_IDL_TCP_PY],
153 [AT_SETUP([$1 - Python3 - tcp])
154 AT_KEYWORDS([ovsdb server idl positive Python with tcp socket $5])
155 AT_CHECK([ovsdb_start_idltest "ptcp:0:127.0.0.1"])
156 PARSE_LISTENING_PORT([ovsdb-server.log], [TCP_PORT])
157
158 m4_if([$2], [], [],
159 [AT_CHECK([ovsdb-client transact tcp:127.0.0.1:$TCP_PORT $2], [0], [ignore], [ignore])])
160 AT_CHECK([$PYTHON3 $srcdir/test-ovsdb.py -t10 idl $srcdir/idltest.ovsschema tcp:127.0.0.1:$TCP_PORT $3],
161 [0], [stdout], [ignore])
162 AT_CHECK([sort stdout | uuidfilt]m4_if([$6],,, [[| $6]]),
163 [0], [$4])
164 OVSDB_SERVER_SHUTDOWN
165 AT_CLEANUP])
166
167 # same as OVSDB_CHECK_IDL but uses the Python IDL implementation with tcp
168 # with multiple remotes with only one remote reachable
169 m4_define([OVSDB_CHECK_IDL_TCP_MULTIPLE_REMOTES_PY],
170 [AT_SETUP([$1 - Python3 (multiple remotes) - tcp])
171 AT_KEYWORDS([ovsdb server idl positive Python with tcp socket $5])
172 AT_CHECK([ovsdb_start_idltest "ptcp:0:127.0.0.1"])
173 PARSE_LISTENING_PORT([ovsdb-server.log], [TCP_PORT])
174 WRONG_PORT_1=$((TCP_PORT + 101))
175 WRONG_PORT_2=$((TCP_PORT + 102))
176 remote=tcp:127.0.0.1:$WRONG_PORT_1,tcp:127.0.0.1:$TCP_PORT,tcp:127.0.0.1:$WRONG_PORT_2
177 m4_if([$2], [], [],
178 [AT_CHECK([ovsdb-client transact tcp:127.0.0.1:$TCP_PORT $2], [0], [ignore], [ignore])])
179 AT_CHECK([$PYTHON3 $srcdir/test-ovsdb.py -t20 idl $srcdir/idltest.ovsschema $remote $3],
180 [0], [stdout], [ignore])
181 AT_CHECK([sort stdout | uuidfilt]m4_if([$6],,, [[| $6]]),
182 [0], [$4])
183 OVSDB_SERVER_SHUTDOWN
184 AT_CLEANUP])
185
186 # same as OVSDB_CHECK_IDL but uses the Python IDL implementation with tcp6
187 m4_define([OVSDB_CHECK_IDL_TCP6_PY],
188 [AT_SETUP([$1 - Python3 - tcp6])
189 AT_SKIP_IF([test "$IS_WIN32" = "yes"])
190 AT_SKIP_IF([test $HAVE_IPV6 = no])
191 AT_KEYWORDS([ovsdb server idl positive Python with tcp6 socket $5])
192 AT_CHECK([ovsdb_start_idltest "ptcp:0:[[::1]]"])
193 PARSE_LISTENING_PORT([ovsdb-server.log], [TCP_PORT])
194 echo "TCP_PORT=$TCP_PORT"
195
196 m4_if([$2], [], [],
197 [AT_CHECK([ovsdb-client transact "tcp:[[::1]]:$TCP_PORT" $2], [0], [ignore], [ignore])])
198 AT_CHECK([$PYTHON3 $srcdir/test-ovsdb.py -t10 idl $srcdir/idltest.ovsschema tcp:[[::1]]:$TCP_PORT $3],
199 [0], [stdout], [ignore])
200 AT_CHECK([sort stdout | uuidfilt]m4_if([$6],,, [[| $6]]),
201 [0], [$4])
202 OVSDB_SERVER_SHUTDOWN
203 AT_CLEANUP])
204
205 m4_define([OVSDB_CHECK_IDL_TCP6_MULTIPLE_REMOTES_PY],
206 [AT_SETUP([$1 - Python3 - tcp6])
207 AT_SKIP_IF([test "$IS_WIN32" = "yes"])
208 AT_SKIP_IF([test $HAVE_IPV6 = no])
209 AT_KEYWORDS([ovsdb server idl positive Python with tcp6 socket $5])
210 AT_CHECK([ovsdb_start_idltest "ptcp:0:[[::1]]"])
211 PARSE_LISTENING_PORT([ovsdb-server.log], [TCP_PORT])
212 WRONG_PORT_1=$((TCP_PORT + 101))
213 WRONG_PORT_2=$((TCP_PORT + 102))
214 remote="tcp:[[::1]]:$WRONG_PORT_1,tcp:[[::1]]:$TCP_PORT,tcp:[[::1]]:$WRONG_PORT_2"
215 m4_if([$2], [], [],
216 [AT_CHECK([ovsdb-client transact "tcp:[[::1]]:$TCP_PORT" $2], [0], [ignore], [ignore])])
217 AT_CHECK([$PYTHON3 $srcdir/test-ovsdb.py -t20 idl $srcdir/idltest.ovsschema $remote $3],
218 [0], [stdout], [ignore])
219 AT_CHECK([sort stdout | uuidfilt]m4_if([$6],,, [[| $6]]),
220 [0], [$4])
221 OVSDB_SERVER_SHUTDOWN
222 AT_CLEANUP])
223
224 # same as OVSDB_CHECK_IDL but uses the Python IDL implementation with SSL
225 m4_define([OVSDB_CHECK_IDL_SSL_PY],
226 [AT_SETUP([$1 - Python3 - SSL])
227 AT_SKIP_IF([test "$HAVE_OPENSSL" = no])
228 $PYTHON3 -c "import OpenSSL.SSL"
229 SSL_PRESENT=$?
230 AT_SKIP_IF([test $SSL_PRESENT != 0])
231 AT_KEYWORDS([ovsdb server idl positive Python with ssl socket $5])
232 AT_CHECK([ovsdb-tool create db $abs_srcdir/idltest.ovsschema],
233 [0], [stdout], [ignore])
234 PKIDIR=$abs_top_builddir/tests
235 AT_CHECK([ovsdb-server -vconsole:warn --log-file --detach --no-chdir \
236 --pidfile \
237 --private-key=$PKIDIR/testpki-privkey2.pem \
238 --certificate=$PKIDIR/testpki-cert2.pem \
239 --ca-cert=$PKIDIR/testpki-cacert.pem \
240 --remote=pssl:0:127.0.0.1 db])
241 on_exit 'kill `cat ovsdb-server.pid`'
242 PARSE_LISTENING_PORT([ovsdb-server.log], [TCP_PORT])
243 m4_if([$2], [], [],
244 [AT_CHECK([ovsdb-client \
245 --private-key=$PKIDIR/testpki-privkey2.pem \
246 --certificate=$PKIDIR/testpki-cert2.pem \
247 --ca-cert=$PKIDIR/testpki-cacert.pem \
248 transact "ssl:127.0.0.1:$TCP_PORT" $2], [0], [ignore], [ignore])])
249 AT_CHECK([$PYTHON3 $srcdir/test-ovsdb.py -t10 idl $srcdir/idltest.ovsschema \
250 ssl:127.0.0.1:$TCP_PORT $PKIDIR/testpki-privkey.pem \
251 $PKIDIR/testpki-cert.pem $PKIDIR/testpki-cacert.pem $3],
252 [0], [stdout], [ignore])
253 AT_CHECK([sort stdout | uuidfilt]m4_if([$6],,, [[| $6]]),
254 [0], [$4])
255 OVSDB_SERVER_SHUTDOWN
256 AT_CLEANUP])
257
258 m4_define([OVSDB_CHECK_IDL],
259 [OVSDB_CHECK_IDL_C($@)
260 OVSDB_CHECK_IDL_TCP_C($@)
261 OVSDB_CHECK_IDL_TCP6_C($@)
262 OVSDB_CHECK_IDL_PY($@)
263 OVSDB_CHECK_IDL_REGISTER_COLUMNS_PY($@)
264 OVSDB_CHECK_IDL_TCP_PY($@)
265 OVSDB_CHECK_IDL_TCP_MULTIPLE_REMOTES_PY($@)
266 OVSDB_CHECK_IDL_TCP6_PY($@)
267 OVSDB_CHECK_IDL_TCP6_MULTIPLE_REMOTES_PY($@)
268 OVSDB_CHECK_IDL_SSL_PY($@)])
269
270 # This test uses the Python IDL implementation with passive tcp
271 m4_define([OVSDB_CHECK_IDL_PASSIVE_TCP_PY],
272 [AT_SETUP([$1 - Python3 - ptcp])
273 AT_KEYWORDS([ovsdb server idl positive Python with tcp socket $5])
274 # find free TCP port
275 AT_CHECK([ovsdb_start_idltest "ptcp:0:127.0.0.1"])
276 PARSE_LISTENING_PORT([ovsdb-server.log], [TCP_PORT])
277 OVSDB_SERVER_SHUTDOWN
278 rm -f db
279
280 # start OVSDB server in passive mode
281 AT_CHECK([ovsdb_start_idltest "tcp:127.0.0.1:$TCP_PORT"])
282 AT_CHECK([$PYTHON3 $srcdir/test-ovsdb.py -t10 idl_passive $srcdir/idltest.ovsschema ptcp:127.0.0.1:$TCP_PORT $3],
283 [0], [stdout], [ignore])
284 AT_CHECK([sort stdout | uuidfilt]m4_if([$6],,, [[| $6]]),
285 [0], [$4])
286 OVSDB_SERVER_SHUTDOWN
287 AT_CLEANUP
288 ])
289
290 OVSDB_CHECK_IDL_PASSIVE_TCP_PY([simple passive idl, initially empty, select empty],
291 [],
292 [['["idltest",{"op":"select","table":"link1","where":[]}]']],
293 [[000: empty
294 001: {"error":null,"result":[{"rows":[]}]}
295 002: done
296 ]])
297
298 OVSDB_CHECK_IDL([simple idl, initially empty, no ops],
299 [],
300 [],
301 [000: empty
302 001: done
303 ])
304
305 OVSDB_CHECK_IDL([simple idl, initially empty, various ops],
306 [],
307 [['["idltest",
308 {"op": "insert",
309 "table": "simple",
310 "row": {"i": 1,
311 "r": 2.0,
312 "b": true,
313 "s": "mystring",
314 "u": ["uuid", "84f5c8f5-ac76-4dbc-a24f-8860eb407fc1"],
315 "ia": ["set", [1, 2, 3]],
316 "ra": ["set", [-0.5]],
317 "ba": ["set", [true]],
318 "sa": ["set", ["abc", "def"]],
319 "ua": ["set", [["uuid", "69443985-7806-45e2-b35f-574a04e720f9"],
320 ["uuid", "aad11ef0-816a-4b01-93e6-03b8b4256b98"]]]}},
321 {"op": "insert",
322 "table": "simple",
323 "row": {}}]' \
324 '["idltest",
325 {"op": "update",
326 "table": "simple",
327 "where": [],
328 "row": {"b": true}}]' \
329 '["idltest",
330 {"op": "update",
331 "table": "simple",
332 "where": [],
333 "row": {"r": 123.5}}]' \
334 '["idltest",
335 {"op": "insert",
336 "table": "simple",
337 "row": {"i": -1,
338 "r": 125,
339 "b": false,
340 "s": "",
341 "ia": ["set", [1]],
342 "ra": ["set", [1.5]],
343 "ba": ["set", [false]],
344 "sa": ["set", []],
345 "ua": ["set", []]}}]' \
346 '["idltest",
347 {"op": "update",
348 "table": "simple",
349 "where": [["i", "<", 1]],
350 "row": {"s": "newstring"}}]' \
351 '["idltest",
352 {"op": "delete",
353 "table": "simple",
354 "where": [["i", "==", 0]]}]' \
355 'reconnect']],
356 [[000: empty
357 001: {"error":null,"result":[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]}]}
358 002: i=0 r=0 b=false s= u=<2> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<1>
359 002: i=1 r=2 b=true s=mystring u=<3> ia=[1 2 3] ra=[-0.5] ba=[true] sa=[abc def] ua=[<4> <5>] uuid=<0>
360 003: {"error":null,"result":[{"count":2}]}
361 004: i=0 r=0 b=true s= u=<2> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<1>
362 004: i=1 r=2 b=true s=mystring u=<3> ia=[1 2 3] ra=[-0.5] ba=[true] sa=[abc def] ua=[<4> <5>] uuid=<0>
363 005: {"error":null,"result":[{"count":2}]}
364 006: i=0 r=123.5 b=true s= u=<2> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<1>
365 006: i=1 r=123.5 b=true s=mystring u=<3> ia=[1 2 3] ra=[-0.5] ba=[true] sa=[abc def] ua=[<4> <5>] uuid=<0>
366 007: {"error":null,"result":[{"uuid":["uuid","<6>"]}]}
367 008: i=-1 r=125 b=false s= u=<2> ia=[1] ra=[1.5] ba=[false] sa=[] ua=[] uuid=<6>
368 008: i=0 r=123.5 b=true s= u=<2> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<1>
369 008: i=1 r=123.5 b=true s=mystring u=<3> ia=[1 2 3] ra=[-0.5] ba=[true] sa=[abc def] ua=[<4> <5>] uuid=<0>
370 009: {"error":null,"result":[{"count":2}]}
371 010: i=-1 r=125 b=false s=newstring u=<2> ia=[1] ra=[1.5] ba=[false] sa=[] ua=[] uuid=<6>
372 010: i=0 r=123.5 b=true s=newstring u=<2> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<1>
373 010: i=1 r=123.5 b=true s=mystring u=<3> ia=[1 2 3] ra=[-0.5] ba=[true] sa=[abc def] ua=[<4> <5>] uuid=<0>
374 011: {"error":null,"result":[{"count":1}]}
375 012: i=-1 r=125 b=false s=newstring u=<2> ia=[1] ra=[1.5] ba=[false] sa=[] ua=[] uuid=<6>
376 012: i=1 r=123.5 b=true s=mystring u=<3> ia=[1 2 3] ra=[-0.5] ba=[true] sa=[abc def] ua=[<4> <5>] uuid=<0>
377 013: reconnect
378 014: i=-1 r=125 b=false s=newstring u=<2> ia=[1] ra=[1.5] ba=[false] sa=[] ua=[] uuid=<6>
379 014: i=1 r=123.5 b=true s=mystring u=<3> ia=[1 2 3] ra=[-0.5] ba=[true] sa=[abc def] ua=[<4> <5>] uuid=<0>
380 015: done
381 ]])
382
383 OVSDB_CHECK_IDL([simple idl, initially populated],
384 [['["idltest",
385 {"op": "insert",
386 "table": "simple",
387 "row": {"i": 1,
388 "r": 2.0,
389 "b": true,
390 "s": "mystring",
391 "u": ["uuid", "84f5c8f5-ac76-4dbc-a24f-8860eb407fc1"],
392 "ia": ["set", [1, 2, 3]],
393 "ra": ["set", [-0.5]],
394 "ba": ["set", [true]],
395 "sa": ["set", ["abc", "def"]],
396 "ua": ["set", [["uuid", "69443985-7806-45e2-b35f-574a04e720f9"],
397 ["uuid", "aad11ef0-816a-4b01-93e6-03b8b4256b98"]]]}},
398 {"op": "insert",
399 "table": "simple",
400 "row": {}}]']],
401 [['["idltest",
402 {"op": "update",
403 "table": "simple",
404 "where": [],
405 "row": {"b": true}}]']],
406 [[000: i=0 r=0 b=false s= u=<0> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<1>
407 000: i=1 r=2 b=true s=mystring u=<2> ia=[1 2 3] ra=[-0.5] ba=[true] sa=[abc def] ua=[<3> <4>] uuid=<5>
408 001: {"error":null,"result":[{"count":2}]}
409 002: i=0 r=0 b=true s= u=<0> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<1>
410 002: i=1 r=2 b=true s=mystring u=<2> ia=[1 2 3] ra=[-0.5] ba=[true] sa=[abc def] ua=[<3> <4>] uuid=<5>
411 003: done
412 ]])
413
414 OVSDB_CHECK_IDL([simple idl, writing via IDL],
415 [['["idltest",
416 {"op": "insert",
417 "table": "simple",
418 "row": {"i": 1,
419 "r": 2.0,
420 "b": true,
421 "s": "mystring",
422 "u": ["uuid", "84f5c8f5-ac76-4dbc-a24f-8860eb407fc1"],
423 "ia": ["set", [1, 2, 3]],
424 "ra": ["set", [-0.5]],
425 "ba": ["set", [true]],
426 "sa": ["set", ["abc", "def"]],
427 "ua": ["set", [["uuid", "69443985-7806-45e2-b35f-574a04e720f9"],
428 ["uuid", "aad11ef0-816a-4b01-93e6-03b8b4256b98"]]]}},
429 {"op": "insert",
430 "table": "simple",
431 "row": {}}]']],
432 [['verify 0 b, verify 1 r, set 0 b 1, set 1 r 3.5' \
433 'insert 2, verify 2 i, verify 1 b, delete 1']],
434 [[000: i=0 r=0 b=false s= u=<0> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<1>
435 000: i=1 r=2 b=true s=mystring u=<2> ia=[1 2 3] ra=[-0.5] ba=[true] sa=[abc def] ua=[<3> <4>] uuid=<5>
436 001: commit, status=success
437 002: i=0 r=0 b=true s= u=<0> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<1>
438 002: i=1 r=3.5 b=true s=mystring u=<2> ia=[1 2 3] ra=[-0.5] ba=[true] sa=[abc def] ua=[<3> <4>] uuid=<5>
439 003: commit, status=success
440 004: i=0 r=0 b=true s= u=<0> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<1>
441 004: i=2 r=0 b=false s= u=<0> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<6>
442 005: done
443 ]])
444
445 OVSDB_CHECK_IDL([simple idl, writing via IDL with unicode],
446 [['["idltest",
447 {"op": "insert",
448 "table": "simple",
449 "row": {"s": "(╯°□°)╯︵ ┻━┻"}}]']],
450 [['set 0 b 1, insert 1, set 1 s "¯\_(ツ)_/¯"']],
451 [[000: i=0 r=0 b=false s=(╯°□°)╯︵ ┻━┻ u=<0> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<1>
452 001: commit, status=success
453 002: i=0 r=0 b=true s=(╯°□°)╯︵ ┻━┻ u=<0> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<1>
454 002: i=1 r=0 b=false s="¯\_(ツ)_/¯" u=<0> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<2>
455 003: done
456 ]])
457
458 m4_define([OVSDB_CHECK_IDL_PY_WITH_EXPOUT],
459 [AT_SETUP([$1 - Python3])
460 AT_KEYWORDS([ovsdb server idl positive Python $5])
461 AT_CHECK([ovsdb_start_idltest])
462 m4_if([$2], [], [],
463 [AT_CHECK([ovsdb-client transact unix:socket $2], [0], [ignore], [ignore])])
464 AT_CHECK([$PYTHON3 $srcdir/test-ovsdb.py -t10 idl $srcdir/idltest.ovsschema unix:socket $3],
465 [0], [stdout], [ignore])
466 echo "$4" > expout
467 AT_CHECK([sort stdout | uuidfilt]m4_if([$6],,, [[| $6]]),
468 [0], [expout])
469 OVSDB_SERVER_SHUTDOWN
470 AT_CLEANUP])
471
472 OVSDB_CHECK_IDL_PY_WITH_EXPOUT([simple idl, writing large data via IDL with unicode],
473 [['["idltest",
474 {"op": "insert",
475 "table": "simple",
476 "row": {"s": "'$(printf "测试超过四千零九十六个字节的中文字符串以使解码出现问题。%.0s" {1..50})'"}}]']],
477 [['set 0 b 1, insert 1, set 1 s '$(printf "测试超过四千零九十六个字节的中文字符串以使解码出现问题。%.0s" {1..100})'']],
478 [[000: i=0 r=0 b=false s=$(printf "测试超过四千零九十六个字节的中文字符串以使解码出现问题。%.0s" {1..50}) u=<0> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<1>
479 001: commit, status=success
480 002: i=0 r=0 b=true s=$(printf "测试超过四千零九十六个字节的中文字符串以使解码出现问题。%.0s" {1..50}) u=<0> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<1>
481 002: i=1 r=0 b=false s=$(printf "测试超过四千零九十六个字节的中文字符串以使解码出现问题。%.0s" {1..100}) u=<0> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<2>
482 003: done]])
483
484 OVSDB_CHECK_IDL([simple idl, handling verification failure],
485 [['["idltest",
486 {"op": "insert",
487 "table": "simple",
488 "row": {"i": 1,
489 "r": 2.0}},
490 {"op": "insert",
491 "table": "simple",
492 "row": {}}]']],
493 [['set 0 b 1' \
494 '+["idltest",
495 {"op": "update",
496 "table": "simple",
497 "where": [["i", "==", 1]],
498 "row": {"r": 5.0}}]' \
499 '+verify 1 r, set 1 r 3' \
500 'verify 1 r, set 1 r 3' \
501 ]],
502 [[000: i=0 r=0 b=false s= u=<0> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<1>
503 000: i=1 r=2 b=false s= u=<0> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<2>
504 001: commit, status=success
505 002: {"error":null,"result":[{"count":1}]}
506 003: commit, status=try again
507 004: i=0 r=0 b=true s= u=<0> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<1>
508 004: i=1 r=5 b=false s= u=<0> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<2>
509 005: commit, status=success
510 006: i=0 r=0 b=true s= u=<0> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<1>
511 006: i=1 r=3 b=false s= u=<0> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<2>
512 007: done
513 ]])
514
515 OVSDB_CHECK_IDL([simple idl, increment operation],
516 [['["idltest",
517 {"op": "insert",
518 "table": "simple",
519 "row": {}}]']],
520 [['set 0 r 2.0, increment 0']],
521 [[000: i=0 r=0 b=false s= u=<0> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<1>
522 001: commit, status=success, increment=1
523 002: i=1 r=2 b=false s= u=<0> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<1>
524 003: done
525 ]])
526
527 OVSDB_CHECK_IDL([simple idl, aborting],
528 [['["idltest",
529 {"op": "insert",
530 "table": "simple",
531 "row": {}}]']],
532 [['set 0 r 2.0, abort' \
533 '+set 0 b 1']],
534 [[000: i=0 r=0 b=false s= u=<0> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<1>
535 001: commit, status=aborted
536 002: commit, status=success
537 003: i=0 r=0 b=true s= u=<0> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<1>
538 004: done
539 ]])
540
541 OVSDB_CHECK_IDL([simple idl, destroy without commit or abort],
542 [['["idltest",
543 {"op": "insert",
544 "table": "simple",
545 "row": {}}]']],
546 [['set 0 r 2.0, destroy' \
547 '+set 0 b 1']],
548 [[000: i=0 r=0 b=false s= u=<0> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<1>
549 001: destroy
550 002: commit, status=success
551 003: i=0 r=0 b=true s= u=<0> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<1>
552 004: done
553 ]])
554
555 OVSDB_CHECK_IDL([simple idl, conditional, false condition],
556 [['["idltest",
557 {"op": "insert",
558 "table": "simple",
559 "row": {"i": 1,
560 "r": 2.0,
561 "b": true}}]']],
562 [['condition simple []' \
563 'condition simple [true]']],
564 [[000: change conditions
565 001: empty
566 002: change conditions
567 003: i=1 r=2 b=true s= u=<0> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<1>
568 004: done
569 ]])
570
571 OVSDB_CHECK_IDL([simple idl, conditional, true condition],
572 [['["idltest",
573 {"op": "insert",
574 "table": "simple",
575 "row": {"i": 1,
576 "r": 2.0,
577 "b": true}}]']],
578 [['condition simple []' \
579 'condition simple [true]']],
580 [[000: change conditions
581 001: empty
582 002: change conditions
583 003: i=1 r=2 b=true s= u=<0> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<1>
584 004: done
585 ]])
586
587 OVSDB_CHECK_IDL([simple idl, conditional, multiple clauses in condition],
588 [['["idltest",
589 {"op": "insert",
590 "table": "simple",
591 "row": {"i": 1,
592 "r": 2.0,
593 "b": true}},
594 {"op": "insert",
595 "table": "simple",
596 "row": {"i": 2,
597 "r": 3.0,
598 "b": true}}]']],
599 [['condition simple []' \
600 'condition simple [["i","==",1],["i","==",2]]']],
601 [[000: change conditions
602 001: empty
603 002: change conditions
604 003: i=1 r=2 b=true s= u=<0> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<1>
605 003: i=2 r=3 b=true s= u=<0> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<2>
606 004: done
607 ]])
608
609 OVSDB_CHECK_IDL([simple idl, conditional, modify as insert due to condition],
610 [['["idltest",
611 {"op": "insert",
612 "table": "simple",
613 "row": {"i": 1,
614 "r": 2.0,
615 "b": true}}]']],
616 [['condition simple []' \
617 'condition simple [["i","==",1]]']],
618 [[000: change conditions
619 001: empty
620 002: change conditions
621 003: i=1 r=2 b=true s= u=<0> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<1>
622 004: done
623 ]])
624
625 OVSDB_CHECK_IDL([simple idl, conditional, modify as delete due to condition],
626 [['["idltest",
627 {"op": "insert",
628 "table": "simple",
629 "row": {"i": 1,
630 "r": 2.0,
631 "b": true}}]']],
632 [['condition simple []' \
633 'condition simple [["i","==",1],["i","==",2]]' \
634 'condition simple [["i","==",2]]' \
635 '["idltest",
636 {"op": "insert",
637 "table": "simple",
638 "row": {"i": 2,
639 "r": 3.0,
640 "b": true}}]']],
641 [[000: change conditions
642 001: empty
643 002: change conditions
644 003: i=1 r=2 b=true s= u=<0> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<1>
645 004: change conditions
646 005: empty
647 006: {"error":null,"result":[{"uuid":["uuid","<2>"]}]}
648 007: i=2 r=3 b=true s= u=<0> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<2>
649 008: done
650 ]])
651
652 OVSDB_CHECK_IDL([simple idl, conditional, multiple tables],
653 [['["idltest",
654 {"op": "insert",
655 "table": "simple",
656 "row": {"i": 1,
657 "r": 2.0,
658 "b": true}},
659 {"op": "insert",
660 "table": "link1",
661 "row": {"i": 0, "k": ["named-uuid", "self"]},
662 "uuid-name": "self"},
663 {"op": "insert",
664 "table": "link2",
665 "row": {"i": 2},
666 "uuid-name": "row0"}]']],
667 [['condition simple [];link1 [];link2 []' \
668 'condition simple [["i","==",1]]' \
669 'condition link1 [["i","==",0]]' \
670 'condition link2 [["i","==",3]]' \
671 '+["idltest",
672 {"op": "insert",
673 "table": "link2",
674 "row": {"i": 3},
675 "uuid-name": "row0"}]']],
676 [[000: change conditions
677 001: empty
678 002: change conditions
679 003: i=1 r=2 b=true s= u=<0> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<1>
680 004: change conditions
681 005: i=0 k=0 ka=[] l2= uuid=<2>
682 005: i=1 r=2 b=true s= u=<0> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<1>
683 006: change conditions
684 007: {"error":null,"result":[{"uuid":["uuid","<3>"]}]}
685 008: i=0 k=0 ka=[] l2= uuid=<2>
686 008: i=1 r=2 b=true s= u=<0> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<1>
687 008: i=3 l1= uuid=<3>
688 009: done
689 ]])
690
691 OVSDB_CHECK_IDL([self-linking idl, consistent ops],
692 [],
693 [['["idltest",
694 {"op": "insert",
695 "table": "link1",
696 "row": {"i": 0, "k": ["named-uuid", "self"]},
697 "uuid-name": "self"}]' \
698 '["idltest",
699 {"op": "insert",
700 "table": "link1",
701 "row": {"i": 1, "k": ["named-uuid", "row2"]},
702 "uuid-name": "row1"},
703 {"op": "insert",
704 "table": "link1",
705 "row": {"i": 2, "k": ["named-uuid", "row1"]},
706 "uuid-name": "row2"}]' \
707 '["idltest",
708 {"op": "update",
709 "table": "link1",
710 "where": [["i", "==", 1]],
711 "row": {"k": ["uuid", "#1#"]}}]' \
712 '["idltest",
713 {"op": "update",
714 "table": "link1",
715 "where": [],
716 "row": {"k": ["uuid", "#0#"]}}]']],
717 [[000: empty
718 001: {"error":null,"result":[{"uuid":["uuid","<0>"]}]}
719 002: i=0 k=0 ka=[] l2= uuid=<0>
720 003: {"error":null,"result":[{"uuid":["uuid","<1>"]},{"uuid":["uuid","<2>"]}]}
721 004: i=0 k=0 ka=[] l2= uuid=<0>
722 004: i=1 k=2 ka=[] l2= uuid=<1>
723 004: i=2 k=1 ka=[] l2= uuid=<2>
724 005: {"error":null,"result":[{"count":1}]}
725 006: i=0 k=0 ka=[] l2= uuid=<0>
726 006: i=1 k=1 ka=[] l2= uuid=<1>
727 006: i=2 k=1 ka=[] l2= uuid=<2>
728 007: {"error":null,"result":[{"count":3}]}
729 008: i=0 k=0 ka=[] l2= uuid=<0>
730 008: i=1 k=0 ka=[] l2= uuid=<1>
731 008: i=2 k=0 ka=[] l2= uuid=<2>
732 009: done
733 ]])
734
735 OVSDB_CHECK_IDL([self-linking idl, inconsistent ops],
736 [],
737 [['["idltest",
738 {"op": "insert",
739 "table": "link1",
740 "row": {"i": 0, "k": ["uuid", "cf197cc5-c8c9-42f5-82d5-c71a9f2cb96b"]}}]' \
741 '+["idltest",
742 {"op": "insert",
743 "table": "link1",
744 "uuid-name": "one",
745 "row": {"i": 1, "k": ["named-uuid", "one"]}},
746 {"op": "insert",
747 "table": "link1",
748 "row": {"i": 2, "k": ["named-uuid", "one"]}}]' \
749 '["idltest",
750 {"op": "update",
751 "table": "link1",
752 "where": [],
753 "row": {"k": ["uuid", "c2fca39a-e69a-42a4-9c56-5eca85839ce9"]}}]' \
754 '+["idltest",
755 {"op": "delete",
756 "table": "link1",
757 "where": [["_uuid", "==", ["uuid", "#1#"]]]}]' \
758 '+["idltest",
759 {"op": "delete",
760 "table": "link1",
761 "where": [["_uuid", "==", ["uuid", "#2#"]]]}]' \
762 '["idltest",
763 {"op": "delete",
764 "table": "link1",
765 "where": []}]' \
766 ]],
767 [[000: empty
768 001: {"error":null,"result":[{"uuid":["uuid","<0>"]},{"details":"Table link1 column k row <0> references nonexistent row <1> in table link1.","error":"referential integrity violation"}]}
769 002: {"error":null,"result":[{"uuid":["uuid","<2>"]},{"uuid":["uuid","<3>"]}]}
770 003: i=1 k=1 ka=[] l2= uuid=<2>
771 003: i=2 k=1 ka=[] l2= uuid=<3>
772 004: {"error":null,"result":[{"count":2},{"details":"Table link1 column k row <x> references nonexistent row <4> in table link1.","error":"referential integrity violation"}]}
773 005: {"error":null,"result":[{"count":1},{"details":"cannot delete link1 row <2> because of 1 remaining reference(s)","error":"referential integrity violation"}]}
774 006: {"error":null,"result":[{"count":1}]}
775 007: i=1 k=1 ka=[] l2= uuid=<2>
776 008: {"error":null,"result":[{"count":1}]}
777 009: empty
778 010: done
779 ]],
780 [],
781 [[sed -e '/004:/s/row <[23]> references/row <x> references/']])
782
783 OVSDB_CHECK_IDL([self-linking idl, sets],
784 [],
785 [['["idltest",
786 {"op": "insert",
787 "table": "link1",
788 "row": {"i": 0, "k": ["named-uuid", "i0"], "ka": ["set", [["named-uuid", "i0"]]]},
789 "uuid-name": "i0"},
790 {"op": "insert",
791 "table": "link1",
792 "row": {"i": 1, "k": ["named-uuid", "i0"], "ka": ["set", [["named-uuid", "i1"]]]},
793 "uuid-name": "i1"},
794 {"op": "insert",
795 "table": "link1",
796 "row": {"i": 2, "k": ["named-uuid", "i0"], "ka": ["set", [["named-uuid", "i2"]]]},
797 "uuid-name": "i2"},
798 {"op": "insert",
799 "table": "link1",
800 "row": {"i": 3, "k": ["named-uuid", "i0"], "ka": ["set", [["named-uuid", "i3"]]]},
801 "uuid-name": "i3"}]' \
802 '["idltest",
803 {"op": "update",
804 "table": "link1",
805 "where": [],
806 "row": {"ka": ["set", [["uuid", "#0#"], ["uuid", "#1#"], ["uuid", "#2#"], ["uuid", "#3#"]]]}}]' \
807 '["idltest",
808 {"op": "update",
809 "table": "link1",
810 "where": [["i", "==", 2]],
811 "row": {"ka": ["set", [["uuid", "#0#"], ["uuid", "88702e78-845b-4a6e-ad08-cf68922ae84a"], ["uuid", "#2#"]]]}}]' \
812 '+["idltest",
813 {"op": "delete",
814 "table": "link1",
815 "where": []}]']],
816 [[000: empty
817 001: {"error":null,"result":[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{"uuid":["uuid","<2>"]},{"uuid":["uuid","<3>"]}]}
818 002: i=0 k=0 ka=[0] l2= uuid=<0>
819 002: i=1 k=0 ka=[1] l2= uuid=<1>
820 002: i=2 k=0 ka=[2] l2= uuid=<2>
821 002: i=3 k=0 ka=[3] l2= uuid=<3>
822 003: {"error":null,"result":[{"count":4}]}
823 004: i=0 k=0 ka=[0 1 2 3] l2= uuid=<0>
824 004: i=1 k=0 ka=[0 1 2 3] l2= uuid=<1>
825 004: i=2 k=0 ka=[0 1 2 3] l2= uuid=<2>
826 004: i=3 k=0 ka=[0 1 2 3] l2= uuid=<3>
827 005: {"error":null,"result":[{"count":1},{"details":"Table link1 column ka row <2> references nonexistent row <4> in table link1.","error":"referential integrity violation"}]}
828 006: {"error":null,"result":[{"count":4}]}
829 007: empty
830 008: done
831 ]])
832
833 OVSDB_CHECK_IDL([external-linking idl, consistent ops],
834 [],
835 [['["idltest",
836 {"op": "insert",
837 "table": "link2",
838 "row": {"i": 0},
839 "uuid-name": "row0"},
840 {"op": "insert",
841 "table": "link1",
842 "row": {"i": 1, "k": ["named-uuid", "row1"], "l2": ["set", [["named-uuid", "row0"]]]},
843 "uuid-name": "row1"}]']],
844 [[000: empty
845 001: {"error":null,"result":[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]}]}
846 002: i=0 l1= uuid=<0>
847 002: i=1 k=1 ka=[] l2=0 uuid=<1>
848 003: done
849 ]])
850
851 OVSDB_CHECK_IDL([singleton idl, constraints],
852 [],
853 [['["idltest",
854 {"op": "insert",
855 "table": "singleton",
856 "row": {"name": "foo"}}]' \
857 '["idltest",
858 {"op": "insert",
859 "table": "singleton",
860 "row": {"name": "bar"}}]' \
861 '+["idltest",
862 {"op": "delete",
863 "table": "singleton",
864 "where": [["_uuid", "==", ["uuid", "#0#"]]]},
865 {"op": "insert",
866 "table": "singleton",
867 "row": {"name": "bar"}}]']],
868 [[000: empty
869 001: {"error":null,"result":[{"uuid":["uuid","<0>"]}]}
870 002: name=foo uuid=<0>
871 003: {"error":null,"result":[{"uuid":["uuid","<1>"]},{"details":"transaction causes \"singleton\" table to contain 2 rows, greater than the schema-defined limit of 1 row(s)","error":"constraint violation"}]}
872 004: {"error":null,"result":[{"count":1},{"uuid":["uuid","<2>"]}]}
873 005: name=bar uuid=<2>
874 006: done
875 ]])
876
877 OVSDB_CHECK_IDL_PY([external-linking idl, insert ops],
878 [],
879 [['linktest']],
880 [[000: empty
881 001: commit, status=success
882 002: i=1 k=1 ka=[1] l2= uuid=<0>
883 002: i=2 k=1 ka=[1 2] l2= uuid=<1>
884 003: done
885 ]])
886
887 OVSDB_CHECK_IDL_PY([getattr idl, insert ops],
888 [],
889 [['getattrtest']],
890 [[000: empty
891 001: commit, status=success
892 002: i=2 k=2 ka=[] l2= uuid=<0>
893 003: done
894 ]])
895
896 OVSDB_CHECK_IDL_PY([row-from-json idl, whats this],
897 [['["idltest",
898 {"op": "insert",
899 "table": "simple",
900 "row": {"i": 1}},
901 {"op": "insert",
902 "table": "simple",
903 "row": {}}]']],
904 [['notifytest insert 2, notifytest set 1 b 1, notifytest delete 0']],
905 [[000: i=0 r=0 b=false s= u=<0> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<1>
906 000: i=1 r=0 b=false s= u=<0> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<2>
907 001: commit, status=success, events=create|2|None, delete|0|None, update|1|b
908 002: i=1 r=0 b=true s= u=<0> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<2>
909 002: i=2 r=0 b=false s= u=<0> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<3>
910 003: done
911 ]])
912
913 AT_SETUP([idl handling of missing tables and columns - C])
914 AT_KEYWORDS([ovsdb server idl positive])
915
916 # idltest2.ovsschema is the same as idltest.ovsschema, except that
917 # table link2 and column l2 have been deleted. But the IDL still
918 # expects them to be there, so this test checks that it properly
919 # tolerates them being missing.
920 AT_CHECK([ovsdb_start_idltest "" "$abs_srcdir/idltest2.ovsschema"])
921 AT_CHECK([test-ovsdb '-vPATTERN:console:test-ovsdb|%c|%m' -vjsonrpc -t10 idl unix:socket ['["idltest",
922 {"op": "insert",
923 "table": "link1",
924 "row": {"i": 0, "k": ["named-uuid", "self"]},
925 "uuid-name": "self"}]' \
926 '["idltest",
927 {"op": "insert",
928 "table": "link1",
929 "row": {"i": 1, "k": ["named-uuid", "row2"]},
930 "uuid-name": "row1"},
931 {"op": "insert",
932 "table": "link1",
933 "row": {"i": 2, "k": ["named-uuid", "row1"]},
934 "uuid-name": "row2"}]' \
935 '["idltest",
936 {"op": "update",
937 "table": "link1",
938 "where": [["i", "==", 1]],
939 "row": {"k": ["uuid", "#1#"]}}]' \
940 '["idltest",
941 {"op": "update",
942 "table": "link1",
943 "where": [],
944 "row": {"k": ["uuid", "#0#"]}}]']],
945 [0], [stdout], [stderr])
946 AT_CHECK([sort stdout | uuidfilt], [0],
947 [[000: empty
948 001: {"error":null,"result":[{"uuid":["uuid","<0>"]}]}
949 002: i=0 k=0 ka=[] l2= uuid=<0>
950 003: {"error":null,"result":[{"uuid":["uuid","<1>"]},{"uuid":["uuid","<2>"]}]}
951 004: i=0 k=0 ka=[] l2= uuid=<0>
952 004: i=1 k=2 ka=[] l2= uuid=<1>
953 004: i=2 k=1 ka=[] l2= uuid=<2>
954 005: {"error":null,"result":[{"count":1}]}
955 006: i=0 k=0 ka=[] l2= uuid=<0>
956 006: i=1 k=1 ka=[] l2= uuid=<1>
957 006: i=2 k=1 ka=[] l2= uuid=<2>
958 007: {"error":null,"result":[{"count":3}]}
959 008: i=0 k=0 ka=[] l2= uuid=<0>
960 008: i=1 k=0 ka=[] l2= uuid=<1>
961 008: i=2 k=0 ka=[] l2= uuid=<2>
962 009: done
963 ]])
964
965 # Check that ovsdb-idl figured out that table link2 and column l2 are missing.
966 AT_CHECK([grep ovsdb_idl stderr | sort], [0], [dnl
967 test-ovsdb|ovsdb_idl|idltest database lacks indexed table (database needs upgrade?)
968 test-ovsdb|ovsdb_idl|idltest database lacks link2 table (database needs upgrade?)
969 test-ovsdb|ovsdb_idl|idltest database lacks simple5 table (database needs upgrade?)
970 test-ovsdb|ovsdb_idl|idltest database lacks simple6 table (database needs upgrade?)
971 test-ovsdb|ovsdb_idl|idltest database lacks singleton table (database needs upgrade?)
972 test-ovsdb|ovsdb_idl|link1 table in idltest database lacks l2 column (database needs upgrade?)
973 ])
974
975 # Check that ovsdb-idl sent on "monitor" request and that it didn't
976 # mention that table or column, and (for paranoia) that it did mention another
977 # table and column.
978 AT_CHECK([grep -c '"monitor\|monitor_cond"' stderr], [0], [2
979 ])
980 AT_CHECK([grep '"monitor\|monitor_cond"' stderr | grep link2], [1])
981 AT_CHECK([grep '"monitor\|monitor_cond"' stderr | grep l2], [1])
982 AT_CHECK([grep '"monitor\|monitor_cond"' stderr | grep -c '"link1"'], [0], [1
983 ])
984 AT_CHECK([grep '"monitor\|monitor_cond"' stderr | grep -c '"ua"'], [0], [1
985 ])
986 OVSDB_SERVER_SHUTDOWN
987 AT_CLEANUP
988
989 m4_define([OVSDB_CHECK_IDL_FETCH_COLUMNS_PY],
990 [AT_SETUP([$1 - Python3 - fetch])
991 AT_KEYWORDS([ovsdb server idl positive Python increment fetch $6])
992 AT_CHECK([ovsdb_start_idltest])
993 m4_if([$2], [], [],
994 [AT_CHECK([ovsdb-client transact unix:socket $2], [0], [ignore], [ignore])])
995 AT_CHECK([$PYTHON3 $srcdir/test-ovsdb.py -t10 idl $srcdir/idltest.ovsschema unix:socket [$3] $4],
996 [0], [stdout], [ignore])
997 AT_CHECK([sort stdout | uuidfilt]m4_if([$7],,, [[| $7]]),
998 [0], [$5])
999 OVSDB_SERVER_SHUTDOWN
1000 AT_CLEANUP])
1001
1002 m4_define([OVSDB_CHECK_IDL_FETCH_COLUMNS],
1003 [OVSDB_CHECK_IDL_FETCH_COLUMNS_PY($@)])
1004
1005 OVSDB_CHECK_IDL_FETCH_COLUMNS([simple idl, initially populated],
1006 [['["idltest",
1007 {"op": "insert",
1008 "table": "simple",
1009 "row": {"i": 1,
1010 "r": 2.0,
1011 "b": true,
1012 "s": "mystring",
1013 "u": ["uuid", "84f5c8f5-ac76-4dbc-a24f-8860eb407fc1"],
1014 "ia": ["set", [1, 2, 3]],
1015 "ra": ["set", [-0.5]],
1016 "ba": ["set", [true]],
1017 "sa": ["set", ["abc", "def"]],
1018 "ua": ["set", [["uuid", "69443985-7806-45e2-b35f-574a04e720f9"],
1019 ["uuid", "aad11ef0-816a-4b01-93e6-03b8b4256b98"]]]}},
1020 {"op": "insert",
1021 "table": "simple",
1022 "row": {}}]']],
1023 [?simple:i,r!],
1024 ['fetch 0 r'],
1025 [[000: i=0 uuid=<0>
1026 000: i=1 uuid=<1>
1027 001: commit, status=success
1028 002: i=0 r=0 uuid=<0>
1029 002: i=1 uuid=<1>
1030 003: done
1031 ]])
1032
1033 m4_define([OVSDB_CHECK_IDL_WO_MONITOR_COND_PY],
1034 [AT_SETUP([$1 - Python3])
1035 AT_KEYWORDS([ovsdb server idl Python monitor $4])
1036 AT_CHECK([ovsdb_start_idltest])
1037 AT_CHECK([ovs-appctl -t ovsdb-server ovsdb-server/disable-monitor-cond])
1038 AT_CHECK([$PYTHON3 $srcdir/test-ovsdb.py -t10 idl $srcdir/idltest.ovsschema unix:socket $2],
1039 [0], [stdout], [ignore])
1040 AT_CHECK([sort stdout | uuidfilt]m4_if([$5],,, [[| $5]]),
1041 [0], [$3])
1042 OVSDB_SERVER_SHUTDOWN
1043 AT_CLEANUP])
1044
1045 m4_define([OVSDB_CHECK_IDL_WO_MONITOR_COND],
1046 [OVSDB_CHECK_IDL_WO_MONITOR_COND_PY($@)])
1047
1048
1049 OVSDB_CHECK_IDL_WO_MONITOR_COND([simple idl disable monitor-cond],
1050 [['["idltest",
1051 {"op": "insert",
1052 "table": "simple",
1053 "row": {"i": 1,
1054 "r": 2.0,
1055 "b": true,
1056 "s": "mystring",
1057 "u": ["uuid", "84f5c8f5-ac76-4dbc-a24f-8860eb407fc1"],
1058 "ia": ["set", [1, 2, 3]],
1059 "ra": ["set", [-0.5]],
1060 "ba": ["set", [true]],
1061 "sa": ["set", ["abc", "def"]],
1062 "ua": ["set", [["uuid", "69443985-7806-45e2-b35f-574a04e720f9"],
1063 ["uuid", "aad11ef0-816a-4b01-93e6-03b8b4256b98"]]]}},
1064 {"op": "insert",
1065 "table": "simple",
1066 "row": {}}]' \
1067 '["idltest",
1068 {"op": "update",
1069 "table": "simple",
1070 "where": [],
1071 "row": {"b": true}}]' \
1072 '["idltest",
1073 {"op": "update",
1074 "table": "simple",
1075 "where": [],
1076 "row": {"r": 123.5}}]' \
1077 '["idltest",
1078 {"op": "insert",
1079 "table": "simple",
1080 "row": {"i": -1,
1081 "r": 125,
1082 "b": false,
1083 "s": "",
1084 "ia": ["set", [1]],
1085 "ra": ["set", [1.5]],
1086 "ba": ["set", [false]],
1087 "sa": ["set", []],
1088 "ua": ["set", []]}}]' \
1089 '["idltest",
1090 {"op": "update",
1091 "table": "simple",
1092 "where": [["i", "<", 1]],
1093 "row": {"s": "newstring"}}]' \
1094 '["idltest",
1095 {"op": "delete",
1096 "table": "simple",
1097 "where": [["i", "==", 0]]}]' \
1098 'reconnect']],
1099 [[000: empty
1100 001: {"error":null,"result":[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]}]}
1101 002: i=0 r=0 b=false s= u=<2> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<1>
1102 002: i=1 r=2 b=true s=mystring u=<3> ia=[1 2 3] ra=[-0.5] ba=[true] sa=[abc def] ua=[<4> <5>] uuid=<0>
1103 003: {"error":null,"result":[{"count":2}]}
1104 004: i=0 r=0 b=true s= u=<2> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<1>
1105 004: i=1 r=2 b=true s=mystring u=<3> ia=[1 2 3] ra=[-0.5] ba=[true] sa=[abc def] ua=[<4> <5>] uuid=<0>
1106 005: {"error":null,"result":[{"count":2}]}
1107 006: i=0 r=123.5 b=true s= u=<2> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<1>
1108 006: i=1 r=123.5 b=true s=mystring u=<3> ia=[1 2 3] ra=[-0.5] ba=[true] sa=[abc def] ua=[<4> <5>] uuid=<0>
1109 007: {"error":null,"result":[{"uuid":["uuid","<6>"]}]}
1110 008: i=-1 r=125 b=false s= u=<2> ia=[1] ra=[1.5] ba=[false] sa=[] ua=[] uuid=<6>
1111 008: i=0 r=123.5 b=true s= u=<2> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<1>
1112 008: i=1 r=123.5 b=true s=mystring u=<3> ia=[1 2 3] ra=[-0.5] ba=[true] sa=[abc def] ua=[<4> <5>] uuid=<0>
1113 009: {"error":null,"result":[{"count":2}]}
1114 010: i=-1 r=125 b=false s=newstring u=<2> ia=[1] ra=[1.5] ba=[false] sa=[] ua=[] uuid=<6>
1115 010: i=0 r=123.5 b=true s=newstring u=<2> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<1>
1116 010: i=1 r=123.5 b=true s=mystring u=<3> ia=[1 2 3] ra=[-0.5] ba=[true] sa=[abc def] ua=[<4> <5>] uuid=<0>
1117 011: {"error":null,"result":[{"count":1}]}
1118 012: i=-1 r=125 b=false s=newstring u=<2> ia=[1] ra=[1.5] ba=[false] sa=[] ua=[] uuid=<6>
1119 012: i=1 r=123.5 b=true s=mystring u=<3> ia=[1 2 3] ra=[-0.5] ba=[true] sa=[abc def] ua=[<4> <5>] uuid=<0>
1120 013: reconnect
1121 014: i=-1 r=125 b=false s=newstring u=<2> ia=[1] ra=[1.5] ba=[false] sa=[] ua=[] uuid=<6>
1122 014: i=1 r=123.5 b=true s=mystring u=<3> ia=[1 2 3] ra=[-0.5] ba=[true] sa=[abc def] ua=[<4> <5>] uuid=<0>
1123 015: done
1124 ]])
1125
1126 m4_define([OVSDB_CHECK_IDL_TRACK_C],
1127 [AT_SETUP([$1 - C])
1128 AT_KEYWORDS([ovsdb server idl tracking positive $5])
1129 AT_CHECK([ovsdb_start_idltest])
1130 m4_if([$2], [], [],
1131 [AT_CHECK([ovsdb-client transact unix:socket $2], [0], [ignore], [ignore])])
1132 AT_CHECK([test-ovsdb '-vPATTERN:console:test-ovsdb|%c|%m' -vjsonrpc -t10 -c idl unix:socket $3],
1133 [0], [stdout], [ignore])
1134 AT_CHECK([sort stdout | uuidfilt]m4_if([$6],,, [[| $6]]),
1135 [0], [$4])
1136 OVSDB_SERVER_SHUTDOWN
1137 AT_CLEANUP])
1138
1139 m4_define([OVSDB_CHECK_IDL_TRACK],
1140 [OVSDB_CHECK_IDL_TRACK_C($@)])
1141
1142 OVSDB_CHECK_IDL_TRACK([track, simple idl, initially populated],
1143 [['["idltest",
1144 {"op": "insert",
1145 "table": "simple",
1146 "row": {"i": 1,
1147 "r": 2.0,
1148 "b": true,
1149 "s": "mystring",
1150 "u": ["uuid", "84f5c8f5-ac76-4dbc-a24f-8860eb407fc1"],
1151 "ia": ["set", [1, 2, 3]],
1152 "ra": ["set", [-0.5]],
1153 "ba": ["set", [true]],
1154 "sa": ["set", ["abc", "def"]],
1155 "ua": ["set", [["uuid", "69443985-7806-45e2-b35f-574a04e720f9"],
1156 ["uuid", "aad11ef0-816a-4b01-93e6-03b8b4256b98"]]]}},
1157 {"op": "insert",
1158 "table": "simple",
1159 "row": {}}]']],
1160 [['["idltest",
1161 {"op": "update",
1162 "table": "simple",
1163 "where": [],
1164 "row": {"b": true}}]']],
1165 [[000: i=1 r=2 b=true s=mystring u=<0> ia=[1 2 3] ra=[-0.5] ba=[true] sa=[abc def] ua=[<1> <2>] uuid=<3>
1166 000: inserted row: uuid=<3>
1167 000: updated columns: b ba i ia r ra s sa u ua
1168 001: {"error":null,"result":[{"count":2}]}
1169 002: i=0 r=0 b=true s= u=<4> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<5>
1170 002: i=1 r=2 b=true s=mystring u=<0> ia=[1 2 3] ra=[-0.5] ba=[true] sa=[abc def] ua=[<1> <2>] uuid=<3>
1171 002: updated columns: b
1172 003: done
1173 ]])
1174
1175 dnl This test creates database with weak references and checks that orphan
1176 dnl rows created for weak references are not available for iteration via
1177 dnl list of tracked changes.
1178 OVSDB_CHECK_IDL_TRACK([track, simple idl, initially populated, orphan weak references],
1179 [['["idltest",
1180 {"op": "insert",
1181 "table": "simple",
1182 "row": {"s": "row0_s"},
1183 "uuid-name": "weak_row0"},
1184 {"op": "insert",
1185 "table": "simple",
1186 "row": {"s": "row1_s"},
1187 "uuid-name": "weak_row1"},
1188 {"op": "insert",
1189 "table": "simple",
1190 "row": {"s": "row2_s"},
1191 "uuid-name": "weak_row2"},
1192 {"op": "insert",
1193 "table": "simple6",
1194 "row": {"name": "first_row",
1195 "weak_ref": ["set",
1196 [["named-uuid", "weak_row0"],
1197 ["named-uuid", "weak_row1"],
1198 ["named-uuid", "weak_row2"]]
1199 ]}}]']],
1200 [['condition simple []' \
1201 'condition simple [["s","==","row1_s"]]' \
1202 '["idltest",
1203 {"op": "update",
1204 "table": "simple6",
1205 "where": [],
1206 "row": {"name": "new_name"}}]' \
1207 '["idltest",
1208 {"op": "delete",
1209 "table": "simple6",
1210 "where": []}]']],
1211 [[000: change conditions
1212 001: inserted row: uuid=<0>
1213 001: name=first_row weak_ref=[] uuid=<0>
1214 001: updated columns: name weak_ref
1215 002: change conditions
1216 003: i=0 r=0 b=false s=row1_s u=<1> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<2>
1217 003: inserted row: uuid=<2>
1218 003: name=first_row weak_ref=[<2>] uuid=<0>
1219 003: updated columns: s
1220 004: {"error":null,"result":[{"count":1}]}
1221 005: name=new_name weak_ref=[<2>] uuid=<0>
1222 005: updated columns: name
1223 006: {"error":null,"result":[{"count":1}]}
1224 007: i=0 r=0 b=false s=row1_s u=<1> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<2>
1225 008: done
1226 ]])
1227
1228 dnl This test creates database with weak references and checks that the
1229 dnl content of orphaned rows created for weak references after monitor
1230 dnl condition change are not leaked when the row is reinserted and deleted.
1231 OVSDB_CHECK_IDL_TRACK([track, simple idl, initially populated, orphan rows, conditional],
1232 [['["idltest",
1233 {"op": "insert",
1234 "table": "simple",
1235 "row": {"s": "row0_s"},
1236 "uuid-name": "weak_row0"},
1237 {"op": "insert",
1238 "table": "simple",
1239 "row": {"s": "row1_s"},
1240 "uuid-name": "weak_row1"},
1241 {"op": "insert",
1242 "table": "simple6",
1243 "row": {"name": "first_row",
1244 "weak_ref": ["set",
1245 [["named-uuid", "weak_row0"]]
1246 ]}}]']],
1247 [['condition simple []' \
1248 'condition simple [["s","==","row0_s"]]' \
1249 'condition simple [["s","==","row1_s"]]' \
1250 'condition simple [["s","==","row0_s"]]' \
1251 '["idltest",
1252 {"op": "delete",
1253 "table": "simple6",
1254 "where": []}]']],
1255 [[000: change conditions
1256 001: inserted row: uuid=<0>
1257 001: name=first_row weak_ref=[] uuid=<0>
1258 001: updated columns: name weak_ref
1259 002: change conditions
1260 003: i=0 r=0 b=false s=row0_s u=<1> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<2>
1261 003: inserted row: uuid=<2>
1262 003: name=first_row weak_ref=[<2>] uuid=<0>
1263 003: updated columns: s
1264 004: change conditions
1265 005: i=0 r=0 b=false s=row1_s u=<1> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<3>
1266 005: inserted row: uuid=<3>
1267 005: updated columns: s
1268 006: change conditions
1269 007: deleted row: uuid=<3>
1270 007: i=0 r=0 b=false s=row0_s u=<1> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<2>
1271 007: i=0 r=0 b=false s=row1_s u=<1> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<3>
1272 007: inserted row: uuid=<2>
1273 007: name=first_row weak_ref=[<2>] uuid=<0>
1274 007: updated columns: s
1275 008: {"error":null,"result":[{"count":1}]}
1276 009: i=0 r=0 b=false s=row0_s u=<1> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<2>
1277 010: done
1278 ]])
1279
1280 OVSDB_CHECK_IDL_TRACK([track, simple idl, initially empty, various ops],
1281 [],
1282 [['["idltest",
1283 {"op": "insert",
1284 "table": "simple",
1285 "row": {"i": 1,
1286 "r": 2.0,
1287 "b": true,
1288 "s": "mystring",
1289 "u": ["uuid", "84f5c8f5-ac76-4dbc-a24f-8860eb407fc1"],
1290 "ia": ["set", [1, 2, 3]],
1291 "ra": ["set", [-0.5]],
1292 "ba": ["set", [true]],
1293 "sa": ["set", ["abc", "def"]],
1294 "ua": ["set", [["uuid", "69443985-7806-45e2-b35f-574a04e720f9"],
1295 ["uuid", "aad11ef0-816a-4b01-93e6-03b8b4256b98"]]]}},
1296 {"op": "insert",
1297 "table": "simple",
1298 "row": {}}]' \
1299 '["idltest",
1300 {"op": "update",
1301 "table": "simple",
1302 "where": [],
1303 "row": {"b": true}}]' \
1304 '["idltest",
1305 {"op": "update",
1306 "table": "simple",
1307 "where": [],
1308 "row": {"r": 123.5}}]' \
1309 '["idltest",
1310 {"op": "insert",
1311 "table": "simple",
1312 "row": {"i": -1,
1313 "r": 125,
1314 "b": false,
1315 "s": "",
1316 "ia": ["set", [1]],
1317 "ra": ["set", [1.5]],
1318 "ba": ["set", [false]],
1319 "sa": ["set", []],
1320 "ua": ["set", []]}}]' \
1321 '["idltest",
1322 {"op": "update",
1323 "table": "simple",
1324 "where": [["i", "<", 1]],
1325 "row": {"s": "newstring"}}]' \
1326 '["idltest",
1327 {"op": "delete",
1328 "table": "simple",
1329 "where": [["i", "==", 0]]}]' \
1330 'reconnect']],
1331 [[000: empty
1332 001: {"error":null,"result":[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]}]}
1333 002: i=1 r=2 b=true s=mystring u=<2> ia=[1 2 3] ra=[-0.5] ba=[true] sa=[abc def] ua=[<3> <4>] uuid=<0>
1334 002: inserted row: uuid=<0>
1335 002: updated columns: b ba i ia r ra s sa u ua
1336 003: {"error":null,"result":[{"count":2}]}
1337 004: i=0 r=0 b=true s= u=<5> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<1>
1338 004: updated columns: b
1339 005: {"error":null,"result":[{"count":2}]}
1340 006: i=0 r=123.5 b=true s= u=<5> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<1>
1341 006: i=1 r=123.5 b=true s=mystring u=<2> ia=[1 2 3] ra=[-0.5] ba=[true] sa=[abc def] ua=[<3> <4>] uuid=<0>
1342 006: updated columns: r
1343 006: updated columns: r
1344 007: {"error":null,"result":[{"uuid":["uuid","<6>"]}]}
1345 008: i=-1 r=125 b=false s= u=<5> ia=[1] ra=[1.5] ba=[false] sa=[] ua=[] uuid=<6>
1346 008: inserted row: uuid=<6>
1347 008: updated columns: ba i ia r ra
1348 009: {"error":null,"result":[{"count":2}]}
1349 010: i=-1 r=125 b=false s=newstring u=<5> ia=[1] ra=[1.5] ba=[false] sa=[] ua=[] uuid=<6>
1350 010: i=0 r=123.5 b=true s=newstring u=<5> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<1>
1351 010: updated columns: s
1352 010: updated columns: s
1353 011: {"error":null,"result":[{"count":1}]}
1354 012: deleted row: uuid=<1>
1355 012: i=0 r=123.5 b=true s=newstring u=<5> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<1>
1356 013: reconnect
1357 014: i=-1 r=125 b=false s=newstring u=<5> ia=[1] ra=[1.5] ba=[false] sa=[] ua=[] uuid=<6>
1358 014: i=1 r=123.5 b=true s=mystring u=<2> ia=[1 2 3] ra=[-0.5] ba=[true] sa=[abc def] ua=[<3> <4>] uuid=<0>
1359 014: updated columns: b ba i ia r ra s sa u ua
1360 014: updated columns: ba i ia r ra s
1361 015: done
1362 ]])
1363
1364 m4_define([OVSDB_CHECK_IDL_PARTIAL_UPDATE_MAP_COLUMN],
1365 [AT_SETUP([$1 - C])
1366 AT_KEYWORDS([ovsdb server idl partial update map column positive $5])
1367 AT_CHECK([ovsdb_start_idltest])
1368 m4_if([$2], [], [],
1369 [AT_CHECK([ovsdb-client transact unix:socket $2], [0], [ignore], [ignore])])
1370 AT_CHECK([test-ovsdb '-vPATTERN:console:test-ovsdb|%c|%m' -vjsonrpc -t10 -c idl-partial-update-map-column unix:socket $3],
1371 [0], [stdout], [ignore])
1372 AT_CHECK([sort stdout | uuidfilt]m4_if([$6],,, [[| $6]]),
1373 [0], [$4])
1374 OVSDB_SERVER_SHUTDOWN
1375 AT_CLEANUP])
1376
1377 OVSDB_CHECK_IDL_PARTIAL_UPDATE_MAP_COLUMN([map, simple2 idl-partial-update-map-column, initially populated],
1378 [['["idltest", {"op":"insert", "table":"simple2",
1379 "row":{"name":"myString1","smap":["map",[["key1","value1"],["key2","value2"]]]} }]']
1380 ],
1381 [],
1382 [[000: Getting records
1383 001: name=myString1 smap=[[key1 : value1],[key2 : value2]] imap=[]
1384 002: After insert element
1385 003: name=String2 smap=[[key1 : myList1],[key2 : value2]] imap=[[3 : myids2]]
1386 004: After insert duplicated element
1387 005: name=String2 smap=[[key1 : myList1],[key2 : value2]] imap=[[3 : myids2]]
1388 006: After delete element
1389 007: name=String2 smap=[[key2 : value2]] imap=[[3 : myids2]]
1390 008: After trying to delete a deleted element
1391 009: name=String2 smap=[[key2 : value2]] imap=[[3 : myids2]]
1392 010: End test
1393 ]])
1394
1395 OVSDB_CHECK_IDL_PY([partial-map idl],
1396 [['["idltest", {"op":"insert", "table":"simple2",
1397 "row":{"name":"myString1","smap":["map",[["key1","value1"],["key2","value2"]]]} }]']
1398 ],
1399 [?simple2:name,smap,imap 'partialmapinsertelement' 'partialmapinsertmultipleelements' 'partialmapdelelements' 'partialmapmutatenew'],
1400 [[000: name=myString1 smap=[(key1 value1) (key2 value2)] imap=[]
1401 001: commit, status=success
1402 002: name=String2 smap=[(key1 myList1) (key2 value2)] imap=[(3 myids2)]
1403 003: commit, status=success
1404 004: name=String2 smap=[(key1 myList1) (key2 myList2) (key3 myList3) (key4 myList4)] imap=[(3 myids2)]
1405 005: commit, status=success
1406 006: name=String2 smap=[(key2 myList2)] imap=[(3 myids2)]
1407 007: commit, status=success
1408 008: name=String2 smap=[(key2 myList2)] imap=[(3 myids2)]
1409 008: name=String2New smap=[(key1 newList1) (key2 newList2)] imap=[]
1410 009: done
1411 ]])
1412
1413 OVSDB_CHECK_IDL_PY([partial-map update set refmap idl],
1414 [['["idltest", {"op":"insert", "table":"simple3", "row":{"name":"myString1"}},
1415 {"op":"insert", "table":"simple5", "row":{"name":"myString2"}}]']],
1416 ['partialmapmutateirefmap'],
1417 [[000: name=myString1 uset=[]
1418 000: name=myString2 irefmap=[]
1419 001: commit, status=success
1420 002: name=myString1 uset=[]
1421 002: name=myString2 irefmap=[(1 <0>)]
1422 003: done
1423 ]])
1424
1425 m4_define([OVSDB_CHECK_IDL_PARTIAL_UPDATE_SET_COLUMN],
1426 [AT_SETUP([$1 - C])
1427 AT_KEYWORDS([ovsdb server idl partial update set column positive $5])
1428 AT_CHECK([ovsdb_start_idltest])
1429 m4_if([$2], [], [],
1430 [AT_CHECK([ovsdb-client transact unix:socket $2], [0], [ignore], [ignore])])
1431 AT_CHECK([test-ovsdb '-vPATTERN:console:test-ovsdb|%c|%m' -vjsonrpc -t10 -c idl-partial-update-set-column unix:socket $3],
1432 [0], [stdout], [ignore])
1433 AT_CHECK([sort stdout | uuidfilt]m4_if([$6],,, [[| $6]]),
1434 [0], [$4])
1435 OVSDB_SERVER_SHUTDOWN
1436 AT_CLEANUP])
1437
1438 OVSDB_CHECK_IDL_PARTIAL_UPDATE_SET_COLUMN([set, simple3 idl-partial-update-set-column, initially populated],
1439 [['["idltest", {"op":"insert", "table":"simple3",
1440 "row":{"name":"mySet1","uset":["set", [[ "uuid", "0005b872-f9e5-43be-ae02-3184b9680e75" ], [ "uuid", "000d2f6a-76af-412f-b59d-e7bcd3e84eff" ]]]} }]']
1441 ],
1442 [],
1443 [[000: Getting records
1444 001: name=mySet1 uset=[[<0>],[<1>]] uref=[]
1445 002: After rename+add new value
1446 003: name=String2 uset=[[<0>],[<1>],[<2>]] uref=[]
1447 004: After add new value
1448 005: name=String2 uset=[[<0>],[<1>],[<2>],[<3>]] uref=[]
1449 006: After delete value
1450 007: name=String2 uset=[[<0>],[<1>],[<3>]] uref=[]
1451 008: After trying to delete a deleted value
1452 009: name=String2 uset=[[<0>],[<1>],[<3>]] uref=[]
1453 010: After add to other table + set of strong ref
1454 011: name=String2 uset=[[<0>],[<1>],[<3>]] uref=[[<4>]]
1455 012: End test
1456 ]])
1457
1458 OVSDB_CHECK_IDL_PY([partial-set idl],
1459 [['["idltest", {"op":"insert", "table":"simple3", "uuid-name":"newrow",
1460 "row":{"name":"mySet1","uset":["set", [[ "uuid", "0005b872-f9e5-43be-ae02-3184b9680e75" ]]]} },
1461 {"op":"insert", "table":"simple4", "row":{"name":"seed"}},
1462 {"op":"mutate", "table":"simple3", "where":[["_uuid", "==", ["named-uuid", "newrow"]]],
1463 "mutations": [["uset", "insert", ["set", [["uuid", "000d2f6a-76af-412f-b59d-e7bcd3e84eff"]]]]]}]']
1464 ],
1465 ['partialrenamesetadd' 'partialduplicateadd' 'partialsetdel' 'partialsetref' 'partialsetoverrideops' 'partialsetadddelete' 'partialsetmutatenew'],
1466 [[000: name=mySet1 uset=[<0> <1>]
1467 001: commit, status=success
1468 002: name=String2 uset=[<0> <1> <2>]
1469 003: commit, status=success
1470 004: name=String2 uset=[<0> <1> <2> <3>]
1471 005: commit, status=success
1472 006: name=String2 uset=[<0> <1> <3>]
1473 007: commit, status=success
1474 008: name=String2 uset=[<0> <1> <3>]
1475 009: commit, status=success
1476 010: name=String2 uset=[<3>]
1477 011: commit, status=success
1478 012: name=String2 uset=[<4> <5>]
1479 013: commit, status=success
1480 014: name=String2 uset=[<4> <5>]
1481 014: name=String3 uset=[<6>]
1482 015: done
1483 ]])
1484
1485 m4_define([OVSDB_CHECK_IDL_NOTIFY],
1486 [OVSDB_CHECK_IDL_PY([$1], [], [$2], [$3], [notify $4], [$5])
1487 OVSDB_CHECK_IDL_SSL_PY([$1], [], [$2], [$3], [notify $4], [$5])])
1488
1489 OVSDB_CHECK_IDL_NOTIFY([simple idl verify notify],
1490 [['track-notify' \
1491 '["idltest",
1492 {"op": "insert",
1493 "table": "simple",
1494 "row": {"i": 1,
1495 "r": 2.0,
1496 "b": true,
1497 "s": "mystring",
1498 "u": ["uuid", "84f5c8f5-ac76-4dbc-a24f-8860eb407fc1"],
1499 "ia": ["set", [1, 2, 3]],
1500 "ra": ["set", [-0.5]],
1501 "ba": ["set", [true]],
1502 "sa": ["set", ["abc", "def"]],
1503 "ua": ["set", [["uuid", "69443985-7806-45e2-b35f-574a04e720f9"],
1504 ["uuid", "aad11ef0-816a-4b01-93e6-03b8b4256b98"]]]}},
1505 {"op": "insert",
1506 "table": "simple",
1507 "row": {}}]' \
1508 '["idltest",
1509 {"op": "update",
1510 "table": "simple",
1511 "where": [],
1512 "row": {"b": false}}]' \
1513 '["idltest",
1514 {"op": "update",
1515 "table": "simple",
1516 "where": [],
1517 "row": {"r": 123.5}}]' \
1518 '["idltest",
1519 {"op": "insert",
1520 "table": "simple",
1521 "row": {"i": -1,
1522 "r": 125,
1523 "b": false,
1524 "s": "",
1525 "ia": ["set", [1]],
1526 "ra": ["set", [1.5]],
1527 "ba": ["set", [false]],
1528 "sa": ["set", []],
1529 "ua": ["set", []]}}]' \
1530 '["idltest",
1531 {"op": "update",
1532 "table": "simple",
1533 "where": [["i", "<", 1]],
1534 "row": {"s": "newstring"}}]' \
1535 '["idltest",
1536 {"op": "delete",
1537 "table": "simple",
1538 "where": [["i", "==", 0]]}]' \
1539 'reconnect']],
1540 [[000: empty
1541 000: event:create, row={uuid=<0>}, updates=None
1542 000: event:create, row={uuid=<1>}, updates=None
1543 001: {"error":null,"result":[{"uuid":["uuid","<2>"]},{"uuid":["uuid","<3>"]}]}
1544 002: event:create, row={i=0 r=0 b=false s= u=<4> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<3>}, updates=None
1545 002: event:create, row={i=1 r=2 b=true s=mystring u=<5> ia=[1 2 3] ra=[-0.5] ba=[true] sa=[abc def] ua=[<6> <7>] uuid=<2>}, updates=None
1546 002: i=0 r=0 b=false s= u=<4> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<3>
1547 002: i=1 r=2 b=true s=mystring u=<5> ia=[1 2 3] ra=[-0.5] ba=[true] sa=[abc def] ua=[<6> <7>] uuid=<2>
1548 003: {"error":null,"result":[{"count":2}]}
1549 004: event:update, row={i=1 r=2 b=false s=mystring u=<5> ia=[1 2 3] ra=[-0.5] ba=[true] sa=[abc def] ua=[<6> <7>] uuid=<2>}, updates={b=true uuid=<2>}
1550 004: i=0 r=0 b=false s= u=<4> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<3>
1551 004: i=1 r=2 b=false s=mystring u=<5> ia=[1 2 3] ra=[-0.5] ba=[true] sa=[abc def] ua=[<6> <7>] uuid=<2>
1552 005: {"error":null,"result":[{"count":2}]}
1553 006: event:update, row={i=0 r=123.5 b=false s= u=<4> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<3>}, updates={r=0 uuid=<3>}
1554 006: event:update, row={i=1 r=123.5 b=false s=mystring u=<5> ia=[1 2 3] ra=[-0.5] ba=[true] sa=[abc def] ua=[<6> <7>] uuid=<2>}, updates={r=2 uuid=<2>}
1555 006: i=0 r=123.5 b=false s= u=<4> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<3>
1556 006: i=1 r=123.5 b=false s=mystring u=<5> ia=[1 2 3] ra=[-0.5] ba=[true] sa=[abc def] ua=[<6> <7>] uuid=<2>
1557 007: {"error":null,"result":[{"uuid":["uuid","<8>"]}]}
1558 008: event:create, row={i=-1 r=125 b=false s= u=<4> ia=[1] ra=[1.5] ba=[false] sa=[] ua=[] uuid=<8>}, updates=None
1559 008: i=-1 r=125 b=false s= u=<4> ia=[1] ra=[1.5] ba=[false] sa=[] ua=[] uuid=<8>
1560 008: i=0 r=123.5 b=false s= u=<4> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<3>
1561 008: i=1 r=123.5 b=false s=mystring u=<5> ia=[1 2 3] ra=[-0.5] ba=[true] sa=[abc def] ua=[<6> <7>] uuid=<2>
1562 009: {"error":null,"result":[{"count":2}]}
1563 010: event:update, row={i=-1 r=125 b=false s=newstring u=<4> ia=[1] ra=[1.5] ba=[false] sa=[] ua=[] uuid=<8>}, updates={s= uuid=<8>}
1564 010: event:update, row={i=0 r=123.5 b=false s=newstring u=<4> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<3>}, updates={s= uuid=<3>}
1565 010: i=-1 r=125 b=false s=newstring u=<4> ia=[1] ra=[1.5] ba=[false] sa=[] ua=[] uuid=<8>
1566 010: i=0 r=123.5 b=false s=newstring u=<4> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<3>
1567 010: i=1 r=123.5 b=false s=mystring u=<5> ia=[1 2 3] ra=[-0.5] ba=[true] sa=[abc def] ua=[<6> <7>] uuid=<2>
1568 011: {"error":null,"result":[{"count":1}]}
1569 012: event:delete, row={i=0 r=123.5 b=false s=newstring u=<4> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<3>}, updates=None
1570 012: i=-1 r=125 b=false s=newstring u=<4> ia=[1] ra=[1.5] ba=[false] sa=[] ua=[] uuid=<8>
1571 012: i=1 r=123.5 b=false s=mystring u=<5> ia=[1 2 3] ra=[-0.5] ba=[true] sa=[abc def] ua=[<6> <7>] uuid=<2>
1572 013: reconnect
1573 014: event:create, row={i=-1 r=125 b=false s=newstring u=<4> ia=[1] ra=[1.5] ba=[false] sa=[] ua=[] uuid=<8>}, updates=None
1574 014: event:create, row={i=1 r=123.5 b=false s=mystring u=<5> ia=[1 2 3] ra=[-0.5] ba=[true] sa=[abc def] ua=[<6> <7>] uuid=<2>}, updates=None
1575 014: event:create, row={uuid=<0>}, updates=None
1576 014: event:create, row={uuid=<1>}, updates=None
1577 014: i=-1 r=125 b=false s=newstring u=<4> ia=[1] ra=[1.5] ba=[false] sa=[] ua=[] uuid=<8>
1578 014: i=1 r=123.5 b=false s=mystring u=<5> ia=[1 2 3] ra=[-0.5] ba=[true] sa=[abc def] ua=[<6> <7>] uuid=<2>
1579 015: done
1580 ]])
1581
1582 # Tests to verify the functionality of the one column compound index.
1583 # It tests index for one column string and integer indexes.
1584 # The run of test-ovsdb generates the output of the display of data using the different indexes defined in
1585 # the program.
1586 # Then, some at_checks are used to verify the correctness of the corresponding index as well as the existence
1587 # of all the rows involved in the test.
1588 m4_define([OVSDB_CHECK_IDL_COMPOUND_INDEX_SINGLE_COLUMN_C],
1589 [AT_SETUP([$1 - C])
1590 AT_KEYWORDS([ovsdb server idl compound_index_single_column compound_index positive $5])
1591 AT_CHECK([ovsdb_start_idltest])
1592 m4_if([$2], [], [],
1593 [AT_CHECK([ovsdb-client transact unix:socket $2], [0], [ignore], [ignore])])
1594 # Generate the data to be tested.
1595 AT_CHECK([test-ovsdb '-vPATTERN:console:test-ovsdb|%c|%m' -vjsonrpc -t10 -c idl-compound-index unix:socket $3],
1596 [0], [stdout], [ignore])
1597 # Filter the rows of data that corresponds to the string index eliminating the extra columns of data.
1598 # This is done to verifiy that the output data is in the correct and expected order.
1599 AT_CHECK([[cat stdout | grep -oh '[0-9]\{3\}: s=.*' | sed -e 's/ i=.*//g']],
1600 [0], [$4])
1601 # Here, the data is filtered and sorted in order to have all the rows in the index and be
1602 # able to determined that all the involved rows are present.
1603 AT_CHECK([[cat stdout | grep -oh '[0-9]\{3\}: s=.*' | sort -k 1,1n -k 2,2 -k 3,3]],
1604 [0], [$5])
1605 # Filter the rows of data that corresponds to the integer index eliminating the extra columns of data.
1606 # This is done to verifiy that the output data is in the correct and expected order.
1607 AT_CHECK([[cat stdout | grep -oh '[0-9]\{3\}: i=.*' | sed -e 's/ s=.*//g']],
1608 [0], [$6])
1609 # Here again, the data is filtered and sorted in order to have all the rows in the index and be
1610 # able to determined that all the involved rows are present.
1611 AT_CHECK([[cat stdout | grep -oh '[0-9]\{3\}: i=.*' | sort -k 1,1n -k 2,2 -k 3,3]],
1612 [0], [$7])
1613 OVSDB_SERVER_SHUTDOWN
1614 AT_CLEANUP])
1615
1616 OVSDB_CHECK_IDL_COMPOUND_INDEX_SINGLE_COLUMN_C([Compound_index, single column test ],
1617 [['["idltest",
1618 {"op": "insert", "table": "simple", "row": {"s":"List000", "i": 1, "b":true, "r":101.0}},
1619 {"op": "insert", "table": "simple", "row": {"s":"List000", "i": 2, "b":false, "r":102.0}},
1620 {"op": "insert", "table": "simple", "row": {"s":"List000", "i": 10, "b":true, "r":110.0}},
1621 {"op": "insert", "table": "simple", "row": {"s":"List001", "i": 1, "b":false, "r":110.0}},
1622 {"op": "insert", "table": "simple", "row": {"s":"List001", "i": 2, "b":true, "r":120.0}},
1623 {"op": "insert", "table": "simple", "row": {"s":"List001", "i": 2, "b":true, "r":122.0}},
1624 {"op": "insert", "table": "simple", "row": {"s":"List001", "i": 4, "b":true, "r":130.0}},
1625 {"op": "insert", "table": "simple", "row": {"s":"List005", "i": 5, "b":true, "r":130.0}},
1626 {"op": "insert", "table": "simple", "row": {"s":"List020", "i": 20, "b":true, "r":220.0}},
1627 {"op": "insert", "table": "simple", "row": {"s":"List020", "i": 19, "b":true, "r":219.0}}
1628 ]']],
1629 [idl_compound_index_single_column],
1630 [001: s=List000
1631 001: s=List000
1632 001: s=List000
1633 001: s=List001
1634 001: s=List001
1635 001: s=List001
1636 001: s=List001
1637 001: s=List005
1638 001: s=List020
1639 001: s=List020
1640 003: s=List001
1641 003: s=List001
1642 003: s=List001
1643 003: s=List001
1644 ],
1645 [001: s=List000 i=1 b=True r=101.000000
1646 001: s=List000 i=10 b=True r=110.000000
1647 001: s=List000 i=2 b=False r=102.000000
1648 001: s=List001 i=1 b=False r=110.000000
1649 001: s=List001 i=2 b=True r=120.000000
1650 001: s=List001 i=2 b=True r=122.000000
1651 001: s=List001 i=4 b=True r=130.000000
1652 001: s=List005 i=5 b=True r=130.000000
1653 001: s=List020 i=19 b=True r=219.000000
1654 001: s=List020 i=20 b=True r=220.000000
1655 003: s=List001 i=1 b=False r=110.000000
1656 003: s=List001 i=2 b=True r=120.000000
1657 003: s=List001 i=2 b=True r=122.000000
1658 003: s=List001 i=4 b=True r=130.000000
1659 ],
1660 [002: i=1
1661 002: i=1
1662 002: i=2
1663 002: i=2
1664 002: i=2
1665 002: i=4
1666 002: i=5
1667 002: i=10
1668 002: i=19
1669 002: i=20
1670 004: i=5
1671 005: i=4
1672 005: i=5
1673 006: i=5
1674 006: i=10
1675 006: i=19
1676 006: i=20
1677 006: i=54
1678 007: i=5
1679 007: i=19
1680 007: i=20
1681 007: i=30
1682 007: i=54
1683 008: i=1
1684 008: i=1
1685 008: i=2
1686 008: i=2
1687 008: i=2
1688 008: i=5
1689 008: i=19
1690 008: i=20
1691 008: i=30
1692 008: i=54
1693 ],
1694 [002: i=1 s=List000 b=True r=101.000000
1695 002: i=1 s=List001 b=False r=110.000000
1696 002: i=10 s=List000 b=True r=110.000000
1697 002: i=19 s=List020 b=True r=219.000000
1698 002: i=2 s=List000 b=False r=102.000000
1699 002: i=2 s=List001 b=True r=120.000000
1700 002: i=2 s=List001 b=True r=122.000000
1701 002: i=20 s=List020 b=True r=220.000000
1702 002: i=4 s=List001 b=True r=130.000000
1703 002: i=5 s=List005 b=True r=130.000000
1704 004: i=5 s=List005 b=True r=130.000000
1705 005: i=4 s=List001 b=True r=130.000000
1706 005: i=5 s=List005 b=True r=130.000000
1707 006: i=10 s=List000 b=True r=110.000000
1708 006: i=19 s=List020 b=True r=219.000000
1709 006: i=20 s=List020 b=True r=220.000000
1710 006: i=5 s=List005 b=True r=130.000000
1711 006: i=54 s=Lista054 b=False r=0.000000
1712 007: i=19 s=List020 b=True r=219.000000
1713 007: i=20 s=List020 b=True r=220.000000
1714 007: i=30 s=List000 b=True r=110.000000
1715 007: i=5 s=List005 b=True r=130.000000
1716 007: i=54 s=Lista054 b=False r=0.000000
1717 008: i=1 s=List000 b=True r=101.000000
1718 008: i=1 s=List001 b=False r=110.000000
1719 008: i=19 s=List020 b=True r=219.000000
1720 008: i=2 s=List000 b=False r=102.000000
1721 008: i=2 s=List001 b=True r=120.000000
1722 008: i=2 s=List001 b=True r=122.000000
1723 008: i=20 s=List020 b=True r=220.000000
1724 008: i=30 s=List000 b=True r=110.000000
1725 008: i=5 s=List005 b=True r=130.000000
1726 008: i=54 s=Lista054 b=False r=0.000000
1727 ])
1728
1729 # Tests to verify the functionality of two column compound index.
1730 # It tests index for two columns using string and integer fields.
1731 # The run of test-ovsdb generates the output of the display of data using the different indexes defined in
1732 # the program.
1733 # Then, some at_checks are used to verify the correctness of the corresponding index as well as the existence
1734 # of all the rows involved in the test.
1735 m4_define([OVSDB_CHECK_IDL_COMPOUND_INDEX_DOUBLE_COLUMN_C],
1736 [AT_SETUP([$1 - C])
1737 AT_KEYWORDS([ovsdb server idl compound_index_double_column compound_index positive $5])
1738 AT_CHECK([ovsdb_start_idltest])
1739 m4_if([$2], [], [],
1740 [AT_CHECK([ovsdb-client transact unix:socket $2], [0], [ignore], [ignore])])
1741 # Generate the data to be tested.
1742 AT_CHECK([test-ovsdb '-vPATTERN:console:test-ovsdb|%c|%m' -vjsonrpc -t10 -c idl-compound-index unix:socket $3],
1743 [0], [stdout], [ignore])
1744 # Filter the rows of data that corresponds to the string-integer index eliminating the extra columns of data.
1745 # This is done to verifiy that the output data is in the correct and expected order.
1746 AT_CHECK([[cat stdout | grep -oh '[0-9]\{3\}: s=.*' | sed -e 's/ b=.*//g']],
1747 [0], [$4])
1748 # Here, the data is filtered and sorted in order to have all the rows in the index and be
1749 # able to determined that all the involved rows are present.
1750 AT_CHECK([[cat stdout | grep -oh '[0-9]\{3\}: s=.*' | sort -k 1,1n -k 2,2 -k 3,3]],
1751 [0], [$5])
1752 # Filter the rows of data that corresponds to the integer index eliminating the extra columns of data.
1753 # This is done to verifiy that the output data is in the correct and expected order.
1754 AT_CHECK([[cat stdout | grep -oh '[0-9]\{3\}: i=.*' | sed -e 's/ b=.*//g']],
1755 [0], [$6])
1756 # Here again, the data is filtered and sorted in order to have all the rows in the index and be
1757 # able to determined that all the involved rows are present.
1758 AT_CHECK([[cat stdout | grep -oh '[0-9]\{3\}: i=.*' | sort -k 1,1n -k 2,2 -k 3,3]],
1759 [0], [$7])
1760 OVSDB_SERVER_SHUTDOWN
1761 AT_CLEANUP])
1762
1763 OVSDB_CHECK_IDL_COMPOUND_INDEX_DOUBLE_COLUMN_C([Compound_index, double column test ],
1764 [['["idltest",
1765 {"op": "insert", "table": "simple", "row": {"s":"List000", "i": 1, "b":true, "r":101.0}},
1766 {"op": "insert", "table": "simple", "row": {"s":"List000", "i": 2, "b":false, "r":102.0}},
1767 {"op": "insert", "table": "simple", "row": {"s":"List000", "i": 10, "b":true, "r":110.0}},
1768 {"op": "insert", "table": "simple", "row": {"s":"List001", "i": 1, "b":false, "r":110.0}},
1769 {"op": "insert", "table": "simple", "row": {"s":"List001", "i": 2, "b":true, "r":120.0}},
1770 {"op": "insert", "table": "simple", "row": {"s":"List001", "i": 2, "b":true, "r":122.0}},
1771 {"op": "insert", "table": "simple", "row": {"s":"List001", "i": 4, "b":true, "r":130.0}},
1772 {"op": "insert", "table": "simple", "row": {"s":"List005", "i": 5, "b":true, "r":130.0}},
1773 {"op": "insert", "table": "simple", "row": {"s":"List020", "i": 20, "b":true, "r":220.0}},
1774 {"op": "insert", "table": "simple", "row": {"s":"List020", "i": 19, "b":true, "r":219.0}}
1775 ]']],
1776 [idl_compound_index_double_column],
1777 [001: s=List000 i=1
1778 001: s=List000 i=2
1779 001: s=List000 i=10
1780 001: s=List001 i=1
1781 001: s=List001 i=2
1782 001: s=List001 i=2
1783 001: s=List001 i=4
1784 001: s=List005 i=5
1785 001: s=List020 i=19
1786 001: s=List020 i=20
1787 002: s=List000 i=10
1788 002: s=List000 i=2
1789 002: s=List000 i=1
1790 002: s=List001 i=4
1791 002: s=List001 i=2
1792 002: s=List001 i=2
1793 002: s=List001 i=1
1794 002: s=List005 i=5
1795 002: s=List020 i=20
1796 002: s=List020 i=19
1797 003: s=List000 i=10
1798 004: s=List001 i=1
1799 004: s=List001 i=2
1800 004: s=List001 i=2
1801 004: s=List001 i=4
1802 004: s=List005 i=5
1803 ],
1804 [001: s=List000 i=1 b=True r=101.000000
1805 001: s=List000 i=10 b=True r=110.000000
1806 001: s=List000 i=2 b=False r=102.000000
1807 001: s=List001 i=1 b=False r=110.000000
1808 001: s=List001 i=2 b=True r=120.000000
1809 001: s=List001 i=2 b=True r=122.000000
1810 001: s=List001 i=4 b=True r=130.000000
1811 001: s=List005 i=5 b=True r=130.000000
1812 001: s=List020 i=19 b=True r=219.000000
1813 001: s=List020 i=20 b=True r=220.000000
1814 002: s=List000 i=1 b=True r=101.000000
1815 002: s=List000 i=10 b=True r=110.000000
1816 002: s=List000 i=2 b=False r=102.000000
1817 002: s=List001 i=1 b=False r=110.000000
1818 002: s=List001 i=2 b=True r=120.000000
1819 002: s=List001 i=2 b=True r=122.000000
1820 002: s=List001 i=4 b=True r=130.000000
1821 002: s=List005 i=5 b=True r=130.000000
1822 002: s=List020 i=19 b=True r=219.000000
1823 002: s=List020 i=20 b=True r=220.000000
1824 003: s=List000 i=10 b=True r=110.000000
1825 004: s=List001 i=1 b=False r=110.000000
1826 004: s=List001 i=2 b=True r=120.000000
1827 004: s=List001 i=2 b=True r=122.000000
1828 004: s=List001 i=4 b=True r=130.000000
1829 004: s=List005 i=5 b=True r=130.000000
1830 ],
1831 [005: i=1 s=List000
1832 005: i=1 s=List001
1833 005: i=2 s=List000
1834 005: i=2 s=List001
1835 005: i=2 s=List001
1836 005: i=4 s=List001
1837 005: i=5 s=List005
1838 005: i=10 s=List000
1839 005: i=19 s=List020
1840 005: i=20 s=List020
1841 006: i=20 s=List020
1842 006: i=19 s=List020
1843 006: i=10 s=List000
1844 006: i=5 s=List005
1845 006: i=4 s=List001
1846 006: i=2 s=List000
1847 006: i=2 s=List001
1848 006: i=2 s=List001
1849 006: i=1 s=List000
1850 006: i=1 s=List001
1851 ],
1852 [005: i=1 s=List000 b=True r=101.000000
1853 005: i=1 s=List001 b=False r=110.000000
1854 005: i=10 s=List000 b=True r=110.000000
1855 005: i=19 s=List020 b=True r=219.000000
1856 005: i=2 s=List000 b=False r=102.000000
1857 005: i=2 s=List001 b=True r=120.000000
1858 005: i=2 s=List001 b=True r=122.000000
1859 005: i=20 s=List020 b=True r=220.000000
1860 005: i=4 s=List001 b=True r=130.000000
1861 005: i=5 s=List005 b=True r=130.000000
1862 006: i=1 s=List000 b=True r=101.000000
1863 006: i=1 s=List001 b=False r=110.000000
1864 006: i=10 s=List000 b=True r=110.000000
1865 006: i=19 s=List020 b=True r=219.000000
1866 006: i=2 s=List000 b=False r=102.000000
1867 006: i=2 s=List001 b=True r=120.000000
1868 006: i=2 s=List001 b=True r=122.000000
1869 006: i=20 s=List020 b=True r=220.000000
1870 006: i=4 s=List001 b=True r=130.000000
1871 006: i=5 s=List005 b=True r=130.000000
1872 ])
1873
1874 m4_define([OVSDB_CHECK_IDL_COMPOUND_INDEX_WITH_REF],
1875 [AT_SETUP([$1 - C])
1876 AT_KEYWORDS([ovsdb server idl compound_index compound_index_with_ref positive $5])
1877 AT_CHECK([ovsdb_start_idltest])
1878 m4_if([$2], [], [],
1879 [AT_CHECK([ovsdb-client transact unix:socket $2], [0], [ignore], [ignore])])
1880 AT_CHECK([test-ovsdb '-vPATTERN:console:test-ovsdb|%c|%m' -vjsonrpc -t10 -c idl-compound-index-with-ref unix:socket $3],
1881 [0], [stdout], [ignore])
1882 AT_CHECK([sort stdout | uuidfilt]m4_if([$6],,, [[| $6]]),
1883 [0], [$4])
1884 OVSDB_SERVER_SHUTDOWN
1885 AT_CLEANUP])
1886
1887 OVSDB_CHECK_IDL_COMPOUND_INDEX_WITH_REF([set, simple3 idl-compound-index-with-ref, initially populated],
1888 [],
1889 [],
1890 [[000: After add to other table + set of strong ref
1891 001: name= uset=[] uref=[[<0>]]
1892 002: check simple4: not empty
1893 003: Query using index with reference
1894 004: name= uset=[] uref=[[<0>]]
1895 005: After delete
1896 007: check simple4: empty
1897 008: End test
1898 ]])
1899
1900 m4_define([CHECK_STREAM_OPEN_BLOCK],
1901 [AT_SETUP([Check stream open block - $1 - $3])
1902 AT_SKIP_IF([test "$3" = "tcp6" && test "$IS_WIN32" = "yes"])
1903 AT_SKIP_IF([test "$3" = "tcp6" && test "$HAVE_IPV6" = "no"])
1904 AT_KEYWORDS([ovsdb server stream open_block $3])
1905 AT_CHECK([ovsdb_start_idltest "ptcp:0:$4"])
1906 PARSE_LISTENING_PORT([ovsdb-server.log], [TCP_PORT])
1907 WRONG_PORT=$(($TCP_PORT + 101))
1908 AT_CHECK([$2 tcp:$4:$TCP_PORT], [0], [ignore])
1909 AT_CHECK([$2 tcp:$4:$WRONG_PORT], [1], [ignore], [ignore])
1910 OVSDB_SERVER_SHUTDOWN
1911 AT_CHECK([$2 tcp:$4:$TCP_PORT], [1], [ignore], [ignore])
1912 AT_CLEANUP])
1913
1914 CHECK_STREAM_OPEN_BLOCK([C], [test-stream], [tcp], [127.0.0.1])
1915 CHECK_STREAM_OPEN_BLOCK([C], [test-stream], [tcp6], [[[::1]]])
1916 CHECK_STREAM_OPEN_BLOCK([Python3], [$PYTHON3 $srcdir/test-stream.py],
1917 [tcp], [127.0.0.1])
1918 CHECK_STREAM_OPEN_BLOCK([Python3], [$PYTHON3 $srcdir/test-stream.py],
1919 [tcp6], [[[::1]]])
1920
1921 # same as OVSDB_CHECK_IDL but uses Python IDL implementation with tcp
1922 # with multiple remotes to assert the idl connects to the leader of the Raft cluster
1923 m4_define([OVSDB_CHECK_IDL_LEADER_ONLY_PY],
1924 [AT_SETUP([$1 - Python3 (leader only)])
1925 AT_SKIP_IF([test "$IS_ARM64" = "yes"])
1926 AT_KEYWORDS([ovsdb server idl Python leader_only with tcp socket])
1927 m4_define([LPBK],[127.0.0.1])
1928 OVSDB_CLUSTER_START_IDLTEST([$2], ["ptcp:0:"LPBK])
1929 PARSE_LISTENING_PORT([s2.log], [TCP_PORT_1])
1930 PARSE_LISTENING_PORT([s3.log], [TCP_PORT_2])
1931 PARSE_LISTENING_PORT([s1.log], [TCP_PORT_3])
1932 remotes=tcp:LPBK:$TCP_PORT_1,tcp:LPBK:$TCP_PORT_2,tcp:LPBK:$TCP_PORT_3
1933 pids=$(cat s2.pid s3.pid s1.pid | tr '\n' ',')
1934 echo $pids
1935 AT_CHECK([$PYTHON3 $srcdir/test-ovsdb.py -t30 idl-cluster $srcdir/idltest.ovsschema $remotes $pids $3],
1936 [0], [stdout], [ignore])
1937 remote=$(ovsdb_cluster_leader $remotes "idltest")
1938 leader=$(echo $remote | cut -d'|' -f 1)
1939 AT_CHECK([grep -F -- "${leader}" stdout], [0], [ignore])
1940 AT_CLEANUP])
1941
1942 OVSDB_CHECK_IDL_LEADER_ONLY_PY([Check Python IDL connects to leader], 3, ['remote'])
1943 OVSDB_CHECK_IDL_LEADER_ONLY_PY([Check Python IDL reconnects to leader], 3, ['remote' '+remotestop' 'remote'])
1944
1945 # same as OVSDB_CHECK_IDL but uses C IDL implementation with tcp
1946 # with multiple remotes.
1947 m4_define([OVSDB_CHECK_CLUSTER_IDL_C],
1948 [AT_SETUP([$1 - C - tcp])
1949 AT_KEYWORDS([ovsdb server idl positive tcp socket $5])
1950 m4_define([LPBK],[127.0.0.1])
1951 OVSDB_CLUSTER_START_IDLTEST([$2], ["ptcp:0:"LPBK])
1952 PARSE_LISTENING_PORT([s1.log], [TCP_PORT_1])
1953 PARSE_LISTENING_PORT([s2.log], [TCP_PORT_2])
1954 PARSE_LISTENING_PORT([s3.log], [TCP_PORT_3])
1955 remotes=tcp:LPBK:$TCP_PORT_1,tcp:LPBK:$TCP_PORT_2,tcp:LPBK:$TCP_PORT_3
1956
1957 m4_if([$3], [], [],
1958 [AT_CHECK([ovsdb-client transact $remotes $3], [0], [ignore], [ignore])])
1959 AT_CHECK([test-ovsdb '-vPATTERN:console:test-ovsdb|%c|%m' -vjsonrpc -t10 idl tcp:LPBK:$TCP_PORT_1 $4],
1960 [0], [stdout], [ignore])
1961 AT_CHECK([sort stdout | uuidfilt]m4_if([$7],,, [[| $7]]),
1962 [0], [$5])
1963 AT_CLEANUP])
1964
1965 # Checks that monitor_cond_since works fine when disconnects happen
1966 # with cond_change requests in flight (i.e., IDL is properly updated).
1967 OVSDB_CHECK_CLUSTER_IDL_C([simple idl, monitor_cond_since, cluster disconnect],
1968 3,
1969 [['["idltest",
1970 {"op": "insert",
1971 "table": "simple",
1972 "row": {"i": 1,
1973 "r": 1.0,
1974 "b": true}},
1975 {"op": "insert",
1976 "table": "simple",
1977 "row": {"i": 2,
1978 "r": 1.0,
1979 "b": true}}]']],
1980 [['condition simple []' \
1981 'condition simple [["i","==",2]]' \
1982 'condition simple [["i","==",1]]' \
1983 '+reconnect' \
1984 '["idltest",
1985 {"op": "update",
1986 "table": "simple",
1987 "where": [["i", "==", 1]],
1988 "row": {"r": 2.0 }}]']],
1989 [[000: change conditions
1990 001: empty
1991 002: change conditions
1992 003: i=2 r=1 b=true s= u=<0> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<1>
1993 004: change conditions
1994 005: reconnect
1995 006: i=2 r=1 b=true s= u=<0> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<1>
1996 007: {"error":null,"result":[{"count":1}]}
1997 008: i=1 r=2 b=true s= u=<0> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<2>
1998 009: done
1999 ]])