From: Jakob Meng <c...@jakobmeng.de> Add global option to output JSON from ovs-appctl cmds.
This patch is an update of [0] with the following major changes: * The JSON-RPC API change is now backward compatible. One can use an updated client (ovs-appctl/dpctl) with an old server (ovs-vswitchd) and vice versa. Of course, JSON output only works when both are updated. * tests/pmd.at from forth patch now features an example of how the output looks like when a command does not support JSON output. * The patch has been split into a series of four. The first patch introduces the '-f,--format' option for ovs-appctl/ovs-dpctl and necessary changes to the JSON-RPC API. It does not yet pass the output format to individual commands because that requires a lot of changes. Those changes have been split out into the third patch to increase readability of the series. * The second patch introduces equivalent changes to the Python files. * The third patch moves all commands to the updated functions in lib/unixctl.*, in particular unixctl_command_register() and the unixctl_cb_func type, as well as their Python counterparts. The output is still text-only (no json) for all commands. * The forth patch shows how JSON output could be implemented using 'dpif/show' as an example. The following paragraphs are taken from the previous patch revision and have been updated to changes mentioned above. For monitoring systems such as Prometheus it would be beneficial if OVS and OVS-DPDK would expose statistics in a machine-readable format. Several approaches like UNIX socket, OVSDB queries and JSON output from ovs-xxx tools have been proposed [2],[3]. This proof of concept describes one way how ovs-xxx tools could output JSON in addition to plain-text for humans. This patch follows an alternative approach to RFC [1] which implemented JSON output as a separate option for each command like 'dpif/show'. The option was called '-o|--output' in the latter. It has been renamed to '-f,--format' because ovs-appctl already has a short option '-o' which prints the available ovs-appctl options ('--option'). The new option name '-f,--format' is in line with ovsdb-client where it controls output formatting, too. An example call would be 'ovs-appctl --format json dpif/show' as shown in tests/pmd.at of the forth patch. By default, the output format is plain-text as before. With this patch, all commands announce their support for output formats when being registered with unixctl_command_register() from lib/unixctl.*, e.g. OVS_OUTPUT_FMT_TEXT and/or OVS_OUTPUT_FMT_JSON. When a requested output format is not supported by a command, then process_command() in lib/unixctl.c will return an error. This is an advantage over the previous approach [1] where each command would have to parse the output format option and handle requests for unsupported output formats on its own. The question whether JSON output should be pretty printed and sorted remains. In most cases it would be unnecessary because machines consume the output or humans could use jq for pretty printing. However, it would make tests more readable (for humans) without having to use jq (which would require us to introduce a dependency on jq). Wdyt? [0] https://patchwork.ozlabs.org/project/openvswitch/patch/20231020104320.1417664-2-jm...@redhat.com/ [1] https://patchwork.ozlabs.org/project/openvswitch/patch/20231020092205.710399-2-jm...@redhat.com/ [2] https://bugzilla.redhat.com/show_bug.cgi?id=1824861#c7 [3] https://patchwork.ozlabs.org/project/openvswitch/patch/20230831131122.284913-1-rja...@redhat.com/ Reported-at: https://bugzilla.redhat.com/1824861 Signed-off-by: Jakob Meng <c...@jakobmeng.de> Jakob Meng (4): Add global option for JSON output to ovs-appctl/dpctl. python: Add global option for JSON output to Python tools. Migrate commands to extended unixctl API. ofproto: Add JSON output for 'dpif/show' command. lib/bfd.c | 16 ++- lib/cfm.c | 13 +- lib/command-line.c | 36 +++++ lib/command-line.h | 10 ++ lib/coverage.c | 11 +- lib/dpctl.c | 129 ++++++++++------- lib/dpctl.h | 4 + lib/dpdk.c | 15 +- lib/dpif-netdev-perf.c | 1 + lib/dpif-netdev-perf.h | 1 + lib/dpif-netdev.c | 84 ++++++----- lib/dpif-netlink.c | 6 +- lib/lacp.c | 7 +- lib/memory.c | 5 +- lib/netdev-dpdk.c | 16 ++- lib/netdev-dummy.c | 30 ++-- lib/netdev-native-tnl.c | 4 +- lib/netdev-native-tnl.h | 4 +- lib/netdev-vport.c | 1 + lib/odp-execute.c | 10 +- lib/ovs-lldp.c | 16 ++- lib/ovs-router.c | 26 ++-- lib/rstp.c | 22 +-- lib/stopwatch.c | 10 +- lib/stp.c | 20 +-- lib/timeval.c | 13 +- lib/tnl-neigh-cache.c | 35 +++-- lib/tnl-ports.c | 6 +- lib/unixctl.c | 246 ++++++++++++++++++++++++--------- lib/unixctl.h | 11 +- lib/vlog.c | 46 ++++-- ofproto/bond.c | 32 +++-- ofproto/ofproto-dpif-trace.c | 10 +- ofproto/ofproto-dpif-upcall.c | 81 ++++++++--- ofproto/ofproto-dpif.c | 187 +++++++++++++++++++++---- ofproto/ofproto.c | 10 +- ofproto/tunnel.c | 4 +- ovsdb/file.c | 4 +- ovsdb/ovsdb-client.c | 40 ++++-- ovsdb/ovsdb-server.c | 122 +++++++++++----- ovsdb/ovsdb.c | 4 +- ovsdb/raft.c | 28 ++-- python/ovs/unixctl/__init__.py | 19 ++- python/ovs/unixctl/client.py | 20 ++- python/ovs/unixctl/server.py | 64 +++++---- python/ovs/util.py | 9 ++ python/ovs/vlog.py | 12 +- tests/appctl.py | 7 +- tests/pmd.at | 34 +++++ tests/test-netflow.c | 4 +- tests/test-sflow.c | 4 +- tests/test-unixctl.c | 33 +++-- tests/test-unixctl.py | 25 ++-- utilities/ovs-appctl.c | 65 +++++++-- utilities/ovs-dpctl.c | 12 ++ utilities/ovs-ofctl.c | 43 +++--- vswitchd/bridge.c | 25 ++-- vswitchd/ovs-vswitchd.c | 5 +- 58 files changed, 1266 insertions(+), 491 deletions(-) -- 2.39.2 _______________________________________________ dev mailing list d...@openvswitch.org https://mail.openvswitch.org/mailman/listinfo/ovs-dev