blob: 2c6050cd628f874a1a330ff5ccd701830b10733b [file] [log] [blame]
ZhiQiang Fan39f97222013-09-20 04:49:44 +08001# Copyright 2012 OpenStack Foundation
Rohit Karajgidd47d7e2012-07-31 04:11:01 -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
Matthew Treinish481466b2012-12-20 17:16:01 -050016from tempest import clients
Ken'ichi Ohmichi5687d552013-12-26 19:00:12 +090017from tempest.common.utils import data_utils
Matthew Treinish4d352bc2014-01-29 18:29:18 +000018from tempest import config
Matthew Treinishf4a9b0f2013-07-26 16:58:26 -040019from tempest.openstack.common import log as logging
Attila Fazekasdc216422013-01-29 15:12:14 +010020import tempest.test
Rohit Karajgidd47d7e2012-07-31 04:11:01 -070021
Matthew Treinish4d352bc2014-01-29 18:29:18 +000022CONF = config.CONF
23
Rohit Karajgidd47d7e2012-07-31 04:11:01 -070024LOG = logging.getLogger(__name__)
25
26
Attila Fazekasdc216422013-01-29 15:12:14 +010027class BaseVolumeTest(tempest.test.BaseTestCase):
Rohit Karajgidd47d7e2012-07-31 04:11:01 -070028
Sean Daguef237ccb2013-01-04 15:19:14 -050029 """Base test case class for all Cinder API tests."""
Rohit Karajgidd47d7e2012-07-31 04:11:01 -070030
31 @classmethod
32 def setUpClass(cls):
Sylvain Afchain11b99d02014-01-16 00:42:33 +010033 cls.set_network_resources()
Attila Fazekasf86fa312013-07-30 19:56:39 +020034 super(BaseVolumeTest, cls).setUpClass()
Rohit Karajgidd47d7e2012-07-31 04:11:01 -070035
Matthew Treinish4d352bc2014-01-29 18:29:18 +000036 if not CONF.service_available.cinder:
Matthew Treinish4c412922013-07-16 15:27:42 -040037 skip_msg = ("%s skipped as Cinder is not available" % cls.__name__)
38 raise cls.skipException(skip_msg)
39
Zhi Kun Liubb363a22013-11-28 18:47:39 +080040 cls.os = cls.get_client_manager()
Rohit Karajgidd47d7e2012-07-31 04:11:01 -070041
Zhi Kun Liubb363a22013-11-28 18:47:39 +080042 cls.servers_client = cls.os.servers_client
Matthew Treinish4d352bc2014-01-29 18:29:18 +000043 cls.image_ref = CONF.compute.image_ref
44 cls.flavor_ref = CONF.compute.flavor_ref
45 cls.build_interval = CONF.volume.build_interval
46 cls.build_timeout = CONF.volume.build_timeout
Attila Fazekas36b1fcf2013-01-31 16:41:04 +010047 cls.snapshots = []
48 cls.volumes = []
Rohit Karajgidd47d7e2012-07-31 04:11:01 -070049
Rohit Karajgidd47d7e2012-07-31 04:11:01 -070050 @classmethod
Rohit Karajgidd47d7e2012-07-31 04:11:01 -070051 def tearDownClass(cls):
Attila Fazekas36b1fcf2013-01-31 16:41:04 +010052 cls.clear_snapshots()
53 cls.clear_volumes()
Ryan Hsu6c4bb3d2013-10-21 21:22:50 -070054 cls.clear_isolated_creds()
Matthew Treinishb86cda92013-07-29 11:22:23 -040055 super(BaseVolumeTest, cls).tearDownClass()
Rohit Karajgidd47d7e2012-07-31 04:11:01 -070056
Attila Fazekas36b1fcf2013-01-31 16:41:04 +010057 @classmethod
58 def create_snapshot(cls, volume_id=1, **kwargs):
59 """Wrapper utility that returns a test snapshot."""
60 resp, snapshot = cls.snapshots_client.create_snapshot(volume_id,
61 **kwargs)
62 assert 200 == resp.status
Giulio Fidente02f42982013-06-17 16:25:56 +020063 cls.snapshots.append(snapshot)
Attila Fazekas36b1fcf2013-01-31 16:41:04 +010064 cls.snapshots_client.wait_for_snapshot_status(snapshot['id'],
65 'available')
Attila Fazekas36b1fcf2013-01-31 16:41:04 +010066 return snapshot
67
Attila Fazekasf7f34f92013-08-01 17:01:44 +020068 # NOTE(afazekas): these create_* and clean_* could be defined
Attila Fazekas36b1fcf2013-01-31 16:41:04 +010069 # only in a single location in the source, and could be more general.
70
71 @classmethod
Attila Fazekas36b1fcf2013-01-31 16:41:04 +010072 def clear_volumes(cls):
73 for volume in cls.volumes:
74 try:
Giulio Fidente26d16ed2013-04-30 12:05:56 +020075 cls.volumes_client.delete_volume(volume['id'])
Attila Fazekas36b1fcf2013-01-31 16:41:04 +010076 except Exception:
77 pass
78
79 for volume in cls.volumes:
80 try:
Giulio Fidente26d16ed2013-04-30 12:05:56 +020081 cls.volumes_client.wait_for_resource_deletion(volume['id'])
Attila Fazekas36b1fcf2013-01-31 16:41:04 +010082 except Exception:
83 pass
84
85 @classmethod
86 def clear_snapshots(cls):
87 for snapshot in cls.snapshots:
88 try:
89 cls.snapshots_client.delete_snapshot(snapshot['id'])
90 except Exception:
91 pass
92
93 for snapshot in cls.snapshots:
94 try:
95 cls.snapshots_client.wait_for_resource_deletion(snapshot['id'])
96 except Exception:
97 pass
98
James E. Blaire6d8ee12013-01-18 21:33:45 +000099
Zhi Kun Liubb363a22013-11-28 18:47:39 +0800100class BaseVolumeV1Test(BaseVolumeTest):
101 @classmethod
102 def setUpClass(cls):
Matthew Treinish4d352bc2014-01-29 18:29:18 +0000103 if not CONF.volume_feature_enabled.api_v1:
Zhi Kun Liubb363a22013-11-28 18:47:39 +0800104 msg = "Volume API v1 not supported"
105 raise cls.skipException(msg)
106 super(BaseVolumeV1Test, cls).setUpClass()
Zhi Kun Liu02a99062014-01-02 19:00:08 +0800107 cls.snapshots_client = cls.os.snapshots_client
Zhi Kun Liubb363a22013-11-28 18:47:39 +0800108 cls.volumes_client = cls.os.volumes_client
Giulio Fidente74b08ad2014-01-18 04:02:51 +0100109 cls.backups_client = cls.os.backups_client
Zhi Kun Liu02a99062014-01-02 19:00:08 +0800110 cls.volumes_extension_client = cls.os.volumes_extension_client
Zhi Kun Liubb363a22013-11-28 18:47:39 +0800111
Zhi Kun Liu8cc3c842014-01-07 10:44:34 +0800112 @classmethod
113 def create_volume(cls, size=1, **kwargs):
114 """Wrapper utility that returns a test volume."""
115 vol_name = data_utils.rand_name('Volume')
116 resp, volume = cls.volumes_client.create_volume(size,
117 display_name=vol_name,
118 **kwargs)
119 assert 200 == resp.status
120 cls.volumes.append(volume)
121 cls.volumes_client.wait_for_volume_status(volume['id'], 'available')
122 return volume
123
Zhi Kun Liubb363a22013-11-28 18:47:39 +0800124
125class BaseVolumeV1AdminTest(BaseVolumeV1Test):
Attila Fazekas3dcdae12013-02-14 12:50:04 +0100126 """Base test case class for all Volume Admin API tests."""
James E. Blaire6d8ee12013-01-18 21:33:45 +0000127 @classmethod
128 def setUpClass(cls):
Zhi Kun Liubb363a22013-11-28 18:47:39 +0800129 super(BaseVolumeV1AdminTest, cls).setUpClass()
Matthew Treinish4d352bc2014-01-29 18:29:18 +0000130 cls.adm_user = CONF.identity.admin_username
131 cls.adm_pass = CONF.identity.admin_password
132 cls.adm_tenant = CONF.identity.admin_tenant_name
Attila Fazekas3dcdae12013-02-14 12:50:04 +0100133 if not all((cls.adm_user, cls.adm_pass, cls.adm_tenant)):
134 msg = ("Missing Volume Admin API credentials "
135 "in configuration.")
136 raise cls.skipException(msg)
Matthew Treinish4d352bc2014-01-29 18:29:18 +0000137 if CONF.compute.allow_tenant_isolation:
Matthew Treinishb86cda92013-07-29 11:22:23 -0400138 creds = cls.isolated_creds.get_admin_creds()
Matthew Treinish3e046852013-07-23 16:00:24 -0400139 admin_username, admin_tenant_name, admin_password = creds
140 cls.os_adm = clients.Manager(username=admin_username,
141 password=admin_password,
142 tenant_name=admin_tenant_name,
143 interface=cls._interface)
144 else:
145 cls.os_adm = clients.AdminManager(interface=cls._interface)
Attila Fazekas3dcdae12013-02-14 12:50:04 +0100146 cls.client = cls.os_adm.volume_types_client
Nayna Patel4a5024c2013-11-18 07:08:23 +0000147 cls.hosts_client = cls.os_adm.volume_hosts_client
Sylvain Baubeaufdd34592014-02-20 18:40:10 +0100148 cls.quotas_client = cls.os_adm.volume_quotas_client
Zhi Kun Liu8cc3c842014-01-07 10:44:34 +0800149
150
151class BaseVolumeV2Test(BaseVolumeTest):
152 @classmethod
153 def setUpClass(cls):
154 if not CONF.volume_feature_enabled.api_v2:
155 msg = "Volume API v2 not supported"
156 raise cls.skipException(msg)
157 super(BaseVolumeV2Test, cls).setUpClass()
158 cls.volumes_client = cls.os.volumes_v2_client
159
160 @classmethod
161 def create_volume(cls, size=1, **kwargs):
162 """Wrapper utility that returns a test volume."""
163 vol_name = data_utils.rand_name('Volume')
164 resp, volume = cls.volumes_client.create_volume(size,
165 name=vol_name,
166 **kwargs)
167 assert 202 == resp.status
168 cls.volumes.append(volume)
169 cls.volumes_client.wait_for_volume_status(volume['id'], 'available')
170 return volume