blob: d3dc19a86c33c906b007471c19b03bca52090840 [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
PranaliD491d63e2020-08-18 13:29:21 +000021from tempest.lib import exceptions
Matthew Treinishce3ef922013-03-11 14:02:46 -040022import tempest.test
23
Matthew Treinish5ba84e32014-01-29 16:52:57 +000024CONF = config.CONF
25
Matthew Treinishce3ef922013-03-11 14:02:46 -040026
27class BaseImageTest(tempest.test.BaseTestCase):
28 """Base test class for Image API tests."""
29
Andrea Frittolib21de6c2015-02-06 20:12:38 +000030 credentials = ['primary']
31
Matthew Treinishce3ef922013-03-11 14:02:46 -040032 @classmethod
Rohan Kanade3bbbed02015-02-05 18:18:28 +053033 def skip_checks(cls):
34 super(BaseImageTest, cls).skip_checks()
35 if not CONF.service_available.glance:
36 skip_msg = ("%s skipped as glance is not available" % cls.__name__)
37 raise cls.skipException(skip_msg)
38
39 @classmethod
40 def setup_credentials(cls):
Andrea Frittolib21de6c2015-02-06 20:12:38 +000041 cls.set_network_resources()
Rohan Kanade3bbbed02015-02-05 18:18:28 +053042 super(BaseImageTest, cls).setup_credentials()
Rohan Kanade3bbbed02015-02-05 18:18:28 +053043
44 @classmethod
Andrea Frittoli69a6b632014-09-15 13:14:53 +010045 def resource_setup(cls):
Andrea Frittoli69a6b632014-09-15 13:14:53 +010046 super(BaseImageTest, cls).resource_setup()
Matthew Treinishce3ef922013-03-11 14:02:46 -040047 cls.created_images = []
48
49 @classmethod
Ken'ichi Ohmichi02bcdf32016-06-17 16:41:26 -070050 def create_image(cls, data=None, **kwargs):
Matthew Treinishce3ef922013-03-11 14:02:46 -040051 """Wrapper that returns a test image."""
Matthew Treinishce3ef922013-03-11 14:02:46 -040052
Ghanshyam86a31e12015-12-16 15:42:47 +090053 if 'name' not in kwargs:
zhufl08e42762016-10-18 16:07:56 +080054 name = data_utils.rand_name(cls.__name__ + "-image")
Ghanshyam86a31e12015-12-16 15:42:47 +090055 kwargs['name'] = name
Matthew Treinishce3ef922013-03-11 14:02:46 -040056
Ken'ichi Ohmichi02bcdf32016-06-17 16:41:26 -070057 params = cls._get_create_params(**kwargs)
58 if data:
59 # NOTE: On glance v1 API, the data should be passed on
60 # a header. Then here handles the data separately.
61 params['data'] = data
62
63 image = cls.client.create_image(**params)
John Warrenf3b3e952015-08-17 19:28:12 +000064 # Image objects returned by the v1 client have the image
65 # data inside a dict that is keyed against 'image'.
66 if 'image' in image:
67 image = image['image']
Matthew Treinishce3ef922013-03-11 14:02:46 -040068 cls.created_images.append(image['id'])
zhuflbe8b8102017-11-06 15:22:29 +080069 cls.addClassResourceCleanup(cls.client.wait_for_resource_deletion,
70 image['id'])
71 cls.addClassResourceCleanup(test_utils.call_and_ignore_notfound_exc,
72 cls.client.delete_image, image['id'])
David Kranz34f18782015-01-06 13:43:55 -050073 return image
Matthew Treinishce3ef922013-03-11 14:02:46 -040074
Ken'ichi Ohmichi02bcdf32016-06-17 16:41:26 -070075 @classmethod
76 def _get_create_params(cls, **kwargs):
77 return kwargs
78
Matthew Treinishce3ef922013-03-11 14:02:46 -040079
80class BaseV1ImageTest(BaseImageTest):
81
82 @classmethod
Rohan Kanade3bbbed02015-02-05 18:18:28 +053083 def skip_checks(cls):
84 super(BaseV1ImageTest, cls).skip_checks()
Matthew Treinish5ba84e32014-01-29 16:52:57 +000085 if not CONF.image_feature_enabled.api_v1:
Matthew Treinishc0f768f2013-03-11 14:24:16 -040086 msg = "Glance API v1 not supported"
87 raise cls.skipException(msg)
Matthew Treinishce3ef922013-03-11 14:02:46 -040088
Rohan Kanade3bbbed02015-02-05 18:18:28 +053089 @classmethod
90 def setup_clients(cls):
91 super(BaseV1ImageTest, cls).setup_clients()
Jordan Pittier8160d312017-04-18 11:52:23 +020092 cls.client = cls.os_primary.image_client
Rohan Kanade3bbbed02015-02-05 18:18:28 +053093
Ken'ichi Ohmichi02bcdf32016-06-17 16:41:26 -070094 @classmethod
95 def _get_create_params(cls, **kwargs):
96 return {'headers': common_image.image_meta_to_headers(**kwargs)}
97
Matthew Treinishce3ef922013-03-11 14:02:46 -040098
Attila Fazekasa709b762013-10-08 11:52:44 +020099class BaseV1ImageMembersTest(BaseV1ImageTest):
Rohan Kanade3bbbed02015-02-05 18:18:28 +0530100
Andrea Frittolib21de6c2015-02-06 20:12:38 +0000101 credentials = ['primary', 'alt']
Rohan Kanade3bbbed02015-02-05 18:18:28 +0530102
103 @classmethod
104 def setup_clients(cls):
105 super(BaseV1ImageMembersTest, cls).setup_clients()
Jordan Pittier8160d312017-04-18 11:52:23 +0200106 cls.image_member_client = cls.os_primary.image_member_client
ghanshyame21b63e2016-06-07 16:53:04 +0900107 cls.alt_image_member_client = cls.os_alt.image_member_client
Rohan Kanade3bbbed02015-02-05 18:18:28 +0530108 cls.alt_img_cli = cls.os_alt.image_client
109
Attila Fazekasa709b762013-10-08 11:52:44 +0200110 @classmethod
Andrea Frittoli69a6b632014-09-15 13:14:53 +0100111 def resource_setup(cls):
112 super(BaseV1ImageMembersTest, cls).resource_setup()
ghanshyame21b63e2016-06-07 16:53:04 +0900113 cls.alt_tenant_id = cls.alt_image_member_client.tenant_id
Attila Fazekasa709b762013-10-08 11:52:44 +0200114
115 def _create_image(self):
Sirushti Murugesan12dc9732016-07-13 22:49:17 +0530116 image_file = six.BytesIO(data_utils.random_bytes())
David Kranz34f18782015-01-06 13:43:55 -0500117 image = self.create_image(container_format='bare',
118 disk_format='raw',
119 is_public=False,
120 data=image_file)
lkuchlanb3348792016-09-29 10:42:21 +0300121 return image['id']
Attila Fazekasa709b762013-10-08 11:52:44 +0200122
123
Matthew Treinishce3ef922013-03-11 14:02:46 -0400124class BaseV2ImageTest(BaseImageTest):
125
126 @classmethod
Rohan Kanade3bbbed02015-02-05 18:18:28 +0530127 def skip_checks(cls):
128 super(BaseV2ImageTest, cls).skip_checks()
Matthew Treinish5ba84e32014-01-29 16:52:57 +0000129 if not CONF.image_feature_enabled.api_v2:
Matthew Treinishc0f768f2013-03-11 14:24:16 -0400130 msg = "Glance API v2 not supported"
131 raise cls.skipException(msg)
Attila Fazekas689e2652013-10-07 18:06:57 +0200132
Rohan Kanade3bbbed02015-02-05 18:18:28 +0530133 @classmethod
134 def setup_clients(cls):
135 super(BaseV2ImageTest, cls).setup_clients()
Jordan Pittier8160d312017-04-18 11:52:23 +0200136 cls.client = cls.os_primary.image_client_v2
137 cls.namespaces_client = cls.os_primary.namespaces_client
138 cls.resource_types_client = cls.os_primary.resource_types_client
139 cls.namespace_properties_client =\
140 cls.os_primary.namespace_properties_client
141 cls.namespace_objects_client = cls.os_primary.namespace_objects_client
142 cls.namespace_tags_client = cls.os_primary.namespace_tags_client
143 cls.schemas_client = cls.os_primary.schemas_client
144 cls.versions_client = cls.os_primary.image_versions_client
Rohan Kanade3bbbed02015-02-05 18:18:28 +0530145
Jan Kasiake2556d62018-02-07 21:27:55 -0500146 def create_namespace(self, namespace_name=None, visibility='public',
raiesmh089805fe42016-08-10 08:05:20 -0400147 description='Tempest', protected=False,
148 **kwargs):
149 if not namespace_name:
150 namespace_name = data_utils.rand_name('test-ns')
151 kwargs.setdefault('display_name', namespace_name)
Jan Kasiake2556d62018-02-07 21:27:55 -0500152 namespace = self.namespaces_client.create_namespace(
raiesmh089805fe42016-08-10 08:05:20 -0400153 namespace=namespace_name, visibility=visibility,
154 description=description, protected=protected, **kwargs)
Jan Kasiake2556d62018-02-07 21:27:55 -0500155 self.addCleanup(self.namespaces_client.delete_namespace,
156 namespace_name)
raiesmh089805fe42016-08-10 08:05:20 -0400157 return namespace
158
PranaliD491d63e2020-08-18 13:29:21 +0000159 @classmethod
160 def get_available_stores(cls):
161 stores = []
162 try:
163 stores = cls.client.info_stores()['stores']
164 except exceptions.NotFound:
165 pass
166 return stores
167
Attila Fazekas689e2652013-10-07 18:06:57 +0200168
JordanP236da422014-01-16 14:38:07 +0000169class BaseV2MemberImageTest(BaseV2ImageTest):
Attila Fazekas689e2652013-10-07 18:06:57 +0200170
Andrea Frittolib21de6c2015-02-06 20:12:38 +0000171 credentials = ['primary', 'alt']
Rohan Kanade3bbbed02015-02-05 18:18:28 +0530172
173 @classmethod
174 def setup_clients(cls):
175 super(BaseV2MemberImageTest, cls).setup_clients()
Jordan Pittier8160d312017-04-18 11:52:23 +0200176 cls.image_member_client = cls.os_primary.image_member_client_v2
ghanshyam71db8f52016-06-07 17:02:38 +0900177 cls.alt_image_member_client = cls.os_alt.image_member_client_v2
Attila Fazekas689e2652013-10-07 18:06:57 +0200178 cls.alt_img_client = cls.os_alt.image_client_v2
Rohan Kanade3bbbed02015-02-05 18:18:28 +0530179
180 @classmethod
181 def resource_setup(cls):
182 super(BaseV2MemberImageTest, cls).resource_setup()
ghanshyam71db8f52016-06-07 17:02:38 +0900183 cls.alt_tenant_id = cls.alt_image_member_client.tenant_id
Attila Fazekas689e2652013-10-07 18:06:57 +0200184
185 def _list_image_ids_as_alt(self):
John Warrenf3b3e952015-08-17 19:28:12 +0000186 image_list = self.alt_img_client.list_images()['images']
Attila Fazekas689e2652013-10-07 18:06:57 +0200187 image_ids = map(lambda x: x['id'], image_list)
188 return image_ids
189
190 def _create_image(self):
zhuflc6ce5392016-08-17 14:34:37 +0800191 name = data_utils.rand_name(self.__class__.__name__ + '-image')
ghanshyam71db8f52016-06-07 17:02:38 +0900192 image = self.client.create_image(name=name,
193 container_format='bare',
194 disk_format='raw')
lkuchlanb3348792016-09-29 10:42:21 +0300195 self.addCleanup(self.client.delete_image, image['id'])
196 return image['id']
lkuchlan3bd6e272018-01-25 11:16:10 +0200197
198
199class BaseV2ImageAdminTest(BaseV2ImageTest):
200
201 credentials = ['admin', 'primary']
202
203 @classmethod
204 def setup_clients(cls):
205 super(BaseV2ImageAdminTest, cls).setup_clients()
206 cls.admin_client = cls.os_admin.image_client_v2