AT_BANNER([OVSDB -- ovsdb-tool])

# OVSDB_CHECK_EXECUTION(TITLE, SCHEMA, TRANSACTIONS, OUTPUT, [KEYWORDS])
#
# Creates a database with the given SCHEMA and runs each of the
# TRANSACTIONS (which should be a quoted list of quoted strings)
# against it with ovsdb-tool one at a time.  
#
# Checks that the overall output is OUTPUT, but UUIDs in the output
# are replaced by markers of the form <N> 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 file positive $5])
   $2 > schema
   touch .db.~lock~
   AT_CHECK([ovsdb-tool create db schema], [0], [stdout], [ignore])
   m4_foreach([txn], [$3], 
     [AT_CHECK([ovsdb-tool transact db 'txn'], [0], [stdout], [ignore])
cat stdout >> output
])
   AT_CHECK([uuidfilt output], [0], [$4])
   AT_CLEANUP])

EXECUTION_EXAMPLES

AT_SETUP([transaction comments])
AT_KEYWORDS([ovsdb file positive])
ordinal_schema > schema
touch .db.~lock~
AT_CHECK([ovsdb-tool create db schema], [0], [], [ignore])
AT_CHECK([[ovsdb-tool transact db '
    ["ordinals",
     {"op": "insert",
      "table": "ordinals",
      "row": {"name": "five", "number": 5}},
     {"op": "comment",
      "comment": "add row for 5"}]']], [0], [stdout], [ignore])
AT_CHECK([uuidfilt stdout], [0],
 [[[{"uuid":["uuid","<0>"]},{}]
]])
AT_CHECK([grep "add row for 5" db], [0], [ignore])
AT_CLEANUP

AT_SETUP([ovsdb-tool compact])
AT_KEYWORDS([ovsdb file positive])
ordinal_schema > schema
dnl Make sure that "ovsdb-tool create" works with a dangling symlink,
dnl creating the target of the symlink rather than replacing the symlink
dnl with a regular file, and that the lockfile gets created relative to
dnl the symlink's target.
mkdir dir
: > dir/.db.~lock~
if test "$IS_WIN32" = "no"; then
    ln -s dir/db db
    AT_SKIP_IF([test ! -h db])
fi
AT_CHECK([ovsdb-tool create db schema], [0], [], [ignore])
if test "$IS_WIN32" = "no"; then
    AT_CHECK([test ! -e .db.~lock])
    AT_CHECK([test -h db])
    AT_CHECK([test -f dir/db])
fi
dnl Do a bunch of random transactions that put crap in the database log.
AT_CHECK(
  [[for pair in 'zero 0' 'one 1' 'two 2' 'three 3' 'four 4' 'five 5'; do
      set -- $pair
      ovsdb-tool transact db '
        ["ordinals",
         {"op": "insert",
          "table": "ordinals",
          "row": {"name": "'$1'", "number": '$2'}},
         {"op": "comment",
          "comment": "add row for '"$pair"'"}]'
      ovsdb-tool transact db '
        ["ordinals",
         {"op": "delete",
          "table": "ordinals",
          "where": [["number", "==", '$2']]},
         {"op": "comment",
          "comment": "delete row for '"$2"'"}]'
      ovsdb-tool transact db '
        ["ordinals",
         {"op": "insert",
          "table": "ordinals",
          "row": {"name": "'$1'", "number": '$2'}},
         {"op": "comment",
          "comment": "add back row for '"$pair"'"}]'
    done]],
  [0], [stdout], [ignore])
dnl Check that all the crap is in fact in the database log.
AT_CHECK([[uuidfilt db | grep -v ^OVSDB | sed 's/"_date":[0-9]*/"_date":0/' | \
            sed 's/"_is_diff":true,//' | 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}}
{"_comment":"add back row for zero 0","_date":0,"ordinals":{"<1>":{"name":"zero"}}}
{"_comment":"add row for one 1","_date":0,"ordinals":{"<2>":{"name":"one","number":1}}}
{"_comment":"delete row for 1","_date":0,"ordinals":{"<2>":null}}
{"_comment":"add back row for one 1","_date":0,"ordinals":{"<3>":{"name":"one","number":1}}}
{"_comment":"add row for two 2","_date":0,"ordinals":{"<4>":{"name":"two","number":2}}}
{"_comment":"delete row for 2","_date":0,"ordinals":{"<4>":null}}
{"_comment":"add back row for two 2","_date":0,"ordinals":{"<5>":{"name":"two","number":2}}}
{"_comment":"add row for three 3","_date":0,"ordinals":{"<6>":{"name":"three","number":3}}}
{"_comment":"delete row for 3","_date":0,"ordinals":{"<6>":null}}
{"_comment":"add back row for three 3","_date":0,"ordinals":{"<7>":{"name":"three","number":3}}}
{"_comment":"add row for four 4","_date":0,"ordinals":{"<8>":{"name":"four","number":4}}}
{"_comment":"delete row for 4","_date":0,"ordinals":{"<8>":null}}
{"_comment":"add back row for four 4","_date":0,"ordinals":{"<9>":{"name":"four","number":4}}}
{"_comment":"add row for five 5","_date":0,"ordinals":{"<10>":{"name":"five","number":5}}}
{"_comment":"delete row for 5","_date":0,"ordinals":{"<10>":null}}
{"_comment":"add back row for five 5","_date":0,"ordinals":{"<11>":{"name":"five","number":5}}}
]])

dnl Dump out and check the actual database contents.
on_exit 'kill `cat ovsdb-server.pid`'
AT_CHECK([[ovsdb-server --detach --pidfile --no-chdir --remote=punix:socket db]],
         [0], [stdout], [ignore])
AT_CHECK([[ovsdb-client dump unix:socket ordinals]],
         [0], [stdout], [ignore])
OVS_APP_EXIT_AND_WAIT([ovsdb-server])

AT_CHECK([uuidfilt stdout], [0], [dnl
ordinals table
_uuid                                name  number
------------------------------------ ----- ------
<0> five  5
<1> four  4
<2> one   1
<3> three 3
<4> two   2
<5> zero  0
])
dnl Now compact the database in-place.
touch .db.tmp.~lock~
AT_CHECK([[ovsdb-tool compact db]], [0], [], [ignore])
dnl Make sure that "db" is still a symlink to dir/db instead of getting
dnl replaced by a regular file.
if test "$IS_WIN32" = "no"; then
    AT_CHECK([test ! -e .db.~lock])
    AT_CHECK([test -h db])
    AT_CHECK([test -f dir/db])
fi
dnl We can't fully re-check the contents of the database log, because the
dnl order of the records is not predictable, but there should only be 4 lines
dnl in it now.
AT_CAPTURE_FILE([db])
AT_CHECK([test `wc -l < db` -eq 4])
dnl And check that the dumped data is the same too:
AT_CHECK([[ovsdb-server --detach --pidfile --no-chdir --remote=punix:socket db]],
         [0], [stdout], [ignore])
AT_CHECK([[ovsdb-client dump unix:socket ordinals]],
         [0], [stdout], [ignore])
OVS_APP_EXIT_AND_WAIT([ovsdb-server])

AT_CHECK([uuidfilt stdout], [0], [dnl
ordinals table
_uuid                                name  number
------------------------------------ ----- ------
<0> five  5
<1> four  4
<2> one   1
<3> three 3
<4> two   2
<5> zero  0
])
AT_CLEANUP

AT_SETUP([ovsdb-tool convert -- removing a column])
AT_KEYWORDS([ovsdb file positive])
ordinal_schema > schema
AT_DATA([new-schema], 
  [[{"name": "ordinals",
     "tables": {
       "ordinals": {
         "columns": {
           "number": {"type": "integer"}}}}}
]])
touch .db.~lock~
AT_CHECK([ovsdb-tool create db schema], [0], [], [ignore])
dnl Put some data in the database.
AT_CHECK(
  [[for pair in 'zero 0' 'one 1' 'two 2' 'three 3' 'four 4' 'five 5'; do
      set -- $pair
      ovsdb-tool transact db '
        ["ordinals",
         {"op": "insert",
          "table": "ordinals",
          "row": {"name": "'$1'", "number": '$2'}},
         {"op": "comment",
          "comment": "add row for '"$pair"'"}]'
    done]],
  [0], [stdout], [ignore])
dnl Dump out and check the actual database contents.
AT_CHECK([[ovsdb-server --detach --no-chdir --pidfile --remote=punix:socket db]],
  [0])
AT_CHECK([ovsdb-client dump unix:socket ordinals], [0], [stdout], [ignore])
AT_CHECK([uuidfilt stdout], [0], [dnl
ordinals table
_uuid                                name  number
------------------------------------ ----- ------
<0> five  5
<1> four  4
<2> one   1
<3> three 3
<4> two   2
<5> zero  0
])
OVS_APP_EXIT_AND_WAIT([ovsdb-server])
dnl Now convert the database in-place.
touch .db.tmp.~lock~
AT_CHECK([[ovsdb-tool convert db new-schema]], [0], [], [ignore])
dnl We can't fully re-check the contents of the database log, because the
dnl order of the records is not predictable, but there should only be 4 lines
dnl in it now.
AT_CAPTURE_FILE([db])
AT_CHECK([test `wc -l < db` -eq 4])
dnl And check that the dumped data is the same except for the removed column:
AT_CHECK([[ovsdb-server --detach --no-chdir --pidfile --remote=punix:socket db]],
  [0])
AT_CHECK([ovsdb-client dump unix:socket ordinals], [0], [stdout], [ignore])
AT_CHECK([uuidfilt stdout], [0], [dnl
ordinals table
_uuid                                number
------------------------------------ ------
<0> 0
<1> 1
<2> 2
<3> 3
<4> 4
<5> 5
])
OVS_APP_EXIT_AND_WAIT([ovsdb-server])
AT_CLEANUP

AT_SETUP([ovsdb-tool convert -- adding a column])
AT_KEYWORDS([ovsdb file positive])
AT_DATA([schema], 
  [[{"name": "ordinals",
     "tables": {
       "ordinals": {
         "columns": {
           "number": {"type": "integer"}}}}}
]])
ordinal_schema > new-schema
touch .db.~lock~
AT_CHECK([ovsdb-tool create db schema], [0], [], [ignore])
dnl Put some data in the database.
AT_CHECK(
  [[for number in 0 1 2 3 4 5; do
      ovsdb-tool transact db '
        ["ordinals",
         {"op": "insert",
          "table": "ordinals",
          "row": {"number": '$number'}},
         {"op": "comment",
          "comment": "add row for '"$number"'"}]'
    done]],
  [0], [stdout], [ignore])
dnl Dump out and check the actual database contents.
AT_CHECK([[ovsdb-server --detach --no-chdir --pidfile --remote=punix:socket db]],
  [0])
AT_CHECK([ovsdb-client dump unix:socket ordinals], [0], [stdout], [ignore])
AT_CHECK([uuidfilt stdout], [0], [dnl
ordinals table
_uuid                                number
------------------------------------ ------
<0> 0
<1> 1
<2> 2
<3> 3
<4> 4
<5> 5
])
OVS_APP_EXIT_AND_WAIT([ovsdb-server])
dnl Now convert the database in-place.
touch .db.tmp.~lock~
AT_CHECK([[ovsdb-tool convert db new-schema]], [0], [], [ignore])
dnl We can't fully re-check the contents of the database log, because the
dnl order of the records is not predictable, but there should only be 4 lines
dnl in it now.
AT_CAPTURE_FILE([db])
AT_CHECK([test `wc -l < db` -eq 4])
dnl And check that the dumped data is the same except for the added column:
AT_CHECK([[ovsdb-server --detach --no-chdir --pidfile --remote=punix:socket db]],
  [0])
AT_CHECK([ovsdb-client dump unix:socket ordinals], [0], [stdout], [ignore])
AT_CHECK([uuidfilt stdout], [0], [dnl
ordinals table
_uuid                                name number
------------------------------------ ---- ------
<0> ""   0
<1> ""   1
<2> ""   2
<3> ""   3
<4> ""   4
<5> ""   5
])
OVS_APP_EXIT_AND_WAIT([ovsdb-server])
AT_CLEANUP

AT_SETUP([ovsdb-tool unsupported cluster operations])
AT_KEYWORDS([ovsdb file negative compact query transact convert])
ordinal_schema > schema
AT_CHECK([ovsdb-tool create-cluster db schema unix:s1.raft])
AT_CHECK([ovsdb-tool compact db], [1], [], [ovsdb-tool: ovsdb error: db: cannot apply this operation to clustered database file
])
AT_CHECK([ovsdb-tool convert db schema], [1], [], [ovsdb-tool: ovsdb error: db: cannot apply this operation to clustered database file
])
AT_CHECK([ovsdb-tool needs-conversion db schema], [1], [], [ovsdb-tool: ovsdb error: db: cannot apply this operation to clustered database file
])
AT_CHECK([ovsdb-tool query db '[[]]'], [1], [], [ovsdb-tool: ovsdb error: db: cannot apply this operation to clustered database file
])
AT_CHECK([ovsdb-tool transact db '[[]]'], [1], [], [ovsdb-tool: ovsdb error: db: cannot apply this operation to clustered database file
])
AT_CLEANUP

AT_SETUP([ovsdb-tool schema-version, schema-cksum, schema-name])
AT_KEYWORDS([ovsdb file positive schema-version schema-cksum])
ordinal_schema > schema
AT_CHECK([ovsdb-tool schema-version schema], [0], [5.1.3
])
AT_CHECK([ovsdb-tool schema-cksum schema], [0], [12345678 9
])
AT_CHECK([ovsdb-tool schema-name schema], [0], [ordinals
])
AT_CLEANUP

AT_SETUP([ovsdb-tool database inspection commands - standalone])
AT_KEYWORDS([ovsdb file positive db-version db-cksum db-name db-cid db-sid db-local-address])
ordinal_schema > schema
touch .db.~lock~
AT_CHECK([ovsdb-tool create db schema], [0], [], [ignore])
AT_CHECK([ovsdb-tool db-version db], [0], [5.1.3
])
AT_CHECK([ovsdb-tool db-cksum db], [0], [12345678 9
])
AT_CHECK([ovsdb-tool db-name db], [0], [ordinals
])
AT_CHECK([ovsdb-tool db-cid db], [1], [], [ovsdb-tool: db: not a clustered database
])
AT_CHECK([ovsdb-tool db-sid db], [1], [], [ovsdb-tool: db: not a clustered database
])
AT_CHECK([ovsdb-tool db-local-address db], [1], [], [ovsdb-tool: db: not a clustered database
])
AT_CLEANUP

AT_SETUP([ovsdb-tool database inspection commands - clustered])
AT_KEYWORDS([ovsdb file negative db-version db-cksum db-name db-cid db-sid db-local-address cluster])
ordinal_schema > schema
touch .db.~lock~
AT_CHECK([ovsdb-tool create-cluster db schema tcp:1.2.3.4:1234])
AT_CHECK([ovsdb-tool db-version db], [1], [], [ovsdb-tool: ovsdb error: db: cannot apply this operation to clustered database file
])
AT_CHECK([ovsdb-tool db-cksum db], [1], [], [ovsdb-tool: ovsdb error: db: cannot apply this operation to clustered database file
])
AT_CHECK([ovsdb-tool db-name db], [0], [ordinals
])
AT_CHECK([(ovsdb-tool db-cid db; ovsdb-tool db-sid db) | uuidfilt], [0], [<0>
<1>
])
AT_CHECK([ovsdb-tool db-local-address db], [0], [tcp:1.2.3.4:1234
])
AT_CLEANUP

AT_SETUP([ovsdb-tool database inspection commands - joining a cluster])
AT_KEYWORDS([ovsdb file positive db-version db-cksum db-name db-cid db-sid db-local-address cluster join joining])
ordinal_schema > schema
touch .db.~lock~
for cid in '' 520cf525-3772-43cc-8268-23bf5b548cf4; do
    if test -z "$cid"; then
        cid_option=
    else
        cid_option=--cid=$cid
    fi
    AT_CHECK([rm -f db && ovsdb-tool $cid_option join-cluster db ordinals tcp:1.2.3.4:1234 tcp:2.3.4.5:1234], [0], [], [ignore])
    AT_CHECK([ovsdb-tool db-version db], [1], [], [ovsdb-tool: ovsdb error: db: cannot apply this operation to clustered database file
])
    AT_CHECK([ovsdb-tool db-cksum db], [1], [], [ovsdb-tool: ovsdb error: db: cannot apply this operation to clustered database file
])
    AT_CHECK([ovsdb-tool db-name db], [0], [ordinals
])
    if test -z "$cid"; then
        AT_CHECK([ovsdb-tool db-cid db], [2], [], [db: cluster ID not yet known
])
    else
        AT_CHECK_UNQUOTED([ovsdb-tool db-cid db], [0], [$cid
])
    fi
    AT_CHECK([ovsdb-tool db-sid db | uuidfilt], [0], [<0>
])
    AT_CHECK([ovsdb-tool db-local-address db], [0], [tcp:1.2.3.4:1234
])
done
AT_CLEANUP

AT_SETUP([ovsdb-tool needs-conversion (no conversion needed)])
AT_KEYWORDS([ovsdb file positive])
ordinal_schema > schema
touch .db.~lock~
AT_CHECK([ovsdb-tool create db schema], [0], [], [ignore])
AT_CHECK([ovsdb-tool needs-conversion db schema], [0], [no
])
AT_CLEANUP

AT_SETUP([ovsdb-tool needs-conversion (conversion needed)])
AT_KEYWORDS([ovsdb file positive])
ordinal_schema > schema
touch .db.~lock~
AT_CHECK([ovsdb-tool create db schema], [0], [], [ignore])
sed 's/5\.1\.3/5.1.4/' < schema > schema2
AT_CHECK([diff schema schema2], [1], [ignore])
AT_CHECK([ovsdb-tool needs-conversion db schema2], [0], [yes
])
AT_CLEANUP

AT_SETUP([ovsdb-tool create-cluster with initial data])
AT_KEYWORDS([ovsdb file positive])

# Create a standalone database and put some data in it.
ordinal_schema > schema
ovsdb-tool create db1 schema
AT_CHECK(
  [[for pair in 'zero 0' 'one 1' 'two 2' 'three 3' 'four 4' 'five 5'; do
      set -- $pair
      ovsdb-tool transact db1 '
        ["ordinals",
         {"op": "insert",
          "table": "ordinals",
          "row": {"name": "'$1'", "number": '$2'}},
         {"op": "comment",
          "comment": "add row for '"$pair"'"}]'
    done | uuidfilt]], [0],
[[[{"uuid":["uuid","<0>"]},{}]
[{"uuid":["uuid","<1>"]},{}]
[{"uuid":["uuid","<2>"]},{}]
[{"uuid":["uuid","<3>"]},{}]
[{"uuid":["uuid","<4>"]},{}]
[{"uuid":["uuid","<5>"]},{}]
]], [ignore])

# Dump the data.
AT_CHECK([ovsdb-server -vfile -vvlog:off --detach --no-chdir --pidfile --log-file --remote=punix:db.sock db1])
AT_CHECK([ovsdb-client dump > expout])
OVS_APP_EXIT_AND_WAIT([ovsdb-server])

# Create a clustered database from the standalone one.
ovsdb-tool create-cluster db2 db1 unix:s1.raft

# Dump the data.
AT_CHECK([ovsdb-server -vconsole:off -vfile -vvlog:off --detach --no-chdir --pidfile --log-file --remote=punix:db.sock db2])
AT_CHECK([ovsdb_client_wait ordinals connected])
AT_CHECK([ovsdb-client dump > dump2])
OVS_APP_EXIT_AND_WAIT([ovsdb-server])

# Make sure that the clustered data matched the standalone data.
AT_CHECK([cat dump2], [0], [expout])
AT_CLEANUP

AT_SETUP([ovsdb-tool convert-to-standalone])
AT_KEYWORDS([ovsdb file positive])
ordinal_schema > schema
AT_CHECK([ovsdb-tool create-cluster db schema unix:s1.raft], [0], [stdout], [ignore])
on_exit 'kill `cat ovsdb-server.pid`'
AT_CHECK([ovsdb-server --detach --no-chdir --pidfile --remote=punix:socket --log-file db >/dev/null 2>&1])
for txn in m4_foreach([txn], [[[["ordinals",
      {"op": "insert",
       "table": "ordinals",
       "row": {"number": 0, "name": "zero"}},
      {"op": "insert",
       "table": "ordinals",
       "row": {"number": 1, "name": "one"}},
      {"op": "insert",
       "table": "ordinals",
       "row": {"number": 2, "name": "two"}}]]]], ['txn' ]); do
AT_CHECK([ovsdb-client transact unix:socket "$txn"], [0], [ignore], [ignore])
done
AT_CHECK([ovsdb-client transact unix:socket '[["ordinals"]]'], [0],
         [ignore], [ignore])
AT_CHECK([ovsdb-client dump unix:socket > clusterdump])
AT_CHECK([ovs-appctl -t ovsdb-server -e exit], [0], [ignore], [ignore])

# Convert to standalone database from clustered database.
AT_CHECK(ovsdb-tool cluster-to-standalone db1 db)

# Check its standalone db
AT_CHECK([ovsdb-tool db-is-standalone db1])

# Dump the standalone db data.
AT_CHECK([ovsdb-server -vconsole:off -vfile -vvlog:off --detach --no-chdir --pidfile --log-file --remote=punix:db.sock db1])
AT_CHECK([ovsdb_client_wait ordinals connected])
AT_CHECK([ovsdb-client dump  > standalonedump])
OVS_APP_EXIT_AND_WAIT([ovsdb-server])

# Make sure both standalone and cluster db data matches.
AT_CHECK([diff standalonedump clusterdump])
AT_CLEANUP

AT_SETUP([ovsdb-tool convert-to-standalone after schema conversion])
AT_KEYWORDS([ovsdb file positive])
ordinal_schema > schema
AT_CHECK([ovsdb-tool create-cluster db schema unix:s1.raft], [0], [stdout], [ignore])
on_exit 'kill `cat ovsdb-server.pid`'
AT_CHECK([ovsdb-server --detach --no-chdir --pidfile --remote=punix:socket dnl
                       --log-file db >/dev/null 2>&1])
for txn in m4_foreach([txn], [[[["ordinals",
      {"op": "insert",
       "table": "ordinals",
       "row": {"number": 0, "name": "zero"}},
      {"op": "insert",
       "table": "ordinals",
       "row": {"number": 1, "name": "one"}},
      {"op": "insert",
       "table": "ordinals",
       "row": {"number": 2, "name": "two"}}]]]], ['txn' ]); do
  AT_CHECK([ovsdb-client transact unix:socket "$txn"], [0], [ignore], [ignore])
done

dnl Change the schema.
AT_CHECK([sed 's/5\.1\.3/5.1.4/' < schema > schema2])
AT_CHECK([sed -i'back' -e '/.*"number":.*/a \
           "is_seven": {"type": "boolean"},
           ' schema2])

dnl Convert the database.
AT_CHECK([ovsdb-client convert unix:socket schema2])

dnl Add a new row with a new column.
AT_CHECK([ovsdb-client transact unix:socket dnl
  '[["ordinals",
     {"op": "insert",
      "table": "ordinals",
      "row": {"number": 7, "name": "seven", "is_seven": true}
     }]]'], [0], [ignore], [ignore])

AT_CHECK([ovsdb-client dump unix:socket > clusterdump])

AT_CHECK([uuidfilt clusterdump], [0], [dnl
ordinals table
_uuid                                is_seven name  number
------------------------------------ -------- ----- ------
<0> false    one   1
<1> false    two   2
<2> false    zero  0
<3> true     seven 7
])

OVS_APP_EXIT_AND_WAIT([ovsdb-server])

dnl Convert to standalone database from clustered database.
AT_CHECK(ovsdb-tool cluster-to-standalone db1 db)

dnl Check it's a standalone db.
AT_CHECK([ovsdb-tool db-is-standalone db1])

dnl Dump the standalone db data.
AT_CHECK([ovsdb-server -vconsole:off -vfile -vvlog:off --detach --no-chdir dnl
                       --pidfile --log-file --remote=punix:db.sock db1])
AT_CHECK([ovsdb_client_wait ordinals connected])
AT_CHECK([ovsdb-client dump > standalonedump])
OVS_APP_EXIT_AND_WAIT([ovsdb-server])

dnl Make sure both standalone and cluster db data matches.
AT_CHECK([diff standalonedump clusterdump])
AT_CLEANUP
