Skip to content

Commit 45fd1ea

Browse files
author
Elias Nygren
committed
avoid_hosts and login_user block
1 parent e781aa8 commit 45fd1ea

File tree

3 files changed

+72
-25
lines changed

3 files changed

+72
-25
lines changed

test/test_server_creation.py

Lines changed: 35 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
from future import standard_library
77
standard_library.install_aliases()
88

9-
from upcloud_api import ZONE, Server, Storage
9+
from upcloud_api import ZONE, Server, Storage, login_user_block
1010

1111
from conftest import Mock
1212
import json, pytest, responses
@@ -57,10 +57,16 @@ def test_server_init(self, manager):
5757

5858

5959
def test_server_prepare_post_body(self):
60-
server = Server(core_number=2, memory_amount=1024, hostname='my.example.com',zone=ZONE.Chicago, storage_devices=[
61-
Storage(os='Ubuntu 14.04', size=10),
62-
Storage()
63-
])
60+
server = Server(
61+
core_number=2,
62+
memory_amount=1024,
63+
hostname='my.example.com',
64+
zone=ZONE.Chicago,
65+
storage_devices=[
66+
Storage(os='Ubuntu 14.04', size=10),
67+
Storage()
68+
]
69+
)
6470
body = server.prepare_post_body()
6571

6672
s1 = body['server']['storage_devices']['storage_device'][0]
@@ -82,10 +88,22 @@ def test_server_prepare_post_body(self):
8288
assert body['server']['zone'] == 'us-chi1'
8389

8490
def test_server_prepare_post_body_optional_attributes(self):
85-
server = Server(core_number=2, memory_amount=1024,
86-
hostname='my.example.com',zone=ZONE.Chicago,
87-
storage_devices=[ Storage(os='Ubuntu 14.04', size=10)],
88-
vnc_password='my-passwd', password_delivery='email' )
91+
server = Server(
92+
core_number=2,
93+
memory_amount=1024,
94+
hostname='my.example.com',
95+
zone=ZONE.Chicago,
96+
storage_devices=[
97+
Storage(
98+
os='Ubuntu 14.04',
99+
size=10
100+
)
101+
],
102+
vnc_password='my-passwd',
103+
password_delivery='email',
104+
login_user=login_user_block('upclouduser', ['this-is-a-SSH-key']),
105+
avoid_host='12345678'
106+
)
89107

90108
body = server.prepare_post_body()
91109
assert body['server']['title'] == 'my.example.com'
@@ -95,6 +113,14 @@ def test_server_prepare_post_body_optional_attributes(self):
95113
assert body['server']['zone'] == 'us-chi1'
96114
assert body['server']['vnc_password'] == 'my-passwd'
97115
assert body['server']['password_delivery'] == 'email'
116+
assert body['server']['login_user'] == {
117+
'username': 'upclouduser',
118+
'create_password': 'yes',
119+
'ssh_keys': {
120+
'ssh_key': [ 'this-is-a-SSH-key' ]
121+
}
122+
}
123+
assert body['server']['avoid_host'] == '12345678'
98124

99125
@responses.activate
100126
def test_create_server(self, manager):
@@ -160,4 +186,3 @@ def test_create_server_with_dict(self, manager):
160186
assert server1.video_model == 'cirrus'
161187
assert server1.vnc == 'off'
162188
assert server1.vnc_password == 'aabbccdd'
163-

upcloud_api/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717

1818
from upcloud_api.storage import Storage
1919
from upcloud_api.ip_address import IP_address
20-
from upcloud_api.server import Server
20+
from upcloud_api.server import Server, login_user_block
2121
from upcloud_api.firewall import FirewallRule
2222
from upcloud_api.tools import OperatingSystems, ZONE
2323
from upcloud_api.tag import Tag

upcloud_api/server.py

Lines changed: 36 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,20 @@
1313
from time import sleep
1414

1515

16+
def login_user_block(username, ssh_keys, create_password=True):
17+
"""
18+
Helper function for creating Server.login_user blocks.
19+
(see: https://www.upcloud.com/api/8-servers/#create-server)
20+
"""
21+
return {
22+
'username': username,
23+
'create_password': 'yes' if create_password is True else 'no',
24+
'ssh_keys': {
25+
'ssh_key': ssh_keys
26+
}
27+
}
28+
29+
1630
class Server(BaseAPI):
1731
"""
1832
Object representation of UpCloud Server instance.
@@ -26,8 +40,14 @@ class Server(BaseAPI):
2640
#
2741

2842
updateable_fields = [
29-
'boot_order', 'core_number', 'firewall', 'hostname', 'memory_amount', 'nic_model', 'title',
30-
'timezone', 'video_model', 'vnc', 'vnc_password', 'plan'
43+
'boot_order', 'core_number', 'firewall', 'hostname', 'memory_amount', 'nic_model',
44+
'title', 'timezone', 'video_model', 'vnc', 'vnc_password', 'plan'
45+
]
46+
47+
optional_fields = [
48+
'plan', 'core_number', 'memory_amount', 'boot_order', 'firewall', 'nic_model',
49+
'timezone', 'video_model', 'vnc_password', 'password_delivery', 'avoid_host',
50+
'login_user'
3151
]
3252

3353

@@ -288,19 +308,21 @@ def prepare_post_body(self):
288308
'storage_devices': {}
289309
}
290310

291-
# optional
292-
if hasattr(self, 'plan'): body['server']['plan'] = self.plan
293-
if hasattr(self, 'core_number'): body['server']['core_number'] = self.core_number
294-
if hasattr(self, 'memory_amount'): body['server']['memory_amount'] = self.memory_amount
295-
if hasattr(self, 'boot_order'): body['server']['boot_order'] = self.boot_order
296-
if hasattr(self, 'firewall'): body['server']['firewall'] = self.firewall
297-
if hasattr(self, 'nic_model'): body['server']['nic_model'] = self.nic_model
298-
if hasattr(self, 'timezone'): body['server']['timezone'] = self.timezone
299-
if hasattr(self, 'video_model'): body['server']['video_model'] = self.video_model
300-
if hasattr(self, 'vnc_password'): body['server']['vnc_password'] = self.vnc_password
301-
if hasattr(self, 'password_delivery'): body['server']['password_delivery'] = self.password_delivery
302-
else: body['server']['password_delivery'] = 'none'
311+
# optional fields
312+
313+
for optional_field in self.optional_fields:
314+
if hasattr(self, optional_field):
315+
body['server'][optional_field] = getattr(self, optional_field)
316+
317+
318+
# set password_delivery default as 'none' to prevent API from sending
319+
# emails (with credentials) about each created server
320+
if not hasattr(self, 'password_delivery'):
321+
body['server']['password_delivery'] = 'none'
322+
303323

324+
# collect storage devices and create a unique title (see: Storage.title in API doc)
325+
# for each of them
304326

305327
body['server']['storage_devices'] = {
306328
'storage_device': []

0 commit comments

Comments
 (0)