X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=tests%2Ftest-ovsdb.c;h=29d75420f6f8889d82bab8fe78055b94acec90e8;hb=HEAD;hp=1c1116e1f8cad95ef23b10ca60009b11904171d4;hpb=958ac03a3f785303399316eda76362d26adb09d4;p=sliver-openvswitch.git diff --git a/tests/test-ovsdb.c b/tests/test-ovsdb.c index 1c1116e1f..29d75420f 100644 --- a/tests/test-ovsdb.c +++ b/tests/test-ovsdb.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2010 Nicira Networks. + * Copyright (c) 2009, 2010, 2011, 2012, 2013 Nicira, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -39,6 +39,7 @@ #include "ovsdb/ovsdb.h" #include "ovsdb/query.h" #include "ovsdb/row.h" +#include "ovsdb/server.h" #include "ovsdb/table.h" #include "ovsdb/transaction.h" #include "ovsdb/trigger.h" @@ -50,30 +51,27 @@ #include "util.h" #include "vlog.h" -static struct command all_commands[]; - static void usage(void) NO_RETURN; static void parse_options(int argc, char *argv[]); +static struct command *get_all_commands(void); int main(int argc, char *argv[]) { set_program_name(argv[0]); - time_init(); - vlog_init(); parse_options(argc, argv); - run_command(argc - optind, argv + optind, all_commands); + run_command(argc - optind, argv + optind, get_all_commands()); return 0; } static void parse_options(int argc, char *argv[]) { - static struct option long_options[] = { - {"timeout", required_argument, 0, 't'}, - {"verbose", optional_argument, 0, 'v'}, - {"help", no_argument, 0, 'h'}, - {0, 0, 0, 0}, + static const struct option long_options[] = { + {"timeout", required_argument, NULL, 't'}, + {"verbose", optional_argument, NULL, 'v'}, + {"help", no_argument, NULL, 'h'}, + {NULL, 0, NULL, 0}, }; char *short_options = long_options_to_short_options(long_options); @@ -143,7 +141,7 @@ usage(void) " parse string DATUMs as data of given TYPE, and re-serialize\n" " parse-column NAME OBJECT\n" " parse column NAME with info OBJECT, and re-serialize\n" - " parse-table NAME OBJECT\n" + " parse-table NAME OBJECT [DEFAULT-IS-ROOT]\n" " parse table NAME with info OBJECT\n" " parse-row TABLE ROW..., and re-serialize\n" " parse each ROW of defined TABLE\n" @@ -478,7 +476,12 @@ do_parse_atom_strings(int argc, char *argv[]) } static void -do_parse_data(int argc, char *argv[]) +do_parse_data__(int argc, char *argv[], + struct ovsdb_error * + (*parse)(struct ovsdb_datum *datum, + const struct ovsdb_type *type, + const struct json *json, + struct ovsdb_symbol_table *symtab)) { struct ovsdb_type type; struct json *json; @@ -492,7 +495,7 @@ do_parse_data(int argc, char *argv[]) struct ovsdb_datum datum; json = unbox_json(parse_json(argv[i])); - check_ovsdb_error(ovsdb_datum_from_json(&datum, &type, json, NULL)); + check_ovsdb_error(parse(&datum, &type, json, NULL)); json_destroy(json); print_and_free_json(ovsdb_datum_to_json(&datum, &type)); @@ -502,6 +505,12 @@ do_parse_data(int argc, char *argv[]) ovsdb_type_destroy(&type); } +static void +do_parse_data(int argc, char *argv[]) +{ + do_parse_data__(argc, argv, ovsdb_datum_from_json); +} + static void do_parse_data_strings(int argc, char *argv[]) { @@ -599,12 +608,15 @@ static void do_parse_table(int argc OVS_UNUSED, char *argv[]) { struct ovsdb_table_schema *ts; + bool default_is_root; struct json *json; + default_is_root = argc > 3 && !strcmp(argv[3], "true"); + json = parse_json(argv[2]); check_ovsdb_error(ovsdb_table_schema_from_json(json, argv[1], &ts)); json_destroy(json); - print_and_free_json(ovsdb_table_schema_to_json(ts)); + print_and_free_json(ovsdb_table_schema_to_json(ts, default_is_root)); ovsdb_table_schema_destroy(ts); } @@ -810,7 +822,7 @@ do_evaluate_conditions(int argc OVS_UNUSED, char *argv[]) json_destroy(json); for (i = 0; i < n_conditions; i++) { - printf("condition %2zu:", i); + printf("condition %2"PRIuSIZE":", i); for (j = 0; j < n_rows; j++) { bool result = ovsdb_condition_evaluate(rows[j], &conditions[i]); if (j % 5 == 0) { @@ -916,7 +928,7 @@ do_execute_mutations(int argc OVS_UNUSED, char *argv[]) json_destroy(json); for (i = 0; i < n_sets; i++) { - printf("mutation %2zu:\n", i); + printf("mutation %2"PRIuSIZE":\n", i); for (j = 0; j < n_rows; j++) { struct ovsdb_error *error; struct ovsdb_row *row; @@ -924,7 +936,7 @@ do_execute_mutations(int argc OVS_UNUSED, char *argv[]) row = ovsdb_row_clone(rows[j]); error = ovsdb_mutation_set_execute(row, &sets[i]); - printf("row %zu: ", j); + printf("row %"PRIuSIZE": ", j); if (error) { print_and_free_ovsdb_error(error); } else { @@ -963,6 +975,16 @@ do_execute_mutations(int argc OVS_UNUSED, char *argv[]) ovsdb_table_destroy(table); /* Also destroys 'ts'. */ } +/* Inserts a row, without bothering to update metadata such as refcounts. */ +static void +put_row(struct ovsdb_table *table, struct ovsdb_row *row) +{ + const struct uuid *uuid = ovsdb_row_get_uuid(row); + if (!ovsdb_table_get_row(table, uuid)) { + hmap_insert(&table->rows, &row->hmap_node, uuid_hash(uuid)); + } +} + struct do_query_cbdata { struct uuid *row_uuids; int *counts; @@ -1019,7 +1041,7 @@ do_query(int argc OVS_UNUSED, char *argv[]) UUID_ARGS(ovsdb_row_get_uuid(row))); } cbdata.row_uuids[i] = *ovsdb_row_get_uuid(row); - ovsdb_table_put_row(table, row); + put_row(table, row); } json_destroy(json); @@ -1038,7 +1060,7 @@ do_query(int argc OVS_UNUSED, char *argv[]) memset(cbdata.counts, 0, cbdata.n_rows * sizeof *cbdata.counts); ovsdb_query(table, &cnd, do_query_cb, &cbdata); - printf("query %2zu:", i); + printf("query %2"PRIuSIZE":", i); for (j = 0; j < cbdata.n_rows; j++) { if (j % 5 == 0) { putchar(' '); @@ -1086,7 +1108,7 @@ do_query_distinct(int argc OVS_UNUSED, char *argv[]) size_t n_classes; struct json *json; int exit_code = 0; - size_t i, j, k; + size_t i; /* Parse table schema, create table. */ json = unbox_json(parse_json(argv[1])); @@ -1097,7 +1119,8 @@ do_query_distinct(int argc OVS_UNUSED, char *argv[]) /* Parse column set. */ json = parse_json(argv[4]); - check_ovsdb_error(ovsdb_column_set_from_json(json, table, &columns)); + check_ovsdb_error(ovsdb_column_set_from_json(json, table->schema, + &columns)); json_destroy(json); /* Parse rows, add to table. */ @@ -1139,7 +1162,7 @@ do_query_distinct(int argc OVS_UNUSED, char *argv[]) ovs_fatal(0, "duplicate UUID "UUID_FMT" in table", UUID_ARGS(ovsdb_row_get_uuid(row))); } - ovsdb_table_put_row(table, row); + put_row(table, row); } json_destroy(json); @@ -1152,6 +1175,7 @@ do_query_distinct(int argc OVS_UNUSED, char *argv[]) for (i = 0; i < json->u.array.n; i++) { struct ovsdb_row_set results; struct ovsdb_condition cnd; + size_t j; check_ovsdb_error(ovsdb_condition_from_json(ts, json->u.array.elems[i], NULL, &cnd)); @@ -1162,6 +1186,8 @@ do_query_distinct(int argc OVS_UNUSED, char *argv[]) ovsdb_row_set_init(&results); ovsdb_query_distinct(table, &cnd, &columns, &results); for (j = 0; j < results.n_rows; j++) { + size_t k; + for (k = 0; k < n_rows; k++) { if (uuid_equals(ovsdb_row_get_uuid(results.rows[j]), &rows[k].uuid)) { @@ -1171,7 +1197,7 @@ do_query_distinct(int argc OVS_UNUSED, char *argv[]) } ovsdb_row_set_destroy(&results); - printf("query %2zu:", i); + printf("query %2"PRIuSIZE":", i); for (j = 0; j < n_rows; j++) { int count = rows[j].class->count; @@ -1231,7 +1257,7 @@ do_execute(int argc OVS_UNUSED, char *argv[]) char *s; params = parse_json(argv[i]); - result = ovsdb_execute(db, params, 0, NULL); + result = ovsdb_execute(db, NULL, params, 0, NULL); s = json_to_string(result, JSSF_SORT); printf("%s\n", s); free(s); @@ -1266,7 +1292,8 @@ static void do_trigger(int argc OVS_UNUSED, char *argv[]) { struct ovsdb_schema *schema; - struct list completions; + struct ovsdb_session session; + struct ovsdb_server server; struct json *json; struct ovsdb *db; long long int now; @@ -1279,7 +1306,10 @@ do_trigger(int argc OVS_UNUSED, char *argv[]) json_destroy(json); db = ovsdb_create(schema); - list_init(&completions); + ovsdb_server_init(&server); + ovsdb_server_add_db(&server, db); + ovsdb_session_init(&session, &server); + now = 0; number = 0; for (i = 2; i < argc; i++) { @@ -1293,7 +1323,7 @@ do_trigger(int argc OVS_UNUSED, char *argv[]) json_destroy(params); } else { struct test_trigger *t = xmalloc(sizeof *t); - ovsdb_trigger_init(db, &t->trigger, params, &completions, now); + ovsdb_trigger_init(&session, db, &t->trigger, params, now); t->number = number++; if (ovsdb_trigger_is_complete(&t->trigger)) { do_trigger_dump(t, now, "immediate"); @@ -1303,8 +1333,8 @@ do_trigger(int argc OVS_UNUSED, char *argv[]) } ovsdb_trigger_run(db, now); - while (!list_is_empty(&completions)) { - do_trigger_dump(CONTAINER_OF(list_pop_front(&completions), + while (!list_is_empty(&session.completions)) { + do_trigger_dump(CONTAINER_OF(list_pop_front(&session.completions), struct test_trigger, trigger.node), now, "delayed"); } @@ -1314,6 +1344,7 @@ do_trigger(int argc OVS_UNUSED, char *argv[]) poll_block(); } + ovsdb_server_destroy(&server); ovsdb_destroy(db); } @@ -1332,7 +1363,7 @@ static struct ovsdb_table *do_transact_table; static void do_transact_commit(int argc OVS_UNUSED, char *argv[] OVS_UNUSED) { - ovsdb_txn_commit(do_transact_txn, false); + ovsdb_error_destroy(ovsdb_txn_commit(do_transact_txn, false)); do_transact_txn = NULL; } @@ -1456,8 +1487,7 @@ do_transact_print(int argc OVS_UNUSED, char *argv[] OVS_UNUSED) n_rows = hmap_count(&do_transact_table->rows); rows = xmalloc(n_rows * sizeof *rows); i = 0; - HMAP_FOR_EACH (row, struct ovsdb_row, hmap_node, - &do_transact_table->rows) { + HMAP_FOR_EACH (row, hmap_node, &do_transact_table->rows) { rows[i++] = row; } assert(i == n_rows); @@ -1641,7 +1671,7 @@ parse_uuids(const struct json *json, struct ovsdb_symbol_table *symtab, struct uuid uuid; if (json->type == JSON_STRING && uuid_from_string(&uuid, json->u.string)) { - char *name = xasprintf("#%zu#", *n); + char *name = xasprintf("#%"PRIuSIZE"#", *n); fprintf(stderr, "%s = "UUID_FMT"\n", name, UUID_ARGS(&uuid)); ovsdb_symbol_table_put(symtab, name, &uuid, false); free(name); @@ -1738,7 +1768,9 @@ idl_set(struct ovsdb_idl *idl, char *commands, int step) idltest_simple_set_s(s, arg3); } else if (!strcmp(arg2, "u")) { struct uuid uuid; - uuid_from_string(&uuid, arg3); + if (!uuid_from_string(&uuid, arg3)) { + ovs_fatal(0, "\"%s\" is not a valid UUID", arg3); + } idltest_simple_set_u(s, uuid); } else if (!strcmp(arg2, "r")) { idltest_simple_set_r(s, atof(arg3)); @@ -1750,7 +1782,7 @@ idl_set(struct ovsdb_idl *idl, char *commands, int step) struct idltest_simple *s; if (!arg1 || arg2) { - ovs_fatal(0, "\"set\" command requires 1 argument"); + ovs_fatal(0, "\"insert\" command requires 1 argument"); } s = idltest_simple_insert(txn); @@ -1759,21 +1791,64 @@ idl_set(struct ovsdb_idl *idl, char *commands, int step) const struct idltest_simple *s; if (!arg1 || arg2) { - ovs_fatal(0, "\"set\" command requires 1 argument"); + ovs_fatal(0, "\"delete\" command requires 1 argument"); } s = idltest_find_simple(idl, atoi(arg1)); if (!s) { - ovs_fatal(0, "\"set\" command asks for nonexistent " + ovs_fatal(0, "\"delete\" command asks for nonexistent " "i=%d", atoi(arg1)); } idltest_simple_delete(s); - } else if (!strcmp(name, "increment")) { + } else if (!strcmp(name, "verify")) { + const struct idltest_simple *s; + if (!arg2 || arg3) { - ovs_fatal(0, "\"set\" command requires 2 arguments"); + ovs_fatal(0, "\"verify\" command requires 2 arguments"); } - ovsdb_idl_txn_increment(txn, arg1, arg2, NULL); + + s = idltest_find_simple(idl, atoi(arg1)); + if (!s) { + ovs_fatal(0, "\"verify\" command asks for nonexistent " + "i=%d", atoi(arg1)); + } + + if (!strcmp(arg2, "i")) { + idltest_simple_verify_i(s); + } else if (!strcmp(arg2, "b")) { + idltest_simple_verify_b(s); + } else if (!strcmp(arg2, "s")) { + idltest_simple_verify_s(s); + } else if (!strcmp(arg2, "u")) { + idltest_simple_verify_s(s); + } else if (!strcmp(arg2, "r")) { + idltest_simple_verify_r(s); + } else { + ovs_fatal(0, "\"verify\" command asks for unknown column %s", + arg2); + } + } else if (!strcmp(name, "increment")) { + const struct idltest_simple *s; + + if (!arg1 || arg2) { + ovs_fatal(0, "\"increment\" command requires 1 argument"); + } + + s = idltest_find_simple(idl, atoi(arg1)); + if (!s) { + ovs_fatal(0, "\"set\" command asks for nonexistent " + "i=%d", atoi(arg1)); + } + + ovsdb_idl_txn_increment(txn, &s->header_, &idltest_simple_col_i); increment = true; + } else if (!strcmp(name, "abort")) { + ovsdb_idl_txn_abort(txn); + break; + } else if (!strcmp(name, "destroy")) { + printf("%03d: destroy\n", step); + ovsdb_idl_txn_destroy(txn); + return; } else { ovs_fatal(0, "unknown command %s", name); } @@ -1804,12 +1879,12 @@ do_idl(int argc, char *argv[]) idltest_init(); - idl = ovsdb_idl_create(argv[1], &idltest_idl_class); + idl = ovsdb_idl_create(argv[1], &idltest_idl_class, true, true); if (argc > 2) { struct stream *stream; - error = stream_open_block(jsonrpc_stream_open(argv[1], &stream), - &stream); + error = stream_open_block(jsonrpc_stream_open(argv[1], &stream, + DSCP_DEFAULT), &stream); if (error) { ovs_fatal(error, "failed to connect to \"%s\"", argv[1]); } @@ -1824,14 +1899,17 @@ do_idl(int argc, char *argv[]) for (i = 2; i < argc; i++) { char *arg = argv[i]; struct jsonrpc_msg *request, *reply; - int error; if (*arg == '+') { /* The previous transaction didn't change anything. */ arg++; } else { /* Wait for update. */ - while (ovsdb_idl_get_seqno(idl) == seqno && !ovsdb_idl_run(idl)) { + for (;;) { + ovsdb_idl_run(idl); + if (ovsdb_idl_get_seqno(idl) != seqno) { + break; + } jsonrpc_run(rpc); ovsdb_idl_wait(idl); @@ -1854,7 +1932,7 @@ do_idl(int argc, char *argv[]) substitute_uuids(json, symtab); request = jsonrpc_create_request("transact", json, NULL); error = jsonrpc_transact_block(rpc, request, &reply); - if (error) { + if (error || reply->error) { ovs_fatal(error, "jsonrpc transaction failed"); } printf("%03d: ", step++); @@ -1871,7 +1949,11 @@ do_idl(int argc, char *argv[]) if (rpc) { jsonrpc_close(rpc); } - while (ovsdb_idl_get_seqno(idl) == seqno && !ovsdb_idl_run(idl)) { + for (;;) { + ovsdb_idl_run(idl); + if (ovsdb_idl_get_seqno(idl) != seqno) { + break; + } ovsdb_idl_wait(idl); poll_block(); } @@ -1893,7 +1975,7 @@ static struct command all_commands[] = { { "parse-data-strings", 2, INT_MAX, do_parse_data_strings }, { "sort-atoms", 2, 2, do_sort_atoms }, { "parse-column", 2, 2, do_parse_column }, - { "parse-table", 2, 2, do_parse_table }, + { "parse-table", 2, 3, do_parse_table }, { "parse-rows", 2, INT_MAX, do_parse_rows }, { "compare-rows", 2, INT_MAX, do_compare_rows }, { "parse-conditions", 2, INT_MAX, do_parse_conditions }, @@ -1910,3 +1992,9 @@ static struct command all_commands[] = { { "help", 0, INT_MAX, do_help }, { NULL, 0, 0, NULL }, }; + +static struct command * +get_all_commands(void) +{ + return all_commands; +}