Skip to content

Commit c0dcbba

Browse files
authored
Add support for Target IP and Target LabelSelector (#99)
1 parent f6ad8f4 commit c0dcbba

File tree

5 files changed

+82
-19
lines changed

5 files changed

+82
-19
lines changed

CHANGELOG.rst

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,10 @@ History
44
master (XXXX-XX-XX)
55
--------------------
66

7-
* Feature:Add `included_traffic`, `outgoing_traffic` and `ingoing_traffic` properties to Load Balancer domain
7+
* Feature: Add `included_traffic`, `outgoing_traffic` and `ingoing_traffic` properties to Load Balancer domain
88
* Feature: Add `change_type`-method to `LoadBalancersClient`
9+
* Feature: Add support for `LoadBalancerTargetLabelSelector`
10+
* Feature: Add support for `LoadBalancerTargetLabelSelector`
911

1012
v1.8.2 (2020-07-20)
1113
--------------------

docs/api.clients.load_balancers.rst

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ LoadBalancerClient
22
==================
33

44

5-
.. autoclass:: hcloud.load_balancers.client.LoadBalancerClient
5+
.. autoclass:: hcloud.load_balancers.client.LoadBalancersClient
66
:members:
77

88
.. autoclass:: hcloud.load_balancers.client.BoundLoadBalancer
@@ -26,5 +26,11 @@ LoadBalancerClient
2626
.. autoclass:: hcloud.load_balancers.domain.LoadBalancerTarget
2727
:members:
2828

29+
.. autoclass:: hcloud.load_balancers.domain.LoadBalancerTargetLabelSelector
30+
:members:
31+
32+
.. autoclass:: hcloud.load_balancers.domain.LoadBalancerTargetIP
33+
:members:
34+
2935
.. autoclass:: hcloud.load_balancers.domain.LoadBalancerAlgorithm
3036
:members:

hcloud/load_balancers/client.py

Lines changed: 29 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@
1212
from hcloud.actions.client import BoundAction
1313
from hcloud.load_balancers.domain import LoadBalancer, IPv4Address, IPv6Network, PublicNetwork, PrivateNet, \
1414
CreateLoadBalancerResponse, LoadBalancerTarget, LoadBalancerService, LoadBalancerServiceHttp, \
15-
LoadBalancerHealthCheck, LoadBalancerHealtCheckHttp, LoadBalancerAlgorithm
15+
LoadBalancerHealthCheck, LoadBalancerHealtCheckHttp, LoadBalancerAlgorithm, LoadBalancerTargetLabelSelector, \
16+
LoadBalancerTargetIP
1617

1718

1819
class BoundLoadBalancer(BoundModelBase):
@@ -43,6 +44,11 @@ def __init__(self, client, data, complete=True):
4344
tmp_target = LoadBalancerTarget(type=target["type"], use_private_ip=target["use_private_ip"])
4445
if target["type"] == "server":
4546
tmp_target.server = BoundServer(client._client.servers, data=target['server'], complete=False)
47+
elif target["type"] == "label_selector":
48+
tmp_target.label_selector = LoadBalancerTargetLabelSelector(
49+
selector=target['label_selector']['selector'])
50+
elif target["type"] == "ip":
51+
tmp_target.label_selector = LoadBalancerTargetIP(ip=target['ip']['ip'])
4652
tmp_targets.append(tmp_target)
4753
data['targets'] = tmp_targets
4854

@@ -186,7 +192,7 @@ def remove_target(self, target):
186192
return self._client.remove_target(self, target)
187193

188194
def change_algorithm(self, algorithm):
189-
# type: (LoadBalancerService) -> List[BoundAction]
195+
# type: (LoadBalancerAlgorithm) -> List[BoundAction]
190196
"""Changes the algorithm used by the Load Balancer
191197
192198
:param algorithm: :class:`LoadBalancerAlgorithm <hcloud.load_balancers.domain.LoadBalancerAlgorithm>`
@@ -386,9 +392,14 @@ def create(
386392
for target in targets:
387393
target_data = {
388394
"type": target.type,
389-
"server": target.server,
390395
"use_private_ip": target.use_private_ip
391396
}
397+
if target.type == "server":
398+
target_data['server'] = {"id": target.server.id}
399+
elif target.type == "label_selector":
400+
target_data['label_selector'] = {"selector": target.label_selector.selector}
401+
elif target.type == "ip":
402+
target_data['ip'] = {"ip": target.ip.ip}
392403
target_list.append(target_data)
393404

394405
data["targets"] = target_list
@@ -609,9 +620,14 @@ def add_target(self, load_balancer, target):
609620
"""
610621
data = {
611622
"type": target.type,
612-
"server": {"id": target.server.id},
613623
"use_private_ip": target.use_private_ip
614624
}
625+
if target.type == "server":
626+
data['server'] = {"id": target.server.id}
627+
elif target.type == "label_selector":
628+
data['label_selector'] = {"selector": target.label_selector.selector}
629+
elif target.type == "ip":
630+
data['ip'] = {"ip": target.ip.ip}
615631

616632
response = self._client.request(
617633
url="/load_balancers/{load_balancer_id}/actions/add_target".format(load_balancer_id=load_balancer.id),
@@ -629,8 +645,13 @@ def remove_target(self, load_balancer, target):
629645
"""
630646
data = {
631647
"type": target.type,
632-
"server": {"id": target.server.id},
633648
}
649+
if target.type == "server":
650+
data['server'] = {"id": target.server.id}
651+
elif target.type == "label_selector":
652+
data['label_selector'] = {"selector": target.label_selector.selector}
653+
elif target.type == "ip":
654+
data['ip'] = {"ip": target.ip.ip}
634655

635656
response = self._client.request(
636657
url="/load_balancers/{load_balancer_id}/actions/remove_target".format(load_balancer_id=load_balancer.id),
@@ -754,6 +775,7 @@ def change_type(self, load_balancer, load_balancer_type):
754775
data = {
755776
"load_balancer_type": load_balancer_type.id_or_name,
756777
}
757-
response = self._client.request(url="/load_balancers/{load_balancer_id}/actions/change_type".format(load_balancer_id=load_balancer.id),
758-
method="POST", json=data)
778+
response = self._client.request(
779+
url="/load_balancers/{load_balancer_id}/actions/change_type".format(load_balancer_id=load_balancer.id),
780+
method="POST", json=data)
759781
return BoundAction(self._client.actions, response['action'])

hcloud/load_balancers/domain.py

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -197,19 +197,42 @@ class LoadBalancerTarget(BaseDomain):
197197
Type of the resource, can be server or label_selector
198198
:param server: Server
199199
Target server
200-
:param label_selector: str
201-
Target label selector string
200+
:param label_selector: LoadBalancerTargetLabelSelector
201+
Target label selector
202+
:param ip: LoadBalancerTargetIP
203+
Target IP
202204
:param use_private_ip: bool
203205
use the private IP instead of primary public IP
204206
"""
205207

206-
def __init__(self, type=None, server=None, label_selector=None, use_private_ip=None):
208+
def __init__(self, type=None, server=None, label_selector=None, ip=None, use_private_ip=None):
207209
self.type = type
208210
self.server = server
209211
self.label_selector = label_selector
212+
self.ip = ip
210213
self.use_private_ip = use_private_ip
211214

212215

216+
class LoadBalancerTargetLabelSelector(BaseDomain):
217+
"""LoadBalancerTargetLabelSelector Domain
218+
:param selector: str
219+
Target label selector
220+
"""
221+
222+
def __init__(self, selector=None):
223+
self.selector = selector
224+
225+
226+
class LoadBalancerTargetIP(BaseDomain):
227+
"""LoadBalancerTargetIP Domain
228+
:param ip: str
229+
Target IP
230+
"""
231+
232+
def __init__(self, ip=None):
233+
self.ip = ip
234+
235+
213236
class LoadBalancerAlgorithm(BaseDomain):
214237
"""LoadBalancerAlgorithm Domain
215238
:param type: str

tests/unit/load_balancers/test_client.py

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
from hcloud.load_balancers.client import BoundLoadBalancer, LoadBalancersClient
1010

1111
from hcloud.load_balancers.domain import LoadBalancerAlgorithm, LoadBalancerHealthCheck, \
12-
LoadBalancerService, LoadBalancerTarget, LoadBalancer
12+
LoadBalancerService, LoadBalancerTarget, LoadBalancer, LoadBalancerTargetIP, LoadBalancerTargetLabelSelector
1313
from hcloud.actions.client import BoundAction
1414

1515

@@ -108,22 +108,32 @@ def test_delete_service(self, hetzner_client, response_delete_service, bound_loa
108108
assert action.progress == 100
109109
assert action.command == "delete_service"
110110

111-
def test_add_target(self, hetzner_client, response_add_target, bound_load_balancer):
111+
@pytest.mark.parametrize("target,params", [
112+
(LoadBalancerTarget(type="server", server=Server(id=1), use_private_ip=True), {'server': {"id": 1}}),
113+
(LoadBalancerTarget(type="ip", ip=LoadBalancerTargetIP(ip="127.0.0.1")), {'ip': {"ip": "127.0.0.1"}}),
114+
(LoadBalancerTarget(type="label_selector", label_selector=LoadBalancerTargetLabelSelector(selector="abc=def")), {'label_selector': {"selector": "abc=def"}})
115+
])
116+
def test_add_target(self, hetzner_client, response_add_target, bound_load_balancer, target, params):
112117
hetzner_client.request.return_value = response_add_target
113-
target = LoadBalancerTarget(server=Server(id=1), use_private_ip=True)
114118
action = bound_load_balancer.add_target(target)
115-
hetzner_client.request.assert_called_with(json={'type': None, 'server': {"id": 1}, 'use_private_ip': True},
119+
params.update({'type': target.type, 'use_private_ip': target.use_private_ip})
120+
hetzner_client.request.assert_called_with(json=params,
116121
url="/load_balancers/14/actions/add_target", method="POST")
117122

118123
assert action.id == 13
119124
assert action.progress == 100
120125
assert action.command == "add_target"
121126

122-
def test_remove_target(self, hetzner_client, response_remove_target, bound_load_balancer):
127+
@pytest.mark.parametrize("target,params", [
128+
(LoadBalancerTarget(type="server", server=Server(id=1), use_private_ip=True), {'server': {"id": 1}}),
129+
(LoadBalancerTarget(type="ip", ip=LoadBalancerTargetIP(ip="127.0.0.1")), {'ip': {"ip": "127.0.0.1"}}),
130+
(LoadBalancerTarget(type="label_selector", label_selector=LoadBalancerTargetLabelSelector(selector="abc=def")), {'label_selector': {"selector": "abc=def"}})
131+
])
132+
def test_remove_target(self, hetzner_client, response_remove_target, bound_load_balancer, target, params):
123133
hetzner_client.request.return_value = response_remove_target
124-
target = LoadBalancerTarget(server=Server(id=100))
125134
action = bound_load_balancer.remove_target(target)
126-
hetzner_client.request.assert_called_with(json={'type': None, 'server': {"id": 100}},
135+
params.update({'type': target.type})
136+
hetzner_client.request.assert_called_with(json=params,
127137
url="/load_balancers/14/actions/remove_target", method="POST")
128138

129139
assert action.id == 13

0 commit comments

Comments
 (0)