[ovs-dev] Subject: [PATCH v3 3/3] ovsdb-idl: Add on-demand columns tests

Arguello, Sebastian sebastian.arguello at hpe.com
Thu Apr 28 16:18:45 UTC 2016


Add tests for the OVSDB IDL on-demand column mode.

This commit includes three tests to verify the correct functionality
of the on-demand fetching at row, column, and table level.

Co-Authored-By: Randall Esquivel <randall.esquivel at hpe.com>
Co-Authored-By: Arnoldo Lutz <arnoldo.lutz.guevara at hpe.com>

Signed-off-by: Sebastian Arguello <sebastian.arguello at hpe.com>
Signed-off-by: Arnoldo Lutz <arnoldo.lutz.guevara at hpe.com>
Signed-off-by: Randall Esquivel <randall.esquivel at hpe.com>
---
This is the pull request with this change: https://github.com/openvswitch/ovs/pull/110
---
 tests/ovsdb-idl.at | 165 ++++++++++++++++++++++++++++++++++++
 tests/test-ovsdb.c | 243 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 408 insertions(+)

diff --git a/tests/ovsdb-idl.at b/tests/ovsdb-idl.at
index 33d508c..efd8217 100644
--- a/tests/ovsdb-idl.at
+++ b/tests/ovsdb-idl.at
@@ -800,3 +800,168 @@ OVSDB_CHECK_IDL_TRACK([track, simple idl, initially empty, various ops],
 014: updated columns: ba i ia r ra s
 015: done
 ]])
