Skip to content

Commit 349c828

Browse files
author
Elias Nygren
committed
Merge pull request #8 from UpCloudLtd/ansible-features
Ansible features
2 parents 099024d + 1993e19 commit 349c828

File tree

5 files changed

+242
-61
lines changed

5 files changed

+242
-61
lines changed

test/json_data/server.json

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,12 @@
88
"hostname" : "fi.example.com",
99
"memory_amount" : "512",
1010
"uuid" : "00798b85-efdc-41ca-8021-f6ef457b8531",
11-
"state" : "started"
11+
"state" : "started",
12+
"tags": {
13+
"tag": [
14+
"web1"
15+
]
16+
}
1217
},
1318
{
1419
"zone" : "uk-lon1",
@@ -17,8 +22,13 @@
1722
"hostname" : "uk.example.com",
1823
"memory_amount" : "512",
1924
"uuid" : "009d64ef-31d1-4684-a26b-c86c955cbf46",
20-
"state" : "stopped"
25+
"state" : "stopped",
26+
"tags": {
27+
"tag": [
28+
"web2"
29+
]
30+
}
2131
}
2232
]
2333
}
24-
}
34+
}

test/json_data/server_00798b85-efdc-41ca-8021-f6ef457b8531.json

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,11 @@
3131
}
3232
]
3333
},
34+
"tags": {
35+
"tag": [
36+
"web1"
37+
]
38+
},
3439
"timezone" : "UTC",
3540
"title" : "Helsinki server",
3641
"uuid" : "00798b85-efdc-41ca-8021-f6ef457b8531",
@@ -41,4 +46,4 @@
4146
"vnc_port" : "00000",
4247
"zone" : "fi-hel1"
4348
}
44-
}
49+
}

test/json_data/server_009d64ef-31d1-4684-a26b-c86c955cbf46.json

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,11 @@
3131
}
3232
]
3333
},
34+
"tags": {
35+
"tag": [
36+
"web2"
37+
]
38+
},
3439
"timezone" : "UTC",
3540
"title" : "London server",
3641
"uuid" : "009d64ef-31d1-4684-a26b-c86c955cbf46",
@@ -41,4 +46,4 @@
4146
"vnc_port" : "00000",
4247
"zone" : "uk-lon1"
4348
}
44-
}
49+
}

upcloud/cloud_manager/server_mixin.py

Lines changed: 62 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,15 @@
22
from __future__ import print_function
33
from __future__ import division
44
from __future__ import absolute_import
5-
from builtins import dict
6-
from builtins import str
5+
from builtins import dict, str, object
6+
77
from future import standard_library
88
standard_library.install_aliases()
9-
from builtins import object
10-
from ..ip_address import IP_address
11-
from ..storage import Storage
12-
13-
from ..server import Server
149

15-
from ..tools import assignIfExists
10+
from upcloud.tools import assignIfExists
11+
from upcloud import IP_address
12+
from upcloud import Storage
13+
from upcloud import Server
1614

1715

1816
class ServerManager(object):
@@ -22,15 +20,17 @@ class ServerManager(object):
2220

2321
def get_servers(self, populate=False):
2422
"""
25-
Returns a list of (populated or unpopulated) Server instances.
23+
Returns a list of (populated or unpopulated) Server instances.
2624
Populate = False (default) => 1 API request, returns unpopulated Server instances.
2725
Populate = True => Does 1 + n API requests (n = # of servers), returns populated Server instances.
2826
"""
29-
30-
servers = self.get_request("/server")["servers"]["server"]
27+
28+
servers = self.get_request("/server")["servers"]["server"]
3129

3230
server_list = list()
3331
for server in servers:
32+
# remove the extra "tag" dict to simplify accessing tags
33+
server['tags'] = server['tags']['tag']
3434
server_list.append( Server(server, cloud_manager = self) )
3535

3636
if( populate ):
@@ -39,30 +39,33 @@ def get_servers(self, populate=False):
3939

4040
return server_list
4141

