blob: 8f74769d5e4b2369bcac65c67ba091136d8dffa6 [file] [log] [blame]
Xing Yang0ddf83e2015-11-17 22:15:25 -05001# 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
16from tempest.api.volume import base
17from tempest.common import waiters
18from tempest import config
19from tempest.lib.common.utils import data_utils
20from tempest.lib import decorators
21
22CONF = config.CONF
23
24
jeremy.zhang2abe00a2017-11-21 10:14:09 +080025class GroupsTest(base.BaseVolumeAdminTest):
zhuflfcfb31b2020-04-20 15:41:07 +080026 """Tests of volume groups with microversion greater than 3.12"""
27
Sophie Huangd458bf32021-10-12 17:08:41 +000028 volume_min_microversion = '3.13'
29 volume_max_microversion = 'latest'
jeremy.zhangcca99742017-08-20 01:08:24 +080030
Xing Yang0ddf83e2015-11-17 22:15:25 -050031 @decorators.idempotent_id('4b111d28-b73d-4908-9bd2-03dc2992e4d4')
32 def test_group_create_show_list_delete(self):
zhuflfcfb31b2020-04-20 15:41:07 +080033 """Test creating, showing, listing and deleting of volume group"""
Xing Yang0ddf83e2015-11-17 22:15:25 -050034 # 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 Kopec213d0a42023-11-30 10:28:14 +010041 grp1_name = data_utils.rand_name(
42 prefix=CONF.resource_name_prefix, name='Group1')
jeremy.zhang2abe00a2017-11-21 10:14:09 +080043 grp1 = self.create_group(group_type=group_type['id'],
44 volume_types=[volume_type['id']],
45 name=grp1_name)
Xing Yang0ddf83e2015-11-17 22:15:25 -050046 grp1_id = grp1['id']
47
Martin Kopec213d0a42023-11-30 10:28:14 +010048 grp2_name = data_utils.rand_name(
49 prefix=CONF.resource_name_prefix, name='Group2')
jeremy.zhang2abe00a2017-11-21 10:14:09 +080050 grp2 = self.create_group(group_type=group_type['id'],
51 volume_types=[volume_type['id']],
52 name=grp2_name)
Xing Yang0ddf83e2015-11-17 22:15:25 -050053 grp2_id = grp2['id']
54
55 # Create volume
Martin Kopec213d0a42023-11-30 10:28:14 +010056 vol1_name = data_utils.rand_name(
57 prefix=CONF.resource_name_prefix, name="volume")
Xing Yang0ddf83e2015-11-17 22:15:25 -050058 params = {'name': vol1_name,
59 'volume_type': volume_type['id'],
60 'group_id': grp1['id'],
61 'size': CONF.volume.volume_size}
xing-yangd56edc32017-07-01 14:00:06 -070062 vol1 = self.volumes_client.create_volume(**params)['volume']
Xing Yang0ddf83e2015-11-17 22:15:25 -050063 self.assertEqual(grp1['id'], vol1['group_id'])
64 waiters.wait_for_volume_resource_status(
xing-yangd56edc32017-07-01 14:00:06 -070065 self.volumes_client, vol1['id'], 'available')
Xing Yang0ddf83e2015-11-17 22:15:25 -050066 vol1_id = vol1['id']
67
68 # Get a given group
xing-yangd56edc32017-07-01 14:00:06 -070069 grp1 = self.groups_client.show_group(grp1['id'])['group']
Xing Yang0ddf83e2015-11-17 22:15:25 -050070 self.assertEqual(grp1_name, grp1['name'])
71 self.assertEqual(grp1_id, grp1['id'])
72
xing-yangd56edc32017-07-01 14:00:06 -070073 grp2 = self.groups_client.show_group(grp2['id'])['group']
Xing Yang0ddf83e2015-11-17 22:15:25 -050074 self.assertEqual(grp2_name, grp2['name'])
75 self.assertEqual(grp2_id, grp2['id'])
76
77 # Get all groups with detail
jeremy.zhang1bac6182017-09-26 22:08:15 +080078 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 Yang0ddf83e2015-11-17 22:15:25 -050086
jeremy.zhang1bac6182017-09-26 22:08:15 +080087 vols = self.volumes_client.list_volumes(detail=True)['volumes']
Xing Yang0ddf83e2015-11-17 22:15:25 -050088 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.zhang2abe00a2017-11-21 10:14:09 +080095 self.delete_group(grp1_id)
Xing Yang0ddf83e2015-11-17 22:15:25 -050096 # grp2 is empty so delete_volumes flag can be set to False
jeremy.zhang2abe00a2017-11-21 10:14:09 +080097 self.delete_group(grp2_id, delete_volumes=False)
zhufl6c9ca4e2017-09-25 15:59:02 +080098 grps = self.groups_client.list_groups(detail=True)['groups']
Xing Yang0ddf83e2015-11-17 22:15:25 -050099 self.assertEmpty(grps)
xing-yang41ed7152017-05-03 06:52:56 -0400100
xing-yang9ee98602017-07-01 14:12:54 -0700101 @decorators.idempotent_id('4a8a6fd2-8b3b-4641-8f54-6a6f99320006')
102 def test_group_update(self):
zhuflfcfb31b2020-04-20 15:41:07 +0800103 """Test updating volume group"""
xing-yang9ee98602017-07-01 14:12:54 -0700104 # 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.zhang2abe00a2017-11-21 10:14:09 +0800111 grp = self.create_group(group_type=group_type['id'],
112 volume_types=[volume_type['id']])
xing-yang9ee98602017-07-01 14:12:54 -0700113
Martin Kopec213d0a42023-11-30 10:28:14 +0100114 prefix = CONF.resource_name_prefix
Benny Kopilov951b8062022-05-04 08:50:03 +0300115 # Create volume is instance level, can not be deleted before group.
116 # Volume delete handled by delete_group method, cleanup method.
xing-yang5805d322017-08-11 04:31:27 -0700117 grp_vols = []
118 for _ in range(2):
Martin Kopec213d0a42023-11-30 10:28:14 +0100119 params = {'name': data_utils.rand_name(prefix=prefix,
120 name="volume"),
Benny Kopilov951b8062022-05-04 08:50:03 +0300121 '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-yang5805d322017-08-11 04:31:27 -0700127 grp_vols.append(vol)
128 vol2 = grp_vols[1]
xing-yang9ee98602017-07-01 14:12:54 -0700129
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-yang5805d322017-08-11 04:31:27 -0700135 'remove_volumes': vol2['id']}
xing-yang9ee98602017-07-01 14:12:54 -0700136 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.zhang1bac6182017-09-26 22:08:15 +0800148 vols = self.volumes_client.list_volumes(detail=True)['volumes']
zhufl6c9ca4e2017-09-25 15:59:02 +0800149 grp_vols = [v for v in vols if v['group_id'] == grp['id']]
xing-yang9ee98602017-07-01 14:12:54 -0700150 self.assertEqual(1, len(grp_vols))
xing-yang5805d322017-08-11 04:31:27 -0700151
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
zhufl6c9ca4e2017-09-25 15:59:02 +0800161 vols = self.volumes_client.list_volumes(detail=True)['volumes']
162 grp_vols = [v for v in vols if v['group_id'] == grp['id']]
xing-yang5805d322017-08-11 04:31:27 -0700163 self.assertEqual(2, len(grp_vols))
jeremy.zhangcca99742017-08-20 01:08:24 +0800164
165
jeremy.zhang2abe00a2017-11-21 10:14:09 +0800166class GroupsV314Test(base.BaseVolumeAdminTest):
zhuflfcfb31b2020-04-20 15:41:07 +0800167 """Tests of volume groups with microversion greater than 3.13"""
168
Sophie Huangd458bf32021-10-12 17:08:41 +0000169 volume_min_microversion = '3.14'
170 volume_max_microversion = 'latest'
jeremy.zhang23df2c02017-09-26 22:33:17 +0800171
jeremy.zhang2abe00a2017-11-21 10:14:09 +0800172 @decorators.idempotent_id('2424af8c-7851-4888-986a-794b10c3210e')
173 def test_create_group_from_group(self):
zhuflfcfb31b2020-04-20 15:41:07 +0800174 """Test creating volume group from volume group"""
jeremy.zhang23df2c02017-09-26 22:33:17 +0800175 # Create volume type
176 volume_type = self.create_volume_type()
177
178 # Create group type
179 group_type = self.create_group_type()
180
jeremy.zhang2abe00a2017-11-21 10:14:09 +0800181 # Create Group
182 grp = self.create_group(group_type=group_type['id'],
183 volume_types=[volume_type['id']])
jeremy.zhang23df2c02017-09-26 22:33:17 +0800184
Martin Kopec213d0a42023-11-30 10:28:14 +0100185 prefix = CONF.resource_name_prefix
Benny Kopilov951b8062022-05-04 08:50:03 +0300186 # Create volume is instance level, can not be deleted before group.
187 # Volume delete handled by delete_group method, cleanup method.
Martin Kopec213d0a42023-11-30 10:28:14 +0100188 params = {'name': data_utils.rand_name(prefix=prefix, name="volume"),
Benny Kopilov951b8062022-05-04 08:50:03 +0300189 '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.zhang23df2c02017-09-26 22:33:17 +0800195
jeremy.zhang2abe00a2017-11-21 10:14:09 +0800196 # Create Group from Group
Martin Kopec213d0a42023-11-30 10:28:14 +0100197 grp_name2 = data_utils.rand_name(prefix=prefix, name='Group_from_grp')
jeremy.zhang2abe00a2017-11-21 10:14:09 +0800198 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.zhang23df2c02017-09-26 22:33:17 +0800205 waiters.wait_for_volume_resource_status(
jeremy.zhang2abe00a2017-11-21 10:14:09 +0800206 self.volumes_client, vol['id'], 'available')
jeremy.zhang23df2c02017-09-26 22:33:17 +0800207 waiters.wait_for_volume_resource_status(
jeremy.zhang2abe00a2017-11-21 10:14:09 +0800208 self.groups_client, grp2['id'], 'available')
jeremy.zhang23df2c02017-09-26 22:33:17 +0800209
210
jeremy.zhang2abe00a2017-11-21 10:14:09 +0800211class GroupsV320Test(base.BaseVolumeAdminTest):
zhuflfcfb31b2020-04-20 15:41:07 +0800212 """Tests of volume groups with microversion greater than 3.19"""
213
Sophie Huangd458bf32021-10-12 17:08:41 +0000214 volume_min_microversion = '3.20'
215 volume_max_microversion = 'latest'
jeremy.zhangcca99742017-08-20 01:08:24 +0800216
217 @decorators.idempotent_id('b20c696b-0cbc-49a5-8b3a-b1fb9338f45c')
218 def test_reset_group_status(self):
zhuflfcfb31b2020-04-20 15:41:07 +0800219 """Test resetting volume group status to creating/available/error"""
jeremy.zhangcca99742017-08-20 01:08:24 +0800220 # 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.zhang2abe00a2017-11-21 10:14:09 +0800227 group = self.create_group(group_type=group_type['id'],
228 volume_types=[volume_type['id']])
jeremy.zhangcca99742017-08-20 01:08:24 +0800229
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)