Skip to content
Commits on Source (3)
......@@ -69,6 +69,12 @@ class DownloadableExecutable(ABC):
name: str
def __init_subclass__(cls, name: str|None = None):
if name and hasattr(cls, "name"):
raise TypeError(f"Got two 'name' attributes for {cls}: {name} and {cls.name}")
if name:
cls.name = name
def __init__(self, version: str = "latest"):
self.version = version
......
......@@ -275,7 +275,7 @@ class Container:
self.entrypoint = entrypoint
self.privileged = privileged
self.publish = publish
self.networks = dict[Network, tuple[IPAddress, tuple[str, ...]]]()
self.networks = dict[Network, tuple[IPAddress, set[str]]]()
self.cid: ShaID|None = None
if network:
......@@ -407,7 +407,7 @@ class Container:
def connect(
self,
network: Network,
*aliases: str,
*new_aliases: str,
address: ipaddress.IPv4Address|ipaddress.IPv6Address|None = None,
) -> None:
"""
......@@ -416,8 +416,12 @@ class Container:
Any aliases supplied will be resolvable to the container by other containers on the
network.
"""
aliases = set(new_aliases)
if network in self.networks:
if self.networks[network][1] == aliases:
_, cur_aliases = self.networks[network]
aliases.update(cur_aliases)
if aliases == cur_aliases:
return
if self.cid is not None:
docker(b"network", b"disconnect", str(network), self.cid)
......@@ -443,14 +447,22 @@ class Container:
)
docker(b"network", b"connect", *opts, str(network), contrid)
def disconnect(self, network: Network) -> None:
def disconnect(self, network: Network, *rm_aliases: str) -> None:
"""
Disconnect the container from a Docker network
Disconnect the container from a Docker network or optionally unregister aliases
For backwards compatibility, if no aliases are provided the network is disconnected
immediately; otherwise the provided aliases are removed from the registered aliases
and the network only disconnected once there are no remaining aliases.
Raises `KeyError` if the network was not connected to with `Container.connect()`.
"""
del self.networks[network]
if self.cid is not None:
address, aliases = self.networks.pop(network)
aliases.difference_update(rm_aliases)
if rm_aliases and aliases:
# Removed some, but not all aliases; re-add modified network details
self.networks[network] = address, aliases
elif self.cid is not None:
docker(b"network", b"disconnect", str(network), self.cid)
def show_logs(self) -> None:
......
......@@ -4,7 +4,7 @@ build-backend = "poetry.core.masonry.api"
[tool.poetry]
name = "behave-utils"
version = "0.5.0"
version = "0.6.0"
description = "Utilities for writing Behave step implementations"
license = "MPL-2.0"
readme = "README.md"
......