]> git.proxmox.com Git - mirror_ovs.git/blob - tests/ovsdb-idl.at
ovsdb-idl.at: Return stream open_block python tests.
[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 singleton table (database needs upgrade?)
971 test-ovsdb|ovsdb_idl|link1 table in idltest database lacks l2 column (database needs upgrade?)
972 ])
973
974 # Check that ovsdb-idl sent on "monitor" request and that it didn't
975 # mention that table or column, and (for paranoia) that it did mention another
976 # table and column.
977 AT_CHECK([grep -c '"monitor\|monitor_cond"' stderr], [0], [2
978 ])
979 AT_CHECK([grep '"monitor\|monitor_cond"' stderr | grep link2], [1])
980 AT_CHECK([grep '"monitor\|monitor_cond"' stderr | grep l2], [1])
981 AT_CHECK([grep '"monitor\|monitor_cond"' stderr | grep -c '"link1"'], [0], [1
982 ])
983 AT_CHECK([grep '"monitor\|monitor_cond"' stderr | grep -c '"ua"'], [0], [1
984 ])
985 OVSDB_SERVER_SHUTDOWN
986 AT_CLEANUP
987
988 m4_define([OVSDB_CHECK_IDL_FETCH_COLUMNS_PY],
989 [AT_SETUP([$1 - Python3 - fetch])
990 AT_KEYWORDS([ovsdb server idl positive Python increment fetch $6])
991 AT_CHECK([ovsdb_start_idltest])
992 m4_if([$2], [], [],
993 [AT_CHECK([ovsdb-client transact unix:socket $2], [0], [ignore], [ignore])])
994 AT_CHECK([$PYTHON3 $srcdir/test-ovsdb.py -t10 idl $srcdir/idltest.ovsschema unix:socket [$3] $4],
995 [0], [stdout], [ignore])
996 AT_CHECK([sort stdout | uuidfilt]m4_if([$7],,, [[| $7]]),
997 [0], [$5])
998 OVSDB_SERVER_SHUTDOWN
999 AT_CLEANUP])
1000
1001 m4_define([OVSDB_CHECK_IDL_FETCH_COLUMNS],
1002 [OVSDB_CHECK_IDL_FETCH_COLUMNS_PY($@)])
1003
1004 OVSDB_CHECK_IDL_FETCH_COLUMNS([simple idl, initially populated],
1005 [['["idltest",
1006 {"op": "insert",
1007 "table": "simple",
1008 "row": {"i": 1,
1009 "r": 2.0,
1010 "b": true,
1011 "s": "mystring",
1012 "u": ["uuid", "84f5c8f5-ac76-4dbc-a24f-8860eb407fc1"],
1013 "ia": ["set", [1, 2, 3]],
1014 "ra": ["set", [-0.5]],
1015 "ba": ["set", [true]],
1016 "sa": ["set", ["abc", "def"]],
1017 "ua": ["set", [["uuid", "69443985-7806-45e2-b35f-574a04e720f9"],
1018 ["uuid", "aad11ef0-816a-4b01-93e6-03b8b4256b98"]]]}},
1019 {"op": "insert",
1020 "table": "simple",
1021 "row": {}}]']],
1022 [?simple:i,r!],
1023 ['fetch 0 r'],
1024 [[000: i=0 uuid=<0>
1025 000: i=1 uuid=<1>
1026 001: commit, status=success
1027 002: i=0 r=0 uuid=<0>
1028 002: i=1 uuid=<1>
1029 003: done
1030 ]])
1031
1032 m4_define([OVSDB_CHECK_IDL_WO_MONITOR_COND_PY],
1033 [AT_SETUP([$1 - Python3])
1034 AT_KEYWORDS([ovsdb server idl Python monitor $4])
1035 AT_CHECK([ovsdb_start_idltest])
1036 AT_CHECK([ovs-appctl -t ovsdb-server ovsdb-server/disable-monitor-cond])
1037 AT_CHECK([$PYTHON3 $srcdir/test-ovsdb.py -t10 idl $srcdir/idltest.ovsschema unix:socket $2],
1038 [0], [stdout], [ignore])
1039 AT_CHECK([sort stdout | uuidfilt]m4_if([$5],,, [[| $5]]),
1040 [0], [$3])
1041 OVSDB_SERVER_SHUTDOWN
1042 AT_CLEANUP])
1043
1044 m4_define([OVSDB_CHECK_IDL_WO_MONITOR_COND],
1045 [OVSDB_CHECK_IDL_WO_MONITOR_COND_PY($@)])
1046
1047
1048 OVSDB_CHECK_IDL_WO_MONITOR_COND([simple idl disable monitor-cond],
1049 [['["idltest",
1050 {"op": "insert",
1051 "table": "simple",
1052 "row": {"i": 1,
1053 "r": 2.0,
1054 "b": true,
1055 "s": "mystring",
1056 "u": ["uuid", "84f5c8f5-ac76-4dbc-a24f-8860eb407fc1"],
1057 "ia": ["set", [1, 2, 3]],
1058 "ra": ["set", [-0.5]],
1059 "ba": ["set", [true]],
1060 "sa": ["set", ["abc", "def"]],
1061 "ua": ["set", [["uuid", "69443985-7806-45e2-b35f-574a04e720f9"],
1062 ["uuid", "aad11ef0-816a-4b01-93e6-03b8b4256b98"]]]}},
1063 {"op": "insert",
1064 "table": "simple",
1065 "row": {}}]' \
1066 '["idltest",
1067 {"op": "update",
1068 "table": "simple",
1069 "where": [],
1070 "row": {"b": true}}]' \
1071 '["idltest",
1072 {"op": "update",
1073 "table": "simple",
1074 "where": [],
1075 "row": {"r": 123.5}}]' \
1076 '["idltest",
1077 {"op": "insert",
1078 "table": "simple",
1079 "row": {"i": -1,
1080 "r": 125,
1081 "b": false,
1082 "s": "",
1083 "ia": ["set", [1]],
1084 "ra": ["set", [1.5]],
1085 "ba": ["set", [false]],
1086 "sa": ["set", []],
1087 "ua": ["set", []]}}]' \
1088 '["idltest",
1089 {"op": "update",
1090 "table": "simple",
1091 "where": [["i", "<", 1]],
1092 "row": {"s": "newstring"}}]' \
1093 '["idltest",
1094 {"op": "delete",
1095 "table": "simple",
1096 "where": [["i", "==", 0]]}]' \
1097 'reconnect']],
1098 [[000: empty
1099 001: {"error":null,"result":[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]}]}
1100 002: i=0 r=0 b=false s= u=<2> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<1>
1101 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>
1102 003: {"error":null,"result":[{"count":2}]}
1103 004: i=0 r=0 b=true s= u=<2> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<1>
1104 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>
1105 005: {"error":null,"result":[{"count":2}]}
1106 006: i=0 r=123.5 b=true s= u=<2> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<1>
1107 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>
1108 007: {"error":null,"result":[{"uuid":["uuid","<6>"]}]}
1109 008: i=-1 r=125 b=false s= u=<2> ia=[1] ra=[1.5] ba=[false] sa=[] ua=[] uuid=<6>
1110 008: i=0 r=123.5 b=true s= u=<2> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<1>
1111 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>
1112 009: {"error":null,"result":[{"count":2}]}
1113 010: i=-1 r=125 b=false s=newstring u=<2> ia=[1] ra=[1.5] ba=[false] sa=[] ua=[] uuid=<6>
1114 010: i=0 r=123.5 b=true s=newstring u=<2> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<1>
1115 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>
1116 011: {"error":null,"result":[{"count":1}]}
1117 012: i=-1 r=125 b=false s=newstring u=<2> ia=[1] ra=[1.5] ba=[false] sa=[] ua=[] uuid=<6>
1118 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>
1119 013: reconnect
1120 014: i=-1 r=125 b=false s=newstring u=<2> ia=[1] ra=[1.5] ba=[false] sa=[] ua=[] uuid=<6>
1121 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>
1122 015: done
1123 ]])
1124
1125 m4_define([OVSDB_CHECK_IDL_TRACK_C],
1126 [AT_SETUP([$1 - C])
1127 AT_KEYWORDS([ovsdb server idl tracking positive $5])
1128 AT_CHECK([ovsdb_start_idltest])
1129 m4_if([$2], [], [],
1130 [AT_CHECK([ovsdb-client transact unix:socket $2], [0], [ignore], [ignore])])
1131 AT_CHECK([test-ovsdb '-vPATTERN:console:test-ovsdb|%c|%m' -vjsonrpc -t10 -c idl unix:socket $3],
1132 [0], [stdout], [ignore])
1133 AT_CHECK([sort stdout | uuidfilt]m4_if([$6],,, [[| $6]]),
1134 [0], [$4])
1135 OVSDB_SERVER_SHUTDOWN
1136 AT_CLEANUP])
1137
1138 m4_define([OVSDB_CHECK_IDL_TRACK],
1139 [OVSDB_CHECK_IDL_TRACK_C($@)])
1140
1141 OVSDB_CHECK_IDL_TRACK([track, simple idl, initially populated],
1142 [['["idltest",
1143 {"op": "insert",
1144 "table": "simple",
1145 "row": {"i": 1,
1146 "r": 2.0,
1147 "b": true,
1148 "s": "mystring",
1149 "u": ["uuid", "84f5c8f5-ac76-4dbc-a24f-8860eb407fc1"],
1150 "ia": ["set", [1, 2, 3]],
1151 "ra": ["set", [-0.5]],
1152 "ba": ["set", [true]],
1153 "sa": ["set", ["abc", "def"]],
1154 "ua": ["set", [["uuid", "69443985-7806-45e2-b35f-574a04e720f9"],
1155 ["uuid", "aad11ef0-816a-4b01-93e6-03b8b4256b98"]]]}},
1156 {"op": "insert",
1157 "table": "simple",
1158 "row": {}}]']],
1159 [['["idltest",
1160 {"op": "update",
1161 "table": "simple",
1162 "where": [],
1163 "row": {"b": true}}]']],
1164 [[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>
1165 000: updated columns: b ba i ia r ra s sa u ua
1166 001: {"error":null,"result":[{"count":2}]}
1167 002: i=0 r=0 b=true s= u=<4> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<5>
1168 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>
1169 002: updated columns: b
1170 003: done
1171 ]])
1172
1173 OVSDB_CHECK_IDL_TRACK([track, simple idl, initially empty, various ops],
1174 [],
1175 [['["idltest",
1176 {"op": "insert",
1177 "table": "simple",
1178 "row": {"i": 1,
1179 "r": 2.0,
1180 "b": true,
1181 "s": "mystring",
1182 "u": ["uuid", "84f5c8f5-ac76-4dbc-a24f-8860eb407fc1"],
1183 "ia": ["set", [1, 2, 3]],
1184 "ra": ["set", [-0.5]],
1185 "ba": ["set", [true]],
1186 "sa": ["set", ["abc", "def"]],
1187 "ua": ["set", [["uuid", "69443985-7806-45e2-b35f-574a04e720f9"],
1188 ["uuid", "aad11ef0-816a-4b01-93e6-03b8b4256b98"]]]}},
1189 {"op": "insert",
1190 "table": "simple",
1191 "row": {}}]' \
1192 '["idltest",
1193 {"op": "update",
1194 "table": "simple",
1195 "where": [],
1196 "row": {"b": true}}]' \
1197 '["idltest",
1198 {"op": "update",
1199 "table": "simple",
1200 "where": [],
1201 "row": {"r": 123.5}}]' \
1202 '["idltest",
1203 {"op": "insert",
1204 "table": "simple",
1205 "row": {"i": -1,
1206 "r": 125,
1207 "b": false,
1208 "s": "",
1209 "ia": ["set", [1]],
1210 "ra": ["set", [1.5]],
1211 "ba": ["set", [false]],
1212 "sa": ["set", []],
1213 "ua": ["set", []]}}]' \
1214 '["idltest",
1215 {"op": "update",
1216 "table": "simple",
1217 "where": [["i", "<", 1]],
1218 "row": {"s": "newstring"}}]' \
1219 '["idltest",
1220 {"op": "delete",
1221 "table": "simple",
1222 "where": [["i", "==", 0]]}]' \
1223 'reconnect']],
1224 [[000: empty
1225 001: {"error":null,"result":[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]}]}
1226 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>
1227 002: updated columns: b ba i ia r ra s sa u ua
1228 003: {"error":null,"result":[{"count":2}]}
1229 004: i=0 r=0 b=true s= u=<5> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<1>
1230 004: updated columns: b
1231 005: {"error":null,"result":[{"count":2}]}
1232 006: i=0 r=123.5 b=true s= u=<5> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<1>
1233 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>
1234 006: updated columns: r
1235 006: updated columns: r
1236 007: {"error":null,"result":[{"uuid":["uuid","<6>"]}]}
1237 008: i=-1 r=125 b=false s= u=<5> ia=[1] ra=[1.5] ba=[false] sa=[] ua=[] uuid=<6>
1238 008: updated columns: ba i ia r ra
1239 009: {"error":null,"result":[{"count":2}]}
1240 010: i=-1 r=125 b=false s=newstring u=<5> ia=[1] ra=[1.5] ba=[false] sa=[] ua=[] uuid=<6>
1241 010: i=0 r=123.5 b=true s=newstring u=<5> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<1>
1242 010: updated columns: s
1243 010: updated columns: s
1244 011: {"error":null,"result":[{"count":1}]}
1245 012: ##deleted## uuid=<1>
1246 013: reconnect
1247 014: i=-1 r=125 b=false s=newstring u=<5> ia=[1] ra=[1.5] ba=[false] sa=[] ua=[] uuid=<6>
1248 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>
1249 014: updated columns: b ba i ia r ra s sa u ua
1250 014: updated columns: ba i ia r ra s
1251 015: done
1252 ]])
1253
1254 m4_define([OVSDB_CHECK_IDL_PARTIAL_UPDATE_MAP_COLUMN],
1255 [AT_SETUP([$1 - C])
1256 AT_KEYWORDS([ovsdb server idl partial update map column positive $5])
1257 AT_CHECK([ovsdb_start_idltest])
1258 m4_if([$2], [], [],
1259 [AT_CHECK([ovsdb-client transact unix:socket $2], [0], [ignore], [ignore])])
1260 AT_CHECK([test-ovsdb '-vPATTERN:console:test-ovsdb|%c|%m' -vjsonrpc -t10 -c idl-partial-update-map-column unix:socket $3],
1261 [0], [stdout], [ignore])
1262 AT_CHECK([sort stdout | uuidfilt]m4_if([$6],,, [[| $6]]),
1263 [0], [$4])
1264 OVSDB_SERVER_SHUTDOWN
1265 AT_CLEANUP])
1266
1267 OVSDB_CHECK_IDL_PARTIAL_UPDATE_MAP_COLUMN([map, simple2 idl-partial-update-map-column, initially populated],
1268 [['["idltest", {"op":"insert", "table":"simple2",
1269 "row":{"name":"myString1","smap":["map",[["key1","value1"],["key2","value2"]]]} }]']
1270 ],
1271 [],
1272 [[000: Getting records
1273 001: name=myString1 smap=[[key1 : value1],[key2 : value2]] imap=[]
1274 002: After insert element
1275 003: name=String2 smap=[[key1 : myList1],[key2 : value2]] imap=[[3 : myids2]]
1276 004: After insert duplicated element
1277 005: name=String2 smap=[[key1 : myList1],[key2 : value2]] imap=[[3 : myids2]]
1278 006: After delete element
1279 007: name=String2 smap=[[key2 : value2]] imap=[[3 : myids2]]
1280 008: After trying to delete a deleted element
1281 009: name=String2 smap=[[key2 : value2]] imap=[[3 : myids2]]
1282 010: End test
1283 ]])
1284
1285 OVSDB_CHECK_IDL_PY([partial-map idl],
1286 [['["idltest", {"op":"insert", "table":"simple2",
1287 "row":{"name":"myString1","smap":["map",[["key1","value1"],["key2","value2"]]]} }]']
1288 ],
1289 [?simple2:name,smap,imap 'partialmapinsertelement' 'partialmapinsertmultipleelements' 'partialmapdelelements' 'partialmapmutatenew'],
1290 [[000: name=myString1 smap=[(key1 value1) (key2 value2)] imap=[]
1291 001: commit, status=success
1292 002: name=String2 smap=[(key1 myList1) (key2 value2)] imap=[(3 myids2)]
1293 003: commit, status=success
1294 004: name=String2 smap=[(key1 myList1) (key2 myList2) (key3 myList3) (key4 myList4)] imap=[(3 myids2)]
1295 005: commit, status=success
1296 006: name=String2 smap=[(key2 myList2)] imap=[(3 myids2)]
1297 007: commit, status=success
1298 008: name=String2 smap=[(key2 myList2)] imap=[(3 myids2)]
1299 008: name=String2New smap=[(key1 newList1) (key2 newList2)] imap=[]
1300 009: done
1301 ]])
1302
1303 OVSDB_CHECK_IDL_PY([partial-map update set refmap idl],
1304 [['["idltest", {"op":"insert", "table":"simple3", "row":{"name":"myString1"}},
1305 {"op":"insert", "table":"simple5", "row":{"name":"myString2"}}]']],
1306 ['partialmapmutateirefmap'],
1307 [[000: name=myString1 uset=[]
1308 000: name=myString2 irefmap=[]
1309 001: commit, status=success
1310 002: name=myString1 uset=[]
1311 002: name=myString2 irefmap=[(1 <0>)]
1312 003: done
1313 ]])
1314
1315 m4_define([OVSDB_CHECK_IDL_PARTIAL_UPDATE_SET_COLUMN],
1316 [AT_SETUP([$1 - C])
1317 AT_KEYWORDS([ovsdb server idl partial update set column positive $5])
1318 AT_CHECK([ovsdb_start_idltest])
1319 m4_if([$2], [], [],
1320 [AT_CHECK([ovsdb-client transact unix:socket $2], [0], [ignore], [ignore])])
1321 AT_CHECK([test-ovsdb '-vPATTERN:console:test-ovsdb|%c|%m' -vjsonrpc -t10 -c idl-partial-update-set-column unix:socket $3],
1322 [0], [stdout], [ignore])
1323 AT_CHECK([sort stdout | uuidfilt]m4_if([$6],,, [[| $6]]),
1324 [0], [$4])
1325 OVSDB_SERVER_SHUTDOWN
1326 AT_CLEANUP])
1327
1328 OVSDB_CHECK_IDL_PARTIAL_UPDATE_SET_COLUMN([set, simple3 idl-partial-update-set-column, initially populated],
1329 [['["idltest", {"op":"insert", "table":"simple3",
1330 "row":{"name":"mySet1","uset":["set", [[ "uuid", "0005b872-f9e5-43be-ae02-3184b9680e75" ], [ "uuid", "000d2f6a-76af-412f-b59d-e7bcd3e84eff" ]]]} }]']
1331 ],
1332 [],
1333 [[000: Getting records
1334 001: name=mySet1 uset=[[<0>],[<1>]] uref=[]
1335 002: After rename+add new value
1336 003: name=String2 uset=[[<0>],[<1>],[<2>]] uref=[]
1337 004: After add new value
1338 005: name=String2 uset=[[<0>],[<1>],[<2>],[<3>]] uref=[]
1339 006: After delete value
1340 007: name=String2 uset=[[<0>],[<1>],[<3>]] uref=[]
1341 008: After trying to delete a deleted value
1342 009: name=String2 uset=[[<0>],[<1>],[<3>]] uref=[]
1343 010: After add to other table + set of strong ref
1344 011: name=String2 uset=[[<0>],[<1>],[<3>]] uref=[[<4>]]
1345 012: End test
1346 ]])
1347
1348 OVSDB_CHECK_IDL_PY([partial-set idl],
1349 [['["idltest", {"op":"insert", "table":"simple3", "uuid-name":"newrow",
1350 "row":{"name":"mySet1","uset":["set", [[ "uuid", "0005b872-f9e5-43be-ae02-3184b9680e75" ]]]} },
1351 {"op":"insert", "table":"simple4", "row":{"name":"seed"}},
1352 {"op":"mutate", "table":"simple3", "where":[["_uuid", "==", ["named-uuid", "newrow"]]],
1353 "mutations": [["uset", "insert", ["set", [["uuid", "000d2f6a-76af-412f-b59d-e7bcd3e84eff"]]]]]}]']
1354 ],
1355 ['partialrenamesetadd' 'partialduplicateadd' 'partialsetdel' 'partialsetref' 'partialsetoverrideops' 'partialsetadddelete' 'partialsetmutatenew'],
1356 [[000: name=mySet1 uset=[<0> <1>]
1357 001: commit, status=success
1358 002: name=String2 uset=[<0> <1> <2>]
1359 003: commit, status=success
1360 004: name=String2 uset=[<0> <1> <2> <3>]
1361 005: commit, status=success
1362 006: name=String2 uset=[<0> <1> <3>]
1363 007: commit, status=success
1364 008: name=String2 uset=[<0> <1> <3>]
1365 009: commit, status=success
1366 010: name=String2 uset=[<3>]
1367 011: commit, status=success
1368 012: name=String2 uset=[<4> <5>]
1369 013: commit, status=success
1370 014: name=String2 uset=[<4> <5>]
1371 014: name=String3 uset=[<6>]
1372 015: done
1373 ]])
1374
1375 m4_define([OVSDB_CHECK_IDL_NOTIFY],
1376 [OVSDB_CHECK_IDL_PY([$1], [], [$2], [$3], [notify $4], [$5])
1377 OVSDB_CHECK_IDL_SSL_PY([$1], [], [$2], [$3], [notify $4], [$5])])
1378
1379 OVSDB_CHECK_IDL_NOTIFY([simple idl verify notify],
1380 [['track-notify' \
1381 '["idltest",
1382 {"op": "insert",
1383 "table": "simple",
1384 "row": {"i": 1,
1385 "r": 2.0,
1386 "b": true,
1387 "s": "mystring",
1388 "u": ["uuid", "84f5c8f5-ac76-4dbc-a24f-8860eb407fc1"],
1389 "ia": ["set", [1, 2, 3]],
1390 "ra": ["set", [-0.5]],
1391 "ba": ["set", [true]],
1392 "sa": ["set", ["abc", "def"]],
1393 "ua": ["set", [["uuid", "69443985-7806-45e2-b35f-574a04e720f9"],
1394 ["uuid", "aad11ef0-816a-4b01-93e6-03b8b4256b98"]]]}},
1395 {"op": "insert",
1396 "table": "simple",
1397 "row": {}}]' \
1398 '["idltest",
1399 {"op": "update",
1400 "table": "simple",
1401 "where": [],
1402 "row": {"b": false}}]' \
1403 '["idltest",
1404 {"op": "update",
1405 "table": "simple",
1406 "where": [],
1407 "row": {"r": 123.5}}]' \
1408 '["idltest",
1409 {"op": "insert",
1410 "table": "simple",
1411 "row": {"i": -1,
1412 "r": 125,
1413 "b": false,
1414 "s": "",
1415 "ia": ["set", [1]],
1416 "ra": ["set", [1.5]],
1417 "ba": ["set", [false]],
1418 "sa": ["set", []],
1419 "ua": ["set", []]}}]' \
1420 '["idltest",
1421 {"op": "update",
1422 "table": "simple",
1423 "where": [["i", "<", 1]],
1424 "row": {"s": "newstring"}}]' \
1425 '["idltest",
1426 {"op": "delete",
1427 "table": "simple",
1428 "where": [["i", "==", 0]]}]' \
1429 'reconnect']],
1430 [[000: empty
1431 000: event:create, row={uuid=<0>}, updates=None
1432 000: event:create, row={uuid=<1>}, updates=None
1433 001: {"error":null,"result":[{"uuid":["uuid","<2>"]},{"uuid":["uuid","<3>"]}]}
1434 002: event:create, row={i=0 r=0 b=false s= u=<4> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<3>}, updates=None
1435 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
1436 002: i=0 r=0 b=false s= u=<4> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<3>
1437 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>
1438 003: {"error":null,"result":[{"count":2}]}
1439 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>}
1440 004: i=0 r=0 b=false s= u=<4> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<3>
1441 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>
1442 005: {"error":null,"result":[{"count":2}]}
1443 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>}
1444 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>}
1445 006: i=0 r=123.5 b=false s= u=<4> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<3>
1446 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>
1447 007: {"error":null,"result":[{"uuid":["uuid","<8>"]}]}
1448 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
1449 008: i=-1 r=125 b=false s= u=<4> ia=[1] ra=[1.5] ba=[false] sa=[] ua=[] uuid=<8>
1450 008: i=0 r=123.5 b=false s= u=<4> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<3>
1451 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>
1452 009: {"error":null,"result":[{"count":2}]}
1453 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>}
1454 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>}
1455 010: i=-1 r=125 b=false s=newstring u=<4> ia=[1] ra=[1.5] ba=[false] sa=[] ua=[] uuid=<8>
1456 010: i=0 r=123.5 b=false s=newstring u=<4> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<3>
1457 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>
1458 011: {"error":null,"result":[{"count":1}]}
1459 012: event:delete, row={i=0 r=123.5 b=false s=newstring u=<4> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<3>}, updates=None
1460 012: i=-1 r=125 b=false s=newstring u=<4> ia=[1] ra=[1.5] ba=[false] sa=[] ua=[] uuid=<8>
1461 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>
1462 013: reconnect
1463 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
1464 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
1465 014: event:create, row={uuid=<0>}, updates=None
1466 014: event:create, row={uuid=<1>}, updates=None
1467 014: i=-1 r=125 b=false s=newstring u=<4> ia=[1] ra=[1.5] ba=[false] sa=[] ua=[] uuid=<8>
1468 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>
1469 015: done
1470 ]])
1471
1472 # Tests to verify the functionality of the one column compound index.
1473 # It tests index for one column string and integer indexes.
1474 # The run of test-ovsdb generates the output of the display of data using the different indexes defined in
1475 # the program.
1476 # Then, some at_checks are used to verify the correctness of the corresponding index as well as the existence
1477 # of all the rows involved in the test.
1478 m4_define([OVSDB_CHECK_IDL_COMPOUND_INDEX_SINGLE_COLUMN_C],
1479 [AT_SETUP([$1 - C])
1480 AT_KEYWORDS([ovsdb server idl compound_index_single_column compound_index positive $5])
1481 AT_CHECK([ovsdb_start_idltest])
1482 m4_if([$2], [], [],
1483 [AT_CHECK([ovsdb-client transact unix:socket $2], [0], [ignore], [ignore])])
1484 # Generate the data to be tested.
1485 AT_CHECK([test-ovsdb '-vPATTERN:console:test-ovsdb|%c|%m' -vjsonrpc -t10 -c idl-compound-index unix:socket $3],
1486 [0], [stdout], [ignore])
1487 # Filter the rows of data that corresponds to the string index eliminating the extra columns of data.
1488 # This is done to verifiy that the output data is in the correct and expected order.
1489 AT_CHECK([[cat stdout | grep -oh '[0-9]\{3\}: s=.*' | sed -e 's/ i=.*//g']],
1490 [0], [$4])
1491 # Here, the data is filtered and sorted in order to have all the rows in the index and be
1492 # able to determined that all the involved rows are present.
1493 AT_CHECK([[cat stdout | grep -oh '[0-9]\{3\}: s=.*' | sort -k 1,1n -k 2,2 -k 3,3]],
1494 [0], [$5])
1495 # Filter the rows of data that corresponds to the integer index eliminating the extra columns of data.
1496 # This is done to verifiy that the output data is in the correct and expected order.
1497 AT_CHECK([[cat stdout | grep -oh '[0-9]\{3\}: i=.*' | sed -e 's/ s=.*//g']],
1498 [0], [$6])
1499 # Here again, the data is filtered and sorted in order to have all the rows in the index and be
1500 # able to determined that all the involved rows are present.
1501 AT_CHECK([[cat stdout | grep -oh '[0-9]\{3\}: i=.*' | sort -k 1,1n -k 2,2 -k 3,3]],
1502 [0], [$7])
1503 OVSDB_SERVER_SHUTDOWN
1504 AT_CLEANUP])
1505
1506 OVSDB_CHECK_IDL_COMPOUND_INDEX_SINGLE_COLUMN_C([Compound_index, single column test ],
1507 [['["idltest",
1508 {"op": "insert", "table": "simple", "row": {"s":"List000", "i": 1, "b":true, "r":101.0}},
1509 {"op": "insert", "table": "simple", "row": {"s":"List000", "i": 2, "b":false, "r":102.0}},
1510 {"op": "insert", "table": "simple", "row": {"s":"List000", "i": 10, "b":true, "r":110.0}},
1511 {"op": "insert", "table": "simple", "row": {"s":"List001", "i": 1, "b":false, "r":110.0}},
1512 {"op": "insert", "table": "simple", "row": {"s":"List001", "i": 2, "b":true, "r":120.0}},
1513 {"op": "insert", "table": "simple", "row": {"s":"List001", "i": 2, "b":true, "r":122.0}},
1514 {"op": "insert", "table": "simple", "row": {"s":"List001", "i": 4, "b":true, "r":130.0}},
1515 {"op": "insert", "table": "simple", "row": {"s":"List005", "i": 5, "b":true, "r":130.0}},
1516 {"op": "insert", "table": "simple", "row": {"s":"List020", "i": 20, "b":true, "r":220.0}},
1517 {"op": "insert", "table": "simple", "row": {"s":"List020", "i": 19, "b":true, "r":219.0}}
1518 ]']],
1519 [idl_compound_index_single_column],
1520 [001: s=List000
1521 001: s=List000
1522 001: s=List000
1523 001: s=List001
1524 001: s=List001
1525 001: s=List001
1526 001: s=List001
1527 001: s=List005
1528 001: s=List020
1529 001: s=List020
1530 003: s=List001
1531 003: s=List001
1532 003: s=List001
1533 003: s=List001
1534 ],
1535 [001: s=List000 i=1 b=True r=101.000000
1536 001: s=List000 i=10 b=True r=110.000000
1537 001: s=List000 i=2 b=False r=102.000000
1538 001: s=List001 i=1 b=False r=110.000000
1539 001: s=List001 i=2 b=True r=120.000000
1540 001: s=List001 i=2 b=True r=122.000000
1541 001: s=List001 i=4 b=True r=130.000000
1542 001: s=List005 i=5 b=True r=130.000000
1543 001: s=List020 i=19 b=True r=219.000000
1544 001: s=List020 i=20 b=True r=220.000000
1545 003: s=List001 i=1 b=False r=110.000000
1546 003: s=List001 i=2 b=True r=120.000000
1547 003: s=List001 i=2 b=True r=122.000000
1548 003: s=List001 i=4 b=True r=130.000000
1549 ],
1550 [002: i=1
1551 002: i=1
1552 002: i=2
1553 002: i=2
1554 002: i=2
1555 002: i=4
1556 002: i=5
1557 002: i=10
1558 002: i=19
1559 002: i=20
1560 004: i=5
1561 005: i=4
1562 005: i=5
1563 006: i=5
1564 006: i=10
1565 006: i=19
1566 006: i=20
1567 006: i=54
1568 007: i=5
1569 007: i=19
1570 007: i=20
1571 007: i=30
1572 007: i=54
1573 008: i=1
1574 008: i=1
1575 008: i=2
1576 008: i=2
1577 008: i=2
1578 008: i=5
1579 008: i=19
1580 008: i=20
1581 008: i=30
1582 008: i=54
1583 ],
1584 [002: i=1 s=List000 b=True r=101.000000
1585 002: i=1 s=List001 b=False r=110.000000
1586 002: i=10 s=List000 b=True r=110.000000
1587 002: i=19 s=List020 b=True r=219.000000
1588 002: i=2 s=List000 b=False r=102.000000
1589 002: i=2 s=List001 b=True r=120.000000
1590 002: i=2 s=List001 b=True r=122.000000
1591 002: i=20 s=List020 b=True r=220.000000
1592 002: i=4 s=List001 b=True r=130.000000
1593 002: i=5 s=List005 b=True r=130.000000
1594 004: i=5 s=List005 b=True r=130.000000
1595 005: i=4 s=List001 b=True r=130.000000
1596 005: i=5 s=List005 b=True r=130.000000
1597 006: i=10 s=List000 b=True r=110.000000
1598 006: i=19 s=List020 b=True r=219.000000
1599 006: i=20 s=List020 b=True r=220.000000
1600 006: i=5 s=List005 b=True r=130.000000
1601 006: i=54 s=Lista054 b=False r=0.000000
1602 007: i=19 s=List020 b=True r=219.000000
1603 007: i=20 s=List020 b=True r=220.000000
1604 007: i=30 s=List000 b=True r=110.000000
1605 007: i=5 s=List005 b=True r=130.000000
1606 007: i=54 s=Lista054 b=False r=0.000000
1607 008: i=1 s=List000 b=True r=101.000000
1608 008: i=1 s=List001 b=False r=110.000000
1609 008: i=19 s=List020 b=True r=219.000000
1610 008: i=2 s=List000 b=False r=102.000000
1611 008: i=2 s=List001 b=True r=120.000000
1612 008: i=2 s=List001 b=True r=122.000000
1613 008: i=20 s=List020 b=True r=220.000000
1614 008: i=30 s=List000 b=True r=110.000000
1615 008: i=5 s=List005 b=True r=130.000000
1616 008: i=54 s=Lista054 b=False r=0.000000
1617 ])
1618
1619 # Tests to verify the functionality of two column compound index.
1620 # It tests index for two columns using string and integer fields.
1621 # The run of test-ovsdb generates the output of the display of data using the different indexes defined in
1622 # the program.
1623 # Then, some at_checks are used to verify the correctness of the corresponding index as well as the existence
1624 # of all the rows involved in the test.
1625 m4_define([OVSDB_CHECK_IDL_COMPOUND_INDEX_DOUBLE_COLUMN_C],
1626 [AT_SETUP([$1 - C])
1627 AT_KEYWORDS([ovsdb server idl compound_index_double_column compound_index positive $5])
1628 AT_CHECK([ovsdb_start_idltest])
1629 m4_if([$2], [], [],
1630 [AT_CHECK([ovsdb-client transact unix:socket $2], [0], [ignore], [ignore])])
1631 # Generate the data to be tested.
1632 AT_CHECK([test-ovsdb '-vPATTERN:console:test-ovsdb|%c|%m' -vjsonrpc -t10 -c idl-compound-index unix:socket $3],
1633 [0], [stdout], [ignore])
1634 # Filter the rows of data that corresponds to the string-integer index eliminating the extra columns of data.
1635 # This is done to verifiy that the output data is in the correct and expected order.
1636 AT_CHECK([[cat stdout | grep -oh '[0-9]\{3\}: s=.*' | sed -e 's/ b=.*//g']],
1637 [0], [$4])
1638 # Here, the data is filtered and sorted in order to have all the rows in the index and be
1639 # able to determined that all the involved rows are present.
1640 AT_CHECK([[cat stdout | grep -oh '[0-9]\{3\}: s=.*' | sort -k 1,1n -k 2,2 -k 3,3]],
1641 [0], [$5])
1642 # Filter the rows of data that corresponds to the integer index eliminating the extra columns of data.
1643 # This is done to verifiy that the output data is in the correct and expected order.
1644 AT_CHECK([[cat stdout | grep -oh '[0-9]\{3\}: i=.*' | sed -e 's/ b=.*//g']],
1645 [0], [$6])
1646 # Here again, the data is filtered and sorted in order to have all the rows in the index and be
1647 # able to determined that all the involved rows are present.
1648 AT_CHECK([[cat stdout | grep -oh '[0-9]\{3\}: i=.*' | sort -k 1,1n -k 2,2 -k 3,3]],
1649 [0], [$7])
1650 OVSDB_SERVER_SHUTDOWN
1651 AT_CLEANUP])
1652
1653 OVSDB_CHECK_IDL_COMPOUND_INDEX_DOUBLE_COLUMN_C([Compound_index, double column test ],
1654 [['["idltest",
1655 {"op": "insert", "table": "simple", "row": {"s":"List000", "i": 1, "b":true, "r":101.0}},
1656 {"op": "insert", "table": "simple", "row": {"s":"List000", "i": 2, "b":false, "r":102.0}},
1657 {"op": "insert", "table": "simple", "row": {"s":"List000", "i": 10, "b":true, "r":110.0}},
1658 {"op": "insert", "table": "simple", "row": {"s":"List001", "i": 1, "b":false, "r":110.0}},
1659 {"op": "insert", "table": "simple", "row": {"s":"List001", "i": 2, "b":true, "r":120.0}},
1660 {"op": "insert", "table": "simple", "row": {"s":"List001", "i": 2, "b":true, "r":122.0}},
1661 {"op": "insert", "table": "simple", "row": {"s":"List001", "i": 4, "b":true, "r":130.0}},
1662 {"op": "insert", "table": "simple", "row": {"s":"List005", "i": 5, "b":true, "r":130.0}},
1663 {"op": "insert", "table": "simple", "row": {"s":"List020", "i": 20, "b":true, "r":220.0}},
1664 {"op": "insert", "table": "simple", "row": {"s":"List020", "i": 19, "b":true, "r":219.0}}
1665 ]']],
1666 [idl_compound_index_double_column],
1667 [001: s=List000 i=1
1668 001: s=List000 i=2
1669 001: s=List000 i=10
1670 001: s=List001 i=1
1671 001: s=List001 i=2
1672 001: s=List001 i=2
1673 001: s=List001 i=4
1674 001: s=List005 i=5
1675 001: s=List020 i=19
1676 001: s=List020 i=20
1677 002: s=List000 i=10
1678 002: s=List000 i=2
1679 002: s=List000 i=1
1680 002: s=List001 i=4
1681 002: s=List001 i=2
1682 002: s=List001 i=2
1683 002: s=List001 i=1
1684 002: s=List005 i=5
1685 002: s=List020 i=20
1686 002: s=List020 i=19
1687 003: s=List000 i=10
1688 004: s=List001 i=1
1689 004: s=List001 i=2
1690 004: s=List001 i=2
1691 004: s=List001 i=4
1692 004: s=List005 i=5
1693 ],
1694 [001: s=List000 i=1 b=True r=101.000000
1695 001: s=List000 i=10 b=True r=110.000000
1696 001: s=List000 i=2 b=False r=102.000000
1697 001: s=List001 i=1 b=False r=110.000000
1698 001: s=List001 i=2 b=True r=120.000000
1699 001: s=List001 i=2 b=True r=122.000000
1700 001: s=List001 i=4 b=True r=130.000000
1701 001: s=List005 i=5 b=True r=130.000000
1702 001: s=List020 i=19 b=True r=219.000000
1703 001: s=List020 i=20 b=True r=220.000000
1704 002: s=List000 i=1 b=True r=101.000000
1705 002: s=List000 i=10 b=True r=110.000000
1706 002: s=List000 i=2 b=False r=102.000000
1707 002: s=List001 i=1 b=False r=110.000000
1708 002: s=List001 i=2 b=True r=120.000000
1709 002: s=List001 i=2 b=True r=122.000000
1710 002: s=List001 i=4 b=True r=130.000000
1711 002: s=List005 i=5 b=True r=130.000000
1712 002: s=List020 i=19 b=True r=219.000000
1713 002: s=List020 i=20 b=True r=220.000000
1714 003: s=List000 i=10 b=True r=110.000000
1715 004: s=List001 i=1 b=False r=110.000000
1716 004: s=List001 i=2 b=True r=120.000000
1717 004: s=List001 i=2 b=True r=122.000000
1718 004: s=List001 i=4 b=True r=130.000000
1719 004: s=List005 i=5 b=True r=130.000000
1720 ],
1721 [005: i=1 s=List000
1722 005: i=1 s=List001
1723 005: i=2 s=List000
1724 005: i=2 s=List001
1725 005: i=2 s=List001
1726 005: i=4 s=List001
1727 005: i=5 s=List005
1728 005: i=10 s=List000
1729 005: i=19 s=List020
1730 005: i=20 s=List020
1731 006: i=20 s=List020
1732 006: i=19 s=List020
1733 006: i=10 s=List000
1734 006: i=5 s=List005
1735 006: i=4 s=List001
1736 006: i=2 s=List000
1737 006: i=2 s=List001
1738 006: i=2 s=List001
1739 006: i=1 s=List000
1740 006: i=1 s=List001
1741 ],
1742 [005: i=1 s=List000 b=True r=101.000000
1743 005: i=1 s=List001 b=False r=110.000000
1744 005: i=10 s=List000 b=True r=110.000000
1745 005: i=19 s=List020 b=True r=219.000000
1746 005: i=2 s=List000 b=False r=102.000000
1747 005: i=2 s=List001 b=True r=120.000000
1748 005: i=2 s=List001 b=True r=122.000000
1749 005: i=20 s=List020 b=True r=220.000000
1750 005: i=4 s=List001 b=True r=130.000000
1751 005: i=5 s=List005 b=True r=130.000000
1752 006: i=1 s=List000 b=True r=101.000000
1753 006: i=1 s=List001 b=False r=110.000000
1754 006: i=10 s=List000 b=True r=110.000000
1755 006: i=19 s=List020 b=True r=219.000000
1756 006: i=2 s=List000 b=False r=102.000000
1757 006: i=2 s=List001 b=True r=120.000000
1758 006: i=2 s=List001 b=True r=122.000000
1759 006: i=20 s=List020 b=True r=220.000000
1760 006: i=4 s=List001 b=True r=130.000000
1761 006: i=5 s=List005 b=True r=130.000000
1762 ])
1763
1764 m4_define([OVSDB_CHECK_IDL_COMPOUND_INDEX_WITH_REF],
1765 [AT_SETUP([$1 - C])
1766 AT_KEYWORDS([ovsdb server idl compound_index compound_index_with_ref positive $5])
1767 AT_CHECK([ovsdb_start_idltest])
1768 m4_if([$2], [], [],
1769 [AT_CHECK([ovsdb-client transact unix:socket $2], [0], [ignore], [ignore])])
1770 AT_CHECK([test-ovsdb '-vPATTERN:console:test-ovsdb|%c|%m' -vjsonrpc -t10 -c idl-compound-index-with-ref unix:socket $3],
1771 [0], [stdout], [ignore])
1772 AT_CHECK([sort stdout | uuidfilt]m4_if([$6],,, [[| $6]]),
1773 [0], [$4])
1774 OVSDB_SERVER_SHUTDOWN
1775 AT_CLEANUP])
1776
1777 OVSDB_CHECK_IDL_COMPOUND_INDEX_WITH_REF([set, simple3 idl-compound-index-with-ref, initially populated],
1778 [],
1779 [],
1780 [[000: After add to other table + set of strong ref
1781 001: name= uset=[] uref=[[<0>]]
1782 002: check simple4: not empty
1783 003: Query using index with reference
1784 004: name= uset=[] uref=[[<0>]]
1785 005: After delete
1786 007: check simple4: empty
1787 008: End test
1788 ]])
1789
1790 m4_define([CHECK_STREAM_OPEN_BLOCK],
1791 [AT_SETUP([Check stream open block - $1 - $3])
1792 AT_SKIP_IF([test "$3" = "tcp6" && test "$IS_WIN32" = "yes"])
1793 AT_SKIP_IF([test "$3" = "tcp6" && test "$HAVE_IPV6" = "no"])
1794 AT_KEYWORDS([ovsdb server stream open_block $3])
1795 AT_CHECK([ovsdb_start_idltest "ptcp:0:$4"])
1796 PARSE_LISTENING_PORT([ovsdb-server.log], [TCP_PORT])
1797 WRONG_PORT=$(($TCP_PORT + 101))
1798 AT_CHECK([$2 tcp:$4:$TCP_PORT], [0], [ignore])
1799 AT_CHECK([$2 tcp:$4:$WRONG_PORT], [1], [ignore], [ignore])
1800 OVSDB_SERVER_SHUTDOWN
1801 AT_CHECK([$2 tcp:$4:$TCP_PORT], [1], [ignore], [ignore])
1802 AT_CLEANUP])
1803
1804 CHECK_STREAM_OPEN_BLOCK([C], [test-stream], [tcp], [127.0.0.1])
1805 CHECK_STREAM_OPEN_BLOCK([C], [test-stream], [tcp6], [[[::1]]])
1806 CHECK_STREAM_OPEN_BLOCK([Python3], [$PYTHON3 $srcdir/test-stream.py],
1807 [tcp], [127.0.0.1])
1808 CHECK_STREAM_OPEN_BLOCK([Python3], [$PYTHON3 $srcdir/test-stream.py],
1809 [tcp6], [[[::1]]])
1810
1811 # same as OVSDB_CHECK_IDL but uses Python IDL implementation with tcp
1812 # with multiple remotes to assert the idl connects to the leader of the Raft cluster
1813 m4_define([OVSDB_CHECK_IDL_LEADER_ONLY_PY],
1814 [AT_SETUP([$1 - Python3 (leader only)])
1815 AT_SKIP_IF([test "$IS_ARM64" = "yes"])
1816 AT_KEYWORDS([ovsdb server idl Python leader_only with tcp socket])
1817 m4_define([LPBK],[127.0.0.1])
1818 OVSDB_CLUSTER_START_IDLTEST([$2], ["ptcp:0:"LPBK])
1819 PARSE_LISTENING_PORT([s2.log], [TCP_PORT_1])
1820 PARSE_LISTENING_PORT([s3.log], [TCP_PORT_2])
1821 PARSE_LISTENING_PORT([s1.log], [TCP_PORT_3])
1822 remotes=tcp:LPBK:$TCP_PORT_1,tcp:LPBK:$TCP_PORT_2,tcp:LPBK:$TCP_PORT_3
1823 pids=$(cat s2.pid s3.pid s1.pid | tr '\n' ',')
1824 echo $pids
1825 AT_CHECK([$PYTHON3 $srcdir/test-ovsdb.py -t30 idl-cluster $srcdir/idltest.ovsschema $remotes $pids $3],
1826 [0], [stdout], [ignore])
1827 remote=$(ovsdb_cluster_leader $remotes "idltest")
1828 leader=$(echo $remote | cut -d'|' -f 1)
1829 AT_CHECK([grep -F -- "${leader}" stdout], [0], [ignore])
1830 AT_CLEANUP])
1831
1832 OVSDB_CHECK_IDL_LEADER_ONLY_PY([Check Python IDL connects to leader], 3, ['remote'])
1833 OVSDB_CHECK_IDL_LEADER_ONLY_PY([Check Python IDL reconnects to leader], 3, ['remote' '+remotestop' 'remote'])
1834
1835 # same as OVSDB_CHECK_IDL but uses C IDL implementation with tcp
1836 # with multiple remotes.
1837 m4_define([OVSDB_CHECK_CLUSTER_IDL_C],
1838 [AT_SETUP([$1 - C - tcp])
1839 AT_KEYWORDS([ovsdb server idl positive tcp socket $5])
1840 m4_define([LPBK],[127.0.0.1])
1841 OVSDB_CLUSTER_START_IDLTEST([$2], ["ptcp:0:"LPBK])
1842 PARSE_LISTENING_PORT([s1.log], [TCP_PORT_1])
1843 PARSE_LISTENING_PORT([s2.log], [TCP_PORT_2])
1844 PARSE_LISTENING_PORT([s3.log], [TCP_PORT_3])
1845 remotes=tcp:LPBK:$TCP_PORT_1,tcp:LPBK:$TCP_PORT_2,tcp:LPBK:$TCP_PORT_3
1846
1847 m4_if([$3], [], [],
1848 [AT_CHECK([ovsdb-client transact $remotes $3], [0], [ignore], [ignore])])
1849 AT_CHECK([test-ovsdb '-vPATTERN:console:test-ovsdb|%c|%m' -vjsonrpc -t10 idl tcp:LPBK:$TCP_PORT_1 $4],
1850 [0], [stdout], [ignore])
1851 AT_CHECK([sort stdout | uuidfilt]m4_if([$7],,, [[| $7]]),
1852 [0], [$5])
1853 AT_CLEANUP])
1854
1855 # Checks that monitor_cond_since works fine when disconnects happen
1856 # with cond_change requests in flight (i.e., IDL is properly updated).
1857 OVSDB_CHECK_CLUSTER_IDL_C([simple idl, monitor_cond_since, cluster disconnect],
1858 3,
1859 [['["idltest",
1860 {"op": "insert",
1861 "table": "simple",
1862 "row": {"i": 1,
1863 "r": 1.0,
1864 "b": true}},
1865 {"op": "insert",
1866 "table": "simple",
1867 "row": {"i": 2,
1868 "r": 1.0,
1869 "b": true}}]']],
1870 [['condition simple []' \
1871 'condition simple [["i","==",2]]' \
1872 'condition simple [["i","==",1]]' \
1873 '+reconnect' \
1874 '["idltest",
1875 {"op": "update",
1876 "table": "simple",
1877 "where": [["i", "==", 1]],
1878 "row": {"r": 2.0 }}]']],
1879 [[000: change conditions
1880 001: empty
1881 002: change conditions
1882 003: i=2 r=1 b=true s= u=<0> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<1>
1883 004: change conditions
1884 005: reconnect
1885 006: i=2 r=1 b=true s= u=<0> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<1>
1886 007: {"error":null,"result":[{"count":1}]}
1887 008: i=1 r=2 b=true s= u=<0> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<2>
1888 009: done
1889 ]])