Skip to content

Commit 9d19ade

Browse files
authored
feat: add server and load balancer private_net_for helper method (#580)
Adds 2 small helper to get the private network attachment information from a server or a load balancer.
1 parent 9f3e282 commit 9d19ade

File tree

4 files changed

+102
-2
lines changed

4 files changed

+102
-2
lines changed

hcloud/load_balancers/domain.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
from ..load_balancer_types import BoundLoadBalancerType
1414
from ..locations import BoundLocation
1515
from ..metrics import Metrics
16-
from ..networks import BoundNetwork
16+
from ..networks import BoundNetwork, Network
1717
from ..servers import BoundServer
1818
from .client import BoundLoadBalancer
1919

@@ -107,6 +107,16 @@ def __init__(
107107
self.ingoing_traffic = ingoing_traffic
108108
self.included_traffic = included_traffic
109109

110+
def private_net_for(self, network: BoundNetwork | Network) -> PrivateNet | None:
111+
"""
112+
Returns the load balancer's network attachment information in the given Network,
113+
and None if no attachment was found.
114+
"""
115+
for o in self.private_net or []:
116+
if o.network.id == network.id:
117+
return o
118+
return None
119+
110120

111121
class LoadBalancerService(BaseDomain):
112122
"""LoadBalancerService Domain

hcloud/servers/domain.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
from ..images import BoundImage
1515
from ..isos import BoundIso
1616
from ..metrics import Metrics
17-
from ..networks import BoundNetwork
17+
from ..networks import BoundNetwork, Network
1818
from ..placement_groups import BoundPlacementGroup
1919
from ..primary_ips import BoundPrimaryIP, PrimaryIP
2020
from ..server_types import BoundServerType
@@ -154,6 +154,16 @@ def __init__(
154154
self.primary_disk_size = primary_disk_size
155155
self.placement_group = placement_group
156156

157+
def private_net_for(self, network: BoundNetwork | Network) -> PrivateNet | None:
158+
"""
159+
Returns the server's network attachment information in the given Network,
160+
and None if no attachment was found.
161+
"""
162+
for o in self.private_net or []:
163+
if o.network.id == network.id:
164+
return o
165+
return None
166+
157167

158168
class CreateServerResponse(BaseDomain):
159169
"""Create Server Response Domain

tests/unit/load_balancers/test_domain.py

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,12 @@
22

33
import datetime
44
from datetime import timezone
5+
from unittest import mock
56

67
import pytest
78

89
from hcloud.load_balancers import (
10+
BoundLoadBalancer,
911
IPv4Address,
1012
IPv6Network,
1113
LoadBalancer,
@@ -21,6 +23,7 @@
2123
PrivateNet,
2224
PublicNetwork,
2325
)
26+
from hcloud.networks import Network
2427

2528

2629
@pytest.mark.parametrize(
@@ -56,3 +59,33 @@ class TestLoadBalancers:
5659
def test_created_is_datetime(self):
5760
lb = LoadBalancer(id=1, created="2016-01-30T23:50+00:00")
5861
assert lb.created == datetime.datetime(2016, 1, 30, 23, 50, tzinfo=timezone.utc)
62+
63+
def test_private_net_for(self):
64+
network1 = Network(id=1)
65+
network2 = Network(id=2)
66+
network3 = Network(id=3)
67+
68+
load_balancer = LoadBalancer(
69+
id=42,
70+
private_net=[
71+
PrivateNet(network=network1, ip="127.0.0.1"),
72+
PrivateNet(network=network2, ip="127.0.0.1"),
73+
],
74+
)
75+
76+
assert load_balancer.private_net_for(network1).network.id == 1
77+
assert load_balancer.private_net_for(network3) is None
78+
79+
load_balancer = BoundLoadBalancer(
80+
client=mock.MagicMock(),
81+
data={
82+
"id": 42,
83+
"private_net": [
84+
{"network": 1, "ip": "127.0.0.1"},
85+
{"network": 2, "ip": "127.0.0.1"},
86+
],
87+
},
88+
)
89+
90+
assert load_balancer.private_net_for(network1).network.id == 1
91+
assert load_balancer.private_net_for(network3) is None

tests/unit/servers/test_domain.py

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,13 @@
22

33
import datetime
44
from datetime import timezone
5+
from unittest import mock
56

67
import pytest
78

9+
from hcloud.networks import Network
810
from hcloud.servers import (
11+
BoundServer,
912
IPv4Address,
1013
IPv6Network,
1114
PrivateNet,
@@ -46,3 +49,47 @@ def test_created_is_datetime(self):
4649
assert server.created == datetime.datetime(
4750
2016, 1, 30, 23, 50, tzinfo=timezone.utc
4851
)
52+
53+
def test_private_net_for(self):
54+
network1 = Network(id=1)
55+
network2 = Network(id=2)
56+
network3 = Network(id=3)
57+
58+
server = Server(
59+
id=42,
60+
private_net=[
61+
PrivateNet(
62+
network=network1, ip="127.0.0.1", alias_ips=[], mac_address=""
63+
),
64+
PrivateNet(
65+
network=network2, ip="127.0.0.1", alias_ips=[], mac_address=""
66+
),
67+
],
68+
)
69+
70+
assert server.private_net_for(network1).network.id == 1
71+
assert server.private_net_for(network3) is None
72+
73+
server = BoundServer(
74+
client=mock.MagicMock(),
75+
data={
76+
"id": 42,
77+
"private_net": [
78+
{
79+
"network": 1,
80+
"ip": "127.0.0.1",
81+
"alias_ips": [],
82+
"mac_address": "",
83+
},
84+
{
85+
"network": 2,
86+
"ip": "127.0.0.1",
87+
"alias_ips": [],
88+
"mac_address": "",
89+
},
90+
],
91+
},
92+
)
93+
94+
assert server.private_net_for(network1).network.id == 1
95+
assert server.private_net_for(network3) is None

0 commit comments

Comments
 (0)