[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