Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Refactor netns handling, fix flakes, namespace some tests #227

Merged
merged 6 commits into from
May 15, 2024

Conversation

ti-mo
Copy link
Contributor

@ti-mo ti-mo commented May 14, 2024

Please see individual commits for the reasoning behind every change. I did some drive-by cleaning on the more obvious things I could fix quickly, driven by lessons learned working on other libraries.

Please let me know if this should be split up. Most of the changes are in testing and they follow logically, so I thought they made sense as a single PR.

ti-mo added 6 commits May 14, 2024 22:00
This commit introduces a breaking change to rtnetlink.NetNS.

The existing netns implementation had a few problems. It assumed that network
namespaces have names, that they would always be pinned to /var/run/netns, and
that numeric/integer references are pid references. This made the NetNS type
unusable for referring to existing netns by fd, such as ones created by other
libraries, or by opening procfs entries directly as demonstrated in the new
testutils.NetNS() function.

The forced dependency on the `ip` CLI tool also wasn't reasonable for a pure-Go
library. Using the old implementation in a scratch/distroless container would
quickly run into roadblocks.

This commit also removes the functionality of creating and pinning new netns.
There are plenty of options out in the Go ecosystem for that, and providing
your own is only a few lines of code.

Signed-off-by: Timo Beckers <timo@incline.eu>
…ck()

ebpf-go provides this out of the box and skips setting the rlimit on kernels
that support bpf memory cgroup accounting.

Signed-off-by: Timo Beckers <timo@incline.eu>
The flaky tests that were documented in the code are expected. Use the State
field to discard entries that can't reasonably be considered in tests.

Signed-off-by: Timo Beckers <timo@incline.eu>
When running tests locally, I would frequently hit "too many/little matches,
expected 1, actual 0" due to other tests creating and deleting interfaces in
the common host netns used by all tests.

Neigh entries that fail the interface lookup can't have their Interface fields
populated and should be dropped from the result since the interface is no longer
there to begin with.

Signed-off-by: Timo Beckers <timo@incline.eu>
While running the test suite for testing netns-related changes, I noticed
some of the xdp tests started failing because they wanted to create a dummy
interface in the host network namespace.

Avoid the complexity of managing dummy interfaces altogether by running all
tests within their own netns and use the existing lo device that's present by
default.

Signed-off-by: Timo Beckers <timo@incline.eu>
…nOldKernel

There were two implementations of this, so move them to common testutils.

Signed-off-by: Timo Beckers <timo@incline.eu>
@ti-mo ti-mo marked this pull request as ready for review May 14, 2024 20:01
@jsimonetti
Copy link
Owner

Thank you for these fixes! They are much appreciated.

Out of curiosity and you being a user of this library:
With regard to the NetNS compatibility change, would you consider a major version update to be expected? Given the freshness of v2, I am reluctant to go to v3 already.

@jsimonetti jsimonetti merged commit 3fefb86 into jsimonetti:master May 15, 2024
8 checks passed
@ti-mo ti-mo deleted the refactor-netns branch May 15, 2024 12:59
@ti-mo
Copy link
Contributor Author

ti-mo commented May 15, 2024

@jsimonetti Given the small amount of time (5-6 days) the first release including the netns API has been out, I don't think there's much risk breaking existing users, if that's what your after. 😄

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants