diff mbox series

[ovs-dev,v4] db-ctl-base: add uuid specified method for create cmd

Message ID 20200302032156.4252-1-taoyunxiang@cmss.chinamobile.com
State Superseded
Headers show
Series [ovs-dev,v4] db-ctl-base: add uuid specified method for create cmd | expand

Commit Message

taoyunxiang March 2, 2020, 3:21 a.m. UTC
Commit a529e3cd1f (ovsdb-server: Allow OVSDB clients to specify the
UUID for inserted rows) solves ovsdb-client specifing the UUID for
insert operation.  OVSDB now can support directly using uuid to identify
a row. But for xxxctl tool,specifying uuid when creating a row is not
yet supported . This patch tried to specify uuid when creating a row
by the ctl tools. A new parameter --row_uuid is added to setup row's UUID.
e.g. ovn-nbctl --row_uuid=3da0398b-a5a8-4bc9-808d-fa662865138f  create
logical_switch name='abc'

Co-authored-by: Liu Chang <liuchang@cmss.chinamobile.com>
Co-authored-by: Rong Yin <rongyin@cmss.chinamobile.com>
Signed-off-by: Tao YunXiang <taoyunxiang@cmss.chinamobile.com>
Signed-off-by: Liu Chang <liuchang@cmss.chinamobile.com>
Signed-off-by: Rong Yin <rongyin@cmss.chinamobile.com>

CC: Han Zhou <hzhou@ovn.org>

---
 NEWS                |  1 +
 lib/db-ctl-base.c   | 16 ++++++++++++++--
 lib/db-ctl-base.xml |  7 ++++++-
 lib/ovsdb-data.c    |  2 +-
 lib/ovsdb-idl.c     | 24 ++++++++++++++++++++----
 lib/ovsdb-idl.h     |  1 +
 6 files changed, 43 insertions(+), 8 deletions(-)

Comments

0-day Robot March 2, 2020, 4 a.m. UTC | #1
Bleep bloop.  Greetings taoyunxiang@cmss.chinamobile.com, I am a robot and I have tried out your patch.
Thanks for your contribution.

I encountered some error that I wasn't expecting.  See the details below.


git-am:
error: corrupt patch at line 103
error: could not build fake ancestor
hint: Use 'git am --show-current-patch' to see the failed patch
Patch failed at 0001 db-ctl-base: add uuid specified method for create cmd
When you have resolved this problem, run "git am --continue".
If you prefer to skip this patch, run "git am --skip" instead.
To restore the original branch and stop patching, run "git am --abort".


Please check this out.  If you feel there has been an error, please email aconole@redhat.com

Thanks,
0-day Robot
Ben Pfaff March 6, 2020, 9:17 p.m. UTC | #2
On Mon, Mar 02, 2020 at 11:21:56AM +0800, Tao YunXiang wrote:
> Commit a529e3cd1f (ovsdb-server: Allow OVSDB clients to specify the
> UUID for inserted rows) solves ovsdb-client specifing the UUID for
> insert operation.  OVSDB now can support directly using uuid to identify
> a row. But for xxxctl tool,specifying uuid when creating a row is not
> yet supported . This patch tried to specify uuid when creating a row
> by the ctl tools. A new parameter --row_uuid is added to setup row's UUID.
> e.g. ovn-nbctl --row_uuid=3da0398b-a5a8-4bc9-808d-fa662865138f  create
> logical_switch name='abc'
> 
> Co-authored-by: Liu Chang <liuchang@cmss.chinamobile.com>
> Co-authored-by: Rong Yin <rongyin@cmss.chinamobile.com>
> Signed-off-by: Tao YunXiang <taoyunxiang@cmss.chinamobile.com>
> Signed-off-by: Liu Chang <liuchang@cmss.chinamobile.com>
> Signed-off-by: Rong Yin <rongyin@cmss.chinamobile.com>
> 
> CC: Han Zhou <hzhou@ovn.org>

Thanks for the patch.

