From: Jakob Meng <c...@jakobmeng.de>

The 'list-commands' command now supports machine-readable JSON output
in addition to the plain-text output for humans.

Reported-at: https://bugzilla.redhat.com/1824861
Signed-off-by: Jakob Meng <c...@jakobmeng.de>
---
 NEWS                  |  1 +
 lib/unixctl.c         | 44 +++++++++++++++++++++++++++++--------------
 tests/ovs-vswitchd.at | 15 +++++++++++++++
 3 files changed, 46 insertions(+), 14 deletions(-)

diff --git a/NEWS b/NEWS
index d903d2f74..feebae86e 100644
--- a/NEWS
+++ b/NEWS
@@ -6,6 +6,7 @@ Post-v3.3.0
      * Added new option [-f|--format] to choose the output format, e.g. 'json'
        or 'text' (by default).
      * Added new option [--pretty] to print JSON output in a readable fashion.
+     * 'list-commands' now supports output in JSON format.
    - Userspace datapath:
      * Conntrack now supports 'random' flag for selecting ports in a range
        while natting and 'persistent' flag for selection of the IP address
diff --git a/lib/unixctl.c b/lib/unixctl.c
index e7ce77e2c..c060e8659 100644
--- a/lib/unixctl.c
+++ b/lib/unixctl.c
@@ -95,24 +95,40 @@ static void
 unixctl_list_commands(struct unixctl_conn *conn, int argc OVS_UNUSED,
                       const char *argv[] OVS_UNUSED, void *aux OVS_UNUSED)
 {
-    struct ds ds = DS_EMPTY_INITIALIZER;
-    const struct shash_node **nodes = shash_sort(&commands);
-    size_t i;
+    if (unixctl_command_get_output_format(conn) == UNIXCTL_OUTPUT_FMT_JSON) {
+        struct json *json_commands = json_object_create();
+        const struct shash_node *node;
 
-    ds_put_cstr(&ds, "The available commands are:\n");
+        SHASH_FOR_EACH (node, &commands) {
+            const struct unixctl_command *command = node->data;
 
-    for (i = 0; i < shash_count(&commands); i++) {
-        const struct shash_node *node = nodes[i];
-        const struct unixctl_command *command = node->data;
-
-        if (command->usage) {
-            ds_put_format(&ds, "  %-23s %s\n", node->name, command->usage);
+            if (command->usage) {
+                json_object_put_string(json_commands, node->name,
+                                       command->usage);
+            }
         }
-    }
-    free(nodes);
+        unixctl_command_reply_json(conn, json_commands);
+    } else {
+        struct ds ds = DS_EMPTY_INITIALIZER;
+        const struct shash_node **nodes = shash_sort(&commands);
+        size_t i;
 
-    unixctl_command_reply(conn, ds_cstr(&ds));
-    ds_destroy(&ds);
+        ds_put_cstr(&ds, "The available commands are:\n");
+
+        for (i = 0; i < shash_count(&commands); ++i) {
+            const struct shash_node *node = nodes[i];
+            const struct unixctl_command *command = node->data;
+
+            if (command->usage) {
+                ds_put_format(&ds, "  %-23s %s\n", node->name,
+                              command->usage);
+            }
+        }
+        free(nodes);
+
+        unixctl_command_reply(conn, ds_cstr(&ds));
+        ds_destroy(&ds);
+    }
 }
 
 static void
diff --git a/tests/ovs-vswitchd.at b/tests/ovs-vswitchd.at
index 0f7a6085e..730363e83 100644
--- a/tests/ovs-vswitchd.at
+++ b/tests/ovs-vswitchd.at
@@ -283,3 +283,18 @@ AT_CHECK_UNQUOTED([ovs-appctl --format json --pretty 
version], [0], [dnl
 ])
 
 AT_CLEANUP
+
+AT_SETUP([ovs-vswitchd list-commands])
+OVS_VSWITCHD_START
+
+AT_CHECK([ovs-appctl list-commands], [0], [ignore])
+AT_CHECK([ovs-appctl --format json list-commands], [0], [stdout])
+
+# Check that ovs-appctl prints a single line with a trailing newline.
+AT_CHECK([wc -l stdout], [0], [1 stdout
+])
+
+# Check that ovs-appctl prints a JSON document.
+AT_CHECK([ovstest test-json stdout], [0], [ignore])
+
+AT_CLEANUP
-- 
2.39.2

_______________________________________________
dev mailing list
d...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to