Skip to content

Commit 7506d46

Browse files
author
Elias Nygren
committed
add (dangerous) live tests that are run separately
1 parent 5bc038d commit 7506d46

File tree

1 file changed

+293
-0
lines changed

1 file changed

+293
-0
lines changed

test/live_test.py

Lines changed: 293 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,293 @@
1+
import sys
2+
from time import sleep
3+
4+
import upcloud
5+
from upcloud import CloudManager, Server, Storage, FirewallRule, ZONE
6+
7+
# cluster to be used in live tests
8+
cluster = {
9+
"web1": Server(
10+
core_number = 1,
11+
memory_amount = 512,
12+
hostname = "web1.example.com",
13+
zone = ZONE.London,
14+
password_delivery = "none",
15+
storage_devices = [
16+
Storage(os = "Ubuntu 14.04", size=10),
17+
Storage(size=100, tier="hdd")
18+
]),
19+
20+
"web2": Server(
21+
core_number = 1,
22+
memory_amount = 512,
23+
hostname = "web2.example.com",
24+
zone = ZONE.London,
25+
password_delivery = "none",
26+
storage_devices = [
27+
Storage(os = "Ubuntu 14.04", size=10),
28+
Storage(size=100, tier="hdd"),
29+
]),
30+
31+
"db": Server(
32+
core_number = 2,
33+
memory_amount = 2048,
34+
hostname = "db.example.com",
35+
zone = ZONE.London,
36+
password_delivery = "none",
37+
storage_devices = [
38+
Storage(os = "CentOS 7.0", size=10),
39+
Storage(size=100),
40+
]),
41+
42+
"lb": Server(
43+
core_number = 2,
44+
memory_amount = 1024,
45+
hostname = "balancer.example.com",
46+
zone = ZONE.London,
47+
password_delivery = "none",
48+
storage_devices = [
49+
Storage(os = "Debian 7.8", size=10)
50+
])
51+
}
52+
53+
firewall_rules = [
54+
FirewallRule(
55+
position = "1",
56+
direction = "in",
57+
family = "IPv4",
58+
protocol = "tcp",
59+
source_address_start = "192.168.1.1",
60+
source_address_end = "192.168.1.255",
61+
destination_port_start = "22",
62+
destination_port_end = "22",
63+
action = "accept"
64+
),
65+
FirewallRule(
66+
position = "2",
67+
direction = "in",
68+
family = "IPv4",
69+
protocol = "tcp",
70+
source_address_start = "192.168.1.1",
71+
source_address_end = "192.168.1.255",
72+
destination_port_start = "21",
73+
destination_port_end = "21",
74+
action = "accept"
75+
)
76+
77+
]
78+
79+
80+
def wait_until_change_state(manager, target_state):
81+
print('- wait until all servers are at state "{0}"'.format(target_state))
82+
83+
all_servers_have_state = False
84+
while not all_servers_have_state:
85+
86+
# assume state has changed
87+
all_servers_have_state = True
88+
89+
# check assumption
90+
servers = manager.get_servers()
91+
for server in servers:
92+
if server.state != target_state:
93+
# assumption did not hold true
94+
all_servers_have_state = False
95+
96+
if not all_servers_have_state:
97+
print(
98+
'-- all servers were not in "{0}" state, wait for 20 sec and retry...'
99+
.format(target_state)
100+
)
101+
sleep(20)
102+
103+
print('- all servers at "{0}" starte'.format(target_state))
104+
105+
def stop_servers_and_wait(manager):
106+
print("- stopping servers")
107+
servers = manager.get_servers()
108+
109+
for server in servers:
110+
if server.state == "started":
111+
server.stop()
112+
113+
wait_until_change_state(manager, "stopped")
114+
115+
print("- all stopped, continue")
116+
117+
118+
def change_server_properties_test(manager, server):
119+
print("|---- server properties ----|")
120+
server.populate()
121+
122+
print("- update RAM and CPU")
123+
server.core_number = '3'
124+
server.memory_amount = '1024'
125+
server.save()
126+
127+
print("- add an IP address")
128+
server.add_IP()
129+
130+
print("- create and attach a Storage")
131+
storage = manager.create_storage(size=10, tier='hdd', zone=ZONE.London)
132+
server.add_storage(storage)
133+
134+
print("- start the server")
135+
server.start()
136+
137+
#sync new info from API and assert the changes from above have happened
138+
print("- check the changes from the API")
139+
server.populate()
140+
assert server.core_number == '3'
141+
assert server.memory_amount == '1024'
142+
assert len(server.storage_devices) == 3
143+
assert len(server.ip_addresses) == 4
144+
145+
# make sure servers[3] has had time to start
146+
print('- wait for state "started"')
147+
while(server.state != 'started'):
148+
sleep(10)
149+
server.populate()
150+
151+
print("- succesfully tested server properties, continue")
152+
print("-----------------------------")
153+
154+
155+
def firewall_test(manager):
156+
print("|--------- firewall --------|")
157+
server = manager.get_servers()[0]
158+
159+
# add 1 rule and remove it
160+
print("- add 1 firewall rule and then remove it")
161+
server.add_firewall_rule(firewall_rules[0])
162+
163+
fs = server.get_firewall_rules()
164+
assert len(fs) == 1
165+
166+
fs[0].destroy()
167+
fs = server.get_firewall_rules()
168+
assert len(fs) == 0
169+
170+
# add several rules and remove them
171+
print("- add several firewall rules and then remove them")
172+
server.configure_firewall(firewall_rules)
173+
174+
fs = server.get_firewall_rules()
175+
assert len(fs) == 2
176+
177+
for f in fs:
178+
manager.delete_firewall_rule(server.uuid, 1)
179+
180+
fs = server.get_firewall_rules()
181+
assert len(fs) == 0
182+
183+
print("-----------------------------")
184+
185+
def create_cluster(manager):
186+
print("|----- creating cluster -----|")
187+
for server in cluster:
188+
s = manager.create_server(cluster[server])
189+
print("- created", s.title)
190+
191+
192+
wait_until_change_state(manager, 'started')
193+
194+
servers = manager.get_servers()
195+
assert len(servers) == 4
196+
197+
print("all servers started, continue")
198+
print("-----------------------------")
199+
200+
return servers
201+
202+
203+
def destroy_servers(manager):
204+
print("|----- destroy servers -----|")
205+
206+
stop_servers_and_wait(manager)
207+
208+
servers = manager.get_servers()
209+
for server in servers:
210+
server.destroy()
211+
print("- destroyed", server.title)
212+
213+
print("all servers destroyed, continue")
214+
print("-----------------------------")
215+
216+
def destroy_storages(manager):
217+
print("|---- destroy storages -----|")
218+
219+
stop_servers_and_wait(manager)
220+
221+
storages = manager.get_storages()
222+
for s in storages:
223+
s.destroy()
224+
print("- destroyed", s.title)
225+
226+
print("all storages destroyed, continue")
227+
print("-----------------------------")
228+
229+
230+
def live_test(username, password):
231+
print("|----- begin live_test -----|")
232+
manager = CloudManager(username, password)
233+
auth = manager.authenticate()
234+
235+
print("- auth: ", auth)
236+
237+
# set up cluster
238+
servers = create_cluster(manager)
239+
240+
# stop one server for server properties test
241+
servers[3].stop()
242+
print("- stopped server {} for stopped-server tests".format(servers[3].title))
243+
244+
# firewall tests while servers[3] is stopping
245+
firewall_test(manager)
246+
247+
# make sure servers[3] has had time to stop
248+
while(servers[3].state != 'stopped'):
249+
print("-- waiting for {0} to stop...".format(servers[3].title))
250+
sleep(10)
251+
servers[3].populate()
252+
253+
254+
servers = manager.get_servers()
255+
server = None
256+
for s in servers:
257+
if s.state=='stopped':
258+
server = s
259+
260+
change_server_properties_test(manager, server)
261+
262+
# clean up
263+
destroy_servers(manager)
264+
destroy_storages(manager)
265+
266+
267+
if __name__ == "__main__":
268+
269+
print("""
270+
WARNING! This live test suite will permanently destroy all
271+
resources of the account it is ran with. It is meant for developers
272+
of upcloud-python-api and to be used with a throwaway dev account
273+
that is not being used to host anything important.
274+
275+
This script is not packaged with releases in PyPI.
276+
277+
Please type in "yes" to continue, or anything else to exit.
278+
"""
279+
)
280+
user_input = input()
281+
if user_input != "yes":
282+
exit(sys.exit())
283+
284+
if len(sys.argv) == 3:
285+
uname = sys.argv[1]
286+
passwd = sys.argv[2]
287+
print(uname, passwd)
288+
live_test(uname, passwd)
289+
290+
print(
291+
"""please give username and password as command line arguments;
292+
'python test/live_test.py username password'"""
293+
)

0 commit comments

Comments
 (0)