Skip to content

Commit a34dfcf

Browse files
committed
WIP
1 parent 95340db commit a34dfcf

6 files changed

Lines changed: 298 additions & 0 deletions

File tree

hcloud/hcloud.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
from hcloud.actions.client import ActionsClient
88
from hcloud.floating_ips.client import FloatingIPsClient
9+
from hcloud.networks.client import NetworksClient
910
from hcloud.isos.client import IsosClient
1011
from hcloud.servers.client import ServersClient
1112
from hcloud.server_types.client import ServerTypesClient
@@ -106,6 +107,11 @@ def __init__(self, token, api_endpoint="https://api.hetzner.cloud/v1", applicati
106107
107108
:type: :class:`FloatingIPsClient <hcloud.floating_ips.client.FloatingIPsClient>`
108109
"""
110+
self.networks = NetworksClient(self)
111+
"""NetworksClient Instance
112+
113+
:type: :class:`NetworksClient <hcloud.networks.client.NetworksClient>`
114+
"""
109115

110116
def _get_user_agent(self):
111117
"""Get the user agent of the hcloud-python instance with the user application name (if specified)

hcloud/networks/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
# -*- coding: utf-8 -*-

hcloud/networks/client.py

Lines changed: 204 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,204 @@
1+
# -*- coding: utf-8 -*-
2+
from hcloud.core.client import ClientEntityBase, BoundModelBase, GetEntityByNameMixin
3+
from hcloud.core.domain import add_meta_to_result
4+
5+
from hcloud.actions.client import BoundAction
6+
from hcloud.networks.domain import Network
7+
8+
9+
class BoundNetwork(BoundModelBase):
10+
model = Network
11+
12+
def update(self, name=None, labels=None):
13+
# type: (Optional[str], Optional[Dict[str, str]]) -> BoundNetwork
14+
"""Updates a network. You can update a network’s name and a networks’s labels.
15+
16+
:param name: str (optional)
17+
New name to set
18+
:param labels: Dict[str, str] (optional)
19+
User-defined labels (key-value pairs)
20+
:return: :class:`BoundNetwork <hcloud.networks.client.BoundNetwork>`
21+
"""
22+
return self._client.update(self, name, labels)
23+
24+
def delete(self):
25+
# type: () -> BoundAction
26+
"""Deletes a network.
27+
28+
:return: :class:`BoundAction <hcloud.actions.client.BoundAction>`
29+
"""
30+
return self._client.delete(self)
31+
32+
def get_actions_list(self, status=None, sort=None, page=None, per_page=None):
33+
# type: (Optional[List[str]], Optional[List[str]], Optional[int], Optional[int]) -> PageResults[List[BoundAction, Meta]]
34+
"""Returns all action objects for a network.
35+
36+
:param status: List[str] (optional)
37+
Response will have only actions with specified statuses. Choices: `running` `success` `error`
38+
:param sort: List[str] (optional)
39+
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`
40+
:param page: int (optional)
41+
Specifies the page to fetch
42+
:param per_page: int (optional)
43+
Specifies how many results are returned by page
44+
:return: (List[:class:`BoundAction <hcloud.actions.client.BoundAction>`], :class:`Meta <hcloud.core.domain.Meta>`)
45+
"""
46+
return self._client.get_actions_list(self, status, sort, page, per_page)
47+
48+
def get_actions(self, status=None, sort=None):
49+
# type: (Optional[List[str]], Optional[List[str]]) -> List[BoundAction]
50+
"""Returns all action objects for a network.
51+
52+
:param status: List[str] (optional)
53+
Response will have only actions with specified statuses. Choices: `running` `success` `error`
54+
:param sort: List[str] (optional)
55+
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`
56+
:return: List[:class:`BoundAction <hcloud.actions.client.BoundAction>`]
57+
"""
58+
return self._client.get_actions(self, status, sort)
59+
60+
61+
class NetworksClient(ClientEntityBase, GetEntityByNameMixin):
62+
results_list_attribute_name = 'networks'
63+
64+
def get_by_id(self, id):
65+
# type: (int) -> BoundNetwork
66+
"""Get a specific network
67+
68+
:param id: int
69+
:return: :class:`BoundNetwork <hcloud.networks.client.BoundNetwork>
70+
"""
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+
):
80+
# type: (...) -> PageResults[List[BoundNetwork], Meta]
81+
"""Get a list of networks from this account
82+
83+
:param name: str (optional)
84+
Can be used to filter networks by their name.
85+
:param label_selector: str (optional)
86+
Can be used to filter networks by labels. The response will only contain networks matching the label selector.
87+
:param page: int (optional)
88+
Specifies the page to fetch
89+
:param per_page: int (optional)
90+
Specifies how many results are returned by page
91+
:return: (List[:class:`BoundNetwork <hcloud.networks.client.BoundNetwork>`], :class:`Meta <hcloud.core.domain.Meta>`)
92+
"""
93+
params = {}
94+
if name:
95+
params['name'] = name
96+
if label_selector:
97+
params['label_selector'] = label_selector
98+
if page:
99+
params['page'] = page
100+
if per_page:
101+
params['per_page'] = per_page
102+
103+
response = self._client.request(url="/networks", method="GET", params=params)
104+
105+
ass_networks = [BoundNetwork(self, network_data) for network_data in response['networks']]
106+
return self._add_meta_to_result(ass_networks, response)
107+
108+
def get_all(self, name=None, label_selector=None):
109+
# type: (Optional[str], Optional[str]) -> List[BoundNetwork]
110+
"""Get all networks from this account
111+
112+
:param name: str (optional)
113+
Can be used to filter networks by their name.
114+
:param label_selector: str (optional)
115+
Can be used to filter networks by labels. The response will only contain networks matching the label selector.
116+
:return: List[:class:`BoundNetwork <hcloud.networks.client.BoundNetwork>`]
117+
"""
118+
return super(NetworksClient, self).get_all(name=name, label_selector=label_selector)
119+
120+
def get_by_name(self, name):
121+
# type: (str) -> BoundNetwork
122+
"""Get network by name
123+
124+
:param name: str
125+
Used to get network by name.
126+
:return: :class:`BoundNetwork <hcloud.networks.client.BoundNetwork>`
127+
"""
128+
return super(NetworksClient, self).get_by_name(name)
129+
130+
def create(self):
131+
# TODO
132+
pass
133+
134+
def update(self, network, name=None, labels=None):
135+
# type:(Network, Optional[str], Optional[Dict[str, str]]) -> BoundNetwork
136+
"""Updates a network. You can update a network’s name and a network’s labels.
137+
138+
:param network: :class:`BoundNetwork <hcloud.networks.client.BoundNetwork>` or :class:`Network <hcloud.networks.domain.Network>`
139+
:param name: str (optional)
140+
New name to set
141+
:param labels: Dict[str, str] (optional)
142+
User-defined labels (key-value pairs)
143+
:return: :class:`BoundNetwork <hcloud.networks.client.BoundNetwork>`
144+
"""
145+
data = {}
146+
if name is not None:
147+
data.update({"name": name})
148+
if labels is not None:
149+
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'])
152+
153+
def delete(self, network):
154+
# type: (Network) -> BoundAction
155+
"""Deletes a network.
156+
157+
:param network: :class:`BoundNetwork <hcloud.networks.client.BoundNetwork>` or :class:`Network <hcloud.networks.domain.Network>`
158+
:return: :class:`BoundAction <hcloud.actions.client.BoundAction>`
159+
"""
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):
164+
# type: (Network, Optional[List[str]], Optional[List[str]], Optional[int], Optional[int]) -> PageResults[List[BoundAction], Meta]
165+
"""Returns all action objects for a network.
166+
167+
:param network: :class:`BoundNetwork <hcloud.networks.client.BoundNetwork>` or :class:`Network <hcloud.networks.domain.Network>`
168+
:param status: List[str] (optional)
169+
Response will have only actions with specified statuses. Choices: `running` `success` `error`
170+
:param sort: List[str] (optional)
171+
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`
172+
:param page: int (optional)
173+
Specifies the page to fetch
174+
:param per_page: int (optional)
175+
Specifies how many results are returned by page
176+
:return: (List[:class:`BoundAction <hcloud.actions.client.BoundAction>`], :class:`Meta <hcloud.core.domain.Meta>`)
177+
"""
178+
params = {}
179+
if status is not None:
180+
params["status"] = status
181+
if sort is not None:
182+
params["sort"] = sort
183+
if page is not None:
184+
params["page"] = page
185+
if per_page is not None:
186+
params["per_page"] = per_page
187+
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')
192+
193+
def get_actions(self, network, status=None, sort=None):
194+
# type: (Network, Optional[List[str]], Optional[List[str]]) -> List[BoundAction]
195+
"""Returns all action objects for a network.
196+
197+
:param network: :class:`BoundNetwork <hcloud.networks.client.BoundNetwork>` or :class:`Network <hcloud.networks.domain.Network>`
198+
:param status: List[str] (optional)
199+
Response will have only actions with specified statuses. Choices: `running` `success` `error`
200+
:param sort: List[str] (optional)
201+
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`
202+
:return: List[:class:`BoundAction <hcloud.actions.client.BoundAction>`]
203+
"""
204+
return super(NetworksClient, self).get_actions(network, status=status, sort=sort)

