forked from ovn-org/ovn
-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
utilities: Add ovn-debug binary tool.
Add ovn-debug binary tool that can be extended with commands that might be useful for tests/debugging of OVN environment. Currently the tool supports only two commands: 1) "lflow-stage-to-ltable STAGE_NAME" that converts stage name into logical flow table id. 2) "lflow-stage-to-oftable STAGE_NAME" that converts stage name into OpenFlow table id. For now it will be used in tests to get rid remaining hardcoded table numbers. Signed-off-by: Ales Musil <[email protected]> Acked-by: Mark Michelson <[email protected]> Signed-off-by: Mark Michelson <[email protected]>
- Loading branch information
Showing
9 changed files
with
204 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -495,6 +495,7 @@ fi | |
%{_bindir}/ovn-appctl | ||
%{_bindir}/ovn-ic-nbctl | ||
%{_bindir}/ovn-ic-sbctl | ||
%{_bindir}/ovn-debug | ||
%{_datadir}/ovn/scripts/ovn-ctl | ||
%{_datadir}/ovn/scripts/ovn-lib | ||
%{_datadir}/ovn/scripts/ovndb-servers.ocf | ||
|
@@ -515,6 +516,7 @@ fi | |
%{_mandir}/man8/ovn-ic.8* | ||
%{_mandir}/man5/ovn-ic-nb.5* | ||
%{_mandir}/man5/ovn-ic-sb.5* | ||
%{_mandir}/man8/ovn-debug.8* | ||
%{_prefix}/lib/ocf/resource.d/ovn/ovndb-servers | ||
%config(noreplace) %{_sysconfdir}/logrotate.d/ovn | ||
%{_unitdir}/[email protected] | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,28 @@ | ||
<?xml version="1.0" encoding="utf-8"?> | ||
<manpage program="ovn-debug" section="8" title="ovn-debug"> | ||
<h1>Name</h1> | ||
<p>ovn-debug -- Open Virtual Network debug tool</p> | ||
|
||
<h1>Synopsis</h1> | ||
<p><code>ovn-debug</code> <var>COMMAND</var> <var>[ARG...]</var></p> | ||
|
||
<h1>Description</h1> | ||
<p> | ||
<code>ovn-debug</code>, OVN debug tool, is a tool to help with | ||
debugging of OVN setup. | ||
</p> | ||
|
||
<h1>Commands</h1> | ||
<dl> | ||
<dt><code>lflow-stage-to-ltable <var>STAGE_NAME</var></code></dt> | ||
<dd> | ||
Convert the logical flow stage name e.g. <code>ls_in_lb</code> into | ||
the logical flow table number e.g. <code>13</code>. | ||
</dd> | ||
<dt><code>lflow-stage-to-oftable <var>STAGE_NAME</var></code></dt> | ||
<dd> | ||
Convert the logical flow stage name e.g. <code>ls_in_lb</code> into | ||
the OpenFlow table number e.g. <code>21</code>. | ||
</dd> | ||
</dl> | ||
</manpage> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,155 @@ | ||
/* Copyright (c) 2024, Red Hat, Inc. | ||
* | ||
* Licensed under the Apache License, Version 2.0 (the "License"); | ||
* you may not use this file except in compliance with the License. | ||
* You may obtain a copy of the License at: | ||
* | ||
* http://www.apache.org/licenses/LICENSE-2.0 | ||
* | ||
* Unless required by applicable law or agreed to in writing, software | ||
* distributed under the License is distributed on an "AS IS" BASIS, | ||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
* See the License for the specific language governing permissions and | ||
* limitations under the License. | ||
*/ | ||
|
||
#include <config.h> | ||
#include <getopt.h> | ||
#include <stdint.h> | ||
|
||
#include "command-line.h" | ||
#include "controller/lflow.h" | ||
#include "northd/northd.h" | ||
#include "ovn-util.h" | ||
|
||
struct ovn_lflow_stage { | ||
const char *name; | ||
uint8_t table_id; | ||
enum ovn_pipeline pipeline; | ||
}; | ||
|
||
static const struct ovn_lflow_stage ovn_lflow_stages[] = { | ||
#define PIPELINE_STAGE(DP_TYPE, PIPELINE, STAGE, TABLE, NAME) \ | ||
(struct ovn_lflow_stage) { \ | ||
.name = NAME, \ | ||
.table_id = TABLE, \ | ||
.pipeline = P_##PIPELINE, \ | ||
}, | ||
PIPELINE_STAGES | ||
#undef PIPELINE_STAGE | ||
}; | ||
|
||
static const struct ovn_lflow_stage * | ||
ovn_lflow_stage_find_by_name(const char *name) | ||
{ | ||
|
||
for (size_t i = 0; i < ARRAY_SIZE(ovn_lflow_stages); i++) { | ||
const struct ovn_lflow_stage *stage = &ovn_lflow_stages[i]; | ||
if (!strcmp(stage->name, name)) { | ||
return stage; | ||
} | ||
} | ||
|
||
return NULL; | ||
} | ||
|
||
static void | ||
lflow_stage_to_table(struct ovs_cmdl_context *ctx) | ||
{ | ||
const char *name = ctx->argv[1]; | ||
const struct ovn_lflow_stage *stage = ovn_lflow_stage_find_by_name(name); | ||
|
||
if (!stage) { | ||
ovs_fatal(0, "Couldn't find OVN logical flow stage with name \"%s\"", | ||
name); | ||
} | ||
|
||
uint8_t table = stage->table_id; | ||
|
||
if (!strcmp("lflow-stage-to-oftable", ctx->argv[0])) { | ||
table += stage->pipeline == P_IN | ||
? OFTABLE_LOG_INGRESS_PIPELINE | ||
: OFTABLE_LOG_EGRESS_PIPELINE; | ||
} | ||
|
||
printf("%"PRIu8"\n", table); | ||
exit(EXIT_SUCCESS); | ||
} | ||
|
||
|
||
static void | ||
usage(void) | ||
{ | ||
printf("\ | ||
%s: OVN debug utility\n\ | ||
usage: %s COMMAND [ARG...]\n\ | ||
\n\ | ||
lflow-stage-to-ltable STAGE_NAME\n\ | ||
Converts STAGE_NAME into logical flow table number.\n\ | ||
lflow-stage-to-oftable STAGE_NAME\n\ | ||
Converts STAGE_NAME into OpenFlow table number.\n\ | ||
\n\ | ||
Options:\n\ | ||
-h, --help display this help message\n\ | ||
-V, --version display version information\n", | ||
program_name, program_name); | ||
exit(EXIT_SUCCESS); | ||
} | ||
|
||
static void | ||
help(struct ovs_cmdl_context *ctx OVS_UNUSED) | ||
{ | ||
usage(); | ||
} | ||
|
||
int | ||
main(int argc, char *argv[]) | ||
{ | ||
static const struct option long_options[] = { | ||
{"help", no_argument, NULL, 'h'}, | ||
{"version", no_argument, NULL, 'V'}, | ||
{NULL, 0, NULL, 0}, | ||
}; | ||
char *short_options = ovs_cmdl_long_options_to_short_options(long_options); | ||
|
||
ovn_set_program_name(argv[0]); | ||
|
||
for (;;) { | ||
int option_index = 0; | ||
int c = getopt_long(argc, argv, short_options, long_options, | ||
&option_index); | ||
|
||
if (c == -1) { | ||
break; | ||
} | ||
switch (c) { | ||
case 'V': | ||
ovn_print_version(0, 0); | ||
exit(EXIT_SUCCESS); | ||
|
||
case 'h': | ||
usage(); | ||
/* fall through */ | ||
|
||
case '?': | ||
exit(1); | ||
|
||
default: | ||
ovs_abort(0, "Invalid option."); | ||
} | ||
} | ||
free(short_options); | ||
|
||
static const struct ovs_cmdl_command commands[] = { | ||
{"lflow-stage-to-oftable", NULL, 1, 1, lflow_stage_to_table, | ||
OVS_RO}, | ||
{"lflow-stage-to-ltable", NULL, 1, 1, lflow_stage_to_table, | ||
OVS_RO}, | ||
{ "help", NULL, 0, INT_MAX, help, OVS_RO }, | ||
{NULL, NULL, 0, 0, NULL, OVS_RO}, | ||
}; | ||
struct ovs_cmdl_context ctx; | ||
ctx.argc = argc - optind; | ||
ctx.argv = argv + optind; | ||
ovs_cmdl_run_command(&ctx, commands); | ||
} |