On 2/8/24 19:17, Ales Musil wrote:
> 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]>
> ---

Hi Ales,

This looks OK to me too but I have a minor style comment below.

>  NEWS                       |   5 ++
>  README.rst                 |   1 +
>  debian/ovn-common.install  |   1 +
>  debian/ovn-common.manpages |   1 +
>  rhel/ovn-fedora.spec.in    |   2 +
>  utilities/.gitignore       |   2 +
>  utilities/automake.mk      |  10 ++-
>  utilities/ovn-debug.8.xml  |  28 +++++++
>  utilities/ovn-debug.c      | 155 +++++++++++++++++++++++++++++++++++++
>  9 files changed, 204 insertions(+), 1 deletion(-)
>  create mode 100644 utilities/ovn-debug.8.xml
>  create mode 100644 utilities/ovn-debug.c
> 
> diff --git a/NEWS b/NEWS
> index 7114b96d1..b979e54d7 100644
> --- a/NEWS
> +++ b/NEWS
> @@ -1,5 +1,10 @@
>  Post v24.03.0
>  -------------
> +  - Add ovn-debug tool containing two commands.
> +    "lflow-stage-to-ltable STAGE_NAME" that converts stage name into logical
> +    flow table id.
> +    "lflow-stage-to-oftable STAGE_NAME" that converts stage name into 
> OpenFlow
> +    table id.
>  
>  OVN v24.03.0 - xx xxx xxxx
>  --------------------------
> diff --git a/README.rst b/README.rst
> index 6fb717742..428cd8ee8 100644
> --- a/README.rst
> +++ b/README.rst
> @@ -56,6 +56,7 @@ The main components of this distribution are:
>  - ovn-sbctl, a tool for interfacing with the southbound database.
>  - ovn-trace, a debugging utility that allows for tracing of packets through
>    the logical network.
> +- ovn-debug, a tool to simplify debugging of OVN setup.
>  - Scripts and specs for building RPMs.
>  
>  What other documentation is available?
> diff --git a/debian/ovn-common.install b/debian/ovn-common.install
> index 050d1c63a..fc48f07e4 100644
> --- a/debian/ovn-common.install
> +++ b/debian/ovn-common.install
> @@ -5,6 +5,7 @@ usr/bin/ovn-ic-nbctl
>  usr/bin/ovn-ic-sbctl
>  usr/bin/ovn-trace
>  usr/bin/ovn_detrace.py
> +usr/bin/ovn-debug
>  usr/share/ovn/scripts/ovn-ctl
>  usr/share/ovn/scripts/ovndb-servers.ocf
>  usr/share/ovn/scripts/ovn-lib
> diff --git a/debian/ovn-common.manpages b/debian/ovn-common.manpages
> index 1fa3d9cb3..e864512e3 100644
> --- a/debian/ovn-common.manpages
> +++ b/debian/ovn-common.manpages
> @@ -11,3 +11,4 @@ utilities/ovn-ic-nbctl.8
>  utilities/ovn-ic-sbctl.8
>  utilities/ovn-trace.8
>  utilities/ovn-detrace.1
> +utilities/ovn-debug.8
> diff --git a/rhel/ovn-fedora.spec.in b/rhel/ovn-fedora.spec.in
> index 03c1f27c5..670f1ca9e 100644
> --- a/rhel/ovn-fedora.spec.in
> +++ b/rhel/ovn-fedora.spec.in
> @@ -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]
> diff --git a/utilities/.gitignore b/utilities/.gitignore
> index da237563b..3ae97b00f 100644
> --- a/utilities/.gitignore
> +++ b/utilities/.gitignore
> @@ -13,6 +13,8 @@
>  /ovn-trace.8
>  /ovn_detrace.py
>  /ovn-detrace.1
> +/ovn-debug
> +/ovn-debug.8
>  /ovn-docker-overlay-driver
>  /ovn-docker-underlay-driver
>  /ovn-lib
> diff --git a/utilities/automake.mk b/utilities/automake.mk
> index c44563c26..6a2b96e66 100644
> --- a/utilities/automake.mk
> +++ b/utilities/automake.mk
> @@ -11,7 +11,8 @@ man_MANS += \
>      utilities/ovn-ic-sbctl.8 \
>      utilities/ovn-trace.8 \
>      utilities/ovn-detrace.1 \
> -    utilities/ovn-appctl.8
> +    utilities/ovn-appctl.8 \
> +    utilities/ovn-debug.8
>  
>  MAN_ROOTS += \
>      utilities/ovn-detrace.1.in
> @@ -34,6 +35,7 @@ EXTRA_DIST += \
>      utilities/ovn-ic-sbctl.8.xml \
>      utilities/ovn-appctl.8.xml \
>      utilities/ovn-trace.8.xml \
> +    utilities/ovn-debug.8.xml \
>      utilities/ovn_detrace.py.in \
>      utilities/ovndb-servers.ocf \
>      utilities/checkpatch.py \
> @@ -62,6 +64,7 @@ CLEANFILES += \
>      utilities/ovn-ic-nbctl.8 \
>      utilities/ovn-ic-sbctl.8 \
>      utilities/ovn-trace.8 \
> +    utilities/ovn-debug.8 \
>      utilities/ovn-detrace.1 \
>      utilities/ovn-detrace \
>      utilities/ovn_detrace.py \
> @@ -119,4 +122,9 @@ UNINSTALL_LOCAL += ovn-detrace-uninstall
>  ovn-detrace-uninstall:
>       rm -f $(DESTDIR)$(bindir)/ovn-detrace
>  
> +# ovn-debug
> +bin_PROGRAMS += utilities/ovn-debug
> +utilities_ovn_debug_SOURCES = utilities/ovn-debug.c
> +utilities_ovn_debug_LDADD = lib/libovn.la $(OVSDB_LIBDIR)/libovsdb.la 
> $(OVS_LIBDIR)/libopenvswitch.la
> +
>  include utilities/bugtool/automake.mk
> diff --git a/utilities/ovn-debug.8.xml b/utilities/ovn-debug.8.xml
> new file mode 100644
> index 000000000..bdd208328
> --- /dev/null
> +++ b/utilities/ovn-debug.8.xml
> @@ -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>
> diff --git a/utilities/ovn-debug.c b/utilities/ovn-debug.c
> new file mode 100644
> index 000000000..04b273a4f
> --- /dev/null
> +++ b/utilities/ovn-debug.c
> @@ -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;

Please follow the coding style and break long lines before the ternary
operators '?' and ':', rather than after them:

https://github.com/ovn-org/ovn/blob/main/Documentation/internals/contributing/coding-style.rst#expressions

Regards,
Dumitru

_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to