X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=tests%2Fovsdb-server.at;h=86179bdf9a83ca9412a6096c764ddf264ab6843c;hb=HEAD;hp=16a1d952cdcd853a1e263ce82f8e8fd16fd64829;hpb=85606e05b691be7c2f2d4bcf0e91170b71ec8fbb;p=sliver-openvswitch.git diff --git a/tests/ovsdb-server.at b/tests/ovsdb-server.at index 16a1d952c..86179bdf9 100644 --- a/tests/ovsdb-server.at +++ b/tests/ovsdb-server.at @@ -38,6 +38,8 @@ cat stdout >> output EXECUTION_EXAMPLES +AT_BANNER([ovsdb-server miscellaneous features]) + AT_SETUP([truncating corrupted database log]) AT_KEYWORDS([ovsdb server positive unix]) OVS_RUNDIR=`pwd`; export OVS_RUNDIR @@ -158,7 +160,7 @@ AT_CHECK( ordinals ], [ignore], [test ! -e pid || kill `cat pid`]) AT_CHECK( - [[test-jsonrpc request unix:socket get_schema [\"nonexistent\"]]], [0], + [[ovstest test-jsonrpc request unix:socket get_schema [\"nonexistent\"]]], [0], [[{"error":null,"id":0,"result":{"details":"get_schema request specifies unknown database nonexistent","error":"unknown database","syntax":"[\"nonexistent\"]"}} ]], [], [test ! -e pid || kill `cat pid`]) OVSDB_SERVER_SHUTDOWN @@ -192,9 +194,8 @@ AT_CHECK([ovsdb-client list-tables unix:socket constraints], [0], [ignore], [ign AT_CHECK([ovsdb-client list-tables unix:socket ordinals], [0], [ignore], [ignore]) # Add an already added database. -AT_CHECK([ovs-appctl -t ovsdb-server ovsdb-server/add-db db2], 2, [], [stderr]) -AT_CHECK([sed 's/(.*)/(...)/' stderr], [0], - [I/O error: db2: failed to lock lockfile (...) +AT_CHECK([ovs-appctl -t ovsdb-server ovsdb-server/add-db db2], 2, [], + [db2: already open ovs-appctl: ovsdb-server: server returned an error ]) @@ -234,9 +235,16 @@ AT_CHECK([ovs-appctl -t ovsdb-server ovsdb-server/remove-db ordinals], [2], [], [Failed to find the database. ovs-appctl: ovsdb-server: server returned an error ]) + +# Add a removed database. +AT_CHECK([ovs-appctl -t ovsdb-server ovsdb-server/add-db db2], [0]) +AT_CHECK([ovs-appctl -t ovsdb-server ovsdb-server/list-dbs], + [0], [constraints +]) +AT_CHECK([ovsdb-client list-tables unix:socket constraints], [0], [ignore], [ignore]) AT_CLEANUP -AT_SETUP([ovsdb-server/add-db and remove-db with --monitor]) +AT_SETUP([ovsdb-server/add-db with --monitor]) AT_KEYWORDS([ovsdb server positive]) # Start ovsdb-server, initially with one db. OVS_RUNDIR=`pwd`; export OVS_RUNDIR @@ -266,8 +274,21 @@ AT_CHECK([ovs-appctl -t ovsdb-server ovsdb-server/list-dbs], [0], [constraints ordinals ]) +AT_CLEANUP + +AT_SETUP([ovsdb-server/add-db and remove-db with --monitor]) +AT_KEYWORDS([ovsdb server positive]) +# Start ovsdb-server, initially with one db. +OVS_RUNDIR=`pwd`; export OVS_RUNDIR +OVS_LOGDIR=`pwd`; export OVS_LOGDIR +ordinal_schema > schema +AT_CHECK([ovsdb-tool create db1 schema], [0], [ignore], [ignore]) +constraint_schema > schema2 +AT_CHECK([ovsdb-tool create db2 schema2], [0], [ignore], [ignore]) +ON_EXIT([kill `cat *.pid`]) +AT_CHECK([ovsdb-server -v -vvlog:off --monitor --detach --no-chdir --pidfile --log-file db1 db2]) -# Remove the recently added database. +# Remove the second database. AT_CHECK([ovs-appctl -t ovsdb-server ovsdb-server/remove-db constraints]) AT_CHECK([ovs-appctl -t ovsdb-server ovsdb-server/list-dbs], [0], [ordinals @@ -392,7 +413,7 @@ AT_CHECK([test ! -e socket1]) AT_CHECK([ovs-appctl -t ovsdb-server ovsdb-server/list-remotes]) AT_CLEANUP -AT_SETUP([ovsdb-server/add-remote and remove-remote with --monitor]) +AT_SETUP([ovsdb-server/add-remote with --monitor]) AT_KEYWORDS([ovsdb server positive]) # Start ovsdb-server, initially with no remotes. OVS_RUNDIR=`pwd`; export OVS_RUNDIR @@ -420,6 +441,25 @@ OVS_WAIT_WHILE([kill -0 `cat old.pid`]) OVS_WAIT_UNTIL( [test -s ovsdb-server.pid && test `cat ovsdb-server.pid` != `cat old.pid`]) OVS_WAIT_UNTIL([test -S socket1]) +AT_CLEANUP + +AT_SETUP([ovsdb-server/add-remote and remove-remote with --monitor]) +AT_KEYWORDS([ovsdb server positive]) +# Start ovsdb-server, initially with no remotes. +OVS_RUNDIR=`pwd`; export OVS_RUNDIR +OVS_LOGDIR=`pwd`; export OVS_LOGDIR +ordinal_schema > schema +AT_CHECK([ovsdb-tool create db schema], [0], [ignore], [ignore]) +ON_EXIT([kill `cat *.pid`]) +AT_CHECK([ovsdb-server -v -vvlog:off --monitor --detach --no-chdir --pidfile --log-file db]) + +# Add a remote. +AT_CHECK([test ! -e socket1]) +AT_CHECK([ovs-appctl -t ovsdb-server ovsdb-server/add-remote punix:socket1]) +OVS_WAIT_UNTIL([test -S socket1]) +AT_CHECK([ovs-appctl -t ovsdb-server ovsdb-server/list-remotes], + [0], [punix:socket1 +]) # Remove the remote. AT_CHECK([ovs-appctl -t ovsdb-server ovsdb-server/remove-remote punix:socket1]) @@ -442,7 +482,7 @@ AT_KEYWORDS([ovsdb server positive ssl $5]) AT_SKIP_IF([test "$HAVE_OPENSSL" = no]) PKIDIR=$abs_top_builddir/tests AT_SKIP_IF([expr "$PKIDIR" : ".*[ '\" - \\]"]) +\\]"]) AT_DATA([schema], [[{"name": "mydb", "tables": { @@ -485,7 +525,7 @@ AT_CHECK( [0], [stdout], [ignore], [test ! -e pid || kill `cat pid`]) cat stdout >> output AT_CHECK_UNQUOTED( - [${PERL} $srcdir/uuidfilt.pl output], [0], + [cat output], [0], [[[{"rows":[{"private_key":"$PKIDIR/testpki-privkey2.pem"}]}] ]], [ignore], [test ! -e pid || kill `cat pid`]) OVSDB_SERVER_SHUTDOWN @@ -534,7 +574,7 @@ AT_CHECK( done]], [0], [stdout], [ignore], [test ! -e pid || kill `cat pid`]) dnl Check that all the crap is in fact in the database log. -AT_CHECK([[${PERL} $srcdir/uuidfilt.pl db | grep -v ^OVSDB | sed 's/"_date":[0-9]*/"_date":0/' | test-json --multiple -]], [0], +AT_CHECK([[${PERL} $srcdir/uuidfilt.pl db | grep -v ^OVSDB | sed 's/"_date":[0-9]*/"_date":0/' | ovstest test-json --multiple -]], [0], [[{"cksum":"12345678 9","name":"ordinals","tables":{"ordinals":{"columns":{"name":{"type":"string"},"number":{"type":"integer"}},"indexes":[["number"]]}},"version":"5.1.3"} {"_comment":"add row for zero 0","_date":0,"ordinals":{"<0>":{"name":"zero"}}} {"_comment":"delete row for 0","_date":0,"ordinals":{"<0>":null}} @@ -623,8 +663,96 @@ _uuid name number ], [], [test ! -e pid || kill `cat pid`]) OVSDB_SERVER_SHUTDOWN AT_CLEANUP + +AT_SETUP([ovsdb-server combines updates on backlogged connections]) +OVS_LOGDIR=`pwd`; export OVS_LOGDIR +OVS_RUNDIR=`pwd`; export OVS_RUNDIR +ON_EXIT([kill `cat *.pid`]) + +# The maximum socket receive buffer size is important for this test, which +# tests behavior when the receive buffer overflows. +if test -e /proc/sys/net/core/rmem_max; then + # Linux + rmem_max=`cat /proc/sys/net/core/rmem_max` +elif rmem_max=`sysctl -n net.inet.tcp.recvbuf_max 2>/dev/null`; then + : # FreeBSD, NetBSD +else + # Don't know how to get maximum socket receive buffer on this OS + AT_SKIP_IF([:]) +fi + +# Calculate the number of iterations we need to queue. Each of the +# iterations we execute, by itself, yields a monitor update of about +# 25 kB, so fill up that much space plus a few for luck. +n_iterations=`expr $rmem_max / 25000 + 5` +echo rmem_max=$rmem_max n_iterations=$n_iterations + +# If there's too much queuing skip the test to avoid timing out. +AT_SKIP_IF([test $rmem_max -gt 1048576]) + +# Calculate the exact number of monitor updates expected for $n_iterations, +# assuming no updates are combined. The "extra" update is for the initial +# contents of the database. +n_updates=`expr $n_iterations \* 3 + 1` + +# Start an ovsdb-server with the vswitchd schema. +OVSDB_INIT([db]) +AT_CHECK([ovsdb-server --detach --no-chdir --pidfile --log-file --remote=punix:db.sock db], + [0], [ignore], [ignore]) + +# Executes a set of transactions that add a bridge with 100 ports, and +# then deletes that bridge. This yields three monitor updates that +# add up to about 25 kB in size. +# +# The update also increments a counter held in the database so that we can +# verify that the overall effect of the transactions took effect (e.g. +# monitor updates at the end weren't just dropped). We add an arbitrary +# string to the counter to make grepping for it more reliable. +counter=0 +trigger_big_update () { + counter=`expr $counter + 1` + ovs-vsctl --no-wait -- set open_vswitch . system_version=xyzzy$counter + ovs-vsctl --no-wait -- add-br br0 $add + ovs-vsctl --no-wait -- del-br br0 +} +add_ports () { + for j in `seq 1 100`; do + printf " -- add-port br0 p%d" $j + done +} +add=`add_ports` + +AT_CAPTURE_FILE([ovsdb-client.err]) + +# Start an ovsdb-client monitoring all changes to the database, +# make it block to force the buffers to fill up, and then execute +# enough iterations that ovsdb-server starts combining updates. +AT_CHECK([ovsdb-client --detach --no-chdir --pidfile monitor ALL >ovsdb-client.out 2>ovsdb-client.err]) +AT_CHECK([ovs-appctl -t ovsdb-client ovsdb-client/block]) +for i in `seq 1 $n_iterations`; do + echo "blocked update ($i of $n_iterations)" + trigger_big_update $i +done +AT_CHECK([ovs-appctl -t ovsdb-client ovsdb-client/unblock]) +OVS_WAIT_UNTIL([grep "\"xyzzy$counter\"" ovsdb-client.out]) +AT_CHECK([ovs-appctl -t ovsdb-client exit]) +OVS_WAIT_WHILE([test -e ovsdb-client.pid]) + +# Count the number of updates in the ovsdb-client output, by counting +# the number of changes to the Open_vSwitch table. (All of our +# transactions modify the Open_vSwitch table.) It should be less than +# $n_updates updates. +# +# Check that the counter is what we expect. +logged_updates=`grep -c '^Open_vSwitch' ovsdb-client.out` +echo "logged_updates=$logged_updates (expected less than $n_updates)" +AT_CHECK([test $logged_updates -lt $n_updates]) +AT_CHECK_UNQUOTED([ovs-vsctl get open_vswitch . system_version], [0], + ["xyzzy$counter" +]) +AT_CLEANUP -AT_BANNER([OVSDB -- ovsdb-server transactions (SSL sockets)]) +AT_BANNER([OVSDB -- ovsdb-server transactions (SSL IPv4 sockets)]) # OVSDB_CHECK_EXECUTION(TITLE, SCHEMA, TRANSACTIONS, OUTPUT, [KEYWORDS]) # @@ -663,7 +791,46 @@ cat stdout >> output EXECUTION_EXAMPLES -AT_BANNER([OVSDB -- ovsdb-server transactions (TCP sockets)]) +AT_BANNER([OVSDB -- ovsdb-server transactions (SSL IPv6 sockets)]) + +# OVSDB_CHECK_EXECUTION(TITLE, SCHEMA, TRANSACTIONS, OUTPUT, [KEYWORDS]) +# +# Creates a database with the given SCHEMA, starts an ovsdb-server on +# that database, and runs each of the TRANSACTIONS (which should be a +# quoted list of quoted strings) against it with ovsdb-client one at a +# time. +# +# Checks that the overall output is OUTPUT, but UUIDs in the output +# are replaced by markers of the form where N is a number. The +# first unique UUID is replaced by <0>, the next by <1>, and so on. +# If a given UUID appears more than once it is always replaced by the +# same marker. +# +# TITLE is provided to AT_SETUP and KEYWORDS to AT_KEYWORDS. +m4_define([OVSDB_CHECK_EXECUTION], + [AT_SETUP([$1]) + AT_KEYWORDS([ovsdb server positive ssl6 $5]) + AT_SKIP_IF([test "$HAVE_OPENSSL" = no]) + OVS_RUNDIR=`pwd`; export OVS_RUNDIR + OVS_LOGDIR=`pwd`; export OVS_LOGDIR + $2 > schema + PKIDIR=$abs_top_builddir/tests + AT_CHECK([ovsdb-tool create db schema], [0], [stdout], [ignore]) + AT_CHECK([ovsdb-server --log-file --detach --no-chdir --pidfile="`pwd`"/pid --private-key=$PKIDIR/testpki-privkey2.pem --certificate=$PKIDIR/testpki-cert2.pem --ca-cert=$PKIDIR/testpki-cacert.pem --remote=pssl:0:[[::1]] --unixctl="`pwd`"/unixctl db], [0], [ignore], [ignore]) + SSL_PORT=`parse_listening_port < ovsdb-server.log` + m4_foreach([txn], [$3], + [AT_CHECK([ovsdb-client --private-key=$PKIDIR/testpki-privkey.pem --certificate=$PKIDIR/testpki-cert.pem --ca-cert=$PKIDIR/testpki-cacert.pem transact ssl:[[::1]]:$SSL_PORT 'txn'], [0], [stdout], [ignore], + [test ! -e pid || kill `cat pid`]) +cat stdout >> output +]) + AT_CHECK([${PERL} $srcdir/uuidfilt.pl output], [0], [$4], [ignore], + [test ! -e pid || kill `cat pid`]) + OVSDB_SERVER_SHUTDOWN + AT_CLEANUP]) + +ONE_EXECUTION_EXAMPLE + +AT_BANNER([OVSDB -- ovsdb-server transactions (TCP IPv4 sockets)]) AT_SETUP([ovsdb-client get-schema-version - tcp socket]) AT_KEYWORDS([ovsdb server positive tcp]) @@ -712,6 +879,44 @@ cat stdout >> output AT_CLEANUP]) EXECUTION_EXAMPLES + +AT_BANNER([OVSDB -- ovsdb-server transactions (TCP IPv6 sockets)]) + +# OVSDB_CHECK_EXECUTION(TITLE, SCHEMA, TRANSACTIONS, OUTPUT, [KEYWORDS]) +# +# Creates a database with the given SCHEMA, starts an ovsdb-server on +# that database, and runs each of the TRANSACTIONS (which should be a +# quoted list of quoted strings) against it with ovsdb-client one at a +# time. +# +# Checks that the overall output is OUTPUT, but UUIDs in the output +# are replaced by markers of the form where N is a number. The +# first unique UUID is replaced by <0>, the next by <1>, and so on. +# If a given UUID appears more than once it is always replaced by the +# same marker. +# +# TITLE is provided to AT_SETUP and KEYWORDS to AT_KEYWORDS. +m4_define([OVSDB_CHECK_EXECUTION], + [AT_SETUP([$1]) + AT_KEYWORDS([ovsdb server positive tcp6 $5]) + OVS_RUNDIR=`pwd`; export OVS_RUNDIR + OVS_LOGDIR=`pwd`; export OVS_LOGDIR + $2 > schema + PKIDIR=$abs_top_builddir/tests + AT_CHECK([ovsdb-tool create db schema], [0], [stdout], [ignore]) + AT_CHECK([ovsdb-server --log-file --detach --no-chdir --pidfile="`pwd`"/pid --remote=ptcp:0:[[::1]] --unixctl="`pwd`"/unixctl db], [0], [ignore], [ignore]) + TCP_PORT=`parse_listening_port < ovsdb-server.log` + m4_foreach([txn], [$3], + [AT_CHECK([ovsdb-client transact tcp:[[::1]]:$TCP_PORT 'txn'], [0], [stdout], [ignore], + [test ! -e pid || kill `cat pid`]) +cat stdout >> output +]) + AT_CHECK([${PERL} $srcdir/uuidfilt.pl output], [0], [$4], [ignore], + [test ! -e pid || kill `cat pid`]) + OVSDB_SERVER_SHUTDOWN + AT_CLEANUP]) + +ONE_EXECUTION_EXAMPLE AT_BANNER([OVSDB -- transactions on transient ovsdb-server])