+
+m4_define([OVSDB_CHECK_IDL_ON_DEMAND_FETCH_COL_ROW_C],
+  [AT_SETUP([$1 - C])
+   AT_KEYWORDS([ovsdb idl on-demand fetch  positive $5])
+   AT_CHECK([ovsdb-tool create db $abs_srcdir/idltest.ovsschema],
+                  [0], [stdout], [ignore])
+   AT_CHECK([ovsdb-server '-vPATTERN:console:ovsdb-server|%c|%m' --detach --no-chdir --pidfile="`pwd`"/pid --remote=punix:socket --unixctl="`pwd`"/unixctl db], [0], [ignore], [ignore])
+   m4_if([$2], [], [],
+     [AT_CHECK([ovsdb-client transact unix:socket $2], [0], [ignore], [ignore], [kill `cat pid`])])
+   AT_CHECK([test-ovsdb '-vPATTERN:console:test-ovsdb|%c|%m' -vjsonrpc -t10 -c idl-fetch-column-row unix:socket $2],
+            [0], [stdout], [ignore], [kill `cat pid`])
+   AT_CHECK([sort stdout | ${PERL} $srcdir/uuidfilt.pl]m4_if([$6],,, [[| $6]]),
+            [0], [$3], [], [kill `cat pid`])
+   OVSDB_SERVER_SHUTDOWN
+   AT_CLEANUP])
+
+m4_define([OVSDB_CHECK_IDL_ON_DEMAND_FETCH_COL_ROW],
+  [OVSDB_CHECK_IDL_ON_DEMAND_FETCH_COL_ROW_C($@)])
+
+OVSDB_CHECK_IDL_ON_DEMAND_FETCH_COL_ROW([on-demand-fetch-col-row, simple idl, initially populated],
+  [['["idltest",
+      {"op": "insert",
+       "table": "simple",
+       "row": {"i": 1,
+               "r": 2.0,
+               "b": true,
+               "s": "name",
+               "u": ["uuid", "84f5c8f5-ac76-4dbc-a24f-8860eb407fc1"],
+               "ia": ["set", [1, 2, 3]],
+               "ra": ["set", [-0.5]],
+               "ba": ["set", [true]],
+               "sa": ["set", ["abc", "def"]],
+               "ua": ["set", [["uuid", "69443985-7806-45e2-b35f-574a04e720f9"],
+                              ["uuid", "aad11ef0-816a-4b01-93e6-03b8b4256b98"]]]}},
+        {"op": "insert",
+       "table": "simple",
+       "row": {"i": 1,
+               "r": 2.0,
+               "b": true,
+               "s": "name",
+               "u": ["uuid", "84f5c8f5-ac76-4dbc-a24f-8860eb407fc1"],
+               "ia": ["set", [1, 2, 3]],
+               "ra": ["set", [-0.5]],
+               "ba": ["set", [true]],
+               "sa": ["set", ["abc", "def"]],
+               "ua": ["set", [["uuid", "69443985-7806-45e2-b35f-574a04e720f9"],
+                              ["uuid", "aad11ef0-816a-4b01-93e6-03b8b4256b98"]]]}}
+  ]']],
+  [[000: Initial. On-demand columns: [s ia ua]
+000: i=1 r=2 b=true s= u=<0> ia=[] ra=[-0.5] ba=[true] sa=[abc def] ua=[] uuid=<1>
+001: i=1 r=2 b=true s= u=<0> ia=[] ra=[-0.5] ba=[true] sa=[abc def] ua=[] uuid=<2>
+002: After changes with fetch for ua column in only one row
+002: i=1 r=2 b=true s= u=<0> ia=[] ra=[-0.5] ba=[true] sa=[abc def] ua=[<3> <4>] uuid=<1>
+003: i=1 r=2 b=true s= u=<0> ia=[] ra=[-0.5] ba=[true] sa=[abc def] ua=[] uuid=<2>
+]])
+
+m4_define([OVSDB_CHECK_IDL_ON_DEMAND_FETCH_COLUMN_C],
+  [AT_SETUP([$1 - C])
+   AT_KEYWORDS([ovsdb idl on-demand fetch  positive $5])
+   AT_CHECK([ovsdb-tool create db $abs_srcdir/idltest.ovsschema],
+                  [0], [stdout], [ignore])
+   AT_CHECK([ovsdb-server '-vPATTERN:console:ovsdb-server|%c|%m' --detach --no-chdir --pidfile="`pwd`"/pid --remote=punix:socket --unixctl="`pwd`"/unixctl db], [0], [ignore], [ignore])
+   m4_if([$2], [], [],
+     [AT_CHECK([ovsdb-client transact unix:socket $2], [0], [ignore], [ignore], [kill `cat pid`])])
+   AT_CHECK([test-ovsdb '-vPATTERN:console:test-ovsdb|%c|%m' -vjsonrpc -t10 -c idl-fetch-column unix:socket $2],
+            [0], [stdout], [ignore], [kill `cat pid`])
+   AT_CHECK([sort stdout | ${PERL} $srcdir/uuidfilt.pl]m4_if([$6],,, [[| $6]]),
+            [0], [$3], [], [kill `cat pid`])
+   OVSDB_SERVER_SHUTDOWN
+   AT_CLEANUP])
+
+m4_define([OVSDB_CHECK_IDL_ON_DEMAND_FETCH_COLUMN],
+  [OVSDB_CHECK_IDL_ON_DEMAND_FETCH_COLUMN_C($@)])
+
+OVSDB_CHECK_IDL_ON_DEMAND_FETCH_COLUMN([on-demand-fetch-column, simple idl, initially populated],
+  [['["idltest",
+      {"op": "insert",
+       "table": "simple",
+       "row": {"i": 1,
+               "r": 2.0,
+               "b": true,
+               "s": "name",
+               "u": ["uuid", "84f5c8f5-ac76-4dbc-a24f-8860eb407fc1"],
+               "ia": ["set", [1, 2, 3]],
+               "ra": ["set", [-0.5]],
+               "ba": ["set", [true]],
+               "sa": ["set", ["abc", "def"]],
+               "ua": ["set", [["uuid", "69443985-7806-45e2-b35f-574a04e720f9"],
+                              ["uuid", "aad11ef0-816a-4b01-93e6-03b8b4256b98"]]]}},
+        {"op": "insert",
+       "table": "simple",
+       "row": {"i": 1,
+               "r": 2.0,
+               "b": true,
+               "s": "name",
+               "u": ["uuid", "84f5c8f5-ac76-4dbc-a24f-8860eb407fc1"],
+               "ia": ["set", [1, 2, 3]],
+               "ra": ["set", [-0.5]],
+               "ba": ["set", [true]],
+               "sa": ["set", ["abc", "def"]],
+               "ua": ["set", [["uuid", "69443985-7806-45e2-b35f-574a04e720f9"],
+                              ["uuid", "aad11ef0-816a-4b01-93e6-03b8b4256b98"]]]}}
+  ]']],
+  [[000: Initial. On-demand columns: [s ia ua]
+000: i=1 r=2 b=true s= u=<0> ia=[] ra=[-0.5] ba=[true] sa=[abc def] ua=[] uuid=<1>
+001: i=1 r=2 b=true s= u=<0> ia=[] ra=[-0.5] ba=[true] sa=[abc def] ua=[] uuid=<2>
+002: After fetch for entire s column
+002: i=1 r=2 b=true s=name u=<0> ia=[] ra=[-0.5] ba=[true] sa=[abc def] ua=[] uuid=<1>
+003: i=1 r=2 b=true s=name u=<0> ia=[] ra=[-0.5] ba=[true] sa=[abc def] ua=[] uuid=<2>
+]])
+
+m4_define([OVSDB_CHECK_IDL_ON_DEMAND_FETCH_TABLE_C],
+  [AT_SETUP([$1 - C])
+   AT_KEYWORDS([ovsdb idl on-demand fetch  positive $5])
+   AT_CHECK([ovsdb-tool create db $abs_srcdir/idltest.ovsschema],
+                  [0], [stdout], [ignore])
+   AT_CHECK([ovsdb-server '-vPATTERN:console:ovsdb-server|%c|%m' --detach --no-chdir --pidfile="`pwd`"/pid --remote=punix:socket --unixctl="`pwd`"/unixctl db], [0], [ignore], [ignore])
+   m4_if([$2], [], [],
+     [AT_CHECK([ovsdb-client transact unix:socket $2], [0], [ignore], [ignore], [kill `cat pid`])])
+   AT_CHECK([test-ovsdb '-vPATTERN:console:test-ovsdb|%c|%m' -vjsonrpc -t10 -c idl-fetch-table unix:socket $2],
+            [0], [stdout], [ignore], [kill `cat pid`])
+   AT_CHECK([sort stdout | ${PERL} $srcdir/uuidfilt.pl]m4_if([$6],,, [[| $6]]),
+            [0], [$3], [], [kill `cat pid`])
+   OVSDB_SERVER_SHUTDOWN
+   AT_CLEANUP])
+
+m4_define([OVSDB_CHECK_IDL_ON_DEMAND_FETCH_TABLE],
+  [OVSDB_CHECK_IDL_ON_DEMAND_FETCH_TABLE_C($@)])
+
+OVSDB_CHECK_IDL_ON_DEMAND_FETCH_TABLE([on-demand-fetch-table, simple idl, initially populated],
+  [['["idltest",
+      {"op": "insert",
+       "table": "simple",
+       "row": {"i": 1,
+               "r": 2.0,
+               "b": true,
+               "s": "name",
+               "u": ["uuid", "84f5c8f5-ac76-4dbc-a24f-8860eb407fc1"],
+               "ia": ["set", [1, 2, 3]],
+               "ra": ["set", [-0.5]],
+               "ba": ["set", [true]],
+               "sa": ["set", ["abc", "def"]],
+               "ua": ["set", [["uuid", "69443985-7806-45e2-b35f-574a04e720f9"],
+                              ["uuid", "aad11ef0-816a-4b01-93e6-03b8b4256b98"]]]}},
+        {"op": "insert",
+       "table": "simple",
+       "row": {"i": 1,
+               "r": 2.0,
+               "b": true,
+               "s": "name",
+               "u": ["uuid", "84f5c8f5-ac76-4dbc-a24f-8860eb407fc1"],
+               "ia": ["set", [1, 2, 3]],
+               "ra": ["set", [-0.5]],
+               "ba": ["set", [true]],
+               "sa": ["set", ["abc", "def"]],
+               "ua": ["set", [["uuid", "69443985-7806-45e2-b35f-574a04e720f9"],
+                              ["uuid", "aad11ef0-816a-4b01-93e6-03b8b4256b98"]]]}}
+  ]']],
+  [[000: Initial. On-demand columns: [s ia ua]
+000: i=1 r=2 b=true s= u=<0> ia=[] ra=[-0.5] ba=[true] sa=[abc def] ua=[] uuid=<1>
+001: i=1 r=2 b=true s= u=<0> ia=[] ra=[-0.5] ba=[true] sa=[abc def] ua=[] uuid=<2>
+002: After complete table fetch
+002: i=1 r=2 b=true s=name u=<0> ia=[1 2 3] ra=[-0.5] ba=[true] sa=[abc def] ua=[<3> <4>] uuid=<1>
+003: i=1 r=2 b=true s=name u=<0> ia=[1 2 3] ra=[-0.5] ba=[true] sa=[abc def] ua=[<3> <4>] uuid=<2>
+]])
diff --git a/tests/test-ovsdb.c b/tests/test-ovsdb.c
index dbb6897..1633c0d 100644
--- a/tests/test-ovsdb.c
+++ b/tests/test-ovsdb.c
@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2009, 2010, 2011, 2012, 2013, 2015 Nicira, Inc.
+ * Copyright (C) 2016 Hewlett Packard Enterprise Development LP
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -198,6 +199,11 @@ usage(void)
            "    connect to SERVER and dump the contents of the database\n"
            "    as seen initially by the IDL implementation and after\n"
            "    executing each TRANSACTION.  (Each TRANSACTION must modify\n"
+           "    the database or this command will hang.)\n"
+           "  idl-fetch SERVER [TRANSACTION...]\n"
+           "    connect to SERVER and dump the contents of the database\n"
+           "    as seen initially by the IDL implementation and after\n"
+           "    executing each TRANSACTION.  (Each TRANSACTION must modify\n"
            "    the database or this command will hang.)\n",
            program_name, program_name);
     vlog_usage();
@@ -2179,6 +2185,240 @@ do_idl(struct ovs_cmdl_context *ctx)
     printf("%03d: done\n", step);
 }
 
+static void
+do_fetch_column_row(struct ovs_cmdl_context *ctx)
+{
+    struct jsonrpc *rpc;
+    struct ovsdb_idl *idl;
+    unsigned int seqno = 0;
+    int step = 0;
+    int error;
+    const struct idltest_simple *s;
+
+    idltest_init();
+
+    idl = ovsdb_idl_create(ctx->argv[1], &idltest_idl_class, true, true);
+    if (ctx->argc > 2) {
+        struct stream *stream;
+
+        error = stream_open_block(jsonrpc_stream_open(ctx->argv[1], &stream,
+                                  DSCP_DEFAULT), &stream);
+        if (error) {
+            ovs_fatal(error, "failed to connect to \"%s\"", ctx->argv[1]);
+        }
+        rpc = jsonrpc_open(stream);
+    } else {
+        rpc = NULL;
+    }
+
+    ovsdb_idl_add_table(idl, &idltest_table_simple);
+    ovsdb_idl_add_column(idl, &idltest_simple_col_b);
+    ovsdb_idl_add_column(idl, &idltest_simple_col_ba);
+    ovsdb_idl_add_column(idl, &idltest_simple_col_i);
+    ovsdb_idl_add_on_demand_column(idl, &idltest_table_simple,
+                                   &idltest_simple_col_ia);
+    ovsdb_idl_add_column(idl, &idltest_simple_col_r);
+    ovsdb_idl_add_column(idl, &idltest_simple_col_ra);
+    ovsdb_idl_add_column(idl, &idltest_simple_col_sa);
+    ovsdb_idl_add_column(idl, &idltest_simple_col_u);
+    ovsdb_idl_add_on_demand_column(idl, &idltest_table_simple,
+                                   &idltest_simple_col_s);
+    ovsdb_idl_add_on_demand_column(idl, &idltest_table_simple,
+                                   &idltest_simple_col_ua);
+
+    ovsdb_idl_get_initial_snapshot(idl);
+    ovsdb_idl_run(idl);
+
+    /* Wait for update. */
+    for (;;) {
+        ovsdb_idl_run(idl);
+        if (ovsdb_idl_get_seqno(idl) != seqno) {
+            break;
+        }
+        jsonrpc_run(rpc);
+
+        ovsdb_idl_wait(idl);
+        jsonrpc_wait(rpc);
+        poll_block();
+    }
+
+    /* Print initial simple data without fetching column. */
+    printf("%03d: Initial. On-demand columns: [s ia ua]\n", step);
+    s = idltest_simple_first(idl);
+    IDLTEST_SIMPLE_FOR_EACH(s, idl) {
+        print_idl_row_simple(s, step++);
+    }
+
+    /* get ondemand column of second row */
+    printf("%03d: After changes with fetch for ua column in only one row\n",
+            step);
+    s = idltest_simple_first(idl);
+    idltest_simple_fetch_ua(idl, s);
+    do {
+        ovsdb_idl_run(idl);
+    } while (idltest_simple_is_row_fetch_pending(s));
+    IDLTEST_SIMPLE_FOR_EACH(s, idl) {
+        print_idl_row_simple(s, step++);
+    }
+
+    ovsdb_idl_destroy(idl);
+}
+
+static void
+do_fetch_column(struct ovs_cmdl_context *ctx)
+{
+    struct jsonrpc *rpc;
+    struct ovsdb_idl *idl;
+    unsigned int seqno = 0;
+    int step = 0;
+    int error;
+    const struct idltest_simple *s;
+
+    idltest_init();
+
+    idl = ovsdb_idl_create(ctx->argv[1], &idltest_idl_class, true, true);
+    if (ctx->argc > 2) {
+        struct stream *stream;
+
+        error = stream_open_block(jsonrpc_stream_open(ctx->argv[1], &stream,
+                                  DSCP_DEFAULT), &stream);
+        if (error) {
+            ovs_fatal(error, "failed to connect to \"%s\"", ctx->argv[1]);
+        }
+        rpc = jsonrpc_open(stream);
+    } else {
+        rpc = NULL;
+    }
+
+    ovsdb_idl_add_table(idl, &idltest_table_simple);
+    ovsdb_idl_add_column(idl, &idltest_simple_col_b);
+    ovsdb_idl_add_column(idl, &idltest_simple_col_ba);
+    ovsdb_idl_add_column(idl, &idltest_simple_col_i);
+    ovsdb_idl_add_on_demand_column(idl, &idltest_table_simple,
+                                   &idltest_simple_col_ia);
+    ovsdb_idl_add_column(idl, &idltest_simple_col_r);
+    ovsdb_idl_add_column(idl, &idltest_simple_col_ra);
+    ovsdb_idl_add_column(idl, &idltest_simple_col_sa);
+    ovsdb_idl_add_column(idl, &idltest_simple_col_u);
+    ovsdb_idl_add_on_demand_column(idl, &idltest_table_simple,
+                                   &idltest_simple_col_s);
+    ovsdb_idl_add_on_demand_column(idl, &idltest_table_simple,
+                                   &idltest_simple_col_ua);
+
+    ovsdb_idl_get_initial_snapshot(idl);
+    ovsdb_idl_run(idl);
+
+    /* Wait for update. */
+    for (;;) {
+        ovsdb_idl_run(idl);
+        if (ovsdb_idl_get_seqno(idl) != seqno) {
+            break;
+        }
+        jsonrpc_run(rpc);
+
+        ovsdb_idl_wait(idl);
+        jsonrpc_wait(rpc);
+        poll_block();
+    }
+
+    /* Print initial simple data without fetching column. */
+    printf("%03d: Initial. On-demand columns: [s ia ua]\n", step);
+    s = idltest_simple_first(idl);
+    IDLTEST_SIMPLE_FOR_EACH(s, idl) {
+        print_idl_row_simple(s, step++);
+    }
+
+    /* Print simple data after fetching s column */
+    printf("%03d: After fetch for entire s column\n", step);
+    s = idltest_simple_first(idl);
+    idltest_simple_fetch_col_s(idl);
+    do {
+        ovsdb_idl_run(idl);
+    } while (idltest_simple_is_s_fetch_pending(idl));
+    IDLTEST_SIMPLE_FOR_EACH(s, idl) {
+        print_idl_row_simple(s, step++);
+    }
+
+    ovsdb_idl_destroy(idl);
+}
+
+static void
+do_fetch_table(struct ovs_cmdl_context *ctx)
+{
+    struct jsonrpc *rpc;
+    struct ovsdb_idl *idl;
+    unsigned int seqno = 0;
+    int step = 0;
+    int error;
+    const struct idltest_simple *s;
+
+    idltest_init();
+
+    idl = ovsdb_idl_create(ctx->argv[1], &idltest_idl_class, true, true);
+    if (ctx->argc > 2) {
+        struct stream *stream;
+
+        error = stream_open_block(jsonrpc_stream_open(ctx->argv[1], &stream,
+                                  DSCP_DEFAULT), &stream);
+        if (error) {
+            ovs_fatal(error, "failed to connect to \"%s\"", ctx->argv[1]);
+        }
+        rpc = jsonrpc_open(stream);
+    } else {
+        rpc = NULL;
+    }
+
+    ovsdb_idl_add_table(idl, &idltest_table_simple);
+    ovsdb_idl_add_column(idl, &idltest_simple_col_b);
+    ovsdb_idl_add_column(idl, &idltest_simple_col_ba);
+    ovsdb_idl_add_column(idl, &idltest_simple_col_i);
+    ovsdb_idl_add_on_demand_column(idl, &idltest_table_simple,
+                                   &idltest_simple_col_ia);
+    ovsdb_idl_add_column(idl, &idltest_simple_col_r);
+    ovsdb_idl_add_column(idl, &idltest_simple_col_ra);
+    ovsdb_idl_add_column(idl, &idltest_simple_col_sa);
+    ovsdb_idl_add_column(idl, &idltest_simple_col_u);
+    ovsdb_idl_add_on_demand_column(idl, &idltest_table_simple,
+                                   &idltest_simple_col_s);
+    ovsdb_idl_add_on_demand_column(idl, &idltest_table_simple,
+                                   &idltest_simple_col_ua);
+
+    ovsdb_idl_get_initial_snapshot(idl);
+    ovsdb_idl_run(idl);
+
+    /* Wait for update. */
+    for (;;) {
+        ovsdb_idl_run(idl);
+        if (ovsdb_idl_get_seqno(idl) != seqno) {
+            break;
+        }
+        jsonrpc_run(rpc);
+
+        ovsdb_idl_wait(idl);
+        jsonrpc_wait(rpc);
+        poll_block();
+    }
+
+    /* Print initial simple data without fetching column. */
+    printf("%03d: Initial. On-demand columns: [s ia ua]\n", step);
+    s = idltest_simple_first(idl);
+    IDLTEST_SIMPLE_FOR_EACH(s, idl) {
+        print_idl_row_simple(s, step++);
+    }
+
+    /* fetch complete table */
+    printf("%03d: After complete table fetch\n", step);
+    idltest_simple_fetch_table(idl);
+    do {
+        ovsdb_idl_run(idl);
+    } while (idltest_simple_is_table_fetch_pending(idl));
+    IDLTEST_SIMPLE_FOR_EACH(s, idl) {
+        print_idl_row_simple(s, step++);
+    }
+
+    ovsdb_idl_destroy(idl);
+}
+
 static struct ovs_cmdl_command all_commands[] = {
     { "log-io", NULL, 2, INT_MAX, do_log_io },
     { "default-atoms", NULL, 0, 0, do_default_atoms },
@@ -2207,6 +2447,9 @@ static struct ovs_cmdl_command all_commands[] = {
     { "execute", NULL, 2, INT_MAX, do_execute },
     { "trigger", NULL, 2, INT_MAX, do_trigger },
     { "idl", NULL, 1, INT_MAX, do_idl },
+    { "idl-fetch-column-row", NULL, 1, INT_MAX, do_fetch_column_row },
+    { "idl-fetch-column", NULL, 1, INT_MAX, do_fetch_column },
+    { "idl-fetch-table", NULL, 1, INT_MAX, do_fetch_table },
     { "help", NULL, 0, INT_MAX, do_help },
     { NULL, NULL, 0, 0, NULL },
 };
-- 
1.9.1



More information about the dev mailing list