Steven Hardy | b1f9198 | 2014-04-04 15:35:55 +0100 | [diff] [blame] | 1 | # Licensed under the Apache License, Version 2.0 (the "License"); you may |
| 2 | # not use this file except in compliance with the License. You may obtain |
| 3 | # a copy of the License at |
| 4 | # |
| 5 | # http://www.apache.org/licenses/LICENSE-2.0 |
| 6 | # |
| 7 | # Unless required by applicable law or agreed to in writing, software |
| 8 | # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT |
| 9 | # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the |
| 10 | # License for the specific language governing permissions and limitations |
| 11 | # under the License. |
| 12 | |
Steven Hardy | b1f9198 | 2014-04-04 15:35:55 +0100 | [diff] [blame] | 13 | from tempest.api.orchestration import base |
Fei Long Wang | d39431f | 2015-05-14 11:30:48 +1200 | [diff] [blame] | 14 | from tempest.common.utils import data_utils |
Steven Hardy | b1f9198 | 2014-04-04 15:35:55 +0100 | [diff] [blame] | 15 | from tempest import config |
Ken'ichi Ohmichi | 835a945 | 2017-01-27 18:17:07 -0800 | [diff] [blame] | 16 | from tempest.lib import decorators |
Andrea Frittoli (andreaf) | db9672e | 2016-02-23 14:07:24 -0500 | [diff] [blame] | 17 | from tempest.lib import exceptions as lib_exc |
Steven Hardy | b1f9198 | 2014-04-04 15:35:55 +0100 | [diff] [blame] | 18 | from tempest import test |
| 19 | |
| 20 | |
| 21 | CONF = config.CONF |
Steven Hardy | b1f9198 | 2014-04-04 15:35:55 +0100 | [diff] [blame] | 22 | |
| 23 | |
| 24 | class CinderResourcesTest(base.BaseOrchestrationTest): |
| 25 | |
| 26 | @classmethod |
Rohan Kanade | 80b938a | 2015-02-07 10:58:56 +0530 | [diff] [blame] | 27 | def skip_checks(cls): |
| 28 | super(CinderResourcesTest, cls).skip_checks() |
Steven Hardy | b1f9198 | 2014-04-04 15:35:55 +0100 | [diff] [blame] | 29 | if not CONF.service_available.cinder: |
| 30 | raise cls.skipException('Cinder support is required') |
| 31 | |
Ghanshyam | 961ea1a | 2014-06-09 10:56:00 +0900 | [diff] [blame] | 32 | def _cinder_verify(self, volume_id, template): |
Steven Hardy | 8b9fa02 | 2014-04-04 17:31:50 +0100 | [diff] [blame] | 33 | self.assertIsNotNone(volume_id) |
John Warren | 6177c9e | 2015-08-19 20:00:17 +0000 | [diff] [blame] | 34 | volume = self.volumes_client.show_volume(volume_id)['volume'] |
Steven Hardy | 8b9fa02 | 2014-04-04 17:31:50 +0100 | [diff] [blame] | 35 | self.assertEqual('available', volume.get('status')) |
Mark Vanderwiel | 1c94084 | 2016-03-03 13:57:33 -0600 | [diff] [blame] | 36 | self.assertEqual(CONF.volume.volume_size, volume.get('size')) |
Rabi Mishra | e42bfe4 | 2015-09-29 18:02:13 +0530 | [diff] [blame] | 37 | |
| 38 | # Some volume properties have been renamed with Cinder v2 |
| 39 | if CONF.volume_feature_enabled.api_v2: |
| 40 | description_field = 'description' |
| 41 | name_field = 'name' |
| 42 | else: |
| 43 | description_field = 'display_description' |
| 44 | name_field = 'display_name' |
| 45 | |
Ghanshyam | 961ea1a | 2014-06-09 10:56:00 +0900 | [diff] [blame] | 46 | self.assertEqual(template['resources']['volume']['properties'][ |
Rabi Mishra | e42bfe4 | 2015-09-29 18:02:13 +0530 | [diff] [blame] | 47 | 'description'], volume.get(description_field)) |
Ghanshyam | 961ea1a | 2014-06-09 10:56:00 +0900 | [diff] [blame] | 48 | self.assertEqual(template['resources']['volume']['properties'][ |
Rabi Mishra | e42bfe4 | 2015-09-29 18:02:13 +0530 | [diff] [blame] | 49 | 'name'], volume.get(name_field)) |
Steven Hardy | 8b9fa02 | 2014-04-04 17:31:50 +0100 | [diff] [blame] | 50 | |
Ghanshyam | 961ea1a | 2014-06-09 10:56:00 +0900 | [diff] [blame] | 51 | def _outputs_verify(self, stack_identifier, template): |
Steven Hardy | 8b9fa02 | 2014-04-04 17:31:50 +0100 | [diff] [blame] | 52 | self.assertEqual('available', |
| 53 | self.get_stack_output(stack_identifier, 'status')) |
Mark Vanderwiel | 1c94084 | 2016-03-03 13:57:33 -0600 | [diff] [blame] | 54 | self.assertEqual(str(CONF.volume.volume_size), |
| 55 | self.get_stack_output(stack_identifier, 'size')) |
Ghanshyam | 961ea1a | 2014-06-09 10:56:00 +0900 | [diff] [blame] | 56 | self.assertEqual(template['resources']['volume']['properties'][ |
| 57 | 'description'], self.get_stack_output(stack_identifier, |
| 58 | 'display_description')) |
| 59 | self.assertEqual(template['resources']['volume']['properties'][ |
| 60 | 'name'], self.get_stack_output(stack_identifier, 'display_name')) |
Steven Hardy | 8b9fa02 | 2014-04-04 17:31:50 +0100 | [diff] [blame] | 61 | |
Ken'ichi Ohmichi | 835a945 | 2017-01-27 18:17:07 -0800 | [diff] [blame] | 62 | @decorators.idempotent_id('c3243329-7bdd-4730-b402-4d19d50c41d8') |
ekhugen | 16d5dd9 | 2014-07-29 18:54:36 +0000 | [diff] [blame] | 63 | @test.services('volume') |
Steven Hardy | b1f9198 | 2014-04-04 15:35:55 +0100 | [diff] [blame] | 64 | def test_cinder_volume_create_delete(self): |
| 65 | """Create and delete a volume via OS::Cinder::Volume.""" |
| 66 | stack_name = data_utils.rand_name('heat') |
Ghanshyam | 961ea1a | 2014-06-09 10:56:00 +0900 | [diff] [blame] | 67 | template = self.read_template('cinder_basic') |
Mark Vanderwiel | 1c94084 | 2016-03-03 13:57:33 -0600 | [diff] [blame] | 68 | stack_identifier = self.create_stack( |
| 69 | stack_name, |
| 70 | template, |
| 71 | parameters={ |
| 72 | 'volume_size': CONF.volume.volume_size |
| 73 | }) |
Steven Hardy | b1f9198 | 2014-04-04 15:35:55 +0100 | [diff] [blame] | 74 | self.client.wait_for_stack_status(stack_identifier, 'CREATE_COMPLETE') |
| 75 | |
| 76 | # Verify with cinder that the volume exists, with matching details |
| 77 | volume_id = self.get_stack_output(stack_identifier, 'volume_id') |
Ghanshyam | 961ea1a | 2014-06-09 10:56:00 +0900 | [diff] [blame] | 78 | cinder_basic_template = self.load_template('cinder_basic') |
| 79 | self._cinder_verify(volume_id, cinder_basic_template) |
Steven Hardy | b1f9198 | 2014-04-04 15:35:55 +0100 | [diff] [blame] | 80 | |
| 81 | # Verify the stack outputs are as expected |
Ghanshyam | 961ea1a | 2014-06-09 10:56:00 +0900 | [diff] [blame] | 82 | self._outputs_verify(stack_identifier, cinder_basic_template) |
Steven Hardy | 8b9fa02 | 2014-04-04 17:31:50 +0100 | [diff] [blame] | 83 | |
| 84 | # Delete the stack and ensure the volume is gone |
| 85 | self.client.delete_stack(stack_identifier) |
| 86 | self.client.wait_for_stack_status(stack_identifier, 'DELETE_COMPLETE') |
Masayuki Igawa | bfa0760 | 2015-01-20 18:47:17 +0900 | [diff] [blame] | 87 | self.assertRaises(lib_exc.NotFound, |
Ken'ichi Ohmichi | 35798fb | 2015-04-06 01:22:41 +0000 | [diff] [blame] | 88 | self.volumes_client.show_volume, |
Steven Hardy | 8b9fa02 | 2014-04-04 17:31:50 +0100 | [diff] [blame] | 89 | volume_id) |
| 90 | |
| 91 | def _cleanup_volume(self, volume_id): |
| 92 | """Cleanup the volume direct with cinder.""" |
Swapnil Kulkarni | d9df38c | 2014-08-16 18:06:52 +0000 | [diff] [blame] | 93 | self.volumes_client.delete_volume(volume_id) |
Steven Hardy | 8b9fa02 | 2014-04-04 17:31:50 +0100 | [diff] [blame] | 94 | self.volumes_client.wait_for_resource_deletion(volume_id) |
| 95 | |
Ken'ichi Ohmichi | 835a945 | 2017-01-27 18:17:07 -0800 | [diff] [blame] | 96 | @decorators.idempotent_id('ea8b3a46-b932-4c18-907a-fe23f00b33f8') |
ekhugen | 16d5dd9 | 2014-07-29 18:54:36 +0000 | [diff] [blame] | 97 | @test.services('volume') |
Steven Hardy | 8b9fa02 | 2014-04-04 17:31:50 +0100 | [diff] [blame] | 98 | def test_cinder_volume_create_delete_retain(self): |
| 99 | """Ensure the 'Retain' deletion policy is respected.""" |
| 100 | stack_name = data_utils.rand_name('heat') |
Ghanshyam | 961ea1a | 2014-06-09 10:56:00 +0900 | [diff] [blame] | 101 | template = self.read_template('cinder_basic_delete_retain') |
Mark Vanderwiel | 1c94084 | 2016-03-03 13:57:33 -0600 | [diff] [blame] | 102 | stack_identifier = self.create_stack( |
| 103 | stack_name, |
| 104 | template, |
| 105 | parameters={ |
| 106 | 'volume_size': CONF.volume.volume_size |
| 107 | }) |
Steven Hardy | 8b9fa02 | 2014-04-04 17:31:50 +0100 | [diff] [blame] | 108 | self.client.wait_for_stack_status(stack_identifier, 'CREATE_COMPLETE') |
| 109 | |
| 110 | # Verify with cinder that the volume exists, with matching details |
| 111 | volume_id = self.get_stack_output(stack_identifier, 'volume_id') |
| 112 | self.addCleanup(self._cleanup_volume, volume_id) |
Ghanshyam | 961ea1a | 2014-06-09 10:56:00 +0900 | [diff] [blame] | 113 | retain_template = self.load_template('cinder_basic_delete_retain') |
| 114 | self._cinder_verify(volume_id, retain_template) |
Steven Hardy | 8b9fa02 | 2014-04-04 17:31:50 +0100 | [diff] [blame] | 115 | |
| 116 | # Verify the stack outputs are as expected |
Ghanshyam | 961ea1a | 2014-06-09 10:56:00 +0900 | [diff] [blame] | 117 | self._outputs_verify(stack_identifier, retain_template) |
Steven Hardy | 8b9fa02 | 2014-04-04 17:31:50 +0100 | [diff] [blame] | 118 | |
| 119 | # Delete the stack and ensure the volume is *not* gone |
| 120 | self.client.delete_stack(stack_identifier) |
| 121 | self.client.wait_for_stack_status(stack_identifier, 'DELETE_COMPLETE') |
Ghanshyam | 961ea1a | 2014-06-09 10:56:00 +0900 | [diff] [blame] | 122 | self._cinder_verify(volume_id, retain_template) |
Steven Hardy | 8b9fa02 | 2014-04-04 17:31:50 +0100 | [diff] [blame] | 123 | |
| 124 | # Volume cleanup happens via addCleanup calling _cleanup_volume |