X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=tests%2Ftest-ovsdb.c;h=0d7e8c5800a91214ec71d80ab9efe4a71d6b717e;hb=1336993ca480cf647dc0f87c06ac51ec4175a361;hp=ede792262e443c8fe5ee108c799e9511065650fa;hpb=b54e22e91eee43eb04ad53e2fa919be44f34e731;p=openvswitch diff --git a/tests/test-ovsdb.c b/tests/test-ovsdb.c index ede79226..0d7e8c58 100644 --- a/tests/test-ovsdb.c +++ b/tests/test-ovsdb.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009 Nicira Networks. + * Copyright (c) 2009, 2010 Nicira Networks. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -24,6 +24,7 @@ #include #include "command-line.h" +#include "dynamic-string.h" #include "json.h" #include "jsonrpc.h" #include "ovsdb-data.h" @@ -120,16 +121,29 @@ usage(void) "usage: %s [OPTIONS] COMMAND [ARG...]\n\n" " log-io FILE FLAGS COMMAND...\n" " open FILE with FLAGS, run COMMANDs\n" + " default-atoms\n" + " test ovsdb_atom_default()\n" + " default-data\n" + " test ovsdb_datum_default()\n" " parse-atomic-type TYPE\n" " parse TYPE as OVSDB atomic type, and re-serialize\n" + " parse-base-type TYPE\n" + " parse TYPE as OVSDB base type, and re-serialize\n" " parse-type JSON\n" " parse JSON as OVSDB type, and re-serialize\n" " parse-atoms TYPE ATOM...\n" - " parse ATOMs as atoms of given TYPE, and re-serialize\n" + " parse JSON ATOMs as atoms of TYPE, and re-serialize\n" + " parse-atom-strings TYPE ATOM...\n" + " parse string ATOMs as atoms of given TYPE, and re-serialize\n" " sort-atoms TYPE ATOM...\n" - " print ATOMs in sorted order, and re-serialize\n" + " print JSON ATOMs in sorted order\n" " parse-data TYPE DATUM...\n" - " parse DATUMs as data of given TYPE, and re-serialize\n" + " parse JSON DATUMs as data of given TYPE, and re-serialize\n" + " parse-data-unique TYPE DATUM...\n" + " parse JSON DATUMs as data of given TYPE, eliminating\n" + " duplicate keys, and re-serialize\n" + " parse-data-strings TYPE DATUM...\n" + " 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" @@ -152,6 +166,8 @@ usage(void) " query-distinct TABLE [ROW,...] [CONDITION,...] COLUMNS\n" " add each ROW to TABLE, then query and print the rows that\n" " satisfy each CONDITION and have distinct COLUMNS.\n" + " parse-schema JSON\n" + " parse JSON as an OVSDB schema, and re-serialize\n" " transact COMMAND\n" " execute each specified transactional COMMAND:\n" " commit\n" @@ -228,7 +244,17 @@ static void check_ovsdb_error(struct ovsdb_error *error) { if (error) { - ovs_fatal(0, "%s", ovsdb_error_to_string(error)); + char *s = ovsdb_error_to_string(error); + ovsdb_error_destroy(error); + ovs_fatal(0, "%s", s); + } +} + +static void +die_if_error(char *error) +{ + if (error) { + ovs_fatal(0, "%s", error); } } @@ -238,34 +264,24 @@ static void do_log_io(int argc, char *argv[]) { const char *name = argv[1]; - char *mode = argv[2]; + char *mode_string = argv[2]; struct ovsdb_error *error; + enum ovsdb_log_open_mode mode; struct ovsdb_log *log; - char *save_ptr = NULL; - const char *token; - int flags; int i; - for (flags = 0, token = strtok_r(mode, " |", &save_ptr); token != NULL; - token = strtok_r(NULL, " |", &save_ptr)) - { - if (!strcmp(token, "O_RDONLY")) { - flags |= O_RDONLY; - } else if (!strcmp(token, "O_RDWR")) { - flags |= O_RDWR; - } else if (!strcmp(token, "O_TRUNC")) { - flags |= O_TRUNC; - } else if (!strcmp(token, "O_CREAT")) { - flags |= O_CREAT; - } else if (!strcmp(token, "O_EXCL")) { - flags |= O_EXCL; - } else if (!strcmp(token, "O_TRUNC")) { - flags |= O_TRUNC; - } + if (!strcmp(mode_string, "read-only")) { + mode = OVSDB_LOG_READ_ONLY; + } else if (!strcmp(mode_string, "read/write")) { + mode = OVSDB_LOG_READ_WRITE; + } else if (!strcmp(mode_string, "create")) { + mode = OVSDB_LOG_CREATE; + } else { + ovs_fatal(0, "unknown log-io open mode \"%s\"", mode_string); } - check_ovsdb_error(ovsdb_log_open(name, flags, &log)); + check_ovsdb_error(ovsdb_log_open(name, mode, -1, &log)); printf("%s: open successful\n", name); for (i = 3; i < argc; i++) { @@ -296,6 +312,7 @@ do_log_io(int argc, char *argv[]) char *s = ovsdb_error_to_string(error); printf("%s: %s failed: %s\n", name, command, s); free(s); + ovsdb_error_destroy(error); } else { printf("%s: %s successful\n", name, command); } @@ -305,7 +322,72 @@ do_log_io(int argc, char *argv[]) } static void -do_parse_atomic_type(int argc UNUSED, char *argv[]) +do_default_atoms(int argc OVS_UNUSED, char *argv[] OVS_UNUSED) +{ + int type; + + for (type = 0; type < OVSDB_N_TYPES; type++) { + union ovsdb_atom atom; + + if (type == OVSDB_TYPE_VOID) { + continue; + } + + printf("%s: ", ovsdb_atomic_type_to_string(type)); + + ovsdb_atom_init_default(&atom, type); + if (!ovsdb_atom_equals(&atom, ovsdb_atom_default(type), type)) { + printf("wrong\n"); + exit(1); + } + ovsdb_atom_destroy(&atom, type); + + printf("OK\n"); + } +} + +static void +do_default_data(int argc OVS_UNUSED, char *argv[] OVS_UNUSED) +{ + unsigned int n_min; + int key, value; + + for (n_min = 0; n_min <= 1; n_min++) { + for (key = 0; key < OVSDB_N_TYPES; key++) { + if (key == OVSDB_TYPE_VOID) { + continue; + } + for (value = 0; value < OVSDB_N_TYPES; value++) { + struct ovsdb_datum datum; + struct ovsdb_type type; + + ovsdb_base_type_init(&type.key, key); + ovsdb_base_type_init(&type.value, value); + type.n_min = n_min; + type.n_max = 1; + assert(ovsdb_type_is_valid(&type)); + + printf("key %s, value %s, n_min %u: ", + ovsdb_atomic_type_to_string(key), + ovsdb_atomic_type_to_string(value), n_min); + + ovsdb_datum_init_default(&datum, &type); + if (!ovsdb_datum_equals(&datum, ovsdb_datum_default(&type), + &type)) { + printf("wrong\n"); + exit(1); + } + ovsdb_datum_destroy(&datum, &type); + ovsdb_type_destroy(&type); + + printf("OK\n"); + } + } + } +} + +static void +do_parse_atomic_type(int argc OVS_UNUSED, char *argv[]) { enum ovsdb_atomic_type type; struct json *json; @@ -317,7 +399,20 @@ do_parse_atomic_type(int argc UNUSED, char *argv[]) } static void -do_parse_type(int argc UNUSED, char *argv[]) +do_parse_base_type(int argc OVS_UNUSED, char *argv[]) +{ + struct ovsdb_base_type base; + struct json *json; + + json = unbox_json(parse_json(argv[1])); + check_ovsdb_error(ovsdb_base_type_from_json(&base, json)); + json_destroy(json); + print_and_free_json(ovsdb_base_type_to_json(&base)); + ovsdb_base_type_destroy(&base); +} + +static void +do_parse_type(int argc OVS_UNUSED, char *argv[]) { struct ovsdb_type type; struct json *json; @@ -326,34 +421,72 @@ do_parse_type(int argc UNUSED, char *argv[]) check_ovsdb_error(ovsdb_type_from_json(&type, json)); json_destroy(json); print_and_free_json(ovsdb_type_to_json(&type)); + ovsdb_type_destroy(&type); } static void do_parse_atoms(int argc, char *argv[]) { - enum ovsdb_atomic_type type; + struct ovsdb_base_type base; struct json *json; int i; json = unbox_json(parse_json(argv[1])); - check_ovsdb_error(ovsdb_atomic_type_from_json(&type, json)); + check_ovsdb_error(ovsdb_base_type_from_json(&base, json)); json_destroy(json); for (i = 2; i < argc; i++) { + struct ovsdb_error *error; union ovsdb_atom atom; json = unbox_json(parse_json(argv[i])); - check_ovsdb_error(ovsdb_atom_from_json(&atom, type, json, NULL)); + error = ovsdb_atom_from_json(&atom, &base, json, NULL); json_destroy(json); - print_and_free_json(ovsdb_atom_to_json(&atom, type)); + if (error) { + print_and_free_ovsdb_error(error); + } else { + print_and_free_json(ovsdb_atom_to_json(&atom, base.type)); + ovsdb_atom_destroy(&atom, base.type); + } + } + ovsdb_base_type_destroy(&base); +} + +static void +do_parse_atom_strings(int argc, char *argv[]) +{ + struct ovsdb_base_type base; + struct json *json; + int i; - ovsdb_atom_destroy(&atom, type); + json = unbox_json(parse_json(argv[1])); + check_ovsdb_error(ovsdb_base_type_from_json(&base, json)); + json_destroy(json); + + for (i = 2; i < argc; i++) { + union ovsdb_atom atom; + struct ds out; + + die_if_error(ovsdb_atom_from_string(&atom, &base, argv[i], NULL)); + + ds_init(&out); + ovsdb_atom_to_string(&atom, base.type, &out); + puts(ds_cstr(&out)); + ds_destroy(&out); + + ovsdb_atom_destroy(&atom, base.type); } + ovsdb_base_type_destroy(&base); } 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; @@ -367,13 +500,53 @@ 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)); ovsdb_datum_destroy(&datum, &type); } + 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_unique(int argc, char *argv[]) +{ + do_parse_data__(argc, argv, ovsdb_datum_from_json_unique); +} + +static void +do_parse_data_strings(int argc, char *argv[]) +{ + struct ovsdb_type type; + struct json *json; + int i; + + json = unbox_json(parse_json(argv[1])); + check_ovsdb_error(ovsdb_type_from_json(&type, json)); + json_destroy(json); + + for (i = 2; i < argc; i++) { + struct ovsdb_datum datum; + struct ds out; + + die_if_error(ovsdb_datum_from_string(&datum, &type, argv[i], NULL)); + + ds_init(&out); + ovsdb_datum_to_string(&datum, &type, &out); + puts(ds_cstr(&out)); + ds_destroy(&out); + + ovsdb_datum_destroy(&datum, &type); + } + ovsdb_type_destroy(&type); } static enum ovsdb_atomic_type compare_atoms_atomic_type; @@ -388,16 +561,16 @@ compare_atoms(const void *a_, const void *b_) } static void -do_sort_atoms(int argc UNUSED, char *argv[]) +do_sort_atoms(int argc OVS_UNUSED, char *argv[]) { - enum ovsdb_atomic_type type; + struct ovsdb_base_type base; union ovsdb_atom *atoms; struct json *json, **json_atoms; size_t n_atoms; int i; json = unbox_json(parse_json(argv[1])); - check_ovsdb_error(ovsdb_atomic_type_from_json(&type, json)); + check_ovsdb_error(ovsdb_base_type_from_json(&base, json)); json_destroy(json); json = unbox_json(parse_json(argv[2])); @@ -409,26 +582,28 @@ do_sort_atoms(int argc UNUSED, char *argv[]) n_atoms = json->u.array.n; atoms = xmalloc(n_atoms * sizeof *atoms); for (i = 0; i < n_atoms; i++) { - check_ovsdb_error(ovsdb_atom_from_json(&atoms[i], type, + check_ovsdb_error(ovsdb_atom_from_json(&atoms[i], &base, json->u.array.elems[i], NULL)); } json_destroy(json); /* Sort atoms. */ - compare_atoms_atomic_type = type; + compare_atoms_atomic_type = base.type; qsort(atoms, n_atoms, sizeof *atoms, compare_atoms); /* Convert internal representation back to JSON. */ json_atoms = xmalloc(n_atoms * sizeof *json_atoms); for (i = 0; i < n_atoms; i++) { - json_atoms[i] = ovsdb_atom_to_json(&atoms[i], type); - ovsdb_atom_destroy(&atoms[i], type); + json_atoms[i] = ovsdb_atom_to_json(&atoms[i], base.type); + ovsdb_atom_destroy(&atoms[i], base.type); } print_and_free_json(json_array_create(json_atoms, n_atoms)); + free(atoms); + ovsdb_base_type_destroy(&base); } static void -do_parse_column(int argc UNUSED, char *argv[]) +do_parse_column(int argc OVS_UNUSED, char *argv[]) { struct ovsdb_column *column; struct json *json; @@ -441,7 +616,7 @@ do_parse_column(int argc UNUSED, char *argv[]) } static void -do_parse_table(int argc UNUSED, char *argv[]) +do_parse_table(int argc OVS_UNUSED, char *argv[]) { struct ovsdb_table_schema *ts; struct json *json; @@ -561,6 +736,10 @@ do_compare_rows(int argc, char *argv[]) } } } + for (i = 0; i < n_rows; i++) { + ovsdb_row_destroy(rows[i]); + free(names[i]); + } free(rows); free(names); @@ -605,7 +784,7 @@ do_parse_conditions(int argc, char *argv[]) } static void -do_evaluate_conditions(int argc UNUSED, char *argv[]) +do_evaluate_conditions(int argc OVS_UNUSED, char *argv[]) { struct ovsdb_table_schema *ts; struct ovsdb_table *table; @@ -651,7 +830,7 @@ do_evaluate_conditions(int argc UNUSED, char *argv[]) json_destroy(json); for (i = 0; i < n_conditions; i++) { - printf("condition %2d:", i); + printf("condition %2zu:", i); for (j = 0; j < n_rows; j++) { bool result = ovsdb_condition_evaluate(rows[j], &conditions[i]); if (j % 5 == 0) { @@ -665,9 +844,11 @@ do_evaluate_conditions(int argc UNUSED, char *argv[]) for (i = 0; i < n_conditions; i++) { ovsdb_condition_destroy(&conditions[i]); } + free(conditions); for (i = 0; i < n_rows; i++) { ovsdb_row_destroy(rows[i]); } + free(rows); ovsdb_table_destroy(table); /* Also destroys 'ts'. */ } @@ -708,7 +889,7 @@ do_parse_mutations(int argc, char *argv[]) } static void -do_execute_mutations(int argc UNUSED, char *argv[]) +do_execute_mutations(int argc OVS_UNUSED, char *argv[]) { struct ovsdb_table_schema *ts; struct ovsdb_table *table; @@ -755,7 +936,7 @@ do_execute_mutations(int argc UNUSED, char *argv[]) json_destroy(json); for (i = 0; i < n_sets; i++) { - printf("mutation %2d:\n", i); + printf("mutation %2zu:\n", i); for (j = 0; j < n_rows; j++) { struct ovsdb_error *error; struct ovsdb_row *row; @@ -794,9 +975,11 @@ do_execute_mutations(int argc UNUSED, char *argv[]) for (i = 0; i < n_sets; i++) { ovsdb_mutation_set_destroy(&sets[i]); } + free(sets); for (i = 0; i < n_rows; i++) { ovsdb_row_destroy(rows[i]); } + free(rows); ovsdb_table_destroy(table); /* Also destroys 'ts'. */ } @@ -822,7 +1005,7 @@ do_query_cb(const struct ovsdb_row *row, void *cbdata_) } static void -do_query(int argc UNUSED, char *argv[]) +do_query(int argc OVS_UNUSED, char *argv[]) { struct do_query_cbdata cbdata; struct ovsdb_table_schema *ts; @@ -875,7 +1058,7 @@ do_query(int argc UNUSED, char *argv[]) memset(cbdata.counts, 0, cbdata.n_rows * sizeof *cbdata.counts); ovsdb_query(table, &cnd, do_query_cb, &cbdata); - printf("query %2d:", i); + printf("query %2zu:", i); for (j = 0; j < cbdata.n_rows; j++) { if (j % 5 == 0) { putchar(' '); @@ -912,7 +1095,7 @@ struct do_query_distinct_row { }; static void -do_query_distinct(int argc UNUSED, char *argv[]) +do_query_distinct(int argc OVS_UNUSED, char *argv[]) { struct ovsdb_column_set columns; struct ovsdb_table_schema *ts; @@ -1008,7 +1191,7 @@ do_query_distinct(int argc UNUSED, char *argv[]) } ovsdb_row_set_destroy(&results); - printf("query %2d:", i); + printf("query %2zu:", i); for (j = 0; j < n_rows; j++) { int count = rows[j].class->count; @@ -1037,7 +1220,20 @@ do_query_distinct(int argc UNUSED, char *argv[]) } static void -do_execute(int argc UNUSED, char *argv[]) +do_parse_schema(int argc OVS_UNUSED, char *argv[]) +{ + struct ovsdb_schema *schema; + struct json *json; + + json = parse_json(argv[1]); + check_ovsdb_error(ovsdb_schema_from_json(json, &schema)); + json_destroy(json); + print_and_free_json(ovsdb_schema_to_json(schema)); + ovsdb_schema_destroy(schema); +} + +static void +do_execute(int argc OVS_UNUSED, char *argv[]) { struct ovsdb_schema *schema; struct json *json; @@ -1058,6 +1254,7 @@ do_execute(int argc UNUSED, char *argv[]) result = ovsdb_execute(db, params, 0, NULL); s = json_to_string(result, JSSF_SORT); printf("%s\n", s); + free(s); json_destroy(params); json_destroy(result); } @@ -1079,13 +1276,14 @@ do_trigger_dump(struct test_trigger *t, long long int now, const char *title) result = ovsdb_trigger_steal_result(&t->trigger); s = json_to_string(result, JSSF_SORT); printf("t=%lld: trigger %d (%s): %s\n", now, t->number, title, s); + free(s); json_destroy(result); ovsdb_trigger_destroy(&t->trigger); free(t); } static void -do_trigger(int argc UNUSED, char *argv[]) +do_trigger(int argc OVS_UNUSED, char *argv[]) { struct ovsdb_schema *schema; struct list completions; @@ -1140,7 +1338,7 @@ do_trigger(int argc UNUSED, char *argv[]) } static void -do_help(int argc UNUSED, char *argv[] UNUSED) +do_help(int argc OVS_UNUSED, char *argv[] OVS_UNUSED) { usage(); } @@ -1152,14 +1350,14 @@ static struct ovsdb_txn *do_transact_txn; static struct ovsdb_table *do_transact_table; static void -do_transact_commit(int argc UNUSED, char *argv[] UNUSED) +do_transact_commit(int argc OVS_UNUSED, char *argv[] OVS_UNUSED) { ovsdb_txn_commit(do_transact_txn, false); do_transact_txn = NULL; } static void -do_transact_abort(int argc UNUSED, char *argv[] UNUSED) +do_transact_abort(int argc OVS_UNUSED, char *argv[] OVS_UNUSED) { ovsdb_txn_abort(do_transact_txn); do_transact_txn = NULL; @@ -1219,7 +1417,7 @@ do_transact_set_i_j(struct ovsdb_row *row, } static void -do_transact_insert(int argc UNUSED, char *argv[] UNUSED) +do_transact_insert(int argc OVS_UNUSED, char *argv[] OVS_UNUSED) { struct ovsdb_row *row; struct uuid *uuid; @@ -1241,14 +1439,14 @@ do_transact_insert(int argc UNUSED, char *argv[] UNUSED) } static void -do_transact_delete(int argc UNUSED, char *argv[] UNUSED) +do_transact_delete(int argc OVS_UNUSED, char *argv[] OVS_UNUSED) { const struct ovsdb_row *row = do_transact_find_row(argv[1]); ovsdb_txn_row_delete(do_transact_txn, row); } static void -do_transact_modify(int argc UNUSED, char *argv[] UNUSED) +do_transact_modify(int argc OVS_UNUSED, char *argv[] OVS_UNUSED) { const struct ovsdb_row *row_ro; struct ovsdb_row *row_rw; @@ -1268,7 +1466,7 @@ compare_rows_by_uuid(const void *a_, const void *b_) } static void -do_transact_print(int argc UNUSED, char *argv[] UNUSED) +do_transact_print(int argc OVS_UNUSED, char *argv[] OVS_UNUSED) { const struct ovsdb_row **rows; const struct ovsdb_row *row; @@ -1456,31 +1654,6 @@ print_idl(struct ovsdb_idl *idl, int step) } } -static unsigned int -print_updated_idl(struct ovsdb_idl *idl, struct jsonrpc *rpc, - int step, unsigned int seqno) -{ - for (;;) { - unsigned int new_seqno; - - if (rpc) { - jsonrpc_run(rpc); - } - ovsdb_idl_run(idl); - new_seqno = ovsdb_idl_get_seqno(idl); - if (new_seqno != seqno) { - print_idl(idl, step); - return new_seqno; - } - - if (rpc) { - jsonrpc_wait(rpc); - } - ovsdb_idl_wait(idl); - poll_block(); - } -} - static void parse_uuids(const struct json *json, struct ovsdb_symbol_table *symtab, size_t *n) @@ -1488,7 +1661,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("#%d#", *n); + char *name = xasprintf("#%zu#", *n); fprintf(stderr, "%s = "UUID_FMT"\n", name, UUID_ARGS(&uuid)); ovsdb_symbol_table_put(symtab, name, &uuid, false); free(name); @@ -1626,12 +1799,7 @@ idl_set(struct ovsdb_idl *idl, char *commands, int step) } } - while ((status = ovsdb_idl_txn_commit(txn)) == TXN_INCOMPLETE) { - ovsdb_idl_run(idl); - ovsdb_idl_wait(idl); - ovsdb_idl_txn_wait(txn); - poll_block(); - } + status = ovsdb_idl_txn_commit_block(txn); printf("%03d: commit, status=%s", step, ovsdb_idl_txn_status_to_string(status)); if (increment) { @@ -1654,11 +1822,14 @@ do_idl(int argc, char *argv[]) int error; int i; + idltest_init(); + idl = ovsdb_idl_create(argv[1], &idltest_idl_class); if (argc > 2) { struct stream *stream; - error = stream_open_block(argv[1], &stream); + error = stream_open_block(jsonrpc_stream_open(argv[1], &stream), + &stream); if (error) { ovs_fatal(error, "failed to connect to \"%s\"", argv[1]); } @@ -1667,20 +1838,39 @@ do_idl(int argc, char *argv[]) rpc = NULL; } + setvbuf(stdout, NULL, _IOLBF, 0); + symtab = ovsdb_symbol_table_create(); for (i = 2; i < argc; i++) { + char *arg = argv[i]; struct jsonrpc_msg *request, *reply; int error; - seqno = print_updated_idl(idl, rpc, step++, seqno); + 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)) { + jsonrpc_run(rpc); + + ovsdb_idl_wait(idl); + jsonrpc_wait(rpc); + poll_block(); + } + + /* Print update. */ + print_idl(idl, step++); + } + seqno = ovsdb_idl_get_seqno(idl); - if (!strcmp(argv[i], "reconnect")) { + if (!strcmp(arg, "reconnect")) { printf("%03d: reconnect\n", step++); ovsdb_idl_force_reconnect(idl); - } else if (argv[i][0] != '[') { - idl_set(idl, argv[i], step++); + } else if (arg[0] != '[') { + idl_set(idl, arg, step++); } else { - struct json *json = parse_json(argv[i]); + struct json *json = parse_json(arg); substitute_uuids(json, symtab); request = jsonrpc_create_request("transact", json, NULL); error = jsonrpc_transact_block(rpc, request, &reply); @@ -1701,17 +1891,27 @@ do_idl(int argc, char *argv[]) if (rpc) { jsonrpc_close(rpc); } - print_updated_idl(idl, NULL, step++, seqno); + while (ovsdb_idl_get_seqno(idl) == seqno && !ovsdb_idl_run(idl)) { + ovsdb_idl_wait(idl); + poll_block(); + } + print_idl(idl, step++); ovsdb_idl_destroy(idl); printf("%03d: done\n", step); } static struct command all_commands[] = { { "log-io", 2, INT_MAX, do_log_io }, + { "default-atoms", 0, 0, do_default_atoms }, + { "default-data", 0, 0, do_default_data }, { "parse-atomic-type", 1, 1, do_parse_atomic_type }, + { "parse-base-type", 1, 1, do_parse_base_type }, { "parse-type", 1, 1, do_parse_type }, { "parse-atoms", 2, INT_MAX, do_parse_atoms }, + { "parse-atom-strings", 2, INT_MAX, do_parse_atom_strings }, { "parse-data", 2, INT_MAX, do_parse_data }, + { "parse-data-unique", 2, INT_MAX, do_parse_data_unique }, + { "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 }, @@ -1724,6 +1924,7 @@ static struct command all_commands[] = { { "query", 3, 3, do_query }, { "query-distinct", 4, 4, do_query_distinct }, { "transact", 1, INT_MAX, do_transact }, + { "parse-schema", 1, 1, do_parse_schema }, { "execute", 2, INT_MAX, do_execute }, { "trigger", 2, INT_MAX, do_trigger }, { "idl", 1, INT_MAX, do_idl },