From b5c69f15eca954cfdc170d147c8fac3dbef04c6f Mon Sep 17 00:00:00 2001 From: mgorsk1 Date: Tue, 13 Aug 2024 07:54:52 +0200 Subject: [PATCH 1/3] refactor network setup Signed-off-by: mgorsk1 --- core/testcontainers/core/container.py | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/core/testcontainers/core/container.py b/core/testcontainers/core/container.py index 085fc58e1..9d3a93c51 100644 --- a/core/testcontainers/core/container.py +++ b/core/testcontainers/core/container.py @@ -4,6 +4,8 @@ from typing import TYPE_CHECKING, Optional import docker.errors +from docker import version +from docker.types import EndpointConfig from typing_extensions import Self from testcontainers.core.config import testcontainers_config as c @@ -88,6 +90,13 @@ def start(self) -> Self: logger.info("Pulling image %s", self.image) docker_client = self.get_docker_client() self._configure() + + network_kwargs = { + 'network': self._network.name, + 'networking_config': {self._network.name: EndpointConfig(version.__version__, aliases=self._network_aliases)}} \ + if self._network \ + else {} + self._container = docker_client.run( self.image, command=self._command, @@ -96,11 +105,10 @@ def start(self) -> Self: ports=self.ports, name=self._name, volumes=self.volumes, - **self._kwargs, - ) + **network_kwargs, + **self._kwargs) + logger.info("Container started: %s", self._container.short_id) - if self._network: - self._network.connect(self._container.id, self._network_aliases) return self def stop(self, force=True, delete_volume=True) -> None: From eb30486874b1a3a5701cd36e8edecce4b6f1178d Mon Sep 17 00:00:00 2001 From: mgorsk1 Date: Tue, 13 Aug 2024 07:55:30 +0200 Subject: [PATCH 2/3] make linter happy Signed-off-by: mgorsk1 --- core/testcontainers/core/container.py | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/core/testcontainers/core/container.py b/core/testcontainers/core/container.py index 9d3a93c51..e9415441a 100644 --- a/core/testcontainers/core/container.py +++ b/core/testcontainers/core/container.py @@ -91,11 +91,16 @@ def start(self) -> Self: docker_client = self.get_docker_client() self._configure() - network_kwargs = { - 'network': self._network.name, - 'networking_config': {self._network.name: EndpointConfig(version.__version__, aliases=self._network_aliases)}} \ - if self._network \ + network_kwargs = ( + { + "network": self._network.name, + "networking_config": { + self._network.name: EndpointConfig(version.__version__, aliases=self._network_aliases) + }, + } + if self._network else {} + ) self._container = docker_client.run( self.image, @@ -106,7 +111,8 @@ def start(self) -> Self: name=self._name, volumes=self.volumes, **network_kwargs, - **self._kwargs) + **self._kwargs, + ) logger.info("Container started: %s", self._container.short_id) return self From 44186f02ed8548f0c3326113d68b7c19feb5ee7b Mon Sep 17 00:00:00 2001 From: mgorsk1 Date: Tue, 13 Aug 2024 08:50:19 +0200 Subject: [PATCH 3/3] extend tests Signed-off-by: mgorsk1 --- core/tests/test_network.py | 52 +++++++++++++++++++++++--------------- 1 file changed, 32 insertions(+), 20 deletions(-) diff --git a/core/tests/test_network.py b/core/tests/test_network.py index 7191153bb..868032e26 100644 --- a/core/tests/test_network.py +++ b/core/tests/test_network.py @@ -45,26 +45,32 @@ def test_network_create_errors(): def test_containers_can_communicate_over_network(): - with Network() as network: - with ( - DockerContainer(NGINX_ALPINE_SLIM_IMAGE) - .with_name("alpine1") - .with_network_aliases("alpine1-alias-1", "alpine1-alias-2") - .with_network(network) as alpine1 - ): - with ( - DockerContainer(NGINX_ALPINE_SLIM_IMAGE) - .with_name("alpine2") - .with_network_aliases("alpine2-alias-1", "alpine2-alias-2") - .with_network(network) as alpine2 - ): - assert_can_ping(alpine1, "alpine2") - assert_can_ping(alpine1, "alpine2-alias-1") - assert_can_ping(alpine1, "alpine2-alias-2") - - assert_can_ping(alpine2, "alpine1") - assert_can_ping(alpine2, "alpine1-alias-1") - assert_can_ping(alpine2, "alpine1-alias-2") + with ( + Network() as network, + DockerContainer(NGINX_ALPINE_SLIM_IMAGE) + .with_name("alpine1") + .with_network_aliases("alpine1-alias-1", "alpine1-alias-2") + .with_network(network) as alpine1, + DockerContainer(NGINX_ALPINE_SLIM_IMAGE) + .with_name("alpine2") + .with_network_aliases("alpine2-alias-1", "alpine2-alias-2") + .with_network(network) as alpine2, + ): + assert_can_ping(alpine1, "alpine2") + assert_can_ping(alpine1, "alpine2-alias-1") + assert_can_ping(alpine1, "alpine2-alias-2") + + assert_can_ping(alpine2, "alpine1") + assert_can_ping(alpine2, "alpine1-alias-1") + assert_can_ping(alpine2, "alpine1-alias-2") + + assert_can_request(alpine1, "alpine2") + assert_can_request(alpine1, "alpine2-alias-1") + assert_can_request(alpine1, "alpine2-alias-2") + + assert_can_request(alpine2, "alpine1") + assert_can_request(alpine2, "alpine1-alias-1") + assert_can_request(alpine2, "alpine1-alias-2") def assert_can_ping(container: DockerContainer, remote_name: str): @@ -73,6 +79,12 @@ def assert_can_ping(container: DockerContainer, remote_name: str): assert "64 bytes" in str(output) +def assert_can_request(container: DockerContainer, remote_name: str): + status, output = container.exec(f"wget -qO- http://{remote_name}") + assert status == 0 + assert "Welcome to nginx!" in output.decode() + + def test_network_has_labels(): network = Network() try: