diff mbox

[ovs-dev] db-ctl-base: Allow record UUIDs to be abbreviated.

Message ID 20170427193634.19273-1-blp@ovn.org
State Accepted
Headers show

Commit Message

Ben Pfaff April 27, 2017, 7:36 p.m. UTC
This makes it easier to type ovs-vsctl, ovn-sbctl, ovn-nbctl, and vtep-ctl
commands without cut-and-paste.

Signed-off-by: Ben Pfaff <blp@ovn.org>
---
 NEWS                          |  4 ++++
 lib/db-ctl-base.c             | 28 ++++++++++++++++++++++++++++
 ovn/utilities/ovn-nbctl.8.xml | 15 +++++++++++++--
 ovn/utilities/ovn-sbctl.8.in  | 26 ++++++++++++++++++++++++++
 ovn/utilities/ovn-sbctl.c     |  3 +++
 utilities/ovs-vsctl.8.in      | 10 ++++++----
 vtep/vtep-ctl.8.in            | 10 ++++++----
 7 files changed, 86 insertions(+), 10 deletions(-)

Comments

Andy Zhou April 28, 2017, 11:43 p.m. UTC | #1
On Thu, Apr 27, 2017 at 12:36 PM, Ben Pfaff <blp@ovn.org> wrote:
> This makes it easier to type ovs-vsctl, ovn-sbctl, ovn-nbctl, and vtep-ctl
> commands without cut-and-paste.
>
> Signed-off-by: Ben Pfaff <blp@ovn.org>

Very handy!.  Now I can just use ovs-vsctl list a table, and then dump
a row from the Reftables with quik type of UUID.
Documentation updates looks good too.

Acked-by: Andy Zhou <azhou@ovn.org>
Ben Pfaff April 30, 2017, 8:47 p.m. UTC | #2
On Fri, Apr 28, 2017 at 04:43:55PM -0700, Andy Zhou wrote:
> On Thu, Apr 27, 2017 at 12:36 PM, Ben Pfaff <blp@ovn.org> wrote:
> > This makes it easier to type ovs-vsctl, ovn-sbctl, ovn-nbctl, and vtep-ctl
> > commands without cut-and-paste.
> >
> > Signed-off-by: Ben Pfaff <blp@ovn.org>
> 
> Very handy!.  Now I can just use ovs-vsctl list a table, and then dump
> a row from the Reftables with quik type of UUID.
> Documentation updates looks good too.
> 
> Acked-by: Andy Zhou <azhou@ovn.org>

Thanks! I applied this to master.
diff mbox

Patch

diff --git a/NEWS b/NEWS
index ea97d84a2dea..7a7e7fcd8a3a 100644
--- a/NEWS
+++ b/NEWS
@@ -12,6 +12,8 @@  Post-v2.7.0
        still can be configured via extra arguments for DPDK EAL.
    - New support for multiple VLANs (802.1ad or "QinQ"), including a new
      "dot1q-tunnel" port VLAN mode.
+   - In ovn-vsctl and vtep-ctl, record UUIDs in commands may now be
+     abbreviated to 4 hex digits.
    - OVN:
      * IPAM for IPv4 can now exclude user-defined addresses from assignment.
      * IPAM can now assign IPv6 addresses.
@@ -20,6 +22,8 @@  Post-v2.7.0
      * Allow ovn-controller SSL configuration to be obtained from vswitchd
        database.
      * ovn-trace now has basic support for tracing distributed firewalls.
+     * In ovn-nbctl and ovn-sbctl, record UUIDs in commands may now be
+       abbreviated to 4 hex digits.
    - Add the command 'ovs-appctl stp/show' (see ovs-vswitchd(8)).
    - OpenFlow:
      * Increased support for OpenFlow 1.6 (draft).
diff --git a/lib/db-ctl-base.c b/lib/db-ctl-base.c
index afc70eb06e36..ad98454c903d 100644
--- a/lib/db-ctl-base.c
+++ b/lib/db-ctl-base.c
@@ -300,6 +300,14 @@  get_row_by_id(struct ctl_context *ctx,
     return final;
 }
 
