blob: 70ba2feca4a3f2926bb884aede0bd9ab5cb234d3 [file] [log] [blame]
Matthew Treinishce3ef922013-03-11 14:02:46 -04001# Copyright 2013 IBM Corp.
2#
3# Licensed under the Apache License, Version 2.0 (the "License"); you may
4# not use this file except in compliance with the License. You may obtain
5# a copy of the License at
6#
7# http://www.apache.org/licenses/LICENSE-2.0
8#
9# Unless required by applicable law or agreed to in writing, software
10# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12# License for the specific language governing permissions and limitations
13# under the License.
14
Sirushti Murugesan12dc9732016-07-13 22:49:17 +053015import six
Attila Fazekasa709b762013-10-08 11:52:44 +020016
Ken'ichi Ohmichi02bcdf32016-06-17 16:41:26 -070017from tempest.common import image as common_image
Matthew Treinish5ba84e32014-01-29 16:52:57 +000018from tempest import config
Ken'ichi Ohmichicc01c3e2017-03-10 10:48:14 -080019from tempest.lib.common.utils import data_utils
Jordan Pittier9e227c52016-02-09 14:35:18 +010020from tempest.lib.common.utils import test_utils
Matthew Treinishce3ef922013-03-11 14:02:46 -040021import tempest.test
22
Matthew Treinish5ba84e32014-01-29 16:52:57 +000023CONF = config.CONF
24
Matthew Treinishce3ef922013-03-11 14:02:46 -040025
26class BaseImageTest(tempest.test.BaseTestCase):
27 """Base test class for Image API tests."""
28
Andrea Frittolib21de6c2015-02-06 20:12:38 +000029 credentials = ['primary']
30
Matthew Treinishce3ef922013-03-11 14:02:46 -040031 @classmethod
Rohan Kanade3bbbed02015-02-05 18:18:28 +053032 def skip_checks(cls):
33 super(BaseImageTest, cls).skip_checks()
34 if not CONF.service_available.glance:
35 skip_msg = ("%s skipped as glance is not available" % cls.__name__)
36 raise cls.skipException(skip_msg)
37
38 @classmethod
39 def setup_credentials(cls):
Andrea Frittolib21de6c2015-02-06 20:12:38 +000040 cls.set_network_resources()
Rohan Kanade3bbbed02015-02-05 18:18:28 +053041 super(BaseImageTest, cls).setup_credentials()
Rohan Kanade3bbbed02015-02-05 18:18:28 +053042
43 @classmethod
Andrea Frittoli69a6b632014-09-15 13:14:53 +010044 def resource_setup(cls):
Andrea Frittoli69a6b632014-09-15 13:14:53 +010045 super(BaseImageTest, cls).resource_setup()
Matthew Treinishce3ef922013-03-11 14:02:46 -040046 cls.created_images = []
47
48 @classmethod
Andrea Frittoli69a6b632014-09-15 13:14:53 +010049 def resource_cleanup(cls):
Matthew Treinishce3ef922013-03-11 14:02:46 -040050 for image_id in cls.created_images:
Jordan Pittier9e227c52016-02-09 14:35:18 +010051 test_utils.call_and_ignore_notfound_exc(
52 cls.client.delete_image, image_id)
Matthew Treinishce3ef922013-03-11 14:02:46 -040053
54 for image_id in cls.created_images:
55 cls.client.wait_for_resource_deletion(image_id)
Andrea Frittoli69a6b632014-09-15 13:14:53 +010056 super(BaseImageTest, cls).resource_cleanup()
Matthew Treinishce3ef922013-03-11 14:02:46 -040057
58 @classmethod
Ken'ichi Ohmichi02bcdf32016-06-17 16:41:26 -070059 def create_image(cls, data=None, **kwargs):
Matthew Treinishce3ef922013-03-11 14:02:46 -040060 """Wrapper that returns a test image."""
Matthew Treinishce3ef922013-03-11 14:02:46 -040061
Ghanshyam86a31e12015-12-16 15:42:47 +090062 if 'name' not in kwargs:
zhufl08e42762016-10-18 16:07:56 +080063 name = data_utils.rand_name(cls.__name__ + "-image")
Ghanshyam86a31e12015-12-16 15:42:47 +090064 kwargs['name'] = name
Matthew Treinishce3ef922013-03-11 14:02:46 -040065
Ken'ichi Ohmichi02bcdf32016-06-17 16:41:26 -070066 params = cls._get_create_params(**kwargs)
67 if data:
68 # NOTE: On glance v1 API, the data should be passed on
69 # a header. Then here handles the data separately.
70 params['data'] = data
71
72 image = cls.client.create_image(**params)
John Warrenf3b3e952015-08-17 19:28:12 +000073 # Image objects returned by the v1 client have the image
74 # data inside a dict that is keyed against 'image'.
75 if 'image' in image:
76 image = image['image']
Matthew Treinishce3ef922013-03-11 14:02:46 -040077 cls.created_images.append(image['id'])
David Kranz34f18782015-01-06 13:43:55 -050078 return image
Matthew Treinishce3ef922013-03-11 14:02:46 -040079
Ken'ichi Ohmichi02bcdf32016-06-17 16:41:26 -070080 @classmethod
81 def _get_create_params(cls, **kwargs):
82 return kwargs
83
Matthew Treinishce3ef922013-03-11 14:02:46 -040084
85class BaseV1ImageTest(BaseImageTest):
86
87 @classmethod
Rohan Kanade3bbbed02015-02-05 18:18:28 +053088 def skip_checks(cls):
89 super(BaseV1ImageTest, cls).skip_checks()
Matthew Treinish5ba84e32014-01-29 16:52:57 +000090 if not CONF.image_feature_enabled.api_v1:
Matthew Treinishc0f768f2013-03-11 14:24:16 -040091 msg = "Glance API v1 not supported"
92 raise cls.skipException(msg)
Matthew Treinishce3ef922013-03-11 14:02:46 -040093
Rohan Kanade3bbbed02015-02-05 18:18:28 +053094 @classmethod
95 def setup_clients(cls):
96 super(BaseV1ImageTest, cls).setup_clients()
Jordan Pittier8160d312017-04-18 11:52:23 +020097 cls.client = cls.os_primary.image_client
Rohan Kanade3bbbed02015-02-05 18:18:28 +053098
Ken'ichi Ohmichi02bcdf32016-06-17 16:41:26 -070099 @classmethod
100 def _get_create_params(cls, **kwargs):
101 return {'headers': common_image.image_meta_to_headers(**kwargs)}
102
Matthew Treinishce3ef922013-03-11 14:02:46 -0400103
Attila Fazekasa709b762013-10-08 11:52:44 +0200104class BaseV1ImageMembersTest(BaseV1ImageTest):
Rohan Kanade3bbbed02015-02-05 18:18:28 +0530105
Andrea Frittolib21de6c2015-02-06 20:12:38 +0000106 credentials = ['primary', 'alt']
Rohan Kanade3bbbed02015-02-05 18:18:28 +0530107
108 @classmethod
109 def setup_clients(cls):
110 super(BaseV1ImageMembersTest, cls).setup_clients()
Jordan Pittier8160d312017-04-18 11:52:23 +0200111 cls.image_member_client = cls.os_primary.image_member_client
ghanshyame21b63e2016-06-07 16:53:04 +0900112 cls.alt_image_member_client = cls.os_alt.image_member_client
Rohan Kanade3bbbed02015-02-05 18:18:28 +0530113 cls.alt_img_cli = cls.os_alt.image_client
114
Attila Fazekasa709b762013-10-08 11:52:44 +0200115 @classmethod
Andrea Frittoli69a6b632014-09-15 13:14:53 +0100116 def resource_setup(cls):
117 super(BaseV1ImageMembersTest, cls).resource_setup()
ghanshyame21b63e2016-06-07 16:53:04 +0900118 cls.alt_tenant_id = cls.alt_image_member_client.tenant_id
Attila Fazekasa709b762013-10-08 11:52:44 +0200119
120 def _create_image(self):
Sirushti Murugesan12dc9732016-07-13 22:49:17 +0530121 image_file = six.BytesIO(data_utils.random_bytes())
David Kranz34f18782015-01-06 13:43:55 -0500122 image = self.create_image(container_format='bare',
123 disk_format='raw',
124 is_public=False,
125 data=image_file)
lkuchlanb3348792016-09-29 10:42:21 +0300126 return image['id']
Attila Fazekasa709b762013-10-08 11:52:44 +0200127
128
Matthew Treinishce3ef922013-03-11 14:02:46 -0400129class BaseV2ImageTest(BaseImageTest):
130
131 @classmethod
Rohan Kanade3bbbed02015-02-05 18:18:28 +0530132 def skip_checks(cls):
133 super(BaseV2ImageTest, cls).skip_checks()
Matthew Treinish5ba84e32014-01-29 16:52:57 +0000134 if not CONF.image_feature_enabled.api_v2:
Matthew Treinishc0f768f2013-03-11 14:24:16 -0400135 msg = "Glance API v2 not supported"
136 raise cls.skipException(msg)
Attila Fazekas689e2652013-10-07 18:06:57 +0200137
Rohan Kanade3bbbed02015-02-05 18:18:28 +0530138 @classmethod
139 def setup_clients(cls):
140 super(BaseV2ImageTest, cls).setup_clients()
Jordan Pittier8160d312017-04-18 11:52:23 +0200141 cls.client = cls.os_primary.image_client_v2
142 cls.namespaces_client = cls.os_primary.namespaces_client
143 cls.resource_types_client = cls.os_primary.resource_types_client
144 cls.namespace_properties_client =\
145 cls.os_primary.namespace_properties_client
146 cls.namespace_objects_client = cls.os_primary.namespace_objects_client
147 cls.namespace_tags_client = cls.os_primary.namespace_tags_client
148 cls.schemas_client = cls.os_primary.schemas_client
149 cls.versions_client = cls.os_primary.image_versions_client
Rohan Kanade3bbbed02015-02-05 18:18:28 +0530150
raiesmh089805fe42016-08-10 08:05:20 -0400151 def create_namespace(cls, namespace_name=None, visibility='public',
152 description='Tempest', protected=False,
153 **kwargs):
154 if not namespace_name:
155 namespace_name = data_utils.rand_name('test-ns')
156 kwargs.setdefault('display_name', namespace_name)
157 namespace = cls.namespaces_client.create_namespace(
158 namespace=namespace_name, visibility=visibility,
159 description=description, protected=protected, **kwargs)
160 cls.addCleanup(cls.namespaces_client.delete_namespace, namespace_name)
161 return namespace
162
Attila Fazekas689e2652013-10-07 18:06:57 +0200163
JordanP236da422014-01-16 14:38:07 +0000164class BaseV2MemberImageTest(BaseV2ImageTest):
Attila Fazekas689e2652013-10-07 18:06:57 +0200165
Andrea Frittolib21de6c2015-02-06 20:12:38 +0000166 credentials = ['primary', 'alt']
Rohan Kanade3bbbed02015-02-05 18:18:28 +0530167
168 @classmethod
169 def setup_clients(cls):
170 super(BaseV2MemberImageTest, cls).setup_clients()
Jordan Pittier8160d312017-04-18 11:52:23 +0200171 cls.image_member_client = cls.os_primary.image_member_client_v2
ghanshyam71db8f52016-06-07 17:02:38 +0900172 cls.alt_image_member_client = cls.os_alt.image_member_client_v2
Attila Fazekas689e2652013-10-07 18:06:57 +0200173 cls.alt_img_client = cls.os_alt.image_client_v2
Rohan Kanade3bbbed02015-02-05 18:18:28 +0530174
175 @classmethod
176 def resource_setup(cls):
177 super(BaseV2MemberImageTest, cls).resource_setup()
ghanshyam71db8f52016-06-07 17:02:38 +0900178 cls.alt_tenant_id = cls.alt_image_member_client.tenant_id
Attila Fazekas689e2652013-10-07 18:06:57 +0200179
180 def _list_image_ids_as_alt(self):
John Warrenf3b3e952015-08-17 19:28:12 +0000181 image_list = self.alt_img_client.list_images()['images']
Attila Fazekas689e2652013-10-07 18:06:57 +0200182 image_ids = map(lambda x: x['id'], image_list)
183 return image_ids
184
185 def _create_image(self):
zhuflc6ce5392016-08-17 14:34:37 +0800186 name = data_utils.rand_name(self.__class__.__name__ + '-image')
ghanshyam71db8f52016-06-07 17:02:38 +0900187 image = self.client.create_image(name=name,
188 container_format='bare',
189 disk_format='raw')
lkuchlanb3348792016-09-29 10:42:21 +0300190 self.addCleanup(self.client.delete_image, image['id'])
191 return image['id']
bkopilov81aaae72015-05-15 23:46:25 +0300192
193
194class BaseV1ImageAdminTest(BaseImageTest):
195 credentials = ['admin', 'primary']
196
197 @classmethod
198 def setup_clients(cls):
199 super(BaseV1ImageAdminTest, cls).setup_clients()
Jordan Pittier8160d312017-04-18 11:52:23 +0200200 cls.client = cls.os_primary.image_client
201 cls.admin_client = cls.os_admin.image_client
bkopilov81aaae72015-05-15 23:46:25 +0300202
203
204class BaseV2ImageAdminTest(BaseImageTest):
205 credentials = ['admin', 'primary']
206
207 @classmethod
208 def setup_clients(cls):
209 super(BaseV2ImageAdminTest, cls).setup_clients()
Jordan Pittier8160d312017-04-18 11:52:23 +0200210 cls.client = cls.os_primary.image_client_v2
211 cls.admin_client = cls.os_admin.image_client_v2