@@ -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.
@@ -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
@@ -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