mirror of
https://github.com/openvswitch/ovs
synced 2025-08-31 22:35:15 +00:00
Add global option for JSON output to ovs-appctl.
For monitoring systems such as Prometheus it would be beneficial if OVS would expose statistics in a machine-readable format. This patch introduces support for different output formats to ovs-appctl. It gains a global option '-f,--format' which changes it to print a JSON document instead of plain-text for humans. For example, a later patch implements support for 'ovs-appctl --format json dpif/show'. By default, the output format is plain-text as before. A new 'set-options' command has been added to lib/unixctl.c which allows to change the output format of the commands executed afterwards on the same socket connection. It is supposed to be run by ovs-appctl transparently for the user when a specific output format has been requested. For example, when a user calls 'ovs-appctl --format json dpif/show', then ovs-appctl will call 'set-options' to set the output format as requested by the user and afterwards it will call the actual command 'dpif/show'. This ovs-appctl behaviour has been implemented in a backward compatible way. One can use an updated client (ovs-appctl) with an old server (ovs-vswitchd) and vice versa. Of course, JSON output only works when both sides have been updated. Two access functions unixctl_command_{get,set}_output_format() and a unixctl_command_reply_json function have been added to lib/unixctl.h: unixctl_command_get_output_format() is supposed to be used in commands like 'dpif/show' to query the requested output format. When JSON output has been selected, the unixctl_command_reply_json() function can be used to return JSON objects to the client (ovs-appctl) instead of plain-text with the unixctl_command_reply{,_error}() functions. When JSON has been requested but a command has not implemented JSON output the plain-text output will be wrapped in a provisional JSON document with the following structure: {"reply":"$PLAIN_TEXT_HERE","reply-format":"plain"} Thus commands which have been executed successfully will not fail when they try to render the output at a later stage. A test for the 'version' command has been implemented which shows how the provisional JSON document looks like in practice. For a cleaner JSON document, the trailing newline has been moved from the program version string to function ovs_print_version(). This way, the plain-text output of the 'version' command has not changed. Output formatting has been moved from unixctl_client_transact() in lib/unixctl.c to utilities/ovs-appctl.c. The former merely returns the JSON objects returned from the server and the latter is now responsible for printing it properly. In popular tools like kubectl the option for output control is usually called '-o|--output' instead of '-f,--format'. But ovs-appctl already has an short option '-o' which prints the available ovs-appctl options ('--option'). The now chosen name also better aligns with ovsdb-client where '-f,--format' controls output formatting. Reported-at: https://bugzilla.redhat.com/1824861 Signed-off-by: Jakob Meng <code@jakobmeng.de> Signed-off-by: Ilya Maximets <i.maximets@ovn.org>
This commit is contained in:
committed by
Ilya Maximets
parent
f8ed13355d
commit
939a5cea5b
@@ -619,11 +619,11 @@ ovs_set_program_name(const char *argv0, const char *version)
|
||||
|
||||
free(program_version);
|
||||
if (!strcmp(version, VERSION)) {
|
||||
program_version = xasprintf("%s (Open vSwitch) "VERSION"\n",
|
||||
program_version = xasprintf("%s (Open vSwitch) "VERSION,
|
||||
program_name);
|
||||
} else {
|
||||
program_version = xasprintf("%s %s\n"
|
||||
"Open vSwitch Library "VERSION"\n",
|
||||
"Open vSwitch Library "VERSION,
|
||||
program_name, version);
|
||||
}
|
||||
}
|
||||
@@ -760,7 +760,7 @@ ovs_get_program_name(void)
|
||||
void
|
||||
ovs_print_version(uint8_t min_ofp, uint8_t max_ofp)
|
||||
{
|
||||
printf("%s", program_version);
|
||||
printf("%s\n", program_version);
|
||||
if (min_ofp || max_ofp) {
|
||||
printf("OpenFlow versions %#x:%#x\n", min_ofp, max_ofp);
|
||||
}
|
||||
|
Reference in New Issue
Block a user