ovn-nbctl: Help catch lport-set-addresses mistakes.
authorRussell Bryant <russell@ovn.org>
Thu, 14 Jan 2016 15:47:18 +0000 (10:47 -0500)
committerRussell Bryant <russell@ovn.org>
Thu, 21 Jan 2016 14:06:33 +0000 (09:06 -0500)
While debugging a broken OVN environment yesterday, the problem turned
out to be invalid entries in the logical port addresses column.  In
particular, the following command had been used:

  $ ovn-nbctl lport-set-addresses lp0 MAC IP

instead of:

  $ ovn-nbctl lport-set-addresses lp0 "MAC IP"

This is really easy to mess up, so add some simple validation to the
lport-set-addresses command.  If the beginning of an argument is ever
an IP address, it's wrong.

In passing, also add a note to the ovn-nb db documentation to note that
the order of "MAC IP" is required, as "IP MAC" is not valid.

Signed-off-by: Russell Bryant <russell@ovn.org>
Acked-by: Ben Pfaff <blp@ovn.org>
ovn/ovn-nb.xml
ovn/utilities/ovn-nbctl.c

index ef34c9b..4e414ce 100644 (file)
               if any, uses this information to avoid issuing ARP requests for
               logical switch ports.
             </p>
+
+            <p>
+              Note that the order here is important. The Ethernet address must
+              be listed before the IP address.
+            </p>
           </dd>
 
           <dt><code>unknown</code></dt>
index 8522c7e..8ac1cd0 100644 (file)
@@ -25,6 +25,7 @@
 #include "fatal-signal.h"
 #include "json.h"
 #include "ovn/lib/ovn-nb-idl.h"
+#include "packets.h"
 #include "poll-loop.h"
 #include "process.h"
 #include "smap.h"
@@ -665,6 +666,21 @@ nbctl_lport_set_addresses(struct ctl_context *ctx)
         return;
     }
 
+    int i;
+    for (i = 2; i < ctx->argc; i++) {
+        struct eth_addr ea;
+
+        if (strcmp(ctx->argv[i], "unknown")
+            && !ovs_scan(ctx->argv[i], ETH_ADDR_SCAN_FMT,
+                         ETH_ADDR_SCAN_ARGS(ea))) {
+            VLOG_ERR("Invalid address format (%s). See ovn-nb(5). "
+                     "Hint: An Ethernet address must be "
+                     "listed before an IP address, together as a single "
+                     "argument.", ctx->argv[i]);
+            return;
+        }
+    }
+
     nbrec_logical_port_set_addresses(lport,
             (const char **) ctx->argv + 2, ctx->argc - 2);
 }