hcloud/networks/domain.py

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
# -*- coding: utf-8 -*-
2+
from hcloud.core.domain import BaseDomain
3+
4+
5+
class Network(BaseDomain):
6+
"""Network Domain
7+
8+
:param id: int
9+
ID of the network
10+
:param name: str
11+
Name of the network
12+
:param ip_range: str
13+
IPv4 prefix of the whole network
14+
:param subnets: List[:class:`NetworkSubnet <hcloud.networks.domain.NetworkSubnet>`]
15+
Subnets allocated in this network
16+
:param routes: List[:class:`NetworkRoute <hcloud.networks.domain.NetworkRoute>`]
17+
Routes set in this network
18+
:param servers: List[:class:`BoundServer <hcloud.servers.client.BoundServer>`]
19+
Servers attached to this network
20+
:param protection: dict
21+
Protection configuration for the network
22+
:param labels: dict
23+
User-defined labels (key-value pairs)
24+
"""
25+
__slots__ = (
26+
"id",
27+
"name",
28+
"ip_range",
29+
"subnets",
30+
"routes",
31+
"servers",
32+
"protection",
33+
"labels"
34+
)
35+
36+
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+
47+
):
48+
self.id = id
49+
self.name = name
50+
self.ip_range = ip_range
51+
self.subnets = subnets
52+
self.routes = routes
53+
self.servers = servers
54+
self.protection = protection
55+
self.labels = labels
56+
57+
58+
class NetworkSubnet(BaseDomain):
59+
# TODO
60+
pass
61+
62+
63+
class NetworkRoute(BaseDomain):
64+
# TODO
65+
pass
66+
67+
68+
class CreateNetworkResponse(BaseDomain):
69+
"""Create Network Response Domain
70+
71+
:param network: :class:`BoundNetwork <hcloud.networks.client.BoundNetwork>`
72+
The network which was created
73+
:param action: :class:`BoundAction <hcloud.actions.client.BoundAction>`
74+
The Action which shows the progress of the network Creation
75+
"""
76+
__slots__ = (
77+
"network",
78+
"action"
79+
)
80+
81+
def __init__(
82+
self,
83+
network, # type: BoundNetwork
84+
action, # type: BoundAction
85+
):
86+
self.network = network
87+
self.action = action

tests/integration/networks/__init__.py

Whitespace-only changes.

tests/unit/networks/__init__.py

Whitespace-only changes.

0 commit comments

Comments
 (0)