Skip to content
Commits on Source (3)
...@@ -69,6 +69,12 @@ class DownloadableExecutable(ABC): ...@@ -69,6 +69,12 @@ class DownloadableExecutable(ABC):
name: str 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"): def __init__(self, version: str = "latest"):
self.version = version self.version = version
......
...@@ -275,7 +275,7 @@ class Container: ...@@ -275,7 +275,7 @@ class Container:
self.entrypoint = entrypoint self.entrypoint = entrypoint
self.privileged = privileged self.privileged = privileged
self.publish = publish self.publish = publish
self.networks = dict[Network, tuple[IPAddress, tuple[str, ...]]]() self.networks = dict[Network, tuple[IPAddress, set[str]]]()
self.cid: ShaID|None = None self.cid: ShaID|None = None
if network: if network:
...@@ -407,7 +407,7 @@ class Container: ...@@ -407,7 +407,7 @@ class Container:
def connect( def connect(
self, self,
network: Network, network: Network,
*aliases: str, *new_aliases: str,
address: ipaddress.IPv4Address|ipaddress.IPv6Address|None = None, address: ipaddress.IPv4Address|ipaddress.IPv6Address|None = None,
) -> None: ) -> None:
""" """
...@@ -416,8 +416,12 @@ class Container: ...@@ -416,8 +416,12 @@ class Container:
Any aliases supplied will be resolvable to the container by other containers on the Any aliases supplied will be resolvable to the container by other containers on the
network. network.
""" """
aliases = set(new_aliases)
if network in self.networks: 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 return
if self.cid is not None: if self.cid is not None:
docker(b"network", b"disconnect", str(network), self.cid) docker(b"network", b"disconnect", str(network), self.cid)
...@@ -443,14 +447,22 @@ class Container: ...@@ -443,14 +447,22 @@ class Container:
) )
docker(b"network", b"connect", *opts, str(network), contrid) 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()`. Raises `KeyError` if the network was not connected to with `Container.connect()`.
""" """
del self.networks[network] address, aliases = self.networks.pop(network)
if self.cid is not None: 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) docker(b"network", b"disconnect", str(network), self.cid)
def show_logs(self) -> None: def show_logs(self) -> None:
......
...@@ -4,7 +4,7 @@ build-backend = "poetry.core.masonry.api" ...@@ -4,7 +4,7 @@ build-backend = "poetry.core.masonry.api"
[tool.poetry] [tool.poetry]
name = "behave-utils" name = "behave-utils"
version = "0.5.0" version = "0.6.0"
description = "Utilities for writing Behave step implementations" description = "Utilities for writing Behave step implementations"
license = "MPL-2.0" license = "MPL-2.0"
readme = "README.md" readme = "README.md"
......