"git am" complains about a corrupt patch and I have to agree with it.
For example, the following patch hunk claims to have 7 lines but only
has 6 lines (that don't change anything):

> diff --git a/lib/ovsdb-data.c b/lib/ovsdb-data.c
> index 4828624f6..0ea8d4494 100644
> --- a/lib/ovsdb-data.c
> +++ b/lib/ovsdb-data.c
> @@ -2223,7 +2223,7 @@ ovsdb_atom_range_check_size(int64_t range_start, int64_t range_end)
>      }
>      return NULL;
>  }
>  char *
>  ovsdb_data_row_name(const struct uuid *uuid)
>  {
taoyunxiang March 9, 2020, 9:23 a.m. UTC | #3
Hi Ben,
     Thanks for your review, I have summited v5.

--------------
taoyunxiang@cmss.chinamobile.com
>On Mon, Mar 02, 2020 at 11:21:56AM +0800, Tao YunXiang wrote:
>> Commit a529e3cd1f (ovsdb-server: Allow OVSDB clients to specify the
>> UUID for inserted rows) solves ovsdb-client specifing the UUID for
>> insert operation.  OVSDB now can support directly using uuid to identify
>> a row. But for xxxctl tool,specifying uuid when creating a row is not
>> yet supported . This patch tried to specify uuid when creating a row
>> by the ctl tools. A new parameter --row_uuid is added to setup row's UUID.
>> e.g. ovn-nbctl --row_uuid=3da0398b-a5a8-4bc9-808d-fa662865138f  create
>> logical_switch name='abc'
>>
>> Co-authored-by: Liu Chang <liuchang@cmss.chinamobile.com>
>> Co-authored-by: Rong Yin <rongyin@cmss.chinamobile.com>
>> Signed-off-by: Tao YunXiang <taoyunxiang@cmss.chinamobile.com>
>> Signed-off-by: Liu Chang <liuchang@cmss.chinamobile.com>
>> Signed-off-by: Rong Yin <rongyin@cmss.chinamobile.com>
>>
>> CC: Han Zhou <hzhou@ovn.org>
>
>Thanks for the patch.
>
>"git am" complains about a corrupt patch and I have to agree with it.
>For example, the following patch hunk claims to have 7 lines but only
>has 6 lines (that don't change anything):
>
>> diff --git a/lib/ovsdb-data.c b/lib/ovsdb-data.c
>> index 4828624f6..0ea8d4494 100644
>> --- a/lib/ovsdb-data.c
>> +++ b/lib/ovsdb-data.c
>> @@ -2223,7 +2223,7 @@ ovsdb_atom_range_check_size(int64_t range_start, int64_t range_end)
>>      }
>>      return NULL;
>>  }
>>  char *
>>  ovsdb_data_row_name(const struct uuid *uuid)
>>  {
diff mbox series

Patch

diff --git a/NEWS b/NEWS
index 9bbe71d9e..19d509519 100644
--- a/NEWS
+++ b/NEWS
@@ -48,6 +48,7 @@  v2.13.0 - xx xxx xxxx
        replication server. This value is configurable with the unixctl
        command - ovsdb-server/set-active-ovsdb-server-probe-interval.
      * ovsdb-server: New OVSDB extension to allow clients to specify row UUIDs.
+     * db-ctl-base: New row_uuid parameter specified for create cmd
    - 'ovs-appctl dpctl/dump-flows' can now show offloaded=partial for
      partially offloaded flows, dp:dpdk for fully offloaded by dpdk, and
      type filter supports new filters: "dpdk" and "partially-offloaded".
diff --git a/lib/db-ctl-base.c b/lib/db-ctl-base.c
index ab2af9eda..1f3502f3f 100644
--- a/lib/db-ctl-base.c
+++ b/lib/db-ctl-base.c
@@ -1718,10 +1718,12 @@  static void
 cmd_create(struct ctl_context *ctx)
 {
     const char *id = shash_find_data(&ctx->options, "--id");
+    const char *row_uuid = shash_find_data(&ctx->options, "--row_uuid");
     const char *table_name = ctx->argv[1];
     const struct ovsdb_idl_table_class *table;
     const struct ovsdb_idl_row *row;
     const struct uuid *uuid = NULL;
+    struct uuid uuid_from_cmd;
     int i;
 
     ctx->error = get_table(table_name, &table);
@@ -1741,7 +1743,17 @@  cmd_create(struct ctl_context *ctx)
              * warnings about that by pretending that there is a reference. */
             symbol->strong_ref = true;
         }
-        uuid = &symbol->uuid;
+        if (!row_uuid) {
+            uuid = &symbol->uuid;
+        }
+    }
+    if (row_uuid) {
+        if (!uuid_from_string(&uuid_from_cmd, row_uuid)) {
+            ctl_error(ctx, "row_uuid '%s' is not a valid UUID", row_uuid);
+            return ;
+        }
+        uuid = &uuid_from_cmd;
+        ovsdb_idl_txn_set_uuid_specified(ctx->txn);
     }
 
     row = ovsdb_idl_txn_insert(ctx->txn, table, uuid);
