testcontainers / testcontainers-python

Testcontainers is a Python library that providing a friendly API to run Docker container. It is designed to create runtime environment to use during your automatic tests.
https://testcontainers-python.readthedocs.io/en/latest/
Apache License 2.0
1.61k stars 296 forks source link

Feature: Proper type hinting for UDP ports bindings #674

Open champialex opened 3 months ago

champialex commented 3 months ago

I'm trying to bind udp ports:

def telegraf(network: Network):
    ctr = DockerContainer(image="telegraf:1.31.1")
    ctr.with_volume_mapping(f"{CURRENT_DIR}/telegraf_test.conf", "/etc/telegraf/telegraf.d/telegraf_test.conf")
    ctr.with_exposed_ports("8094/tcp")  # Telegraf ports
    ctr.with_bind_ports("8125/udp", "8125/udp")
    ctr.with_bind_ports("8092/udp", "8092/udp")
    _connect_to_network(ctr, network, "telegraf")
    return ctr

It works fine, except that ports are type hinted as int, leading to sad squiggly lines in IDEs.

Could we change type hints of port APIs to allow strings, to make it nicer to define more fine grain port specs?

    def with_bind_ports(self, container: str, host: Optional[str] = None): ...

    def with_exposed_ports(self, *ports: str): ...

  def get_exposed_port(self, port: str): ...
alexanderankin commented 3 months ago

open to a pr for this!

Tranquility2 commented 3 months ago

please note that def get_exposed_port(self, port: str): ... is probably wrong as it uses

mapped_port = self.get_docker_client().port(self._container.id, port)

->

port_mappings = self.client.api.port(container_id, port)

->

    def port(self, container, private_port): 
        """
        Lookup the public-facing port that is NAT-ed to ``private_port``.
        Identical to the ``docker port`` command.

        Args:
            container (str): The container to look up
            private_port (int): The private port to inspect

So the docker API expect it to be an int

with_bind_ports & with_exposed_ports seems safe

Tranquility2 commented 3 months ago

Opened #690