On Wed, Aug 27, 2025 at 4:40 PM Xavier Simonart <xsimo...@redhat.com> wrote:

> Hi
>
> Thanks for adding this documentation!
> Looks good to me, thanks.
>
> Acked-by: Xavier Simonart <xsimo...@redhat.com>
>
> Thanks
> Xavier
>
> On Wed, Aug 13, 2025 at 10:38 PM Mark Michelson via dev <
> ovs-dev@openvswitch.org> wrote:
>
>> Thanks Nick!
>>
>> Acked-by: Mark Michelson <mmich...@redhat.com>
>>
>> On 8/1/25 11:59 AM, Nicholas Hubbard wrote:
>> > OVN is currently lacking documentation for how to develop tests. This
>> commit
>> > adds a file "Documentation/topics/test-development.rst" that provides
>> both a
>> > high-level overview of the OVN test-suite, along with documentation for
>> the
>> > most commonly used macros and functions.
>> >
>> > Reported-at: https://issues.redhat.com/browse/FDP-1548
>> > Signed-off-by: Nicholas Hubbard <nhubb...@redhat.com>
>> > ---
>> > v2: Implemented changes suggested by Mark and Xavier
>> > ---
>> >   Documentation/automake.mk                 |   1 +
>> >   Documentation/topics/index.rst            |   1 +
>> >   Documentation/topics/test-development.rst | 359 ++++++++++++++++++++++
>> >   3 files changed, 361 insertions(+)
>> >   create mode 100644 Documentation/topics/test-development.rst
>> >
>> > diff --git a/Documentation/automake.mk b/Documentation/automake.mk
>> > index a70c294b9..6bc88c24b 100644
>> > --- a/Documentation/automake.mk
>> > +++ b/Documentation/automake.mk
>> > @@ -25,6 +25,7 @@ DOC_SOURCE = \
>> >       Documentation/tutorials/ovn-interconnection.rst \
>> >       Documentation/topics/index.rst \
>> >       Documentation/topics/testing.rst \
>> > +     Documentation/topics/test-development.rst \
>> >       Documentation/topics/high-availability.rst \
>> >       Documentation/topics/integration.rst \
>> >       Documentation/topics/ovn-news-2.8.rst \
>> > diff --git a/Documentation/topics/index.rst
>> b/Documentation/topics/index.rst
>> > index 55bb919c0..896014dc3 100644
>> > --- a/Documentation/topics/index.rst
>> > +++ b/Documentation/topics/index.rst
>> > @@ -42,6 +42,7 @@ OVN
>> >      ovn-news-2.8
>> >      vif-plug-providers/index
>> >      testing
>> > +   test-development
>> >
>> >   .. list-table::
>> >
>> > diff --git a/Documentation/topics/test-development.rst
>> b/Documentation/topics/test-development.rst
>> > new file mode 100644
>> > index 000000000..823957983
>> > --- /dev/null
>> > +++ b/Documentation/topics/test-development.rst
>> > @@ -0,0 +1,359 @@
>> > +..
>> > +      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.
>> > +
>> > +      Convention for heading levels in OVN documentation:
>> > +
>> > +      =======  Heading 0 (reserved for the title in a document)
>> > +      -------  Heading 1
>> > +      ~~~~~~~  Heading 2
>> > +      +++++++  Heading 3
>> > +      '''''''  Heading 4
>> > +
>> > +      Avoid deeper levels because they do not render well.
>> > +
>> > +================
>> > +Test Development
>> > +================
>> > +
>> > +This document provides information relevant to writing tests for OVN.
>> The
>> > +documentation for executing tests exists in :doc:`/topics/testing`.
>> > +
>> > +OVN uses `Autotest <
>> https://www.gnu.org/software/autoconf/manual/autoconf-2.68/html_node/Using-Autotest.html#Using-Autotest
>> >`_
>> > +for generating its tests. The top-level of the test code is located in
>> the
>> > +file ``tests/testsuite.at``. This file is expanded into a shell
>> script that
>> > +runs all of the OVN tests. Please refer to the Autotest documentation
>> linked
>> > +above for more information regarding Autotest, as the rest of this
>> document
>> > +assumes a general understanding of it.
>> > +
>> > +OVN Test Suite Overview
>> > +-----------------------
>> > +
>> > +All test code is located in the ``tests/`` directory at the root of
>> the OVN
>> > +repository. Generally, files suffixed with ``-macros.at`` contain
>> macros and
>> > +shell functions to aid in writing tests. Files suffixed with just
>> ``.at``
>> > +contain the code for running actual tests.
>> > +
>> > +By convention macros are denoted with all uppercase letters, while
>> functions
>> > +use lowercase letters.
>> > +
>> > +The most used and important macros/functions are documented here. All
>> of
>> > +these macros/functions are implicitly available from all test files
>> when
>> > +running the testsuite via ``make check``.
>> > +
>> > +Macros and Functions
>> > +--------------------
>> > +
>> > +Verification
>> > +~~~~~~~~~~~~
>> > +
>> > +check COMMAND...
>> > +++++++++++++++++
>> > +
>> > +Function to run COMMAND and check that it succeeds without any output.
>> Also
>> > +logs the COMMAND. Note that most ``ovn-nbctl`` and ``ovn-sbctl`` must
>> be run
>> > +withing ``check`` so that the return status is checked.
>> > +
>> > +OVN_CHECK_PACKETS([PCAP], [EXPECTED])
>> > ++++++++++++++++++++++++++++++++++++++
>> > +
>> > +Macro to compare packets read from PCAP, in pcap format, to those read
>> from
>> > +EXPECTED, which is a text file containing packets as hex strings, one
>> per line.
>> > +If PCAP contains fewer packets than EXPECTED, it waits up to 30
>> seconds by
>> > +default for more packets to appear. The wait time can be customized
>> via the
>> > +``OVS_CTL_TIMEOUT`` environment variable.
>> > +
>> > +The reception of any extra or duplicate packets causes the test to
>> fail.
>> > +
>> > +OVN_CHECK_PACKETS_CONTAIN([PCAP], [EXPECTED])
>> > ++++++++++++++++++++++++++++++++++++++++++++++
>> > +
>> > +Macro to check packets read from PCAP contain data from EXPECTED.
>> Waits until
>> > +all expected packets are received, and ignores extra packets.
>> > +
>> > +OVN_CHECK_PACKETS_UNIQ([PCAP], [EXPECTED])
>> > +++++++++++++++++++++++++++++++++++++++++++
>> > +
>> > +Macro to check that all EXPECTED packets are received. Duplicate
>> packets are
>> > +ignored, however extra packets cause the test to fail.
>> > +
>> > +OVN_CHECK_PACKETS_REMOVE_BROADCAST([PCAP], [EXPECTED])
>> > +++++++++++++++++++++++++++++++++++++++++++++++++++++++
>> > +
>> > +Macro that waits until the expected number of packets (excluding
>> broadcasts)
>> > +are received. Then it compares EXPECTED and received packets. Any (non
>> > +broadcast), extra or duplicate packets cause the test to fail.
>> > +
>> > +check_uuid COMMAND
>> > +++++++++++++++++++
>> > +
>> > +Function to run COMMAND and check that it does not print anything else
>> than
>> > +uuid as output. It also fails if the output is empty.
>> > +
>> > +Daemon/Sandbox Management
>> > +~~~~~~~~~~~~~~~~~~~~~~~~~
>> > +
>> > +ovn_start [--backup-northd=none|paused] [AZ]
>> > +++++++++++++++++++++++++++++++++++++++++++++
>> > +
>> > +Creates and initializes ovn-sb and ovn-nb databases and starts their
>> > +ovsdb-server instance, sets appropriate environment variables so that
>> ovn-sbctl
>> > +and ovn-nbctl use them by default, and starts ovn-northd running
>> against them.
>> > +
>> > +Normally this starts only an active northd and no backup northd. The
>> following
>> > +options are accepted to adjust that:
>> > +
>> > +``--backup-northd``         Start a backup northd.
>> > +``--backup-northd=paused``  Start the backup northd in the paused
>> state.
>> > +``--use-tcp-to-sb``         Use TCP instead of SSL to connect to sb
>> database.
>> > +
>> > +The AZ parameter may name an arbitrary availability zone. If AZ is
>> specified
>> > +then the ovn-ic daemon is also started.
>> > +
>> > +net_add NETWORK
>> > ++++++++++++++++
>> > +
>> > +Function to create a new interconnection network named NETWORK.
>> > +
>> > +ovn_attach NETWORK BRIDGE IP [MASKLEN] [ENCAP]
>> > +++++++++++++++++++++++++++++++++++++++++++++++
>> > +
>> > +First, this function attaches BRIDGE to interconnection network
>> NETWORK.
>> > +Second, it configures (simulated) address IP (with network mask length
>> MASKLEN,
>> > +which defaults to 24) on BRIDGE. Finally, it configures the Open
>> vSwitch
>> > +database to work with OVN and starts ovn-controller.
>> > +
>> > +sim_add SANDBOX
>> > ++++++++++++++++
>> > +
>> > +Function to start a new simulated Open vSwitch instance named SANDBOX.
>> Files
>> > +related to the instance, such as logs, databases, sockets, and
>> pidfiles, are
>> > +created in a subdirectory of the main test directory also named
>> > +SANDBOX. Afterward, the ``as`` command (see below) can be used to run
>> Open
>> > +vSwitch commands in the context of the new sandbox.
>> > +
>> > +The new sandbox starts out without any bridges. Use ovs-vsctl in the
>> context of
>> > +the new sandbox to create a bridge, e.g.::
>> > +
>> > +    sim_add hv0           # Create sandbox hv0.
>> > +    as hv0                # Set hv0 as default sandbox.
>> > +    ovs-vsctl add-br br0  # Add bridge br0 inside hv0.
>> > +
>> > +or::
>> > +
>> > +     sim_add hv0
>> > +     as hv0 ovs-vsctl add-br br0
>> > +
>> > +as [OVS_DIR] COMMAND
>> > +++++++++++++++++++++
>> > +
>> > +``as $1`` sets the ``OVS_*DIR`` and ``OVN_*DIR*`` environment
>> variables to
>> > +point to $ovs_base/$1.
>> > +
>> > +``as $1 COMMAND...`` sets those variables in a subshell and invokes
>> COMMAND
>> > +there.
>> > +
>> > +wait_for_ports_up [PORT...]
>> > ++++++++++++++++++++++++++++
>> > +
>> > +With arguments, this function waits for specified Logical_Switch_Ports
>> to come
>> > +up. Without arguments, waits for all "plain" and router
>> Logical_Switch_Ports to
>> > +come up.
>> > +
>> > +PARSE_LISTENING_PORT(LOGFILE, VARIABLE)
>> > ++++++++++++++++++++++++++++++++++++++++
>> > +
>> > +Macro that parses the TCP or SSL/TLS port on which a server is
>> listening from
>> > +LOGFILE, given that the server was told to listen on a kernel-chosen
>> port, and
>> > +assigns the port number to shell VARIABLE. You should specify the
>> listening
>> > +remote as ptcp:0:127.0.0.1 or pssl:0:127.0.0.1, or the equivalent with
>> [::1]
>> > +instead of 127.0.0.1. Here's an example of how to use this with
>> ovsdb-server::
>> > +
>> > +    ovsdb-server --log-file --remote=ptcp:0:127.0.0.1 ...
>> > +    PARSE_LISTENING_PORT([ovsdb-server.log], [TCP_PORT])
>> > +
>> > +Now $TCP_PORT holds the listening port.
>> > +
>> > +OVN_POPULATE_ARP()
>> > +++++++++++++++++++
>> > +
>> > +Macro to pre-populate the ARP tables of all of the OVN instances that
>> have been
>> > +started with ```ovn_attach()``. That means that packets sent from one
>> > +hypervisor to another never get dropped or delayed by ARP resolution,
>> which
>> > +makes testing easier.
>> > +
>> > +OVS_TRAFFIC_VSWITCHD_START([vsctl-args], [vsctl-output], [=override])
>> > ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
>> > +
>> > +Macro to create a database and starts ovsdb-server, starts ovs-vswitchd
>> > +connected to that database, calls ovs-vsctl to create a bridge named
>> br0 with
>> > +predictable settings, passing 'vsctl-args' as additional commands to
>> > +ovs-vsctl. If 'vsctl-args' causes ovs-vsctl to provide output (e.g.
>> because it
>> > +includes "create" commands) then 'vsctl-output' specifies the expected
>> output
>> > +after filtering through uuidfilt.
>> > +
>> > +If a test needs to use "system" devices (as dummies), then specify
>> > +``=override`` (literally) as the third argument. Otherwise, system
>> devices
>> > +won't work at all (which makes sense because tests should not access a
>> system's
>> > +real Ethernet devices).
>> > +
>> > +OVS_TRAFFIC_VSWITCHD_STOP([WHITELIST], [extra_cmds])
>> > +++++++++++++++++++++++++++++++++++++++++++++++++++++
>> > +
>> > +Macro to gracefully stops ovs-vswitchd and ovsdb-server, checking
>> their log
>> > +files for messages with severity WARN or higher and signaling an error
>> if any
>> > +is present. The optional WHITELIST may contain shell-quoted "sed"
>> commands to
>> > +delete any warnings that are actually expected, e.g.::
>> > +
>> > +    OVS_TRAFFIC_VSWITCHD_STOP(["/expected error/d"])
>> > +
>> > +'extra_cmds' are shell commands to be executed afte
>> OVS_VSWITCHD_STOP() is
>> > +invoked. They can be used to perform additional cleanups such as name
>> space
>> > +removal.
>> > +
>> > +OVS_APP_EXIT_AND_WAIT(DAEMON)
>> > ++++++++++++++++++++++++++++++
>> > +
>> > +Ask the daemon named DAEMON to exit, via ``ovs-appctl``, and then wait
>> for it
>> > +to exit.
>> > +
>> > +OVN_CLEANUP(sim [, sim ...])
>> > +++++++++++++++++++++++++++++
>> > +
>> > +Macro to gracefully terminate all OVN daemons, including those in
>> specified
>> > +sandbox instances. Also checks the log file for messages with severity
>> WARN or
>> > +higher and signals an error if any is present. Optional arguments may
>> contain
>> > +"acceptable" error messages.
>> > +
>> > +Before terminating the daemons, it also issues recomputes on
>> ovn-controllers in
>> > +listed sandboxes, and checks whether the related ports and the
>> openflows before
>> > +and after recompute are the same. Optional arguments may also contain
>> > +acceptable ``related_ports`` differences, datapaths and tables on
>> which flow
>> > +differences are considered as acceptable.
>> > +
>> > +OVN_CLEANUP_SBOX(sbox)
>> > +++++++++++++++++++++++
>> > +
>> > +Macro to gracefully terminate OVN daemons in the specified sandbox
>> instance.
>> > +The sandbox name ``vtep`` is treated as a special case, and is assumed
>> to have
>> > +ovn-controller-vtep and ovs-vtep daemons running instead of
>> ovn-controller.
>> > +
>> > +Also checks the log file for messages with severity WARN or
>> > +higher and signals an error if any is present. Optional arguments may
>> contain
>> > +"acceptable" error messages.
>> > +
>> > +Before terminating the daemons, it also issues recomputes on
>> ovn-controllers in
>> > +listed sandboxes, and checks whether the related ports and the
>> openflows before
>> > +and after recompute are the same. Optional arguments may also contain
>> > +acceptable ``related_ports`` differences, datapaths and tables on
>> which flow
>> > +differences are considered as acceptable.
>> > +
>> > +OVN_CLEANUP_CONTROLLER(sbox)
>> > +++++++++++++++++++++++++++++
>> > +
>> > +Macro to gracefully terminate ovn-controller in the specified sandbox
>> > +instance. The sandbox name ``vtep`` is treated as a special case, and
>> is
>> > +assumed to have ovn-controller-vtep and ovs-vtep daemons running
>> instead of
>> > +ovn-controller.
>> > +
>> > +Issues recomputes on ovn-controllers in listed sandbox, and checks
>> whether the
>> > +related ports and the openflows before and after recompute are the
>> same.
>> > +Optional arguments may also contain acceptable ``related_ports``
>> differences,
>> > +datapaths and tables on which flow differences are considered as
>> acceptable.
>> > +
>> > +OVN_CLEANUP_IC([az ...])
>> > +++++++++++++++++++++++++
>> > +
>> > +Macro to gracefully terminate all interconnection DBs and daemons in
>> the
>> > +specified AZs, if any.
>> > +
>> > +Test Management
>> > +~~~~~~~~~~~~~~~
>> > +
>> > +OVN_FOR_EACH_NORTHD(TEST)
>> > ++++++++++++++++++++++++++
>> > +
>> > +Macro to wrap an arbitrary TEST. Defines versions of the TEST with all
>> > +combinations of northd, parallelization enabled and conditional
>> monitoring
>> > +on/off. Normally the first statement in TEST is a call to ``AT_SETUP``.
>> > +
>> > +OVN_FOR_EACH_NORTHD_NO_HV(TEST)
>> > ++++++++++++++++++++++++++++++++
>> > +
>> > +Macro to wrap an arbitrary TEST. Defines versions of the TEST with all
>> > +combinations of northd and parallelization enabled. To be used when the
>> > +ovn-controller configuration is not relevant. Normally the first
>> statement in
>> > +TEST is a call to ``AT_SETUP``.
>> > +
>> > +on_exit COMMAND
>> > ++++++++++++++++
>> > +
>> > +Function to add the shell COMMAND to a collection that is executed
>> when the
>> > +current test completes, as a cleanup action. The most common use is to
>> kill a
>> > +daemon started by the test. This is important to prevent tests that
>> start
>> > +daemons from hanging at exit.
>> > +
>> > +Cleanup commands are executed in the reverse order of calls to this
>> function.
>> > +
>> > +OVN_NBCTL(NBCTL_COMMAND)
>> > +++++++++++++++++++++++++
>> > +
>> > +Macro to add NBCTL_COMMAND to list of commands to be run by the
>> > +``RUN_OVN_NBCTL`` macro.
>> > +
>> > +RUN_OVN_NBCTL()
>> > ++++++++++++++++
>> > +
>> > +Macro to execute a list of commands built by the ``OVN_NBCTL`` macro.
>> The list
>> > +of commands is executed in a single invocation of ``ovn-nbctl``
>> > +
>> > +OVS_VSCTL(VSCTL_COMMAND)
>> > +++++++++++++++++++++++++
>> > +
>> > +Macro to add VSCTL_COMMAND to list of commands to be run by
>> ``RUN_OVS_VSCTL``.
>> > +
>> > +RUN_OVS_VSCTL()
>> > ++++++++++++++++
>> > +
>> > +Macro to execute the list of commands built by the ``OVS_VSCTL``
>> macro. The
>> > +list of commands is executed in a single invocation of ``ovs-vsctl``.
>> > +
>> > +OVS_WAIT_FOR_OUTPUT(COMMAND, EXIT-STATUS, STDOUT, STDERR)
>> > ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
>> > +
>> > +Executes shell COMMAND in a loop until it exits with status
>> EXIT-STATUS, prints
>> > +STDOUT on stdout, and prints STDERR on stderr. If this doesn't happen
>> within a
>> > +reasonable time limit, then the test fails.
>> > +
>> > +There is an ``OVS_WAIT_FOR_OUTPUT_UNQUOTED`` version of this macro
>> that expands
>> > +shell ``$variables``, ``$(command)``, and so on.  The plain version
>> does not
>> > +
>> > +OVS_WAIT_UNTIL(COMMAND[, IF-FAILED])
>> > +++++++++++++++++++++++++++++++++++++
>> > +
>> > +Macro that executes shell COMMAND in a loop until it returns zero
>> return code.
>> > +If COMMAND does not return zero code within reasonable time limit,
>> then the
>> > +test fails. In that case, runs IF-FAILED before exiting.
>> > +
>> > +OVS_WAIT_WHILE(COMMAND[, IF-FAILED])
>> > +++++++++++++++++++++++++++++++++++++
>> > +
>> > +Macro that executes shell COMMAND in a loop until it returns non-zero
>> return
>> > +code. If COMMAND does not return non-zero code within reasonable time
>> limit,
>> > +then the test fails. In that case, runs IF-FAILED before exiting.
>> > +
>> > +OVS_WAIT_UNTIL_EQUAL(COMMAND, OUTPUT)
>> > ++++++++++++++++++++++++++++++++++++++
>> > +
>> > +Macro that executes shell COMMAND in a loop until it returns zero and
>> the
>> > +output equals OUTPUT. If COMMAND does not return zero or a desired
>> output
>> > +within a reasonable time limit, fails the test.
>>
>> _______________________________________________
>> dev mailing list
>> d...@openvswitch.org
>> https://mail.openvswitch.org/mailman/listinfo/ovs-dev
>>
>>
Thank you Nick, Mark and Xavier,

I went ahead and merged this into main.

Regards,
Ales
_______________________________________________
dev mailing list
d...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to