blob: 5bac3d877ea762d87cefa29e4b103341464aeb57 [file] [log] [blame]
wanghaoaa1f2f92013-10-10 11:30:37 +08001# Copyright 2013 Huawei Technologies Co.,LTD
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
Zhi Kun Liubb363a22013-11-28 18:47:39 +080016from tempest.api.volume import base
Andrea Frittolicd368412017-08-14 21:37:56 +010017from tempest.common import utils
jeremy.zhang7b0eaf82017-04-25 15:11:15 +080018from tempest.common import waiters
19from tempest import config
Ken'ichi Ohmichi6b279c72017-01-27 18:26:59 -080020from tempest.lib import decorators
jeremy.zhang7b0eaf82017-04-25 15:11:15 +080021
22CONF = config.CONF
wanghaoaa1f2f92013-10-10 11:30:37 +080023
24
Ken'ichi Ohmichie8afb8c2017-03-27 11:25:37 -070025class VolumesActionsTest(base.BaseVolumeAdminTest):
Ghanshyam Mann7d91b692020-03-03 10:21:50 -060026 create_default_network = True
wanghaoaa1f2f92013-10-10 11:30:37 +080027
wanghao9d3d6cb2013-11-12 15:10:10 +080028 def _create_reset_and_force_delete_temp_volume(self, status=None):
29 # Create volume, reset volume status, and force delete temp volume
zhufl89403442016-10-09 16:19:28 +080030 temp_volume = self.create_volume()
wanghao9d3d6cb2013-11-12 15:10:10 +080031 if status:
zhufl7e75fcb2016-10-17 09:00:40 +080032 self.admin_volume_client.reset_volume_status(
33 temp_volume['id'], status=status)
jeremy.zhang4b974462017-08-24 10:13:37 +080034 waiters.wait_for_volume_resource_status(
35 self.volumes_client, temp_volume['id'], status)
Joseph Lanoux6809bab2014-12-18 14:57:18 +000036 self.admin_volume_client.force_delete_volume(temp_volume['id'])
lkuchlanb21fc572016-11-28 12:25:22 +020037 self.volumes_client.wait_for_resource_deletion(temp_volume['id'])
wanghao9d3d6cb2013-11-12 15:10:10 +080038
Ken'ichi Ohmichi6b279c72017-01-27 18:26:59 -080039 @decorators.idempotent_id('d063f96e-a2e0-4f34-8b8a-395c42de1845')
wanghaoaa1f2f92013-10-10 11:30:37 +080040 def test_volume_reset_status(self):
lianghaof7861c72017-11-02 17:42:33 +080041 # test volume reset status : available->error->available->maintenance
zhufl7a682fe2016-12-15 17:20:00 +080042 volume = self.create_volume()
jeremy.zhang4b974462017-08-24 10:13:37 +080043 self.addCleanup(waiters.wait_for_volume_resource_status,
44 self.volumes_client, volume['id'], 'available')
Benny Kopilovba37ac42017-03-26 13:25:04 +030045 self.addCleanup(self.admin_volume_client.reset_volume_status,
46 volume['id'], status='available')
47 for status in ['error', 'available', 'maintenance']:
zhufl7a682fe2016-12-15 17:20:00 +080048 self.admin_volume_client.reset_volume_status(
49 volume['id'], status=status)
jeremy.zhang4b974462017-08-24 10:13:37 +080050 waiters.wait_for_volume_resource_status(
51 self.volumes_client, volume['id'], status)
wanghaoaa1f2f92013-10-10 11:30:37 +080052
Ken'ichi Ohmichi6b279c72017-01-27 18:26:59 -080053 @decorators.idempotent_id('21737d5a-92f2-46d7-b009-a0cc0ee7a570')
wanghao9d3d6cb2013-11-12 15:10:10 +080054 def test_volume_force_delete_when_volume_is_creating(self):
55 # test force delete when status of volume is creating
56 self._create_reset_and_force_delete_temp_volume('creating')
57
Ken'ichi Ohmichi6b279c72017-01-27 18:26:59 -080058 @decorators.idempotent_id('db8d607a-aa2e-4beb-b51d-d4005c232011')
wanghao9d3d6cb2013-11-12 15:10:10 +080059 def test_volume_force_delete_when_volume_is_attaching(self):
60 # test force delete when status of volume is attaching
61 self._create_reset_and_force_delete_temp_volume('attaching')
62
Ken'ichi Ohmichi6b279c72017-01-27 18:26:59 -080063 @decorators.idempotent_id('3e33a8a8-afd4-4d64-a86b-c27a185c5a4a')
wanghao9d3d6cb2013-11-12 15:10:10 +080064 def test_volume_force_delete_when_volume_is_error(self):
65 # test force delete when status of volume is error
66 self._create_reset_and_force_delete_temp_volume('error')
Benny Kopilov63fe58f2017-03-26 13:31:46 +030067
68 @decorators.idempotent_id('b957cabd-1486-4e21-90cf-a9ed3c39dfb2')
69 def test_volume_force_delete_when_volume_is_maintenance(self):
70 # test force delete when status of volume is maintenance
71 self._create_reset_and_force_delete_temp_volume('maintenance')
jeremy.zhang7b0eaf82017-04-25 15:11:15 +080072
73 @decorators.idempotent_id('d38285d9-929d-478f-96a5-00e66a115b81')
Andrea Frittolicd368412017-08-14 21:37:56 +010074 @utils.services('compute')
jeremy.zhang7b0eaf82017-04-25 15:11:15 +080075 def test_force_detach_volume(self):
76 # Create a server and a volume
lkuchland4ecd0e2017-06-11 12:01:27 +030077 server_id = self.create_server()['id']
jeremy.zhang7b0eaf82017-04-25 15:11:15 +080078 volume_id = self.create_volume()['id']
79
80 # Attach volume
81 self.volumes_client.attach_volume(
82 volume_id,
83 instance_uuid=server_id,
84 mountpoint='/dev/%s' % CONF.compute.volume_device_name)
85 waiters.wait_for_volume_resource_status(self.volumes_client,
86 volume_id, 'in-use')
87 self.addCleanup(waiters.wait_for_volume_resource_status,
88 self.volumes_client, volume_id, 'available')
89 self.addCleanup(self.volumes_client.detach_volume, volume_id)
90 attachment = self.volumes_client.show_volume(
91 volume_id)['volume']['attachments'][0]
92
93 # Reset volume's status to error
94 self.admin_volume_client.reset_volume_status(volume_id, status='error')
jeremy.zhang4b974462017-08-24 10:13:37 +080095 waiters.wait_for_volume_resource_status(self.volumes_client,
96 volume_id, 'error')
jeremy.zhang7b0eaf82017-04-25 15:11:15 +080097
98 # Force detach volume
99 self.admin_volume_client.force_detach_volume(
100 volume_id, connector=None,
101 attachment_id=attachment['attachment_id'])
102 waiters.wait_for_volume_resource_status(self.volumes_client,
103 volume_id, 'available')
104 vol_info = self.volumes_client.show_volume(volume_id)['volume']
105 self.assertIn('attachments', vol_info)
106 self.assertEmpty(vol_info['attachments'])