blob: a9bc70afbe2d2333c5fad8b09fbd9093c33e8595 [file] [log] [blame]
ZhiQiang Fan39f97222013-09-20 04:49:44 +08001# Copyright 2012 OpenStack Foundation
Rohit Karajgia42fe442012-09-21 03:08:33 -07002# 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
wanghao5b981752013-10-22 11:41:41 +080017from tempest.common.utils import data_utils
Matthew Treinish4d352bc2014-01-29 18:29:18 +000018from tempest import config
Masayuki Igawaba7bcf62014-02-17 14:56:41 +090019from tempest import test
Rohit Karajgia42fe442012-09-21 03:08:33 -070020
Matthew Treinish4d352bc2014-01-29 18:29:18 +000021CONF = config.CONF
22
Rohit Karajgia42fe442012-09-21 03:08:33 -070023
Zhi Kun Liu3d6d9862014-06-16 16:43:59 +080024class VolumesV2ActionsTest(base.BaseVolumeTest):
Rohit Karajgia42fe442012-09-21 03:08:33 -070025
26 @classmethod
Andrea Frittoli61a12e22014-09-15 13:14:54 +010027 def resource_setup(cls):
28 super(VolumesV2ActionsTest, cls).resource_setup()
Rohit Karajgia42fe442012-09-21 03:08:33 -070029 cls.client = cls.volumes_client
Giulio Fidente884e9da2013-06-21 17:25:42 +020030 cls.image_client = cls.os.image_client
Rohit Karajgia42fe442012-09-21 03:08:33 -070031
Ken'ichi Ohmichi5687d552013-12-26 19:00:12 +090032 # Create a test shared instance
wanghao5b981752013-10-22 11:41:41 +080033 srv_name = data_utils.rand_name(cls.__name__ + '-Instance-')
Rohit Karajgia42fe442012-09-21 03:08:33 -070034 resp, cls.server = cls.servers_client.create_server(srv_name,
35 cls.image_ref,
36 cls.flavor_ref)
37 cls.servers_client.wait_for_server_status(cls.server['id'], 'ACTIVE')
38
Ken'ichi Ohmichi5687d552013-12-26 19:00:12 +090039 # Create a test shared volume for attach/detach tests
40 cls.volume = cls.create_volume()
Rohit Karajgia42fe442012-09-21 03:08:33 -070041
Attila Fazekas9fa29472014-08-18 09:48:00 +020042 def _delete_image_with_wait(self, image_id):
43 self.image_client.delete_image(image_id)
44 self.image_client.wait_for_resource_deletion(image_id)
45
Rohit Karajgia42fe442012-09-21 03:08:33 -070046 @classmethod
Andrea Frittoli61a12e22014-09-15 13:14:54 +010047 def resource_cleanup(cls):
Ken'ichi Ohmichi5687d552013-12-26 19:00:12 +090048 # Delete the test instance
Rohit Karajgia42fe442012-09-21 03:08:33 -070049 cls.servers_client.delete_server(cls.server['id'])
Attila Fazekas4435bd82014-03-13 14:35:10 +010050 cls.servers_client.wait_for_server_termination(cls.server['id'])
Rohit Karajgia42fe442012-09-21 03:08:33 -070051
Andrea Frittoli61a12e22014-09-15 13:14:54 +010052 super(VolumesV2ActionsTest, cls).resource_cleanup()
Dolph Mathews6dbb27c2013-05-09 10:56:24 -050053
Masayuki Igawaba7bcf62014-02-17 14:56:41 +090054 @test.stresstest(class_setup_per='process')
55 @test.attr(type='smoke')
56 @test.services('compute')
Rohit Karajgia42fe442012-09-21 03:08:33 -070057 def test_attach_detach_volume_to_instance(self):
Sean Dague72a00382013-01-03 17:53:38 -050058 # Volume is attached and detached successfully from an instance
Giulio Fidente92f77192013-08-26 17:13:28 +020059 mountpoint = '/dev/vdc'
Swapnil Kulkarnid9df38c2014-08-16 18:06:52 +000060 _, body = self.client.attach_volume(self.volume['id'],
61 self.server['id'],
62 mountpoint)
Giulio Fidente92f77192013-08-26 17:13:28 +020063 self.client.wait_for_volume_status(self.volume['id'], 'in-use')
Swapnil Kulkarnid9df38c2014-08-16 18:06:52 +000064 _, body = self.client.detach_volume(self.volume['id'])
Giulio Fidente92f77192013-08-26 17:13:28 +020065 self.client.wait_for_volume_status(self.volume['id'], 'available')
Rohit Karajgia42fe442012-09-21 03:08:33 -070066
Masayuki Igawaba7bcf62014-02-17 14:56:41 +090067 @test.stresstest(class_setup_per='process')
68 @test.attr(type='gate')
69 @test.services('compute')
Rohit Karajgia42fe442012-09-21 03:08:33 -070070 def test_get_volume_attachment(self):
Sean Dague72a00382013-01-03 17:53:38 -050071 # Verify that a volume's attachment information is retrieved
Rohit Karajgia42fe442012-09-21 03:08:33 -070072 mountpoint = '/dev/vdc'
Swapnil Kulkarnid9df38c2014-08-16 18:06:52 +000073 _, body = self.client.attach_volume(self.volume['id'],
74 self.server['id'],
75 mountpoint)
Giulio Fidente92f77192013-08-26 17:13:28 +020076 self.client.wait_for_volume_status(self.volume['id'], 'in-use')
77 # NOTE(gfidente): added in reverse order because functions will be
78 # called in reverse order to the order they are added (LIFO)
79 self.addCleanup(self.client.wait_for_volume_status,
80 self.volume['id'],
81 'available')
82 self.addCleanup(self.client.detach_volume, self.volume['id'])
Swapnil Kulkarnid9df38c2014-08-16 18:06:52 +000083 _, volume = self.client.get_volume(self.volume['id'])
Giulio Fidente92f77192013-08-26 17:13:28 +020084 self.assertIn('attachments', volume)
anju tiwari789449a2013-08-29 16:56:17 +053085 attachment = self.client.get_attachment_from_volume(volume)
Giulio Fidente92f77192013-08-26 17:13:28 +020086 self.assertEqual(mountpoint, attachment['device'])
87 self.assertEqual(self.server['id'], attachment['server_id'])
88 self.assertEqual(self.volume['id'], attachment['id'])
89 self.assertEqual(self.volume['id'], attachment['volume_id'])
Giulio Fidente884e9da2013-06-21 17:25:42 +020090
Masayuki Igawaba7bcf62014-02-17 14:56:41 +090091 @test.attr(type='gate')
92 @test.services('image')
Giulio Fidente884e9da2013-06-21 17:25:42 +020093 def test_volume_upload(self):
94 # NOTE(gfidente): the volume uploaded in Glance comes from setUpClass,
95 # it is shared with the other tests. After it is uploaded in Glance,
96 # there is no way to delete it from Cinder, so we delete it from Glance
97 # using the Glance image_client and from Cinder via tearDownClass.
wanghao5b981752013-10-22 11:41:41 +080098 image_name = data_utils.rand_name('Image-')
Swapnil Kulkarnid9df38c2014-08-16 18:06:52 +000099 _, body = self.client.upload_volume(self.volume['id'],
100 image_name,
101 CONF.volume.disk_format)
Giulio Fidente884e9da2013-06-21 17:25:42 +0200102 image_id = body["image_id"]
Swapnil Kulkarnid9df38c2014-08-16 18:06:52 +0000103 self.addCleanup(self.image_client.delete_image, image_id)
Giulio Fidente884e9da2013-06-21 17:25:42 +0200104 self.image_client.wait_for_image_status(image_id, 'active')
John Griffitha05038b2013-07-29 10:54:01 -0600105 self.client.wait_for_volume_status(self.volume['id'], 'available')
anju tiwari789449a2013-08-29 16:56:17 +0530106
Masayuki Igawaba7bcf62014-02-17 14:56:41 +0900107 @test.attr(type='gate')
zhangyanzi6b632432013-10-24 19:08:50 +0800108 def test_reserve_unreserve_volume(self):
109 # Mark volume as reserved.
Swapnil Kulkarnid9df38c2014-08-16 18:06:52 +0000110 _, body = self.client.reserve_volume(self.volume['id'])
zhangyanzi6b632432013-10-24 19:08:50 +0800111 # To get the volume info
Swapnil Kulkarnid9df38c2014-08-16 18:06:52 +0000112 _, body = self.client.get_volume(self.volume['id'])
zhangyanzi6b632432013-10-24 19:08:50 +0800113 self.assertIn('attaching', body['status'])
114 # Unmark volume as reserved.
Swapnil Kulkarnid9df38c2014-08-16 18:06:52 +0000115 _, body = self.client.unreserve_volume(self.volume['id'])
zhangyanzi6b632432013-10-24 19:08:50 +0800116 # To get the volume info
Swapnil Kulkarnid9df38c2014-08-16 18:06:52 +0000117 _, body = self.client.get_volume(self.volume['id'])
zhangyanzi6b632432013-10-24 19:08:50 +0800118 self.assertIn('available', body['status'])
119
zhangyanziaa180072013-11-21 12:31:26 +0800120 def _is_true(self, val):
121 return val in ['true', 'True', True]
122
Masayuki Igawaba7bcf62014-02-17 14:56:41 +0900123 @test.attr(type='gate')
zhangyanziaa180072013-11-21 12:31:26 +0800124 def test_volume_readonly_update(self):
125 # Update volume readonly true
126 readonly = True
Swapnil Kulkarnid9df38c2014-08-16 18:06:52 +0000127 _, body = self.client.update_volume_readonly(self.volume['id'],
128 readonly)
zhangyanziaa180072013-11-21 12:31:26 +0800129 # Get Volume information
Swapnil Kulkarnid9df38c2014-08-16 18:06:52 +0000130 _, fetched_volume = self.client.get_volume(self.volume['id'])
zhangyanziaa180072013-11-21 12:31:26 +0800131 bool_flag = self._is_true(fetched_volume['metadata']['readonly'])
zhangyanziaa180072013-11-21 12:31:26 +0800132 self.assertEqual(True, bool_flag)
133
134 # Update volume readonly false
135 readonly = False
Swapnil Kulkarnid9df38c2014-08-16 18:06:52 +0000136 _, body = self.client.update_volume_readonly(self.volume['id'],
137 readonly)
zhangyanziaa180072013-11-21 12:31:26 +0800138
139 # Get Volume information
Swapnil Kulkarnid9df38c2014-08-16 18:06:52 +0000140 _, fetched_volume = self.client.get_volume(self.volume['id'])
zhangyanziaa180072013-11-21 12:31:26 +0800141 bool_flag = self._is_true(fetched_volume['metadata']['readonly'])
zhangyanziaa180072013-11-21 12:31:26 +0800142 self.assertEqual(False, bool_flag)
143
anju tiwari789449a2013-08-29 16:56:17 +0530144
Zhi Kun Liu3d6d9862014-06-16 16:43:59 +0800145class VolumesV2ActionsTestXML(VolumesV2ActionsTest):
146 _interface = "xml"
147
148
149class VolumesV1ActionsTest(VolumesV2ActionsTest):
150 _api_version = 1
151
152
153class VolumesV1ActionsTestXML(VolumesV1ActionsTest):
anju tiwari789449a2013-08-29 16:56:17 +0530154 _interface = "xml"