33from hcloud .core .domain import add_meta_to_result
44
55from hcloud .actions .client import BoundAction
6- from hcloud .networks .domain import Network
6+ from hcloud .networks .domain import Network , NetworkRoute , NetworkSubnet
77
88
99class 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
6180class 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+ )
0 commit comments