From 4941bac4099127b54ae4c1a27b770155273e6342 Mon Sep 17 00:00:00 2001 From: Songmin Li Date: Wed, 18 Dec 2024 19:59:35 +0200 Subject: [PATCH] Add integration test for network scoped aliases Signed-off-by: Songmin Li --- podman_compose.py | 4 +- .../docker-compose.yaml | 33 ++++++++ ...t_podman_compose_network_scoped_aliases.py | 84 +++++++++++++++++++ 3 files changed, 119 insertions(+), 2 deletions(-) create mode 100644 tests/integration/network_scoped_aliases/docker-compose.yaml create mode 100644 tests/integration/test_podman_compose_network_scoped_aliases.py diff --git a/podman_compose.py b/podman_compose.py index 7b4fe12b..630b46dd 100755 --- a/podman_compose.py +++ b/podman_compose.py @@ -977,9 +977,9 @@ def get_net_args_from_networks(compose, cnt): ipv4 = net_config_.get("ipv4_address") ipv6 = net_config_.get("ipv6_address") - + # custom extension; not supported by docker-compose v3 mac = net_config_.get("x-podman.mac_address") - aliases_on_net = net_config_.get("aliases") + aliases_on_net = norm_as_list(net_config_.get("aliases", [])) # if a mac_address was specified on the container level, apply it to the first network # This works for Python > 3.6, because dict insert ordering is preserved, so we are diff --git a/tests/integration/network_scoped_aliases/docker-compose.yaml b/tests/integration/network_scoped_aliases/docker-compose.yaml new file mode 100644 index 00000000..1a5a630a --- /dev/null +++ b/tests/integration/network_scoped_aliases/docker-compose.yaml @@ -0,0 +1,33 @@ +--- +networks: + net0: + ipam: + config: + - subnet: "172.19.3.0/24" + net1: + ipam: + config: + - subnet: "172.19.4.0/24" +services: + web1: + image: busybox + command: ["/bin/busybox", "httpd", "-f", "-h", "/tmp", "-p", "8001"] + networks: + net0: + ipv4_address: "172.19.3.11" + aliases: + - secure-web + net1: + ipv4_address: "172.19.4.11" + aliases: + - insecure-web + utils-net0: + image: busybox + command: ["/bin/busybox", "httpd", "-f", "-h", "/tmp", "-p", "8001"] + networks: + - net0 + utils-net1: + image: busybox + command: ["/bin/busybox", "httpd", "-f", "-h", "/tmp", "-p", "8001"] + networks: + - net1 diff --git a/tests/integration/test_podman_compose_network_scoped_aliases.py b/tests/integration/test_podman_compose_network_scoped_aliases.py new file mode 100644 index 00000000..8e478fad --- /dev/null +++ b/tests/integration/test_podman_compose_network_scoped_aliases.py @@ -0,0 +1,84 @@ +# SPDX-License-Identifier: GPL-2.0 + +# pylint: disable=redefined-outer-name +import os +import unittest + +from tests.integration.test_podman_compose import podman_compose_path +from tests.integration.test_podman_compose import test_path +from tests.integration.test_utils import RunSubprocessMixin + + +class TestPodmanComposeNetworkScopedAliases(RunSubprocessMixin, unittest.TestCase): + @staticmethod + def compose_file(): + """Returns the path to the compose file used for this test module""" + return os.path.join(test_path(), "network_scoped_aliases", "docker-compose.yaml") + + def test_network_scoped_aliases(self): + try: + self.up() + self.verify() + finally: + self.down() + + def up(self): + up_cmd = [ + "coverage", + "run", + podman_compose_path(), + "-f", + self.compose_file(), + "up", + "-d", + "--force-recreate", + ] + + self.run_subprocess_assert_returncode(up_cmd) + + def down(self): + down_cmd = [ + "coverage", + "run", + podman_compose_path(), + "-f", + self.compose_file(), + "kill", + "-a", + ] + self.run_subprocess(down_cmd) + + def verify(self): + expected_results = [ + ("utils-net0", "web1", ["172.19.3.11"]), + ("utils-net0", "secure-web", ["172.19.3.11"]), + ("utils-net0", "insecure-web", []), + ("utils-net1", "web1", ["172.19.4.11"]), + ("utils-net1", "secure-web", []), + ("utils-net1", "insecure-web", ["172.19.4.11"]), + ] + + for utils, service, expected_result in expected_results: + cmd = [ + podman_compose_path(), + "-f", + self.compose_file(), + "exec", + utils, + "nslookup", + service, + ] + out, _, _ = self.run_subprocess(cmd) + addresses = self.parse_dnslookup(out.decode()) + self.assertEqual(addresses, expected_result) + + def parse_dnslookup(self, output): + lines = output.splitlines() + addresses = [] + for line in lines: + if line.startswith("Address"): + addr = line.split(":", 1)[1].strip() + if ":" not in addr: + addresses.append(addr) + + return list(sorted(set(addresses)))