Revision db113224 kamaki/clients/livetest/cyclades.py
b/kamaki/clients/livetest/cyclades.py | ||
---|---|---|
30 | 30 |
# documentation are those of the authors and should not be |
31 | 31 |
# interpreted as representing official policies, either expressed |
32 | 32 |
# or implied, of GRNET S.A. |
33 |
from mock import patch |
|
34 |
from unittest import TestCase |
|
33 | 35 |
|
34 |
import time
|
|
36 |
from kamaki.clients import ClientError
|
|
35 | 37 |
|
36 |
from kamaki.clients import livetest, ClientError |
|
37 |
from kamaki.clients.cyclades import CycladesClient |
|
38 | 38 |
|
39 |
|
|
40 |
class Cyclades(livetest.Generic): |
|
39 |
class Cyclades(TestCase): |
|
41 | 40 |
"""Set up a Cyclades thorough test""" |
42 | 41 |
def setUp(self): |
43 |
|
|
44 |
with open(self['image', 'details']) as f: |
|
45 |
self.img_details = eval(f.read()) |
|
46 |
self.img = self.img_details['id'] |
|
47 |
with open(self['flavor', 'details']) as f: |
|
48 |
self._flavor_details = eval(f.read()) |
|
49 |
self.PROFILES = ('ENABLED', 'DISABLED', 'PROTECTED') |
|
50 |
|
|
51 |
self.servers = {} |
|
52 |
self.now = time.mktime(time.gmtime()) |
|
53 |
self.servname1 = 'serv' + unicode(self.now) |
|
54 |
self.servname2 = self.servname1 + '_v2' |
|
55 |
self.servname1 += '_v1' |
|
56 |
self.flavorid = 1 |
|
57 |
#servers have to be created at the begining... |
|
58 |
self.networks = {} |
|
59 |
self.netname1 = 'net' + unicode(self.now) |
|
60 |
self.netname2 = 'net' + unicode(self.now) + '_v2' |
|
61 |
|
|
62 |
self.client = CycladesClient(self['compute', 'url'], self['token']) |
|
42 |
self.url = 'http://cyclades.example.com' |
|
43 |
self.token = 'cyc14d3s70k3n' |
|
44 |
from kamaki.clients.cyclades import CycladesClient |
|
45 |
self.cyclades = CycladesClient(self.url, self.token) |
|
63 | 46 |
|
64 | 47 |
def tearDown(self): |
65 |
"""Destoy servers used in testing""" |
|
66 |
for net in self.networks.keys(): |
|
67 |
self._delete_network(net) |
|
68 |
for server in self.servers.values(): |
|
69 |
self._delete_server(server['id']) |
|
70 |
print('DEL VM %s (%s)' % (server['id'], server['name'])) |
|
71 |
|
|
72 |
def test_000(self): |
|
73 |
"Prepare a full Cyclades test scenario" |
|
74 |
self.server1 = self._create_server( |
|
75 |
self.servname1, |
|
76 |
self.flavorid, |
|
77 |
self.img) |
|
78 |
self.server2 = self._create_server( |
|
79 |
self.servname2, |
|
80 |
self.flavorid + 2, |
|
81 |
self.img) |
|
82 |
super(self.__class__, self).test_000() |
|
83 |
|
|
84 |
def _create_server(self, servername, flavorid, imageid, personality=None): |
|
85 |
server = self.client.create_server( |
|
86 |
servername, |
|
87 |
flavorid, |
|
88 |
imageid, |
|
89 |
personality) |
|
90 |
print('CREATE VM %s (%s)' % (server['id'], server['name'])) |
|
91 |
self.servers[servername] = server |
|
92 |
return server |
|
93 |
|
|
94 |
def _delete_server(self, servid): |
|
95 |
try: |
|
96 |
current_state = self.client.get_server_details(servid) |
|
97 |
current_state = current_state['status'] |
|
98 |
if current_state == 'DELETED': |
|
99 |
return |
|
100 |
self.client.delete_server(servid) |
|
101 |
self._wait_for_status(servid, current_state) |
|
102 |
self.client.delete_server(servid) |
|
103 |
except: |
|
104 |
return |
|
105 |
|
|
106 |
def _create_network(self, netname, **kwargs): |
|
107 |
net = self.client.create_network(netname, **kwargs) |
|
108 |
self.networks[net['id']] = net |
|
109 |
return net |
|
110 |
|
|
111 |
def _delete_network(self, netid): |
|
112 |
if not netid in self.networks: |
|
113 |
return None |
|
114 |
print('Disconnect nics of network %s' % netid) |
|
115 |
self.client.disconnect_network_nics(netid) |
|
116 |
|
|
117 |
def netwait(wait): |
|
118 |
try: |
|
119 |
self.client.delete_network(netid) |
|
120 |
except ClientError: |
|
121 |
time.sleep(wait) |
|
122 |
self.do_with_progress_bar( |
|
123 |
netwait, |
|
124 |
'Delete network %s' % netid, |
|
125 |
self._waits[:7]) |
|
126 |
return self.networks.pop(netid) |
|
127 |
|
|
128 |
def _wait_for_network(self, netid, status): |
|
129 |
|
|
130 |
def netwait(wait): |
|
131 |
r = self.client.get_network_details(netid) |
|
132 |
if r['status'] == status: |
|
133 |
return |
|
134 |
time.sleep(wait) |
|
135 |
self.do_with_progress_bar( |
|
136 |
netwait, |
|
137 |
'Wait network %s to reach status %s' % (netid, status), |
|
138 |
self._waits[:5]) |
|
139 |
|
|
140 |
def _wait_for_nic(self, netid, servid, in_creation=True): |
|
141 |
self._wait_for_network(netid, 'ACTIVE') |
|
142 |
|
|
143 |
def nicwait(wait): |
|
144 |
nics = self.client.list_server_nics(servid) |
|
145 |
for net in nics: |
|
146 |
found_nic = net['network_id'] == netid |
|
147 |
if (in_creation and found_nic) or not ( |
|
148 |
in_creation or found_nic): |
|
149 |
return |
|
150 |
time.sleep(wait) |
|
151 |
self.do_with_progress_bar( |
|
152 |
nicwait, |
|
153 |
'Wait nic-%s-%s to %sconnect' % ( |
|
154 |
netid, |
|
155 |
servid, |
|
156 |
'' if in_creation else 'dis'), |
|
157 |
self._waits[:5]) |
|
158 |
for net in self.client.list_server_nics(servid): |
|
159 |
if netid == net['network_id']: |
|
160 |
return True |
|
161 |
return False |
|
162 |
|
|
163 |
def _has_status(self, servid, status): |
|
164 |
r = self.client.get_server_details(servid) |
|
165 |
return r['status'] == status |
|
166 |
|
|
167 |
def _wait_for_status(self, servid, status): |
|
168 |
(wait_bar, wait_cb) = self._safe_progress_bar( |
|
169 |
'Server %s in %s' % (servid, status)) |
|
170 |
self.client.wait_server(servid, status, wait_cb=wait_cb) |
|
171 |
self._safe_progress_bar_finish(wait_bar) |
|
48 |
pass |
|
172 | 49 |
|
50 |
""" |
|
173 | 51 |
def test_parallel_creation(self): |
174 |
"""test create with multiple threads
|
|
52 |
""test create with multiple threads |
|
175 | 53 |
Do not use this in regular livetest |
176 |
"""
|
|
54 |
"" |
|
177 | 55 |
from kamaki.clients import SilentEvent |
178 | 56 |
c1 = SilentEvent( |
179 | 57 |
self._create_server, |
... | ... | |
225 | 103 |
c8.start() |
226 | 104 |
|
227 | 105 |
def test_create_server(self): |
228 |
"""Test create_server"""
|
|
106 |
""Test create_server""
|
|
229 | 107 |
self.server1 = self._create_server( |
230 | 108 |
self.servname1, |
231 | 109 |
self.flavorid, |
... | ... | |
240 | 118 |
self.assertEqual(self.server1["status"], "BUILD") |
241 | 119 |
|
242 | 120 |
def test_list_servers(self): |
243 |
"""Test list servers"""
|
|
121 |
""Test list servers""
|
|
244 | 122 |
self.server1 = self._create_server( |
245 | 123 |
self.servname1, |
246 | 124 |
self.flavorid, |
... | ... | |
255 | 133 |
servers = self.client.list_servers() |
256 | 134 |
dservers = self.client.list_servers(detail=True) |
257 | 135 |
|
258 |
"""detailed and simple are same size"""
|
|
136 |
""detailed and simple are same size""
|
|
259 | 137 |
self.assertEqual(len(dservers), len(servers)) |
260 | 138 |
for i in range(len(servers)): |
261 | 139 |
for field in ( |
... | ... | |
269 | 147 |
self.assertFalse(field in servers[i]) |
270 | 148 |
self.assertTrue(field in dservers[i]) |
271 | 149 |
|
272 |
"""detailed and simple contain same names"""
|
|
150 |
""detailed and simple contain same names""
|
|
273 | 151 |
names = sorted(map(lambda x: x["name"], servers)) |
274 | 152 |
dnames = sorted(map(lambda x: x["name"], dservers)) |
275 | 153 |
self.assertEqual(names, dnames) |
276 | 154 |
|
277 | 155 |
def _test_0030_wait_test_servers_to_build(self): |
278 |
"""Pseudo-test to wait for VMs to load"""
|
|
156 |
""Pseudo-test to wait for VMs to load""
|
|
279 | 157 |
print('') |
280 | 158 |
self._wait_for_status(self.server1['id'], 'BUILD') |
281 | 159 |
self._wait_for_status(self.server2['id'], 'BUILD') |
282 | 160 |
|
283 | 161 |
def test_get_server_details(self): |
284 |
"""Test get_server_details"""
|
|
162 |
""Test get_server_details""
|
|
285 | 163 |
self.server1 = self._create_server( |
286 | 164 |
self.servname1, |
287 | 165 |
self.flavorid, |
... | ... | |
297 | 175 |
self.assertEqual(r["status"], "ACTIVE") |
298 | 176 |
|
299 | 177 |
def test_update_server_name(self): |
300 |
"""Test update_server_name"""
|
|
178 |
""Test update_server_name""
|
|
301 | 179 |
self.server1 = self._create_server( |
302 | 180 |
self.servname1, |
303 | 181 |
self.flavorid, |
... | ... | |
316 | 194 |
self.servers[new_name] = changed |
317 | 195 |
|
318 | 196 |
def test_reboot_server(self): |
319 |
"""Test reboot server"""
|
|
197 |
""Test reboot server""
|
|
320 | 198 |
self.server1 = self._create_server( |
321 | 199 |
self.servname1, |
322 | 200 |
self.flavorid, |
... | ... | |
338 | 216 |
self.assertTrue(self._has_status(self.server2['id'], 'REBOOT')) |
339 | 217 |
|
340 | 218 |
def _test_0070_wait_test_servers_to_reboot(self): |
341 |
"""Pseudo-test to wait for VMs to load"""
|
|
219 |
""Pseudo-test to wait for VMs to load""
|
|
342 | 220 |
print('') |
343 | 221 |
self._wait_for_status(self.server1['id'], 'REBOOT') |
344 | 222 |
self._wait_for_status(self.server2['id'], 'REBOOT') |
345 | 223 |
|
346 | 224 |
def test_create_server_metadata(self): |
347 |
"""Test create_server_metadata"""
|
|
225 |
""Test create_server_metadata""
|
|
348 | 226 |
self.server1 = self._create_server( |
349 | 227 |
self.servname1, |
350 | 228 |
self.flavorid, |
... | ... | |
361 | 239 |
self.assert_dicts_are_deeply_equal(r1, r2) |
362 | 240 |
|
363 | 241 |
def test_get_server_metadata(self): |
364 |
"""Test get server_metadata"""
|
|
242 |
""Test get server_metadata""
|
|
365 | 243 |
self.server1 = self._create_server( |
366 | 244 |
self.servname1, |
367 | 245 |
self.flavorid, |
... | ... | |
377 | 255 |
self.assertEqual(r['mymeta_0'], 'val_0') |
378 | 256 |
|
379 | 257 |
def test_update_server_metadata(self): |
380 |
"""Test update_server_metadata"""
|
|
258 |
""Test update_server_metadata""
|
|
381 | 259 |
self.server1 = self._create_server( |
382 | 260 |
self.servname1, |
383 | 261 |
self.flavorid, |
... | ... | |
396 | 274 |
self.assertTrue(r2['mymeta3'], 'val3') |
397 | 275 |
|
398 | 276 |
def test_delete_server_metadata(self): |
399 |
"""Test delete_server_metadata"""
|
|
277 |
""Test delete_server_metadata""
|
|
400 | 278 |
self.server1 = self._create_server( |
401 | 279 |
self.servname1, |
402 | 280 |
self.flavorid, |
... | ... | |
417 | 295 |
self.assertEqual(err.status, 404) |
418 | 296 |
|
419 | 297 |
def test_list_flavors(self): |
420 |
"""Test flavors_get"""
|
|
298 |
""Test flavors_get""
|
|
421 | 299 |
self._test_0120_list_flavors() |
422 | 300 |
|
423 | 301 |
def _test_0120_list_flavors(self): |
... | ... | |
427 | 305 |
self.assertTrue('SNF:disk_template' in r[0]) |
428 | 306 |
|
429 | 307 |
def test_get_flavor_details(self): |
430 |
"""Test test_get_flavor_details"""
|
|
308 |
""Test test_get_flavor_details""
|
|
431 | 309 |
self._test_0130_get_flavor_details() |
432 | 310 |
|
433 | 311 |
def _test_0130_get_flavor_details(self): |
... | ... | |
435 | 313 |
self.assert_dicts_are_deeply_equal(self._flavor_details, r) |
436 | 314 |
|
437 | 315 |
def test_list_images(self): |
438 |
"""Test list_images"""
|
|
316 |
""Test list_images""
|
|
439 | 317 |
self._test_0140_list_images() |
440 | 318 |
|
441 | 319 |
def _test_0140_list_images(self): |
... | ... | |
448 | 326 |
self.assert_dicts_are_deeply_equal(detailed_img, self.img_details) |
449 | 327 |
|
450 | 328 |
def test_get_image_details(self): |
451 |
"""Test image_details"""
|
|
329 |
""Test image_details""
|
|
452 | 330 |
self._test_0150_get_image_details() |
453 | 331 |
|
454 | 332 |
def _test_0150_get_image_details(self): |
... | ... | |
456 | 334 |
self.assert_dicts_are_deeply_equal(r, self.img_details) |
457 | 335 |
|
458 | 336 |
def test_get_image_metadata(self): |
459 |
"""Test get_image_metadata"""
|
|
337 |
""Test get_image_metadata""
|
|
460 | 338 |
self._test_0160_get_image_metadata() |
461 | 339 |
|
462 | 340 |
def _test_0160_get_image_metadata(self): |
... | ... | |
468 | 346 |
self.assertEqual(r[key], val) |
469 | 347 |
|
470 | 348 |
def test_shutdown_server(self): |
471 |
"""Test shutdown_server"""
|
|
349 |
""Test shutdown_server""
|
|
472 | 350 |
self.server1 = self._create_server( |
473 | 351 |
self.servname1, |
474 | 352 |
self.flavorid, |
... | ... | |
483 | 361 |
self.assertEqual(r['status'], 'STOPPED') |
484 | 362 |
|
485 | 363 |
def test_start_server(self): |
486 |
"""Test start_server"""
|
|
364 |
""Test start_server""
|
|
487 | 365 |
self.server1 = self._create_server( |
488 | 366 |
self.servname1, |
489 | 367 |
self.flavorid, |
... | ... | |
500 | 378 |
self.assertEqual(r['status'], 'ACTIVE') |
501 | 379 |
|
502 | 380 |
def test_get_server_console(self): |
503 |
"""Test get_server_console"""
|
|
381 |
""Test get_server_console""
|
|
504 | 382 |
self.server2 = self._create_server( |
505 | 383 |
self.servname2, |
506 | 384 |
self.flavorid + 2, |
... | ... | |
516 | 394 |
self.assertTrue('type' in r) |
517 | 395 |
|
518 | 396 |
def test_get_firewall_profile(self): |
519 |
"""Test get_firewall_profile"""
|
|
397 |
""Test get_firewall_profile""
|
|
520 | 398 |
self.server1 = self._create_server( |
521 | 399 |
self.servname1, |
522 | 400 |
self.flavorid, |
... | ... | |
529 | 407 |
self.assertTrue(fprofile in self.PROFILES) |
530 | 408 |
|
531 | 409 |
def test_set_firewall_profile(self): |
532 |
"""Test set_firewall_profile"""
|
|
410 |
""Test set_firewall_profile""
|
|
533 | 411 |
self.server1 = self._create_server( |
534 | 412 |
self.servname1, |
535 | 413 |
self.flavorid, |
... | ... | |
581 | 459 |
self.assertTrue(term in r) |
582 | 460 |
|
583 | 461 |
def test_create_network(self): |
584 |
"""Test create_network"""
|
|
462 |
""Test create_network""
|
|
585 | 463 |
self._test_0230_create_network() |
586 | 464 |
|
587 | 465 |
def _test_0230_create_network(self): |
... | ... | |
612 | 490 |
self.assertEqual(self.network1[param], val) |
613 | 491 |
|
614 | 492 |
def test_connect_server(self): |
615 |
"""Test connect_server"""
|
|
493 |
""Test connect_server""
|
|
616 | 494 |
self.server1 = self._create_server( |
617 | 495 |
self.servname1, |
618 | 496 |
self.flavorid, |
... | ... | |
629 | 507 |
self.server1['id'])) |
630 | 508 |
|
631 | 509 |
def test_disconnect_server(self): |
632 |
"""Test disconnect_server"""
|
|
510 |
""Test disconnect_server""
|
|
633 | 511 |
self.test_connect_server() |
634 | 512 |
self._test_0250_disconnect_server() |
635 | 513 |
|
... | ... | |
645 | 523 |
self._wait_for_network(self.network2['id'], 'ACTIVE') |
646 | 524 |
|
647 | 525 |
def test_list_server_nics(self): |
648 |
"""Test list_server_nics"""
|
|
526 |
""Test list_server_nics""
|
|
649 | 527 |
self.server1 = self._create_server( |
650 | 528 |
self.servname1, |
651 | 529 |
self.flavorid, |
... | ... | |
666 | 544 |
self.assertTrue(len(r) > len0) |
667 | 545 |
|
668 | 546 |
def test_list_networks(self): |
669 |
"""Test list_network"""
|
|
547 |
""Test list_network""
|
|
670 | 548 |
self.network1 = self._create_network(self.netname1) |
671 | 549 |
self._wait_for_network(self.network1['id'], 'ACTIVE') |
672 | 550 |
self._test_0290_list_networks() |
... | ... | |
691 | 569 |
self.assertTrue(term in net.keys()) |
692 | 570 |
|
693 | 571 |
def test_get_network_details(self): |
694 |
"""Test get_network_details""" |
|
695 | 572 |
self.network1 = self._create_network(self.netname1) |
696 | 573 |
self._test_0300_get_network_details() |
697 | 574 |
|
... | ... | |
727 | 604 |
r = self.client.get_network_details(self.network2['id']) |
728 | 605 |
self.assertEqual(r['name'], updated_name) |
729 | 606 |
|
730 |
""" Don't have auth to test this
|
|
607 |
"" Don't have auth to test this |
|
731 | 608 |
def test_delete_image(self): |
732 | 609 |
""Test delete_image"" |
733 | 610 |
self._test_0330_delete_image() |
Also available in: Unified diff