Skip to content

Commit f6ad8f4

Browse files
authored
Add change_type to LoadBalancersClient and BoundLoadBalancer (#98)
1 parent 19b8779 commit f6ad8f4

File tree

4 files changed

+68
-3
lines changed

4 files changed

+68
-3
lines changed

CHANGELOG.rst

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

7-
* 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
8+
* Feature: Add `change_type`-method to `LoadBalancersClient`
89

910
v1.8.2 (2020-07-20)
1011
--------------------

hcloud/load_balancers/client.py

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -234,13 +234,23 @@ def enable_public_interface(self):
234234
return self._client.enable_public_interface(self)
235235

236236
def disable_public_interface(self):
237-
# type: ( Union[Network,BoundNetwork]) -> BoundAction
237+
# type: () -> BoundAction
238238
"""Disables the public interface of a Load Balancer.
239239
240240
:return: :class:`BoundAction <hcloud.actions.client.BoundAction>`
241241
"""
242242
return self._client.disable_public_interface(self)
243243

244+
def change_type(self, load_balancer_type):
245+
# type: (Union[LoadBalancerType,BoundLoadBalancerType]) -> BoundAction
246+
"""Changes the type of a Load Balancer.
247+
248+
:param load_balancer_type: :class:`BoundLoadBalancerType <hcloud.load_balancer_types.client.BoundLoadBalancerType>` or :class:`LoadBalancerType <hcloud.load_balancer_types.domain.LoadBalancerType>`
249+
Load Balancer type the Load Balancer should migrate to
250+
:return: :class:`BoundAction <hcloud.actions.client.BoundAction>`
251+
"""
252+
return self._client.change_type(self, load_balancer_type)
253+
244254

245255
class LoadBalancersClient(ClientEntityBase, GetEntityByNameMixin):
246256
results_list_attribute_name = "load_balancers"
@@ -731,3 +741,19 @@ def disable_public_interface(self, load_balancer):
731741
load_balancer_id=load_balancer.id),
732742
method="POST")
733743
return BoundAction(self._client.actions, response['action'])
744+
745+
def change_type(self, load_balancer, load_balancer_type):
746+
# type: ([LoadBalancer, BoundLoadBalancer], [LoadBalancerType, BoundLoadBalancerType]) ->BoundAction
747+
"""Changes the type of a Load Balancer.
748+
749+
:param load_balancer: :class:`BoundLoadBalancer <hcloud.load_balancers.client.BoundLoadBalancer>` or :class:`LoadBalancer <hcloud.load_balancers.domain.LoadBalancer>`
750+
:param load_balancer_type: :class:`BoundLoadBalancerType <hcloud.load_balancer_types.client.BoundLoadBalancerType>` or :class:`LoadBalancerType <hcloud.load_balancer_types.domain.LoadBalancerType>`
751+
Load Balancer type the Load Balancer should migrate to
752+
:return: :class:`BoundAction <hcloud.actions.client.BoundAction>`
753+
"""
754+
data = {
755+
"load_balancer_type": load_balancer_type.id_or_name,
756+
}
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)
759+
return BoundAction(self._client.actions, response['action'])

tests/integration/load_balancers/test_load_balancers.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,11 @@ def test_get_actions_list(self, bound_load_balancer):
2020
assert actions[0].id == 13
2121
assert actions[0].command == "add_service"
2222

23+
def test_change_type(self, bound_load_balancer):
24+
action = bound_load_balancer.change_type(LoadBalancerType(name="lb211"))
25+
assert action.id == 13
26+
assert action.command == "change_load_balancer_type"
27+
2328

2429
class TestLoadBalancersClient(object):
2530
def test_get_by_id(self, hetzner_client):
@@ -115,3 +120,10 @@ def test_update_service(self, hetzner_client, load_balancer):
115120
def test_change_protection(self, hetzner_client, load_balancer):
116121
action = hetzner_client.load_balancers.change_protection(load_balancer, {"delete": True})
117122
assert action.command == "change_protection"
123+
124+
@pytest.mark.parametrize("load_balancer", [LoadBalancer(id=1), BoundLoadBalancer(mock.MagicMock(), dict(id=1))])
125+
def test_change_type(self, hetzner_client, load_balancer):
126+
action = hetzner_client.load_balancers.change_type(load_balancer, LoadBalancerType(name="lb21"))
127+
128+
assert action.id == 13
129+
assert action.command == "change_load_balancer_type"

tests/unit/load_balancers/test_client.py

Lines changed: 27 additions & 1 deletion
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
12+
LoadBalancerService, LoadBalancerTarget, LoadBalancer
1313
from hcloud.actions.client import BoundAction
1414

1515

@@ -206,6 +206,14 @@ def test_detach_from_network(self, response_detach_from_network, hetzner_client,
206206
assert action.progress == 100
207207
assert action.command == "detach_from_network"
208208

209+
def test_change_type(self, hetzner_client, bound_load_balancer, generic_action):
210+
hetzner_client.request.return_value = generic_action
211+
action = bound_load_balancer.change_type(LoadBalancerType(name="lb21"))
212+
hetzner_client.request.assert_called_with(url="/load_balancers/14/actions/change_type", method="POST", json={"load_balancer_type": "lb21"})
213+
214+
assert action.id == 1
215+
assert action.progress == 0
216+
209217

210218
class TestLoadBalancerslient(object):
211219

@@ -315,3 +323,21 @@ def test_create(self, load_balancers_client, response_create_load_balancer):
315323
assert bound_load_balancer._client is load_balancers_client
316324
assert bound_load_balancer.id == 1
317325
assert bound_load_balancer.name == "my-balancer"
326+
327+
@pytest.mark.parametrize("load_balancer", [LoadBalancer(id=1), BoundLoadBalancer(mock.MagicMock(), dict(id=1))])
328+
def test_change_type_with_load_balancer_type_name(self, load_balancers_client, load_balancer, generic_action):
329+
load_balancers_client._client.request.return_value = generic_action
330+
action = load_balancers_client.change_type(load_balancer, LoadBalancerType(name="lb11"))
331+
load_balancers_client._client.request.assert_called_with(url="/load_balancers/1/actions/change_type", method="POST", json={"load_balancer_type": "lb11"})
332+
333+
assert action.id == 1
334+
assert action.progress == 0
335+
336+
@pytest.mark.parametrize("load_balancer", [LoadBalancer(id=1), BoundLoadBalancer(mock.MagicMock(), dict(id=1))])
337+
def test_change_type_with_load_balancer_type_id(self, load_balancers_client, load_balancer, generic_action):
338+
load_balancers_client._client.request.return_value = generic_action
339+
action = load_balancers_client.change_type(load_balancer, LoadBalancerType(id=1))
340+
load_balancers_client._client.request.assert_called_with(url="/load_balancers/1/actions/change_type", method="POST", json={"load_balancer_type": 1})
341+
342+
assert action.id == 1
343+
assert action.progress == 0

0 commit comments

Comments
 (0)