blob: 2056df217ac7d626c13cf6ef031eb94df0d92df4 [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
xing-yangd56edc32017-07-01 14:00:06 -070020from tempest.lib.common.utils import test_utils
Xing Yang0ddf83e2015-11-17 22:15:25 -050021from tempest.lib import decorators
22
23CONF = config.CONF
24
25
jeremy.zhangcca99742017-08-20 01:08:24 +080026class BaseGroupsTest(base.BaseVolumeAdminTest):
Xing Yang0ddf83e2015-11-17 22:15:25 -050027
28 def _delete_group(self, grp_id, delete_volumes=True):
xing-yangd56edc32017-07-01 14:00:06 -070029 self.groups_client.delete_group(grp_id, delete_volumes)
30 vols = self.volumes_client.list_volumes(detail=True)['volumes']
Xing Yang0ddf83e2015-11-17 22:15:25 -050031 for vol in vols:
32 if vol['group_id'] == grp_id:
xing-yangd56edc32017-07-01 14:00:06 -070033 self.volumes_client.wait_for_resource_deletion(vol['id'])
34 self.groups_client.wait_for_resource_deletion(grp_id)
Xing Yang0ddf83e2015-11-17 22:15:25 -050035
xing-yang41ed7152017-05-03 06:52:56 -040036 def _delete_group_snapshot(self, group_snapshot_id, grp_id):
xing-yangd56edc32017-07-01 14:00:06 -070037 self.group_snapshots_client.delete_group_snapshot(
xing-yang41ed7152017-05-03 06:52:56 -040038 group_snapshot_id)
xing-yangd56edc32017-07-01 14:00:06 -070039 vols = self.volumes_client.list_volumes(detail=True)['volumes']
40 snapshots = self.snapshots_client.list_snapshots(
xing-yang41ed7152017-05-03 06:52:56 -040041 detail=True)['snapshots']
42 for vol in vols:
43 for snap in snapshots:
44 if (vol['group_id'] == grp_id and
45 vol['id'] == snap['volume_id']):
xing-yangd56edc32017-07-01 14:00:06 -070046 self.snapshots_client.wait_for_resource_deletion(
xing-yang41ed7152017-05-03 06:52:56 -040047 snap['id'])
xing-yangd56edc32017-07-01 14:00:06 -070048 self.group_snapshots_client.wait_for_resource_deletion(
xing-yang41ed7152017-05-03 06:52:56 -040049 group_snapshot_id)
50
xing-yangd56edc32017-07-01 14:00:06 -070051 def _create_group(self, group_type, volume_type, grp_name=None):
52 if not grp_name:
53 grp_name = data_utils.rand_name('Group')
54 grp = self.groups_client.create_group(
55 group_type=group_type['id'],
56 volume_types=[volume_type['id']],
57 name=grp_name)['group']
58 self.addCleanup(test_utils.call_and_ignore_notfound_exc,
59 self._delete_group, grp['id'])
60 waiters.wait_for_volume_resource_status(
61 self.groups_client, grp['id'], 'available')
62 self.assertEqual(grp_name, grp['name'])
63 return grp
64
jeremy.zhangcca99742017-08-20 01:08:24 +080065
66class GroupsTest(BaseGroupsTest):
67 min_microversion = '3.14'
68 max_microversion = 'latest'
69 _api_version = 3
70
Xing Yang0ddf83e2015-11-17 22:15:25 -050071 @decorators.idempotent_id('4b111d28-b73d-4908-9bd2-03dc2992e4d4')
72 def test_group_create_show_list_delete(self):
73 # Create volume type
74 volume_type = self.create_volume_type()
75
76 # Create group type
77 group_type = self.create_group_type()
78
79 # Create group
80 grp1_name = data_utils.rand_name('Group1')
xing-yangd56edc32017-07-01 14:00:06 -070081 grp1 = self._create_group(group_type, volume_type,
82 grp_name=grp1_name)
Xing Yang0ddf83e2015-11-17 22:15:25 -050083 grp1_id = grp1['id']
84
85 grp2_name = data_utils.rand_name('Group2')
xing-yangd56edc32017-07-01 14:00:06 -070086 grp2 = self._create_group(group_type, volume_type,
87 grp_name=grp2_name)
Xing Yang0ddf83e2015-11-17 22:15:25 -050088 grp2_id = grp2['id']
89
90 # Create volume
91 vol1_name = data_utils.rand_name("volume")
92 params = {'name': vol1_name,
93 'volume_type': volume_type['id'],
94 'group_id': grp1['id'],
95 'size': CONF.volume.volume_size}
xing-yangd56edc32017-07-01 14:00:06 -070096 vol1 = self.volumes_client.create_volume(**params)['volume']
Xing Yang0ddf83e2015-11-17 22:15:25 -050097 self.assertEqual(grp1['id'], vol1['group_id'])
98 waiters.wait_for_volume_resource_status(
xing-yangd56edc32017-07-01 14:00:06 -070099 self.volumes_client, vol1['id'], 'available')
Xing Yang0ddf83e2015-11-17 22:15:25 -0500100 vol1_id = vol1['id']
101
102 # Get a given group
xing-yangd56edc32017-07-01 14:00:06 -0700103 grp1 = self.groups_client.show_group(grp1['id'])['group']
Xing Yang0ddf83e2015-11-17 22:15:25 -0500104 self.assertEqual(grp1_name, grp1['name'])
105 self.assertEqual(grp1_id, grp1['id'])
106
xing-yangd56edc32017-07-01 14:00:06 -0700107 grp2 = self.groups_client.show_group(grp2['id'])['group']
Xing Yang0ddf83e2015-11-17 22:15:25 -0500108 self.assertEqual(grp2_name, grp2['name'])
109 self.assertEqual(grp2_id, grp2['id'])
110
111 # Get all groups with detail
xing-yangd56edc32017-07-01 14:00:06 -0700112 grps = self.groups_client.list_groups(
Xing Yang0ddf83e2015-11-17 22:15:25 -0500113 detail=True)['groups']
114 filtered_grps = [g for g in grps if g['id'] in [grp1_id, grp2_id]]
115 self.assertEqual(2, len(filtered_grps))
116 for grp in filtered_grps:
117 self.assertEqual([volume_type['id']], grp['volume_types'])
118 self.assertEqual(group_type['id'], grp['group_type'])
119
xing-yangd56edc32017-07-01 14:00:06 -0700120 vols = self.volumes_client.list_volumes(
Xing Yang0ddf83e2015-11-17 22:15:25 -0500121 detail=True)['volumes']
122 filtered_vols = [v for v in vols if v['id'] in [vol1_id]]
123 self.assertEqual(1, len(filtered_vols))
124 for vol in filtered_vols:
125 self.assertEqual(grp1_id, vol['group_id'])
126
127 # Delete group
128 # grp1 has a volume so delete_volumes flag is set to True by default
129 self._delete_group(grp1_id)
130 # grp2 is empty so delete_volumes flag can be set to False
131 self._delete_group(grp2_id, delete_volumes=False)
xing-yangd56edc32017-07-01 14:00:06 -0700132 grps = self.groups_client.list_groups(
Xing Yang0ddf83e2015-11-17 22:15:25 -0500133 detail=True)['groups']
134 self.assertEmpty(grps)
xing-yang41ed7152017-05-03 06:52:56 -0400135
136 @decorators.idempotent_id('1298e537-f1f0-47a3-a1dd-8adec8168897')
137 def test_group_snapshot_create_show_list_delete(self):
138 # Create volume type
139 volume_type = self.create_volume_type()
140
141 # Create group type
142 group_type = self.create_group_type()
143
144 # Create group
xing-yangd56edc32017-07-01 14:00:06 -0700145 grp = self._create_group(group_type, volume_type)
xing-yang41ed7152017-05-03 06:52:56 -0400146
147 # Create volume
148 vol = self.create_volume(volume_type=volume_type['id'],
149 group_id=grp['id'])
150
151 # Create group snapshot
152 group_snapshot_name = data_utils.rand_name('group_snapshot')
153 group_snapshot = (
xing-yangd56edc32017-07-01 14:00:06 -0700154 self.group_snapshots_client.create_group_snapshot(
xing-yang41ed7152017-05-03 06:52:56 -0400155 group_id=grp['id'],
156 name=group_snapshot_name)['group_snapshot'])
xing-yangd56edc32017-07-01 14:00:06 -0700157 snapshots = self.snapshots_client.list_snapshots(
xing-yang41ed7152017-05-03 06:52:56 -0400158 detail=True)['snapshots']
159 for snap in snapshots:
160 if vol['id'] == snap['volume_id']:
161 waiters.wait_for_volume_resource_status(
xing-yangd56edc32017-07-01 14:00:06 -0700162 self.snapshots_client, snap['id'], 'available')
xing-yang41ed7152017-05-03 06:52:56 -0400163 waiters.wait_for_volume_resource_status(
xing-yangd56edc32017-07-01 14:00:06 -0700164 self.group_snapshots_client,
xing-yang41ed7152017-05-03 06:52:56 -0400165 group_snapshot['id'], 'available')
166 self.assertEqual(group_snapshot_name, group_snapshot['name'])
167
168 # Get a given group snapshot
xing-yangd56edc32017-07-01 14:00:06 -0700169 group_snapshot = self.group_snapshots_client.show_group_snapshot(
xing-yang41ed7152017-05-03 06:52:56 -0400170 group_snapshot['id'])['group_snapshot']
171 self.assertEqual(group_snapshot_name, group_snapshot['name'])
172
173 # Get all group snapshots with detail
174 group_snapshots = (
xing-yangd56edc32017-07-01 14:00:06 -0700175 self.group_snapshots_client.list_group_snapshots(
xing-yang41ed7152017-05-03 06:52:56 -0400176 detail=True)['group_snapshots'])
177 self.assertIn((group_snapshot['name'], group_snapshot['id']),
178 [(m['name'], m['id']) for m in group_snapshots])
179
180 # Delete group snapshot
181 self._delete_group_snapshot(group_snapshot['id'], grp['id'])
182 group_snapshots = (
xing-yangd56edc32017-07-01 14:00:06 -0700183 self.group_snapshots_client.list_group_snapshots(
xing-yang41ed7152017-05-03 06:52:56 -0400184 detail=True)['group_snapshots'])
185 self.assertEmpty(group_snapshots)
xing-yangd56edc32017-07-01 14:00:06 -0700186
187 @decorators.idempotent_id('eff52c70-efc7-45ed-b47a-4ad675d09b81')
188 def test_create_group_from_group_snapshot(self):
189 # Create volume type
190 volume_type = self.create_volume_type()
191
192 # Create group type
193 group_type = self.create_group_type()
194
195 # Create Group
196 grp = self._create_group(group_type, volume_type)
197
198 # Create volume
199 vol = self.create_volume(volume_type=volume_type['id'],
200 group_id=grp['id'])
201
202 # Create group_snapshot
203 group_snapshot_name = data_utils.rand_name('group_snapshot')
204 group_snapshot = (
205 self.group_snapshots_client.create_group_snapshot(
206 group_id=grp['id'],
207 name=group_snapshot_name)['group_snapshot'])
208 self.addCleanup(self._delete_group_snapshot,
209 group_snapshot['id'], grp['id'])
210 self.assertEqual(group_snapshot_name, group_snapshot['name'])
211 snapshots = self.snapshots_client.list_snapshots(
212 detail=True)['snapshots']
213 for snap in snapshots:
214 if vol['id'] == snap['volume_id']:
215 waiters.wait_for_volume_resource_status(
216 self.snapshots_client, snap['id'], 'available')
217 waiters.wait_for_volume_resource_status(
218 self.group_snapshots_client,
219 group_snapshot['id'], 'available')
220
221 # Create Group from Group snapshot
222 grp_name2 = data_utils.rand_name('Group_from_snap')
223 grp2 = self.groups_client.create_group_from_source(
224 group_snapshot_id=group_snapshot['id'],
225 name=grp_name2)['group']
226 self.addCleanup(self._delete_group, grp2['id'])
227 self.assertEqual(grp_name2, grp2['name'])
228 vols = self.volumes_client.list_volumes(detail=True)['volumes']
229 for vol in vols:
230 if vol['group_id'] == grp2['id']:
231 waiters.wait_for_volume_resource_status(
232 self.volumes_client, vol['id'], 'available')
233 waiters.wait_for_volume_resource_status(
234 self.groups_client, grp2['id'], 'available')
235
236 @decorators.idempotent_id('2424af8c-7851-4888-986a-794b10c3210e')
237 def test_create_group_from_group(self):
238 # Create volume type
239 volume_type = self.create_volume_type()
240
241 # Create group type
242 group_type = self.create_group_type()
243
244 # Create Group
245 grp = self._create_group(group_type, volume_type)
246
247 # Create volume
248 self.create_volume(volume_type=volume_type['id'], group_id=grp['id'])
249
250 # Create Group from Group
251 grp_name2 = data_utils.rand_name('Group_from_grp')
252 grp2 = self.groups_client.create_group_from_source(
253 source_group_id=grp['id'], name=grp_name2)['group']
254 self.addCleanup(self._delete_group, grp2['id'])
255 self.assertEqual(grp_name2, grp2['name'])
256 vols = self.volumes_client.list_volumes(
257 detail=True)['volumes']
258 for vol in vols:
259 if vol['group_id'] == grp2['id']:
260 waiters.wait_for_volume_resource_status(
261 self.volumes_client, vol['id'], 'available')
262 waiters.wait_for_volume_resource_status(
263 self.groups_client, grp2['id'], 'available')
xing-yang9ee98602017-07-01 14:12:54 -0700264
265 @decorators.idempotent_id('4a8a6fd2-8b3b-4641-8f54-6a6f99320006')
266 def test_group_update(self):
267 # Create volume type
268 volume_type = self.create_volume_type()
269
270 # Create group type
271 group_type = self.create_group_type()
272
273 # Create Group
274 grp = self._create_group(group_type, volume_type)
275
xing-yang5805d322017-08-11 04:31:27 -0700276 # Create volumes
277 grp_vols = []
278 for _ in range(2):
279 vol = self.create_volume(volume_type=volume_type['id'],
280 group_id=grp['id'])
281 grp_vols.append(vol)
282 vol2 = grp_vols[1]
xing-yang9ee98602017-07-01 14:12:54 -0700283
284 # Remove a volume from group and update name and description
285 new_grp_name = 'new_group'
286 new_desc = 'This is a new group'
287 grp_params = {'name': new_grp_name,
288 'description': new_desc,
xing-yang5805d322017-08-11 04:31:27 -0700289 'remove_volumes': vol2['id']}
xing-yang9ee98602017-07-01 14:12:54 -0700290 self.groups_client.update_group(grp['id'], **grp_params)
291
292 # Wait for group status to become available
293 waiters.wait_for_volume_resource_status(
294 self.groups_client, grp['id'], 'available')
295
296 # Get the updated Group
297 grp = self.groups_client.show_group(grp['id'])['group']
298 self.assertEqual(new_grp_name, grp['name'])
299 self.assertEqual(new_desc, grp['description'])
300
301 # Get volumes in the group
302 vols = self.volumes_client.list_volumes(
303 detail=True)['volumes']
304 grp_vols = []
305 for vol in vols:
306 if vol['group_id'] == grp['id']:
307 grp_vols.append(vol)
308 self.assertEqual(1, len(grp_vols))
xing-yang5805d322017-08-11 04:31:27 -0700309
310 # Add a volume to the group
311 grp_params = {'add_volumes': vol2['id']}
312 self.groups_client.update_group(grp['id'], **grp_params)
313
314 # Wait for group status to become available
315 waiters.wait_for_volume_resource_status(
316 self.groups_client, grp['id'], 'available')
317
318 # Get volumes in the group
319 vols = self.volumes_client.list_volumes(
320 detail=True)['volumes']
321 grp_vols = []
322 for vol in vols:
323 if vol['group_id'] == grp['id']:
324 grp_vols.append(vol)
325 self.assertEqual(2, len(grp_vols))
jeremy.zhangcca99742017-08-20 01:08:24 +0800326
327
328class GroupsV320Test(BaseGroupsTest):
329 _api_version = 3
330 min_microversion = '3.20'
331 max_microversion = 'latest'
332
333 @decorators.idempotent_id('b20c696b-0cbc-49a5-8b3a-b1fb9338f45c')
334 def test_reset_group_status(self):
335 # Create volume type
336 volume_type = self.create_volume_type()
337
338 # Create group type
339 group_type = self.create_group_type()
340
341 # Create group
342 group = self._create_group(group_type, volume_type)
343
344 # Reset group status
345 self.addCleanup(waiters.wait_for_volume_resource_status,
346 self.groups_client, group['id'], 'available')
347 self.addCleanup(self.admin_groups_client.reset_group_status,
348 group['id'], 'available')
349 for status in ['creating', 'available', 'error']:
350 self.admin_groups_client.reset_group_status(group['id'], status)
351 waiters.wait_for_volume_resource_status(
352 self.groups_client, group['id'], status)