22from __future__ import print_function
33from __future__ import division
44from __future__ import absolute_import
5- from builtins import dict
6- from builtins import str
5+ from builtins import dict , str , object
6+
77from future import standard_library
88standard_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
1816class 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