Retis is very useful for debugging our system tests or debugging
kernel issues through our system tests.  This change adds a convenient
way to run any kernel system test with the retis capture on the
background.  E.g.:

  make check-kernel OVS_TEST_WITH_RETIS=yes TESTSUITEFLAGS='167 -d'

Retis 1.5 is required, since we're using ifdump profile, and it also
will mount debugfs for us in case of running in a different namespace.
It should be available in $PATH.

In addition to just capturing the retis.data, we're also running the
capture with --print to print all the events as they appear, and
producing the sorted output in the end.  This makes it easier to work
across systems with different versions of retis and saves time for
running the sort manually.  The raw data is still available for
advanced processing, if needed.

Not specifying any particular collector, capturing everything that's
enabled by default.  OVS tracking is turned on by default.

Since OVS tracking is used, it's required to start retis after the
kernel datapath is created, otherwise it will fail to obtain the map
of upcall PIDs.  That's why we need to start it after the bridge is
created.

Only adding support for kernel-related test suites for now.  For
userspace test suites it may also be useful at some point, but
currently that requires running without --ovs-track and isn't too
important.

Startup of the retis capture adds significant amount of time to each
test, so not running it by default.

Link: https://github.com/retis-org/retis
Signed-off-by: Ilya Maximets <i.maxim...@ovn.org>
---
 Documentation/topics/testing.rst          | 22 ++++++++++++++++++++++
 NEWS                                      |  3 +++
 tests/ovs-macros.at                       | 10 ++++++++++
 tests/system-kmod-macros.at               |  3 +++
 tests/system-offloads-testsuite-macros.at |  3 +++
 5 files changed, 41 insertions(+)

diff --git a/Documentation/topics/testing.rst b/Documentation/topics/testing.rst
index b97bf32a9..78f38ecf5 100644
--- a/Documentation/topics/testing.rst
+++ b/Documentation/topics/testing.rst
@@ -455,6 +455,28 @@ datapath testsuite.
 
   https://git.kernel.org/pub/scm/network/iproute2/iproute2.git
 
+It is also possible to run `retis`_ capture along with the tests by setting
+`OVS_TEST_WITH_RETIS` environment variable to 'yes'.  This can be useful for
+debugging the test cases.  For example, the following command can be used to
+run the test 167 under retis::
+
+    $ make check-kernel OVS_TEST_WITH_RETIS=yes TESTSUITEFLAGS='167 -d'
+
+After the test is completed, the following data will be available in the test
+directory:
+
+* `retis.err` - standard error stream of the `retis collect`.
+* `retis.log` - standard output of the `retis collect`, contains all captured
+  events in the order they appeared.
+* `retis.data` - raw events collected by retis, `retis sort` or other commands
+  can be used on this file for further analysis.
+* `retis.sorted` - text file containing the output of `retis sort` executed on
+  the `retis.data`, for convenience.
+
+Requires retis version 1.5 or newer.
+
+.. _retis: https://github.com/retis-org/retis
+
 .. _testing-static-analysis:
 
 Static Code Analysis
diff --git a/NEWS b/NEWS
index d7231fabc..3439a70d6 100644
--- a/NEWS
+++ b/NEWS
@@ -24,6 +24,9 @@ Post-v3.5.0
    - ovs-tcpdump:
      * Update the --mirror-to option, adding support for specifying an
        existing port as a mirror interface.
+   - Added support for running tests from 'check-kernel' and 'check-offloads'
+     system test targets under retis by setting OVS_TEST_WITH_RETIS=yes.
+     See the 'Testing' section of the documentation for more details.
    - Updated documentation to remove most documentation of kernel module
      that was previously part of the OVS distribution. It was removed from
      the OVS distribution in the 3.0 release and is no longer present in
diff --git a/tests/ovs-macros.at b/tests/ovs-macros.at
index 738cda2e4..132a00541 100644
--- a/tests/ovs-macros.at
+++ b/tests/ovs-macros.at
@@ -360,6 +360,16 @@ m4_ifndef([AT_FAIL_IF],
     [AT_CHECK([($1) \
     && exit 99 || exit 0], [0], [ignore], [ignore])])])
 
+dnl Start retis to track all the traffic passing through OVS.
+m4_define([RETIS_CHECK_AND_RUN],
+  [if test "$OVS_TEST_WITH_RETIS" = yes && retis --version > /dev/null; then
+       on_exit 'retis sort --utc retis.data > retis.sorted'
+       OVS_DAEMONIZE([retis -p ifdump collect --utc --allow-system-changes \
+                          --ovs-track --out --print 2>retis.err 1>retis.log],
+                     [retis.pid])
+       OVS_WAIT_UNTIL([grep -q 'loaded' retis.err])
+   fi])
+
 dnl Add a rule to always accept the traffic.
 dnl The first argument to this macro should be the command to run:
 dnl iptables or ip6tables
diff --git a/tests/system-kmod-macros.at b/tests/system-kmod-macros.at
index f7e9ff689..1de0e616b 100644
--- a/tests/system-kmod-macros.at
+++ b/tests/system-kmod-macros.at
@@ -29,6 +29,9 @@ m4_define([OVS_TRAFFIC_VSWITCHD_START],
    _OVS_VSWITCHD_START([], [$3])
    dnl Add bridges, ports, etc.
    AT_CHECK([ovs-vsctl -- _ADD_BR([br0]) -- $1 m4_if([$2], [], [], [| 
uuidfilt])], [0], [$2])
+
+   dnl Start retis capture if requested.
+   RETIS_CHECK_AND_RUN()
 ])
 
 # OVS_TRAFFIC_VSWITCHD_STOP([ALLOWLIST], [extra_cmds])
diff --git a/tests/system-offloads-testsuite-macros.at 
b/tests/system-offloads-testsuite-macros.at
index e6d044d21..c80538fd6 100644
--- a/tests/system-offloads-testsuite-macros.at
+++ b/tests/system-offloads-testsuite-macros.at
@@ -27,6 +27,9 @@ m4_define([OVS_TRAFFIC_VSWITCHD_START],
    _OVS_VSWITCHD_START([], [-- set Open_vSwitch . other_config:hw-offload=true 
$3])
    dnl Add bridges, ports, etc.
    AT_CHECK([ovs-vsctl -- _ADD_BR([br0]) -- $1 m4_if([$2], [], [], [| 
uuidfilt])], [0], [$2])
+
+   dnl Start retis capture if requested.
+   RETIS_CHECK_AND_RUN()
 ])
 
 # Macro to exclude tests that will fail with TC offload enabled.
-- 
2.49.0

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

Reply via email to