From patchwork Thu Jan 18 09:57:37 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jakob Meng X-Patchwork-Id: 1887843 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256 header.s=mimecast20190719 header.b=Go39YP3J; dkim-atps=neutral Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=openvswitch.org (client-ip=2605:bc80:3010::138; helo=smtp1.osuosl.org; envelope-from=ovs-dev-bounces@openvswitch.org; receiver=patchwork.ozlabs.org) Received: from smtp1.osuosl.org (smtp1.osuosl.org [IPv6:2605:bc80:3010::138]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (secp384r1) server-digest SHA384) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4TFyqw3zMfz1yPv for ; Thu, 18 Jan 2024 20:58:36 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by smtp1.osuosl.org (Postfix) with ESMTP id 36BDC80D41; Thu, 18 Jan 2024 09:58:33 +0000 (UTC) DKIM-Filter: OpenDKIM Filter v2.11.0 smtp1.osuosl.org 36BDC80D41 Authentication-Results: smtp1.osuosl.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256 header.s=mimecast20190719 header.b=Go39YP3J X-Virus-Scanned: amavisd-new at osuosl.org Received: from smtp1.osuosl.org ([127.0.0.1]) by localhost (smtp1.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id UIE2oM7dUsPo; Thu, 18 Jan 2024 09:58:30 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [IPv6:2605:bc80:3010:104::8cd3:938]) by smtp1.osuosl.org (Postfix) with ESMTPS id 34A7680C83; Thu, 18 Jan 2024 09:58:29 +0000 (UTC) DKIM-Filter: OpenDKIM Filter v2.11.0 smtp1.osuosl.org 34A7680C83 Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id 0D5A0C0DD5; Thu, 18 Jan 2024 09:58:27 +0000 (UTC) X-Original-To: dev@openvswitch.org Delivered-To: ovs-dev@lists.linuxfoundation.org Received: from smtp4.osuosl.org (smtp4.osuosl.org [IPv6:2605:bc80:3010::137]) by lists.linuxfoundation.org (Postfix) with ESMTP id A88C1C0037 for ; Thu, 18 Jan 2024 09:58:25 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by smtp4.osuosl.org (Postfix) with ESMTP id 8381941610 for ; Thu, 18 Jan 2024 09:58:25 +0000 (UTC) DKIM-Filter: OpenDKIM Filter v2.11.0 smtp4.osuosl.org 8381941610 Authentication-Results: smtp4.osuosl.org; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256 header.s=mimecast20190719 header.b=Go39YP3J X-Virus-Scanned: amavisd-new at osuosl.org Received: from smtp4.osuosl.org ([127.0.0.1]) by localhost (smtp4.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id qiALN5Dr2nDk for ; Thu, 18 Jan 2024 09:58:23 +0000 (UTC) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by smtp4.osuosl.org (Postfix) with ESMTPS id 8C7C84094B for ; Thu, 18 Jan 2024 09:58:23 +0000 (UTC) DKIM-Filter: OpenDKIM Filter v2.11.0 smtp4.osuosl.org 8C7C84094B DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1705571902; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=aSknX6Jjcl6sDkKTGji/zcLwrc7A7kfKuN4TwTydOoQ=; b=Go39YP3JwSTQcKMHcXhsWJMpPWq9y8CrKra45vCotFibP7jxODMsoDXEZ3fVNxdpQ6FLXP VbCUB12KMErCnKX7AIXwKgld9y9VyEehpRm3witK6fxPHh42Ou0BjeLmsx7FlqEwqFj1Ci wwzji7ZROxAV3fGqnE1nrLcrpPXFTrk= Received: from mail-wr1-f71.google.com (mail-wr1-f71.google.com [209.85.221.71]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-176-BFEXqUlpO52p6xq7xOCXxA-1; Thu, 18 Jan 2024 04:58:21 -0500 X-MC-Unique: BFEXqUlpO52p6xq7xOCXxA-1 Received: by mail-wr1-f71.google.com with SMTP id ffacd0b85a97d-337d05db5bbso193315f8f.3 for ; Thu, 18 Jan 2024 01:58:20 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1705571900; x=1706176700; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=aSknX6Jjcl6sDkKTGji/zcLwrc7A7kfKuN4TwTydOoQ=; b=hVW1jzZEWE7es85ZL/5MnNcE21L0Sx+QxWvuU9pN+AuIa23RVNo/vKWQKZ3x0iwjQj glsw03Flao2BQcFdeVZgNlrn/jWd1qwvdOour+R+OjE++qZcbX7bXqV0Q+6WW/JmYVQx XNQGvrYirSm4RKtcdEw4T23CCkhDoMHtgpcSvqW6zw85bjOACULbPprfIX//rtFT1tu6 XQnYMTc2EzC6tuXlc0F4GYEE2Nt7lf9DOTMx+6hRjUNQAwxHt541zWdBTFLN3wXqJpO5 lgbU2iMusvTCSOgQoyN6PdyCu2hvchPI/VGoLEHR50hCmq/EnUahFLBRybNRtRSi5Jis lzYg== X-Gm-Message-State: AOJu0Yx08dvLPSZ8XAiqCLKCrYuQ6H86b8abhbPs4/lNLWliEpvvjROo 9AlknLfZ2tREqJXXvbep4SHAhDB+O2O6+SDgD6z4Ab4YEFzsxXLESLv4Dwk2hfCZm1dCkxy9W9H lDPsxuGMFqFBBLkAp7IJpLkn9zog1nDKjFuPCO5N84Sp+yRpNvO7QgpjHvcwU3eFOg2/EvrbrrT JnNsoQhEtc5IcP8Tj8PSC2brwTWsgL X-Received: by 2002:a05:600c:4fd1:b0:40e:5320:16ae with SMTP id o17-20020a05600c4fd100b0040e532016aemr186625wmq.149.1705571899813; Thu, 18 Jan 2024 01:58:19 -0800 (PST) X-Google-Smtp-Source: AGHT+IEliDq0kNphUGkE59LOuFCx4IAYswdKNVg/fDfCfzz24Qsp2Il8zSPyt8rBXR8vUv4QJbSOtA== X-Received: by 2002:a05:600c:4fd1:b0:40e:5320:16ae with SMTP id o17-20020a05600c4fd100b0040e532016aemr186612wmq.149.1705571899251; Thu, 18 Jan 2024 01:58:19 -0800 (PST) Received: from positronik4lide.redhat.com ([87.122.58.78]) by smtp.gmail.com with ESMTPSA id iv11-20020a05600c548b00b0040d8ff79fd8sm25226688wmb.7.2024.01.18.01.58.18 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 18 Jan 2024 01:58:18 -0800 (PST) From: jmeng@redhat.com To: dev@openvswitch.org, i.maximets@ovn.org, echaudro@redhat.com, ktraynor@redhat.com, aconole@redhat.com, rjarry@redhat.com Date: Thu, 18 Jan 2024 10:57:37 +0100 Message-Id: <20240118095742.731853-2-jmeng@redhat.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20240118095742.731853-1-jmeng@redhat.com> References: <20240118095742.731853-1-jmeng@redhat.com> MIME-Version: 1.0 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Subject: [ovs-dev] [PATCH v6 1/6] Add global option for JSON output to ovs-appctl. X-BeenThere: ovs-dev@openvswitch.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: ovs-dev-bounces@openvswitch.org Sender: "dev" From: Jakob Meng 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-xxx tools. They gain a global option '-f,--format' which allows users to request JSON instead of plain-text for humans. An example call implemented in a later patch is 'ovs-appctl --format json dpif/show'. For that a new 'set-options' command has been added to lib/unixctl.c which allows to change the output format of the following commands. It is supposed to be run by ovs-xxx tools 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 then 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. To demonstrate the necessary API changes for supporting output formats, unixctl_command_register() in lib/unixctl.* has been cloned to unixctl_command_register_fmt(). The latter will be replaced with the former in a later patch. The new function gained an int argument called 'output_fmts' with which commands have to announce their support for output formats. Function type unixctl_cb_func in lib/unixctl.h has gained a new arg 'enum ovs_output_fmt fmt'. For now, it has been added as a comment only for the huge changes reason mentioned earlier. The output format which has been passed via 'set-options' to ovs-vswitchd will be converted into a value of type 'enum ovs_output_fmt' in lib/unixctl.c and then passed to said 'fmt' arg of the choosen command handler (in a future patch). When a requested output format is not supported by a command, then process_command() in lib/unixctl.c will return an error. This patch does not yet pass the choosen output format to commands. Doing so requires changes to all unixctl_command_register() calls and all command callbacks. To improve readibility those changes have been split out into a follow up patch. Respectively, whenever an output format other than 'text' is choosen for ovs-xxx tools, they will fail. By default, the output format is plain-text as before. 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 choosen name also better alines with ovsdb-client where '-f,--format' controls output formatting. Reported-at: https://bugzilla.redhat.com/1824861 Signed-off-by: Jakob Meng --- NEWS | 2 + lib/command-line.c | 36 +++++++++++ lib/command-line.h | 10 +++ lib/dpctl.h | 4 ++ lib/unixctl.c | 142 ++++++++++++++++++++++++++++++++++------- lib/unixctl.h | 16 ++++- utilities/ovs-appctl.c | 97 ++++++++++++++++++++++++---- utilities/ovs-dpctl.c | 1 + 8 files changed, 271 insertions(+), 37 deletions(-) diff --git a/NEWS b/NEWS index 410dd68e5..94dabeb5b 100644 --- a/NEWS +++ b/NEWS @@ -27,6 +27,8 @@ Post-v3.2.0 "ovs-appctl dpctl/ct-del-limits default". * 'dpctl/flush-conntrack' is now capable of flushing connections based on mark and labels. + * Added new option [-f|--format] to choose the output format, e.g. 'json' + or 'text' (by default). - ovs-vsctl: * New commands 'set-zone-limit', 'del-zone-limit' and 'list-zone-limits' to manage the maximum number of connections in conntrack zones via diff --git a/lib/command-line.c b/lib/command-line.c index 967f4f5d5..775e0430a 100644 --- a/lib/command-line.c +++ b/lib/command-line.c @@ -24,6 +24,7 @@ #include "ovs-thread.h" #include "util.h" #include "openvswitch/vlog.h" +#include "openvswitch/json.h" VLOG_DEFINE_THIS_MODULE(command_line); @@ -53,6 +54,41 @@ ovs_cmdl_long_options_to_short_options(const struct option options[]) return xstrdup(short_options); } +const char * +ovs_output_fmt_to_string(enum ovs_output_fmt fmt) +{ + switch (fmt) { + case OVS_OUTPUT_FMT_TEXT: + return "text"; + + case OVS_OUTPUT_FMT_JSON: + return "json"; + + default: + return NULL; + } +} + +struct json * +ovs_output_fmt_to_json(enum ovs_output_fmt fmt) +{ + const char *string = ovs_output_fmt_to_string(fmt); + return string ? json_string_create(string) : NULL; +} + +bool +ovs_output_fmt_from_string(const char *string, enum ovs_output_fmt *fmt) +{ + if (!strcmp(string, "text")) { + *fmt = OVS_OUTPUT_FMT_TEXT; + } else if (!strcmp(string, "json")) { + *fmt = OVS_OUTPUT_FMT_JSON; + } else { + return false; + } + return true; +} + static char * OVS_WARN_UNUSED_RESULT build_short_options(const struct option *long_options) { diff --git a/lib/command-line.h b/lib/command-line.h index fc2a2690f..494274cec 100644 --- a/lib/command-line.h +++ b/lib/command-line.h @@ -20,6 +20,7 @@ /* Utilities for command-line parsing. */ #include "compiler.h" +#include struct option; @@ -46,6 +47,15 @@ struct ovs_cmdl_command { char *ovs_cmdl_long_options_to_short_options(const struct option *options); +enum ovs_output_fmt { + OVS_OUTPUT_FMT_TEXT = 1 << 0, + OVS_OUTPUT_FMT_JSON = 1 << 1 +}; + +const char *ovs_output_fmt_to_string(enum ovs_output_fmt); +struct json *ovs_output_fmt_to_json(enum ovs_output_fmt); +bool ovs_output_fmt_from_string(const char *, enum ovs_output_fmt *); + struct ovs_cmdl_parsed_option { const struct option *o; char *arg; diff --git a/lib/dpctl.h b/lib/dpctl.h index 9d0052152..1c9b2409f 100644 --- a/lib/dpctl.h +++ b/lib/dpctl.h @@ -19,6 +19,7 @@ #include #include "compiler.h" +#include "command-line.h" struct dpctl_params { /* True if it is called by ovs-appctl command. */ @@ -42,6 +43,9 @@ struct dpctl_params { /* --names: Use port names in output? */ bool names; + /* Output format. */ + enum ovs_output_fmt format; + /* Callback for printing. This function is called from dpctl_run_command() * to output data. The 'aux' parameter is set to the 'aux' * member. The 'error' parameter is true if 'string' is an error diff --git a/lib/unixctl.c b/lib/unixctl.c index 103357ee9..dd1450f22 100644 --- a/lib/unixctl.c +++ b/lib/unixctl.c @@ -21,7 +21,6 @@ #include "coverage.h" #include "dirs.h" #include "openvswitch/dynamic-string.h" -#include "openvswitch/json.h" #include "jsonrpc.h" #include "openvswitch/list.h" #include "openvswitch/poll-loop.h" @@ -39,6 +38,7 @@ COVERAGE_DEFINE(unixctl_replied); struct unixctl_command { const char *usage; int min_args, max_args; + int output_fmts; unixctl_cb_func *cb; void *aux; }; @@ -50,6 +50,8 @@ struct unixctl_conn { /* Only one request can be in progress at a time. While the request is * being processed, 'request_id' is populated, otherwise it is null. */ struct json *request_id; /* ID of the currently active request. */ + + enum ovs_output_fmt fmt; }; /* Server for control connection. */ @@ -94,6 +96,39 @@ unixctl_version(struct unixctl_conn *conn, int argc OVS_UNUSED, unixctl_command_reply(conn, ovs_get_program_version()); } +static void +unixctl_set_options(struct unixctl_conn *conn, int argc, const char *argv[], + void *aux OVS_UNUSED) +{ + char * error = NULL; + + for (size_t i = 1; i < argc; i++) { + if ((i + 1) == argc) { + error = xasprintf("option requires an argument -- %s", argv[i]); + goto error; + } else if (!strcmp(argv[i], "--format")) { + /* Move index to option argument. */ + i++; + + /* Parse output format argument. */ + if (!ovs_output_fmt_from_string(argv[i], &conn->fmt)) { + error = xasprintf("option %s has invalid value %s", + argv[i - 1], argv[i]); + goto error; + } + } else { + error = xasprintf("invalid option -- %s", argv[i]); + goto error; + + } + } + unixctl_command_reply(conn, NULL); + return; +error: + unixctl_command_reply_error(conn, error); + free(error); +} + /* Registers a unixctl command with the given 'name'. 'usage' describes the * arguments to the command; it is used only for presentation to the user in * "list-commands" output. (If 'usage' is NULL, then the command is hidden.) @@ -109,6 +144,28 @@ void unixctl_command_register(const char *name, const char *usage, int min_args, int max_args, unixctl_cb_func *cb, void *aux) +{ + unixctl_command_register_fmt(name, usage, min_args, max_args, + OVS_OUTPUT_FMT_TEXT, cb, aux); +} + +/* Registers a unixctl command with the given 'name'. 'usage' describes the + * arguments to the command; it is used only for presentation to the user in + * "list-commands" output. (If 'usage' is NULL, then the command is hidden.) + * 'output_fmts' is a bitmap that defines what output formats a command + * supports, e.g. OVS_OUTPUT_FMT_TEXT | OVS_OUTPUT_FMT_JSON. + * + * 'cb' is called when the command is received. It is passed an array + * containing the command name and arguments, plus a copy of 'aux'. Normally + * 'cb' should reply by calling unixctl_command_reply() or + * unixctl_command_reply_error() before it returns, but if the command cannot + * be handled immediately then it can defer the reply until later. A given + * connection can only process a single request at a time, so a reply must be + * made eventually to avoid blocking that connection. */ +void +unixctl_command_register_fmt(const char *name, const char *usage, + int min_args, int max_args, int output_fmts, + unixctl_cb_func *cb, void *aux) { struct unixctl_command *command; struct unixctl_command *lookup = shash_find_data(&commands, name); @@ -123,41 +180,48 @@ unixctl_command_register(const char *name, const char *usage, command->usage = usage; command->min_args = min_args; command->max_args = max_args; + command->output_fmts = output_fmts; command->cb = cb; command->aux = aux; shash_add(&commands, name, command); } -static void -unixctl_command_reply__(struct unixctl_conn *conn, - bool success, const char *body) +static struct json * +json_string_create__(const char *body) { - struct json *body_json; - struct jsonrpc_msg *reply; - - COVERAGE_INC(unixctl_replied); - ovs_assert(conn->request_id); - if (!body) { body = ""; } if (body[0] && body[strlen(body) - 1] != '\n') { - body_json = json_string_create_nocopy(xasprintf("%s\n", body)); + return json_string_create_nocopy(xasprintf("%s\n", body)); } else { - body_json = json_string_create(body); + return json_string_create(body); } +} + +/* Takes ownership of 'body'. */ +static void +unixctl_command_reply__(struct unixctl_conn *conn, + bool success, struct json *body) +{ + struct jsonrpc_msg *reply; + + COVERAGE_INC(unixctl_replied); + ovs_assert(conn->request_id); if (success) { - reply = jsonrpc_create_reply(body_json, conn->request_id); + reply = jsonrpc_create_reply(body, conn->request_id); } else { - reply = jsonrpc_create_error(body_json, conn->request_id); + reply = jsonrpc_create_error(body, conn->request_id); } if (VLOG_IS_DBG_ENABLED()) { char *id = json_to_string(conn->request_id, 0); + char *msg = json_to_string(body, 0); VLOG_DBG("replying with %s, id=%s: \"%s\"", - success ? "success" : "error", id, body); + success ? "success" : "error", id, msg); + free(msg); free(id); } @@ -170,22 +234,34 @@ unixctl_command_reply__(struct unixctl_conn *conn, /* Replies to the active unixctl connection 'conn'. 'result' is sent to the * client indicating the command was processed successfully. Only one call to - * unixctl_command_reply() or unixctl_command_reply_error() may be made per - * request. */ + * unixctl_command_reply(), unixctl_command_reply_error() or + * unixctl_command_reply_json() may be made per request. */ void unixctl_command_reply(struct unixctl_conn *conn, const char *result) { - unixctl_command_reply__(conn, true, result); + unixctl_command_reply__(conn, true, json_string_create__(result)); } /* Replies to the active unixctl connection 'conn'. 'error' is sent to the - * client indicating an error occurred processing the command. Only one call to - * unixctl_command_reply() or unixctl_command_reply_error() may be made per - * request. */ + * client indicating an error occurred processing the command. Only one call + * to unixctl_command_reply(), unixctl_command_reply_error() or + * unixctl_command_reply_json() may be made per request. */ void unixctl_command_reply_error(struct unixctl_conn *conn, const char *error) { - unixctl_command_reply__(conn, false, error); + unixctl_command_reply__(conn, false, json_string_create__(error)); +} + +/* Replies to the active unixctl connection 'conn'. 'result' is sent to the + * client indicating the command was processed successfully. Only one call to + * unixctl_command_reply(), unixctl_command_reply_error() or + * unixctl_command_reply_json() may be made per request. + * + * Takes ownership of 'body'. */ +void +unixctl_command_reply_json(struct unixctl_conn *conn, struct json *body) +{ + unixctl_command_reply__(conn, true, body); } /* Creates a unixctl server listening on 'path', which for POSIX may be: @@ -250,6 +326,8 @@ unixctl_server_create(const char *path, struct unixctl_server **serverp) unixctl_command_register("list-commands", "", 0, 0, unixctl_list_commands, NULL); unixctl_command_register("version", "", 0, 0, unixctl_version, NULL); + unixctl_command_register("set-options", "[--format text|json]", 2, 2, + unixctl_set_options, NULL); struct unixctl_server *server = xmalloc(sizeof *server); server->listener = listener; @@ -291,6 +369,18 @@ process_command(struct unixctl_conn *conn, struct jsonrpc_msg *request) } else if (params->n > command->max_args) { error = xasprintf("\"%s\" command takes at most %d arguments", request->method, command->max_args); + } else if ((!command->output_fmts && conn->fmt != OVS_OUTPUT_FMT_TEXT) || + (command->output_fmts && !(conn->fmt & command->output_fmts))) + { + error = xasprintf("\"%s\" command does not support output format"\ + " \"%s\" (supported: %d, requested: %d)", + request->method, ovs_output_fmt_to_string(conn->fmt), + command->output_fmts, conn->fmt); + } else if (conn->fmt != OVS_OUTPUT_FMT_TEXT) { + /* FIXME: Remove this check once output format will be passed to the + * command handler below. */ + error = xasprintf("output format \"%s\" has not been implemented yet", + ovs_output_fmt_to_string(conn->fmt)); } else { struct svec argv = SVEC_EMPTY_INITIALIZER; int i; @@ -307,8 +397,10 @@ process_command(struct unixctl_conn *conn, struct jsonrpc_msg *request) svec_terminate(&argv); if (!error) { + /* FIXME: Output format will be passed as 'fmt' to the command in + * later patch. */ command->cb(conn, argv.n, (const char **) argv.names, - command->aux); + /* conn->fmt, */ command->aux); } svec_destroy(&argv); @@ -381,6 +473,7 @@ unixctl_server_run(struct unixctl_server *server) struct unixctl_conn *conn = xzalloc(sizeof *conn); ovs_list_push_back(&server->conns, &conn->node); conn->rpc = jsonrpc_open(stream); + conn->fmt = OVS_OUTPUT_FMT_TEXT; } else if (error == EAGAIN) { break; } else { @@ -518,6 +611,9 @@ unixctl_client_transact(struct jsonrpc *client, const char *command, int argc, } else if (reply->result) { if (reply->result->type == JSON_STRING) { *result = xstrdup(json_string(reply->result)); + } else if (reply->result->type == JSON_OBJECT || + reply->result->type == JSON_ARRAY) { + *result = json_to_string(reply->result, 0); } else { VLOG_WARN("%s: unexpected result type in JSON rpc reply: %s", jsonrpc_get_name(client), diff --git a/lib/unixctl.h b/lib/unixctl.h index 4562dbc49..8200b9e11 100644 --- a/lib/unixctl.h +++ b/lib/unixctl.h @@ -17,6 +17,9 @@ #ifndef UNIXCTL_H #define UNIXCTL_H 1 +#include "openvswitch/json.h" +#include "command-line.h" + #ifdef __cplusplus extern "C" { #endif @@ -40,13 +43,24 @@ int unixctl_client_transact(struct jsonrpc *client, /* Command registration. */ struct unixctl_conn; +/* FIXME: Output format will be passed as 'fmt' to the command in later patch. + */ typedef void unixctl_cb_func(struct unixctl_conn *, - int argc, const char *argv[], void *aux); + int argc, const char *argv[], + /* enum ovs_output_fmt fmt, */ void *aux); +/* FIXME: unixctl_command_register() will be replaced with + * unixctl_command_register_fmt() in a later patch of this series. It + * is kept temporarily to reduce the amount of changes in this patch. */ void unixctl_command_register(const char *name, const char *usage, int min_args, int max_args, unixctl_cb_func *cb, void *aux); +void unixctl_command_register_fmt(const char *name, const char *usage, + int min_args, int max_args, int output_fmts, + unixctl_cb_func *cb, void *aux); void unixctl_command_reply_error(struct unixctl_conn *, const char *error); void unixctl_command_reply(struct unixctl_conn *, const char *body); +void unixctl_command_reply_json(struct unixctl_conn *, + struct json *body); #ifdef __cplusplus } diff --git a/utilities/ovs-appctl.c b/utilities/ovs-appctl.c index ba0c172e6..02df8ba97 100644 --- a/utilities/ovs-appctl.c +++ b/utilities/ovs-appctl.c @@ -29,12 +29,22 @@ #include "jsonrpc.h" #include "process.h" #include "timeval.h" +#include "svec.h" #include "unixctl.h" #include "util.h" #include "openvswitch/vlog.h" static void usage(void); -static const char *parse_command_line(int argc, char *argv[]); + +/* Parsed command line args. */ +struct cmdl_args { + enum ovs_output_fmt format; + char *target; +}; + +static struct cmdl_args *cmdl_args_create(void); +static void cmdl_args_destroy(struct cmdl_args *); +static struct cmdl_args *parse_command_line(int argc, char *argv[]); static struct jsonrpc *connect_to_target(const char *target); int @@ -43,30 +53,59 @@ main(int argc, char *argv[]) char *cmd_result, *cmd_error; struct jsonrpc *client; char *cmd, **cmd_argv; - const char *target; + struct cmdl_args *args; int cmd_argc; int error; + struct svec opt_argv = SVEC_EMPTY_INITIALIZER; set_program_name(argv[0]); /* Parse command line and connect to target. */ - target = parse_command_line(argc, argv); - client = connect_to_target(target); + args = parse_command_line(argc, argv); + client = connect_to_target(args->target); + + /* Transact options request (if required) and process reply */ + if (args->format != OVS_OUTPUT_FMT_TEXT) { + svec_add(&opt_argv, "--format"); + svec_add(&opt_argv, ovs_output_fmt_to_string(args->format)); + } + svec_terminate(&opt_argv); + + if (opt_argv.n > 0) { + error = unixctl_client_transact(client, "set-options", + opt_argv.n, opt_argv.names, + &cmd_result, &cmd_error); + + if (error) { + ovs_fatal(error, "%s: transaction error", args->target); + } - /* Transact request and process reply. */ + if (cmd_error) { + jsonrpc_close(client); + fputs(cmd_error, stderr); + ovs_error(0, "%s: server returned an error", args->target); + exit(2); + } + + free(cmd_result); + free(cmd_error); + } + svec_destroy(&opt_argv); + + /* Transact command request and process reply. */ cmd = argv[optind++]; cmd_argc = argc - optind; cmd_argv = cmd_argc ? argv + optind : NULL; error = unixctl_client_transact(client, cmd, cmd_argc, cmd_argv, &cmd_result, &cmd_error); if (error) { - ovs_fatal(error, "%s: transaction error", target); + ovs_fatal(error, "%s: transaction error", args->target); } if (cmd_error) { jsonrpc_close(client); fputs(cmd_error, stderr); - ovs_error(0, "%s: server returned an error", target); + ovs_error(0, "%s: server returned an error", args->target); exit(2); } else if (cmd_result) { fputs(cmd_result, stdout); @@ -74,6 +113,7 @@ main(int argc, char *argv[]) OVS_NOT_REACHED(); } + cmdl_args_destroy(args); jsonrpc_close(client); free(cmd_result); free(cmd_error); @@ -101,13 +141,34 @@ Common commands:\n\ vlog/reopen Make the program reopen its log file\n\ Other options:\n\ --timeout=SECS wait at most SECS seconds for a response\n\ + -f, --format=FMT Output format. One of: 'json', or 'text'\n\ + ('text', by default)\n\ -h, --help Print this helpful information\n\ -V, --version Display ovs-appctl version information\n", program_name, program_name); exit(EXIT_SUCCESS); } -static const char * +static struct cmdl_args * +cmdl_args_create(void) { + struct cmdl_args *args = xmalloc(sizeof *args); + + args->format = OVS_OUTPUT_FMT_TEXT; + args->target = NULL; + + return args; +} + +static void +cmdl_args_destroy(struct cmdl_args *args) { + if (args->target) { + free(args->target); + } + + free(args); +} + +static struct cmdl_args * parse_command_line(int argc, char *argv[]) { enum { @@ -117,6 +178,7 @@ parse_command_line(int argc, char *argv[]) static const struct option long_options[] = { {"target", required_argument, NULL, 't'}, {"execute", no_argument, NULL, 'e'}, + {"format", required_argument, NULL, 'f'}, {"help", no_argument, NULL, 'h'}, {"option", no_argument, NULL, 'o'}, {"version", no_argument, NULL, 'V'}, @@ -126,11 +188,11 @@ parse_command_line(int argc, char *argv[]) }; char *short_options_ = ovs_cmdl_long_options_to_short_options(long_options); char *short_options = xasprintf("+%s", short_options_); - const char *target; + + struct cmdl_args *args = cmdl_args_create(); int e_options; unsigned int timeout = 0; - target = NULL; e_options = 0; for (;;) { int option; @@ -141,10 +203,10 @@ parse_command_line(int argc, char *argv[]) } switch (option) { case 't': - if (target) { + if (args->target) { ovs_fatal(0, "-t or --target may be specified only once"); } - target = optarg; + args->target = xstrdup(optarg); break; case 'e': @@ -157,6 +219,12 @@ parse_command_line(int argc, char *argv[]) } break; + case 'f': + if (!ovs_output_fmt_from_string(optarg, &args->format)) { + ovs_fatal(0, "value %s on -f or --format is invalid", optarg); + } + break; + case 'h': usage(); break; @@ -194,7 +262,10 @@ parse_command_line(int argc, char *argv[]) "(use --help for help)"); } - return target ? target : "ovs-vswitchd"; + if (!args->target) { + args->target = xstrdup("ovs-vswitchd"); + } + return args; } static struct jsonrpc * diff --git a/utilities/ovs-dpctl.c b/utilities/ovs-dpctl.c index 56d7a942b..30104ddb2 100644 --- a/utilities/ovs-dpctl.c +++ b/utilities/ovs-dpctl.c @@ -63,6 +63,7 @@ main(int argc, char *argv[]) fatal_ignore_sigpipe(); dpctl_p.is_appctl = false; + dpctl_p.format = OVS_OUTPUT_FMT_TEXT; dpctl_p.output = dpctl_print; dpctl_p.usage = usage; From patchwork Thu Jan 18 09:57:38 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jakob Meng X-Patchwork-Id: 1887848 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256 header.s=mimecast20190719 header.b=Ly+ukA9m; dkim-atps=neutral Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=openvswitch.org (client-ip=2605:bc80:3010::137; helo=smtp4.osuosl.org; envelope-from=ovs-dev-bounces@openvswitch.org; receiver=patchwork.ozlabs.org) Received: from smtp4.osuosl.org (smtp4.osuosl.org [IPv6:2605:bc80:3010::137]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (secp384r1) server-digest SHA384) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4TFyr636T2z1yPv for ; Thu, 18 Jan 2024 20:58:46 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by smtp4.osuosl.org (Postfix) with ESMTP id 5B17E42241; Thu, 18 Jan 2024 09:58:39 +0000 (UTC) DKIM-Filter: OpenDKIM Filter v2.11.0 smtp4.osuosl.org 5B17E42241 Authentication-Results: smtp4.osuosl.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256 header.s=mimecast20190719 header.b=Ly+ukA9m X-Virus-Scanned: amavisd-new at osuosl.org Received: from smtp4.osuosl.org ([127.0.0.1]) by localhost (smtp4.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id mqhBnwz0bFNZ; Thu, 18 Jan 2024 09:58:36 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by smtp4.osuosl.org (Postfix) with ESMTPS id ECB0E4222B; Thu, 18 Jan 2024 09:58:33 +0000 (UTC) DKIM-Filter: OpenDKIM Filter v2.11.0 smtp4.osuosl.org ECB0E4222B Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id ACF60C008E; Thu, 18 Jan 2024 09:58:33 +0000 (UTC) X-Original-To: dev@openvswitch.org Delivered-To: ovs-dev@lists.linuxfoundation.org Received: from smtp2.osuosl.org (smtp2.osuosl.org [140.211.166.133]) by lists.linuxfoundation.org (Postfix) with ESMTP id 2C2D0C0072 for ; Thu, 18 Jan 2024 09:58:32 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by smtp2.osuosl.org (Postfix) with ESMTP id 99DF5437D4 for ; Thu, 18 Jan 2024 09:58:31 +0000 (UTC) DKIM-Filter: OpenDKIM Filter v2.11.0 smtp2.osuosl.org 99DF5437D4 Authentication-Results: smtp2.osuosl.org; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256 header.s=mimecast20190719 header.b=Ly+ukA9m X-Virus-Scanned: amavisd-new at osuosl.org Received: from smtp2.osuosl.org ([127.0.0.1]) by localhost (smtp2.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id WcBFyYofN3O8 for ; Thu, 18 Jan 2024 09:58:29 +0000 (UTC) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by smtp2.osuosl.org (Postfix) with ESMTPS id 4B834437C2 for ; Thu, 18 Jan 2024 09:58:29 +0000 (UTC) DKIM-Filter: OpenDKIM Filter v2.11.0 smtp2.osuosl.org 4B834437C2 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1705571908; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=wvFPGFyfFS0d4CGIFmDZZUOOXGoGZ+TChuWEI7m10fU=; b=Ly+ukA9m68j1jMnvhoIpFGnoSOUY5yI/AbUNnsYmvKJJJOq0BzeQwrP1UXiHXjPad9GlvR JsrcEdxuGqM59gvPmc6tMMG8REj7Ypfaev5/qa63qNJdPUKKMGZ8pQZthVw+IiuFU2TPMv VHgWGWeo7fxMbVL21Z27O5kMNugZwyI= Received: from mail-wm1-f70.google.com (mail-wm1-f70.google.com [209.85.128.70]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-496-_xmCyqYFPjqDrIPKuFZM0A-1; Thu, 18 Jan 2024 04:58:21 -0500 X-MC-Unique: _xmCyqYFPjqDrIPKuFZM0A-1 Received: by mail-wm1-f70.google.com with SMTP id 5b1f17b1804b1-40e74860cb0so31176565e9.3 for ; Thu, 18 Jan 2024 01:58:21 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1705571900; x=1706176700; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=wvFPGFyfFS0d4CGIFmDZZUOOXGoGZ+TChuWEI7m10fU=; b=WZ0wGzoYd1ZozVETBBsIXXZ2j53CAlmSp5PRK5L0t7adNvlP+zbS4Iz8WmrX4Gv7HA IQb/tAbItR7Tq8QOgIAAPsbU7dk2IV3Fh5KNUhbC/5/eBItTSgiFUxbkOlo/siQ7ElcJ q3c5t1Kc4bg4ygMX+dVn3Bk7t35a0QwD7RyKnwOTOpnEKplJdvpXkNQ2dOeHmAIr/1ey uhjV9+qyT3JOQi0AH4M5lI+ynr7/h96bAsoC3xaZdviomrs5dT4GKxpXFiVtEXA2Qty2 W+hL826HQkAMtEATYvP7vbEdCNhZAc6rIZYxAeiLZUKYDtLasaOB5SS8cho/z6nU56NQ D2tg== X-Gm-Message-State: AOJu0YxSZ0VSjoHXCzWxaCPISW5E1soPYN9LjiPCpXIrlqf+b4S4OVHV hA4uctr+pnzbmudCYIPSZ+t8zXYQusWXk8kCDm4Y/eV2byxbky5Ddmd8e9oJqsK2q6W9FheFAaJ HXRpKI2Nz/r1LSP7M5ZFv6KhvdLgqINjg/+LDBWsLhXWWj+Xn6+L32FGSRuSQ/tHdnLHNexpJ9h 3gzhuG/EgKzAZ6IJChzxjFLc+vl4y7 X-Received: by 2002:a05:600c:1715:b0:40e:5971:d258 with SMTP id c21-20020a05600c171500b0040e5971d258mr275864wmn.162.1705571900535; Thu, 18 Jan 2024 01:58:20 -0800 (PST) X-Google-Smtp-Source: AGHT+IF5P5fOn3UglgbA3nzSka2NASOAQrsWC5kAJrNYZtEiyVf98tfEJcxf6KPDmC0isbUxd94Hcw== X-Received: by 2002:a05:600c:1715:b0:40e:5971:d258 with SMTP id c21-20020a05600c171500b0040e5971d258mr275855wmn.162.1705571900147; Thu, 18 Jan 2024 01:58:20 -0800 (PST) Received: from positronik4lide.redhat.com ([87.122.58.78]) by smtp.gmail.com with ESMTPSA id iv11-20020a05600c548b00b0040d8ff79fd8sm25226688wmb.7.2024.01.18.01.58.19 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 18 Jan 2024 01:58:19 -0800 (PST) From: jmeng@redhat.com To: dev@openvswitch.org, i.maximets@ovn.org, echaudro@redhat.com, ktraynor@redhat.com, aconole@redhat.com, rjarry@redhat.com Date: Thu, 18 Jan 2024 10:57:38 +0100 Message-Id: <20240118095742.731853-3-jmeng@redhat.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20240118095742.731853-1-jmeng@redhat.com> References: <20240118095742.731853-1-jmeng@redhat.com> MIME-Version: 1.0 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Subject: [ovs-dev] [PATCH v6 2/6] python: Add global option for JSON output to Python tools. X-BeenThere: ovs-dev@openvswitch.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: ovs-dev-bounces@openvswitch.org Sender: "dev" From: Jakob Meng This patch introduces support for different output formats to the Python code, as did the previous commit for ovs-xxx tools like 'ovs-appctl --format json dpif/show'. In particular, tests/appctl.py gains a global option '-f,--format' which allows users to request JSON instead of plain-text for humans. This patch does not yet pass the choosen output format to commands. Doing so requires changes to all command_register() calls and all command callbacks. To improve readibility those changes have been split out into a follow up patch. Respectively, whenever an output format other than 'text' is choosen for tests/appctl.py, the script will fail. Reported-at: https://bugzilla.redhat.com/1824861 Signed-off-by: Jakob Meng --- NEWS | 2 ++ python/ovs/unixctl/__init__.py | 39 +++++++++++++++++++++++++++++----- python/ovs/unixctl/server.py | 37 +++++++++++++++++++++++++++++++- python/ovs/util.py | 8 +++++++ tests/appctl.py | 17 +++++++++++++++ tests/unixctl-py.at | 1 + 6 files changed, 98 insertions(+), 6 deletions(-) diff --git a/NEWS b/NEWS index 94dabeb5b..4df02e6b2 100644 --- a/NEWS +++ b/NEWS @@ -29,6 +29,8 @@ Post-v3.2.0 on mark and labels. * Added new option [-f|--format] to choose the output format, e.g. 'json' or 'text' (by default). + - Python: + * Added support for choosing the output format, e.g. 'json' or 'text'. - ovs-vsctl: * New commands 'set-zone-limit', 'del-zone-limit' and 'list-zone-limits' to manage the maximum number of connections in conntrack zones via diff --git a/python/ovs/unixctl/__init__.py b/python/ovs/unixctl/__init__.py index 8ee312943..6d9bd5715 100644 --- a/python/ovs/unixctl/__init__.py +++ b/python/ovs/unixctl/__init__.py @@ -20,10 +20,14 @@ commands = {} class _UnixctlCommand(object): - def __init__(self, usage, min_args, max_args, callback, aux): + # FIXME: Output format will be passed as 'output_fmts' to the command in + # later patch. + def __init__(self, usage, min_args, max_args, # FIXME: output_fmts, + callback, aux): self.usage = usage self.min_args = min_args self.max_args = max_args + # FIXME: self.output_fmts = output_fmts self.callback = callback self.aux = aux @@ -42,10 +46,13 @@ def _unixctl_help(conn, unused_argv, unused_aux): conn.reply(reply) -def command_register(name, usage, min_args, max_args, callback, aux): +def command_register_fmt(name, usage, min_args, max_args, output_fmts, + callback, aux): """ Registers a command with the given 'name' to be exposed by the UnixctlServer. 'usage' describes the arguments to the command; it is used - only for presentation to the user in "help" output. + only for presentation to the user in "help" output. 'output_fmts' is a + bitmap that defines what output formats a command supports, e.g. + OVS_OUTPUT_FMT_TEXT | OVS_OUTPUT_FMT_JSON. 'callback' is called when the command is received. It is passed a UnixctlConnection object, the list of arguments as unicode strings, and @@ -63,8 +70,30 @@ def command_register(name, usage, min_args, max_args, callback, aux): assert callable(callback) if name not in commands: - commands[name] = _UnixctlCommand(usage, min_args, max_args, callback, - aux) + commands[name] = _UnixctlCommand(usage, min_args, max_args, + # FIXME: output_fmts, + callback, aux) + + +# FIXME: command_register() will be replaced with command_register_fmt() in a +# later patch of this series. It is is kept temporarily to reduce the +# amount of changes in this patch. +def command_register(name, usage, min_args, max_args, callback, aux): + """ Registers a command with the given 'name' to be exposed by the + UnixctlServer. 'usage' describes the arguments to the command; it is used + only for presentation to the user in "help" output. + + 'callback' is called when the command is received. It is passed a + UnixctlConnection object, the list of arguments as unicode strings, and + 'aux'. Normally 'callback' should reply by calling + UnixctlConnection.reply() or UnixctlConnection.reply_error() before it + returns, but if the command cannot be handled immediately, then it can + defer the reply until later. A given connection can only process a single + request at a time, so a reply must be made eventually to avoid blocking + that connection.""" + + command_register_fmt(name, usage, min_args, max_args, + ovs.util.OutputFormat.TEXT, callback, aux) def socket_name_from_target(target): diff --git a/python/ovs/unixctl/server.py b/python/ovs/unixctl/server.py index b9cb52fad..1d7f3337d 100644 --- a/python/ovs/unixctl/server.py +++ b/python/ovs/unixctl/server.py @@ -12,6 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. +import argparse import copy import errno import os @@ -35,6 +36,7 @@ class UnixctlConnection(object): assert isinstance(rpc, ovs.jsonrpc.Connection) self._rpc = rpc self._request_id = None + self._fmt = ovs.util.OutputFormat.TEXT def run(self): self._rpc.run() @@ -116,6 +118,17 @@ class UnixctlConnection(object): elif len(params) > command.max_args: error = '"%s" command takes at most %d arguments' \ % (method, command.max_args) + # FIXME: Uncomment when command.output_fmts is available + # elif self._fmt not in command.output_fmts: + # error = '"%s" command does not support output format' \ + # ' "%s" (supported: %d, requested: %d)' \ + # % (method, self._fmt.name.lower(), command.output_fmts, + # self._fmt) + # FIXME: Remove this check once output format will be passed to the + # command handler below. + elif self._fmt != ovs.util.OutputFormat.TEXT: + error = 'output format "%s" has not been implemented yet' \ + % self._fmt.name.lower() else: for param in params: if not isinstance(param, str): @@ -124,7 +137,8 @@ class UnixctlConnection(object): if error is None: unicode_params = [str(p) for p in params] - command.callback(self, unicode_params, command.aux) + command.callback(self, unicode_params, # FIXME: self._fmt, + command.aux) if error: self.reply_error(error) @@ -136,6 +150,24 @@ def _unixctl_version(conn, unused_argv, version): conn.reply(version) +def _unixctl_set_options(conn, argv, unused_aux): + assert isinstance(conn, UnixctlConnection) + + parser = argparse.ArgumentParser() + parser.add_argument("--format", default="text", + choices=[fmt.name.lower() + for fmt in ovs.util.OutputFormat]) + + try: + args = parser.parse_args(args=argv) + except argparse.ArgumentError as e: + conn.reply_error(str(e)) + return + + conn._fmt = ovs.util.OutputFormat[args.format.upper()] + conn.reply(None) + + class UnixctlServer(object): def __init__(self, listener): assert isinstance(listener, ovs.stream.PassiveStream) @@ -210,4 +242,7 @@ class UnixctlServer(object): ovs.unixctl.command_register("version", "", 0, 0, _unixctl_version, version) + ovs.unixctl.command_register("set-options", "[--format text|json]", 2, + 2, _unixctl_set_options, None) + return 0, UnixctlServer(listener) diff --git a/python/ovs/util.py b/python/ovs/util.py index 3dba022f8..272ca683d 100644 --- a/python/ovs/util.py +++ b/python/ovs/util.py @@ -15,11 +15,19 @@ import os import os.path import sys +import enum PROGRAM_NAME = os.path.basename(sys.argv[0]) EOF = -1 +@enum.unique +# FIXME: Use @enum.verify(enum.NAMED_FLAGS) from Python 3.11 when available. +class OutputFormat(enum.IntFlag): + TEXT = 1 << 0 + JSON = 1 << 1 + + def abs_file_name(dir_, file_name): """If 'file_name' starts with '/', returns a copy of 'file_name'. Otherwise, returns an absolute path to 'file_name' considering it relative diff --git a/tests/appctl.py b/tests/appctl.py index b85b364fa..4e8c4adc0 100644 --- a/tests/appctl.py +++ b/tests/appctl.py @@ -49,13 +49,30 @@ def main(): help="Arguments to the command.") parser.add_argument("-T", "--timeout", metavar="SECS", help="wait at most SECS seconds for a response") + parser.add_argument("-f", "--format", metavar="FMT", + help="Output format.", default="text", + choices=[fmt.name.lower() + for fmt in ovs.util.OutputFormat]) args = parser.parse_args() signal_alarm(int(args.timeout) if args.timeout else None) ovs.vlog.Vlog.init() target = args.target + format = ovs.util.OutputFormat[args.format.upper()] client = connect_to_target(target) + + if format != ovs.util.OutputFormat.TEXT: + err_no, error, _ = client.transact( + "set-options", ["--format", args.format]) + + if err_no: + ovs.util.ovs_fatal(err_no, "%s: transaction error" % target) + elif error is not None: + sys.stderr.write(error) + ovs.util.ovs_error(0, "%s: server returned an error" % target) + sys.exit(2) + err_no, error, result = client.transact(args.command, args.argv) client.close() diff --git a/tests/unixctl-py.at b/tests/unixctl-py.at index 724006118..26c137047 100644 --- a/tests/unixctl-py.at +++ b/tests/unixctl-py.at @@ -100,6 +100,7 @@ The available commands are: exit help log [[arg ...]] + set-options [[--format text|json]] version vlog/close vlog/list From patchwork Thu Jan 18 09:57:39 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jakob Meng X-Patchwork-Id: 1887849 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256 header.s=mimecast20190719 header.b=fbQiCwAv; dkim-atps=neutral Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=openvswitch.org (client-ip=2605:bc80:3010::138; helo=smtp1.osuosl.org; envelope-from=ovs-dev-bounces@openvswitch.org; receiver=patchwork.ozlabs.org) Received: from smtp1.osuosl.org (smtp1.osuosl.org [IPv6:2605:bc80:3010::138]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (secp384r1) server-digest SHA384) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4TFyr86V9Kz1yPv for ; Thu, 18 Jan 2024 20:58:48 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by smtp1.osuosl.org (Postfix) with ESMTP id DCB1181DD8; Thu, 18 Jan 2024 09:58:46 +0000 (UTC) DKIM-Filter: OpenDKIM Filter v2.11.0 smtp1.osuosl.org DCB1181DD8 Authentication-Results: smtp1.osuosl.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256 header.s=mimecast20190719 header.b=fbQiCwAv X-Virus-Scanned: amavisd-new at osuosl.org Received: from smtp1.osuosl.org ([127.0.0.1]) by localhost (smtp1.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id ZM4PzgP118t8; Thu, 18 Jan 2024 09:58:39 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [IPv6:2605:bc80:3010:104::8cd3:938]) by smtp1.osuosl.org (Postfix) with ESMTPS id C49E981501; Thu, 18 Jan 2024 09:58:37 +0000 (UTC) DKIM-Filter: OpenDKIM Filter v2.11.0 smtp1.osuosl.org C49E981501 Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id 57D93C0DDD; Thu, 18 Jan 2024 09:58:35 +0000 (UTC) X-Original-To: dev@openvswitch.org Delivered-To: ovs-dev@lists.linuxfoundation.org Received: from smtp4.osuosl.org (smtp4.osuosl.org [IPv6:2605:bc80:3010::137]) by lists.linuxfoundation.org (Postfix) with ESMTP id 1F1C0C008E for ; Thu, 18 Jan 2024 09:58:33 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by smtp4.osuosl.org (Postfix) with ESMTP id E9F5D42225 for ; Thu, 18 Jan 2024 09:58:31 +0000 (UTC) DKIM-Filter: OpenDKIM Filter v2.11.0 smtp4.osuosl.org E9F5D42225 Authentication-Results: smtp4.osuosl.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256 header.s=mimecast20190719 header.b=fbQiCwAv X-Virus-Scanned: amavisd-new at osuosl.org Received: from smtp4.osuosl.org ([127.0.0.1]) by localhost (smtp4.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id DXO414vh7OzI for ; Thu, 18 Jan 2024 09:58:28 +0000 (UTC) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by smtp4.osuosl.org (Postfix) with ESMTPS id 0657F410E5 for ; Thu, 18 Jan 2024 09:58:27 +0000 (UTC) DKIM-Filter: OpenDKIM Filter v2.11.0 smtp4.osuosl.org 0657F410E5 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1705571907; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=fHeNPlnv/PwTczy7rD1qsZMmBd3CC52wvQlJp874FyQ=; b=fbQiCwAv4YleOcNbPZzSC+kGcyGCnx1pBwarktUeqH/lJL49uDxBYUu9svyxY4X24RJ/K0 WzxES4MaWdS7Ov83nG8DOXz52TmnnUhHG8EF9v51BSWOYE2dMbMcHRyyigGb/3GQP7Sof9 XgfKCDp/LCetek4P+BN59vJf3/AnyKw= Received: from mail-wr1-f69.google.com (mail-wr1-f69.google.com [209.85.221.69]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-252-nSTQPyiyOXyInE1TbBsgaA-1; Thu, 18 Jan 2024 04:58:24 -0500 X-MC-Unique: nSTQPyiyOXyInE1TbBsgaA-1 Received: by mail-wr1-f69.google.com with SMTP id ffacd0b85a97d-33770774fe4so5932799f8f.3 for ; Thu, 18 Jan 2024 01:58:23 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1705571903; x=1706176703; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=IhWJyWB6Fr/YnIiqmi3qEVvL3gy9bafbj7mKODJD+88=; b=MSHLVwee8FHSR/yWAJG/bcpgDxlPLz2ZEgbFECOWPm+j5WxCg80mE3PeqKnIMho8Gd zW1kKDcj8C+dHFVsK7xDGM7PpQBgnX1/qDq68bW77NwkW0htEMnGegyJbVzvpZhe+H6D tkO/mzTIeqEy5c5Eb2PLZvvm8IcN224aWIo5Vct5AVrhGugjZcmNkLdBK3nJDH75RnZY oAXHItKIy8vm3h7cNPE8nKmYIMloI0+ziL2RXH/Tp8BNgQ5uUVEax7chWfg10aUrUlTv y0FYNkzIKulYvoBG3zh0TdTIrglItwEGqgWdEk/ZbATxH43gpchKgqkKZvG3i07sBV7j jhZA== X-Gm-Message-State: AOJu0YxdWLhWZPKv8fqINmmy+dot7fds9MwFHqEvBsxi641YQjftWXDT FxW7fLpQ295a9qebOwUopJUX3RJDcoQ7dp0q5uT/W9K/9dJGbgHAsYdBJKl0/4kXDE8a2+6ik1a S3QKkjHuR3HFrKRQhQnLRm2pvGFq5enAEzg180T2f4LyGSUlBMYil5PDomBAURZX4rALSU5Pe8z AXe91ZxsVjYr1BBkrgROTSE7TqKocO X-Received: by 2002:a05:600c:1990:b0:40e:50ac:d24e with SMTP id t16-20020a05600c199000b0040e50acd24emr448056wmq.13.1705571902147; Thu, 18 Jan 2024 01:58:22 -0800 (PST) X-Google-Smtp-Source: AGHT+IEaUXY24F2Cw1E8Z83xyE/kmFcsB32G0rbtCro9PRrV+AIsalfxb3thqJonInqz8mdfkU0t+g== X-Received: by 2002:a05:600c:1990:b0:40e:50ac:d24e with SMTP id t16-20020a05600c199000b0040e50acd24emr448035wmq.13.1705571901244; Thu, 18 Jan 2024 01:58:21 -0800 (PST) Received: from positronik4lide.redhat.com ([87.122.58.78]) by smtp.gmail.com with ESMTPSA id iv11-20020a05600c548b00b0040d8ff79fd8sm25226688wmb.7.2024.01.18.01.58.20 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 18 Jan 2024 01:58:20 -0800 (PST) From: jmeng@redhat.com To: dev@openvswitch.org, i.maximets@ovn.org, echaudro@redhat.com, ktraynor@redhat.com, aconole@redhat.com, rjarry@redhat.com Date: Thu, 18 Jan 2024 10:57:39 +0100 Message-Id: <20240118095742.731853-4-jmeng@redhat.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20240118095742.731853-1-jmeng@redhat.com> References: <20240118095742.731853-1-jmeng@redhat.com> MIME-Version: 1.0 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Subject: [ovs-dev] [PATCH v6 3/6] Migrate commands to extended unixctl API. X-BeenThere: ovs-dev@openvswitch.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: ovs-dev-bounces@openvswitch.org Sender: "dev" From: Jakob Meng Previous commits introduced support different output formats to ovs-xxx tools and its Python equivalents. However, the commands were not yet migrated to the updated {unixctl_}command_register() functions and unixctl_cb_func function type in order to highlight the API changes only. This patch accomplishes this command migration in a single sweep. It replaces the old functions {unixctl_}command_register() in lib/unixctl.* and python/ovs/unixctl/__init__.py with their extended variants featuring the new 'output_fmts' parameter. All command registrations have been updated to announce what output formats each commands supports. No new output formats have been added, i.e. all commands still support OVS_OUTPUT_FMT_TEXT only. All command callbacks gained a 'enum ovs_output_fmt fmt OVS_UNUSED' argument to conform with the updated function type unixctl_cb_func in lib/unixctl.h. Without any new output formats being added, it is always ignored for now. Reported-at: https://bugzilla.redhat.com/1824861 Signed-off-by: Jakob Meng --- ipsec/ovs-monitor-ipsec.in | 22 ++++-- lib/bfd.c | 16 +++- lib/cfm.c | 13 +++- lib/coverage.c | 11 ++- lib/dpctl.c | 127 +++++++++++++++++++------------- 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 | 53 ++++---------- lib/unixctl.h | 12 +-- lib/vlog.c | 46 ++++++++---- ofproto/bond.c | 32 +++++--- ofproto/ofproto-dpif-trace.c | 10 ++- ofproto/ofproto-dpif-upcall.c | 81 +++++++++++++++------ ofproto/ofproto-dpif.c | 64 +++++++++++----- ofproto/ofproto.c | 10 ++- ofproto/tunnel.c | 4 +- ovsdb/file.c | 4 +- ovsdb/ovsdb-client.c | 40 ++++++---- ovsdb/ovsdb-server.c | 129 ++++++++++++++++++++++++--------- ovsdb/ovsdb.c | 4 +- ovsdb/raft.c | 28 ++++--- python/ovs/unixctl/__init__.py | 40 ++-------- python/ovs/unixctl/server.py | 34 ++++----- python/ovs/vlog.py | 12 ++- tests/test-netflow.c | 4 +- tests/test-sflow.c | 4 +- tests/test-unixctl.c | 33 ++++++--- tests/test-unixctl.py | 25 ++++--- utilities/ovs-ofctl.c | 43 +++++++---- vswitchd/bridge.c | 25 +++++-- vswitchd/ovs-vswitchd.c | 5 +- vtep/ovs-vtep.in | 5 +- 51 files changed, 792 insertions(+), 476 deletions(-) diff --git a/ipsec/ovs-monitor-ipsec.in b/ipsec/ovs-monitor-ipsec.in index 7945162f9..29c87b32a 100755 --- a/ipsec/ovs-monitor-ipsec.in +++ b/ipsec/ovs-monitor-ipsec.in @@ -1229,25 +1229,25 @@ def address_family(address): return "IPv4" -def unixctl_xfrm_policies(conn, unused_argv, unused_aux): +def unixctl_xfrm_policies(conn, unused_argv, unused_fmt, unused_aux): global xfrm policies = xfrm.get_policies() conn.reply(str(policies)) -def unixctl_xfrm_state(conn, unused_argv, unused_aux): +def unixctl_xfrm_state(conn, unused_argv, unused_fmt, unused_aux): global xfrm securities = xfrm.get_securities() conn.reply(str(securities)) -def unixctl_ipsec_status(conn, unused_argv, unused_aux): +def unixctl_ipsec_status(conn, unused_argv, unused_fmt, unused_aux): global monitor conns = monitor.ike_helper.get_active_conns() conn.reply(str(conns)) -def unixctl_show(conn, unused_argv, unused_aux): +def unixctl_show(conn, unused_argv, unused_fmt, unused_aux): global monitor global xfrm policies = xfrm.get_policies() @@ -1255,13 +1255,13 @@ def unixctl_show(conn, unused_argv, unused_aux): monitor.show(conn, policies, securities) -def unixctl_refresh(conn, unused_argv, unused_aux): +def unixctl_refresh(conn, unused_argv, unused_fmt, unused_aux): global monitor monitor.ike_helper.refresh(monitor) conn.reply(None) -def unixctl_exit(conn, argv, unused_aux): +def unixctl_exit(conn, argv, unused_fmt, unused_aux): global monitor global exiting ret = None @@ -1336,17 +1336,25 @@ def main(): ovs.daemon.daemonize() ovs.unixctl.command_register("list-commands", "", 0, 0, + ovs.util.OutputFormat.TEXT, ovs.unixctl._unixctl_help, None) ovs.unixctl.command_register("xfrm/policies", "", 0, 0, + ovs.util.OutputFormat.TEXT, unixctl_xfrm_policies, None) ovs.unixctl.command_register("xfrm/state", "", 0, 0, + ovs.util.OutputFormat.TEXT, unixctl_xfrm_state, None) ovs.unixctl.command_register("ipsec/status", "", 0, 0, + ovs.util.OutputFormat.TEXT, unixctl_ipsec_status, None) ovs.unixctl.command_register("tunnels/show", "", 0, 0, + ovs.util.OutputFormat.TEXT, unixctl_show, None) - ovs.unixctl.command_register("refresh", "", 0, 0, unixctl_refresh, None) + ovs.unixctl.command_register("refresh", "", 0, 0, + ovs.util.OutputFormat.TEXT, + unixctl_refresh, None) ovs.unixctl.command_register("exit", "[--no-cleanup]", 0, 1, + ovs.util.OutputFormat.TEXT, unixctl_exit, None) error, unixctl_server = ovs.unixctl.server.UnixctlServer.create(None) diff --git a/lib/bfd.c b/lib/bfd.c index 9698576d0..05d150878 100644 --- a/lib/bfd.c +++ b/lib/bfd.c @@ -267,9 +267,13 @@ static void bfd_status_changed(struct bfd *) OVS_REQUIRES(mutex); static void bfd_forwarding_if_rx_update(struct bfd *) OVS_REQUIRES(mutex); static void bfd_unixctl_show(struct unixctl_conn *, int argc, - const char *argv[], void *aux OVS_UNUSED); + const char *argv[], + enum ovs_output_fmt fmt OVS_UNUSED, + void *aux OVS_UNUSED); static void bfd_unixctl_set_forwarding_override(struct unixctl_conn *, int argc, const char *argv[], + enum ovs_output_fmt fmt + OVS_UNUSED, void *aux OVS_UNUSED); static void log_msg(enum vlog_level, const struct msg *, const char *message, const struct bfd *) OVS_REQUIRES(mutex); @@ -339,9 +343,10 @@ void bfd_init(void) { unixctl_command_register("bfd/show", "[interface]", 0, 1, - bfd_unixctl_show, NULL); + OVS_OUTPUT_FMT_TEXT, bfd_unixctl_show, NULL); unixctl_command_register("bfd/set-forwarding", "[interface] normal|false|true", 1, 2, + OVS_OUTPUT_FMT_TEXT, bfd_unixctl_set_forwarding_override, NULL); } @@ -1311,7 +1316,8 @@ bfd_put_details(struct ds *ds, const struct bfd *bfd) OVS_REQUIRES(mutex) static void bfd_unixctl_show(struct unixctl_conn *conn, int argc, const char *argv[], - void *aux OVS_UNUSED) OVS_EXCLUDED(mutex) + enum ovs_output_fmt fmt OVS_UNUSED, void *aux OVS_UNUSED) + OVS_EXCLUDED(mutex) { struct ds ds = DS_EMPTY_INITIALIZER; struct bfd *bfd; @@ -1340,7 +1346,9 @@ out: static void bfd_unixctl_set_forwarding_override(struct unixctl_conn *conn, int argc, - const char *argv[], void *aux OVS_UNUSED) + const char *argv[], + enum ovs_output_fmt fmt OVS_UNUSED, + void *aux OVS_UNUSED) OVS_EXCLUDED(mutex) { const char *forward_str = argv[argc - 1]; diff --git a/lib/cfm.c b/lib/cfm.c index c3742f3de..4f1598983 100644 --- a/lib/cfm.c +++ b/lib/cfm.c @@ -327,10 +327,12 @@ lookup_remote_mp(const struct cfm *cfm, uint64_t mpid) OVS_REQUIRES(mutex) void cfm_init(void) { - unixctl_command_register("cfm/show", "[interface]", 0, 1, cfm_unixctl_show, + unixctl_command_register("cfm/show", "[interface]", 0, 1, + OVS_OUTPUT_FMT_TEXT, cfm_unixctl_show, NULL); unixctl_command_register("cfm/set-fault", "[interface] normal|false|true", - 1, 2, cfm_unixctl_set_fault, NULL); + 1, 2, OVS_OUTPUT_FMT_TEXT, cfm_unixctl_set_fault, + NULL); } /* Records the status change and changes the global connectivity seq. */ @@ -1061,7 +1063,8 @@ cfm_print_details(struct ds *ds, struct cfm *cfm) OVS_REQUIRES(mutex) static void cfm_unixctl_show(struct unixctl_conn *conn, int argc, const char *argv[], - void *aux OVS_UNUSED) OVS_EXCLUDED(mutex) + enum ovs_output_fmt fmt OVS_UNUSED, void *aux OVS_UNUSED) + OVS_EXCLUDED(mutex) { struct ds ds = DS_EMPTY_INITIALIZER; struct cfm *cfm; @@ -1088,7 +1091,9 @@ out: static void cfm_unixctl_set_fault(struct unixctl_conn *conn, int argc, const char *argv[], - void *aux OVS_UNUSED) OVS_EXCLUDED(mutex) + enum ovs_output_fmt fmt OVS_UNUSED, + void *aux OVS_UNUSED) + OVS_EXCLUDED(mutex) { const char *fault_str = argv[argc - 1]; int fault_override; diff --git a/lib/coverage.c b/lib/coverage.c index a95b6aa25..f32550fc3 100644 --- a/lib/coverage.c +++ b/lib/coverage.c @@ -61,7 +61,9 @@ coverage_counter_register(struct coverage_counter* counter) static void coverage_unixctl_show(struct unixctl_conn *conn, int argc OVS_UNUSED, - const char *argv[] OVS_UNUSED, void *aux OVS_UNUSED) + const char *argv[] OVS_UNUSED, + enum ovs_output_fmt fmt OVS_UNUSED, + void *aux OVS_UNUSED) { struct svec lines; char *reply; @@ -76,7 +78,9 @@ coverage_unixctl_show(struct unixctl_conn *conn, int argc OVS_UNUSED, static void coverage_unixctl_read_counter(struct unixctl_conn *conn, int argc OVS_UNUSED, - const char *argv[], void *aux OVS_UNUSED) + const char *argv[], + enum ovs_output_fmt fmt OVS_UNUSED, + void *aux OVS_UNUSED) { unsigned long long count; char *reply; @@ -96,9 +100,10 @@ coverage_unixctl_read_counter(struct unixctl_conn *conn, int argc OVS_UNUSED, void coverage_init(void) { - unixctl_command_register("coverage/show", "", 0, 0, + unixctl_command_register("coverage/show", "", 0, 0, OVS_OUTPUT_FMT_TEXT, coverage_unixctl_show, NULL); unixctl_command_register("coverage/read-counter", "COUNTER", 1, 1, + OVS_OUTPUT_FMT_TEXT, coverage_unixctl_read_counter, NULL); } diff --git a/lib/dpctl.c b/lib/dpctl.c index 34ee7d0e2..27aaa21ee 100644 --- a/lib/dpctl.c +++ b/lib/dpctl.c @@ -66,6 +66,7 @@ struct dpctl_command { const char *usage; int min_args; int max_args; + int output_fmts; dpctl_command_handler *handler; enum { DP_RO, DP_RW} mode; }; @@ -2983,70 +2984,94 @@ out: } static const struct dpctl_command all_commands[] = { - { "add-dp", "dp [iface...]", 1, INT_MAX, dpctl_add_dp, DP_RW }, - { "del-dp", "dp", 1, 1, dpctl_del_dp, DP_RW }, - { "add-if", "dp iface...", 2, INT_MAX, dpctl_add_if, DP_RW }, - { "del-if", "dp iface...", 2, INT_MAX, dpctl_del_if, DP_RW }, - { "set-if", "dp iface...", 2, INT_MAX, dpctl_set_if, DP_RW }, - { "dump-dps", "", 0, 0, dpctl_dump_dps, DP_RO }, - { "show", "[-s] [dp...]", 0, INT_MAX, dpctl_show, DP_RO }, + { "add-dp", "dp [iface...]", 1, INT_MAX, OVS_OUTPUT_FMT_TEXT, + dpctl_add_dp, DP_RW }, + { "del-dp", "dp", 1, 1, OVS_OUTPUT_FMT_TEXT, dpctl_del_dp, DP_RW }, + { "add-if", "dp iface...", 2, INT_MAX, OVS_OUTPUT_FMT_TEXT, dpctl_add_if, + DP_RW }, + { "del-if", "dp iface...", 2, INT_MAX, OVS_OUTPUT_FMT_TEXT, dpctl_del_if, + DP_RW }, + { "set-if", "dp iface...", 2, INT_MAX, OVS_OUTPUT_FMT_TEXT, dpctl_set_if, + DP_RW }, + { "dump-dps", "", 0, 0, OVS_OUTPUT_FMT_TEXT, dpctl_dump_dps, DP_RO }, + { "show", "[-s] [dp...]", 0, INT_MAX, OVS_OUTPUT_FMT_TEXT, dpctl_show, + DP_RO }, { "dump-flows", "[-m] [--names] [dp] [filter=..] [type=..] [pmd=..]", - 0, 6, dpctl_dump_flows, DP_RO }, - { "add-flow", "[dp] flow actions", 2, 3, dpctl_add_flow, DP_RW }, - { "mod-flow", "[dp] flow actions", 2, 3, dpctl_mod_flow, DP_RW }, - { "get-flow", "[dp] ufid", 1, 2, dpctl_get_flow, DP_RO }, - { "del-flow", "[dp] flow", 1, 2, dpctl_del_flow, DP_RW }, - { "add-flows", "[dp] file", 1, 2, dpctl_process_flows, DP_RW }, - { "mod-flows", "[dp] file", 1, 2, dpctl_process_flows, DP_RW }, - { "del-flows", "[dp] [file]", 0, 2, dpctl_del_flows, DP_RW }, + 0, 6, OVS_OUTPUT_FMT_TEXT, dpctl_dump_flows, DP_RO }, + { "add-flow", "[dp] flow actions", 2, 3, OVS_OUTPUT_FMT_TEXT, + dpctl_add_flow, DP_RW }, + { "mod-flow", "[dp] flow actions", 2, 3, OVS_OUTPUT_FMT_TEXT, + dpctl_mod_flow, DP_RW }, + { "get-flow", "[dp] ufid", 1, 2, OVS_OUTPUT_FMT_TEXT, dpctl_get_flow, + DP_RO }, + { "del-flow", "[dp] flow", 1, 2, OVS_OUTPUT_FMT_TEXT, dpctl_del_flow, + DP_RW }, + { "add-flows", "[dp] file", 1, 2, OVS_OUTPUT_FMT_TEXT, + dpctl_process_flows, DP_RW }, + { "mod-flows", "[dp] file", 1, 2, OVS_OUTPUT_FMT_TEXT, + dpctl_process_flows, DP_RW }, + { "del-flows", "[dp] [file]", 0, 2, OVS_OUTPUT_FMT_TEXT, dpctl_del_flows, + DP_RW }, { "offload-stats-show", "[dp]", - 0, 1, dpctl_offload_stats_show, DP_RO }, + 0, 1, OVS_OUTPUT_FMT_TEXT, dpctl_offload_stats_show, DP_RO }, { "dump-conntrack", "[-m] [-s] [dp] [zone=N]", - 0, 4, dpctl_dump_conntrack, DP_RO }, + 0, 4, OVS_OUTPUT_FMT_TEXT, dpctl_dump_conntrack, DP_RO }, { "dump-conntrack-exp", "[dp] [zone=N]", - 0, 2, dpctl_dump_conntrack_exp, DP_RO }, + 0, 2, OVS_OUTPUT_FMT_TEXT, dpctl_dump_conntrack_exp, DP_RO }, { "flush-conntrack", "[dp] [zone=N] [mark=X[/M]] [labels=Y[/N]] " "[ct-orig-tuple [ct-reply-tuple]]", - 0, 6, dpctl_flush_conntrack, DP_RW }, - { "cache-get-size", "[dp]", 0, 1, dpctl_cache_get_size, DP_RO }, - { "cache-set-size", "dp cache ", 3, 3, dpctl_cache_set_size, DP_RW }, + 0, 6, OVS_OUTPUT_FMT_TEXT, dpctl_flush_conntrack, DP_RW }, + { "cache-get-size", "[dp]", 0, 1, OVS_OUTPUT_FMT_TEXT, + dpctl_cache_get_size, DP_RO }, + { "cache-set-size", "dp cache ", 3, 3, OVS_OUTPUT_FMT_TEXT, + dpctl_cache_set_size, DP_RW }, { "ct-stats-show", "[dp] [zone=N]", - 0, 3, dpctl_ct_stats_show, DP_RO }, - { "ct-bkts", "[dp] [gt=N]", 0, 2, dpctl_ct_bkts, DP_RO }, - { "ct-set-maxconns", "[dp] maxconns", 1, 2, dpctl_ct_set_maxconns, - DP_RW }, - { "ct-get-maxconns", "[dp]", 0, 1, dpctl_ct_get_maxconns, DP_RO }, - { "ct-get-nconns", "[dp]", 0, 1, dpctl_ct_get_nconns, DP_RO }, - { "ct-enable-tcp-seq-chk", "[dp]", 0, 1, dpctl_ct_enable_tcp_seq_chk, - DP_RW }, - { "ct-disable-tcp-seq-chk", "[dp]", 0, 1, dpctl_ct_disable_tcp_seq_chk, - DP_RW }, - { "ct-get-tcp-seq-chk", "[dp]", 0, 1, dpctl_ct_get_tcp_seq_chk, DP_RO }, + 0, 3, OVS_OUTPUT_FMT_TEXT, dpctl_ct_stats_show, DP_RO }, + { "ct-bkts", "[dp] [gt=N]", 0, 2, OVS_OUTPUT_FMT_TEXT, dpctl_ct_bkts, + DP_RO }, + { "ct-set-maxconns", "[dp] maxconns", 1, 2, OVS_OUTPUT_FMT_TEXT, + dpctl_ct_set_maxconns, DP_RW }, + { "ct-get-maxconns", "[dp]", 0, 1, OVS_OUTPUT_FMT_TEXT, + dpctl_ct_get_maxconns, DP_RO }, + { "ct-get-nconns", "[dp]", 0, 1, OVS_OUTPUT_FMT_TEXT, dpctl_ct_get_nconns, + DP_RO }, + { "ct-enable-tcp-seq-chk", "[dp]", 0, 1, OVS_OUTPUT_FMT_TEXT, + dpctl_ct_enable_tcp_seq_chk, DP_RW }, + { "ct-disable-tcp-seq-chk", "[dp]", 0, 1, OVS_OUTPUT_FMT_TEXT, + dpctl_ct_disable_tcp_seq_chk, DP_RW }, + { "ct-get-tcp-seq-chk", "[dp]", 0, 1, OVS_OUTPUT_FMT_TEXT, + dpctl_ct_get_tcp_seq_chk, DP_RO }, { "ct-set-limits", "[dp] [default=L] [zone=N,limit=L]...", 1, INT_MAX, - dpctl_ct_set_limits, DP_RO }, + OVS_OUTPUT_FMT_TEXT, dpctl_ct_set_limits, DP_RO }, { "ct-del-limits", "[dp] [default] [zone=N1[,N2]...]", 1, 3, - dpctl_ct_del_limits, DP_RO }, - { "ct-get-limits", "[dp] [zone=N1[,N2]...]", 0, 2, dpctl_ct_get_limits, - DP_RO }, - { "ct-get-sweep-interval", "[dp]", 0, 1, dpctl_ct_get_sweep, DP_RO }, - { "ct-set-sweep-interval", "[dp] ms", 1, 2, dpctl_ct_set_sweep, DP_RW }, - { "ipf-set-enabled", "[dp] v4|v6", 1, 2, dpctl_ipf_set_enabled, DP_RW }, - { "ipf-set-disabled", "[dp] v4|v6", 1, 2, dpctl_ipf_set_disabled, DP_RW }, + OVS_OUTPUT_FMT_TEXT, dpctl_ct_del_limits, DP_RO }, + { "ct-get-limits", "[dp] [zone=N1[,N2]...]", 0, 2, OVS_OUTPUT_FMT_TEXT, + dpctl_ct_get_limits, DP_RO }, + { "ct-get-sweep-interval", "[dp]", 0, 1, OVS_OUTPUT_FMT_TEXT, + dpctl_ct_get_sweep, DP_RO }, + { "ct-set-sweep-interval", "[dp] ms", 1, 2, OVS_OUTPUT_FMT_TEXT, + dpctl_ct_set_sweep, DP_RW }, + { "ipf-set-enabled", "[dp] v4|v6", 1, 2, OVS_OUTPUT_FMT_TEXT, + dpctl_ipf_set_enabled, DP_RW }, + { "ipf-set-disabled", "[dp] v4|v6", 1, 2, OVS_OUTPUT_FMT_TEXT, + dpctl_ipf_set_disabled, DP_RW }, { "ipf-set-min-frag", "[dp] v4|v6 minfragment", 2, 3, - dpctl_ipf_set_min_frag, DP_RW }, + OVS_OUTPUT_FMT_TEXT, dpctl_ipf_set_min_frag, DP_RW }, { "ipf-set-max-nfrags", "[dp] maxfrags", 1, 2, - dpctl_ipf_set_max_nfrags, DP_RW }, - { "ipf-get-status", "[dp]", 0, 1, dpctl_ct_ipf_get_status, - DP_RO }, - { "help", "", 0, INT_MAX, dpctl_help, DP_RO }, - { "list-commands", "", 0, INT_MAX, dpctl_list_commands, DP_RO }, + OVS_OUTPUT_FMT_TEXT, dpctl_ipf_set_max_nfrags, DP_RW }, + { "ipf-get-status", "[dp]", 0, 1, OVS_OUTPUT_FMT_TEXT, + dpctl_ct_ipf_get_status, DP_RO }, + { "help", "", 0, INT_MAX, OVS_OUTPUT_FMT_TEXT, dpctl_help, DP_RO }, + { "list-commands", "", 0, INT_MAX, OVS_OUTPUT_FMT_TEXT, + dpctl_list_commands, DP_RO }, /* Undocumented commands for testing. */ - { "parse-actions", "actions", 1, INT_MAX, dpctl_parse_actions, DP_RO }, + { "parse-actions", "actions", 1, INT_MAX, OVS_OUTPUT_FMT_TEXT, + dpctl_parse_actions, DP_RO }, { "normalize-actions", "actions", - 2, INT_MAX, dpctl_normalize_actions, DP_RO }, + 2, INT_MAX, OVS_OUTPUT_FMT_TEXT, dpctl_normalize_actions, DP_RO }, - { NULL, NULL, 0, 0, NULL, DP_RO }, + { NULL, NULL, 0, 0, 0, NULL, DP_RO }, }; static const struct dpctl_command *get_all_dpctl_commands(void) @@ -3105,7 +3130,7 @@ dpctl_unixctl_print(void *userdata, bool error OVS_UNUSED, const char *msg) static void dpctl_unixctl_handler(struct unixctl_conn *conn, int argc, const char *argv[], - void *aux) + enum ovs_output_fmt fmt, void *aux) { struct ds ds = DS_EMPTY_INITIALIZER; bool error = false; @@ -3114,6 +3139,7 @@ dpctl_unixctl_handler(struct unixctl_conn *conn, int argc, const char *argv[], .is_appctl = true, .output = dpctl_unixctl_print, .aux = &ds, + .format = fmt, }; /* Parse options (like getopt). Unfortunately it does @@ -3202,6 +3228,7 @@ dpctl_unixctl_register(void) p->usage, p->min_args, p->max_args, + p->output_fmts, dpctl_unixctl_handler, p->handler); free(cmd_name); diff --git a/lib/dpdk.c b/lib/dpdk.c index d76d53f8f..4e71a8234 100644 --- a/lib/dpdk.c +++ b/lib/dpdk.c @@ -213,7 +213,8 @@ static cookie_io_functions_t dpdk_log_func = { static void dpdk_unixctl_mem_stream(struct unixctl_conn *conn, int argc OVS_UNUSED, - const char *argv[] OVS_UNUSED, void *aux) + const char *argv[] OVS_UNUSED, + enum ovs_output_fmt fmt OVS_UNUSED, void *aux) { void (*callback)(FILE *) = aux; char *response = NULL; @@ -260,6 +261,7 @@ dpdk_parse_log_level(const char *s) static void dpdk_unixctl_log_set(struct unixctl_conn *conn, int argc, const char *argv[], + enum ovs_output_fmt fmt OVS_UNUSED, void *aux OVS_UNUSED) { int i; @@ -427,14 +429,15 @@ dpdk_init__(const struct smap *ovs_other_config) } } - unixctl_command_register("dpdk/lcore-list", "", 0, 0, - dpdk_unixctl_mem_stream, rte_lcore_dump); - unixctl_command_register("dpdk/log-list", "", 0, 0, + unixctl_command_register("dpdk/lcore-list", "", 0, 0, OVS_OUTPUT_FMT_TEXT, + dpdk_unixctl_mem_stream, rte_lcore_dump); + unixctl_command_register("dpdk/log-list", "", 0, 0, OVS_OUTPUT_FMT_TEXT, dpdk_unixctl_mem_stream, rte_log_dump); unixctl_command_register("dpdk/log-set", "{level | pattern:level}", 0, - INT_MAX, dpdk_unixctl_log_set, NULL); + INT_MAX, OVS_OUTPUT_FMT_TEXT, + dpdk_unixctl_log_set, NULL); unixctl_command_register("dpdk/get-malloc-stats", "", 0, 0, - dpdk_unixctl_mem_stream, + OVS_OUTPUT_FMT_TEXT, dpdk_unixctl_mem_stream, malloc_dump_stats_wrapper); /* We are called from the main thread here */ diff --git a/lib/dpif-netdev-perf.c b/lib/dpif-netdev-perf.c index 79ea5e3be..23e735ef0 100644 --- a/lib/dpif-netdev-perf.c +++ b/lib/dpif-netdev-perf.c @@ -706,6 +706,7 @@ pmd_perf_log_susp_iteration_neighborhood(struct pmd_perf_stats *s) void pmd_perf_log_set_cmd(struct unixctl_conn *conn, int argc, const char *argv[], + enum ovs_output_fmt fmt OVS_UNUSED, void *aux OVS_UNUSED) { unsigned int it_before, it_after, us_thr, q_thr; diff --git a/lib/dpif-netdev-perf.h b/lib/dpif-netdev-perf.h index 84beced15..1e5cddbac 100644 --- a/lib/dpif-netdev-perf.h +++ b/lib/dpif-netdev-perf.h @@ -432,6 +432,7 @@ void pmd_perf_format_ms_history(struct ds *str, struct pmd_perf_stats *s, int n_ms); void pmd_perf_log_set_cmd(struct unixctl_conn *conn, int argc, const char *argv[], + enum ovs_output_fmt fmt OVS_UNUSED, void *aux OVS_UNUSED); #ifdef __cplusplus diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c index df5bbf85a..d90a52c72 100644 --- a/lib/dpif-netdev.c +++ b/lib/dpif-netdev.c @@ -1018,6 +1018,7 @@ sorted_poll_thread_list(struct dp_netdev *dp, static void dpif_netdev_subtable_lookup_get(struct unixctl_conn *conn, int argc OVS_UNUSED, const char *argv[] OVS_UNUSED, + enum ovs_output_fmt fmt OVS_UNUSED, void *aux OVS_UNUSED) { struct ds reply = DS_EMPTY_INITIALIZER; @@ -1029,7 +1030,9 @@ dpif_netdev_subtable_lookup_get(struct unixctl_conn *conn, int argc OVS_UNUSED, static void dpif_netdev_subtable_lookup_set(struct unixctl_conn *conn, int argc OVS_UNUSED, - const char *argv[], void *aux OVS_UNUSED) + const char *argv[], + enum ovs_output_fmt fmt OVS_UNUSED, + void *aux OVS_UNUSED) { /* This function requires 2 parameters (argv[1] and argv[2]) to execute. * argv[1] is subtable name @@ -1109,7 +1112,9 @@ dpif_netdev_subtable_lookup_set(struct unixctl_conn *conn, int argc OVS_UNUSED, static void dpif_netdev_impl_get(struct unixctl_conn *conn, int argc OVS_UNUSED, - const char *argv[] OVS_UNUSED, void *aux OVS_UNUSED) + const char *argv[] OVS_UNUSED, + enum ovs_output_fmt fmt OVS_UNUSED, + void *aux OVS_UNUSED) { struct ds reply = DS_EMPTY_INITIALIZER; struct shash_node *node; @@ -1133,7 +1138,8 @@ dpif_netdev_impl_get(struct unixctl_conn *conn, int argc OVS_UNUSED, static void dpif_netdev_impl_set(struct unixctl_conn *conn, int argc OVS_UNUSED, - const char *argv[], void *aux OVS_UNUSED) + const char *argv[], enum ovs_output_fmt fmt OVS_UNUSED, + void *aux OVS_UNUSED) { /* This function requires just one parameter, the DPIF name. */ const char *dpif_name = argv[1]; @@ -1195,6 +1201,7 @@ dpif_netdev_impl_set(struct unixctl_conn *conn, int argc OVS_UNUSED, static void dpif_miniflow_extract_impl_get(struct unixctl_conn *conn, int argc OVS_UNUSED, const char *argv[] OVS_UNUSED, + enum ovs_output_fmt fmt OVS_UNUSED, void *aux OVS_UNUSED) { struct ds reply = DS_EMPTY_INITIALIZER; @@ -1219,7 +1226,9 @@ dpif_miniflow_extract_impl_get(struct unixctl_conn *conn, int argc OVS_UNUSED, static void dpif_miniflow_extract_impl_set(struct unixctl_conn *conn, int argc, - const char *argv[], void *aux OVS_UNUSED) + const char *argv[], + enum ovs_output_fmt fmt OVS_UNUSED, + void *aux OVS_UNUSED) { /* This command takes some optional and mandatory arguments. The function * here first parses all of the options, saving results in local variables. @@ -1408,7 +1417,9 @@ error: static void dpif_netdev_pmd_rebalance(struct unixctl_conn *conn, int argc, - const char *argv[], void *aux OVS_UNUSED) + const char *argv[], + enum ovs_output_fmt fmt OVS_UNUSED, + void *aux OVS_UNUSED) { struct ds reply = DS_EMPTY_INITIALIZER; struct dp_netdev *dp = NULL; @@ -1451,7 +1462,7 @@ pmd_info_show_sleep(struct ds *reply, unsigned core_id, int numa_id, static void dpif_netdev_pmd_info(struct unixctl_conn *conn, int argc, const char *argv[], - void *aux) + enum ovs_output_fmt fmt OVS_UNUSED, void *aux) { struct ds reply = DS_EMPTY_INITIALIZER; struct dp_netdev_pmd_thread **pmd_list; @@ -1550,9 +1561,8 @@ dpif_netdev_pmd_info(struct unixctl_conn *conn, int argc, const char *argv[], } static void -pmd_perf_show_cmd(struct unixctl_conn *conn, int argc, - const char *argv[], - void *aux OVS_UNUSED) +pmd_perf_show_cmd(struct unixctl_conn *conn, int argc, const char *argv[], + enum ovs_output_fmt fmt, void *aux OVS_UNUSED) { struct pmd_perf_params par; long int it_hist = 0, ms_hist = 0; @@ -1588,12 +1598,13 @@ pmd_perf_show_cmd(struct unixctl_conn *conn, int argc, par.iter_hist_len = it_hist; par.ms_hist_len = ms_hist; par.command_type = PMD_INFO_PERF_SHOW; - dpif_netdev_pmd_info(conn, argc, argv, &par); + dpif_netdev_pmd_info(conn, argc, argv, fmt, &par); } static void -dpif_netdev_bond_show(struct unixctl_conn *conn, int argc, - const char *argv[], void *aux OVS_UNUSED) +dpif_netdev_bond_show(struct unixctl_conn *conn, int argc, const char *argv[], + enum ovs_output_fmt fmt OVS_UNUSED, + void *aux OVS_UNUSED) { struct ds reply = DS_EMPTY_INITIALIZER; struct dp_netdev *dp = NULL; @@ -1643,60 +1654,60 @@ dpif_netdev_init(void) sleep_aux = PMD_INFO_SLEEP_SHOW; unixctl_command_register("dpif-netdev/pmd-stats-show", "[-pmd core] [dp]", - 0, 3, dpif_netdev_pmd_info, + 0, 3, OVS_OUTPUT_FMT_TEXT, dpif_netdev_pmd_info, (void *)&show_aux); unixctl_command_register("dpif-netdev/pmd-stats-clear", "[-pmd core] [dp]", - 0, 3, dpif_netdev_pmd_info, + 0, 3, OVS_OUTPUT_FMT_TEXT, dpif_netdev_pmd_info, (void *)&clear_aux); unixctl_command_register("dpif-netdev/pmd-rxq-show", "[-pmd core] " "[-secs secs] [dp]", - 0, 5, dpif_netdev_pmd_info, + 0, 5, OVS_OUTPUT_FMT_TEXT, dpif_netdev_pmd_info, (void *)&poll_aux); unixctl_command_register("dpif-netdev/pmd-sleep-show", "[dp]", - 0, 1, dpif_netdev_pmd_info, + 0, 1, OVS_OUTPUT_FMT_TEXT, dpif_netdev_pmd_info, (void *)&sleep_aux); unixctl_command_register("dpif-netdev/pmd-perf-show", "[-nh] [-it iter-history-len]" " [-ms ms-history-len]" " [-pmd core] [dp]", - 0, 8, pmd_perf_show_cmd, + 0, 8, OVS_OUTPUT_FMT_TEXT, pmd_perf_show_cmd, NULL); unixctl_command_register("dpif-netdev/pmd-rxq-rebalance", "[dp]", - 0, 1, dpif_netdev_pmd_rebalance, - NULL); + 0, 1, OVS_OUTPUT_FMT_TEXT, + dpif_netdev_pmd_rebalance, NULL); unixctl_command_register("dpif-netdev/pmd-perf-log-set", "on|off [-b before] [-a after] [-e|-ne] " "[-us usec] [-q qlen]", - 0, 10, pmd_perf_log_set_cmd, + 0, 10, OVS_OUTPUT_FMT_TEXT, pmd_perf_log_set_cmd, NULL); unixctl_command_register("dpif-netdev/bond-show", "[dp]", - 0, 1, dpif_netdev_bond_show, + 0, 1, OVS_OUTPUT_FMT_TEXT, dpif_netdev_bond_show, NULL); unixctl_command_register("dpif-netdev/subtable-lookup-prio-set", "[lookup_func] [prio]", - 2, 2, dpif_netdev_subtable_lookup_set, - NULL); + 2, 2, OVS_OUTPUT_FMT_TEXT, + dpif_netdev_subtable_lookup_set, NULL); unixctl_command_register("dpif-netdev/subtable-lookup-info-get", "", - 0, 0, dpif_netdev_subtable_lookup_get, - NULL); + 0, 0, OVS_OUTPUT_FMT_TEXT, + dpif_netdev_subtable_lookup_get, NULL); unixctl_command_register("dpif-netdev/subtable-lookup-prio-get", NULL, - 0, 0, dpif_netdev_subtable_lookup_get, - NULL); + 0, 0, OVS_OUTPUT_FMT_TEXT, + dpif_netdev_subtable_lookup_get, NULL); unixctl_command_register("dpif-netdev/dpif-impl-set", "dpif_implementation_name", - 1, 1, dpif_netdev_impl_set, + 1, 1, OVS_OUTPUT_FMT_TEXT, dpif_netdev_impl_set, NULL); unixctl_command_register("dpif-netdev/dpif-impl-get", "", - 0, 0, dpif_netdev_impl_get, + 0, 0, OVS_OUTPUT_FMT_TEXT, dpif_netdev_impl_get, NULL); unixctl_command_register("dpif-netdev/miniflow-parser-set", "[-pmd core] miniflow_implementation_name" " [study_pkt_cnt]", - 1, 5, dpif_miniflow_extract_impl_set, - NULL); + 1, 5, OVS_OUTPUT_FMT_TEXT, + dpif_miniflow_extract_impl_set, NULL); unixctl_command_register("dpif-netdev/miniflow-parser-get", "", - 0, 0, dpif_miniflow_extract_impl_get, - NULL); + 0, 0, OVS_OUTPUT_FMT_TEXT, + dpif_miniflow_extract_impl_get, NULL); return 0; } @@ -10041,7 +10052,9 @@ const struct dpif_class dpif_netdev_class = { static void dpif_dummy_change_port_number(struct unixctl_conn *conn, int argc OVS_UNUSED, - const char *argv[], void *aux OVS_UNUSED) + const char *argv[], + enum ovs_output_fmt fmt OVS_UNUSED, + void *aux OVS_UNUSED) { struct dp_netdev_port *port; struct dp_netdev *dp; @@ -10137,7 +10150,8 @@ dpif_dummy_register(enum dummy_level level) unixctl_command_register("dpif-dummy/change-port-number", "dp port new-number", - 3, 3, dpif_dummy_change_port_number, NULL); + 3, 3, OVS_OUTPUT_FMT_TEXT, + dpif_dummy_change_port_number, NULL); } /* Datapath Classifier. */ diff --git a/lib/dpif-netlink.c b/lib/dpif-netlink.c index 84e2bd8ea..670df6671 100644 --- a/lib/dpif-netlink.c +++ b/lib/dpif-netlink.c @@ -124,7 +124,9 @@ dpif_netlink_set_features(struct dpif *dpif_, uint32_t new_features); static void dpif_netlink_unixctl_dispatch_mode(struct unixctl_conn *conn, int argc, - const char *argv[], void *aux); + const char *argv[], + enum ovs_output_fmt fmt OVS_UNUSED, + void *aux); struct dpif_netlink_flow { /* Generic Netlink header. */ @@ -4634,6 +4636,7 @@ dpif_netlink_init(void) ovs_tunnels_out_of_tree = dpif_netlink_rtnl_probe_oot_tunnels(); unixctl_command_register("dpif-netlink/dispatch-mode", "", 0, 0, + OVS_OUTPUT_FMT_TEXT, dpif_netlink_unixctl_dispatch_mode, NULL); ovsthread_once_done(&once); @@ -5287,6 +5290,7 @@ static void dpif_netlink_unixctl_dispatch_mode(struct unixctl_conn *conn, int argc OVS_UNUSED, const char *argv[] OVS_UNUSED, + enum ovs_output_fmt fmt OVS_UNUSED, void *aux OVS_UNUSED) { struct ds reply = DS_EMPTY_INITIALIZER; diff --git a/lib/lacp.c b/lib/lacp.c index 3252f17eb..9923efb72 100644 --- a/lib/lacp.c +++ b/lib/lacp.c @@ -225,10 +225,11 @@ parse_lacp_packet(const struct dp_packet *p, enum pdu_subtype *subtype) void lacp_init(void) { - unixctl_command_register("lacp/show", "[port]", 0, 1, + unixctl_command_register("lacp/show", "[port]", 0, 1, OVS_OUTPUT_FMT_TEXT, lacp_unixctl_show, NULL); unixctl_command_register("lacp/show-stats", "[port]", 0, 1, - lacp_unixctl_show_stats, NULL); + OVS_OUTPUT_FMT_TEXT, lacp_unixctl_show_stats, + NULL); } static void @@ -1114,6 +1115,7 @@ lacp_print_stats(struct ds *ds, struct lacp *lacp) OVS_REQUIRES(mutex) static void lacp_unixctl_show(struct unixctl_conn *conn, int argc, const char *argv[], + enum ovs_output_fmt fmt OVS_UNUSED, void *aux OVS_UNUSED) OVS_EXCLUDED(mutex) { struct ds ds = DS_EMPTY_INITIALIZER; @@ -1144,6 +1146,7 @@ static void lacp_unixctl_show_stats(struct unixctl_conn *conn, int argc, const char *argv[], + enum ovs_output_fmt fmt OVS_UNUSED, void *aux OVS_UNUSED) OVS_EXCLUDED(mutex) { struct ds ds = DS_EMPTY_INITIALIZER; diff --git a/lib/memory.c b/lib/memory.c index da97476c6..cd6950aa3 100644 --- a/lib/memory.c +++ b/lib/memory.c @@ -160,7 +160,8 @@ memory_report(const struct simap *usage) static void memory_unixctl_show(struct unixctl_conn *conn, int argc OVS_UNUSED, - const char *argv[] OVS_UNUSED, void *aux OVS_UNUSED) + const char *argv[] OVS_UNUSED, + enum ovs_output_fmt fmt OVS_UNUSED, void *aux OVS_UNUSED) { conns = xrealloc(conns, (n_conns + 1) * sizeof *conns); conns[n_conns++] = conn; @@ -173,7 +174,7 @@ memory_init(void) if (!inited) { inited = true; - unixctl_command_register("memory/show", "", 0, 0, + unixctl_command_register("memory/show", "", 0, 0, OVS_OUTPUT_FMT_TEXT, memory_unixctl_show, NULL); next_check = time_boot_msec() + MEMORY_CHECK_INTERVAL; diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c index 1ff25c246..85d3fe084 100644 --- a/lib/netdev-dpdk.c +++ b/lib/netdev-dpdk.c @@ -4295,7 +4295,9 @@ netdev_dpdk_set_admin_state__(struct netdev_dpdk *dev, bool admin_state) static void netdev_dpdk_set_admin_state(struct unixctl_conn *conn, int argc, - const char *argv[], void *aux OVS_UNUSED) + const char *argv[], + enum ovs_output_fmt fmt OVS_UNUSED, + void *aux OVS_UNUSED) { bool up; @@ -4340,7 +4342,9 @@ netdev_dpdk_set_admin_state(struct unixctl_conn *conn, int argc, static void netdev_dpdk_detach(struct unixctl_conn *conn, int argc OVS_UNUSED, - const char *argv[], void *aux OVS_UNUSED) + const char *argv[], + enum ovs_output_fmt fmt OVS_UNUSED, + void *aux OVS_UNUSED) { struct ds used_interfaces = DS_EMPTY_INITIALIZER; struct rte_eth_dev_info dev_info; @@ -4407,6 +4411,7 @@ error: static void netdev_dpdk_get_mempool_info(struct unixctl_conn *conn, int argc, const char *argv[], + enum ovs_output_fmt fmt OVS_UNUSED, void *aux OVS_UNUSED) { size_t size; @@ -4919,19 +4924,22 @@ netdev_dpdk_class_init(void) ovs_thread_create("dpdk_watchdog", dpdk_watchdog, NULL); unixctl_command_register("netdev-dpdk/set-admin-state", "[netdev] up|down", 1, 2, + OVS_OUTPUT_FMT_TEXT, netdev_dpdk_set_admin_state, NULL); unixctl_command_register("netdev-dpdk/detach", "pci address of device", 1, 1, + OVS_OUTPUT_FMT_TEXT, netdev_dpdk_detach, NULL); unixctl_command_register("netdev-dpdk/get-mempool-info", - "[netdev]", 0, 1, + "[netdev]", 0, 1, OVS_OUTPUT_FMT_TEXT, netdev_dpdk_get_mempool_info, NULL); ret = rte_eth_dev_callback_register(RTE_ETH_ALL, RTE_ETH_EVENT_INTR_RESET, - dpdk_eth_event_callback, NULL); + dpdk_eth_event_callback, + NULL); if (ret != 0) { VLOG_ERR("Ethernet device callback register error: %s", rte_strerror(-ret)); diff --git a/lib/netdev-dummy.c b/lib/netdev-dummy.c index 8c6e6d448..5064bca63 100644 --- a/lib/netdev-dummy.c +++ b/lib/netdev-dummy.c @@ -1859,7 +1859,8 @@ netdev_dummy_queue_packet(struct netdev_dummy *dummy, struct dp_packet *packet, static void netdev_dummy_receive(struct unixctl_conn *conn, - int argc, const char *argv[], void *aux OVS_UNUSED) + int argc, const char *argv[], + enum ovs_output_fmt fmt OVS_UNUSED, void *aux OVS_UNUSED) { struct netdev_dummy *dummy_dev; struct netdev *netdev; @@ -1942,7 +1943,9 @@ netdev_dummy_set_admin_state__(struct netdev_dummy *dev, bool admin_state) static void netdev_dummy_set_admin_state(struct unixctl_conn *conn, int argc, - const char *argv[], void *aux OVS_UNUSED) + const char *argv[], + enum ovs_output_fmt fmt OVS_UNUSED, + void *aux OVS_UNUSED) { bool up; @@ -2008,7 +2011,9 @@ display_conn_state__(struct ds *s, const char *name, static void netdev_dummy_conn_state(struct unixctl_conn *conn, int argc, - const char *argv[], void *aux OVS_UNUSED) + const char *argv[], + enum ovs_output_fmt fmt OVS_UNUSED, + void *aux OVS_UNUSED) { enum dummy_netdev_conn_state state = CONN_STATE_UNKNOWN; struct ds s; @@ -2050,7 +2055,9 @@ netdev_dummy_conn_state(struct unixctl_conn *conn, int argc, static void netdev_dummy_ip4addr(struct unixctl_conn *conn, int argc OVS_UNUSED, - const char *argv[], void *aux OVS_UNUSED) + const char *argv[], + enum ovs_output_fmt fmt OVS_UNUSED, + void *aux OVS_UNUSED) { struct netdev *netdev = netdev_from_name(argv[1]); @@ -2075,7 +2082,8 @@ netdev_dummy_ip4addr(struct unixctl_conn *conn, int argc OVS_UNUSED, static void netdev_dummy_ip6addr(struct unixctl_conn *conn, int argc OVS_UNUSED, - const char *argv[], void *aux OVS_UNUSED) + const char *argv[], enum ovs_output_fmt fmt OVS_UNUSED, + void *aux OVS_UNUSED) { struct netdev *netdev = netdev_from_name(argv[1]); @@ -2127,18 +2135,20 @@ netdev_dummy_register(enum dummy_level level) { unixctl_command_register("netdev-dummy/receive", "name [--qid queue_id] packet|flow [--len packet_len]", - 2, INT_MAX, netdev_dummy_receive, NULL); + 2, INT_MAX, OVS_OUTPUT_FMT_TEXT, + netdev_dummy_receive, NULL); unixctl_command_register("netdev-dummy/set-admin-state", - "[netdev] up|down", 1, 2, + "[netdev] up|down", 1, 2, OVS_OUTPUT_FMT_TEXT, netdev_dummy_set_admin_state, NULL); unixctl_command_register("netdev-dummy/conn-state", - "[netdev]", 0, 1, + "[netdev]", 0, 1, OVS_OUTPUT_FMT_TEXT, netdev_dummy_conn_state, NULL); unixctl_command_register("netdev-dummy/ip4addr", "[netdev] ipaddr/mask-prefix-len", 2, 2, - netdev_dummy_ip4addr, NULL); + OVS_OUTPUT_FMT_TEXT, netdev_dummy_ip4addr, + NULL); unixctl_command_register("netdev-dummy/ip6addr", - "[netdev] ip6addr", 2, 2, + "[netdev] ip6addr", 2, 2, OVS_OUTPUT_FMT_TEXT, netdev_dummy_ip6addr, NULL); if (level == DUMMY_OVERRIDE_ALL) { diff --git a/lib/netdev-native-tnl.c b/lib/netdev-native-tnl.c index a0682c70f..95fb56333 100644 --- a/lib/netdev-native-tnl.c +++ b/lib/netdev-native-tnl.c @@ -1181,7 +1181,9 @@ netdev_geneve_build_header(const struct netdev *netdev, void netdev_tnl_egress_port_range(struct unixctl_conn *conn, int argc, - const char *argv[], void *aux OVS_UNUSED) + const char *argv[], + enum ovs_output_fmt fmt OVS_UNUSED, + void *aux OVS_UNUSED) { int val1, val2; diff --git a/lib/netdev-native-tnl.h b/lib/netdev-native-tnl.h index eb55dd041..e5d067d97 100644 --- a/lib/netdev-native-tnl.h +++ b/lib/netdev-native-tnl.h @@ -142,5 +142,7 @@ netdev_tnl_push_ip_header(struct dp_packet *packet, const void *header, int size, int *ip_tot_size, ovs_be32 ipv6_label); void netdev_tnl_egress_port_range(struct unixctl_conn *conn, int argc, - const char *argv[], void *aux OVS_UNUSED); + const char *argv[], + enum ovs_output_fmt fmt OVS_UNUSED, + void *aux OVS_UNUSED); #endif diff --git a/lib/netdev-vport.c b/lib/netdev-vport.c index 60caa02fb..1acd0e5bf 100644 --- a/lib/netdev-vport.c +++ b/lib/netdev-vport.c @@ -1389,6 +1389,7 @@ netdev_vport_tunnel_register(void) } unixctl_command_register("tnl/egress_port_range", "min max", 0, 2, + OVS_OUTPUT_FMT_TEXT, netdev_tnl_egress_port_range, NULL); ovsthread_once_done(&once); diff --git a/lib/odp-execute.c b/lib/odp-execute.c index eb03b57c4..230bd26a8 100644 --- a/lib/odp-execute.c +++ b/lib/odp-execute.c @@ -916,7 +916,8 @@ odp_actions_impl_set(const char *name) static void action_impl_set(struct unixctl_conn *conn, int argc OVS_UNUSED, - const char *argv[], void *aux OVS_UNUSED) + const char *argv[], enum ovs_output_fmt fmt OVS_UNUSED, + void *aux OVS_UNUSED) { struct ds reply = DS_EMPTY_INITIALIZER; @@ -936,7 +937,8 @@ action_impl_set(struct unixctl_conn *conn, int argc OVS_UNUSED, static void action_impl_show(struct unixctl_conn *conn, int argc OVS_UNUSED, - const char *argv[] OVS_UNUSED, void *aux OVS_UNUSED) + const char *argv[] OVS_UNUSED, + enum ovs_output_fmt fmt OVS_UNUSED, void *aux OVS_UNUSED) { struct ds reply = DS_EMPTY_INITIALIZER; @@ -949,10 +951,10 @@ static void odp_execute_unixctl_init(void) { unixctl_command_register("odp-execute/action-impl-set", "name", - 1, 1, action_impl_set, + 1, 1, OVS_OUTPUT_FMT_TEXT, action_impl_set, NULL); unixctl_command_register("odp-execute/action-impl-show", "", - 0, 0, action_impl_show, + 0, 0, OVS_OUTPUT_FMT_TEXT, action_impl_show, NULL); } diff --git a/lib/ovs-lldp.c b/lib/ovs-lldp.c index 2d13e971e..8dbc037a5 100644 --- a/lib/ovs-lldp.c +++ b/lib/ovs-lldp.c @@ -326,7 +326,8 @@ aa_print_isid_status(struct ds *ds, struct lldp *lldp) OVS_REQUIRES(mutex) static void aa_unixctl_status(struct unixctl_conn *conn, int argc OVS_UNUSED, - const char *argv[] OVS_UNUSED, void *aux OVS_UNUSED) + const char *argv[] OVS_UNUSED, + enum ovs_output_fmt fmt OVS_UNUSED, void *aux OVS_UNUSED) OVS_EXCLUDED(mutex) { struct lldp *lldp; @@ -345,7 +346,8 @@ aa_unixctl_status(struct unixctl_conn *conn, int argc OVS_UNUSED, static void aa_unixctl_show_isid(struct unixctl_conn *conn, int argc OVS_UNUSED, - const char *argv[] OVS_UNUSED, void *aux OVS_UNUSED) + const char *argv[] OVS_UNUSED, + enum ovs_output_fmt fmt OVS_UNUSED, void *aux OVS_UNUSED) OVS_EXCLUDED(mutex) { struct lldp *lldp; @@ -364,7 +366,8 @@ aa_unixctl_show_isid(struct unixctl_conn *conn, int argc OVS_UNUSED, static void aa_unixctl_statistics(struct unixctl_conn *conn, int argc OVS_UNUSED, - const char *argv[] OVS_UNUSED, void *aux OVS_UNUSED) + const char *argv[] OVS_UNUSED, + enum ovs_output_fmt fmt OVS_UNUSED, void *aux OVS_UNUSED) OVS_EXCLUDED(mutex) { struct ds ds = DS_EMPTY_INITIALIZER; @@ -644,11 +647,12 @@ void lldp_init(void) { unixctl_command_register("autoattach/status", "[bridge]", 0, 1, - aa_unixctl_status, NULL); + OVS_OUTPUT_FMT_TEXT, aa_unixctl_status, NULL); unixctl_command_register("autoattach/show-isid", "[bridge]", 0, 1, - aa_unixctl_show_isid, NULL); + OVS_OUTPUT_FMT_TEXT, aa_unixctl_show_isid, NULL); unixctl_command_register("autoattach/statistics", "[bridge]", 0, 1, - aa_unixctl_statistics, NULL); + OVS_OUTPUT_FMT_TEXT, aa_unixctl_statistics, + NULL); } /* Returns true if 'lldp' should process packets from 'flow'. Sets diff --git a/lib/ovs-router.c b/lib/ovs-router.c index ca014d80e..625fb8942 100644 --- a/lib/ovs-router.c +++ b/lib/ovs-router.c @@ -390,8 +390,8 @@ scan_ipv4_route(const char *s, ovs_be32 *addr, unsigned int *plen) } static void -ovs_router_add(struct unixctl_conn *conn, int argc, - const char *argv[], void *aux OVS_UNUSED) +ovs_router_add(struct unixctl_conn *conn, int argc, const char *argv[], + enum ovs_output_fmt fmt OVS_UNUSED, void *aux OVS_UNUSED) { struct in6_addr src6 = in6addr_any; struct in6_addr gw6 = in6addr_any; @@ -464,7 +464,8 @@ ovs_router_add(struct unixctl_conn *conn, int argc, static void ovs_router_del(struct unixctl_conn *conn, int argc OVS_UNUSED, - const char *argv[], void *aux OVS_UNUSED) + const char *argv[], enum ovs_output_fmt fmt OVS_UNUSED, + void *aux OVS_UNUSED) { struct in6_addr ip6; uint32_t mark = 0; @@ -495,7 +496,8 @@ ovs_router_del(struct unixctl_conn *conn, int argc OVS_UNUSED, static void ovs_router_show(struct unixctl_conn *conn, int argc OVS_UNUSED, - const char *argv[] OVS_UNUSED, void *aux OVS_UNUSED) + const char *argv[] OVS_UNUSED, + enum ovs_output_fmt fmt OVS_UNUSED, void *aux OVS_UNUSED) { struct ovs_router_entry *rt; struct ds ds = DS_EMPTY_INITIALIZER; @@ -535,8 +537,9 @@ ovs_router_show(struct unixctl_conn *conn, int argc OVS_UNUSED, } static void -ovs_router_lookup_cmd(struct unixctl_conn *conn, int argc, - const char *argv[], void *aux OVS_UNUSED) +ovs_router_lookup_cmd(struct unixctl_conn *conn, int argc, const char *argv[], + enum ovs_output_fmt fmt OVS_UNUSED, + void *aux OVS_UNUSED) { struct in6_addr gw, src = in6addr_any; char iface[IFNAMSIZ]; @@ -606,14 +609,15 @@ ovs_router_init(void) unixctl_command_register("ovs/route/add", "ip/plen output_bridge [gw] " "[pkt_mark=mark] [src=src_ip]", - 2, 5, ovs_router_add, NULL); + 2, 5, OVS_OUTPUT_FMT_TEXT, ovs_router_add, + NULL); unixctl_command_register("ovs/route/show", "", 0, 0, - ovs_router_show, NULL); + OVS_OUTPUT_FMT_TEXT, ovs_router_show, NULL); unixctl_command_register("ovs/route/del", "ip/plen " - "[pkt_mark=mark]", 1, 2, ovs_router_del, - NULL); + "[pkt_mark=mark]", 1, 2, OVS_OUTPUT_FMT_TEXT, + ovs_router_del, NULL); unixctl_command_register("ovs/route/lookup", "ip_addr " - "[pkt_mark=mark]", 1, 2, + "[pkt_mark=mark]", 1, 2, OVS_OUTPUT_FMT_TEXT, ovs_router_lookup_cmd, NULL); ovsthread_once_done(&once); } diff --git a/lib/rstp.c b/lib/rstp.c index 2f01966f7..0f5a0e91d 100644 --- a/lib/rstp.c +++ b/lib/rstp.c @@ -129,9 +129,11 @@ static struct rstp_port *rstp_get_root_port__(const struct rstp *rstp) static rstp_identifier rstp_get_root_id__(const struct rstp *rstp) OVS_REQUIRES(rstp_mutex); static void rstp_unixctl_tcn(struct unixctl_conn *, int argc, - const char *argv[], void *aux); + const char *argv[], + enum ovs_output_fmt fmt OVS_UNUSED, void *aux); static void rstp_unixctl_show(struct unixctl_conn *, int argc, - const char *argv[], void *aux); + const char *argv[], + enum ovs_output_fmt fmt OVS_UNUSED, void *aux); const char * rstp_state_name(enum rstp_state state) @@ -248,10 +250,10 @@ void rstp_init(void) OVS_EXCLUDED(rstp_mutex) { - unixctl_command_register("rstp/tcn", "[bridge]", 0, 1, rstp_unixctl_tcn, - NULL); - unixctl_command_register("rstp/show", "[bridge]", 0, 1, rstp_unixctl_show, - NULL); + unixctl_command_register("rstp/tcn", "[bridge]", 0, 1, + OVS_OUTPUT_FMT_TEXT, rstp_unixctl_tcn, NULL); + unixctl_command_register("rstp/show", "[bridge]", 0, 1, + OVS_OUTPUT_FMT_TEXT, rstp_unixctl_show, NULL); } /* Creates and returns a new RSTP instance that initially has no ports. */ @@ -1550,8 +1552,8 @@ rstp_find(const char *name) } static void -rstp_unixctl_tcn(struct unixctl_conn *conn, int argc, - const char *argv[], void *aux OVS_UNUSED) +rstp_unixctl_tcn(struct unixctl_conn *conn, int argc, const char *argv[], + enum ovs_output_fmt fmt OVS_UNUSED, void *aux OVS_UNUSED) OVS_EXCLUDED(rstp_mutex) { ovs_mutex_lock(&rstp_mutex); @@ -1651,8 +1653,8 @@ rstp_print_details(struct ds *ds, const struct rstp *rstp) } static void -rstp_unixctl_show(struct unixctl_conn *conn, int argc, - const char *argv[], void *aux OVS_UNUSED) +rstp_unixctl_show(struct unixctl_conn *conn, int argc, const char *argv[], + enum ovs_output_fmt fmt OVS_UNUSED, void *aux OVS_UNUSED) OVS_EXCLUDED(rstp_mutex) { struct ds ds = DS_EMPTY_INITIALIZER; diff --git a/lib/stopwatch.c b/lib/stopwatch.c index ec567603b..70fcc2979 100644 --- a/lib/stopwatch.c +++ b/lib/stopwatch.c @@ -314,7 +314,8 @@ stopwatch_show_protected(int argc, const char *argv[], struct ds *s) static void stopwatch_show(struct unixctl_conn *conn, int argc OVS_UNUSED, - const char *argv[], void *aux OVS_UNUSED) + const char *argv[], + enum ovs_output_fmt fmt OVS_UNUSED, void *aux OVS_UNUSED) { struct ds s = DS_EMPTY_INITIALIZER; bool success; @@ -351,7 +352,8 @@ stopwatch_packet_write(struct stopwatch_packet *pkt) static void stopwatch_reset(struct unixctl_conn *conn, int argc OVS_UNUSED, - const char *argv[], void *aux OVS_UNUSED) + const char *argv[], + enum ovs_output_fmt fmt OVS_UNUSED, void *aux OVS_UNUSED) { struct stopwatch_packet *pkt = stopwatch_packet_create(OP_RESET); if (argc > 1) { @@ -488,9 +490,9 @@ static void do_init_stopwatch(void) { unixctl_command_register("stopwatch/show", "[NAME]", 0, 1, - stopwatch_show, NULL); + OVS_OUTPUT_FMT_TEXT, stopwatch_show, NULL); unixctl_command_register("stopwatch/reset", "[NAME]", 0, 1, - stopwatch_reset, NULL); + OVS_OUTPUT_FMT_TEXT, stopwatch_reset, NULL); guarded_list_init(&stopwatch_commands); latch_init(&stopwatch_latch); stopwatch_thread_id = ovs_thread_create( diff --git a/lib/stp.c b/lib/stp.c index f37337992..0d1b6b053 100644 --- a/lib/stp.c +++ b/lib/stp.c @@ -233,9 +233,11 @@ static bool stp_timer_expired(struct stp_timer *, int elapsed, int timeout); static void stp_send_bpdu(struct stp_port *, const void *, size_t) OVS_REQUIRES(mutex); static void stp_unixctl_tcn(struct unixctl_conn *, int argc, - const char *argv[], void *aux); + const char *argv[], + enum ovs_output_fmt fmt OVS_UNUSED, void *aux); static void stp_unixctl_show(struct unixctl_conn *, int argc, - const char *argv[], void *aux); + const char *argv[], + enum ovs_output_fmt fmt OVS_UNUSED, void *aux); void stp_init(void) @@ -249,10 +251,10 @@ stp_init(void) * the call back function, but for now this is what we have. */ ovs_mutex_init_recursive(&mutex); - unixctl_command_register("stp/tcn", "[bridge]", 0, 1, stp_unixctl_tcn, - NULL); + unixctl_command_register("stp/tcn", "[bridge]", 0, 1, + OVS_OUTPUT_FMT_TEXT, stp_unixctl_tcn, NULL); unixctl_command_register("stp/show", "[bridge]", 0, 1, - stp_unixctl_show, NULL); + OVS_OUTPUT_FMT_TEXT, stp_unixctl_show, NULL); ovsthread_once_done(&once); } } @@ -1611,8 +1613,8 @@ stp_find(const char *name) OVS_REQUIRES(mutex) } static void -stp_unixctl_tcn(struct unixctl_conn *conn, int argc, - const char *argv[], void *aux OVS_UNUSED) +stp_unixctl_tcn(struct unixctl_conn *conn, int argc, const char *argv[], + enum ovs_output_fmt fmt OVS_UNUSED, void *aux OVS_UNUSED) { ovs_mutex_lock(&mutex); if (argc > 1) { @@ -1702,8 +1704,8 @@ stp_print_details(struct ds *ds, const struct stp *stp) } static void -stp_unixctl_show(struct unixctl_conn *conn, int argc, - const char *argv[], void *aux OVS_UNUSED) +stp_unixctl_show(struct unixctl_conn *conn, int argc, const char *argv[], + enum ovs_output_fmt fmt OVS_UNUSED, void *aux OVS_UNUSED) { struct ds ds = DS_EMPTY_INITIALIZER; diff --git a/lib/timeval.c b/lib/timeval.c index 0abe7e555..fcefbb7bd 100644 --- a/lib/timeval.c +++ b/lib/timeval.c @@ -769,8 +769,9 @@ get_cpu_usage(void) * advancing, except due to later calls to "time/warp". */ static void timeval_stop_cb(struct unixctl_conn *conn, - int argc OVS_UNUSED, const char *argv[] OVS_UNUSED, - void *aux OVS_UNUSED) + int argc OVS_UNUSED, const char *argv[] OVS_UNUSED, + enum ovs_output_fmt fmt OVS_UNUSED, + void *aux OVS_UNUSED) { ovs_mutex_lock(&monotonic_clock.mutex); atomic_store_relaxed(&monotonic_clock.slow_path, true); @@ -793,7 +794,8 @@ timeval_stop_cb(struct unixctl_conn *conn, * Does not affect wall clock readings. */ static void timeval_warp_cb(struct unixctl_conn *conn, - int argc OVS_UNUSED, const char *argv[], void *aux OVS_UNUSED) + int argc OVS_UNUSED, const char *argv[], + enum ovs_output_fmt fmt OVS_UNUSED, void *aux OVS_UNUSED) { long long int total_warp = argc > 2 ? atoll(argv[1]) : 0; long long int msecs = argc > 2 ? atoll(argv[2]) : atoll(argv[1]); @@ -822,9 +824,10 @@ void timeval_dummy_register(void) { timewarp_enabled = true; - unixctl_command_register("time/stop", "", 0, 0, timeval_stop_cb, NULL); + unixctl_command_register("time/stop", "", 0, 0, OVS_OUTPUT_FMT_TEXT, + timeval_stop_cb, NULL); unixctl_command_register("time/warp", "[large_msecs] msecs", 1, 2, - timeval_warp_cb, NULL); + OVS_OUTPUT_FMT_TEXT, timeval_warp_cb, NULL); } diff --git a/lib/tnl-neigh-cache.c b/lib/tnl-neigh-cache.c index bdff1debc..b8aeee29a 100644 --- a/lib/tnl-neigh-cache.c +++ b/lib/tnl-neigh-cache.c @@ -273,7 +273,9 @@ tnl_neigh_flush(const char br_name[IFNAMSIZ]) static void tnl_neigh_cache_flush(struct unixctl_conn *conn, int argc OVS_UNUSED, - const char *argv[] OVS_UNUSED, void *aux OVS_UNUSED) + const char *argv[] OVS_UNUSED, + enum ovs_output_fmt fmt OVS_UNUSED, + void *aux OVS_UNUSED) { struct tnl_neigh_entry *neigh; bool changed = false; @@ -291,8 +293,9 @@ tnl_neigh_cache_flush(struct unixctl_conn *conn, int argc OVS_UNUSED, } static void -tnl_neigh_cache_aging(struct unixctl_conn *conn, int argc, - const char *argv[], void *aux OVS_UNUSED) +tnl_neigh_cache_aging(struct unixctl_conn *conn, int argc, const char *argv[], + enum ovs_output_fmt fmt OVS_UNUSED, + void *aux OVS_UNUSED) { long long int new_exp, curr_exp; struct tnl_neigh_entry *neigh; @@ -348,7 +351,8 @@ lookup_any(const char *host_name, struct in6_addr *address) static void tnl_neigh_cache_add(struct unixctl_conn *conn, int argc OVS_UNUSED, - const char *argv[], void *aux OVS_UNUSED) + const char *argv[], + enum ovs_output_fmt fmt OVS_UNUSED, void *aux OVS_UNUSED) { const char *br_name = argv[1]; struct eth_addr mac; @@ -370,7 +374,9 @@ tnl_neigh_cache_add(struct unixctl_conn *conn, int argc OVS_UNUSED, static void tnl_neigh_cache_show(struct unixctl_conn *conn, int argc OVS_UNUSED, - const char *argv[] OVS_UNUSED, void *aux OVS_UNUSED) + const char *argv[] OVS_UNUSED, + enum ovs_output_fmt fmt OVS_UNUSED, + void *aux OVS_UNUSED) { struct ds ds = DS_EMPTY_INITIALIZER; struct tnl_neigh_entry *neigh; @@ -404,20 +410,23 @@ void tnl_neigh_cache_init(void) { atomic_init(&neigh_aging, NEIGH_ENTRY_DEFAULT_IDLE_TIME_MS); - unixctl_command_register("tnl/arp/show", "", 0, 0, + unixctl_command_register("tnl/arp/show", "", 0, 0, OVS_OUTPUT_FMT_TEXT, tnl_neigh_cache_show, NULL); unixctl_command_register("tnl/arp/set", "BRIDGE IP MAC", 3, 3, - tnl_neigh_cache_add, NULL); + OVS_OUTPUT_FMT_TEXT, tnl_neigh_cache_add, NULL); unixctl_command_register("tnl/arp/flush", "", 0, 0, - tnl_neigh_cache_flush, NULL); + OVS_OUTPUT_FMT_TEXT, tnl_neigh_cache_flush, + NULL); unixctl_command_register("tnl/arp/aging", "[SECS]", 0, 1, - tnl_neigh_cache_aging, NULL); + OVS_OUTPUT_FMT_TEXT, tnl_neigh_cache_aging, + NULL); unixctl_command_register("tnl/neigh/show", "", 0, 0, - tnl_neigh_cache_show, NULL); + OVS_OUTPUT_FMT_TEXT, tnl_neigh_cache_show, NULL); unixctl_command_register("tnl/neigh/set", "BRIDGE IP MAC", 3, 3, - tnl_neigh_cache_add, NULL); - unixctl_command_register("tnl/neigh/flush", "", 0, 0, + OVS_OUTPUT_FMT_TEXT, tnl_neigh_cache_add, NULL); + unixctl_command_register("tnl/neigh/flush", "", 0, 0, OVS_OUTPUT_FMT_TEXT, tnl_neigh_cache_flush, NULL); unixctl_command_register("tnl/neigh/aging", "[SECS]", 0, 1, - tnl_neigh_cache_aging, NULL); + OVS_OUTPUT_FMT_TEXT, tnl_neigh_cache_aging, + NULL); } diff --git a/lib/tnl-ports.c b/lib/tnl-ports.c index bb0b0b0c5..e3739882d 100644 --- a/lib/tnl-ports.c +++ b/lib/tnl-ports.c @@ -354,7 +354,8 @@ tnl_port_show_v(struct ds *ds) static void tnl_port_show(struct unixctl_conn *conn, int argc OVS_UNUSED, - const char *argv[] OVS_UNUSED, void *aux OVS_UNUSED) + const char *argv[] OVS_UNUSED, + enum ovs_output_fmt fmt OVS_UNUSED, void *aux OVS_UNUSED) { struct ds ds = DS_EMPTY_INITIALIZER; struct tnl_port *p; @@ -523,5 +524,6 @@ tnl_port_map_init(void) classifier_init(&cls, flow_segment_u64s); ovs_list_init(&addr_list); ovs_list_init(&port_list); - unixctl_command_register("tnl/ports/show", "-v", 0, 1, tnl_port_show, NULL); + unixctl_command_register("tnl/ports/show", "-v", 0, 1, + OVS_OUTPUT_FMT_TEXT, tnl_port_show, NULL); } diff --git a/lib/unixctl.c b/lib/unixctl.c index dd1450f22..3b9f300ba 100644 --- a/lib/unixctl.c +++ b/lib/unixctl.c @@ -67,7 +67,8 @@ static struct shash commands = SHASH_INITIALIZER(&commands); static void unixctl_list_commands(struct unixctl_conn *conn, int argc OVS_UNUSED, - const char *argv[] OVS_UNUSED, void *aux OVS_UNUSED) + const char *argv[] OVS_UNUSED, + enum ovs_output_fmt fmt OVS_UNUSED, void *aux OVS_UNUSED) { struct ds ds = DS_EMPTY_INITIALIZER; const struct shash_node **nodes = shash_sort(&commands); @@ -91,13 +92,15 @@ unixctl_list_commands(struct unixctl_conn *conn, int argc OVS_UNUSED, static void unixctl_version(struct unixctl_conn *conn, int argc OVS_UNUSED, - const char *argv[] OVS_UNUSED, void *aux OVS_UNUSED) + const char *argv[] OVS_UNUSED, + enum ovs_output_fmt fmt OVS_UNUSED, void *aux OVS_UNUSED) { unixctl_command_reply(conn, ovs_get_program_version()); } static void unixctl_set_options(struct unixctl_conn *conn, int argc, const char *argv[], + enum ovs_output_fmt fmt OVS_UNUSED, void *aux OVS_UNUSED) { char * error = NULL; @@ -129,26 +132,6 @@ error: free(error); } -/* Registers a unixctl command with the given 'name'. 'usage' describes the - * arguments to the command; it is used only for presentation to the user in - * "list-commands" output. (If 'usage' is NULL, then the command is hidden.) - * - * 'cb' is called when the command is received. It is passed an array - * containing the command name and arguments, plus a copy of 'aux'. Normally - * 'cb' should reply by calling unixctl_command_reply() or - * unixctl_command_reply_error() before it returns, but if the command cannot - * be handled immediately then it can defer the reply until later. A given - * connection can only process a single request at a time, so a reply must be - * made eventually to avoid blocking that connection. */ -void -unixctl_command_register(const char *name, const char *usage, - int min_args, int max_args, - unixctl_cb_func *cb, void *aux) -{ - unixctl_command_register_fmt(name, usage, min_args, max_args, - OVS_OUTPUT_FMT_TEXT, cb, aux); -} - /* Registers a unixctl command with the given 'name'. 'usage' describes the * arguments to the command; it is used only for presentation to the user in * "list-commands" output. (If 'usage' is NULL, then the command is hidden.) @@ -163,9 +146,9 @@ unixctl_command_register(const char *name, const char *usage, * connection can only process a single request at a time, so a reply must be * made eventually to avoid blocking that connection. */ void -unixctl_command_register_fmt(const char *name, const char *usage, - int min_args, int max_args, int output_fmts, - unixctl_cb_func *cb, void *aux) +unixctl_command_register(const char *name, const char *usage, + int min_args, int max_args, int output_fmts, + unixctl_cb_func *cb, void *aux) { struct unixctl_command *command; struct unixctl_command *lookup = shash_find_data(&commands, name); @@ -323,11 +306,12 @@ unixctl_server_create(const char *path, struct unixctl_server **serverp) return error; } - unixctl_command_register("list-commands", "", 0, 0, unixctl_list_commands, - NULL); - unixctl_command_register("version", "", 0, 0, unixctl_version, NULL); + unixctl_command_register("list-commands", "", 0, 0, OVS_OUTPUT_FMT_TEXT, + unixctl_list_commands, NULL); + unixctl_command_register("version", "", 0, 0, OVS_OUTPUT_FMT_TEXT, + unixctl_version, NULL); unixctl_command_register("set-options", "[--format text|json]", 2, 2, - unixctl_set_options, NULL); + OVS_OUTPUT_FMT_TEXT, unixctl_set_options, NULL); struct unixctl_server *server = xmalloc(sizeof *server); server->listener = listener; @@ -376,11 +360,6 @@ process_command(struct unixctl_conn *conn, struct jsonrpc_msg *request) " \"%s\" (supported: %d, requested: %d)", request->method, ovs_output_fmt_to_string(conn->fmt), command->output_fmts, conn->fmt); - } else if (conn->fmt != OVS_OUTPUT_FMT_TEXT) { - /* FIXME: Remove this check once output format will be passed to the - * command handler below. */ - error = xasprintf("output format \"%s\" has not been implemented yet", - ovs_output_fmt_to_string(conn->fmt)); } else { struct svec argv = SVEC_EMPTY_INITIALIZER; int i; @@ -397,10 +376,8 @@ process_command(struct unixctl_conn *conn, struct jsonrpc_msg *request) svec_terminate(&argv); if (!error) { - /* FIXME: Output format will be passed as 'fmt' to the command in - * later patch. */ - command->cb(conn, argv.n, (const char **) argv.names, - /* conn->fmt, */ command->aux); + command->cb(conn, argv.n, (const char **) argv.names, conn->fmt, + command->aux); } svec_destroy(&argv); diff --git a/lib/unixctl.h b/lib/unixctl.h index 8200b9e11..35ef6a548 100644 --- a/lib/unixctl.h +++ b/lib/unixctl.h @@ -43,20 +43,12 @@ int unixctl_client_transact(struct jsonrpc *client, /* Command registration. */ struct unixctl_conn; -/* FIXME: Output format will be passed as 'fmt' to the command in later patch. - */ typedef void unixctl_cb_func(struct unixctl_conn *, int argc, const char *argv[], - /* enum ovs_output_fmt fmt, */ void *aux); -/* FIXME: unixctl_command_register() will be replaced with - * unixctl_command_register_fmt() in a later patch of this series. It - * is kept temporarily to reduce the amount of changes in this patch. */ + enum ovs_output_fmt fmt, void *aux); void unixctl_command_register(const char *name, const char *usage, - int min_args, int max_args, + int min_args, int max_args, int output_fmts, unixctl_cb_func *cb, void *aux); -void unixctl_command_register_fmt(const char *name, const char *usage, - int min_args, int max_args, int output_fmts, - unixctl_cb_func *cb, void *aux); void unixctl_command_reply_error(struct unixctl_conn *, const char *error); void unixctl_command_reply(struct unixctl_conn *, const char *body); void unixctl_command_reply_json(struct unixctl_conn *, diff --git a/lib/vlog.c b/lib/vlog.c index b2653142f..a8ab97b1b 100644 --- a/lib/vlog.c +++ b/lib/vlog.c @@ -689,6 +689,7 @@ vlog_facility_exists(const char* facility, int *value) static void vlog_unixctl_set(struct unixctl_conn *conn, int argc, const char *argv[], + enum ovs_output_fmt fmt OVS_UNUSED, void *aux OVS_UNUSED) { int i; @@ -710,7 +711,8 @@ vlog_unixctl_set(struct unixctl_conn *conn, int argc, const char *argv[], static void vlog_unixctl_list(struct unixctl_conn *conn, int argc OVS_UNUSED, - const char *argv[] OVS_UNUSED, void *aux OVS_UNUSED) + const char *argv[] OVS_UNUSED, + enum ovs_output_fmt fmt OVS_UNUSED, void *aux OVS_UNUSED) { char *msg = vlog_get_levels(); unixctl_command_reply(conn, msg); @@ -719,7 +721,9 @@ vlog_unixctl_list(struct unixctl_conn *conn, int argc OVS_UNUSED, static void vlog_unixctl_list_pattern(struct unixctl_conn *conn, int argc OVS_UNUSED, - const char *argv[] OVS_UNUSED, void *aux OVS_UNUSED) + const char *argv[] OVS_UNUSED, + enum ovs_output_fmt fmt OVS_UNUSED, + void *aux OVS_UNUSED) { char *msg; @@ -730,7 +734,9 @@ vlog_unixctl_list_pattern(struct unixctl_conn *conn, int argc OVS_UNUSED, static void vlog_unixctl_reopen(struct unixctl_conn *conn, int argc OVS_UNUSED, - const char *argv[] OVS_UNUSED, void *aux OVS_UNUSED) + const char *argv[] OVS_UNUSED, + enum ovs_output_fmt fmt OVS_UNUSED, + void *aux OVS_UNUSED) { bool has_log_file; @@ -752,7 +758,9 @@ vlog_unixctl_reopen(struct unixctl_conn *conn, int argc OVS_UNUSED, static void vlog_unixctl_close(struct unixctl_conn *conn, int argc OVS_UNUSED, - const char *argv[] OVS_UNUSED, void *aux OVS_UNUSED) + const char *argv[] OVS_UNUSED, + enum ovs_output_fmt fmt OVS_UNUSED, + void *aux OVS_UNUSED) { ovs_mutex_lock(&log_file_mutex); if (log_fd >= 0) { @@ -811,14 +819,18 @@ set_rate_limits(struct unixctl_conn *conn, int argc, static void vlog_enable_rate_limit(struct unixctl_conn *conn, int argc, - const char *argv[], void *aux OVS_UNUSED) + const char *argv[], + enum ovs_output_fmt fmt OVS_UNUSED, + void *aux OVS_UNUSED) { set_rate_limits(conn, argc, argv, true); } static void vlog_disable_rate_limit(struct unixctl_conn *conn, int argc, - const char *argv[], void *aux OVS_UNUSED) + const char *argv[], + enum ovs_output_fmt fmt OVS_UNUSED, + void *aux OVS_UNUSED) { set_rate_limits(conn, argc, argv, false); } @@ -860,20 +872,24 @@ vlog_init(void) free(s); } - unixctl_command_register( - "vlog/set", "{spec | PATTERN:destination:pattern}", - 0, INT_MAX, vlog_unixctl_set, NULL); - unixctl_command_register("vlog/list", "", 0, 0, vlog_unixctl_list, - NULL); + unixctl_command_register("vlog/set", + "{spec | PATTERN:destination:pattern}", + 0, INT_MAX, OVS_OUTPUT_FMT_TEXT, + vlog_unixctl_set, NULL); + unixctl_command_register("vlog/list", "", 0, 0, OVS_OUTPUT_FMT_TEXT, + vlog_unixctl_list, NULL); unixctl_command_register("vlog/list-pattern", "", 0, 0, + OVS_OUTPUT_FMT_TEXT, vlog_unixctl_list_pattern, NULL); unixctl_command_register("vlog/enable-rate-limit", "[module]...", - 0, INT_MAX, vlog_enable_rate_limit, NULL); + 0, INT_MAX, OVS_OUTPUT_FMT_TEXT, + vlog_enable_rate_limit, NULL); unixctl_command_register("vlog/disable-rate-limit", "[module]...", - 0, INT_MAX, vlog_disable_rate_limit, NULL); - unixctl_command_register("vlog/reopen", "", 0, 0, + 0, INT_MAX, OVS_OUTPUT_FMT_TEXT, + vlog_disable_rate_limit, NULL); + unixctl_command_register("vlog/reopen", "", 0, 0, OVS_OUTPUT_FMT_TEXT, vlog_unixctl_reopen, NULL); - unixctl_command_register("vlog/close", "", 0, 0, + unixctl_command_register("vlog/close", "", 0, 0, OVS_OUTPUT_FMT_TEXT, vlog_unixctl_close, NULL); ovs_rwlock_rdlock(&pattern_rwlock); diff --git a/ofproto/bond.c b/ofproto/bond.c index cfdf44f85..fcab5f932 100644 --- a/ofproto/bond.c +++ b/ofproto/bond.c @@ -1472,6 +1472,7 @@ bond_lookup_member(struct bond *bond, const char *member_name) static void bond_unixctl_list(struct unixctl_conn *conn, int argc OVS_UNUSED, const char *argv[] OVS_UNUSED, + enum ovs_output_fmt fmt OVS_UNUSED, void *aux OVS_UNUSED) { struct ds ds = DS_EMPTY_INITIALIZER; @@ -1617,6 +1618,7 @@ bond_print_details(struct ds *ds, const struct bond *bond) static void bond_unixctl_show(struct unixctl_conn *conn, int argc, const char *argv[], + enum ovs_output_fmt fmt OVS_UNUSED, void *aux OVS_UNUSED) { struct ds ds = DS_EMPTY_INITIALIZER; @@ -1648,6 +1650,7 @@ out: static void bond_unixctl_migrate(struct unixctl_conn *conn, int argc OVS_UNUSED, const char *argv[], + enum ovs_output_fmt fmt OVS_UNUSED, void *aux OVS_UNUSED) { const char *bond_s = argv[1]; @@ -1701,6 +1704,7 @@ out: static void bond_unixctl_set_active_member(struct unixctl_conn *conn, int argc OVS_UNUSED, const char *argv[], + enum ovs_output_fmt fmt OVS_UNUSED, void *aux OVS_UNUSED) { const char *bond_s = argv[1]; @@ -1773,6 +1777,7 @@ out: static void bond_unixctl_enable_member(struct unixctl_conn *conn, int argc OVS_UNUSED, const char *argv[], + enum ovs_output_fmt fmt OVS_UNUSED, void *aux OVS_UNUSED) { enable_member(conn, argv, true); @@ -1781,6 +1786,7 @@ bond_unixctl_enable_member(struct unixctl_conn *conn, static void bond_unixctl_disable_member(struct unixctl_conn *conn, int argc OVS_UNUSED, const char *argv[], + enum ovs_output_fmt fmt OVS_UNUSED, void *aux OVS_UNUSED) { enable_member(conn, argv, false); @@ -1788,6 +1794,7 @@ bond_unixctl_disable_member(struct unixctl_conn *conn, static void bond_unixctl_hash(struct unixctl_conn *conn, int argc, const char *argv[], + enum ovs_output_fmt fmt OVS_UNUSED, void *aux OVS_UNUSED) { const char *mac_s = argv[1]; @@ -1831,27 +1838,34 @@ bond_unixctl_hash(struct unixctl_conn *conn, int argc, const char *argv[], void bond_init(void) { - unixctl_command_register("bond/list", "", 0, 0, bond_unixctl_list, NULL); - unixctl_command_register("bond/show", "[port]", 0, 1, bond_unixctl_show, - NULL); + unixctl_command_register("bond/list", "", 0, 0, OVS_OUTPUT_FMT_TEXT, + bond_unixctl_list, NULL); + unixctl_command_register("bond/show", "[port]", 0, 1, OVS_OUTPUT_FMT_TEXT, + bond_unixctl_show, NULL); unixctl_command_register("bond/migrate", "port hash member", 3, 3, - bond_unixctl_migrate, NULL); + OVS_OUTPUT_FMT_TEXT, bond_unixctl_migrate, NULL); unixctl_command_register("bond/set-active-member", "port member", 2, 2, + OVS_OUTPUT_FMT_TEXT, bond_unixctl_set_active_member, NULL); unixctl_command_register("bond/enable-member", "port member", 2, 2, - bond_unixctl_enable_member, NULL); + OVS_OUTPUT_FMT_TEXT, bond_unixctl_enable_member, + NULL); unixctl_command_register("bond/disable-member", "port member", 2, 2, - bond_unixctl_disable_member, NULL); + OVS_OUTPUT_FMT_TEXT, bond_unixctl_disable_member, + NULL); unixctl_command_register("bond/hash", "mac [vlan] [basis]", 1, 3, - bond_unixctl_hash, NULL); + OVS_OUTPUT_FMT_TEXT, bond_unixctl_hash, NULL); /* Backward-compatibility command names. */ unixctl_command_register("bond/set-active-slave", NULL, 2, 2, + OVS_OUTPUT_FMT_TEXT, bond_unixctl_set_active_member, NULL); unixctl_command_register("bond/enable-slave", NULL, 2, 2, - bond_unixctl_enable_member, NULL); + OVS_OUTPUT_FMT_TEXT, bond_unixctl_enable_member, + NULL); unixctl_command_register("bond/disable-slave", NULL, 2, 2, - bond_unixctl_disable_member, NULL); + OVS_OUTPUT_FMT_TEXT, bond_unixctl_disable_member, + NULL); } static void diff --git a/ofproto/ofproto-dpif-trace.c b/ofproto/ofproto-dpif-trace.c index b86e7fe07..77b424452 100644 --- a/ofproto/ofproto-dpif-trace.c +++ b/ofproto/ofproto-dpif-trace.c @@ -471,6 +471,7 @@ free_ct_states(struct ovs_list *ct_states) static void ofproto_unixctl_trace(struct unixctl_conn *conn, int argc, const char *argv[], + enum ovs_output_fmt fmt OVS_UNUSED, void *aux OVS_UNUSED) { struct ofproto_dpif *ofproto; @@ -500,7 +501,9 @@ ofproto_unixctl_trace(struct unixctl_conn *conn, int argc, const char *argv[], static void ofproto_unixctl_trace_actions(struct unixctl_conn *conn, int argc, - const char *argv[], void *aux OVS_UNUSED) + const char *argv[], + enum ovs_output_fmt fmt OVS_UNUSED, + void *aux OVS_UNUSED) { enum ofputil_protocol usable_protocols; struct ofproto_dpif *ofproto; @@ -870,12 +873,13 @@ ofproto_dpif_trace_init(void) unixctl_command_register( "ofproto/trace", "{[dp_name] odp_flow | bridge br_flow} [OPTIONS...] " - "[-generate|packet]", 1, INT_MAX, ofproto_unixctl_trace, NULL); + "[-generate|packet]", 1, INT_MAX, OVS_OUTPUT_FMT_TEXT, + ofproto_unixctl_trace, NULL); unixctl_command_register( "ofproto/trace-packet-out", "[-consistent] {[dp_name] odp_flow | bridge br_flow} [OPTIONS...] " "[-generate|packet] actions", - 2, INT_MAX, ofproto_unixctl_trace_actions, NULL); + 2, INT_MAX, OVS_OUTPUT_FMT_TEXT, ofproto_unixctl_trace_actions, NULL); } void diff --git a/ofproto/ofproto-dpif-upcall.c b/ofproto/ofproto-dpif-upcall.c index b5cbeed87..764178578 100644 --- a/ofproto/ofproto-dpif-upcall.c +++ b/ofproto/ofproto-dpif-upcall.c @@ -357,25 +357,38 @@ static void revalidator_pause(struct revalidator *); static void revalidator_sweep(struct revalidator *); static void revalidator_purge(struct revalidator *); static void upcall_unixctl_show(struct unixctl_conn *conn, int argc, - const char *argv[], void *aux); + const char *argv[], + enum ovs_output_fmt fmt, + void *aux); static void upcall_unixctl_disable_megaflows(struct unixctl_conn *, int argc, - const char *argv[], void *aux); + const char *argv[], + enum ovs_output_fmt fmt, + void *aux); static void upcall_unixctl_enable_megaflows(struct unixctl_conn *, int argc, - const char *argv[], void *aux); + const char *argv[], + enum ovs_output_fmt fmt, + void *aux); static void upcall_unixctl_disable_ufid(struct unixctl_conn *, int argc, - const char *argv[], void *aux); + const char *argv[], + enum ovs_output_fmt fmt, void *aux); static void upcall_unixctl_enable_ufid(struct unixctl_conn *, int argc, - const char *argv[], void *aux); + const char *argv[], + enum ovs_output_fmt fmt, void *aux); static void upcall_unixctl_set_flow_limit(struct unixctl_conn *conn, int argc, - const char *argv[], void *aux); + const char *argv[], + enum ovs_output_fmt fmt, void *aux); static void upcall_unixctl_dump_wait(struct unixctl_conn *conn, int argc, - const char *argv[], void *aux); + const char *argv[], + enum ovs_output_fmt fmt, void *aux); static void upcall_unixctl_purge(struct unixctl_conn *conn, int argc, - const char *argv[], void *aux); + const char *argv[], enum ovs_output_fmt fmt, + void *aux); static void upcall_unixctl_pause(struct unixctl_conn *conn, int argc, - const char *argv[], void *aux); + const char *argv[], enum ovs_output_fmt fmt, + void *aux); static void upcall_unixctl_resume(struct unixctl_conn *conn, int argc, - const char *argv[], void *aux); + const char *argv[], enum ovs_output_fmt fmt, + void *aux); static struct udpif_key *ukey_create_from_upcall(struct upcall *, struct flow_wildcards *); @@ -433,26 +446,36 @@ udpif_init(void) { static struct ovsthread_once once = OVSTHREAD_ONCE_INITIALIZER; if (ovsthread_once_start(&once)) { - unixctl_command_register("upcall/show", "", 0, 0, upcall_unixctl_show, + unixctl_command_register("upcall/show", "", 0, 0, OVS_OUTPUT_FMT_TEXT, + upcall_unixctl_show, NULL); unixctl_command_register("upcall/disable-megaflows", "", 0, 0, + OVS_OUTPUT_FMT_TEXT, upcall_unixctl_disable_megaflows, NULL); unixctl_command_register("upcall/enable-megaflows", "", 0, 0, + OVS_OUTPUT_FMT_TEXT, upcall_unixctl_enable_megaflows, NULL); unixctl_command_register("upcall/disable-ufid", "", 0, 0, + OVS_OUTPUT_FMT_TEXT, upcall_unixctl_disable_ufid, NULL); unixctl_command_register("upcall/enable-ufid", "", 0, 0, + OVS_OUTPUT_FMT_TEXT, upcall_unixctl_enable_ufid, NULL); unixctl_command_register("upcall/set-flow-limit", "flow-limit-number", - 1, 1, upcall_unixctl_set_flow_limit, NULL); + 1, 1, OVS_OUTPUT_FMT_TEXT, + upcall_unixctl_set_flow_limit, NULL); unixctl_command_register("revalidator/wait", "", 0, 0, + OVS_OUTPUT_FMT_TEXT, upcall_unixctl_dump_wait, NULL); unixctl_command_register("revalidator/purge", "", 0, 0, - upcall_unixctl_purge, NULL); + OVS_OUTPUT_FMT_TEXT, upcall_unixctl_purge, + NULL); unixctl_command_register("revalidator/pause", NULL, 0, 0, - upcall_unixctl_pause, NULL); + OVS_OUTPUT_FMT_TEXT, upcall_unixctl_pause, + NULL); unixctl_command_register("revalidator/resume", NULL, 0, 0, - upcall_unixctl_resume, NULL); + OVS_OUTPUT_FMT_TEXT, upcall_unixctl_resume, + NULL); ovsthread_once_done(&once); } } @@ -3078,7 +3101,9 @@ dp_purge_cb(void *aux, unsigned pmd_id) static void upcall_unixctl_show(struct unixctl_conn *conn, int argc OVS_UNUSED, - const char *argv[] OVS_UNUSED, void *aux OVS_UNUSED) + const char *argv[] OVS_UNUSED, + enum ovs_output_fmt fmt OVS_UNUSED, + void *aux OVS_UNUSED) { struct ds ds = DS_EMPTY_INITIALIZER; uint64_t n_offloaded_flows; @@ -3132,6 +3157,7 @@ static void upcall_unixctl_disable_megaflows(struct unixctl_conn *conn, int argc OVS_UNUSED, const char *argv[] OVS_UNUSED, + enum ovs_output_fmt fmt OVS_UNUSED, void *aux OVS_UNUSED) { atomic_store_relaxed(&enable_megaflows, false); @@ -3147,6 +3173,7 @@ static void upcall_unixctl_enable_megaflows(struct unixctl_conn *conn, int argc OVS_UNUSED, const char *argv[] OVS_UNUSED, + enum ovs_output_fmt fmt OVS_UNUSED, void *aux OVS_UNUSED) { atomic_store_relaxed(&enable_megaflows, true); @@ -3160,7 +3187,9 @@ upcall_unixctl_enable_megaflows(struct unixctl_conn *conn, * documented in the man page. */ static void upcall_unixctl_disable_ufid(struct unixctl_conn *conn, int argc OVS_UNUSED, - const char *argv[] OVS_UNUSED, void *aux OVS_UNUSED) + const char *argv[] OVS_UNUSED, + enum ovs_output_fmt fmt OVS_UNUSED, + void *aux OVS_UNUSED) { atomic_store_relaxed(&enable_ufid, false); unixctl_command_reply(conn, "Datapath dumping tersely using UFID disabled"); @@ -3172,7 +3201,9 @@ upcall_unixctl_disable_ufid(struct unixctl_conn *conn, int argc OVS_UNUSED, * in the man page. */ static void upcall_unixctl_enable_ufid(struct unixctl_conn *conn, int argc OVS_UNUSED, - const char *argv[] OVS_UNUSED, void *aux OVS_UNUSED) + const char *argv[] OVS_UNUSED, + enum ovs_output_fmt fmt OVS_UNUSED, + void *aux OVS_UNUSED) { atomic_store_relaxed(&enable_ufid, true); unixctl_command_reply(conn, "Datapath dumping tersely using UFID enabled " @@ -3187,6 +3218,7 @@ static void upcall_unixctl_set_flow_limit(struct unixctl_conn *conn, int argc OVS_UNUSED, const char *argv[], + enum ovs_output_fmt fmt OVS_UNUSED, void *aux OVS_UNUSED) { struct ds ds = DS_EMPTY_INITIALIZER; @@ -3205,6 +3237,7 @@ static void upcall_unixctl_dump_wait(struct unixctl_conn *conn, int argc OVS_UNUSED, const char *argv[] OVS_UNUSED, + enum ovs_output_fmt fmt OVS_UNUSED, void *aux OVS_UNUSED) { if (ovs_list_is_singleton(&all_udpifs)) { @@ -3223,7 +3256,9 @@ upcall_unixctl_dump_wait(struct unixctl_conn *conn, static void upcall_unixctl_purge(struct unixctl_conn *conn, int argc OVS_UNUSED, - const char *argv[] OVS_UNUSED, void *aux OVS_UNUSED) + const char *argv[] OVS_UNUSED, + enum ovs_output_fmt fmt OVS_UNUSED, + void *aux OVS_UNUSED) { struct udpif *udpif; @@ -3247,7 +3282,9 @@ upcall_unixctl_purge(struct unixctl_conn *conn, int argc OVS_UNUSED, static void upcall_unixctl_pause(struct unixctl_conn *conn, int argc OVS_UNUSED, - const char *argv[] OVS_UNUSED, void *aux OVS_UNUSED) + const char *argv[] OVS_UNUSED, + enum ovs_output_fmt fmt OVS_UNUSED, + void *aux OVS_UNUSED) { struct udpif *udpif; @@ -3259,7 +3296,9 @@ upcall_unixctl_pause(struct unixctl_conn *conn, int argc OVS_UNUSED, static void upcall_unixctl_resume(struct unixctl_conn *conn, int argc OVS_UNUSED, - const char *argv[] OVS_UNUSED, void *aux OVS_UNUSED) + const char *argv[] OVS_UNUSED, + enum ovs_output_fmt fmt OVS_UNUSED, + void *aux OVS_UNUSED) { struct udpif *udpif; diff --git a/ofproto/ofproto-dpif.c b/ofproto/ofproto-dpif.c index 6e62ed1f9..baba72c56 100644 --- a/ofproto/ofproto-dpif.c +++ b/ofproto/ofproto-dpif.c @@ -5892,7 +5892,9 @@ ofproto_dpif_lookup_by_uuid(const struct uuid *uuid) static void ofproto_unixctl_fdb_flush(struct unixctl_conn *conn, int argc, - const char *argv[], void *aux OVS_UNUSED) + const char *argv[], + enum ovs_output_fmt fmt OVS_UNUSED, + void *aux OVS_UNUSED) { struct ofproto_dpif *ofproto; @@ -5919,7 +5921,9 @@ ofproto_unixctl_fdb_flush(struct unixctl_conn *conn, int argc, static void ofproto_unixctl_mcast_snooping_flush(struct unixctl_conn *conn, int argc, - const char *argv[], void *aux OVS_UNUSED) + const char *argv[], + enum ovs_output_fmt fmt OVS_UNUSED, + void *aux OVS_UNUSED) { struct ofproto_dpif *ofproto; @@ -5957,7 +5961,9 @@ ofbundle_get_a_port(const struct ofbundle *bundle) static void ofproto_unixctl_fdb_show(struct unixctl_conn *conn, int argc OVS_UNUSED, - const char *argv[], void *aux OVS_UNUSED) + const char *argv[], + enum ovs_output_fmt fmt OVS_UNUSED, + void *aux OVS_UNUSED) { struct ds ds = DS_EMPTY_INITIALIZER; const struct ofproto_dpif *ofproto; @@ -5993,7 +5999,9 @@ ofproto_unixctl_fdb_show(struct unixctl_conn *conn, int argc OVS_UNUSED, static void ofproto_unixctl_fdb_add(struct unixctl_conn *conn, int argc OVS_UNUSED, - const char *argv[], void *aux OVS_UNUSED) + const char *argv[], + enum ovs_output_fmt fmt OVS_UNUSED, + void *aux OVS_UNUSED) { const struct ofproto_dpif *ofproto; const struct mac_entry *mac_entry; @@ -6058,7 +6066,9 @@ ofproto_unixctl_fdb_add(struct unixctl_conn *conn, int argc OVS_UNUSED, static void ofproto_unixctl_fdb_delete(struct unixctl_conn *conn, int argc OVS_UNUSED, - const char *argv[], void *aux OVS_UNUSED) + const char *argv[], + enum ovs_output_fmt fmt OVS_UNUSED, + void *aux OVS_UNUSED) { const struct ofproto_dpif *ofproto; const char *br_name = argv[1]; @@ -6084,7 +6094,9 @@ ofproto_unixctl_fdb_delete(struct unixctl_conn *conn, int argc OVS_UNUSED, static void ofproto_unixctl_fdb_stats_clear(struct unixctl_conn *conn, int argc, - const char *argv[], void *aux OVS_UNUSED) + const char *argv[], + enum ovs_output_fmt fmt OVS_UNUSED, + void *aux OVS_UNUSED) { struct ofproto_dpif *ofproto; @@ -6111,7 +6123,9 @@ ofproto_unixctl_fdb_stats_clear(struct unixctl_conn *conn, int argc, static void ofproto_unixctl_fdb_stats_show(struct unixctl_conn *conn, int argc OVS_UNUSED, - const char *argv[], void *aux OVS_UNUSED) + const char *argv[], + enum ovs_output_fmt fmt OVS_UNUSED, + void *aux OVS_UNUSED) { struct ds ds = DS_EMPTY_INITIALIZER; const struct ofproto_dpif *ofproto; @@ -6152,6 +6166,7 @@ static void ofproto_unixctl_mcast_snooping_show(struct unixctl_conn *conn, int argc OVS_UNUSED, const char *argv[], + enum ovs_output_fmt fmt OVS_UNUSED, void *aux OVS_UNUSED) { struct ds ds = DS_EMPTY_INITIALIZER; @@ -6224,6 +6239,7 @@ get_ofprotos(struct shash *ofproto_shash) static void ofproto_unixctl_dpif_dump_dps(struct unixctl_conn *conn, int argc OVS_UNUSED, const char *argv[] OVS_UNUSED, + enum ovs_output_fmt fmt OVS_UNUSED, void *aux OVS_UNUSED) { struct ds ds = DS_EMPTY_INITIALIZER; @@ -6470,7 +6486,9 @@ dpif_show_backer(const struct dpif_backer *backer, struct ds *ds) static void ofproto_unixctl_dpif_show(struct unixctl_conn *conn, int argc OVS_UNUSED, - const char *argv[] OVS_UNUSED, void *aux OVS_UNUSED) + const char *argv[] OVS_UNUSED, + enum ovs_output_fmt fmt OVS_UNUSED, + void *aux OVS_UNUSED) { struct ds ds = DS_EMPTY_INITIALIZER; const struct shash_node **backers; @@ -6489,6 +6507,7 @@ ofproto_unixctl_dpif_show(struct unixctl_conn *conn, int argc OVS_UNUSED, static void ofproto_unixctl_dpif_dump_flows(struct unixctl_conn *conn, int argc OVS_UNUSED, const char *argv[], + enum ovs_output_fmt fmt OVS_UNUSED, void *aux OVS_UNUSED) { const struct ofproto_dpif *ofproto; @@ -6583,6 +6602,7 @@ ofproto_unixctl_dpif_dump_flows(struct unixctl_conn *conn, static void ofproto_unixctl_dpif_show_dp_features(struct unixctl_conn *conn, int argc, const char *argv[], + enum ovs_output_fmt fmt OVS_UNUSED, void *aux OVS_UNUSED) { struct ds ds = DS_EMPTY_INITIALIZER; @@ -6602,6 +6622,7 @@ ofproto_unixctl_dpif_show_dp_features(struct unixctl_conn *conn, static void ofproto_unixctl_dpif_set_dp_features(struct unixctl_conn *conn, int argc, const char *argv[], + enum ovs_output_fmt fmt OVS_UNUSED, void *aux OVS_UNUSED) { struct ds ds = DS_EMPTY_INITIALIZER; @@ -6638,31 +6659,40 @@ ofproto_unixctl_init(void) registered = true; unixctl_command_register("fdb/add", "bridge port vlan mac", 4, 4, - ofproto_unixctl_fdb_add, NULL); + OVS_OUTPUT_FMT_TEXT, ofproto_unixctl_fdb_add, + NULL); unixctl_command_register("fdb/del", "bridge vlan mac", 3, 3, - ofproto_unixctl_fdb_delete, NULL); + OVS_OUTPUT_FMT_TEXT, ofproto_unixctl_fdb_delete, + NULL); unixctl_command_register("fdb/flush", "[bridge]", 0, 1, - ofproto_unixctl_fdb_flush, NULL); - unixctl_command_register("fdb/show", "bridge", 1, 1, + OVS_OUTPUT_FMT_TEXT, ofproto_unixctl_fdb_flush, + NULL); + unixctl_command_register("fdb/show", "bridge", 1, 1, OVS_OUTPUT_FMT_TEXT, ofproto_unixctl_fdb_show, NULL); unixctl_command_register("fdb/stats-clear", "[bridge]", 0, 1, + OVS_OUTPUT_FMT_TEXT, ofproto_unixctl_fdb_stats_clear, NULL); unixctl_command_register("fdb/stats-show", "bridge", 1, 1, + OVS_OUTPUT_FMT_TEXT, ofproto_unixctl_fdb_stats_show, NULL); unixctl_command_register("mdb/flush", "[bridge]", 0, 1, + OVS_OUTPUT_FMT_TEXT, ofproto_unixctl_mcast_snooping_flush, NULL); - unixctl_command_register("mdb/show", "bridge", 1, 1, + unixctl_command_register("mdb/show", "bridge", 1, 1, OVS_OUTPUT_FMT_TEXT, ofproto_unixctl_mcast_snooping_show, NULL); - unixctl_command_register("dpif/dump-dps", "", 0, 0, + unixctl_command_register("dpif/dump-dps", "", 0, 0, OVS_OUTPUT_FMT_TEXT, ofproto_unixctl_dpif_dump_dps, NULL); - unixctl_command_register("dpif/show", "", 0, 0, ofproto_unixctl_dpif_show, - NULL); + unixctl_command_register("dpif/show", "", 0, 0, OVS_OUTPUT_FMT_TEXT, + ofproto_unixctl_dpif_show, NULL); unixctl_command_register("dpif/show-dp-features", "bridge", 1, 1, + OVS_OUTPUT_FMT_TEXT, ofproto_unixctl_dpif_show_dp_features, NULL); unixctl_command_register("dpif/dump-flows", "[-m] [--names | --no-names] bridge", 1, INT_MAX, + OVS_OUTPUT_FMT_TEXT, ofproto_unixctl_dpif_dump_flows, NULL); - unixctl_command_register("dpif/set-dp-features", "bridge", 1, 3 , + unixctl_command_register("dpif/set-dp-features", "bridge", 1, 3, + OVS_OUTPUT_FMT_TEXT, ofproto_unixctl_dpif_set_dp_features, NULL); } diff --git a/ofproto/ofproto.c b/ofproto/ofproto.c index 122a06f30..3eea543dd 100644 --- a/ofproto/ofproto.c +++ b/ofproto/ofproto.c @@ -6389,7 +6389,7 @@ handle_flow_mod__(struct ofproto *ofproto, const struct ofputil_flow_mod *fm, error = ofproto_flow_mod_start(ofproto, &ofm); if (!error) { ofproto_bump_tables_version(ofproto); - error = ofproto_flow_mod_finish(ofproto, &ofm, req); + error = ofproto_flow_mod_finish(ofproto, &ofm, req); ofmonitor_flush(ofproto->connmgr); } ovs_mutex_unlock(&ofproto_mutex); @@ -8460,7 +8460,7 @@ do_bundle_commit(struct ofconn *ofconn, uint32_t id, uint16_t flags) /* Send error referring to the original message. */ ofconn_send_error(ofconn, be->msg, error); error = OFPERR_OFPBFC_MSG_FAILED; - + /* 2. Revert. Undo all the changes made above. */ LIST_FOR_EACH_REVERSE_CONTINUE(be, node, &bundle->msg_list) { if (be->type == OFPTYPE_FLOW_MOD) { @@ -9476,7 +9476,9 @@ ofproto_lookup(const char *name) static void ofproto_unixctl_list(struct unixctl_conn *conn, int argc OVS_UNUSED, - const char *argv[] OVS_UNUSED, void *aux OVS_UNUSED) + const char *argv[] OVS_UNUSED, + enum ovs_output_fmt fmt OVS_UNUSED, + void *aux OVS_UNUSED) { struct ofproto *ofproto; struct ds results; @@ -9498,7 +9500,7 @@ ofproto_unixctl_init(void) } registered = true; - unixctl_command_register("ofproto/list", "", 0, 0, + unixctl_command_register("ofproto/list", "", 0, 0, OVS_OUTPUT_FMT_TEXT, ofproto_unixctl_list, NULL); } diff --git a/ofproto/tunnel.c b/ofproto/tunnel.c index 80ddee78a..3a7e1594d 100644 --- a/ofproto/tunnel.c +++ b/ofproto/tunnel.c @@ -141,7 +141,7 @@ ofproto_tunnel_init(void) if (ovsthread_once_start(&once)) { fat_rwlock_init(&rwlock); unixctl_command_register("ofproto/list-tunnels", "", 0, 0, - tnl_unixctl_list, NULL); + OVS_OUTPUT_FMT_TEXT, tnl_unixctl_list, NULL); ovsthread_once_done(&once); } } @@ -757,7 +757,7 @@ tnl_port_build_header(const struct ofport_dpif *ofport, static void tnl_unixctl_list(struct unixctl_conn *conn, int argc OVS_UNUSED, const char *argv[] OVS_UNUSED, - void *aux OVS_UNUSED) + enum ovs_output_fmt fmt OVS_UNUSED, void *aux OVS_UNUSED) { struct ds reply = DS_EMPTY_INITIALIZER; diff --git a/ovsdb/file.c b/ovsdb/file.c index 77a89fd1a..2d18538cf 100644 --- a/ovsdb/file.c +++ b/ovsdb/file.c @@ -62,6 +62,7 @@ static bool use_column_diff = true; static void ovsdb_file_column_diff_enable(struct unixctl_conn *conn, int argc OVS_UNUSED, const char *argv[] OVS_UNUSED, + enum ovs_output_fmt fmt OVS_UNUSED, void *arg OVS_UNUSED) { use_column_diff = true; @@ -76,7 +77,8 @@ ovsdb_file_column_diff_disable(void) } use_column_diff = false; unixctl_command_register("ovsdb/file/column-diff-enable", "", - 0, 0, ovsdb_file_column_diff_enable, NULL); + 0, 0, OVS_OUTPUT_FMT_TEXT, + ovsdb_file_column_diff_enable, NULL); } static struct ovsdb_error * diff --git a/ovsdb/ovsdb-client.c b/ovsdb/ovsdb-client.c index 7249805ba..50de20ee1 100644 --- a/ovsdb/ovsdb-client.c +++ b/ovsdb/ovsdb-client.c @@ -1253,7 +1253,8 @@ parse_monitor_columns(char *arg, const char *server, const char *database, static void ovsdb_client_exit(struct unixctl_conn *conn, int argc OVS_UNUSED, - const char *argv[] OVS_UNUSED, void *exiting_) + const char *argv[] OVS_UNUSED, + enum ovs_output_fmt fmt OVS_UNUSED, void *exiting_) { bool *exiting = exiting_; *exiting = true; @@ -1262,7 +1263,8 @@ ovsdb_client_exit(struct unixctl_conn *conn, int argc OVS_UNUSED, static void ovsdb_client_block(struct unixctl_conn *conn, int argc OVS_UNUSED, - const char *argv[] OVS_UNUSED, void *blocked_) + const char *argv[] OVS_UNUSED, + enum ovs_output_fmt fmt OVS_UNUSED, void *blocked_) { bool *blocked = blocked_; @@ -1276,7 +1278,8 @@ ovsdb_client_block(struct unixctl_conn *conn, int argc OVS_UNUSED, static void ovsdb_client_unblock(struct unixctl_conn *conn, int argc OVS_UNUSED, - const char *argv[] OVS_UNUSED, void *blocked_) + const char *argv[] OVS_UNUSED, + enum ovs_output_fmt fmt OVS_UNUSED, void *blocked_) { bool *blocked = blocked_; @@ -1290,7 +1293,8 @@ ovsdb_client_unblock(struct unixctl_conn *conn, int argc OVS_UNUSED, static void ovsdb_client_cond_change(struct unixctl_conn *conn, int argc OVS_UNUSED, - const char *argv[], void *rpc_) + const char *argv[], + enum ovs_output_fmt fmt OVS_UNUSED, void *rpc_) { struct jsonrpc *rpc = rpc_; struct json *monitor_cond_update_requests = json_object_create(); @@ -1404,13 +1408,16 @@ do_monitor__(struct jsonrpc *rpc, const char *database, ovs_fatal(error, "failed to create unixctl server"); } - unixctl_command_register("exit", "", 0, 0, + unixctl_command_register("exit", "", 0, 0, OVS_OUTPUT_FMT_TEXT, ovsdb_client_exit, &exiting); unixctl_command_register("ovsdb-client/block", "", 0, 0, - ovsdb_client_block, &blocked); + OVS_OUTPUT_FMT_TEXT, ovsdb_client_block, + &blocked); unixctl_command_register("ovsdb-client/unblock", "", 0, 0, - ovsdb_client_unblock, &blocked); + OVS_OUTPUT_FMT_TEXT, ovsdb_client_unblock, + &blocked); unixctl_command_register("ovsdb-client/cond_change", "TABLE COND", 2, 2, + OVS_OUTPUT_FMT_TEXT, ovsdb_client_cond_change, rpc); } else { unixctl = NULL; @@ -2244,7 +2251,9 @@ create_lock_request(struct ovsdb_client_lock_req *lock_req) static void ovsdb_client_lock(struct unixctl_conn *conn, int argc OVS_UNUSED, - const char *argv[], void *lock_req_) + const char *argv[], + enum ovs_output_fmt fmt OVS_UNUSED, + void *lock_req_) { struct ovsdb_client_lock_req *lock_req = lock_req_; lock_req_init(lock_req, "lock", argv[1]); @@ -2253,7 +2262,9 @@ ovsdb_client_lock(struct unixctl_conn *conn, int argc OVS_UNUSED, static void ovsdb_client_unlock(struct unixctl_conn *conn, int argc OVS_UNUSED, - const char *argv[], void *lock_req_) + const char *argv[], + enum ovs_output_fmt fmt OVS_UNUSED, + void *lock_req_) { struct ovsdb_client_lock_req *lock_req = lock_req_; lock_req_init(lock_req, "unlock", argv[1]); @@ -2262,7 +2273,8 @@ ovsdb_client_unlock(struct unixctl_conn *conn, int argc OVS_UNUSED, static void ovsdb_client_steal(struct unixctl_conn *conn, int argc OVS_UNUSED, - const char *argv[], void *lock_req_) + const char *argv[], enum ovs_output_fmt fmt OVS_UNUSED, + void *lock_req_) { struct ovsdb_client_lock_req *lock_req = lock_req_; lock_req_init(lock_req, "steal", argv[1]); @@ -2292,13 +2304,13 @@ do_lock(struct jsonrpc *rpc, const char *method, const char *lock) ovs_fatal(error, "failed to create unixctl server"); } - unixctl_command_register("unlock", "LOCK", 1, 1, + unixctl_command_register("unlock", "LOCK", 1, 1, OVS_OUTPUT_FMT_TEXT, ovsdb_client_unlock, &lock_req); - unixctl_command_register("steal", "LOCK", 1, 1, + unixctl_command_register("steal", "LOCK", 1, 1, OVS_OUTPUT_FMT_TEXT, ovsdb_client_steal, &lock_req); - unixctl_command_register("lock", "LOCK", 1, 1, + unixctl_command_register("lock", "LOCK", 1, 1, OVS_OUTPUT_FMT_TEXT, ovsdb_client_lock, &lock_req); - unixctl_command_register("exit", "", 0, 0, + unixctl_command_register("exit", "", 0, 0, OVS_OUTPUT_FMT_TEXT, ovsdb_client_exit, &exiting); } else { unixctl = NULL; diff --git a/ovsdb/ovsdb-server.c b/ovsdb/ovsdb-server.c index d45c9e5f3..1d91cc89a 100644 --- a/ovsdb/ovsdb-server.c +++ b/ovsdb/ovsdb-server.c @@ -818,72 +818,97 @@ main(int argc, char *argv[]) VLOG_INFO("%s (Open vSwitch) %s", program_name, VERSION); } - unixctl_command_register("exit", "", 0, 0, ovsdb_server_exit, &exiting); + unixctl_command_register("exit", "", 0, 0, OVS_OUTPUT_FMT_TEXT, + ovsdb_server_exit, &exiting); unixctl_command_register("ovsdb-server/compact", "", 0, 1, - ovsdb_server_compact, &all_dbs); + OVS_OUTPUT_FMT_TEXT, ovsdb_server_compact, + &all_dbs); unixctl_command_register("ovsdb-server/memory-trim-on-compaction", - "on|off", 1, 1, + "on|off", 1, 1, OVS_OUTPUT_FMT_TEXT, ovsdb_server_memory_trim_on_compaction, NULL); unixctl_command_register("ovsdb-server/reconnect", "", 0, 0, - ovsdb_server_reconnect, jsonrpc); + OVS_OUTPUT_FMT_TEXT, ovsdb_server_reconnect, + jsonrpc); unixctl_command_register("ovsdb-server/reload", "", 0, 0, - ovsdb_server_reload, &server_config); + OVS_OUTPUT_FMT_TEXT, ovsdb_server_reload, + &server_config); unixctl_command_register("ovsdb-server/add-remote", "REMOTE", 1, 1, - ovsdb_server_add_remote, &server_config); + OVS_OUTPUT_FMT_TEXT, ovsdb_server_add_remote, + &server_config); unixctl_command_register("ovsdb-server/remove-remote", "REMOTE", 1, 1, - ovsdb_server_remove_remote, &server_config); + OVS_OUTPUT_FMT_TEXT, ovsdb_server_remove_remote, + &server_config); unixctl_command_register("ovsdb-server/list-remotes", "", 0, 0, - ovsdb_server_list_remotes, &remotes); + OVS_OUTPUT_FMT_TEXT, ovsdb_server_list_remotes, + &remotes); unixctl_command_register("ovsdb-server/add-db", "DB", 1, 1, - ovsdb_server_add_database, &server_config); + OVS_OUTPUT_FMT_TEXT, ovsdb_server_add_database, + &server_config); unixctl_command_register("ovsdb-server/remove-db", "DB", 1, 1, - ovsdb_server_remove_database, &server_config); + OVS_OUTPUT_FMT_TEXT, ovsdb_server_remove_database, + &server_config); unixctl_command_register("ovsdb-server/list-dbs", "", 0, 0, - ovsdb_server_list_databases, &all_dbs); + OVS_OUTPUT_FMT_TEXT, ovsdb_server_list_databases, + &all_dbs); unixctl_command_register("ovsdb-server/tlog-set", "DB:TABLE on|off", - 2, 2, ovsdb_server_tlog_set, &all_dbs); + 2, 2, OVS_OUTPUT_FMT_TEXT, ovsdb_server_tlog_set, + &all_dbs); unixctl_command_register("ovsdb-server/tlog-list", "", - 0, 0, ovsdb_server_tlog_list, &all_dbs); + 0, 0, OVS_OUTPUT_FMT_TEXT, + ovsdb_server_tlog_list, &all_dbs); unixctl_command_register("ovsdb-server/perf-counters-show", "", 0, 0, + OVS_OUTPUT_FMT_TEXT, ovsdb_server_perf_counters_show, NULL); unixctl_command_register("ovsdb-server/perf-counters-clear", "", 0, 0, + OVS_OUTPUT_FMT_TEXT, ovsdb_server_perf_counters_clear, NULL); unixctl_command_register("ovsdb-server/set-active-ovsdb-server", "", 1, 1, + OVS_OUTPUT_FMT_TEXT, ovsdb_server_set_active_ovsdb_server, &server_config); unixctl_command_register("ovsdb-server/get-active-ovsdb-server", "", 0, 0, + OVS_OUTPUT_FMT_TEXT, ovsdb_server_get_active_ovsdb_server, &server_config); unixctl_command_register("ovsdb-server/connect-active-ovsdb-server", "", - 0, 0, ovsdb_server_connect_active_ovsdb_server, + 0, 0, OVS_OUTPUT_FMT_TEXT, + ovsdb_server_connect_active_ovsdb_server, &server_config); unixctl_command_register("ovsdb-server/disconnect-active-ovsdb-server", "", - 0, 0, ovsdb_server_disconnect_active_ovsdb_server, + 0, 0, OVS_OUTPUT_FMT_TEXT, + ovsdb_server_disconnect_active_ovsdb_server, &server_config); unixctl_command_register( "ovsdb-server/set-active-ovsdb-server-probe-interval", "", 1, 1, + OVS_OUTPUT_FMT_TEXT, ovsdb_server_set_active_ovsdb_server_probe_interval, &server_config); unixctl_command_register( "ovsdb-server/set-relay-source-probe-interval", "", 1, 1, + OVS_OUTPUT_FMT_TEXT, ovsdb_server_set_relay_source_interval, &server_config); unixctl_command_register("ovsdb-server/set-sync-exclude-tables", "", - 0, 1, ovsdb_server_set_sync_exclude_tables, + 0, 1, OVS_OUTPUT_FMT_TEXT, + ovsdb_server_set_sync_exclude_tables, &server_config); unixctl_command_register("ovsdb-server/get-sync-exclude-tables", "", - 0, 0, ovsdb_server_get_sync_exclude_tables, + 0, 0, OVS_OUTPUT_FMT_TEXT, + ovsdb_server_get_sync_exclude_tables, &server_config); unixctl_command_register("ovsdb-server/sync-status", "", - 0, 0, ovsdb_server_get_sync_status, + 0, 0, OVS_OUTPUT_FMT_TEXT, + ovsdb_server_get_sync_status, &server_config); unixctl_command_register("ovsdb-server/get-db-storage-status", "DB", 1, 1, + OVS_OUTPUT_FMT_TEXT, ovsdb_server_get_db_storage_status, &server_config); /* Simulate the behavior of OVS release prior to version 2.5 that * does not support the monitor_cond method. */ unixctl_command_register("ovsdb-server/disable-monitor-cond", "", 0, 0, + OVS_OUTPUT_FMT_TEXT, ovsdb_server_disable_monitor_cond, jsonrpc); main_loop(&server_config, jsonrpc, &all_dbs, unixctl, &remotes, @@ -1841,6 +1866,7 @@ check_config_file_on_unixctl(struct unixctl_conn *conn) static void ovsdb_server_set_active_ovsdb_server(struct unixctl_conn *conn, int argc OVS_UNUSED, const char *argv[], + enum ovs_output_fmt fmt OVS_UNUSED, void *config_) { struct server_config *config = config_; @@ -1871,6 +1897,7 @@ static void ovsdb_server_get_active_ovsdb_server(struct unixctl_conn *conn, int argc OVS_UNUSED, const char *argv[] OVS_UNUSED, + enum ovs_output_fmt fmt OVS_UNUSED, void *config_ ) { struct server_config *config = config_; @@ -1882,6 +1909,7 @@ static void ovsdb_server_connect_active_ovsdb_server(struct unixctl_conn *conn, int argc OVS_UNUSED, const char *argv[] OVS_UNUSED, + enum ovs_output_fmt fmt OVS_UNUSED, void *config_) { struct server_config *config = config_; @@ -1930,6 +1958,7 @@ static void ovsdb_server_disconnect_active_ovsdb_server(struct unixctl_conn *conn, int argc OVS_UNUSED, const char *argv[] OVS_UNUSED, + enum ovs_output_fmt fmt OVS_UNUSED, void *config_) { struct server_config *config = config_; @@ -1954,9 +1983,11 @@ ovsdb_server_disconnect_active_ovsdb_server(struct unixctl_conn *conn, static void ovsdb_server_set_active_ovsdb_server_probe_interval(struct unixctl_conn *conn, - int argc OVS_UNUSED, - const char *argv[], - void *config_) + int argc OVS_UNUSED, + const char *argv[], + enum ovs_output_fmt fmt + OVS_UNUSED, + void *config_) { struct server_config *config = config_; struct shash_node *node; @@ -1998,6 +2029,7 @@ static void ovsdb_server_set_relay_source_interval(struct unixctl_conn *conn, int argc OVS_UNUSED, const char *argv[], + enum ovs_output_fmt fmt OVS_UNUSED, void *config_) { struct server_config *config = config_; @@ -2035,6 +2067,7 @@ static void ovsdb_server_set_sync_exclude_tables(struct unixctl_conn *conn, int argc OVS_UNUSED, const char *argv[], + enum ovs_output_fmt fmt OVS_UNUSED, void *config_) { struct server_config *config = config_; @@ -2080,6 +2113,7 @@ static void ovsdb_server_get_sync_exclude_tables(struct unixctl_conn *conn, int argc OVS_UNUSED, const char *argv[] OVS_UNUSED, + enum ovs_output_fmt fmt OVS_UNUSED, void *config_) { struct server_config *config = config_; @@ -2090,6 +2124,7 @@ ovsdb_server_get_sync_exclude_tables(struct unixctl_conn *conn, static void ovsdb_server_exit(struct unixctl_conn *conn, int argc OVS_UNUSED, const char *argv[] OVS_UNUSED, + enum ovs_output_fmt fmt OVS_UNUSED, void *exiting_) { bool *exiting = exiting_; @@ -2100,6 +2135,7 @@ ovsdb_server_exit(struct unixctl_conn *conn, int argc OVS_UNUSED, static void ovsdb_server_perf_counters_show(struct unixctl_conn *conn, int argc OVS_UNUSED, const char *argv[] OVS_UNUSED, + enum ovs_output_fmt fmt OVS_UNUSED, void *arg_ OVS_UNUSED) { char *s = perf_counters_to_string(); @@ -2111,6 +2147,7 @@ ovsdb_server_perf_counters_show(struct unixctl_conn *conn, int argc OVS_UNUSED, static void ovsdb_server_perf_counters_clear(struct unixctl_conn *conn, int argc OVS_UNUSED, const char *argv[] OVS_UNUSED, + enum ovs_output_fmt fmt OVS_UNUSED, void *arg_ OVS_UNUSED) { perf_counters_clear(); @@ -2124,6 +2161,7 @@ static void ovsdb_server_disable_monitor_cond(struct unixctl_conn *conn, int argc OVS_UNUSED, const char *argv[] OVS_UNUSED, + enum ovs_output_fmt fmt OVS_UNUSED, void *jsonrpc_) { struct ovsdb_jsonrpc_server *jsonrpc = jsonrpc_; @@ -2136,7 +2174,8 @@ ovsdb_server_disable_monitor_cond(struct unixctl_conn *conn, static void ovsdb_server_compact(struct unixctl_conn *conn, int argc, - const char *argv[], void *dbs_) + const char *argv[], enum ovs_output_fmt fmt OVS_UNUSED, + void *dbs_) { const char *db_name = argc < 2 ? NULL : argv[1]; struct shash *all_dbs = dbs_; @@ -2199,6 +2238,7 @@ static void ovsdb_server_memory_trim_on_compaction(struct unixctl_conn *conn, int argc OVS_UNUSED, const char *argv[], + enum ovs_output_fmt fmt OVS_UNUSED, void *arg OVS_UNUSED) { bool old_trim_memory = trim_memory; @@ -2230,7 +2270,9 @@ ovsdb_server_memory_trim_on_compaction(struct unixctl_conn *conn, * connections and reconnect. */ static void ovsdb_server_reconnect(struct unixctl_conn *conn, int argc OVS_UNUSED, - const char *argv[] OVS_UNUSED, void *jsonrpc_) + const char *argv[] OVS_UNUSED, + enum ovs_output_fmt fmt OVS_UNUSED, + void *jsonrpc_) { struct ovsdb_jsonrpc_server *jsonrpc = jsonrpc_; ovsdb_jsonrpc_server_reconnect( @@ -2242,7 +2284,9 @@ ovsdb_server_reconnect(struct unixctl_conn *conn, int argc OVS_UNUSED, * 'config_file_path', read it and sync the runtime configuration with it. */ static void ovsdb_server_reload(struct unixctl_conn *conn, int argc OVS_UNUSED, - const char *argv[] OVS_UNUSED, void *config_) + const char *argv[] OVS_UNUSED, + enum ovs_output_fmt fmt OVS_UNUSED, + void *config_) { struct server_config *config = config_; @@ -2264,7 +2308,9 @@ ovsdb_server_reload(struct unixctl_conn *conn, int argc OVS_UNUSED, * ovsdb-server services. */ static void ovsdb_server_add_remote(struct unixctl_conn *conn, int argc OVS_UNUSED, - const char *argv[], void *config_) + const char *argv[], + enum ovs_output_fmt fmt OVS_UNUSED, + void *config_) { struct server_config *config = config_; const char *remote = argv[1]; @@ -2297,7 +2343,9 @@ ovsdb_server_add_remote(struct unixctl_conn *conn, int argc OVS_UNUSED, * that ovsdb-server services. */ static void ovsdb_server_remove_remote(struct unixctl_conn *conn, int argc OVS_UNUSED, - const char *argv[], void *config_) + const char *argv[], + enum ovs_output_fmt fmt OVS_UNUSED, + void *config_) { struct server_config *config = config_; struct ovsdb_jsonrpc_options *options; @@ -2319,7 +2367,9 @@ ovsdb_server_remove_remote(struct unixctl_conn *conn, int argc OVS_UNUSED, /* "ovsdb-server/list-remotes": outputs a list of configured rmeotes. */ static void ovsdb_server_list_remotes(struct unixctl_conn *conn, int argc OVS_UNUSED, - const char *argv[] OVS_UNUSED, void *remotes_) + const char *argv[] OVS_UNUSED, + enum ovs_output_fmt fmt OVS_UNUSED, + void *remotes_) { const struct shash *remotes = remotes_; const struct shash_node **list; @@ -2341,7 +2391,9 @@ ovsdb_server_list_remotes(struct unixctl_conn *conn, int argc OVS_UNUSED, /* "ovsdb-server/add-db DB": adds the DB to ovsdb-server. */ static void ovsdb_server_add_database(struct unixctl_conn *conn, int argc OVS_UNUSED, - const char *argv[], void *config_) + const char *argv[], + enum ovs_output_fmt fmt OVS_UNUSED, + void *config_) { struct server_config *config = config_; const char *filename = argv[1]; @@ -2384,7 +2436,9 @@ remove_db(struct server_config *config, struct shash_node *node, char *comment) static void ovsdb_server_remove_database(struct unixctl_conn *conn, int argc OVS_UNUSED, - const char *argv[], void *config_) + const char *argv[], + enum ovs_output_fmt fmt OVS_UNUSED, + void *config_) { struct server_config *config = config_; struct shash_node *node; @@ -2410,7 +2464,9 @@ ovsdb_server_remove_database(struct unixctl_conn *conn, int argc OVS_UNUSED, static void ovsdb_server_list_databases(struct unixctl_conn *conn, int argc OVS_UNUSED, - const char *argv[] OVS_UNUSED, void *all_dbs_) + const char *argv[] OVS_UNUSED, + enum ovs_output_fmt fmt OVS_UNUSED, + void *all_dbs_) { struct shash *all_dbs = all_dbs_; const struct shash_node **nodes; @@ -2435,7 +2491,9 @@ ovsdb_server_list_databases(struct unixctl_conn *conn, int argc OVS_UNUSED, static void ovsdb_server_tlog_set(struct unixctl_conn *conn, int argc OVS_UNUSED, - const char *argv[], void *all_dbs_) + const char *argv[], + enum ovs_output_fmt fmt OVS_UNUSED, + void *all_dbs_) { struct shash *all_dbs = all_dbs_; const char *name_ = argv[1]; @@ -2481,7 +2539,9 @@ out: static void ovsdb_server_tlog_list(struct unixctl_conn *conn, int argc OVS_UNUSED, - const char *argv[] OVS_UNUSED, void *all_dbs_) + const char *argv[] OVS_UNUSED, + enum ovs_output_fmt fmt OVS_UNUSED, + void *all_dbs_) { const struct shash_node **db_nodes; struct ds s = DS_EMPTY_INITIALIZER; @@ -2516,7 +2576,9 @@ ovsdb_server_tlog_list(struct unixctl_conn *conn, int argc OVS_UNUSED, static void ovsdb_server_get_sync_status(struct unixctl_conn *conn, int argc OVS_UNUSED, - const char *argv[] OVS_UNUSED, void *config_) + const char *argv[] OVS_UNUSED, + enum ovs_output_fmt fmt OVS_UNUSED, + void *config_) { struct server_config *config = config_; struct ds ds = DS_EMPTY_INITIALIZER; @@ -2557,6 +2619,7 @@ static void ovsdb_server_get_db_storage_status(struct unixctl_conn *conn, int argc OVS_UNUSED, const char *argv[], + enum ovs_output_fmt fmt OVS_UNUSED, void *config_) { struct server_config *config = config_; diff --git a/ovsdb/ovsdb.c b/ovsdb/ovsdb.c index 298616a64..fe6d24eaa 100644 --- a/ovsdb/ovsdb.c +++ b/ovsdb/ovsdb.c @@ -186,6 +186,7 @@ static bool use_no_data_conversion = true; static void ovsdb_no_data_conversion_enable(struct unixctl_conn *conn, int argc OVS_UNUSED, const char *argv[] OVS_UNUSED, + enum ovs_output_fmt fmt OVS_UNUSED, void *arg OVS_UNUSED) { use_no_data_conversion = true; @@ -200,7 +201,8 @@ ovsdb_no_data_conversion_disable(void) } use_no_data_conversion = false; unixctl_command_register("ovsdb/file/no-data-conversion-enable", "", - 0, 0, ovsdb_no_data_conversion_enable, NULL); + 0, 0, OVS_OUTPUT_FMT_TEXT, + ovsdb_no_data_conversion_enable, NULL); } /* Returns true if the database storage allows conversion records without diff --git a/ovsdb/raft.c b/ovsdb/raft.c index 8effd9ad1..a7d6e5a09 100644 --- a/ovsdb/raft.c +++ b/ovsdb/raft.c @@ -4603,6 +4603,7 @@ raft_lookup_by_name(const char *name) static void raft_unixctl_cid(struct unixctl_conn *conn, int argc OVS_UNUSED, const char *argv[], + enum ovs_output_fmt fmt OVS_UNUSED, void *aux OVS_UNUSED) { struct raft *raft = raft_lookup_by_name(argv[1]); @@ -4620,6 +4621,7 @@ raft_unixctl_cid(struct unixctl_conn *conn, static void raft_unixctl_sid(struct unixctl_conn *conn, int argc OVS_UNUSED, const char *argv[], + enum ovs_output_fmt fmt OVS_UNUSED, void *aux OVS_UNUSED) { struct raft *raft = raft_lookup_by_name(argv[1]); @@ -4651,6 +4653,7 @@ raft_put_sid(const char *title, const struct uuid *sid, static void raft_unixctl_status(struct unixctl_conn *conn, int argc OVS_UNUSED, const char *argv[], + enum ovs_output_fmt fmt OVS_UNUSED, void *aux OVS_UNUSED) { struct raft *raft = raft_lookup_by_name(argv[1]); @@ -4809,7 +4812,8 @@ raft_unixctl_leave__(struct unixctl_conn *conn, struct raft *raft) static void raft_unixctl_leave(struct unixctl_conn *conn, int argc OVS_UNUSED, - const char *argv[], void *aux OVS_UNUSED) + const char *argv[], enum ovs_output_fmt fmt OVS_UNUSED, + void *aux OVS_UNUSED) { struct raft *raft = raft_lookup_by_name(argv[1]); if (!raft) { @@ -4845,7 +4849,8 @@ raft_lookup_server_best_match(struct raft *raft, const char *id) static void raft_unixctl_kick(struct unixctl_conn *conn, int argc OVS_UNUSED, - const char *argv[], void *aux OVS_UNUSED) + const char *argv[], enum ovs_output_fmt fmt OVS_UNUSED, + void *aux OVS_UNUSED) { const char *cluster_name = argv[1]; const char *server_name = argv[2]; @@ -4918,6 +4923,7 @@ raft_log_election_timer(struct raft *raft) static void raft_unixctl_change_election_timer(struct unixctl_conn *conn, int argc OVS_UNUSED, const char *argv[], + enum ovs_output_fmt fmt OVS_UNUSED, void *aux OVS_UNUSED) { const char *cluster_name = argv[1]; @@ -4972,6 +4978,7 @@ raft_unixctl_change_election_timer(struct unixctl_conn *conn, static void raft_unixctl_set_backlog_threshold(struct unixctl_conn *conn, int argc OVS_UNUSED, const char *argv[], + enum ovs_output_fmt fmt OVS_UNUSED, void *aux OVS_UNUSED) { const char *cluster_name = argv[1]; @@ -5008,6 +5015,7 @@ raft_unixctl_set_backlog_threshold(struct unixctl_conn *conn, static void raft_unixctl_failure_test(struct unixctl_conn *conn OVS_UNUSED, int argc OVS_UNUSED, const char *argv[], + enum ovs_output_fmt fmt OVS_UNUSED, void *aux OVS_UNUSED) { const char *test = argv[1]; @@ -5062,22 +5070,24 @@ raft_init(void) if (!ovsthread_once_start(&once)) { return; } - unixctl_command_register("cluster/cid", "DB", 1, 1, + unixctl_command_register("cluster/cid", "DB", 1, 1, OVS_OUTPUT_FMT_TEXT, raft_unixctl_cid, NULL); - unixctl_command_register("cluster/sid", "DB", 1, 1, + unixctl_command_register("cluster/sid", "DB", 1, 1, OVS_OUTPUT_FMT_TEXT, raft_unixctl_sid, NULL); - unixctl_command_register("cluster/status", "DB", 1, 1, + unixctl_command_register("cluster/status", "DB", 1, 1, OVS_OUTPUT_FMT_TEXT, raft_unixctl_status, NULL); - unixctl_command_register("cluster/leave", "DB", 1, 1, + unixctl_command_register("cluster/leave", "DB", 1, 1, OVS_OUTPUT_FMT_TEXT, raft_unixctl_leave, NULL); unixctl_command_register("cluster/kick", "DB SERVER", 2, 2, - raft_unixctl_kick, NULL); + OVS_OUTPUT_FMT_TEXT, raft_unixctl_kick, NULL); unixctl_command_register("cluster/change-election-timer", "DB TIME", 2, 2, + OVS_OUTPUT_FMT_TEXT, raft_unixctl_change_election_timer, NULL); unixctl_command_register("cluster/set-backlog-threshold", - "DB N_MSGS N_BYTES", 3, 3, + "DB N_MSGS N_BYTES", 3, 3, OVS_OUTPUT_FMT_TEXT, raft_unixctl_set_backlog_threshold, NULL); unixctl_command_register("cluster/failure-test", "FAILURE SCENARIO", 1, 1, - raft_unixctl_failure_test, NULL); + OVS_OUTPUT_FMT_TEXT, raft_unixctl_failure_test, + NULL); ovsthread_once_done(&once); } diff --git a/python/ovs/unixctl/__init__.py b/python/ovs/unixctl/__init__.py index 6d9bd5715..ebbd28487 100644 --- a/python/ovs/unixctl/__init__.py +++ b/python/ovs/unixctl/__init__.py @@ -20,19 +20,16 @@ commands = {} class _UnixctlCommand(object): - # FIXME: Output format will be passed as 'output_fmts' to the command in - # later patch. - def __init__(self, usage, min_args, max_args, # FIXME: output_fmts, - callback, aux): + def __init__(self, usage, min_args, max_args, output_fmts, callback, aux): self.usage = usage self.min_args = min_args self.max_args = max_args - # FIXME: self.output_fmts = output_fmts + self.output_fmts = output_fmts self.callback = callback self.aux = aux -def _unixctl_help(conn, unused_argv, unused_aux): +def _unixctl_help(conn, unused_argv, unused_fmt, unused_aux): reply = "The available commands are:\n" command_names = sorted(commands.keys()) for name in command_names: @@ -46,8 +43,8 @@ def _unixctl_help(conn, unused_argv, unused_aux): conn.reply(reply) -def command_register_fmt(name, usage, min_args, max_args, output_fmts, - callback, aux): +def command_register(name, usage, min_args, max_args, output_fmts, callback, + aux): """ Registers a command with the given 'name' to be exposed by the UnixctlServer. 'usage' describes the arguments to the command; it is used only for presentation to the user in "help" output. 'output_fmts' is a @@ -71,29 +68,7 @@ def command_register_fmt(name, usage, min_args, max_args, output_fmts, if name not in commands: commands[name] = _UnixctlCommand(usage, min_args, max_args, - # FIXME: output_fmts, - callback, aux) - - -# FIXME: command_register() will be replaced with command_register_fmt() in a -# later patch of this series. It is is kept temporarily to reduce the -# amount of changes in this patch. -def command_register(name, usage, min_args, max_args, callback, aux): - """ Registers a command with the given 'name' to be exposed by the - UnixctlServer. 'usage' describes the arguments to the command; it is used - only for presentation to the user in "help" output. - - 'callback' is called when the command is received. It is passed a - UnixctlConnection object, the list of arguments as unicode strings, and - 'aux'. Normally 'callback' should reply by calling - UnixctlConnection.reply() or UnixctlConnection.reply_error() before it - returns, but if the command cannot be handled immediately, then it can - defer the reply until later. A given connection can only process a single - request at a time, so a reply must be made eventually to avoid blocking - that connection.""" - - command_register_fmt(name, usage, min_args, max_args, - ovs.util.OutputFormat.TEXT, callback, aux) + output_fmts, callback, aux) def socket_name_from_target(target): @@ -114,4 +89,5 @@ def socket_name_from_target(target): return 0, "%s/%s.%d.ctl" % (ovs.dirs.RUNDIR, target, pid) -command_register("help", "", 0, 0, _unixctl_help, None) +command_register("help", "", 0, 0, ovs.util.OutputFormat.TEXT, + _unixctl_help, None) diff --git a/python/ovs/unixctl/server.py b/python/ovs/unixctl/server.py index 1d7f3337d..062bc8d33 100644 --- a/python/ovs/unixctl/server.py +++ b/python/ovs/unixctl/server.py @@ -118,17 +118,11 @@ class UnixctlConnection(object): elif len(params) > command.max_args: error = '"%s" command takes at most %d arguments' \ % (method, command.max_args) - # FIXME: Uncomment when command.output_fmts is available - # elif self._fmt not in command.output_fmts: - # error = '"%s" command does not support output format' \ - # ' "%s" (supported: %d, requested: %d)' \ - # % (method, self._fmt.name.lower(), command.output_fmts, - # self._fmt) - # FIXME: Remove this check once output format will be passed to the - # command handler below. - elif self._fmt != ovs.util.OutputFormat.TEXT: - error = 'output format "%s" has not been implemented yet' \ - % self._fmt.name.lower() + elif self._fmt not in command.output_fmts: + error = '"%s" command does not support output format' \ + ' "%s" (supported: %d, requested: %d)' \ + % (method, self._fmt.name.lower(), command.output_fmts, + self._fmt) else: for param in params: if not isinstance(param, str): @@ -137,20 +131,19 @@ class UnixctlConnection(object): if error is None: unicode_params = [str(p) for p in params] - command.callback(self, unicode_params, # FIXME: self._fmt, - command.aux) + command.callback(self, unicode_params, self._fmt, command.aux) if error: self.reply_error(error) -def _unixctl_version(conn, unused_argv, version): +def _unixctl_version(conn, unused_argv, unused_fmt, version): assert isinstance(conn, UnixctlConnection) version = "%s (Open vSwitch) %s" % (ovs.util.PROGRAM_NAME, version) conn.reply(version) -def _unixctl_set_options(conn, argv, unused_aux): +def _unixctl_set_options(conn, argv, unused_fmt, unused_aux): assert isinstance(conn, UnixctlConnection) parser = argparse.ArgumentParser() @@ -159,7 +152,7 @@ def _unixctl_set_options(conn, argv, unused_aux): for fmt in ovs.util.OutputFormat]) try: - args = parser.parse_args(args=argv) + args = parser.parse_args(args=argv[1:]) except argparse.ArgumentError as e: conn.reply_error(str(e)) return @@ -239,10 +232,11 @@ class UnixctlServer(object): % path) return error, None - ovs.unixctl.command_register("version", "", 0, 0, _unixctl_version, - version) - + ovs.unixctl.command_register("version", "", 0, 0, + ovs.util.OutputFormat.TEXT, + _unixctl_version, version) ovs.unixctl.command_register("set-options", "[--format text|json]", 2, - 2, _unixctl_set_options, None) + 2, ovs.util.OutputFormat.TEXT, + _unixctl_set_options, None) return 0, UnixctlServer(listener) diff --git a/python/ovs/vlog.py b/python/ovs/vlog.py index 61f5928db..ba8701040 100644 --- a/python/ovs/vlog.py +++ b/python/ovs/vlog.py @@ -237,8 +237,10 @@ class Vlog(object): logger.disabled = True ovs.unixctl.command_register("vlog/reopen", "", 0, 0, + ovs.util.OutputFormat.TEXT, Vlog._unixctl_vlog_reopen, None) ovs.unixctl.command_register("vlog/close", "", 0, 0, + ovs.util.OutputFormat.TEXT, Vlog._unixctl_vlog_close, None) try: # Windows limitation on Python 2, sys.maxsize is a long number @@ -248,8 +250,10 @@ class Vlog(object): except AttributeError: maxsize_int = sys.maxsize ovs.unixctl.command_register("vlog/set", "spec", 1, maxsize_int, + ovs.util.OutputFormat.TEXT, Vlog._unixctl_vlog_set, None) ovs.unixctl.command_register("vlog/list", "", 0, 0, + ovs.util.OutputFormat.TEXT, Vlog._unixctl_vlog_list, None) @staticmethod @@ -406,7 +410,7 @@ class Vlog(object): Vlog.__file_handler.close() @staticmethod - def _unixctl_vlog_reopen(conn, unused_argv, unused_aux): + def _unixctl_vlog_reopen(conn, unused_argv, unused_fmt, unused_aux): if Vlog.__log_file: Vlog.reopen_log_file() conn.reply(None) @@ -414,7 +418,7 @@ class Vlog(object): conn.reply("Logging to file not configured") @staticmethod - def _unixctl_vlog_close(conn, unused_argv, unused_aux): + def _unixctl_vlog_close(conn, unused_argv, unused_fmt, unused_aux): if Vlog.__log_file: if sys.platform != 'win32': logger = logging.getLogger("file") @@ -424,7 +428,7 @@ class Vlog(object): conn.reply(None) @staticmethod - def _unixctl_vlog_set(conn, argv, unused_aux): + def _unixctl_vlog_set(conn, argv, unused_fmt, unused_aux): for arg in argv: msg = Vlog.set_levels_from_string(arg) if msg: @@ -433,7 +437,7 @@ class Vlog(object): conn.reply(None) @staticmethod - def _unixctl_vlog_list(conn, unused_argv, unused_aux): + def _unixctl_vlog_list(conn, unused_argv, unused_fmt, unused_aux): conn.reply(Vlog.get_levels()) diff --git a/tests/test-netflow.c b/tests/test-netflow.c index 7f89cfcae..b808cb9fd 100644 --- a/tests/test-netflow.c +++ b/tests/test-netflow.c @@ -201,7 +201,8 @@ test_netflow_main(int argc, char *argv[]) if (error) { ovs_fatal(error, "failed to create unixctl server"); } - unixctl_command_register("exit", "", 0, 0, test_netflow_exit, &exiting); + unixctl_command_register("exit", "", 0, 0, OVS_OUTPUT_FMT_TEXT, + test_netflow_exit, &exiting); daemonize_complete(); @@ -294,6 +295,7 @@ usage(void) static void test_netflow_exit(struct unixctl_conn *conn, int argc OVS_UNUSED, const char *argv[] OVS_UNUSED, + enum ovs_output_fmt fmt OVS_UNUSED, void *exiting_) { bool *exiting = exiting_; diff --git a/tests/test-sflow.c b/tests/test-sflow.c index 3c617bdd1..82ef66178 100644 --- a/tests/test-sflow.c +++ b/tests/test-sflow.c @@ -715,7 +715,8 @@ test_sflow_main(int argc, char *argv[]) if (error) { ovs_fatal(error, "failed to create unixctl server"); } - unixctl_command_register("exit", "", 0, 0, test_sflow_exit, &exiting); + unixctl_command_register("exit", "", 0, 0, OVS_OUTPUT_FMT_TEXT, + test_sflow_exit, &exiting); daemonize_complete(); @@ -804,6 +805,7 @@ usage(void) static void test_sflow_exit(struct unixctl_conn *conn, int argc OVS_UNUSED, const char *argv[] OVS_UNUSED, + enum ovs_output_fmt fmt OVS_UNUSED, void *exiting_) { bool *exiting = exiting_; diff --git a/tests/test-unixctl.c b/tests/test-unixctl.c index 9e8982789..e344a8203 100644 --- a/tests/test-unixctl.c +++ b/tests/test-unixctl.c @@ -33,7 +33,9 @@ OVS_NO_RETURN static void usage(void); static void test_unixctl_exit(struct unixctl_conn *conn, int argc OVS_UNUSED, - const char *argv[] OVS_UNUSED, void *exiting_) + const char *argv[] OVS_UNUSED, + enum ovs_output_fmt fmt OVS_UNUSED, + void *exiting_) { bool *exiting = exiting_; *exiting = true; @@ -42,21 +44,26 @@ test_unixctl_exit(struct unixctl_conn *conn, int argc OVS_UNUSED, static void test_unixctl_echo(struct unixctl_conn *conn, int argc OVS_UNUSED, - const char *argv[], void *aux OVS_UNUSED) + const char *argv[], + enum ovs_output_fmt fmt OVS_UNUSED, + void *aux OVS_UNUSED) { unixctl_command_reply(conn, argv[1]); } static void test_unixctl_echo_error(struct unixctl_conn *conn, int argc OVS_UNUSED, - const char *argv[], void *aux OVS_UNUSED) + const char *argv[], + enum ovs_output_fmt fmt OVS_UNUSED, + void *aux OVS_UNUSED) { unixctl_command_reply_error(conn, argv[1]); } static void test_unixctl_log(struct unixctl_conn *conn, int argc OVS_UNUSED, - const char *argv[], void *aux OVS_UNUSED) + const char *argv[], + enum ovs_output_fmt fmt OVS_UNUSED, void *aux OVS_UNUSED) { VLOG_INFO("%s", argv[1]); unixctl_command_reply(conn, NULL); @@ -64,7 +71,9 @@ test_unixctl_log(struct unixctl_conn *conn, int argc OVS_UNUSED, static void test_unixctl_block(struct unixctl_conn *conn OVS_UNUSED, int argc OVS_UNUSED, - const char *argv[] OVS_UNUSED, void *aux OVS_UNUSED) + const char *argv[] OVS_UNUSED, + enum ovs_output_fmt fmt OVS_UNUSED, + void *aux OVS_UNUSED) { VLOG_INFO("%s", argv[1]); unixctl_command_reply(conn, NULL); @@ -88,12 +97,16 @@ test_unixctl_main(int argc, char *argv[]) if (retval) { exit(EXIT_FAILURE); } - unixctl_command_register("exit", "", 0, 0, test_unixctl_exit, &exiting); - unixctl_command_register("echo", "ARG", 1, 1, test_unixctl_echo, NULL); - unixctl_command_register("echo_error", "ARG", 1, 1, + unixctl_command_register("exit", "", 0, 0, OVS_OUTPUT_FMT_TEXT, + test_unixctl_exit, &exiting); + unixctl_command_register("echo", "ARG", 1, 1, OVS_OUTPUT_FMT_TEXT, + test_unixctl_echo, NULL); + unixctl_command_register("echo_error", "ARG", 1, 1, OVS_OUTPUT_FMT_TEXT, test_unixctl_echo_error, NULL); - unixctl_command_register("log", "ARG", 1, 1, test_unixctl_log, NULL); - unixctl_command_register("block", "", 0, 0, test_unixctl_block, NULL); + unixctl_command_register("log", "ARG", 1, 1, OVS_OUTPUT_FMT_TEXT, + test_unixctl_log, NULL); + unixctl_command_register("block", "", 0, 0, OVS_OUTPUT_FMT_TEXT, + test_unixctl_block, NULL); daemonize_complete(); VLOG_INFO("Entering run loop."); diff --git a/tests/test-unixctl.py b/tests/test-unixctl.py index 4fa27b09f..b5fe12eb7 100644 --- a/tests/test-unixctl.py +++ b/tests/test-unixctl.py @@ -17,12 +17,13 @@ import argparse import ovs.daemon import ovs.unixctl import ovs.unixctl.server +import ovs.util vlog = ovs.vlog.Vlog("test-unixctl") exiting = False -def unixctl_exit(conn, unused_argv, aux): +def unixctl_exit(conn, unused_argv, unused_fmt, aux): assert aux == "aux_exit" global exiting @@ -30,22 +31,22 @@ def unixctl_exit(conn, unused_argv, aux): conn.reply(None) -def unixctl_echo(conn, argv, aux): +def unixctl_echo(conn, argv, unused_fmt, aux): assert aux == "aux_echo" conn.reply(str(argv)) -def unixctl_echo_error(conn, argv, aux): +def unixctl_echo_error(conn, argv, unused_fmt, aux): assert aux == "aux_echo_error" conn.reply_error(str(argv)) -def unixctl_log(conn, argv, unused_aux): +def unixctl_log(conn, argv, unused_fmt, unused_aux): vlog.info(str(argv[0])) conn.reply(None) -def unixctl_block(conn, unused_argv, unused_aux): +def unixctl_block(conn, unused_argv, unused_fmt, unused_aux): pass @@ -66,13 +67,19 @@ def main(): ovs.util.ovs_fatal(error, "could not create unixctl server at %s" % args.unixctl, vlog) - ovs.unixctl.command_register("exit", "", 0, 0, unixctl_exit, "aux_exit") - ovs.unixctl.command_register("echo", "[arg ...]", 1, 2, unixctl_echo, + ovs.unixctl.command_register("exit", "", 0, 0, ovs.util.OutputFormat.TEXT, + unixctl_exit, "aux_exit") + ovs.unixctl.command_register("echo", "[arg ...]", 1, 2, + ovs.util.OutputFormat.TEXT, unixctl_echo, "aux_echo") - ovs.unixctl.command_register("log", "[arg ...]", 1, 2, unixctl_log, None) + ovs.unixctl.command_register("log", "[arg ...]", 1, 2, + ovs.util.OutputFormat.TEXT, unixctl_log, + None) ovs.unixctl.command_register("echo_error", "[arg ...]", 1, 2, + ovs.util.OutputFormat.TEXT, unixctl_echo_error, "aux_echo_error") - ovs.unixctl.command_register("block", "", 0, 0, unixctl_block, None) + ovs.unixctl.command_register("block", "", 0, 0, ovs.util.OutputFormat.TEXT, + unixctl_block, None) ovs.daemon.daemonize_complete() vlog.info("Entering run loop.") diff --git a/utilities/ovs-ofctl.c b/utilities/ovs-ofctl.c index ba3458e55..9f7e78f61 100644 --- a/utilities/ovs-ofctl.c +++ b/utilities/ovs-ofctl.c @@ -534,7 +534,8 @@ usage(void) static void ofctl_exit(struct unixctl_conn *conn, int argc OVS_UNUSED, - const char *argv[] OVS_UNUSED, void *exiting_) + const char *argv[] OVS_UNUSED, enum ovs_output_fmt fmt OVS_UNUSED, + void *exiting_) { bool *exiting = exiting_; *exiting = true; @@ -1945,7 +1946,8 @@ openflow_from_hex(const char *hex, struct ofpbuf **msgp) static void ofctl_send(struct unixctl_conn *conn, int argc, - const char *argv[], void *vconn_) + const char *argv[], enum ovs_output_fmt fmt OVS_UNUSED, + void *vconn_) { struct vconn *vconn = vconn_; struct ds reply; @@ -1991,7 +1993,8 @@ ofctl_send(struct unixctl_conn *conn, int argc, static void unixctl_packet_out(struct unixctl_conn *conn, int OVS_UNUSED argc, - const char *argv[], void *vconn_) + const char *argv[], enum ovs_output_fmt fmt OVS_UNUSED, + void *vconn_) { struct vconn *vconn = vconn_; enum ofputil_protocol protocol @@ -2052,7 +2055,8 @@ struct barrier_aux { static void ofctl_barrier(struct unixctl_conn *conn, int argc OVS_UNUSED, - const char *argv[] OVS_UNUSED, void *aux_) + const char *argv[] OVS_UNUSED, + enum ovs_output_fmt fmt OVS_UNUSED, void *aux_) { struct barrier_aux *aux = aux_; struct ofpbuf *msg; @@ -2075,7 +2079,8 @@ ofctl_barrier(struct unixctl_conn *conn, int argc OVS_UNUSED, static void ofctl_set_output_file(struct unixctl_conn *conn, int argc OVS_UNUSED, - const char *argv[], void *aux OVS_UNUSED) + const char *argv[], enum ovs_output_fmt fmt OVS_UNUSED, + void *aux OVS_UNUSED) { int fd; @@ -2093,7 +2098,9 @@ ofctl_set_output_file(struct unixctl_conn *conn, int argc OVS_UNUSED, static void ofctl_block(struct unixctl_conn *conn, int argc OVS_UNUSED, - const char *argv[] OVS_UNUSED, void *blocked_) + const char *argv[] OVS_UNUSED, + enum ovs_output_fmt fmt OVS_UNUSED, + void *blocked_) { bool *blocked = blocked_; @@ -2107,7 +2114,9 @@ ofctl_block(struct unixctl_conn *conn, int argc OVS_UNUSED, static void ofctl_unblock(struct unixctl_conn *conn, int argc OVS_UNUSED, - const char *argv[] OVS_UNUSED, void *blocked_) + const char *argv[] OVS_UNUSED, + enum ovs_output_fmt fmt OVS_UNUSED, + void *blocked_) { bool *blocked = blocked_; @@ -2142,19 +2151,21 @@ monitor_vconn(struct vconn *vconn, bool reply_to_echo_requests, if (error) { ovs_fatal(error, "failed to create unixctl server"); } - unixctl_command_register("exit", "", 0, 0, ofctl_exit, &exiting); + unixctl_command_register("exit", "", 0, 0, OVS_OUTPUT_FMT_TEXT, + ofctl_exit, &exiting); unixctl_command_register("ofctl/send", "OFMSG...", 1, INT_MAX, - ofctl_send, vconn); + OVS_OUTPUT_FMT_TEXT, ofctl_send, vconn); unixctl_command_register("ofctl/packet-out", "\"in_port= packet= actions=...\"", 1, 1, - unixctl_packet_out, vconn); - unixctl_command_register("ofctl/barrier", "", 0, 0, + OVS_OUTPUT_FMT_TEXT, unixctl_packet_out, vconn); + unixctl_command_register("ofctl/barrier", "", 0, 0, OVS_OUTPUT_FMT_TEXT, ofctl_barrier, &barrier_aux); unixctl_command_register("ofctl/set-output-file", "FILE", 1, 1, - ofctl_set_output_file, NULL); - - unixctl_command_register("ofctl/block", "", 0, 0, ofctl_block, &blocked); - unixctl_command_register("ofctl/unblock", "", 0, 0, ofctl_unblock, - &blocked); + OVS_OUTPUT_FMT_TEXT, ofctl_set_output_file, + NULL); + unixctl_command_register("ofctl/block", "", 0, 0, OVS_OUTPUT_FMT_TEXT, + ofctl_block, &blocked); + unixctl_command_register("ofctl/unblock", "", 0, 0, OVS_OUTPUT_FMT_TEXT, + ofctl_unblock, &blocked); daemonize_complete(); diff --git a/vswitchd/bridge.c b/vswitchd/bridge.c index 95a65fcdc..953e9647f 100644 --- a/vswitchd/bridge.c +++ b/vswitchd/bridge.c @@ -516,13 +516,16 @@ bridge_init(const char *remote) /* Register unixctl commands. */ unixctl_command_register("qos/show-types", "interface", 1, 1, - qos_unixctl_show_types, NULL); + OVS_OUTPUT_FMT_TEXT, qos_unixctl_show_types, + NULL); unixctl_command_register("qos/show", "interface", 1, 1, - qos_unixctl_show, NULL); + OVS_OUTPUT_FMT_TEXT, qos_unixctl_show, NULL); unixctl_command_register("bridge/dump-flows", "[--offload-stats] bridge", - 1, 2, bridge_unixctl_dump_flows, NULL); + 1, 2, OVS_OUTPUT_FMT_TEXT, + bridge_unixctl_dump_flows, NULL); unixctl_command_register("bridge/reconnect", "[bridge]", 0, 1, - bridge_unixctl_reconnect, NULL); + OVS_OUTPUT_FMT_TEXT, bridge_unixctl_reconnect, + NULL); lacp_init(); bond_init(); cfm_init(); @@ -3512,7 +3515,8 @@ qos_unixctl_show_queue(unsigned int queue_id, static void qos_unixctl_show_types(struct unixctl_conn *conn, int argc OVS_UNUSED, - const char *argv[], void *aux OVS_UNUSED) + const char *argv[], enum ovs_output_fmt fmt OVS_UNUSED, + void *aux OVS_UNUSED) { struct ds ds = DS_EMPTY_INITIALIZER; struct sset types = SSET_INITIALIZER(&types); @@ -3550,7 +3554,8 @@ qos_unixctl_show_types(struct unixctl_conn *conn, int argc OVS_UNUSED, static void qos_unixctl_show(struct unixctl_conn *conn, int argc OVS_UNUSED, - const char *argv[], void *aux OVS_UNUSED) + const char *argv[], enum ovs_output_fmt fmt OVS_UNUSED, + void *aux OVS_UNUSED) { struct ds ds = DS_EMPTY_INITIALIZER; struct smap smap = SMAP_INITIALIZER(&smap); @@ -3670,7 +3675,9 @@ bridge_lookup(const char *name) * stack, including those normally hidden. */ static void bridge_unixctl_dump_flows(struct unixctl_conn *conn, int argc, - const char *argv[], void *aux OVS_UNUSED) + const char *argv[], + enum ovs_output_fmt fmt OVS_UNUSED, + void *aux OVS_UNUSED) { struct bridge *br; struct ds results; @@ -3700,7 +3707,9 @@ bridge_unixctl_dump_flows(struct unixctl_conn *conn, int argc, * drop their controller connections and reconnect. */ static void bridge_unixctl_reconnect(struct unixctl_conn *conn, int argc, - const char *argv[], void *aux OVS_UNUSED) + const char *argv[], + enum ovs_output_fmt fmt OVS_UNUSED, + void *aux OVS_UNUSED) { struct bridge *br; if (argc > 1) { diff --git a/vswitchd/ovs-vswitchd.c b/vswitchd/ovs-vswitchd.c index 273af9f5d..74b755778 100644 --- a/vswitchd/ovs-vswitchd.c +++ b/vswitchd/ovs-vswitchd.c @@ -111,7 +111,7 @@ main(int argc, char *argv[]) exit(EXIT_FAILURE); } unixctl_command_register("exit", "[--cleanup]", 0, 1, - ovs_vswitchd_exit, NULL); + OVS_OUTPUT_FMT_TEXT, ovs_vswitchd_exit, NULL); bridge_init(remote); free(remote); @@ -308,7 +308,8 @@ usage(void) static void ovs_vswitchd_exit(struct unixctl_conn *conn, int argc, - const char *argv[], void *args OVS_UNUSED) + const char *argv[], + enum ovs_output_fmt fmt OVS_UNUSED, void *args OVS_UNUSED) { exit_args.n_conns++; exit_args.conns = xrealloc(exit_args.conns, diff --git a/vtep/ovs-vtep.in b/vtep/ovs-vtep.in index 0ee23b119..54fb3a7e2 100755 --- a/vtep/ovs-vtep.in +++ b/vtep/ovs-vtep.in @@ -76,7 +76,7 @@ def vtep_ctl(args): return call_prog("vtep-ctl", shlex.split(args)) -def unixctl_exit(conn, unused_argv, unused_aux): +def unixctl_exit(conn, unused_argv, unused_fmt, unused_aux): global exiting exiting = True conn.reply(None) @@ -732,7 +732,8 @@ def main(): ovs.daemon.daemonize() - ovs.unixctl.command_register("exit", "", 0, 0, unixctl_exit, None) + ovs.unixctl.command_register("exit", "", 0, 0, ovs.util.OutputFormat.TEXT, + unixctl_exit, None) error, unixctl = ovs.unixctl.server.UnixctlServer.create(None, version=VERSION) if error: From patchwork Thu Jan 18 09:57:40 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jakob Meng X-Patchwork-Id: 1887847 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256 header.s=mimecast20190719 header.b=Zlnws6eF; dkim-atps=neutral Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=openvswitch.org (client-ip=2605:bc80:3010::133; helo=smtp2.osuosl.org; envelope-from=ovs-dev-bounces@openvswitch.org; receiver=patchwork.ozlabs.org) Received: from smtp2.osuosl.org (smtp2.osuosl.org [IPv6:2605:bc80:3010::133]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (secp384r1) server-digest SHA384) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4TFyr52Vpgz23f1 for ; Thu, 18 Jan 2024 20:58:45 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by smtp2.osuosl.org (Postfix) with ESMTP id 14F7B437D4; Thu, 18 Jan 2024 09:58:43 +0000 (UTC) DKIM-Filter: OpenDKIM Filter v2.11.0 smtp2.osuosl.org 14F7B437D4 Authentication-Results: smtp2.osuosl.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256 header.s=mimecast20190719 header.b=Zlnws6eF X-Virus-Scanned: amavisd-new at osuosl.org Received: from smtp2.osuosl.org ([127.0.0.1]) by localhost (smtp2.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id vXwZkOGNNjHN; Thu, 18 Jan 2024 09:58:41 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [IPv6:2605:bc80:3010:104::8cd3:938]) by smtp2.osuosl.org (Postfix) with ESMTPS id 79CE8437F9; Thu, 18 Jan 2024 09:58:39 +0000 (UTC) DKIM-Filter: OpenDKIM Filter v2.11.0 smtp2.osuosl.org 79CE8437F9 Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id 0E9CEC0DDF; Thu, 18 Jan 2024 09:58:36 +0000 (UTC) X-Original-To: dev@openvswitch.org Delivered-To: ovs-dev@lists.linuxfoundation.org Received: from smtp4.osuosl.org (smtp4.osuosl.org [IPv6:2605:bc80:3010::137]) by lists.linuxfoundation.org (Postfix) with ESMTP id 42FA3C0DD4 for ; Thu, 18 Jan 2024 09:58:34 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by smtp4.osuosl.org (Postfix) with ESMTP id 3872A42225 for ; Thu, 18 Jan 2024 09:58:33 +0000 (UTC) DKIM-Filter: OpenDKIM Filter v2.11.0 smtp4.osuosl.org 3872A42225 Authentication-Results: smtp4.osuosl.org; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256 header.s=mimecast20190719 header.b=Zlnws6eF X-Virus-Scanned: amavisd-new at osuosl.org Received: from smtp4.osuosl.org ([127.0.0.1]) by localhost (smtp4.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id yxoH8qA8NQmZ for ; Thu, 18 Jan 2024 09:58:31 +0000 (UTC) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by smtp4.osuosl.org (Postfix) with ESMTPS id 5F1BF42238 for ; Thu, 18 Jan 2024 09:58:31 +0000 (UTC) DKIM-Filter: OpenDKIM Filter v2.11.0 smtp4.osuosl.org 5F1BF42238 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1705571910; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=pdHSgkfWSQ0sHpP15bmibU2fffMR9OrKHGkO1wCLap4=; b=Zlnws6eFlHs1xb2IAzaS8bqNqGPvry9p+UfIqY704GJ0HB9F7jd5dda7wMSkS+tsd6mXKV p+RWw0ieKKS6zil+u7+Jf10AYx/lV1XeFy4Bg/0rIVJyfn3Vz8NrW3Dj6Pk9YItIlH4lfY 5oDN3zUZYHJfEvN/AQBwh+eXvmkxel8= Received: from mail-wm1-f70.google.com (mail-wm1-f70.google.com [209.85.128.70]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-267-P9Svl3ZoPY-vrkptEvlT6w-1; Thu, 18 Jan 2024 04:58:23 -0500 X-MC-Unique: P9Svl3ZoPY-vrkptEvlT6w-1 Received: by mail-wm1-f70.google.com with SMTP id 5b1f17b1804b1-40e5980dfdfso59084665e9.1 for ; Thu, 18 Jan 2024 01:58:23 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1705571902; x=1706176702; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=pdHSgkfWSQ0sHpP15bmibU2fffMR9OrKHGkO1wCLap4=; b=iQTrj2Yl//8f5P+78blLJMgYSSc1D2n+yajJiZzgAF/siymSv0mxPW2efwV1nSFIZ8 UgOeh2Vqau1/pr4jbzxsIJbRs2WCAZblIbCvhOk+Cg5pQN2ewB6/+5mia7ArFAQHHwbP P4nAp+lKn9MhoH2PAjyyqmLO5RlkOeMzdwdzIJzJFtePSityYVP6Rwec33mcYq1mmou4 k73GWWFyDDBvrTLpm7Yw24oqwNAcGXsW/Dgel0+PvIXhkK7oHukzQxNeYDmCuLNwwmv3 M4YEzx5Y+9x74Fk/qSx1krC7wSJSvEaRJNIlIjbZMDoFUYdA3PrupAOZIbrDnYZvbIQk zH6g== X-Gm-Message-State: AOJu0YzZPgjL8ictQtnxGSSQGlt/ga7CI6OuvK9eW4fLHfj6reOacJFL GlnANiPUJEleSb1l02Wrl201tf2Yc0T/k2LF44z9bsXofuEXXGsyvV7TzLKKrStz71GmYTQHBuv LDKWjwaD3XSwRr/T+eVp9rnP+PDjqbpwsx7b2EaTfE04JUGMN+ShhN6mdbCcyjTcGzIhmeEIS/n 1pze5UUAcRRBz+ZNspyWL4KFu48s1u X-Received: by 2002:a05:600c:364f:b0:40e:6238:e9e8 with SMTP id y15-20020a05600c364f00b0040e6238e9e8mr303610wmq.1.1705571902640; Thu, 18 Jan 2024 01:58:22 -0800 (PST) X-Google-Smtp-Source: AGHT+IHcjY88nSHjD7eIQgZAQ4eqgZ9+tYwibgDPdEyDg6u2ZznWmNJHgxHJmtzFH2kQzLtiA0JV7Q== X-Received: by 2002:a05:600c:364f:b0:40e:6238:e9e8 with SMTP id y15-20020a05600c364f00b0040e6238e9e8mr303598wmq.1.1705571902337; Thu, 18 Jan 2024 01:58:22 -0800 (PST) Received: from positronik4lide.redhat.com ([87.122.58.78]) by smtp.gmail.com with ESMTPSA id iv11-20020a05600c548b00b0040d8ff79fd8sm25226688wmb.7.2024.01.18.01.58.21 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 18 Jan 2024 01:58:22 -0800 (PST) From: jmeng@redhat.com To: dev@openvswitch.org, i.maximets@ovn.org, echaudro@redhat.com, ktraynor@redhat.com, aconole@redhat.com, rjarry@redhat.com Date: Thu, 18 Jan 2024 10:57:40 +0100 Message-Id: <20240118095742.731853-5-jmeng@redhat.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20240118095742.731853-1-jmeng@redhat.com> References: <20240118095742.731853-1-jmeng@redhat.com> MIME-Version: 1.0 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Subject: [ovs-dev] [PATCH v6 4/6] ofproto: Add JSON output for 'dpif/show' command. X-BeenThere: ovs-dev@openvswitch.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: ovs-dev-bounces@openvswitch.org Sender: "dev" From: Jakob Meng The 'dpif/show' command now supports machine-readable JSON output in addition to the plain-text output for humans. An example would be: ovs-appctl --format json dpif/show Reported-at: https://bugzilla.redhat.com/1824861 Signed-off-by: Jakob Meng --- ofproto/ofproto-dpif.c | 129 ++++++++++++++++++++++++++++++++++++----- tests/pmd.at | 3 + 2 files changed, 119 insertions(+), 13 deletions(-) diff --git a/ofproto/ofproto-dpif.c b/ofproto/ofproto-dpif.c index baba72c56..835704e90 100644 --- a/ofproto/ofproto-dpif.c +++ b/ofproto/ofproto-dpif.c @@ -20,6 +20,7 @@ #include "bond.h" #include "bundle.h" #include "byte-order.h" +#include "command-line.h" #include "connectivity.h" #include "connmgr.h" #include "coverage.h" @@ -6420,8 +6421,103 @@ done: return changed; } +static struct json * +dpif_show_backer_json(const struct dpif_backer *backer) +{ + struct json *json_backer = json_object_create(); + + /* Add dpif name to JSON. */ + json_object_put_string(json_backer, "name", dpif_name(backer->dpif)); + + /* Add dpif stats to JSON. */ + struct dpif_dp_stats dp_stats; + dpif_get_dp_stats(backer->dpif, &dp_stats); + struct json *json_dp_stats = json_object_create(); + json_object_put_format(json_dp_stats, "n_hit", "%"PRIu64, dp_stats.n_hit); + json_object_put_format(json_dp_stats, "n_missed", "%"PRIu64, + dp_stats.n_missed); + json_object_put(json_backer, "stats", json_dp_stats); + + /* Add ofprotos to JSON. */ + struct json *json_ofprotos = json_array_create_empty(); + struct shash ofproto_shash; + shash_init(&ofproto_shash); + const struct shash_node **ofprotos = get_ofprotos(&ofproto_shash); + for (size_t i = 0; i < shash_count(&ofproto_shash); i++) { + struct ofproto_dpif *ofproto = ofprotos[i]->data; + + if (ofproto->backer != backer) { + continue; + } + + struct json *json_ofproto = json_object_create(); + + /* Add ofproto name to JSON array. */ + json_object_put_string(json_ofproto, "name", ofproto->up.name); + + /* Add ofproto ports to JSON array. */ + struct json *json_ofproto_ports = json_array_create_empty(); + const struct shash_node **ports; + ports = shash_sort(&ofproto->up.port_by_name); + for (size_t j = 0; j < shash_count(&ofproto->up.port_by_name); j++) { + const struct shash_node *port = ports[j]; + struct ofport *ofport = port->data; + + struct json * json_ofproto_port = json_object_create(); + /* Add ofproto port netdev name to JSON sub array. */ + json_object_put_string(json_ofproto_port, "netdev_name", + netdev_get_name(ofport->netdev)); + /* Add ofproto port ofp port to JSON sub array. */ + json_object_put_format(json_ofproto_port, "ofp_port", "%u", + ofport->ofp_port); + + /* Add ofproto port odp port to JSON sub array. */ + odp_port_t odp_port = ofp_port_to_odp_port(ofproto, + ofport->ofp_port); + if (odp_port != ODPP_NONE) { + json_object_put_format(json_ofproto_port, "odp_port", + "%"PRIu32, odp_port); + } else { + json_object_put_string(json_ofproto_port, "odp_port", "none"); + } + + /* Add ofproto port netdev type to JSON sub array. */ + json_object_put_string(json_ofproto_port, "netdev_type", + netdev_get_type(ofport->netdev)); + + /* Add ofproto port config to JSON sub array. */ + struct json *json_port_config = json_object_create(); + struct smap config; + smap_init(&config); + if (!netdev_get_config(ofport->netdev, &config)) { + struct smap_node *node; + + SMAP_FOR_EACH (node, &config) { + json_object_put_string(json_port_config, node->key, + node->value); + } + } + smap_destroy(&config); + json_object_put(json_ofproto_port, "netdev_config", + json_port_config); + + json_array_add(json_ofproto_ports, json_ofproto_port); + } /* End of ofproto port(s). */ + + free(ports); + json_object_put(json_ofproto, "ports", json_ofproto_ports); + + json_array_add(json_ofprotos, json_ofproto); + } /* End of ofproto(s). */ + shash_destroy(&ofproto_shash); + free(ofprotos); + + json_object_put(json_backer, "ofprotos", json_ofprotos); + return json_backer; +} + static void -dpif_show_backer(const struct dpif_backer *backer, struct ds *ds) +dpif_show_backer_text(const struct dpif_backer *backer, struct ds *ds) { const struct shash_node **ofprotos; struct dpif_dp_stats dp_stats; @@ -6487,21 +6583,27 @@ dpif_show_backer(const struct dpif_backer *backer, struct ds *ds) static void ofproto_unixctl_dpif_show(struct unixctl_conn *conn, int argc OVS_UNUSED, const char *argv[] OVS_UNUSED, - enum ovs_output_fmt fmt OVS_UNUSED, - void *aux OVS_UNUSED) + enum ovs_output_fmt fmt, void *aux OVS_UNUSED) { struct ds ds = DS_EMPTY_INITIALIZER; - const struct shash_node **backers; - int i; - backers = shash_sort(&all_dpif_backers); - for (i = 0; i < shash_count(&all_dpif_backers); i++) { - dpif_show_backer(backers[i]->data, &ds); - } - free(backers); + if (fmt == OVS_OUTPUT_FMT_JSON) { + struct json *backers = json_array_create_empty(); + const struct shash_node *backer; + SHASH_FOR_EACH (backer, &all_dpif_backers) { + json_array_add(backers, dpif_show_backer_json(backer->data)); + } + unixctl_command_reply_json(conn, backers); + } else { + const struct shash_node **backers = shash_sort(&all_dpif_backers); + for (int i = 0; i < shash_count(&all_dpif_backers); i++) { + dpif_show_backer_text(backers[i]->data, &ds); + } + free(backers); - unixctl_command_reply(conn, ds_cstr(&ds)); - ds_destroy(&ds); + unixctl_command_reply(conn, ds_cstr(&ds)); + ds_destroy(&ds); + } } static void @@ -6682,7 +6784,8 @@ ofproto_unixctl_init(void) ofproto_unixctl_mcast_snooping_show, NULL); unixctl_command_register("dpif/dump-dps", "", 0, 0, OVS_OUTPUT_FMT_TEXT, ofproto_unixctl_dpif_dump_dps, NULL); - unixctl_command_register("dpif/show", "", 0, 0, OVS_OUTPUT_FMT_TEXT, + unixctl_command_register("dpif/show", "", 0, 0, + OVS_OUTPUT_FMT_TEXT | OVS_OUTPUT_FMT_JSON, ofproto_unixctl_dpif_show, NULL); unixctl_command_register("dpif/show-dp-features", "bridge", 1, 1, OVS_OUTPUT_FMT_TEXT, diff --git a/tests/pmd.at b/tests/pmd.at index 35a44b4df..57660c407 100644 --- a/tests/pmd.at +++ b/tests/pmd.at @@ -112,6 +112,9 @@ dummy@ovs-dummy: hit:0 missed:0 p0 1/1: (dummy-pmd: n_rxq=1, n_txq=1, numa_id=0) ]) +AT_CHECK([ovs-appctl --format json dpif/show], [0], [dnl +[[{"ofprotos":[{"name":"br0","ports":[{"netdev_type":"dummy-internal","ofp_port":"65534","odp_port":"100","netdev_config":{},"netdev_name":"br0"},{"netdev_type":"dummy-pmd","ofp_port":"1","odp_port":"1","netdev_config":{"numa_id":"0","n_txq":"1","n_rxq":"1"},"netdev_name":"p0"}]}],"name":"dummy@ovs-dummy","stats":{"n_hit":"0","n_missed":"0"}}]]]) + OVS_VSWITCHD_STOP AT_CLEANUP From patchwork Thu Jan 18 09:57:41 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jakob Meng X-Patchwork-Id: 1887844 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256 header.s=mimecast20190719 header.b=XV71eT8v; dkim-atps=neutral Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=openvswitch.org (client-ip=2605:bc80:3010::138; helo=smtp1.osuosl.org; envelope-from=ovs-dev-bounces@openvswitch.org; receiver=patchwork.ozlabs.org) Received: from smtp1.osuosl.org (smtp1.osuosl.org [IPv6:2605:bc80:3010::138]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (secp384r1) server-digest SHA384) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4TFyr01Mb2z1yPv for ; Thu, 18 Jan 2024 20:58:40 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by smtp1.osuosl.org (Postfix) with ESMTP id 3A6E78134E; Thu, 18 Jan 2024 09:58:34 +0000 (UTC) DKIM-Filter: OpenDKIM Filter v2.11.0 smtp1.osuosl.org 3A6E78134E Authentication-Results: smtp1.osuosl.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256 header.s=mimecast20190719 header.b=XV71eT8v X-Virus-Scanned: amavisd-new at osuosl.org Received: from smtp1.osuosl.org ([127.0.0.1]) by localhost (smtp1.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id raNv-xmYRhZ3; Thu, 18 Jan 2024 09:58:32 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by smtp1.osuosl.org (Postfix) with ESMTPS id E415580E41; Thu, 18 Jan 2024 09:58:30 +0000 (UTC) DKIM-Filter: OpenDKIM Filter v2.11.0 smtp1.osuosl.org E415580E41 Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id E359AC0DD3; Thu, 18 Jan 2024 09:58:29 +0000 (UTC) X-Original-To: dev@openvswitch.org Delivered-To: ovs-dev@lists.linuxfoundation.org Received: from smtp3.osuosl.org (smtp3.osuosl.org [IPv6:2605:bc80:3010::136]) by lists.linuxfoundation.org (Postfix) with ESMTP id 9DC2FC0DDE for ; Thu, 18 Jan 2024 09:58:28 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by smtp3.osuosl.org (Postfix) with ESMTP id 8570A61AE7 for ; Thu, 18 Jan 2024 09:58:28 +0000 (UTC) DKIM-Filter: OpenDKIM Filter v2.11.0 smtp3.osuosl.org 8570A61AE7 Authentication-Results: smtp3.osuosl.org; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256 header.s=mimecast20190719 header.b=XV71eT8v X-Virus-Scanned: amavisd-new at osuosl.org Received: from smtp3.osuosl.org ([127.0.0.1]) by localhost (smtp3.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id MO2t_osoinHD for ; Thu, 18 Jan 2024 09:58:27 +0000 (UTC) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by smtp3.osuosl.org (Postfix) with ESMTPS id 9B4DD61AE0 for ; Thu, 18 Jan 2024 09:58:27 +0000 (UTC) DKIM-Filter: OpenDKIM Filter v2.11.0 smtp3.osuosl.org 9B4DD61AE0 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1705571906; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=HLT4YlBE25fFs3o/ej7SN/WgzqCm9pKI4taRUCCuQKE=; b=XV71eT8vSuu2WxS2PlU/Dl2x9rkoWS0TPkYqmharm8XOTosCuMAwJxz6uq9hQbBJZ71OwN jSkw/cQWe7o5G/tZvrquwTb9veHZ4NgOTH8RLSKWv1vB3tsYq6mcs/M6LvXGpumMKT3AKr g7g1gBf/uMd9UA9sVj7RRebQEwIuwbQ= Received: from mail-wm1-f70.google.com (mail-wm1-f70.google.com [209.85.128.70]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-310-Yp2LYt5gNZ6vLPaw0WEayA-1; Thu, 18 Jan 2024 04:58:24 -0500 X-MC-Unique: Yp2LYt5gNZ6vLPaw0WEayA-1 Received: by mail-wm1-f70.google.com with SMTP id 5b1f17b1804b1-40e6668d9e1so45812335e9.1 for ; Thu, 18 Jan 2024 01:58:24 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1705571903; x=1706176703; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=HLT4YlBE25fFs3o/ej7SN/WgzqCm9pKI4taRUCCuQKE=; b=Huqh1GG5+xRWBtClWiLFeN8iKqXg7PS34cHo3mzSWwlxexlq9+sVmPmn+7EJ1L/n/f /61PB+X6zjvq+cW3ZbnAMzOWwGTjQVscJHXX4m7n+3WAT4TvZLzulghH/ixKHlLh3VBP FQYrHrLPlVW7REn0FqDmJF0z5NsQWci3wMvd34XxDUVzq3P4m2jwHMUfIaaP1FDL5qrv f2MVxN2vW4NIHFGyMmmy8cp6o79hHIAdXCwcCxVzk0LEDX2d7IzC4D45zmkHTlDFB5/W RsAZ/493EEOzU52j8y7KaPkwLY58tNUaoZWjuFI38gCV1UzUfk/Ib0LIKQLqMOrVEJju Mbig== X-Gm-Message-State: AOJu0YwdLM9Hu6vQmctZOuPx7i0QDAaSzUMPW1Oinno8j7EeY6sFdSfT QhVGTKHfEPky/dcHaLAzRzrPMruLsVArmUuwG1EgKqVy/efiuMj6aCWsnrWjr5pTOj+WBoSoa4o 0HuvyCgMjA+BW6XWwIVrjaqvzfob2H3HbPBjsed1P9Fb5z+Zk+iP6oJ7oEASYoJm6Y1NmwXp/ii 9sHOqB1NmBqWfwk7Xh5ODt5HlOz9Jp X-Received: by 2002:a7b:c8c8:0:b0:40d:7d87:6730 with SMTP id f8-20020a7bc8c8000000b0040d7d876730mr321438wml.101.1705571903385; Thu, 18 Jan 2024 01:58:23 -0800 (PST) X-Google-Smtp-Source: AGHT+IFPjfmnbb4Sod67Hzxbr+BC5/pCVZXDY2/t3yCrG2UOmj7QsRn8il9D+Yxzgkjv/DNgaTiG7g== X-Received: by 2002:a7b:c8c8:0:b0:40d:7d87:6730 with SMTP id f8-20020a7bc8c8000000b0040d7d876730mr321426wml.101.1705571903121; Thu, 18 Jan 2024 01:58:23 -0800 (PST) Received: from positronik4lide.redhat.com ([87.122.58.78]) by smtp.gmail.com with ESMTPSA id iv11-20020a05600c548b00b0040d8ff79fd8sm25226688wmb.7.2024.01.18.01.58.22 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 18 Jan 2024 01:58:22 -0800 (PST) From: jmeng@redhat.com To: dev@openvswitch.org, i.maximets@ovn.org, echaudro@redhat.com, ktraynor@redhat.com, aconole@redhat.com, rjarry@redhat.com Date: Thu, 18 Jan 2024 10:57:41 +0100 Message-Id: <20240118095742.731853-6-jmeng@redhat.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20240118095742.731853-1-jmeng@redhat.com> References: <20240118095742.731853-1-jmeng@redhat.com> MIME-Version: 1.0 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Subject: [ovs-dev] [PATCH v6 5/6] appctl: Add option '--pretty' for pretty-printing JSON output. X-BeenThere: ovs-dev@openvswitch.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: ovs-dev-bounces@openvswitch.org Sender: "dev" From: Jakob Meng Signed-off-by: Jakob Meng --- NEWS | 3 +++ lib/unixctl.c | 4 ++-- lib/unixctl.h | 1 + tests/pmd.at | 29 +++++++++++++++++++++++++++-- utilities/ovs-appctl.c | 22 +++++++++++++++++++--- 5 files changed, 52 insertions(+), 7 deletions(-) diff --git a/NEWS b/NEWS index 4df02e6b2..94092a38a 100644 --- a/NEWS +++ b/NEWS @@ -29,6 +29,9 @@ Post-v3.2.0 on mark and labels. * 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. + E.g. members of objects and elements of arrays are printed one per line, + with indentation. - Python: * Added support for choosing the output format, e.g. 'json' or 'text'. - ovs-vsctl: diff --git a/lib/unixctl.c b/lib/unixctl.c index 3b9f300ba..1b216795d 100644 --- a/lib/unixctl.c +++ b/lib/unixctl.c @@ -553,7 +553,7 @@ unixctl_client_create(const char *path, struct jsonrpc **client) * '*err' if not NULL. */ int unixctl_client_transact(struct jsonrpc *client, const char *command, int argc, - char *argv[], char **result, char **err) + char *argv[], int fmt_flags, char **result, char **err) { struct jsonrpc_msg *request, *reply; struct json **json_args, *params; @@ -590,7 +590,7 @@ unixctl_client_transact(struct jsonrpc *client, const char *command, int argc, *result = xstrdup(json_string(reply->result)); } else if (reply->result->type == JSON_OBJECT || reply->result->type == JSON_ARRAY) { - *result = json_to_string(reply->result, 0); + *result = json_to_string(reply->result, fmt_flags); } else { VLOG_WARN("%s: unexpected result type in JSON rpc reply: %s", jsonrpc_get_name(client), diff --git a/lib/unixctl.h b/lib/unixctl.h index 35ef6a548..fe9160894 100644 --- a/lib/unixctl.h +++ b/lib/unixctl.h @@ -39,6 +39,7 @@ int unixctl_client_create(const char *path, struct jsonrpc **client); int unixctl_client_transact(struct jsonrpc *client, const char *command, int argc, char *argv[], + int fmt_flags, char **result, char **error); /* Command registration. */ diff --git a/tests/pmd.at b/tests/pmd.at index 57660c407..cff80da15 100644 --- a/tests/pmd.at +++ b/tests/pmd.at @@ -112,8 +112,33 @@ dummy@ovs-dummy: hit:0 missed:0 p0 1/1: (dummy-pmd: n_rxq=1, n_txq=1, numa_id=0) ]) -AT_CHECK([ovs-appctl --format json dpif/show], [0], [dnl -[[{"ofprotos":[{"name":"br0","ports":[{"netdev_type":"dummy-internal","ofp_port":"65534","odp_port":"100","netdev_config":{},"netdev_name":"br0"},{"netdev_type":"dummy-pmd","ofp_port":"1","odp_port":"1","netdev_config":{"numa_id":"0","n_txq":"1","n_rxq":"1"},"netdev_name":"p0"}]}],"name":"dummy@ovs-dummy","stats":{"n_hit":"0","n_missed":"0"}}]]]) +AT_CHECK([ovs-appctl --format json --pretty dpif/show], [0], [dnl +[[ + { + "name": "dummy@ovs-dummy", + "ofprotos": [ + { + "name": "br0", + "ports": [ + { + "netdev_config": { + }, + "netdev_name": "br0", + "netdev_type": "dummy-internal", + "odp_port": "100", + "ofp_port": "65534"}, + { + "netdev_config": { + "n_rxq": "1", + "n_txq": "1", + "numa_id": "0"}, + "netdev_name": "p0", + "netdev_type": "dummy-pmd", + "odp_port": "1", + "ofp_port": "1"}]}], + "stats": { + "n_hit": "0", + "n_missed": "0"}}]]]) OVS_VSWITCHD_STOP AT_CLEANUP diff --git a/utilities/ovs-appctl.c b/utilities/ovs-appctl.c index 02df8ba97..03c71ffad 100644 --- a/utilities/ovs-appctl.c +++ b/utilities/ovs-appctl.c @@ -26,6 +26,7 @@ #include "daemon.h" #include "dirs.h" #include "openvswitch/dynamic-string.h" +#include "openvswitch/json.h" #include "jsonrpc.h" #include "process.h" #include "timeval.h" @@ -39,6 +40,7 @@ static void usage(void); /* Parsed command line args. */ struct cmdl_args { enum ovs_output_fmt format; + int format_flags; char *target; }; @@ -73,7 +75,7 @@ main(int argc, char *argv[]) if (opt_argv.n > 0) { error = unixctl_client_transact(client, "set-options", - opt_argv.n, opt_argv.names, + opt_argv.n, opt_argv.names, 0, &cmd_result, &cmd_error); if (error) { @@ -97,7 +99,9 @@ main(int argc, char *argv[]) cmd_argc = argc - optind; cmd_argv = cmd_argc ? argv + optind : NULL; error = unixctl_client_transact(client, cmd, cmd_argc, cmd_argv, - &cmd_result, &cmd_error); + args->format_flags, &cmd_result, + &cmd_error); + if (error) { ovs_fatal(error, "%s: transaction error", args->target); } @@ -143,6 +147,11 @@ Other options:\n\ --timeout=SECS wait at most SECS seconds for a response\n\ -f, --format=FMT Output format. One of: 'json', or 'text'\n\ ('text', by default)\n\ + --pretty By default, JSON in output is printed as compactly as\n\ + possible. This option causes JSON in output to be\n\ + printed in a more readable fashion. Members of objects\n\ + and elements of arrays are printed one per line, with\n\ + indentation.\n\ -h, --help Print this helpful information\n\ -V, --version Display ovs-appctl version information\n", program_name, program_name); @@ -154,6 +163,7 @@ cmdl_args_create(void) { struct cmdl_args *args = xmalloc(sizeof *args); args->format = OVS_OUTPUT_FMT_TEXT; + args->format_flags = 0; args->target = NULL; return args; @@ -173,7 +183,8 @@ parse_command_line(int argc, char *argv[]) { enum { OPT_START = UCHAR_MAX + 1, - VLOG_OPTION_ENUMS + OPT_PRETTY, + VLOG_OPTION_ENUMS, }; static const struct option long_options[] = { {"target", required_argument, NULL, 't'}, @@ -181,6 +192,7 @@ parse_command_line(int argc, char *argv[]) {"format", required_argument, NULL, 'f'}, {"help", no_argument, NULL, 'h'}, {"option", no_argument, NULL, 'o'}, + {"pretty", no_argument, NULL, OPT_PRETTY}, {"version", no_argument, NULL, 'V'}, {"timeout", required_argument, NULL, 'T'}, VLOG_LONG_OPTIONS, @@ -233,6 +245,10 @@ parse_command_line(int argc, char *argv[]) ovs_cmdl_print_options(long_options); exit(EXIT_SUCCESS); + case OPT_PRETTY: + args->format_flags |= JSSF_PRETTY | JSSF_SORT; + break; + case 'T': if (!str_to_uint(optarg, 10, &timeout) || !timeout) { ovs_fatal(0, "value %s on -T or --timeout is invalid", optarg); From patchwork Thu Jan 18 09:57:42 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jakob Meng X-Patchwork-Id: 1887846 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256 header.s=mimecast20190719 header.b=GPD5v3rW; dkim-atps=neutral Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=openvswitch.org (client-ip=2605:bc80:3010::138; helo=smtp1.osuosl.org; envelope-from=ovs-dev-bounces@openvswitch.org; receiver=patchwork.ozlabs.org) Received: from smtp1.osuosl.org (smtp1.osuosl.org [IPv6:2605:bc80:3010::138]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (secp384r1) server-digest SHA384) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4TFyr25L1Gz1yPv for ; Thu, 18 Jan 2024 20:58:42 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by smtp1.osuosl.org (Postfix) with ESMTP id DCAB28134D; Thu, 18 Jan 2024 09:58:38 +0000 (UTC) DKIM-Filter: OpenDKIM Filter v2.11.0 smtp1.osuosl.org DCAB28134D Authentication-Results: smtp1.osuosl.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256 header.s=mimecast20190719 header.b=GPD5v3rW X-Virus-Scanned: amavisd-new at osuosl.org Received: from smtp1.osuosl.org ([127.0.0.1]) by localhost (smtp1.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id NacNcctgyd00; Thu, 18 Jan 2024 09:58:37 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [IPv6:2605:bc80:3010:104::8cd3:938]) by smtp1.osuosl.org (Postfix) with ESMTPS id BFD07813FD; Thu, 18 Jan 2024 09:58:35 +0000 (UTC) DKIM-Filter: OpenDKIM Filter v2.11.0 smtp1.osuosl.org BFD07813FD Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id A0950C0DD5; Thu, 18 Jan 2024 09:58:34 +0000 (UTC) X-Original-To: dev@openvswitch.org Delivered-To: ovs-dev@lists.linuxfoundation.org Received: from smtp4.osuosl.org (smtp4.osuosl.org [140.211.166.137]) by lists.linuxfoundation.org (Postfix) with ESMTP id 4F8D3C0072 for ; Thu, 18 Jan 2024 09:58:32 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by smtp4.osuosl.org (Postfix) with ESMTP id F20C64223C for ; Thu, 18 Jan 2024 09:58:31 +0000 (UTC) DKIM-Filter: OpenDKIM Filter v2.11.0 smtp4.osuosl.org F20C64223C Authentication-Results: smtp4.osuosl.org; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256 header.s=mimecast20190719 header.b=GPD5v3rW X-Virus-Scanned: amavisd-new at osuosl.org Received: from smtp4.osuosl.org ([127.0.0.1]) by localhost (smtp4.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id Uqr3WLy0wJXq for ; Thu, 18 Jan 2024 09:58:31 +0000 (UTC) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by smtp4.osuosl.org (Postfix) with ESMTPS id D389542232 for ; Thu, 18 Jan 2024 09:58:30 +0000 (UTC) DKIM-Filter: OpenDKIM Filter v2.11.0 smtp4.osuosl.org D389542232 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1705571909; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=XEl9d4ujpMpzjjHNT1R1Sao8JO5ZpvBCQtF5LIHNj0U=; b=GPD5v3rWTp8yQcmG1IvjdtfS537/ZhN25rlqTAOavIYF9JFfkvMEoOAQ+NYUhoJLP7/BVD XVLP5qplDhxt2OvcyIMPSpwmbeZitSize8ioNFoiaQJz1dXWU2oCAexz1IJiGmgtKRSFIf jcWuhTJ/jCLIKQqWAXtMW/Q849GG9Rw= Received: from mail-wm1-f69.google.com (mail-wm1-f69.google.com [209.85.128.69]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-167-iJafk3a9PfaHiYN-lZpcPg-1; Thu, 18 Jan 2024 04:58:25 -0500 X-MC-Unique: iJafk3a9PfaHiYN-lZpcPg-1 Received: by mail-wm1-f69.google.com with SMTP id 5b1f17b1804b1-40e41740b6eso104267925e9.3 for ; Thu, 18 Jan 2024 01:58:25 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1705571904; x=1706176704; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=XEl9d4ujpMpzjjHNT1R1Sao8JO5ZpvBCQtF5LIHNj0U=; b=Gf52NA4FQhtcYtuhXExmBmVeKDYeNLcXx3qdYI0T6M+jp4Wfsnp/KKHSaWWi9LYLna /Wji7/zpMQjsdPawlWRMK0ZR+Id2zr5EOG347a3ZbA3x2TTPcsAGvBM6veTV7h8ly9Rn KGWZ0OYqz8NPWRmbj0OlX95EQwEboEgNGqqrOocZ6FlyMkOi+HqMqxSi5EKsxIocSPEl zKCEGZ8bAHIXhMj/x5xl2h6YeCKvpqdyK2yXZrQYenejar4RakR0gpY8mfFL3Gf0r2UD ExfKhz1wLb22uE04+v7FgsVJDj5tNPExWF0QGyY1U/oKWxhOI+l5OMm1FEdYrh+JYmO1 rDGg== X-Gm-Message-State: AOJu0Yy4vvqGTB1QFItqgdf+CA+N/wjsbIUxZw03EpvRs5iBRFNjEANe c2mLP8Up7fCkoWbaPNrirt2OmvGBexAWQcrF22xWUkpNn0NG152YMQB/uAwLB+Ze91J7+UvCu7W IQoknLpCNdlP/oNRYxzNdEGUysXH5j1vzRdN6f/Uzu4WvoBc+FuLmYQ4lIU2fjvj3+a6E4pzsGf M0ZA9hTqXLgt3cfhtdC8p2FKD+chJY X-Received: by 2002:a1c:7911:0:b0:40e:6f67:5ce5 with SMTP id l17-20020a1c7911000000b0040e6f675ce5mr334738wme.97.1705571904635; Thu, 18 Jan 2024 01:58:24 -0800 (PST) X-Google-Smtp-Source: AGHT+IEWnizWB0Up5PpfxVTMMn7G8ZhC+NFW/Vnk0zAC0ob5FVsTIAk+OjPBQAOSCV5xtU4IHazq5A== X-Received: by 2002:a1c:7911:0:b0:40e:6f67:5ce5 with SMTP id l17-20020a1c7911000000b0040e6f675ce5mr334718wme.97.1705571904237; Thu, 18 Jan 2024 01:58:24 -0800 (PST) Received: from positronik4lide.redhat.com ([87.122.58.78]) by smtp.gmail.com with ESMTPSA id iv11-20020a05600c548b00b0040d8ff79fd8sm25226688wmb.7.2024.01.18.01.58.23 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 18 Jan 2024 01:58:23 -0800 (PST) From: jmeng@redhat.com To: dev@openvswitch.org, i.maximets@ovn.org, echaudro@redhat.com, ktraynor@redhat.com, aconole@redhat.com, rjarry@redhat.com Date: Thu, 18 Jan 2024 10:57:42 +0100 Message-Id: <20240118095742.731853-7-jmeng@redhat.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20240118095742.731853-1-jmeng@redhat.com> References: <20240118095742.731853-1-jmeng@redhat.com> MIME-Version: 1.0 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Subject: [ovs-dev] [PATCH v6 6/6] appctl: Add tests for unsupported output formats. X-BeenThere: ovs-dev@openvswitch.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: ovs-dev-bounces@openvswitch.org Sender: "dev" From: Jakob Meng Signed-off-by: Jakob Meng --- tests/pmd.at | 5 +++++ tests/unixctl-py.at | 7 +++++++ 2 files changed, 12 insertions(+) diff --git a/tests/pmd.at b/tests/pmd.at index cff80da15..82a514f36 100644 --- a/tests/pmd.at +++ b/tests/pmd.at @@ -105,6 +105,11 @@ pmd thread numa_id core_id : overhead: NOT AVAIL ]) +AT_CHECK([ovs-appctl --format json dpif-netdev/pmd-rxq-show], [2], [], [dnl +"dpif-netdev/pmd-rxq-show" command does not support output format "json" (supported: 1, requested: 2) +ovs-appctl: ovs-vswitchd: server returned an error +]) + AT_CHECK([ovs-appctl dpif/show], [0], [dnl dummy@ovs-dummy: hit:0 missed:0 br0: diff --git a/tests/unixctl-py.at b/tests/unixctl-py.at index 26c137047..eeea386c7 100644 --- a/tests/unixctl-py.at +++ b/tests/unixctl-py.at @@ -65,6 +65,13 @@ AT_CHECK([head -1 stderr], [0], [dnl sed 's/ovs-appctl/appctl.py/' stderr > experr AT_CHECK([PYAPPCTL_PY bond/hash mac vlan basis extra], [2], [], [experr]) +AT_CHECK([APPCTL --format json dpif-netdev/pmd-rxq-show], [2], [], [stderr]) +AT_CHECK([head -1 stderr], [0], [dnl +"dpif-netdev/pmd-rxq-show" command does not support output format "json" (supported: 1, requested: 2) +]) +sed 's/ovs-appctl/appctl.py/' stderr > experr +AT_CHECK([PYAPPCTL_PY --format json dpif-netdev/pmd-rxq-show], [2], [], [experr]) + OVS_VSWITCHD_STOP AT_CLEANUP