diff --git a/hcloud/load_balancers/domain.py b/hcloud/load_balancers/domain.py index 6a24547f..fbedf650 100644 --- a/hcloud/load_balancers/domain.py +++ b/hcloud/load_balancers/domain.py @@ -13,7 +13,7 @@ from ..load_balancer_types import BoundLoadBalancerType from ..locations import BoundLocation from ..metrics import Metrics - from ..networks import BoundNetwork + from ..networks import BoundNetwork, Network from ..servers import BoundServer from .client import BoundLoadBalancer @@ -107,6 +107,16 @@ def __init__( self.ingoing_traffic = ingoing_traffic self.included_traffic = included_traffic + def private_net_for(self, network: BoundNetwork | Network) -> PrivateNet | None: + """ + Returns the load balancer's network attachment information in the given Network, + and None if no attachment was found. + """ + for o in self.private_net or []: + if o.network.id == network.id: + return o + return None + class LoadBalancerService(BaseDomain): """LoadBalancerService Domain diff --git a/hcloud/servers/domain.py b/hcloud/servers/domain.py index 368464c4..df9c0a43 100644 --- a/hcloud/servers/domain.py +++ b/hcloud/servers/domain.py @@ -14,7 +14,7 @@ from ..images import BoundImage from ..isos import BoundIso from ..metrics import Metrics - from ..networks import BoundNetwork + from ..networks import BoundNetwork, Network from ..placement_groups import BoundPlacementGroup from ..primary_ips import BoundPrimaryIP, PrimaryIP from ..server_types import BoundServerType @@ -154,6 +154,16 @@ def __init__( self.primary_disk_size = primary_disk_size self.placement_group = placement_group + def private_net_for(self, network: BoundNetwork | Network) -> PrivateNet | None: + """ + Returns the server's network attachment information in the given Network, + and None if no attachment was found. + """ + for o in self.private_net or []: + if o.network.id == network.id: + return o + return None + class CreateServerResponse(BaseDomain): """Create Server Response Domain diff --git a/tests/unit/load_balancers/test_domain.py b/tests/unit/load_balancers/test_domain.py index 37d1b981..8de47d4d 100644 --- a/tests/unit/load_balancers/test_domain.py +++ b/tests/unit/load_balancers/test_domain.py @@ -2,10 +2,12 @@ import datetime from datetime import timezone +from unittest import mock import pytest from hcloud.load_balancers import ( + BoundLoadBalancer, IPv4Address, IPv6Network, LoadBalancer, @@ -21,6 +23,7 @@ PrivateNet, PublicNetwork, ) +from hcloud.networks import Network @pytest.mark.parametrize( @@ -56,3 +59,33 @@ class TestLoadBalancers: def test_created_is_datetime(self): lb = LoadBalancer(id=1, created="2016-01-30T23:50+00:00") assert lb.created == datetime.datetime(2016, 1, 30, 23, 50, tzinfo=timezone.utc) + + def test_private_net_for(self): + network1 = Network(id=1) + network2 = Network(id=2) + network3 = Network(id=3) + + load_balancer = LoadBalancer( + id=42, + private_net=[ + PrivateNet(network=network1, ip="127.0.0.1"), + PrivateNet(network=network2, ip="127.0.0.1"), + ], + ) + + assert load_balancer.private_net_for(network1).network.id == 1 + assert load_balancer.private_net_for(network3) is None + + load_balancer = BoundLoadBalancer( + client=mock.MagicMock(), + data={ + "id": 42, + "private_net": [ + {"network": 1, "ip": "127.0.0.1"}, + {"network": 2, "ip": "127.0.0.1"}, + ], + }, + ) + + assert load_balancer.private_net_for(network1).network.id == 1 + assert load_balancer.private_net_for(network3) is None diff --git a/tests/unit/servers/test_domain.py b/tests/unit/servers/test_domain.py index fdc05335..9048501f 100644 --- a/tests/unit/servers/test_domain.py +++ b/tests/unit/servers/test_domain.py @@ -2,10 +2,13 @@ import datetime from datetime import timezone +from unittest import mock import pytest +from hcloud.networks import Network from hcloud.servers import ( + BoundServer, IPv4Address, IPv6Network, PrivateNet, @@ -46,3 +49,47 @@ def test_created_is_datetime(self): assert server.created == datetime.datetime( 2016, 1, 30, 23, 50, tzinfo=timezone.utc ) + + def test_private_net_for(self): + network1 = Network(id=1) + network2 = Network(id=2) + network3 = Network(id=3) + + server = Server( + id=42, + private_net=[ + PrivateNet( + network=network1, ip="127.0.0.1", alias_ips=[], mac_address="" + ), + PrivateNet( + network=network2, ip="127.0.0.1", alias_ips=[], mac_address="" + ), + ], + ) + + assert server.private_net_for(network1).network.id == 1 + assert server.private_net_for(network3) is None + + server = BoundServer( + client=mock.MagicMock(), + data={ + "id": 42, + "private_net": [ + { + "network": 1, + "ip": "127.0.0.1", + "alias_ips": [], + "mac_address": "", + }, + { + "network": 2, + "ip": "127.0.0.1", + "alias_ips": [], + "mac_address": "", + }, + ], + }, + ) + + assert server.private_net_for(network1).network.id == 1 + assert server.private_net_for(network3) is None