@@ -173,11 +173,18 @@ ovsdb_execute(struct ovsdb *db, const struct ovsdb_session *session,
error = parse_error;
}
/* Create read-only violation error if there is one. */
- if (!error && read_only && !ro) {
- error = ovsdb_error("not allowed",
- "%s operation not allowed when "
- "database server is in read only mode",
- op_name);
+ if (!ro && !error) {
+ if (read_only) {
+ error = ovsdb_error("not allowed",
+ "%s operation not allowed when "
+ "database server is in read only mode",
+ op_name);
+ } else if (db->schema->name[0] == '_') {
+ error = ovsdb_error("not allowed",
+ "%s operation not allowed on "
+ "table in reserved database %s",
+ op_name, db->schema->name);
+ }
}
if (error) {
json_destroy(result);
@@ -131,14 +131,23 @@ main(int argc, char *argv[])
if (argc - optind > command->min_args
&& svec_contains(&dbs, argv[optind])) {
database = xstrdup(argv[optind++]);
- } else if (dbs.n == 1) {
- database = xstrdup(dbs.names[0]);
} else if (svec_contains(&dbs, "Open_vSwitch")) {
database = xstrdup("Open_vSwitch");
} else {
- jsonrpc_close(rpc);
- ovs_fatal(0, "no default database for `%s' command, please "
- "specify a database name", command->name);
+ size_t n = 0;
+ const char *best = NULL;
+ for (size_t i = 0; i < dbs.n; i++) {
+ if (dbs.names[i][0] != '_') {
+ best = dbs.names[i];
+ n++;
+ }
+ }
+ if (n != 1) {
+ jsonrpc_close(rpc);
+ ovs_fatal(0, "no default database for `%s' command, please "
+ "specify a database name", command->name);
+ }
+ database = xstrdup(best);
}
svec_destroy(&dbs);
} else {
@@ -142,7 +142,9 @@ ovsdb_replication_init(const char *sync_from, const char *exclude,
struct shash_node *node;
SHASH_FOR_EACH (node, all_dbs) {
struct db *db = node->data;
- replication_add_local_db(node->name, db->db);
+ if (node->name[0] != '_' && db->db) {
+ replication_add_local_db(node->name, db->db);
+ }
}
}
@@ -514,6 +516,9 @@ open_db(struct server_config *config, const char *filename)
db_error = ovsdb_file_open(db->filename, false, &db->db, &db->file);
if (db_error) {
error = ovsdb_error_to_string(db_error);
+ } else if (db->db->schema->name[0] == '_') {
+ error = xasprintf("%s: names beginning with \"_\" are reserved",
+ db->db->schema->name);
} else if (!ovsdb_jsonrpc_server_add_db(config->jsonrpc, db->db)) {
error = xasprintf("%s: duplicate database name", db->db->schema->name);
} else {
@@ -1124,10 +1129,17 @@ ovsdb_server_compact(struct unixctl_conn *conn, int argc,
struct shash_node *node;
int n = 0;
+ if (argc > 2 && argv[1][0] == '_') {
+ unixctl_command_reply_error(conn, "cannot compact built-in databases");
+ return;
+ }
+
ds_init(&reply);
SHASH_FOR_EACH(node, all_dbs) {
db = node->data;
- if (argc < 2 || !strcmp(argv[1], node->name)) {
+ if (argc < 2
+ ? node->name[0] != '_'
+ : !strcmp(argv[1], node->name)) {
struct ovsdb_error *error;
VLOG_INFO("compacting %s database by user request", node->name);
@@ -1262,21 +1274,12 @@ ovsdb_server_add_database(struct unixctl_conn *conn, int argc OVS_UNUSED,
}
static void
-ovsdb_server_remove_database(struct unixctl_conn *conn, int argc OVS_UNUSED,
- const char *argv[], void *config_)
+remove_db(struct server_config *config, struct shash_node *node)
{
- struct server_config *config = config_;
- struct shash_node *node;
struct db *db;
bool ok;
- node = shash_find(config->all_dbs, argv[1]);
- if (!node) {
- unixctl_command_reply_error(conn, "Failed to find the database.");
- return;
- }
db = node->data;
-
ok = ovsdb_jsonrpc_server_remove_db(config->jsonrpc, db->db);
ovs_assert(ok);
@@ -1290,6 +1293,26 @@ ovsdb_server_remove_database(struct unixctl_conn *conn, int argc OVS_UNUSED,
ovsdb_replication_init(*config->sync_from, *config->sync_exclude,
config->all_dbs, server_uuid);
}
+}
+
+static void
+ovsdb_server_remove_database(struct unixctl_conn *conn, int argc OVS_UNUSED,
+ const char *argv[], void *config_)
+{
+ struct server_config *config = config_;
+ struct shash_node *node;
+
+ node = shash_find(config->all_dbs, argv[1]);
+ if (!node) {
+ unixctl_command_reply_error(conn, "Failed to find the database.");
+ return;
+ }
+ if (node->name[0] == '_') {
+ unixctl_command_reply_error(conn, "Cannot remove reserved database.");
+ return;
+ }
+
+ remove_db(config, node);
unixctl_command_reply(conn, NULL);
}
@@ -1549,7 +1572,9 @@ save_config(struct server_config *config)
sset_init(&db_filenames);
SHASH_FOR_EACH (node, config->all_dbs) {
struct db *db = node->data;
- sset_add(&db_filenames, db->filename);
+ if (node->name[0] != '_') {
+ sset_add(&db_filenames, db->filename);
+ }
}
save_config__(config->config_tmpfile, config->remotes, &db_filenames,
Names that begin with "_" are reserved, but ovsdb-server didn't previously enforce this. Signed-off-by: Ben Pfaff <blp@ovn.org> --- ovsdb/execution.c | 17 ++++++++++++----- ovsdb/ovsdb-client.c | 19 ++++++++++++++----- ovsdb/ovsdb-server.c | 51 ++++++++++++++++++++++++++++++++++++++------------- 3 files changed, 64 insertions(+), 23 deletions(-)