Skip to content

Commit f86d73e

Browse files
LKaemmerlingLD250
authored andcommitted
Add network.create()
Add NetworkRouteDomain
1 parent 4a1bd36 commit f86d73e

2 files changed

Lines changed: 128 additions & 55 deletions

File tree

hcloud/networks/client.py

Lines changed: 103 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,31 @@
33
from hcloud.core.domain import add_meta_to_result
44

55
from hcloud.actions.client import BoundAction
6-
from hcloud.networks.domain import Network
6+
from hcloud.networks.domain import Network, NetworkRoute, NetworkSubnet
77

88

99
class BoundNetwork(BoundModelBase):
1010
model = Network
1111

12+
def __init__(self, client, data, complete=True):
13+
subnets = data.get("subnets", [])
14+
if subnets is not None:
15+
subnets = [NetworkSubnet(**subnet) for subnet in subnets]
16+
data['subnets'] = subnets
17+
18+
routes = data.get("routes", [])
19+
if routes is not None:
20+
routes = [NetworkRoute(**route) for route in routes]
21+
data['routes'] = routes
22+
23+
from hcloud.servers.client import BoundServer
24+
servers = data.get("servers",[])
25+
if servers is not None:
26+
servers = [BoundServer(client._client.servers, {"id": server}, complete=False) for server in servers]
27+
data['servers'] = servers
28+
29+
super(BoundNetwork, self).__init__(client, data, complete)
30+
1231
def update(self, name=None, labels=None):
1332
# type: (Optional[str], Optional[Dict[str, str]]) -> BoundNetwork
1433
"""Updates a network. You can update a network’s name and a networks’s labels.
@@ -59,7 +78,7 @@ def get_actions(self, status=None, sort=None):
5978

6079

6180
class NetworksClient(ClientEntityBase, GetEntityByNameMixin):
62-
results_list_attribute_name = 'networks'
81+
results_list_attribute_name = "networks"
6382

6483
def get_by_id(self, id):
6584
# type: (int) -> BoundNetwork
@@ -68,15 +87,18 @@ def get_by_id(self, id):
6887
:param id: int
6988
:return: :class:`BoundNetwork <hcloud.networks.client.BoundNetwork>
7089
"""
71-
response = self._client.request(url="/networks/{network_id}".format(network_id=id), method="GET")
72-
return BoundNetwork(self, response['network'])
73-
74-
def get_list(self,
75-
name=None, # type: Optional[str]
76-
label_selector=None, # type: Optional[str]
77-
page=None, # type: Optional[int]
78-
per_page=None, # type: Optional[int]
79-
):
90+
response = self._client.request(
91+
url="/networks/{network_id}".format(network_id=id), method="GET"
92+
)
93+
return BoundNetwork(self, response["network"])
94+
95+
def get_list(
96+
self,
97+
name=None, # type: Optional[str]
98+
label_selector=None, # type: Optional[str]
99+
page=None, # type: Optional[int]
100+
per_page=None, # type: Optional[int]
101+
):
80102
# type: (...) -> PageResults[List[BoundNetwork], Meta]
81103
"""Get a list of networks from this account
82104
@@ -92,17 +114,19 @@ def get_list(self,
92114
"""
93115
params = {}
94116
if name:
95-
params['name'] = name
117+
params["name"] = name
96118
if label_selector:
97-
params['label_selector'] = label_selector
119+
params["label_selector"] = label_selector
98120
if page:
99-
params['page'] = page
121+
params["page"] = page
100122
if per_page:
101-
params['per_page'] = per_page
123+
params["per_page"] = per_page
102124

103125
response = self._client.request(url="/networks", method="GET", params=params)
104126

105-
ass_networks = [BoundNetwork(self, network_data) for network_data in response['networks']]
127+
ass_networks = [
128+
BoundNetwork(self, network_data) for network_data in response["networks"]
129+
]
106130
return self._add_meta_to_result(ass_networks, response)
107131

