Xing Yang | 0ddf83e | 2015-11-17 22:15:25 -0500 | [diff] [blame] | 1 | # Copyright (C) 2017 Dell Inc. or its subsidiaries. |
| 2 | # All Rights Reserved. |
| 3 | # |
| 4 | # Licensed under the Apache License, Version 2.0 (the "License"); you may |
| 5 | # not use this file except in compliance with the License. You may obtain |
| 6 | # a copy of the License at |
| 7 | # |
| 8 | # http://www.apache.org/licenses/LICENSE-2.0 |
| 9 | # |
| 10 | # Unless required by applicable law or agreed to in writing, software |
| 11 | # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT |
| 12 | # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the |
| 13 | # License for the specific language governing permissions and limitations |
| 14 | # under the License. |
| 15 | |
| 16 | from tempest.api.volume import base |
| 17 | from tempest.common import waiters |
| 18 | from tempest import config |
| 19 | from tempest.lib.common.utils import data_utils |
| 20 | from tempest.lib import decorators |
| 21 | |
| 22 | CONF = config.CONF |
| 23 | |
| 24 | |
jeremy.zhang | 2abe00a | 2017-11-21 10:14:09 +0800 | [diff] [blame] | 25 | class GroupsTest(base.BaseVolumeAdminTest): |
zhufl | fcfb31b | 2020-04-20 15:41:07 +0800 | [diff] [blame] | 26 | """Tests of volume groups with microversion greater than 3.12""" |
| 27 | |
Sophie Huang | d458bf3 | 2021-10-12 17:08:41 +0000 | [diff] [blame] | 28 | volume_min_microversion = '3.13' |
| 29 | volume_max_microversion = 'latest' |
jeremy.zhang | cca9974 | 2017-08-20 01:08:24 +0800 | [diff] [blame] | 30 | |
Xing Yang | 0ddf83e | 2015-11-17 22:15:25 -0500 | [diff] [blame] | 31 | @decorators.idempotent_id('4b111d28-b73d-4908-9bd2-03dc2992e4d4') |
| 32 | def test_group_create_show_list_delete(self): |
zhufl | fcfb31b | 2020-04-20 15:41:07 +0800 | [diff] [blame] | 33 | """Test creating, showing, listing and deleting of volume group""" |
Xing Yang | 0ddf83e | 2015-11-17 22:15:25 -0500 | [diff] [blame] | 34 | # Create volume type |
| 35 | volume_type = self.create_volume_type() |
| 36 | |
| 37 | # Create group type |
| 38 | group_type = self.create_group_type() |
| 39 | |
| 40 | # Create group |
Martin Kopec | 213d0a4 | 2023-11-30 10:28:14 +0100 | [diff] [blame] | 41 | grp1_name = data_utils.rand_name( |
| 42 | prefix=CONF.resource_name_prefix, name='Group1') |
jeremy.zhang | 2abe00a | 2017-11-21 10:14:09 +0800 | [diff] [blame] | 43 | grp1 = self.create_group(group_type=group_type['id'], |
| 44 | volume_types=[volume_type['id']], |
| 45 | name=grp1_name) |
Xing Yang | 0ddf83e | 2015-11-17 22:15:25 -0500 | [diff] [blame] | 46 | grp1_id = grp1['id'] |
| 47 | |
Martin Kopec | 213d0a4 | 2023-11-30 10:28:14 +0100 | [diff] [blame] | 48 | grp2_name = data_utils.rand_name( |
| 49 | prefix=CONF.resource_name_prefix, name='Group2') |
jeremy.zhang | 2abe00a | 2017-11-21 10:14:09 +0800 | [diff] [blame] | 50 | grp2 = self.create_group(group_type=group_type['id'], |
| 51 | volume_types=[volume_type['id']], |
| 52 | name=grp2_name) |
Xing Yang | 0ddf83e | 2015-11-17 22:15:25 -0500 | [diff] [blame] | 53 | grp2_id = grp2['id'] |
| 54 | |
| 55 | # Create volume |
Martin Kopec | 213d0a4 | 2023-11-30 10:28:14 +0100 | [diff] [blame] | 56 | vol1_name = data_utils.rand_name( |
| 57 | prefix=CONF.resource_name_prefix, name="volume") |
Xing Yang | 0ddf83e | 2015-11-17 22:15:25 -0500 | [diff] [blame] | 58 | params = {'name': vol1_name, |
| 59 | 'volume_type': volume_type['id'], |
| 60 | 'group_id': grp1['id'], |
| 61 | 'size': CONF.volume.volume_size} |
xing-yang | d56edc3 | 2017-07-01 14:00:06 -0700 | [diff] [blame] | 62 | vol1 = self.volumes_client.create_volume(**params)['volume'] |
Xing Yang | 0ddf83e | 2015-11-17 22:15:25 -0500 | [diff] [blame] | 63 | self.assertEqual(grp1['id'], vol1['group_id']) |
| 64 | waiters.wait_for_volume_resource_status( |
xing-yang | d56edc3 | 2017-07-01 14:00:06 -0700 | [diff] [blame] | 65 | self.volumes_client, vol1['id'], 'available') |
Xing Yang | 0ddf83e | 2015-11-17 22:15:25 -0500 | [diff] [blame] | 66 | vol1_id = vol1['id'] |
| 67 | |
| 68 | # Get a given group |
xing-yang | d56edc3 | 2017-07-01 14:00:06 -0700 | [diff] [blame] | 69 | grp1 = self.groups_client.show_group(grp1['id'])['group'] |
Xing Yang | 0ddf83e | 2015-11-17 22:15:25 -0500 | [diff] [blame] | 70 | self.assertEqual(grp1_name, grp1['name']) |
| 71 | self.assertEqual(grp1_id, grp1['id']) |
| 72 | |
xing-yang | d56edc3 | 2017-07-01 14:00:06 -0700 | [diff] [blame] | 73 | grp2 = self.groups_client.show_group(grp2['id'])['group'] |
Xing Yang | 0ddf83e | 2015-11-17 22:15:25 -0500 | [diff] [blame] | 74 | self.assertEqual(grp2_name, grp2['name']) |
| 75 | self.assertEqual(grp2_id, grp2['id']) |
| 76 | |
| 77 | # Get all groups with detail |
jeremy.zhang | 1bac618 | 2017-09-26 22:08:15 +0800 | [diff] [blame] | 78 | grps = self.groups_client.list_groups(detail=True)['groups'] |
| 79 | for grp_id in [grp1_id, grp2_id]: |
| 80 | filtered_grps = [g for g in grps if g['id'] == grp_id] |
| 81 | self.assertEqual(1, len(filtered_grps)) |
| 82 | self.assertEqual([volume_type['id']], |
| 83 | filtered_grps[0]['volume_types']) |
| 84 | self.assertEqual(group_type['id'], |
| 85 | filtered_grps[0]['group_type']) |
Xing Yang | 0ddf83e | 2015-11-17 22:15:25 -0500 | [diff] [blame] | 86 | |
jeremy.zhang | 1bac618 | 2017-09-26 22:08:15 +0800 | [diff] [blame] | 87 | vols = self.volumes_client.list_volumes(detail=True)['volumes'] |
Xing Yang | 0ddf83e | 2015-11-17 22:15:25 -0500 | [diff] [blame] | 88 | filtered_vols = [v for v in vols if v['id'] in [vol1_id]] |
| 89 | self.assertEqual(1, len(filtered_vols)) |
| 90 | for vol in filtered_vols: |
| 91 | self.assertEqual(grp1_id, vol['group_id']) |
| 92 | |
| 93 | # Delete group |
| 94 | # grp1 has a volume so delete_volumes flag is set to True by default |
jeremy.zhang | 2abe00a | 2017-11-21 10:14:09 +0800 | [diff] [blame] | 95 | self.delete_group(grp1_id) |
Xing Yang | 0ddf83e | 2015-11-17 22:15:25 -0500 | [diff] [blame] | 96 | # grp2 is empty so delete_volumes flag can be set to False |
jeremy.zhang | 2abe00a | 2017-11-21 10:14:09 +0800 | [diff] [blame] | 97 | self.delete_group(grp2_id, delete_volumes=False) |
zhufl | 6c9ca4e | 2017-09-25 15:59:02 +0800 | [diff] [blame] | 98 | grps = self.groups_client.list_groups(detail=True)['groups'] |
Xing Yang | 0ddf83e | 2015-11-17 22:15:25 -0500 | [diff] [blame] | 99 | self.assertEmpty(grps) |
xing-yang | 41ed715 | 2017-05-03 06:52:56 -0400 | [diff] [blame] | 100 | |
xing-yang | 9ee9860 | 2017-07-01 14:12:54 -0700 | [diff] [blame] | 101 | @decorators.idempotent_id('4a8a6fd2-8b3b-4641-8f54-6a6f99320006') |
| 102 | def test_group_update(self): |
zhufl | fcfb31b | 2020-04-20 15:41:07 +0800 | [diff] [blame] | 103 | """Test updating volume group""" |
xing-yang | 9ee9860 | 2017-07-01 14:12:54 -0700 | [diff] [blame] | 104 | # Create volume type |
| 105 | volume_type = self.create_volume_type() |
| 106 | |
| 107 | # Create group type |
| 108 | group_type = self.create_group_type() |
| 109 | |
| 110 | # Create Group |
jeremy.zhang | 2abe00a | 2017-11-21 10:14:09 +0800 | [diff] [blame] | 111 | grp = self.create_group(group_type=group_type['id'], |
| 112 | volume_types=[volume_type['id']]) |
xing-yang | 9ee9860 | 2017-07-01 14:12:54 -0700 | [diff] [blame] | 113 | |
Martin Kopec | 213d0a4 | 2023-11-30 10:28:14 +0100 | [diff] [blame] | 114 | prefix = CONF.resource_name_prefix |
Benny Kopilov | 951b806 | 2022-05-04 08:50:03 +0300 | [diff] [blame] | 115 | # Create volume is instance level, can not be deleted before group. |
| 116 | # Volume delete handled by delete_group method, cleanup method. |
xing-yang | 5805d32 | 2017-08-11 04:31:27 -0700 | [diff] [blame] | 117 | grp_vols = [] |
| 118 | for _ in range(2): |
Martin Kopec | 213d0a4 | 2023-11-30 10:28:14 +0100 | [diff] [blame] | 119 | params = {'name': data_utils.rand_name(prefix=prefix, |
| 120 | name="volume"), |
Benny Kopilov | 951b806 | 2022-05-04 08:50:03 +0300 | [diff] [blame] | 121 | 'volume_type': volume_type['id'], |
| 122 | 'group_id': grp['id'], |
| 123 | 'size': CONF.volume.volume_size} |
| 124 | vol = self.volumes_client.create_volume(**params)['volume'] |
| 125 | waiters.wait_for_volume_resource_status( |
| 126 | self.volumes_client, vol['id'], 'available') |
xing-yang | 5805d32 | 2017-08-11 04:31:27 -0700 | [diff] [blame] | 127 | grp_vols.append(vol) |
| 128 | vol2 = grp_vols[1] |
xing-yang | 9ee9860 | 2017-07-01 14:12:54 -0700 | [diff] [blame] | 129 | |
| 130 | # Remove a volume from group and update name and description |
| 131 | new_grp_name = 'new_group' |
| 132 | new_desc = 'This is a new group' |
| 133 | grp_params = {'name': new_grp_name, |
| 134 | 'description': new_desc, |
xing-yang | 5805d32 | 2017-08-11 04:31:27 -0700 | [diff] [blame] | 135 | 'remove_volumes': vol2['id']} |
xing-yang | 9ee9860 | 2017-07-01 14:12:54 -0700 | [diff] [blame] | 136 | self.groups_client.update_group(grp['id'], **grp_params) |
| 137 | |
| 138 | # Wait for group status to become available |
| 139 | waiters.wait_for_volume_resource_status( |
| 140 | self.groups_client, grp['id'], 'available') |
| 141 | |
| 142 | # Get the updated Group |
| 143 | grp = self.groups_client.show_group(grp['id'])['group'] |
| 144 | self.assertEqual(new_grp_name, grp['name']) |
| 145 | self.assertEqual(new_desc, grp['description']) |
| 146 | |
| 147 | # Get volumes in the group |
jeremy.zhang | 1bac618 | 2017-09-26 22:08:15 +0800 | [diff] [blame] | 148 | vols = self.volumes_client.list_volumes(detail=True)['volumes'] |
zhufl | 6c9ca4e | 2017-09-25 15:59:02 +0800 | [diff] [blame] | 149 | grp_vols = [v for v in vols if v['group_id'] == grp['id']] |
xing-yang | 9ee9860 | 2017-07-01 14:12:54 -0700 | [diff] [blame] | 150 | self.assertEqual(1, len(grp_vols)) |
xing-yang | 5805d32 | 2017-08-11 04:31:27 -0700 | [diff] [blame] | 151 | |
| 152 | # Add a volume to the group |
| 153 | grp_params = {'add_volumes': vol2['id']} |
| 154 | self.groups_client.update_group(grp['id'], **grp_params) |
| 155 | |
| 156 | # Wait for group status to become available |
| 157 | waiters.wait_for_volume_resource_status( |
| 158 | self.groups_client, grp['id'], 'available') |
| 159 | |
| 160 | # Get volumes in the group |
zhufl | 6c9ca4e | 2017-09-25 15:59:02 +0800 | [diff] [blame] | 161 | vols = self.volumes_client.list_volumes(detail=True)['volumes'] |
| 162 | grp_vols = [v for v in vols if v['group_id'] == grp['id']] |
xing-yang | 5805d32 | 2017-08-11 04:31:27 -0700 | [diff] [blame] | 163 | self.assertEqual(2, len(grp_vols)) |
jeremy.zhang | cca9974 | 2017-08-20 01:08:24 +0800 | [diff] [blame] | 164 | |
| 165 | |
jeremy.zhang | 2abe00a | 2017-11-21 10:14:09 +0800 | [diff] [blame] | 166 | class GroupsV314Test(base.BaseVolumeAdminTest): |
zhufl | fcfb31b | 2020-04-20 15:41:07 +0800 | [diff] [blame] | 167 | """Tests of volume groups with microversion greater than 3.13""" |
| 168 | |
Sophie Huang | d458bf3 | 2021-10-12 17:08:41 +0000 | [diff] [blame] | 169 | volume_min_microversion = '3.14' |
| 170 | volume_max_microversion = 'latest' |
jeremy.zhang | 23df2c0 | 2017-09-26 22:33:17 +0800 | [diff] [blame] | 171 | |
jeremy.zhang | 2abe00a | 2017-11-21 10:14:09 +0800 | [diff] [blame] | 172 | @decorators.idempotent_id('2424af8c-7851-4888-986a-794b10c3210e') |
| 173 | def test_create_group_from_group(self): |
zhufl | fcfb31b | 2020-04-20 15:41:07 +0800 | [diff] [blame] | 174 | """Test creating volume group from volume group""" |
jeremy.zhang | 23df2c0 | 2017-09-26 22:33:17 +0800 | [diff] [blame] | 175 | # Create volume type |
| 176 | volume_type = self.create_volume_type() |
| 177 | |
| 178 | # Create group type |
| 179 | group_type = self.create_group_type() |
| 180 | |
jeremy.zhang | 2abe00a | 2017-11-21 10:14:09 +0800 | [diff] [blame] | 181 | # Create Group |
| 182 | grp = self.create_group(group_type=group_type['id'], |
| 183 | volume_types=[volume_type['id']]) |
jeremy.zhang | 23df2c0 | 2017-09-26 22:33:17 +0800 | [diff] [blame] | 184 | |
Martin Kopec | 213d0a4 | 2023-11-30 10:28:14 +0100 | [diff] [blame] | 185 | prefix = CONF.resource_name_prefix |
Benny Kopilov | 951b806 | 2022-05-04 08:50:03 +0300 | [diff] [blame] | 186 | # Create volume is instance level, can not be deleted before group. |
| 187 | # Volume delete handled by delete_group method, cleanup method. |
Martin Kopec | 213d0a4 | 2023-11-30 10:28:14 +0100 | [diff] [blame] | 188 | params = {'name': data_utils.rand_name(prefix=prefix, name="volume"), |
Benny Kopilov | 951b806 | 2022-05-04 08:50:03 +0300 | [diff] [blame] | 189 | 'volume_type': volume_type['id'], |
| 190 | 'group_id': grp['id'], |
| 191 | 'size': CONF.volume.volume_size} |
| 192 | vol = self.volumes_client.create_volume(**params)['volume'] |
| 193 | waiters.wait_for_volume_resource_status( |
| 194 | self.volumes_client, vol['id'], 'available') |
jeremy.zhang | 23df2c0 | 2017-09-26 22:33:17 +0800 | [diff] [blame] | 195 | |
jeremy.zhang | 2abe00a | 2017-11-21 10:14:09 +0800 | [diff] [blame] | 196 | # Create Group from Group |
Martin Kopec | 213d0a4 | 2023-11-30 10:28:14 +0100 | [diff] [blame] | 197 | grp_name2 = data_utils.rand_name(prefix=prefix, name='Group_from_grp') |
jeremy.zhang | 2abe00a | 2017-11-21 10:14:09 +0800 | [diff] [blame] | 198 | grp2 = self.groups_client.create_group_from_source( |
| 199 | source_group_id=grp['id'], name=grp_name2)['group'] |
| 200 | self.addCleanup(self.delete_group, grp2['id']) |
| 201 | self.assertEqual(grp_name2, grp2['name']) |
| 202 | vols = self.volumes_client.list_volumes(detail=True)['volumes'] |
| 203 | for vol in vols: |
| 204 | if vol['group_id'] == grp2['id']: |
jeremy.zhang | 23df2c0 | 2017-09-26 22:33:17 +0800 | [diff] [blame] | 205 | waiters.wait_for_volume_resource_status( |
jeremy.zhang | 2abe00a | 2017-11-21 10:14:09 +0800 | [diff] [blame] | 206 | self.volumes_client, vol['id'], 'available') |
jeremy.zhang | 23df2c0 | 2017-09-26 22:33:17 +0800 | [diff] [blame] | 207 | waiters.wait_for_volume_resource_status( |
jeremy.zhang | 2abe00a | 2017-11-21 10:14:09 +0800 | [diff] [blame] | 208 | self.groups_client, grp2['id'], 'available') |
jeremy.zhang | 23df2c0 | 2017-09-26 22:33:17 +0800 | [diff] [blame] | 209 | |
| 210 | |
jeremy.zhang | 2abe00a | 2017-11-21 10:14:09 +0800 | [diff] [blame] | 211 | class GroupsV320Test(base.BaseVolumeAdminTest): |
zhufl | fcfb31b | 2020-04-20 15:41:07 +0800 | [diff] [blame] | 212 | """Tests of volume groups with microversion greater than 3.19""" |
| 213 | |
Sophie Huang | d458bf3 | 2021-10-12 17:08:41 +0000 | [diff] [blame] | 214 | volume_min_microversion = '3.20' |
| 215 | volume_max_microversion = 'latest' |
jeremy.zhang | cca9974 | 2017-08-20 01:08:24 +0800 | [diff] [blame] | 216 | |
| 217 | @decorators.idempotent_id('b20c696b-0cbc-49a5-8b3a-b1fb9338f45c') |
| 218 | def test_reset_group_status(self): |
zhufl | fcfb31b | 2020-04-20 15:41:07 +0800 | [diff] [blame] | 219 | """Test resetting volume group status to creating/available/error""" |
jeremy.zhang | cca9974 | 2017-08-20 01:08:24 +0800 | [diff] [blame] | 220 | # Create volume type |
| 221 | volume_type = self.create_volume_type() |
| 222 | |
| 223 | # Create group type |
| 224 | group_type = self.create_group_type() |
| 225 | |
| 226 | # Create group |
jeremy.zhang | 2abe00a | 2017-11-21 10:14:09 +0800 | [diff] [blame] | 227 | group = self.create_group(group_type=group_type['id'], |
| 228 | volume_types=[volume_type['id']]) |
jeremy.zhang | cca9974 | 2017-08-20 01:08:24 +0800 | [diff] [blame] | 229 | |
| 230 | # Reset group status |
| 231 | self.addCleanup(waiters.wait_for_volume_resource_status, |
| 232 | self.groups_client, group['id'], 'available') |
| 233 | self.addCleanup(self.admin_groups_client.reset_group_status, |
| 234 | group['id'], 'available') |
| 235 | for status in ['creating', 'available', 'error']: |
| 236 | self.admin_groups_client.reset_group_status(group['id'], status) |
| 237 | waiters.wait_for_volume_resource_status( |
| 238 | self.groups_client, group['id'], status) |