ovs-vsctl: Add --dry-run option.
authorBen Pfaff <blp@nicira.com>
Fri, 11 Dec 2009 19:28:36 +0000 (11:28 -0800)
committerBen Pfaff <blp@nicira.com>
Fri, 11 Dec 2009 21:26:08 +0000 (13:26 -0800)
lib/ovsdb-idl.c
lib/ovsdb-idl.h
utilities/ovs-vsctl.8.in
utilities/ovs-vsctl.c

index 059682c754b81786bebb380571b9216c9f0b6d00..98ec3dd55a2318afb440bfe3df3f04a25c21ae92 100644 (file)
@@ -79,6 +79,7 @@ struct ovsdb_idl_txn {
     struct ovsdb_idl *idl;
     struct hmap txn_rows;
     enum ovsdb_idl_txn_status status;
+    bool dry_run;
 };
 
 static struct vlog_rate_limit syntax_rl = VLOG_RATE_LIMIT_INIT(1, 5);
@@ -791,9 +792,16 @@ ovsdb_idl_txn_create(struct ovsdb_idl *idl)
     txn->idl = idl;
     txn->status = TXN_INCOMPLETE;
     hmap_init(&txn->txn_rows);
+    txn->dry_run = false;
     return txn;
 }
 
+void
+ovsdb_idl_txn_set_dry_run(struct ovsdb_idl_txn *txn)
+{
+    txn->dry_run = true;
+}
+
 void
 ovsdb_idl_txn_destroy(struct ovsdb_idl_txn *txn)
 {
@@ -1028,6 +1036,12 @@ ovsdb_idl_txn_commit(struct ovsdb_idl_txn *txn)
         }
     }
 
+    if (txn->dry_run) {
+        struct json *op = json_object_create();
+        json_object_put_string(op, "op", "abort");
+        json_array_add(operations, op);
+    }
+
     if (!any_updates) {
         txn->status = TXN_SUCCESS;
     } else if (!jsonrpc_session_send(
@@ -1209,7 +1223,7 @@ ovsdb_idl_txn_process_reply(struct ovsdb_idl *idl,
                     if (error->type == JSON_STRING) {
                         if (!strcmp(error->u.string, "timed out")) {
                             soft_errors++;
-                        } else {
+                        } else if (strcmp(error->u.string, "aborted")) {
                             hard_errors++;
                         }
                     } else {
index 5915a1bb94d4dc1467bf36632ab5f5d817183b11..fd6aa8b9269bbf8692bc803eedb533b9d7d220ff 100644 (file)
@@ -41,6 +41,7 @@ enum ovsdb_idl_txn_status {
 const char *ovsdb_idl_txn_status_to_string(enum ovsdb_idl_txn_status);
 
 struct ovsdb_idl_txn *ovsdb_idl_txn_create(struct ovsdb_idl *);
+void ovsdb_idl_txn_set_dry_run(struct ovsdb_idl_txn *);
 void ovsdb_idl_txn_destroy(struct ovsdb_idl_txn *);
 void ovsdb_idl_txn_wait(const struct ovsdb_idl_txn *);
 enum ovsdb_idl_txn_status ovsdb_idl_txn_commit(struct ovsdb_idl_txn *);
index a836fb7392da90986558d1b27c8ba02e3e0cf2e4..1ea80b79ae284829d2b0ab662af5468ba74161dc 100644 (file)
@@ -96,6 +96,9 @@ lines are printed as \fB\\n\fR, and any instances of \fB\\\fR that
 would otherwise appear in the output are doubled.
 Prints a blank line for each command that has no output.
 .
+.IP "\fB\-\-dry\-run\fR"
+Prevents \fBovs\-vsctl\fR from actually modifying the database.
+.
 .so lib/vlog.man
 .
 .SH COMMANDS
index e86cb7cd949ce48dc0fd9095e4afba8f4e52fdc0..9c019cc00d1f9a12d9e79d98c103f6724ae2df8f 100644 (file)
@@ -45,6 +45,9 @@ static const char *db;
 /* --oneline: Write each command's output as a single line? */
 static bool oneline;
 
+/* --dry-run: Do not commit any changes. */
+static bool dry_run;
+
 static void vsctl_fatal(const char *, ...) PRINTF_FORMAT(1, 2) NO_RETURN;
 static char *default_db(void);
 static void usage(void) NO_RETURN;
@@ -138,12 +141,14 @@ parse_options(int argc, char *argv[])
         OPT_DB = UCHAR_MAX + 1,
         OPT_ONELINE,
         OPT_NO_SYSLOG,
-        OPT_NO_WAIT
+        OPT_NO_WAIT,
+        OPT_DRY_RUN
     };
     static struct option long_options[] = {
         {"db", required_argument, 0, OPT_DB},
         {"no-syslog", no_argument, 0, OPT_NO_SYSLOG},
         {"no-wait", no_argument, 0, OPT_NO_WAIT},
+        {"dry-run", no_argument, 0, OPT_DRY_RUN},
         {"oneline", no_argument, 0, OPT_ONELINE},
         {"verbose", optional_argument, 0, 'v'},
         {"help", no_argument, 0, 'h'},
@@ -176,6 +181,10 @@ parse_options(int argc, char *argv[])
             /* XXX not yet implemented */
             break;
 
+        case OPT_DRY_RUN:
+            dry_run = true;
+            break;
+
         case 'h':
             usage();
 
@@ -1192,6 +1201,9 @@ do_vsctl(int argc, char *argv[], struct ovsdb_idl *idl)
     int i, start;
 
     txn = ovsdb_idl_txn_create(idl);
+    if (dry_run) {
+        ovsdb_idl_txn_set_dry_run(txn);
+    }
 
     ovs = ovsrec_open_vswitch_first(idl);
     if (!ovs) {