42-
42+
4343
def get_server(self, UUID):
4444
"""
4545
Returns a (populated) Server instance.
4646
"""
4747
server, IP_addresses, storages = self.get_server_data(UUID)
48-
49-
return Server( server,
50-
ip_addresses = IP_addresses,
51-
storage_devices = storages,
48+
49+
return Server( server,
50+
ip_addresses = IP_addresses,
51+
storage_devices = storages,
5252
populated = True,
5353
cloud_manager = self )
5454

5555

5656
def create_server(self, server):
5757
"""
58-
Creates a server and its storages based on a (locally created) Server object.
58+
Creates a server and its storages based on a (locally created) Server object.
5959
Populates the given Server instance with the API response.
6060
61+
0.3.0: also supports giving the entire POST body as a dict that is directly
62+
serialised into JSON. Refer to the REST API documentation for correct format.
63+
6164
Example:
6265
server1 = Server( core_number = 1,
63-
memory_amount = 512,
64-
hostname = "my.example.1",
65-
zone = ZONE.London,
66+
memory_amount = 512,
67+
hostname = "my.example.1",
68+
zone = ZONE.London,
6669
storage_devices = [
6770
Storage(os = "Ubuntu 14.04", size=10, tier=maxiops, title='The OS drive'),
6871
Storage(size=10),
@@ -75,28 +78,45 @@ def create_server(self, server):
7578
- size defaults to 10,
7679
- title defaults to hostname + " OS disk" and hostname + " storage disk id" (id is a running starting from 1)
7780
- tier defaults to maxiops
78-
- valid operating systems are:
81+
- valid operating systems are:
7982
"CentOS 6.5", "CentOS 7.0"
8083
"Debian 7.8"
8184
"Ubuntu 12.04", "Ubuntu 14.04"
8285
"Windows 2003","Windows 2008" ,"Windows 2012"
8386
8487
"""
88+
if isinstance(server, Server):
89+
body = server.prepare_post_body()
90+
else:
91+
ip_data = server.pop("ip_addresses", None)
92+
storage_data = server.pop("storage_devices", None)
93+
94+
server_dict = dict()
95+
server_dict['cloud_manager'] = self
96+
if ip_data: server_dict['ip_addresses'] = IP_address._create_ip_address_objs( ip_data, cloud_manager = self )
97+
if storage_data: server_dict['storage_devices'] = Storage._create_storage_objs( storage_data, cloud_manager = self )
98+
99+
server_from_dict = Server(server, **server_dict)
100+
body = server_from_dict.prepare_post_body()
85101

86-
body = server.prepare_post_body()
87102

88103
res = self.post_request("/server", body)
89-
104+
90105
# Populate subobjects
91106
IP_addresses = IP_address._create_ip_address_objs( res["server"].pop("ip_addresses"), cloud_manager = self )
92107
storages = Storage._create_storage_objs( res["server"].pop("storage_devices"), cloud_manager = self )
93108

94-
server._reset( res["server"],
95-
ip_addresses = IP_addresses,
96-
storage_devices = storages,
97-
cloud_manager = self,
98-
populated = True)
99-
return server
109+
if isinstance(server, Server):
110+
server_to_return = server
111+
else:
112+
server_to_return = server_from_dict
113+
114+
server_to_return._reset( res["server"],
115+
ip_addresses = IP_addresses,
116+
storage_devices = storages,
117+
cloud_manager = self,
118+
populated = True)
119+
return server_to_return
100120

101121

102122
def modify_server(self, UUID, **kwargs):
@@ -113,36 +133,39 @@ def modify_server(self, UUID, **kwargs):
113133

114134
res = self.request("PUT", "/server/" + UUID, body)
115135
server = res["server"]
116-
136+
117137
# Populate subobjects
118138
IP_addresses = IP_address._create_ip_address_objs( server.pop("ip_addresses"), cloud_manager = self )
119139
storages = Storage._create_storage_objs( server.pop("storage_devices"), cloud_manager = self )
120140

121-
return Server( server,
122-
ip_addresses = IP_addresses,
123-
storage_devices = storages,
141+
return Server( server,
142+
ip_addresses = IP_addresses,
143+
storage_devices = storages,
124144
populated = True,
125145
cloud_manager = self )
126146

127147

128148
def delete_server(self, UUID):
129149
"""
130-
DELETE '/server/UUID'. Permanently destroys the virtual machine.
150+
DELETE '/server/UUID'. Permanently destroys the virtual machine.
131151
DOES NOT remove the storage disks.
132152
133153
Returns an empty object.
134154
"""
135155
return self.request("DELETE", "/server/" + UUID)
136-
137-
156+
157+
138158
def get_server_data(self, UUID):
139159
"""
140-
Returns '/server/uuid' data in Python dict.
160+
Returns '/server/uuid' data in Python dict.
141161
Creates object representations of any IP-address and Storage.
142162
"""
143-
data = self.get_request("/server/" + UUID)
163+
data = self.get_request("/server/" + UUID)
144164
server = data["server"]
145-
165+
166+
# remove the extra "tag" dict to simplify accessing tags
167+
server['tags'] = server['tags']['tag']
168+
146169
# Populate subobjects
147170
IP_addresses = IP_address._create_ip_address_objs( server.pop("ip_addresses"), cloud_manager = self )
148171
storages = Storage._create_storage_objs( server.pop("storage_devices"), cloud_manager = self )

0 commit comments

Comments
 (0)