+static bool
+is_partial_uuid_match(const struct uuid *uuid, const char *match)
+{
+    char uuid_s[UUID_LEN + 1];
+    snprintf(uuid_s, sizeof uuid_s, UUID_FMT, UUID_ARGS(uuid));
+    return !strncmp(uuid_s, match, strlen(match));
+}
+
 static const struct ovsdb_idl_row *
 get_row(struct ctl_context *ctx,
         const struct ovsdb_idl_table_class *table, const char *record_id,
@@ -330,6 +338,26 @@  get_row(struct ctl_context *ctx,
             }
         }
     }
+    if (!row
+        && record_id[uuid_is_partial_string(record_id)] == '\0'
+        && strlen(record_id) >= 4) {
+        for (const struct ovsdb_idl_row *r = ovsdb_idl_first_row(ctx->idl,
+                                                                 table);
+             r != NULL;
+             r = ovsdb_idl_next_row(r)) {
+            if (is_partial_uuid_match(&r->uuid, record_id)) {
+                if (!row) {
+                    row = r;
+                } else {
+                    ctl_fatal("%s contains 2 or more rows whose UUIDs begin "
+                              "with %s: at least "UUID_FMT" and "UUID_FMT,
+                              table->name, record_id,
+                              UUID_ARGS(&row->uuid),
+                              UUID_ARGS(&r->uuid));
+                }
+            }
+        }
+    }
     if (must_exist && !row) {
         ctl_fatal("no row \"%s\" in table %s", record_id, table->name);
     }
diff --git a/ovn/utilities/ovn-nbctl.8.xml b/ovn/utilities/ovn-nbctl.8.xml
index 70afc1080f62..adea29a4e84f 100644
--- a/ovn/utilities/ovn-nbctl.8.xml
+++ b/ovn/utilities/ovn-nbctl.8.xml
@@ -669,12 +669,13 @@ 
     <h1>Database Commands</h1>
     <p>These commands query and modify the contents of <code>ovsdb</code> tables.
     They are a slight abstraction of the <code>ovsdb</code> interface and
-    as suchthey operate at a lower level than other <code>ovn-nbctl</code> commands.</p>
+    as such they operate at a lower level than other <code>ovn-nbctl</code> commands.</p>
     <p><var>Identifying Tables, Records, and Columns</var></p>
     <p>Each of these commands has a <var>table</var> parameter to identify a table
     within the database.  Many of them also take a <var>record</var> parameter
     that identifies a particular record within a table.  The <var>record</var>
-    parameter may be the UUID for a record, and many tables offer
+    parameter may be the UUID for a record, which may be abbreviated to its
+    first 4 (or more) hex digits, as long as that is unique.  Many tables offer
     additional ways to identify records.  Some commands also take
     <var>column</var> parameters that identify a particular field within the
     records in a table.</p>
@@ -737,6 +738,16 @@ 
 
     </dl>
 
+    <p>
+      Record names must be specified in full and with correct capitalization,
+      except that UUIDs may be abbreviated to their first 4 (or more) hex
+      digits, as long as that is unique within the table.  Names of tables and
+      columns are not case-sensitive, and <code>-</code> and <code>_</code> are
+      treated interchangeably.  Unique abbreviations of table and column names
+      are acceptable, e.g. <code>d</code> or <code>dhcp</code> is sufficient
+      to identify the <code>DHCP_Options</code> table.
+    </p>
+
     <xi:include href="lib/db-ctl-base.xml" xmlns:xi="http://www.w3.org/2003/XInclude"/>
 
     <h1>Synchronization Commands</h1>
diff --git a/ovn/utilities/ovn-sbctl.8.in b/ovn/utilities/ovn-sbctl.8.in
index 6502b81140ff..83953cf3cd60 100644
--- a/ovn/utilities/ovn-sbctl.8.in
+++ b/ovn/utilities/ovn-sbctl.8.in
@@ -257,6 +257,32 @@  This option is only useful if the SSL peer sends its CA certificate
 as part of the SSL certificate chain.  The SSL protocol does not
 require the controller to send the CA certificate.
 .
