From b36475315b974e1ac3120156745b55daf1b7557c Mon Sep 17 00:00:00 2001 From: "Yann E. MORIN" Date: Sat, 15 Mar 2025 20:57:09 +0100 Subject: [PATCH] package/aardvark-dns: new package aardvark-dns is needed by netavark to provide cross-container DNS resolving with Podman. It is to be noted that netavark and aardvark-dns have to be updated in lock-step [0]. Update the podman runtime test to validate this is working. [0] https://github.com/containers/podman/blob/main/DISTRO_PACKAGE.md#networking-tools-netavark-aardvark-dns-passt Signed-off-by: Yann E. MORIN Signed-off-by: Julien Olivain --- package/Config.in | 1 + package/aardvark-dns/Config.in | 9 +++++ package/aardvark-dns/aardvark-dns.hash | 3 ++ package/aardvark-dns/aardvark-dns.mk | 15 ++++++++ package/netavark/Config.in | 1 + package/netavark/netavark.mk | 1 + package/podman/podman.mk | 1 + support/testing/tests/package/test_podman.py | 38 ++++++++++++++++++++ 8 files changed, 69 insertions(+) create mode 100644 package/aardvark-dns/Config.in create mode 100644 package/aardvark-dns/aardvark-dns.hash create mode 100644 package/aardvark-dns/aardvark-dns.mk diff --git a/package/Config.in b/package/Config.in index 7e98256cdf..4297903fd8 100644 --- a/package/Config.in +++ b/package/Config.in @@ -2411,6 +2411,7 @@ menu "Miscellaneous" endmenu menu "Networking applications" + source "package/aardvark-dns/Config.in" source "package/aircrack-ng/Config.in" source "package/alfred/Config.in" source "package/aoetools/Config.in" diff --git a/package/aardvark-dns/Config.in b/package/aardvark-dns/Config.in new file mode 100644 index 0000000000..83ef5a16f9 --- /dev/null +++ b/package/aardvark-dns/Config.in @@ -0,0 +1,9 @@ +config BR2_PACKAGE_AARDVARK_DNS + bool "aardvark-dns" + depends on BR2_PACKAGE_HOST_RUSTC_TARGET_ARCH_SUPPORTS + select BR2_PACKAGE_HOST_RUSTC + help + Authoritative dns server for A/AAAA container records. + Forwards other request to host's /etc/resolv.conf + + https://github.com/containers/aardvark-dns/ diff --git a/package/aardvark-dns/aardvark-dns.hash b/package/aardvark-dns/aardvark-dns.hash new file mode 100644 index 0000000000..5327a38b7e --- /dev/null +++ b/package/aardvark-dns/aardvark-dns.hash @@ -0,0 +1,3 @@ +# Locally computed +sha256 bbd4a0b0bdf6788c09266f1f944d5c5397b6db4f1da0735a1d42738a6e074249 aardvark-dns-v1.14.0-git4-cargo2.tar.gz +sha256 c71d239df91726fc519c6eb72d318ec65820627232b2f796219e87dcf35d0ab4 LICENSE diff --git a/package/aardvark-dns/aardvark-dns.mk b/package/aardvark-dns/aardvark-dns.mk new file mode 100644 index 0000000000..a2e74a72bf --- /dev/null +++ b/package/aardvark-dns/aardvark-dns.mk @@ -0,0 +1,15 @@ +################################################################################ +# +# aardvark-dns +# +################################################################################ + +# When updating the version here, also update netavark in lockstep +AARDVARK_DNS_VERSION = v1.14.0 +AARDVARK_DNS_SITE = https://github.com/containers/aardvark-dns +AARDVARK_DNS_SITE_METHOD = git + +AARDVARK_DNS_LICENSE = Apache-2.0 +AARDVARK_DNS_LICENSE_FILES = LICENSE + +$(eval $(cargo-package)) diff --git a/package/netavark/Config.in b/package/netavark/Config.in index cf7b731141..c78e57556f 100644 --- a/package/netavark/Config.in +++ b/package/netavark/Config.in @@ -2,6 +2,7 @@ config BR2_PACKAGE_NETAVARK bool "netavark" depends on BR2_PACKAGE_HOST_RUSTC_TARGET_ARCH_SUPPORTS select BR2_PACKAGE_HOST_RUSTC + select BR2_PACKAGE_AARDVARK_DNS # runtime select BR2_PACKAGE_IPTABLES if !BR2_PACKAGE_NFTABLES # runtime select BR2_PACKAGE_NFTABLES_JSON if BR2_PACKAGE_NFTABLES && !BR2_PACKAGE_IPTABLES help diff --git a/package/netavark/netavark.mk b/package/netavark/netavark.mk index c96912ef5a..31d0b28b74 100644 --- a/package/netavark/netavark.mk +++ b/package/netavark/netavark.mk @@ -4,6 +4,7 @@ # ################################################################################ +# When updating the version here, also update aardvark-dns in lockstep NETAVARK_VERSION = v1.14.0 NETAVARK_SITE = https://github.com/containers/netavark NETAVARK_SITE_METHOD = git diff --git a/package/podman/podman.mk b/package/podman/podman.mk index 48b4cd9b27..29c5591a0a 100644 --- a/package/podman/podman.mk +++ b/package/podman/podman.mk @@ -101,6 +101,7 @@ PODMAN_POST_INSTALL_TARGET_HOOKS += PODMAN_CONFIG define PODMAN_HELPERS $(Q)mkdir -p $(TARGET_DIR)/usr/libexec/podman + $(Q)ln -sf ../../bin/aardvark-dns $(TARGET_DIR)/usr/libexec/podman/aardvark-dns $(Q)ln -sf ../../bin/netavark $(TARGET_DIR)/usr/libexec/podman/netavark $(Q)ln -sf ../../bin/slirp4netns $(TARGET_DIR)/usr/libexec/podman/slirp4netns $(PODMAN_HELPER_INIT) diff --git a/support/testing/tests/package/test_podman.py b/support/testing/tests/package/test_podman.py index e2b0598961..44211b438e 100644 --- a/support/testing/tests/package/test_podman.py +++ b/support/testing/tests/package/test_podman.py @@ -166,6 +166,44 @@ class PodmanBase(infra.basetest.BRTest): output, _ = self.emulator.run('echo ${br_container}') self.assertEqual(output[0], "", "Still in a container") + # Test networking between two containers + self.assertRunOk("podman network create buz") + self.assertRunOk( + "podman container run --rm -ti --name pod007 --network buz --detach busybox:1.37.0", + ) + self.assertRunOk( + "podman container run --rm -ti --name pod006 --network buz --detach busybox:1.37.0", + ) + # Ensure each pod can resolv itself and the other + # (not using itertools.matrix() just for those trivial combinations) + for pod1, pod2 in [ + ("pod006", "pod006"), + ("pod006", "pod007"), + ("pod007", "pod007"), + ("pod007", "pod006"), + ]: + output, exit_code = self.emulator.run( + f"podman container exec {pod1} nslookup {pod2}", + ) + self.assertEqual(exit_code, 0) + self.assertTrue(output[0].startswith("Server:")) + self.assertTrue(output[1].startswith("Address:")) + # Busybox' nslookup emits one "Non-authoritative answer" per + # supported address familly: IPv4 and IPv6. + self.assertEqual( + len([line for line in output[2:] if line == "Non-authoritative answer:"]), + 2, + ) + # But only IPv4 is available on this network + self.assertEqual( + len([line for line in output[2:] if line.startswith("Address:")]), + 1, + ) + self.assertRunOk("podman container kill --all") + output, _ = self.emulator.run("podman container ls --format '{{ json }}'") + pod_info = json.loads("".join(output)) + self.assertEqual(len(pod_info), 0, f"{len(pod_info)} container(s) still present, expecting 0") + # Remove the offical image self.assertRunOk('podman image rm busybox:1.37.0') output, _ = self.emulator.run("podman image ls --format '{{ json }}'")