diff --git a/src/aleph/vm/network/interfaces.py b/src/aleph/vm/network/interfaces.py index f401b507f..8c40f5eaa 100644 --- a/src/aleph/vm/network/interfaces.py +++ b/src/aleph/vm/network/interfaces.py @@ -61,18 +61,18 @@ def add_ip_address(ipr: IPRoute, device_name: str, ip: IPv4Interface | IPv6Inter logger.error(f"Unknown exception while adding address {ip} to interface {device_name}: {e}") -def delete_ip_address(ipr: IPRoute, device_name: str, ip: IPv4Interface | IPv6Interface): +def delete_ip_address(ipr: IPRoute, device_name: str, ip: str, mask: int): """Delete an IP address to the given interface.""" interface_index: list[int] = ipr.link_lookup(ifname=device_name) if not interface_index: msg = f"Interface {device_name} does not exist, can't delete address {ip} to it." raise MissingInterfaceError(msg) try: - ipr.addr("del", index=interface_index[0], address=str(ip.ip), mask=ip.network.prefixlen) + ipr.addr("del", index=interface_index[0], address=ip, mask=mask) except NetlinkError as e: - logger.exception(f"Unknown exception while deleting address {ip} to interface {device_name}: {e}") + logger.exception(f"Unknown exception while deleting address {ip}/{mask} to interface {device_name}: {e}") except OSError as e: - logger.exception(f"Unknown exception while deleting address {ip} to interface {device_name}: {e}") + logger.exception(f"Unknown exception while deleting address {ip}/{mask} to interface {device_name}: {e}") def set_link_up(ipr: IPRoute, device_name: str): @@ -170,6 +170,11 @@ async def delete(self) -> None: if self.ndp_proxy: await self.ndp_proxy.delete_range(self.device_name) with IPRoute() as ipr: - delete_ip_address(ipr, self.device_name, self.host_ip) - delete_ip_address(ipr, self.device_name, self.host_ipv6) + interface_index: list[int] = ipr.link_lookup(ifname=self.device_name) + for addr in ipr.get_addr(index=interface_index): + # The order of attributes in the attrs field comes from the Netlink protocol + attrs = dict(addr["attrs"]) + ip_addr: str = attrs["IFA_ADDRESS"] + mask: int = addr["prefixlen"] + delete_ip_address(ipr, self.device_name, ip_addr, mask) delete_tap_interface(ipr, self.device_name)