+.SS "Database Commands"
+.
+These commands query and modify the contents of \fBovsdb\fR tables.
+They are a slight abstraction of the \fBovsdb\fR interface and as such
+they operate at a lower level than other \fBovs\-sbctl\fR commands.
+.PP
+.ST "Identifying Tables, Records, and Columns"
+.PP
+Each of these commands has a \fItable\fR parameter to identify a table
+within the database.  Many of them also take a \fIrecord\fR parameter
+that identifies a particular record within a table.  The \fIrecord\fR
+parameter may be the UUID for a record, and many tables offer
+additional ways to identify records.  Some commands also take
+\fIcolumn\fR parameters that identify a particular field within the
+records in a table.
+.\" It would be kind to list all the tables and their supported identifiers
+.\" here.
+.PP
+Record names must be specified in full and with correct
+capitalization, except that UUIDs may be abbreviated to their first 4
+(or more) hex digits, as long as that is unique within the table.
+Names of tables and columns are not case-sensitive, and \fB\-\fR and
+\fB_\fR are treated interchangeably.  Unique abbreviations of table
+and column names are acceptable, e.g. \fBaddr\fR or \fBa\fR is
+sufficient to identify the \fBAddress_Set\fR table.
+.
 .so lib/db-ctl-base.man
 .SH "EXIT STATUS"
 .IP "0"
diff --git a/ovn/utilities/ovn-sbctl.c b/ovn/utilities/ovn-sbctl.c
index 3fe7b8fdd1a5..ac292f316086 100644
--- a/ovn/utilities/ovn-sbctl.c
+++ b/ovn/utilities/ovn-sbctl.c
@@ -727,6 +727,9 @@  is_partial_uuid_match(const struct uuid *uuid, const char *match)
     char uuid_s[UUID_LEN + 1];
     snprintf(uuid_s, sizeof uuid_s, UUID_FMT, UUID_ARGS(uuid));
 
+    /* We strip leading zeros because we want to accept cookie values derived
+     * from UUIDs, and cookie values are printed without leading zeros because
+     * they're just numbers. */
     const char *s1 = strip_leading_zero(uuid_s);
     const char *s2 = strip_leading_zero(match);
 
diff --git a/utilities/ovs-vsctl.8.in b/utilities/ovs-vsctl.8.in
index 19179060e96b..6aca267a7067 100644
--- a/utilities/ovs-vsctl.8.in
+++ b/utilities/ovs-vsctl.8.in
@@ -560,10 +560,12 @@  packets on a per-flow basis using OpenFlow \fBsample\fR actions.
 Configuration for Auto Attach within a bridge.
 .PP
 Record names must be specified in full and with correct
-capitalization.  Names of tables and columns are not case-sensitive,
-and \fB\-\-\fR and \fB_\fR are treated interchangeably.  Unique
-abbreviations are acceptable, e.g. \fBnet\fR or \fBn\fR is sufficient
-to identify the \fBNetFlow\fR table.
+capitalization, except that UUIDs may be abbreviated to their first 4
+(or more) hex digits, as long as that is unique within the table.
+Names of tables and columns are not case-sensitive, and \fB\-\fR and
+\fB_\fR are treated interchangeably.  Unique abbreviations of table
+and column names are acceptable, e.g. \fBnet\fR or \fBn\fR is
+sufficient to identify the \fBNetFlow\fR table.
 .
 .so lib/db-ctl-base.man
 .SH "EXAMPLES"
diff --git a/vtep/vtep-ctl.8.in b/vtep/vtep-ctl.8.in
index 190135665ab9..b980a7186cf2 100644
--- a/vtep/vtep-ctl.8.in
+++ b/vtep/vtep-ctl.8.in
@@ -394,10 +394,12 @@  encapsulated and forwarded.  Records may be identified by physical
 locator name.
 .PP
 Record names must be specified in full and with correct
-capitalization.  Names of tables and columns are not case-sensitive,
-and \fB\-\-\fR and \fB_\fR are treated interchangeably.  Unique
-abbreviations are acceptable, e.g. \fBman\fR or \fBm\fR is sufficient
-to identify the \fBManager\fR table.
+capitalization, except that UUIDs may be abbreviated to their first 4
+(or more) hex digits, as long as that is unique within the table.
+Names of tables and columns are not case-sensitive, and \fB\-\fR and
+\fB_\fR are treated interchangeably.  Unique abbreviations of table
+and column names are acceptable, e.g. \fBman\fR or \fBm\fR is
+sufficient to identify the \fBManager\fR table.
 .
 .so lib/db-ctl-base.man
 .PP