diff mbox series

[ovs-dev,v8,5/6] vswitchd: Add JSON output for 'list-commands' command.

Message ID 20240411144718.1921869-6-jmeng@redhat.com
State Superseded, archived
Headers show
Series Add global option to output JSON from ovs-appctl cmds. | expand

Checks

Context Check Description
ovsrobot/apply-robot success apply and check: success
ovsrobot/github-robot-_Build_and_Test fail github build: failed
ovsrobot/intel-ovs-compilation fail test: fail

Commit Message

Jakob Meng April 11, 2024, 2:47 p.m. UTC
From: Jakob Meng <code@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 <code@jakobmeng.de>
---
 NEWS                  |  1 +
 lib/unixctl.c         | 46 ++++++++++++++++++++++++++++++-------------
 tests/ovs-vswitchd.at | 11 +++++++++++
 3 files changed, 44 insertions(+), 14 deletions(-)
diff mbox series

Patch

diff --git a/NEWS b/NEWS
index 957351acb..af83623b3 100644
--- a/NEWS
+++ b/NEWS
@@ -13,6 +13,7 @@  Post-v3.3.0
      * Added new option [--pretty] to print JSON output in a readable fashion.
        E.g. members of objects and elements of arrays are printed one per line,
        with indentation.
+     * 'list-commands' now supports output in JSON format.
    - Python:
      * Added support for choosing the output format, e.g. 'json' or 'text'.
      * Added new option [--pretty] to print JSON output in a readable fashion.
diff --git a/lib/unixctl.c b/lib/unixctl.c
index 4bb6bbe7f..3c611a21d 100644
--- a/lib/unixctl.c
+++ b/lib/unixctl.c
@@ -68,24 +68,42 @@  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) == OVS_OUTPUT_FMT_JSON) {
+        struct json *json_commands = json_array_create_empty();
+        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) {
+                struct json *json_command = json_object_create();
+                json_object_put_string(json_command, "name", node->name);
+                json_object_put_string(json_command, "usage", command->usage);
+                json_array_add(json_commands, json_command);
+            }
         }
-    }
-    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 5683896ef..dcda71d04 100644
--- a/tests/ovs-vswitchd.at
+++ b/tests/ovs-vswitchd.at
@@ -281,3 +281,14 @@  AT_CHECK_UNQUOTED([ovs-appctl --format json --pretty version], [0], [dnl
   "reply-format": "plain"}])
 
 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])
+AT_CHECK([wc -l stdout], [0], [0 stdout
+])
+AT_CHECK([grep -E '^\[[\{"name":.*\}\]]$' stdout], [0], [ignore])
+
+AT_CLEANUP