Commit
157897523e54762ec3739cd7842c7b5f5d724ac2
by Oliver Smith
ruff.toml: new file
Add a file in the root dir of the repository to allow running "ruff format" in order to auto-format the code with expected max line length, PEP-8, etc.
Replace _testenv/pyproject.toml with .ruff.toml in the root directory of the repository, so we can exclude "compare-results.py" which doesn't follow that code style. Otherwise it would get formatted too when running "ruff format" in the root dir of the repository.
Commit
6f020365e24375e3788a4d73622d72b67fc2d9ad
by Oliver Smith
testenv: improve --config argument parsing
* Support using wildcards for the config names via fnmatch as that makes it much easier to run the ggsn tests against all osmo-ggsn config variations, and update the examples in "testenv.py -h" to illustrate this. * Fix that it didn't complain about an invalid --config argument, as long as there was a valid --config argument before it. * Let raise_error_config_arg only output the invalid --config argument instead of all of them. * Complain if "--config all" is used in combination with another --config argument. * Sort testenv*.cfg files found alphabetically, so they are always executed in the same order.
Commit
9cc15715929078970d773b5a419fbbe928a84620
by Oliver Smith
ggsn: testenv: fix paths in copy= and clean=
I had moved osmo-ggsn related files to the osmo-ggsn directory and forgot to adjust testenv_osmo_ggsn_{v4,v6,v4v6}_only.cfg. Fix it by changing it like it is in testenv_osmo_ggsn_all.cfg
Commit
b8c0bc745c5d86fd9d5b292e77a54e28505525f7
by Oliver Smith
ggsn: testenv: add libosmocore-utils to package=
Add libosmocore-utils, so osmo-config-merge is installed when running with --binary-repo too. The osmo-config-merge program is used in osmo-ggsn/testenv.sh to merge the configs.
Commit
faa6fc2d3083e1d074a3a3e6ca8714c920a6d453
by laforge
library: add generic Mutex API for parallel components
In certain scenarios, it's required to ensure that only one of multiple parallel components executes a specific code block at any given time.
This, for example, is the case for the S1GW testsuite, where we want to simulate multiple eNBs establishing E-RABs. Each new E-RAB triggers the IUT (osmo-s1gw) to send a PFCP Session Establishment Request, and there is no way for the PFCPEM to correlate which session belongs to which eNB. This problem can be solved by ensuring that only one eNB is triggering the PFCP Session Establishment Request(s) at a time.
This patch implements a generic Mutex API, which can also be used by other testsuites that orchestrate multiple parallel components.
Commit
aaa88deeb3ef7f53f9867438ee7fcad9b7df8e11
by laforge
library/PFCP_Emulation: a better PDU routing concept
In recently merged 2962d170 I wrongly assumed, that SEID of outgoing PFCP PDUs can be used to correlate and route the incoming PDUs. In fact, the PFCP peers use two different SEID values, negotiating them using the F-SEID IE.
We could have implemented a logic to look for F-SEID in the outgoing PDUs, store and then use it for routing. However, a more flexible approach is to allow the the PFCP_ConnHdlr components to subscribe and unsubscribe to/from specific SEID values explicitly.
In this spirit, let's allow the PFCP_ConnHdlr components to subscribe and unsubscribe to/from broadcast PDUs (i.e. those, for which the PFCPEM component could not find a single recipient) explicitly.
Implicit routing using the SeqNr remains unchanged and will be performed by the PFCPEM component automatically like before.
Change-Id: I25802471519fa297ad4cb2b056adaa6748b00af2 Related: 2962d170 "library/PFCP_Emulation: fix routing of incoming PDUs"
Commit
19ef9f42928774f09248f907795c6cbf8c31cf84
by laforge
library: as_pfcp_ignore(): log SeqNr of received PDUs
Printing the PFCP PDU template ('?' by default) is not very informative when reading logs. Printing the message type of the received PDU is not informative either, because message types are defined as numbers in PFCP_Types.ttcn. Printing the whole PDU is way too verbose, and would be redundant given that the PFCPEM component already does print all received PDUs. Let's print the sequence number.
Commit
ff60a63c2aa656978cfdaf5958e21fadf8462ef5
by laforge
Revert "s1gw: cache PFCP Recovery Timestamp in ConnHdlr"
This reverts commit 7ad95e1cfb00d269069bd052c44a9cae9027f763.
A follow-up commit will remove the need for each ConnHdlr to call f_ConnHdlr_register_pfcp(), that among with handling the PFCP association retrieves a PFCP Recovery Timestamp from the PFCPEM.
Caching the PFCP Recovery Timestamp value is not really worth it, since it's rarely used and can always be retrieved on demand.
Commit
17f589464ba4063f12f3b03a9a958f492ad6d88f
by laforge
s1gw: move PFCP association handling into a dedicated ConnHdlr
Previously, the PFCP association request from the IUT was handled by the first ConnHdlr component (idx := 0). While this approach has worked, it fails when multiple ConnHdlr instances (idx > 0) are spawned.
The problem arises when other ConnHdlr (idx > 0) instances initiate PFCP procedures before the first ConnHdlr (idx := 0) has established the association, so we end up playing races.
This patch introduces a dedicated ConnHdlr component to handle the PFCP association independently. Once the association is established, the actual test ConnHdlr instances are spawned, ensuring a more reliable and orderly process.
Commit
2f6d76c9dd982fbf9c6660e875fb6d3aa3beced6
by laforge
s1gw: add multi-eNB variants of TC_e_rab_setup
The idea is to simulate multiple eNBs establishing one or more E-RAB(s) simultaneously. In order to achieve that, use the new Mutex API to ensure that only one ConnHdlr component is triggering PFCP session establishment at any given time.
The problem is that there is no way for the PFCPEM component to correlate which PFCP session belongs to which eNB when multiple ConnHdlr instances establish E-RAB(s) in parallel. This can be solved by making a part of the test scenario synchronous.
Commit
7108643171a3fc71a75e4ff7434b5252c7df5b2e
by Oliver Smith
testenv: podman: disable send_redirects
When starting podman, set the following sysctls to avoid ICMP redirects. ICMP redirects lead to test failures (TC_pdp4_clients_interact in the GGSN testsuite), and should not be sent in the test environment in general.
It is really needed to set both "all" and "default", or otherwise ICMP redirects still show up. I've seen setting both in this patch: https://patchwork.kernel.org/project/linux-kselftest/patch/1570719055-25110-4-git-send-email-yanhaishuang@cmss.chinamobile.com/
Commit
32662ad138fdd36fb9962e59711d1e9514417793
by Oliver Smith
testenv: requirements: find programs in /usr/sbin
Fix that testenv complains about a missing setcap program, if it is in /usr/sbin/setcap and /usr/sbin is not in PATH as it is the case with Debian. We actually run setcap with sudo when it is needed, and in that case /usr/sbin gets added to PATH in Debian.
Commit
23a36504bbed820c4025220577f8dee67b7196e3
by Oliver Smith
testenv: podman: remove mongodb-org.list
Remove mongodb-org.list at the end of building the podman image, as we only need to install mongodb once in the container but won't use the repository afterwards. This avoids checking the mongodb repository in "apt update".
Commit
d2a8a91a86bdc300252aef6f78d052c14e2a47d4
by Oliver Smith
testenv: podman: don't install GUI packages
Install erlang-nox and use the pre-built rebar3 as linked from rebar3.org, instead of using the Debian package to avoid pulling in ~600 MB of GUI dependencies.
Commit
c84c196c6bcd3dc78c5f42fb9c3e3944a6fa88c7
by Oliver Smith
ggsn: osmo-ggsn.src.cfg: tweak log output
* Print log levels. * Don't print categories as hex. * Print the basename at the end of the line. * Remove "logging level lgtp debug", there already is "logging level lgtp info" further above, and this is a more sensible setting. With "debug" there are way too many log messages in e.g. TC_lots_of_concurrent_pdp_ctx.
Commit
2d00ff393d38f569a817c50ea1d94f16a38c2e50
by Oliver Smith
ggsn: testenv: replace dummy netdev with bridge
Replace the dummy netdev that was used as network device reachable through the GTP tunnel that can answer ICMP, with a bridge device. The bridge device fulfils the same purpose, plus it can be used in a future patch to connect osmo-ggsn when it is running in QEMU with the testsuite.
Commit
5ac9dc135751a053684a0d572a73879f4b41dd97
by Oliver Smith
testenv: bridge: change default IPs 201 -> 1
During code review it was decided that we want to keep the 127.0.0.1 (and other 127.0.0.x) IPs in the configs, so one can start the testsuite with osmo-ggsn directly on the host without using testenv scripts too, with the same config.
The testenv script for osmo-ggsn will replace 127.0.0.x with 172.18.3.x on the fly before the testsuite starts, so we can run osmo-ggsn optionally in QEMU on 172.18.3.2, which will be bridged to the host.
172.18.3.1 will be used by the GGSN testsuite now, instead of 172.18.3.201 as previously planned, so change the default IP of the bridge. The bridge is not used for another testsuite yet.
Add the 201 IPs as EXTRA_IPS for the non-QEMU case, as they are configured as DNS IPs and tests need to be able to reach them.
Commit
d82c9efed9bc44302d0bf428a0234727c961037e
by Oliver Smith
ggsn: testenv: run SUT on bridge instead of lo
Replace IPs in testenv.sh so the SUT runs on 172.18.3.2 (testenv0 bridge) instead of 127.0.0.2 (lo). Later on when we can optionally use QEMU with osmo-ggsn to test kernel GTP-U. It will then run on this IP as well. So with this change we can use the same IP for both the QEMU and non-QEMU case.
Commit
fffa8ec1f928afe200e94e5a5c4561c2251bf38f
by Oliver Smith
ggsn: testenv: change VTY IP
Access the VTY of osmo-ggsn via 172.18.3.2 (127.0.0.2 if running without testenv), so the testsuite can access the VTY when osmo-ggsn optionally runs in QEMU too (through the bridge).
Commit
caaa0d631b8a8a4f8ed426455c36ca7e94c62ba0
by Oliver Smith
testenv: support running SUT in QEMU
Add two new arguments -C|--custom-kernel and -D|--debian-kernel. If any of these is set, pass an environment variable TESTENV_QEMU_KERNEL with the path to the kernel when running commands from testenv.cfg.
These commands can then source the new qemu_functions.sh and use it to build an initramfs with the SUT and depending libraries on the fly, and start up QEMU to boot right to starting the SUT. All of that takes about ~1s on my system with kvm. Without kvm ~5s.
A follow-up patch will adjust the ggsn testenv configs to optionally run osmo-ggsn in QEMU for testing kernel GTP-U.
These scripts are based on scripts/kernel-tests from docker-playground.