108132
def get_all(self, name=None, label_selector=None):
@@ -115,7 +139,9 @@ def get_all(self, name=None, label_selector=None):
115139
Can be used to filter networks by labels. The response will only contain networks matching the label selector.
116140
:return: List[:class:`BoundNetwork <hcloud.networks.client.BoundNetwork>`]
117141
"""
118-
return super(NetworksClient, self).get_all(name=name, label_selector=label_selector)
142+
return super(NetworksClient, self).get_all(
143+
name=name, label_selector=label_selector
144+
)
119145

120146
def get_by_name(self, name):
121147
# type: (str) -> BoundNetwork
@@ -127,9 +153,39 @@ def get_by_name(self, name):
127153
"""
128154
return super(NetworksClient, self).get_by_name(name)
129155

130-
def create(self):
131-
# TODO
132-
pass
156+
def create(
157+
self,
158+
name, # type: str
159+
ip_range, # type: str
160+
subnets=None, # type: Optional[List[NetworkSubnet]]
161+
routes=None, # type: Optional[List[NetworkRoute]]
162+
labels=None, # type: Optional[Dict[str, str]]
163+
):
164+
"""Creates a network with range ip_range.
165+
166+
:param name: str
167+
Name of the network
168+
:param ip_range: str
169+
IP range of the whole network which must span all included subnets and route destinations
170+
:param subnets: List[:class:`NetworkSubnet <hcloud.networks.domain.NetworkSubnet>`]
171+
Array of subnets allocated
172+
:param routes: List[:class:`NetworkRoute <hcloud.networks.domain.NetworkRoute>`]
173+
Array of routes set in this network
174+
:param labels: Dict[str, str] (optional)
175+
User-defined labels (key-value pairs)
176+
:return: :class:`BoundNetwork <hcloud.networks.client.BoundNetwork>`
177+
"""
178+
data = {"name": name, "ip_range": ip_range}
179+
if subnets is not None:
180+
data["subnets"] = subnets
181+
if routes is not None:
182+
data["routes"] = routes
183+
if labels is not None:
184+
data["labels"] = labels
185+
186+
response = self._client.request(url="/networks", method="POST", json=data)
187+
188+
return BoundNetwork(self, response["network"])
133189

134190
def update(self, network, name=None, labels=None):
135191
# type:(Network, Optional[str], Optional[Dict[str, str]]) -> BoundNetwork
@@ -147,8 +203,12 @@ def update(self, network, name=None, labels=None):
147203
data.update({"name": name})
148204
if labels is not None:
149205
data.update({"labels": labels})
150-
response = self._client.request(url="/networks/{network_id}".format(network_id=network.id), method="PUT", json=data)
151-
return BoundNetwork(self, response['network'])
206+
response = self._client.request(
207+
url="/networks/{network_id}".format(network_id=network.id),
208+
method="PUT",
209+
json=data,
210+
)
211+
return BoundNetwork(self, response["network"])
152212