@@ -2465,7 +2477,7 @@  static const struct ctl_command_syntax db_ctl_commands[] = {
     {"clear", 3, INT_MAX, "TABLE RECORD COLUMN...", pre_cmd_clear, cmd_clear,
      NULL, "--if-exists", RW},
     {"create", 2, INT_MAX, "TABLE COLUMN[:KEY]=VALUE...", pre_create,
-     cmd_create, post_create, "--id=", RW},
+     cmd_create, post_create, "--id=,--row_uuid=", RW},
     {"destroy", 1, INT_MAX, "TABLE [RECORD]...", pre_cmd_destroy, cmd_destroy,
      NULL, "--if-exists,--all", RW},
     {"wait-until", 2, INT_MAX, "TABLE RECORD [COLUMN[:KEY]=VALUE]...",
diff --git a/lib/db-ctl-base.xml b/lib/db-ctl-base.xml
index 10124c3ad..cc6414a8e 100644
--- a/lib/db-ctl-base.xml
+++ b/lib/db-ctl-base.xml
@@ -290,7 +290,7 @@ 
       </p>
     </dd>
 
-    <dt>[<code>--id=@</code><var>name</var>] <code>create</code> <var>table column</var>[<code>:</code><var>key</var>]<code>=</code><var>value</var>...</dt>
+    <dt>[<code>--id=@</code><var>name</var>] [<code>--row_uuid=</code><var>uuid</var>] <code>create</code> <var>table column</var>[<code>:</code><var>key</var>]<code>=</code><var>value</var>...</dt>
     <dd>
       <p>
         Creates a new record in <var>table</var> and sets the initial values of
@@ -303,6 +303,11 @@ 
         invocation in contexts where a UUID is expected.  Such references may
         precede or follow the <code>create</code> command.
       </p>
+      <p>
+        If <code></code><var>uuid</var> is specified, then the UUID for the new row may be
+        specified as expected.  Such references may precede or follow the <code>create</code>
+        command.
+      </p>
       <dl>
         <dt>Caution (ovs-vsctl as example)</dt>
         <dd>
diff --git a/lib/ovsdb-data.c b/lib/ovsdb-data.c
index 4828624f6..0ea8d4494 100644
--- a/lib/ovsdb-data.c
+++ b/lib/ovsdb-data.c
@@ -2223,7 +2223,7 @@  ovsdb_atom_range_check_size(int64_t range_start, int64_t range_end)
     }
     return NULL;
 }
 char *
 ovsdb_data_row_name(const struct uuid *uuid)
 {
diff --git a/lib/ovsdb-idl.c b/lib/ovsdb-idl.c
index 190143f36..f22dc2e8c 100644
--- a/lib/ovsdb-idl.c
+++ b/lib/ovsdb-idl.c
@@ -281,6 +281,7 @@  struct ovsdb_idl_txn {
     char *error;
     bool dry_run;
     struct ds comment;
+    bool uuid_specified;
 
     /* Increments. */
     const char *inc_table;
@@ -3550,6 +3551,7 @@  ovsdb_idl_txn_create(struct ovsdb_idl *idl)
     txn->status = TXN_UNCOMMITTED;
     txn->error = NULL;
     txn->dry_run = false;
+    txn->uuid_specified = false;
     ds_init(&txn->comment);
 
     txn->inc_table = NULL;
@@ -3591,6 +3593,11 @@  ovsdb_idl_txn_set_dry_run(struct ovsdb_idl_txn *txn)
     txn->dry_run = true;
 }
 
+void
+ovsdb_idl_txn_set_uuid_specified(struct ovsdb_idl_txn *txn)
+{
+    txn->uuid_specified = true;
+}
 /* Causes 'txn', when committed, to increment the value of 'column' within
  * 'row' by 1.  'column' must have an integer type.  After 'txn' commits
  * successfully, the client may retrieve the final (incremented) value of
@@ -3689,7 +3696,9 @@  ovsdb_idl_txn_get_row(const struct ovsdb_idl_txn *txn, const struct uuid *uuid)
 static struct json *
 substitute_uuids(struct json *json, const struct ovsdb_idl_txn *txn)
 {
-    if (json->type == JSON_ARRAY) {
+     if (txn->uuid_specified) {
+         return json;
+     } else if (json->type == JSON_ARRAY) {
         struct uuid uuid;
         size_t i;
 
@@ -4153,9 +4162,16 @@  ovsdb_idl_txn_commit(struct ovsdb_idl_txn *txn)
 
                 any_updates = true;
 
-                json_object_put(op, "uuid-name",
-                                json_string_create_nocopy(
-                                    ovsdb_data_row_name(&row->uuid)));
+
+                if (txn->uuid_specified) {
+                    json_object_put(op, "uuid",
+                                    json_string_create_nocopy(
+                                        xasprintf(UUID_FMT, UUID_ARGS(&row->uuid))));
+                } else {
+                    json_object_put(op, "uuid-name",
+                                    json_string_create_nocopy(
+                                        ovsdb_data_row_name(&row->uuid)));
+                }
 
                 insert = xmalloc(sizeof *insert);
                 insert->dummy = row->uuid;
diff --git a/lib/ovsdb-idl.h b/lib/ovsdb-idl.h
index 9f12ce320..ae9dc10e4 100644
--- a/lib/ovsdb-idl.h
+++ b/lib/ovsdb-idl.h
@@ -316,6 +316,7 @@  struct ovsdb_idl_txn *ovsdb_idl_txn_create(struct ovsdb_idl *);
 void ovsdb_idl_txn_add_comment(struct ovsdb_idl_txn *, const char *, ...)
     OVS_PRINTF_FORMAT (2, 3);
 void ovsdb_idl_txn_set_dry_run(struct ovsdb_idl_txn *);
+void ovsdb_idl_txn_set_uuid_specified(struct ovsdb_idl_txn *);
 void ovsdb_idl_txn_increment(struct ovsdb_idl_txn *,
                              const struct ovsdb_idl_row *,
                              const struct ovsdb_idl_column *,