Daryl Walleck | 73a9e7a | 2011-11-15 17:43:31 -0600 | [diff] [blame] | 1 | from nose.plugins.attrib import attr |
Daryl Walleck | 73a9e7a | 2011-11-15 17:43:31 -0600 | [diff] [blame] | 2 | import unittest2 as unittest |
Daryl Walleck | 73a9e7a | 2011-11-15 17:43:31 -0600 | [diff] [blame] | 3 | |
Brian Waldon | 738cd63 | 2011-12-12 18:45:09 -0500 | [diff] [blame] | 4 | from tempest.common.utils.data_utils import rand_name |
| 5 | import tempest.config |
| 6 | from tempest import openstack |
| 7 | |
| 8 | |
| 9 | def _parse_image_id(image_ref): |
| 10 | temp = image_ref.rsplit('/') |
| 11 | return temp[6] |
Jay Pipes | 7f75763 | 2011-12-02 15:53:32 -0500 | [diff] [blame] | 12 | |
Daryl Walleck | 73a9e7a | 2011-11-15 17:43:31 -0600 | [diff] [blame] | 13 | |
| 14 | class ImagesTest(unittest.TestCase): |
Daryl Walleck | 73a9e7a | 2011-11-15 17:43:31 -0600 | [diff] [blame] | 15 | |
Brian Waldon | 738cd63 | 2011-12-12 18:45:09 -0500 | [diff] [blame] | 16 | create_image_enabled = tempest.config.TempestConfig().\ |
| 17 | env.create_image_enabled |
| 18 | |
Daryl Walleck | 73a9e7a | 2011-11-15 17:43:31 -0600 | [diff] [blame] | 19 | @classmethod |
| 20 | def setUpClass(cls): |
| 21 | cls.os = openstack.Manager() |
| 22 | cls.client = cls.os.images_client |
| 23 | cls.servers_client = cls.os.servers_client |
Jay Pipes | 7f75763 | 2011-12-02 15:53:32 -0500 | [diff] [blame] | 24 | cls.config = cls.os.config |
Daryl Walleck | 73a9e7a | 2011-11-15 17:43:31 -0600 | [diff] [blame] | 25 | cls.image_ref = cls.config.env.image_ref |
| 26 | cls.flavor_ref = cls.config.env.flavor_ref |
Brian Waldon | 738cd63 | 2011-12-12 18:45:09 -0500 | [diff] [blame] | 27 | cls.create_image_enabled = cls.config.env.create_image_enabled |
Daryl Walleck | 73a9e7a | 2011-11-15 17:43:31 -0600 | [diff] [blame] | 28 | |
Daryl Walleck | ed8bef3 | 2011-12-05 23:02:08 -0600 | [diff] [blame] | 29 | @attr(type='smoke') |
Brian Waldon | 738cd63 | 2011-12-12 18:45:09 -0500 | [diff] [blame] | 30 | @unittest.skipUnless(create_image_enabled, |
| 31 | 'Environment unable to create images.') |
Daryl Walleck | 73a9e7a | 2011-11-15 17:43:31 -0600 | [diff] [blame] | 32 | def test_create_delete_image(self): |
| 33 | """An image for the provided server should be created""" |
| 34 | server_name = rand_name('server') |
| 35 | resp, server = self.servers_client.create_server(server_name, |
| 36 | self.image_ref, |
| 37 | self.flavor_ref) |
| 38 | self.servers_client.wait_for_server_status(server['id'], 'ACTIVE') |
| 39 | |
Ravikumar Venkatesan | 94d8117 | 2012-01-09 21:53:14 -0800 | [diff] [blame] | 40 | # Create a new image |
Daryl Walleck | 73a9e7a | 2011-11-15 17:43:31 -0600 | [diff] [blame] | 41 | name = rand_name('image') |
Daryl Walleck | ed8bef3 | 2011-12-05 23:02:08 -0600 | [diff] [blame] | 42 | meta = {'image_type': 'test'} |
| 43 | resp, body = self.client.create_image(server['id'], name, meta) |
Brian Waldon | 738cd63 | 2011-12-12 18:45:09 -0500 | [diff] [blame] | 44 | image_id = _parse_image_id(resp['location']) |
Daryl Walleck | 416af92 | 2011-11-22 22:28:33 -0600 | [diff] [blame] | 45 | self.client.wait_for_image_resp_code(image_id, 200) |
Daryl Walleck | 73a9e7a | 2011-11-15 17:43:31 -0600 | [diff] [blame] | 46 | self.client.wait_for_image_status(image_id, 'ACTIVE') |
| 47 | |
Ravikumar Venkatesan | 94d8117 | 2012-01-09 21:53:14 -0800 | [diff] [blame] | 48 | # Verify the image was created correctly |
Daryl Walleck | 73a9e7a | 2011-11-15 17:43:31 -0600 | [diff] [blame] | 49 | resp, image = self.client.get_image(image_id) |
| 50 | self.assertEqual(name, image['name']) |
Daryl Walleck | ed8bef3 | 2011-12-05 23:02:08 -0600 | [diff] [blame] | 51 | self.assertEqual('test', image['metadata']['image_type']) |
| 52 | |
Ravikumar Venkatesan | 94d8117 | 2012-01-09 21:53:14 -0800 | [diff] [blame] | 53 | # Verify minRAM and minDisk values are the same as the original image |
Daryl Walleck | ed8bef3 | 2011-12-05 23:02:08 -0600 | [diff] [blame] | 54 | resp, original_image = self.client.get_image(self.image_ref) |
| 55 | self.assertEqual(original_image['minRam'], image['minRam']) |
| 56 | self.assertEqual(original_image['minDisk'], image['minDisk']) |
Daryl Walleck | 73a9e7a | 2011-11-15 17:43:31 -0600 | [diff] [blame] | 57 | |
Ravikumar Venkatesan | 94d8117 | 2012-01-09 21:53:14 -0800 | [diff] [blame] | 58 | # Teardown |
Daryl Walleck | 73a9e7a | 2011-11-15 17:43:31 -0600 | [diff] [blame] | 59 | self.client.delete_image(image['id']) |
| 60 | self.servers_client.delete_server(server['id']) |
Ravikumar Venkatesan | 94d8117 | 2012-01-09 21:53:14 -0800 | [diff] [blame] | 61 | |
| 62 | @attr(type='negative') |
| 63 | def test_create_image_from_deleted_server(self): |
Jay Pipes | 04b7081 | 2012-01-11 10:53:24 -0500 | [diff] [blame^] | 64 | """An image should not be created if the server instance is removed """ |
Ravikumar Venkatesan | 94d8117 | 2012-01-09 21:53:14 -0800 | [diff] [blame] | 65 | server_name = rand_name('server') |
| 66 | resp, server = self.servers_client.create_server(server_name, |
| 67 | self.image_ref, |
| 68 | self.flavor_ref) |
| 69 | self.servers_client.wait_for_server_status(server['id'], 'ACTIVE') |
| 70 | |
| 71 | # Delete server before trying to create server |
| 72 | self.servers_client.delete_server(server['id']) |
| 73 | |
| 74 | try: |
| 75 | # Create a new image after server is deleted |
| 76 | name = rand_name('image') |
| 77 | meta = {'image_type': 'test'} |
| 78 | resp, body = self.client.create_image(server['id'], name, meta) |
| 79 | |
| 80 | except: |
| 81 | pass |
| 82 | |
| 83 | else: |
Jay Pipes | 04b7081 | 2012-01-11 10:53:24 -0500 | [diff] [blame^] | 84 | self.fail("Should not create snapshot from deleted instance!") |
| 85 | image_id = _parse_image_id(resp.['location']) |
| 86 | self.client.delete_image(image_id) |