[ovs-dev] [db-backup 4/5] ovsdb-tool: New command "needs-conversion".
Ethan Jackson
ethan at nicira.com
Tue Feb 15 00:13:30 UTC 2011
Looks Good.
On Tue, Feb 8, 2011 at 4:00 PM, Ben Pfaff <blp at nicira.com> wrote:
> ---
> ovsdb/ovsdb-tool.1.in | 7 +++++++
> ovsdb/ovsdb-tool.c | 15 +++++++++++++++
> ovsdb/ovsdb.c | 17 +++++++++++++++++
> ovsdb/ovsdb.h | 3 +++
> tests/ovsdb-tool.at | 22 ++++++++++++++++++++++
> 5 files changed, 64 insertions(+), 0 deletions(-)
>
> diff --git a/ovsdb/ovsdb-tool.1.in b/ovsdb/ovsdb-tool.1.in
> index 79bd2a6..7f34609 100644
> --- a/ovsdb/ovsdb-tool.1.in
> +++ b/ovsdb/ovsdb-tool.1.in
> @@ -19,6 +19,8 @@ ovsdb\-tool \- Open vSwitch database management utility
> \fBovsdb\-tool \fR[\fIoptions\fR] \fBconvert\fI db schema
> \fR[\fItarget\fR]
> .br
> +\fBovsdb\-tool \fR[\fIoptions\fR] \fBneeds\-conversion\fI db schema\fR
> +.br
> \fBovsdb\-tool \fR[\fIoptions\fR] \fBdb\-version\fI db\fR
> .br
> \fBovsdb\-tool \fR[\fIoptions\fR] \fBschema\-version\fI schema\fR
> @@ -76,6 +78,11 @@ ignored. Columns that exist in \fIschema\fR but not in \fIdb\fR are
> set to their default values. All of \fIschema\fR's constraints apply
> in full.
> .
> +.IP "\fBneeds\-conversion\fI db schema\fR"
> +Reads the schema embedded in \fIdb\fR and the standalone schema in
> +\fIschema\fR and compares them. If the schemas are the same, prints
> +\fBno\fR on stdout; if they differ, print \fByes\fR.
> +.
> .IP "\fBdb\-version\fI db\fR"
> .IQ "\fBschema\-version\fI schema\fR"
> Prints the version number in the schema embedded within the database
> diff --git a/ovsdb/ovsdb-tool.c b/ovsdb/ovsdb-tool.c
> index 3730e67..4f55b6a 100644
> --- a/ovsdb/ovsdb-tool.c
> +++ b/ovsdb/ovsdb-tool.c
> @@ -244,6 +244,20 @@ do_convert(int argc OVS_UNUSED, char *argv[])
> }
>
> static void
> +do_needs_conversion(int argc OVS_UNUSED, char *argv[])
> +{
> + const char *db_file_name = argv[1];
> + const char *schema_file_name = argv[2];
> + struct ovsdb_schema *schema1, *schema2;
> +
> + check_ovsdb_error(ovsdb_file_read_schema(db_file_name, &schema1));
> + check_ovsdb_error(ovsdb_schema_from_file(schema_file_name, &schema2));
> + puts(ovsdb_schema_equal(schema1, schema2) ? "no" : "yes");
> + ovsdb_schema_destroy(schema1);
> + ovsdb_schema_destroy(schema2);
> +}
> +
> +static void
> do_db_version(int argc OVS_UNUSED, char *argv[])
> {
> const char *db_file_name = argv[1];
> @@ -458,6 +472,7 @@ static const struct command all_commands[] = {
> { "create", 2, 2, do_create },
> { "compact", 1, 2, do_compact },
> { "convert", 2, 3, do_convert },
> + { "needs-conversion", 2, 2, do_needs_conversion },
> { "db-version", 1, 1, do_db_version },
> { "db-cksum", 1, 1, do_db_cksum },
> { "schema-version", 1, 1, do_schema_version },
> diff --git a/ovsdb/ovsdb.c b/ovsdb/ovsdb.c
> index 46d06a0..2a54a7b 100644
> --- a/ovsdb/ovsdb.c
> +++ b/ovsdb/ovsdb.c
> @@ -235,6 +235,23 @@ ovsdb_schema_to_json(const struct ovsdb_schema *schema)
>
> return json;
> }
> +
> +/* Returns true if 'a' and 'b' specify equivalent schemas, false if they
> + * differ. */
> +bool
> +ovsdb_schema_equal(const struct ovsdb_schema *a,
> + const struct ovsdb_schema *b)
> +{
> + /* This implementation is simple, stupid, and slow, but I doubt that it
> + * will ever require much maintenance. */
> + struct json *ja = ovsdb_schema_to_json(a);
> + struct json *jb = ovsdb_schema_to_json(b);
> + bool equals = json_equal(ja, jb);
> + json_destroy(ja);
> + json_destroy(jb);
> +
> + return equals;
> +}
>
> static void
> ovsdb_set_ref_table(const struct shash *tables,
> diff --git a/ovsdb/ovsdb.h b/ovsdb/ovsdb.h
> index ae743bb..834ff1a 100644
> --- a/ovsdb/ovsdb.h
> +++ b/ovsdb/ovsdb.h
> @@ -47,6 +47,9 @@ struct ovsdb_error *ovsdb_schema_from_json(struct json *,
> struct ovsdb_schema **)
> WARN_UNUSED_RESULT;
> struct json *ovsdb_schema_to_json(const struct ovsdb_schema *);
> +
> +bool ovsdb_schema_equal(const struct ovsdb_schema *,
> + const struct ovsdb_schema *);
>
> /* Database. */
> struct ovsdb {
> diff --git a/tests/ovsdb-tool.at b/tests/ovsdb-tool.at
> index 0f11668..989159d 100644
> --- a/tests/ovsdb-tool.at
> +++ b/tests/ovsdb-tool.at
> @@ -306,3 +306,25 @@ AT_CHECK([ovsdb-tool create db schema], [0], [], [ignore])
> AT_CHECK([ovsdb-tool db-cksum db], [0], [12345678 9
> ])
> AT_CLEANUP
> +
> +AT_SETUP([ovsdb-tool needs-conversion (no conversion needed)])
> +AT_KEYWORDS([ovsdb file positive])
> +AT_DATA([schema], [ORDINAL_SCHEMA
> +])
> +touch .db.~lock~
> +AT_CHECK([ovsdb-tool create db schema], [0], [], [ignore])
> +AT_CHECK([ovsdb-tool needs-conversion db schema], [0], [no
> +])
> +AT_CLEANUP
> +
> +AT_SETUP([ovsdb-tool needs-conversion (conversion needed)])
> +AT_KEYWORDS([ovsdb file positive])
> +AT_DATA([schema], [ORDINAL_SCHEMA
> +])
> +touch .db.~lock~
> +AT_CHECK([ovsdb-tool create db schema], [0], [], [ignore])
> +sed 's/5\.1\.3/5.1.4/' < schema > schema2
> +AT_CHECK([diff schema schema2], [1], [ignore])
> +AT_CHECK([ovsdb-tool needs-conversion db schema2], [0], [yes
> +])
> +AT_CLEANUP
> --
> 1.7.1
>
>
> _______________________________________________
> dev mailing list
> dev at openvswitch.org
> http://openvswitch.org/mailman/listinfo/dev_openvswitch.org
>
More information about the dev
mailing list