153213
def delete(self, network):
154214
# type: (Network) -> BoundAction
@@ -157,10 +217,14 @@ def delete(self, network):
157217
:param network: :class:`BoundNetwork <hcloud.networks.client.BoundNetwork>` or :class:`Network <hcloud.networks.domain.Network>`
158218
:return: :class:`BoundAction <hcloud.actions.client.BoundAction>`
159219
"""
160-
response = self._client.request(url="/networks/{network_id}".format(network_id=network.id), method="DELETE")
161-
return BoundAction(self._client.actions, response['action'])
162-
163-
def get_actions_list(self, network, status=None, sort=None, page=None, per_page=None):
220+
response = self._client.request(
221+
url="/networks/{network_id}".format(network_id=network.id), method="DELETE"
222+
)
223+
return BoundAction(self._client.actions, response["action"])
224+
225+
def get_actions_list(
226+
self, network, status=None, sort=None, page=None, per_page=None
227+
):
164228
# type: (Network, Optional[List[str]], Optional[List[str]], Optional[int], Optional[int]) -> PageResults[List[BoundAction], Meta]
165229
"""Returns all action objects for a network.
166230
@@ -185,10 +249,16 @@ def get_actions_list(self, network, status=None, sort=None, page=None, per_page=
185249
if per_page is not None:
186250
params["per_page"] = per_page
187251

188-
response = self._client.request(url="/networks/{network_id}/actions".format(network_id=network.id), method="GET",
189-
params=params)
190-
actions = [BoundAction(self._client.actions, action_data) for action_data in response['actions']]
191-
return add_meta_to_result(actions, response, 'actions')
252+
response = self._client.request(
253+
url="/networks/{network_id}/actions".format(network_id=network.id),
254+
method="GET",
255+
params=params,
256+
)
257+
actions = [
258+
BoundAction(self._client.actions, action_data)
259+
for action_data in response["actions"]
260+
]
261+
return add_meta_to_result(actions, response, "actions")
192262

193263
def get_actions(self, network, status=None, sort=None):
194264
# type: (Network, Optional[List[str]], Optional[List[str]]) -> List[BoundAction]
@@ -201,4 +271,6 @@ def get_actions(self, network, status=None, sort=None):
201271
Specify how the results are sorted. Choices: `id` `id:asc` `id:desc` `command` `command:asc` `command:desc` `status` `status:asc` `status:desc` `progress` `progress:asc` `progress:desc` `started` `started:asc` `started:desc` `finished` `finished:asc` `finished:desc`
202272
:return: List[:class:`BoundAction <hcloud.actions.client.BoundAction>`]
203273
"""
204-
return super(NetworksClient, self).get_actions(network, status=status, sort=sort)
274+
return super(NetworksClient, self).get_actions(
275+
network, status=status, sort=sort
276+
)

hcloud/networks/domain.py

Lines changed: 25 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ class Network(BaseDomain):
2222
:param labels: dict
2323
User-defined labels (key-value pairs)
2424
"""
25+
2526
__slots__ = (
2627
"id",
2728
"name",
@@ -30,20 +31,19 @@ class Network(BaseDomain):
3031
"routes",
3132
"servers",
3233
"protection",
33-
"labels"
34+
"labels",
3435
)
3536

3637
def __init__(
37-
self,
38-
id=None,
39-
name=None,
40-
ip_range=None,
41-
subnets=None,
42-
routes=None,
43-
servers=None,
44-
protection=None,
45-
labels=None
46-
38+
self,
39+
id=None,
40+
name=None,
41+
ip_range=None,
42+
subnets=None,
43+
routes=None,
44+
servers=None,
45+
protection=None,
46+
labels=None,
4747
):
4848
self.id = id
4949
self.name = name
@@ -56,13 +56,20 @@ def __init__(
5656

5757

5858
class NetworkSubnet(BaseDomain):
59-
# TODO
60-
pass
59+
__slots__ = ("type", "ip_range", "network_zone")
60+
61+
def __init__(self, type=None, ip_range=None, network_zone=None):
62+
self.type = type
63+
self.ip_range = ip_range
64+
self.network_zone = network_zone
6165

6266

6367
class NetworkRoute(BaseDomain):
64-
# TODO
65-
pass
68+
__slots__ = ("destination", "gateway", "network_zone")
69+
70+
def __init__(self, destination=None, gateway=None):
71+
self.destination = destination
72+
self.gateway = gateway
6673

6774

6875
class CreateNetworkResponse(BaseDomain):
@@ -73,15 +80,9 @@ class CreateNetworkResponse(BaseDomain):
7380
:param action: :class:`BoundAction <hcloud.actions.client.BoundAction>`
7481
The Action which shows the progress of the network Creation
7582
"""
76-
__slots__ = (
77-
"network",
78-
"action"
79-
)
8083

81-
def __init__(
82-
self,
83-
network, # type: BoundNetwork
84-
action, # type: BoundAction
85-
):
84+
__slots__ = ("network", "action")
85+
86+
def __init__(self, network, action): # type: BoundNetwork # type: BoundAction
8687
self.network = network
8788
self.action = action

0 commit comments

Comments
 (0)