1 # Copyright 2012-2013 GRNET S.A. All rights reserved.
3 # Redistribution and use in source and binary forms, with or
4 # without modification, are permitted provided that the following
7 # 1. Redistributions of source code must retain the above
8 # copyright notice, this list of conditions and the following
11 # 2. Redistributions in binary form must reproduce the above
12 # copyright notice, this list of conditions and the following
13 # disclaimer in the documentation and/or other materials
14 # provided with the distribution.
16 # THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17 # OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20 # CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23 # USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24 # AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26 # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 # POSSIBILITY OF SUCH DAMAGE.
29 # The views and conclusions contained in the software and
30 # documentation are those of the authors and should not be
31 # interpreted as representing official policies, either expressed
32 # or implied, of GRNET S.A.
36 from kamaki.clients import tests, ClientError
37 from kamaki.clients.cyclades import CycladesClient
40 class Cyclades(tests.Generic):
41 """Set up a Cyclades thorough test"""
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')
52 self.now = time.mktime(time.gmtime())
53 self.servname1 = 'serv' + unicode(self.now)
54 self.servname2 = self.servname1 + '_v2'
55 self.servname1 += '_v1'
57 #servers have to be created at the begining...
59 self.netname1 = 'net' + unicode(self.now)
60 self.netname2 = 'net' + unicode(self.now) + '_v2'
62 self.client = CycladesClient(self['compute', 'url'], self['token'])
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']))
73 "Prepare a full Cyclades test scenario"
74 self.server1 = self._create_server(
78 self.server2 = self._create_server(
82 super(self.__class__, self).test_000()
84 def _create_server(self, servername, flavorid, imageid, personality=None):
85 server = self.client.create_server(
90 print('CREATE VM %s (%s)' % (server['id'], server['name']))
91 self.servers[servername] = server
94 def _delete_server(self, servid):
96 current_state = self.client.get_server_details(servid)
97 current_state = current_state['status']
98 if current_state == 'DELETED':
100 self.client.delete_server(servid)
101 self._wait_for_status(servid, current_state)
102 self.client.delete_server(servid)
106 def _create_network(self, netname, **kwargs):
107 net = self.client.create_network(netname, **kwargs)
108 self.networks[net['id']] = net
111 def _delete_network(self, netid):
112 if not netid in self.networks:
114 print('Disconnect nics of network %s' % netid)
115 self.client.disconnect_network_nics(netid)
119 self.client.delete_network(netid)
122 self.do_with_progress_bar(
124 'Delete network %s' % netid,
126 return self.networks.pop(netid)
128 def _wait_for_network(self, netid, status):
131 r = self.client.get_network_details(netid)
132 if r['status'] == status:
135 self.do_with_progress_bar(
137 'Wait network %s to reach status %s' % (netid, status),
140 def _wait_for_nic(self, netid, servid, in_creation=True):
141 self._wait_for_network(netid, 'ACTIVE')
144 nics = self.client.list_server_nics(servid)
146 found_nic = net['network_id'] == netid
147 if (in_creation and found_nic) or not (
148 in_creation or found_nic):
151 self.do_with_progress_bar(
153 'Wait nic-%s-%s to %sconnect' % (
156 '' if in_creation else 'dis'),
158 for net in self.client.list_server_nics(servid):
159 if netid == net['network_id']:
163 def _has_status(self, servid, status):
164 r = self.client.get_server_details(servid)
165 return r['status'] == status
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)
173 def test_parallel_creation(self):
174 """test create with multiple threads
175 Do not use this in regular tests
177 from kamaki.clients import SilentEvent
227 def test_create_server(self):
228 """Test create_server"""
229 self.server1 = self._create_server(
233 self._wait_for_status(self.server1['id'], 'BUILD')
234 self._test_0010_create_server()
236 def _test_0010_create_server(self):
237 self.assertEqual(self.server1["name"], self.servname1)
238 self.assertEqual(self.server1["flavorRef"], self.flavorid)
239 self.assertEqual(self.server1["imageRef"], self.img)
240 self.assertEqual(self.server1["status"], "BUILD")
242 def test_list_servers(self):
243 """Test list servers"""
244 self.server1 = self._create_server(
248 self.server2 = self._create_server(
252 self._test_0020_list_servers()
254 def _test_0020_list_servers(self):
255 servers = self.client.list_servers()
256 dservers = self.client.list_servers(detail=True)
258 """detailed and simple are same size"""
259 self.assertEqual(len(dservers), len(servers))
260 for i in range(len(servers)):
269 self.assertFalse(field in servers[i])
270 self.assertTrue(field in dservers[i])
272 """detailed and simple contain same names"""
273 names = sorted(map(lambda x: x["name"], servers))
274 dnames = sorted(map(lambda x: x["name"], dservers))
275 self.assertEqual(names, dnames)
277 def _test_0030_wait_test_servers_to_build(self):
278 """Pseudo-test to wait for VMs to load"""
280 self._wait_for_status(self.server1['id'], 'BUILD')
281 self._wait_for_status(self.server2['id'], 'BUILD')
283 def test_get_server_details(self):
284 """Test get_server_details"""
285 self.server1 = self._create_server(
289 self._wait_for_status(self.server1['id'], 'BUILD')
290 self._test_0040_get_server_details()
292 def _test_0040_get_server_details(self):
293 r = self.client.get_server_details(self.server1['id'])
294 self.assertEqual(r["name"], self.servname1)
295 self.assertEqual(r["flavorRef"], self.flavorid)
296 self.assertEqual(r["imageRef"], self.img)
297 self.assertEqual(r["status"], "ACTIVE")
299 def test_update_server_name(self):
300 """Test update_server_name"""
301 self.server1 = self._create_server(
305 self._test_0050_update_server_name()
307 def _test_0050_update_server_name(self):
308 new_name = self.servname1 + '_new_name'
309 self.client.update_server_name(self.server1['id'], new_name)
310 r = self.client.get_server_details(
313 self.assertEqual(r['name'], new_name)
314 changed = self.servers.pop(self.servname1)
315 changed['name'] = new_name
316 self.servers[new_name] = changed
318 def test_reboot_server(self):
319 """Test reboot server"""
320 self.server1 = self._create_server(
324 self._wait_for_status(self.server1['id'], 'BUILD')
325 self.server2 = self._create_server(
329 self._wait_for_status(self.server2['id'], 'BUILD')
330 self._test_0060_reboot_server()
331 self._wait_for_status(self.server1['id'], 'REBOOT')
332 self._wait_for_status(self.server2['id'], 'REBOOT')
334 def _test_0060_reboot_server(self):
335 self.client.reboot_server(self.server1['id'])
336 self.assertTrue(self._has_status(self.server1['id'], 'REBOOT'))
337 self.client.reboot_server(self.server2['id'], hard=True)
338 self.assertTrue(self._has_status(self.server2['id'], 'REBOOT'))
340 def _test_0070_wait_test_servers_to_reboot(self):
341 """Pseudo-test to wait for VMs to load"""
343 self._wait_for_status(self.server1['id'], 'REBOOT')
344 self._wait_for_status(self.server2['id'], 'REBOOT')
346 def test_create_server_metadata(self):
347 """Test create_server_metadata"""
348 self.server1 = self._create_server(
352 self._test_0080_create_server_metadata()
354 def _test_0080_create_server_metadata(self):
355 r1 = self.client.create_server_metadata(
359 self.assertTrue('mymeta' in r1)
360 r2 = self.client.get_server_metadata(self.server1['id'], 'mymeta')
361 self.assert_dicts_are_deeply_equal(r1, r2)
363 def test_get_server_metadata(self):
364 """Test get server_metadata"""
365 self.server1 = self._create_server(
369 self._test_0090_get_server_metadata()
371 def _test_0090_get_server_metadata(self):
372 self.client.create_server_metadata(
376 r = self.client.get_server_metadata(self.server1['id'], 'mymeta_0')
377 self.assertEqual(r['mymeta_0'], 'val_0')
379 def test_update_server_metadata(self):
380 """Test update_server_metadata"""
381 self.server1 = self._create_server(
385 self._test_0100_update_server_metadata()
387 def _test_0100_update_server_metadata(self):
388 r1 = self.client.create_server_metadata(
392 self.assertTrue('mymeta3'in r1)
393 r2 = self.client.update_server_metadata(
396 self.assertTrue(r2['mymeta3'], 'val3')
398 def test_delete_server_metadata(self):
399 """Test delete_server_metadata"""
400 self.server1 = self._create_server(
404 self._test_0110_delete_server_metadata()
406 def _test_0110_delete_server_metadata(self):
407 r1 = self.client.create_server_metadata(
411 self.assertTrue('mymeta' in r1)
412 self.client.delete_server_metadata(self.server1['id'], 'mymeta')
414 self.client.get_server_metadata(self.server1['id'], 'mymeta')
415 raise ClientError('Wrong Error', status=100)
416 except ClientError as err:
417 self.assertEqual(err.status, 404)
419 def test_list_flavors(self):
420 """Test flavors_get"""
421 self._test_0120_list_flavors()
423 def _test_0120_list_flavors(self):
424 r = self.client.list_flavors()
425 self.assertTrue(len(r) > 1)
426 r = self.client.list_flavors(detail=True)
427 self.assertTrue('SNF:disk_template' in r[0])
429 def test_get_flavor_details(self):
430 """Test test_get_flavor_details"""
431 self._test_0130_get_flavor_details()
433 def _test_0130_get_flavor_details(self):
434 r = self.client.get_flavor_details(self.flavorid)
435 self.assert_dicts_are_deeply_equal(self._flavor_details, r)
437 def test_list_images(self):
438 """Test list_images"""
439 self._test_0140_list_images()
441 def _test_0140_list_images(self):
442 r = self.client.list_images()
443 self.assertTrue(len(r) > 1)
444 r = self.client.list_images(detail=True)
445 for detailed_img in r:
446 if detailed_img['id'] == self.img:
448 self.assert_dicts_are_deeply_equal(detailed_img, self.img_details)
450 def test_get_image_details(self):
451 """Test image_details"""
452 self._test_0150_get_image_details()
454 def _test_0150_get_image_details(self):
455 r = self.client.get_image_details(self.img)
456 self.assert_dicts_are_deeply_equal(r, self.img_details)
458 def test_get_image_metadata(self):
459 """Test get_image_metadata"""
460 self._test_0160_get_image_metadata()
462 def _test_0160_get_image_metadata(self):
463 r = self.client.get_image_metadata(self.img)
464 self.assert_dicts_are_deeply_equal(
465 self.img_details['metadata']['values'], r)
466 for key, val in self.img_details['metadata']['values'].items():
467 r = self.client.get_image_metadata(self.img, key)
468 self.assertEqual(r[key], val)
470 def test_shutdown_server(self):
471 """Test shutdown_server"""
472 self.server1 = self._create_server(
476 self._wait_for_status(self.server1['id'], 'BUILD')
477 self._test_0170_shutdown_server()
479 def _test_0170_shutdown_server(self):
480 self.client.shutdown_server(self.server1['id'])
481 self._wait_for_status(self.server1['id'], 'ACTIVE')
482 r = self.client.get_server_details(self.server1['id'])
483 self.assertEqual(r['status'], 'STOPPED')
485 def test_start_server(self):
486 """Test start_server"""
487 self.server1 = self._create_server(
491 self._wait_for_status(self.server1['id'], 'BUILD')
492 self.client.shutdown_server(self.server1['id'])
493 self._wait_for_status(self.server1['id'], 'ACTIVE')
494 self._test_0180_start_server()
496 def _test_0180_start_server(self):
497 self.client.start_server(self.server1['id'])
498 self._wait_for_status(self.server1['id'], 'STOPPED')
499 r = self.client.get_server_details(self.server1['id'])
500 self.assertEqual(r['status'], 'ACTIVE')
502 def test_get_server_console(self):
503 """Test get_server_console"""
504 self.server2 = self._create_server(
508 self._wait_for_status(self.server2['id'], 'BUILD')
509 self._test_0190_get_server_console()
511 def _test_0190_get_server_console(self):
512 r = self.client.get_server_console(self.server2['id'])
513 self.assertTrue('host' in r)
514 self.assertTrue('password' in r)
515 self.assertTrue('port' in r)
516 self.assertTrue('type' in r)
518 def test_get_firewall_profile(self):
519 """Test get_firewall_profile"""
520 self.server1 = self._create_server(
524 self._test_0200_get_firewall_profile()
526 def _test_0200_get_firewall_profile(self):
527 self._wait_for_status(self.server1['id'], 'BUILD')
528 fprofile = self.client.get_firewall_profile(self.server1['id'])
529 self.assertTrue(fprofile in self.PROFILES)
531 def test_set_firewall_profile(self):
532 """Test set_firewall_profile"""
533 self.server1 = self._create_server(
537 self._test_0210_set_firewall_profile()
539 def _test_0210_set_firewall_profile(self):
541 self._wait_for_status(self.server1['id'], 'BUILD')
542 PROFILES = ['DISABLED', 'ENABLED', 'DISABLED', 'PROTECTED']
543 fprofile = self.client.get_firewall_profile(self.server1['id'])
546 for counter, fprofile in enumerate(PROFILES):
549 nprofile = PROFILES[npos]
551 nprofile = PROFILES[0]
552 print('\tprofile swap %s: %s -> %s' % (npos, fprofile, nprofile))
553 self.client.set_firewall_profile(self.server1['id'], nprofile)
555 self.client.reboot_server(self.server1['id'], hard=True)
557 self._wait_for_status(self.server1['id'], 'REBOOT')
559 changed = self.client.get_firewall_profile(self.server1['id'])
561 self.assertEqual(changed, nprofile)
562 except AssertionError as err:
564 print('\tFAIL in swap #%s' % npos)
570 def test_get_server_stats(self):
571 self.server1 = self._create_server(
575 self._test_0220_get_server_stats()
577 def _test_0220_get_server_stats(self):
578 r = self.client.get_server_stats(self.server1['id'])
579 it = ('cpuBar', 'cpuTimeSeries', 'netBar', 'netTimeSeries', 'refresh')
581 self.assertTrue(term in r)
583 def test_create_network(self):
584 """Test create_network"""
585 self._test_0230_create_network()
587 def _test_0230_create_network(self):
588 print('\twith no params')
589 self.network1 = self._create_network(self.netname1)
590 self._wait_for_network(self.network1['id'], 'ACTIVE')
591 n1id = self.network1['id']
592 self.network1 = self.client.get_network_details(n1id)
593 nets = self.client.list_networks(self.network1['id'])
594 chosen = [net for net in nets if net['id'] == n1id][0]
595 chosen.pop('updated')
596 net1 = dict(self.network1)
598 self.assert_dicts_are_deeply_equal(chosen, net1)
599 for param, val in dict(
600 cidr='192.168.0.0/24',
601 gateway='192.168.0.1',
604 print('\tdelete %s to avoid max net limit' % n1id)
605 self._delete_network(n1id)
606 kwargs = {param: val}
607 print('\twith %s=%s' % (param, val))
608 self.network1 = self._create_network(self.netname1, **kwargs)
609 n1id = self.network1['id']
610 self._wait_for_network(n1id, 'ACTIVE')
611 self.network1 = self.client.get_network_details(n1id)
612 self.assertEqual(self.network1[param], val)
614 def test_connect_server(self):
615 """Test connect_server"""
616 self.server1 = self._create_server(
620 self.network1 = self._create_network(self.netname1)
621 self._wait_for_status(self.server1['id'], 'BUILD')
622 self._wait_for_network(self.network1['id'], 'ACTIVE')
623 self._test_0240_connect_server()
625 def _test_0250_connect_server(self):
626 self.client.connect_server(self.server1['id'], self.network1['id'])
627 self.assertTrue(self._wait_for_nic(
631 def test_disconnect_server(self):
632 """Test disconnect_server"""
633 self.test_connect_server()
634 self._test_0250_disconnect_server()
636 def _test_0250_disconnect_server(self):
637 self.client.disconnect_server(self.server1['id'], self.network1['id'])
638 self.assertTrue(self._wait_for_nic(
643 def _test_0260_wait_for_second_network(self):
644 self.network2 = self._create_network(self.netname2)
645 self._wait_for_network(self.network2['id'], 'ACTIVE')
647 def test_list_server_nics(self):
648 """Test list_server_nics"""
649 self.server1 = self._create_server(
653 self.network2 = self._create_network(self.netname2)
654 self._wait_for_status(self.server1['id'], 'BUILD')
655 self._wait_for_network(self.network2['id'], 'ACTIVE')
656 self._test_0280_list_server_nics()
658 def _test_0280_list_server_nics(self):
659 r = self.client.list_server_nics(self.server1['id'])
661 self.client.connect_server(self.server1['id'], self.network2['id'])
662 self.assertTrue(self._wait_for_nic(
665 r = self.client.list_server_nics(self.server1['id'])
666 self.assertTrue(len(r) > len0)
668 def test_list_networks(self):
669 """Test list_network"""
670 self.network1 = self._create_network(self.netname1)
671 self._wait_for_network(self.network1['id'], 'ACTIVE')
672 self._test_0290_list_networks()
674 def _test_0290_list_networks(self):
675 r = self.client.list_networks()
676 self.assertTrue(len(r) > 1)
677 ids = [net['id'] for net in r]
678 names = [net['name'] for net in r]
679 self.assertTrue('1' in ids)
680 #self.assertTrue('public' in names)
681 self.assertTrue(self.network1['id'] in ids)
682 self.assertTrue(self.network1['name'] in names)
684 r = self.client.list_networks(detail=True)
685 ids = [net['id'] for net in r]
686 names = [net['name'] for net in r]
688 self.assertTrue(net['id'] in ids)
689 self.assertTrue(net['name'] in names)
690 for term in ('status', 'updated', 'created'):
691 self.assertTrue(term in net.keys())
693 def test_get_network_details(self):
694 """Test get_network_details"""
695 self.network1 = self._create_network(self.netname1)
696 self._test_0300_get_network_details()
698 def _test_0300_get_network_details(self):
699 r = self.client.get_network_details(self.network1['id'])
700 net1 = dict(self.network1)
702 net1.pop('updated', None)
703 net1.pop('attachments')
705 r.pop('updated', None)
707 self.assert_dicts_are_deeply_equal(net1, r)
709 def test_update_network_name(self):
710 self.network2 = self._create_network(self.netname2)
711 self._test_0310_update_network_name()
713 def _test_0310_update_network_name(self):
714 updated_name = self.netname2 + '_upd'
715 self.client.update_network_name(self.network2['id'], updated_name)
718 r = self.client.get_network_details(self.network2['id'])
719 if r['name'] == updated_name:
722 self.do_with_progress_bar(
724 'Network %s name is changing:' % self.network2['id'],
727 r = self.client.get_network_details(self.network2['id'])
728 self.assertEqual(r['name'], updated_name)
730 """ Don't have auth to test this
731 def test_delete_image(self):
732 ""Test delete_image""
733 self._test_0330_delete_image()
734 def _test_0330_delete_image(self):
735 images = self.client.list_images()
736 self.client.delete_image(images[2]['id'])
738 r = self.client.get_image_details(images[2]['id'], success=(400))
739 except ClientError as err:
740 self.assertEqual(err.status, 404)
742 def test_create_image_metadata(self):
743 ""Test create_image_metadata""
744 self._test_0340_create_image_metadata()
745 def _test_0340_create_image_metadata(self):
746 r = self.client.create_image_metadata(self.img, 'mykey', 'myval')
747 self.assertEqual(r['mykey'], 'myval')
749 def test_update_image_metadata(self):
750 ""Test update_image_metadata""
751 self._test_0350_update_image_metadata()
752 def _test_0350_update_image_metadata(self):
753 r = self.client.create_image_metadata(self.img, 'mykey0', 'myval')
754 r = self.client.update_image_metadata(self.img, 'mykey0', 'myval0')
755 self.assertEqual(r['mykey0'], 'myval0')
757 def test_delete_image_metadata(self):
758 ""Test delete_image_metadata""
759 self._test_0360_delete_image_metadata()
760 def _test_0360_delete_image_metadata(self):
761 self.client.create_image_metadata(self.img, 'mykey1', 'myval1')
762 self.client.delete_image_metadata(self.img, 'mykey1')
763 r = self.client.get_image_metadata(self.img)
764 self.assertNotEqual('mykey1' in r)