Skip to content

Commit cd3e6aa

Browse files
committed
refactor: deduplicate targets ingestion code in bound load balancer
1 parent 59a1343 commit cd3e6aa

File tree

4 files changed

+49
-58
lines changed

4 files changed

+49
-58
lines changed

hcloud/load_balancers/client.py

Lines changed: 43 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -93,63 +93,51 @@ def __init__(
9393
]
9494
data["private_net"] = private_nets
9595

96-
targets = data.get("targets")
97-
if targets:
98-
tmp_targets = []
99-
for target in targets:
100-
tmp_target = LoadBalancerTarget(type=target["type"])
101-
if target["type"] == "server":
102-
tmp_target.server = BoundServer(
103-
client._parent.servers, data=target["server"], complete=False
104-
)
105-
tmp_target.use_private_ip = target["use_private_ip"]
106-
elif target["type"] == "label_selector":
107-
tmp_target.label_selector = LoadBalancerTargetLabelSelector(
108-
selector=target["label_selector"]["selector"]
96+
def _load_balancer_targets(
97+
raw_targets: list[dict[str, Any]],
98+
) -> list[LoadBalancerTarget]:
99+
return [_load_balancer_target(raw_target) for raw_target in raw_targets]
100+
101+
def _load_balancer_target(
102+
raw_target: dict[str, Any],
103+
) -> LoadBalancerTarget:
104+
result = LoadBalancerTarget(type=raw_target["type"])
105+
106+
if raw_target["type"] == "ip":
107+
result.ip = LoadBalancerTargetIP(
108+
ip=raw_target["ip"]["ip"],
109+
)
110+
111+
elif raw_target["type"] == "server":
112+
result.server = BoundServer(
113+
client._parent.servers, # pylint: disable=protected-access
114+
data=raw_target["server"],
115+
complete=False,
116+
)
117+
result.use_private_ip = raw_target["use_private_ip"]
118+
119+
elif raw_target["type"] == "label_selector":
120+
result.label_selector = LoadBalancerTargetLabelSelector(
121+
selector=raw_target["label_selector"]["selector"]
122+
)
123+
result.use_private_ip = raw_target["use_private_ip"]
124+
125+
if (raw_nested_targets := raw_target.get("targets")) is not None:
126+
result.targets = _load_balancer_targets(raw_nested_targets)
127+
128+
if (raw_health_status := raw_target.get("health_status")) is not None:
129+
result.health_status = [
130+
LoadBalancerTargetHealthStatus(
131+
listen_port=item["listen_port"],
132+
status=item["status"],
109133
)
110-
tmp_target.use_private_ip = target["use_private_ip"]
111-
nested_targets = target.get("targets", [])
112-
if nested_targets:
113-
tmp_nested = []
114-
for nested in nested_targets:
115-
nested_target = LoadBalancerTarget(type=nested["type"])
116-
if nested["type"] == "server":
117-
nested_target.server = BoundServer(
118-
client._parent.servers,
119-
data=nested["server"],
120-
complete=False,
121-
)
122-
elif nested["type"] == "ip":
123-
nested_target.ip = LoadBalancerTargetIP(
124-
ip=nested["ip"]["ip"]
125-
)
126-
nested_target.use_private_ip = nested.get("use_private_ip")
127-
nested_health_status = nested.get("health_status")
128-
if nested_health_status is not None:
129-
nested_target.health_status = [
130-
LoadBalancerTargetHealthStatus(
131-
listen_port=hs["listen_port"],
132-
status=hs["status"],
133-
)
134-
for hs in nested_health_status
135-
]
136-
tmp_nested.append(nested_target)
137-
tmp_target.targets = tmp_nested
138-
elif target["type"] == "ip":
139-
tmp_target.ip = LoadBalancerTargetIP(ip=target["ip"]["ip"])
140-
141-
target_health_status = target.get("health_status")
142-
if target_health_status is not None:
143-
tmp_target.health_status = [
144-
LoadBalancerTargetHealthStatus(
145-
listen_port=target_health_status_item["listen_port"],
146-
status=target_health_status_item["status"],
147-
)
148-
for target_health_status_item in target_health_status
149-
]
134+
for item in raw_health_status
135+
]
136+
137+
return result
150138

151-
tmp_targets.append(tmp_target)
152-
data["targets"] = tmp_targets
139+
if (raw_targets := data.get("targets")) is not None:
140+
data["targets"] = _load_balancer_targets(raw_targets)
153141

154142
services = data.get("services")
155143
if services:

hcloud/load_balancers/domain.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -411,6 +411,8 @@ class LoadBalancerTarget(BaseDomain):
411411
use the private IP instead of primary public IP
412412
:param health_status: list
413413
List of health statuses of the services on this target. Only present for target types "server" and "ip".
414+
:param targets: list
415+
List of resolved label selector targets. Only present for target types "label_selector".
414416
"""
415417

416418
__api_properties__ = (

tests/unit/load_balancers/conftest.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ def response_load_balancer():
8989
},
9090
{
9191
"type": "label_selector",
92-
"label_selector": {"selector": "eu"},
92+
"label_selector": {"selector": "env=prod"},
9393
"use_private_ip": True,
9494
"targets": [
9595
{

tests/unit/load_balancers/test_client.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
)
2020
from hcloud.locations import Location
2121
from hcloud.networks import Network
22-
from hcloud.servers import Server
22+
from hcloud.servers import BoundServer, Server
2323

2424
from ..conftest import BoundModelTestCase
2525

@@ -67,13 +67,14 @@ def test_init_label_selector_nested_targets(self, response_load_balancer):
6767

6868
label_selector_target = bound_load_balancer.targets[1]
6969
assert label_selector_target.type == "label_selector"
70-
assert label_selector_target.label_selector.selector == "eu"
70+
assert label_selector_target.label_selector.selector == "env=prod"
7171
assert label_selector_target.use_private_ip is True
7272
assert label_selector_target.targets is not None
7373
assert len(label_selector_target.targets) == 1
7474

7575
nested = label_selector_target.targets[0]
7676
assert nested.type == "server"
77+
assert isinstance(nested.server, BoundServer)
7778
assert nested.server.id == 105054278
7879
assert nested.use_private_ip is True
7980
assert nested.health_status is not None

0 commit comments

Comments
 (0)