Skip to content

Commit d204c6e

Browse files
author
Elias Nygren
committed
server.to_dict and server.tag
1 parent 099024d commit d204c6e

File tree

2 files changed

+61
-30
lines changed

2 files changed

+61
-30
lines changed

upcloud/cloud_manager/server_mixin.py

Lines changed: 33 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
standard_library.install_aliases()
99
from builtins import object
1010
from ..ip_address import IP_address
11-
from ..storage import Storage
11+
from ..storage import Storage
1212

1313
from ..server import Server
1414

@@ -22,15 +22,17 @@ class ServerManager(object):
2222

2323
def get_servers(self, populate=False):
2424
"""
25-
Returns a list of (populated or unpopulated) Server instances.
25+
Returns a list of (populated or unpopulated) Server instances.
2626
Populate = False (default) => 1 API request, returns unpopulated Server instances.
2727
Populate = True => Does 1 + n API requests (n = # of servers), returns populated Server instances.
2828
"""
29-
30-
servers = self.get_request("/server")["servers"]["server"]
29+
30+
servers = self.get_request("/server")["servers"]["server"]
3131

3232
server_list = list()
3333
for server in servers:
34+
# remove the extra "tag" dict to simplify accessing tags
35+
server['tags'] = server['tags']['tag']
3436
server_list.append( Server(server, cloud_manager = self) )
3537

3638
if( populate ):
@@ -39,30 +41,30 @@ def get_servers(self, populate=False):
3941

4042
return server_list
4143

42-
44+
4345
def get_server(self, UUID):
4446
"""
4547
Returns a (populated) Server instance.
4648
"""
4749
server, IP_addresses, storages = self.get_server_data(UUID)
48-
49-
return Server( server,
50-
ip_addresses = IP_addresses,
51-
storage_devices = storages,
50+
51+
return Server( server,
52+
ip_addresses = IP_addresses,
53+
storage_devices = storages,
5254
populated = True,
5355
cloud_manager = self )
5456

5557

5658
def create_server(self, server):
5759
"""
58-
Creates a server and its storages based on a (locally created) Server object.
60+
Creates a server and its storages based on a (locally created) Server object.
5961
Populates the given Server instance with the API response.
6062
6163
Example:
6264
server1 = Server( core_number = 1,
63-
memory_amount = 512,
64-
hostname = "my.example.1",
65-
zone = ZONE.London,
65+
memory_amount = 512,
66+
hostname = "my.example.1",
67+
zone = ZONE.London,
6668
storage_devices = [
6769
Storage(os = "Ubuntu 14.04", size=10, tier=maxiops, title='The OS drive'),
6870
Storage(size=10),
@@ -75,7 +77,7 @@ def create_server(self, server):
7577
- size defaults to 10,
7678
- title defaults to hostname + " OS disk" and hostname + " storage disk id" (id is a running starting from 1)
7779
- tier defaults to maxiops
78-
- valid operating systems are:
80+
- valid operating systems are:
7981
"CentOS 6.5", "CentOS 7.0"
8082
"Debian 7.8"
8183
"Ubuntu 12.04", "Ubuntu 14.04"
@@ -86,14 +88,14 @@ def create_server(self, server):
8688
body = server.prepare_post_body()
8789

8890
res = self.post_request("/server", body)
89-
91+
9092
# Populate subobjects
9193
IP_addresses = IP_address._create_ip_address_objs( res["server"].pop("ip_addresses"), cloud_manager = self )
9294
storages = Storage._create_storage_objs( res["server"].pop("storage_devices"), cloud_manager = self )
9395

94-
server._reset( res["server"],
95-
ip_addresses = IP_addresses,
96-
storage_devices = storages,
96+
server._reset( res["server"],
97+
ip_addresses = IP_addresses,
98+
storage_devices = storages,
9799
cloud_manager = self,
98100
populated = True)
99101
return server
@@ -113,36 +115,39 @@ def modify_server(self, UUID, **kwargs):
113115

114116
res = self.request("PUT", "/server/" + UUID, body)
115117
server = res["server"]
116-
118+
117119
# Populate subobjects
118120
IP_addresses = IP_address._create_ip_address_objs( server.pop("ip_addresses"), cloud_manager = self )
119121
storages = Storage._create_storage_objs( server.pop("storage_devices"), cloud_manager = self )
120122

121-
return Server( server,
122-
ip_addresses = IP_addresses,
123-
storage_devices = storages,
123+
return Server( server,
124+
ip_addresses = IP_addresses,
125+
storage_devices = storages,
124126
populated = True,
125127
cloud_manager = self )
126128

127129

128130
def delete_server(self, UUID):
129131
"""
130-
DELETE '/server/UUID'. Permanently destroys the virtual machine.
132+
DELETE '/server/UUID'. Permanently destroys the virtual machine.
131133
DOES NOT remove the storage disks.
132134
133135
Returns an empty object.
134136
"""
135137
return self.request("DELETE", "/server/" + UUID)
136-
137-
138+
139+
138140
def get_server_data(self, UUID):
139141
"""
140-
Returns '/server/uuid' data in Python dict.
142+
Returns '/server/uuid' data in Python dict.
141143
Creates object representations of any IP-address and Storage.
142144
"""
143-
data = self.get_request("/server/" + UUID)
145+
data = self.get_request("/server/" + UUID)
144146
server = data["server"]
145-
147+
148+
# remove the extra "tag" dict to simplify accessing tags
149+
server['tags'] = server['tags']['tag']
150+
146151
# Populate subobjects
147152
IP_addresses = IP_address._create_ip_address_objs( server.pop("ip_addresses"), cloud_manager = self )
148153
storages = Storage._create_storage_objs( server.pop("storage_devices"), cloud_manager = self )

upcloud/server.py

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,6 @@ class Server(BaseAPI):
1919
updateable_fields = [ "boot_order", "core_number", "firewall", "hostname", "memory_amount",
2020
"nic_model", "title", "timezone", "video_model", "vnc", "vnc_password" ]
2121

22-
post_fields = []
23-
2422

2523
def __init__(self, *initial_data, **kwargs):
2624
object.__setattr__(self, "populated", False)
@@ -238,5 +236,33 @@ def prepare_post_body(self):
238236
return body
239237

240238

239+
def to_dict(self):
240+
fields = dict(vars(self).items())
241+
242+
if self.populated:
243+
fields['ip_addresses'] = []
244+
fields['storage_devices'] = []
245+
246+
for ip in self.ip_addresses:
247+
fields['ip_addresses'].append({
248+
'address': ip.address,
249+
'access': ip.access,
250+
'family': ip.family
251+
})
252+
253+
for storage in self.storage_devices:
254+
fields['storage_devices'].append({
255+
"address": storage.address,
256+
"storage": storage.uuid,
257+
"storage_size": storage.size,
258+
"storage_title": storage.title,
259+
"type": storage.type,
260+
})
261+
262+
del fields['populated']
263+
del fields['cloud_manager']
264+
return fields
265+
266+
241267
def __str__(self):
242268
return "Server: " + self.hostname

0 commit comments

Comments
 (0)