X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;ds=sidebyside;f=tests%2Ftest-ovsdb.c;h=21825d74964b1cc2de7f559649ff967b9075aa67;hb=ce5a3e38dacd8042dd7c4de7be24aca9c2887103;hp=18f8c46ee5ad6dd5c0863a7624c8080ffa3808de;hpb=5c414a2ed8c21762292776ecee294a11e0b5468b;p=openvswitch diff --git a/tests/test-ovsdb.c b/tests/test-ovsdb.c index 18f8c46e..21825d74 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. @@ -123,6 +123,8 @@ usage(void) " open FILE with FLAGS, run COMMANDs\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" @@ -157,6 +159,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" @@ -233,7 +237,9 @@ 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); } } @@ -251,34 +257,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++) { @@ -309,6 +305,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); } @@ -318,7 +315,7 @@ do_log_io(int argc, char *argv[]) } static void -do_parse_atomic_type(int argc UNUSED, char *argv[]) +do_parse_atomic_type(int argc OVS_UNUSED, char *argv[]) { enum ovsdb_atomic_type type; struct json *json; @@ -330,7 +327,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; @@ -339,56 +349,63 @@ 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)); - - ovsdb_atom_destroy(&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[]) { - 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++) { union ovsdb_atom atom; struct ds out; - die_if_error(ovsdb_atom_from_string(&atom, type, argv[i])); + die_if_error(ovsdb_atom_from_string(&atom, &base, argv[i], NULL)); ds_init(&out); - ovsdb_atom_to_string(&atom, type, &out); + ovsdb_atom_to_string(&atom, base.type, &out); puts(ds_cstr(&out)); ds_destroy(&out); - ovsdb_atom_destroy(&atom, type); + ovsdb_atom_destroy(&atom, base.type); } + ovsdb_base_type_destroy(&base); } static void @@ -413,6 +430,7 @@ do_parse_data(int argc, char *argv[]) ovsdb_datum_destroy(&datum, &type); } + ovsdb_type_destroy(&type); } static void @@ -430,7 +448,7 @@ do_parse_data_strings(int argc, char *argv[]) struct ovsdb_datum datum; struct ds out; - die_if_error(ovsdb_datum_from_string(&datum, &type, argv[i])); + die_if_error(ovsdb_datum_from_string(&datum, &type, argv[i], NULL)); ds_init(&out); ovsdb_datum_to_string(&datum, &type, &out); @@ -439,6 +457,7 @@ do_parse_data_strings(int argc, char *argv[]) ovsdb_datum_destroy(&datum, &type); } + ovsdb_type_destroy(&type); } static enum ovsdb_atomic_type compare_atoms_atomic_type; @@ -453,16 +472,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])); @@ -474,26 +493,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; @@ -506,7 +527,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; @@ -626,6 +647,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); @@ -670,7 +695,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; @@ -716,7 +741,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) { @@ -730,9 +755,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'. */ } @@ -773,7 +800,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; @@ -820,7 +847,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; @@ -859,9 +886,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'. */ } @@ -887,7 +916,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; @@ -940,7 +969,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(' '); @@ -977,7 +1006,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; @@ -1073,7 +1102,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; @@ -1102,7 +1131,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; @@ -1123,6 +1165,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); } @@ -1144,13 +1187,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; @@ -1205,7 +1249,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(); } @@ -1217,14 +1261,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; @@ -1284,7 +1328,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; @@ -1306,14 +1350,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; @@ -1333,7 +1377,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; @@ -1553,7 +1597,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); @@ -1691,12 +1735,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) { @@ -1719,11 +1758,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]); } @@ -1732,20 +1774,28 @@ 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 { + seqno = print_updated_idl(idl, rpc, step++, seqno); + } - 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); @@ -1774,6 +1824,7 @@ do_idl(int argc, char *argv[]) static struct command all_commands[] = { { "log-io", 2, INT_MAX, do_log_io }, { "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 }, @@ -1791,6 +1842,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 },