blob: 307d6d6033de2bd2bf3ab6a53e0f2d23a7bc4b9d [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
Matthew Treinishb0c65f22015-04-23 09:09:41 -040015from six import moves
Attila Fazekasa709b762013-10-08 11:52:44 +020016
Fei Long Wangd39431f2015-05-14 11:30:48 +120017from tempest.common.utils import data_utils
Matthew Treinish5ba84e32014-01-29 16:52:57 +000018from tempest import config
Jordan Pittier9e227c52016-02-09 14:35:18 +010019from tempest.lib.common.utils import test_utils
Matthew Treinishce3ef922013-03-11 14:02:46 -040020import tempest.test
21
Matthew Treinish5ba84e32014-01-29 16:52:57 +000022CONF = config.CONF
23
Matthew Treinishce3ef922013-03-11 14:02:46 -040024
25class BaseImageTest(tempest.test.BaseTestCase):
26 """Base test class for Image API tests."""
27
Andrea Frittolib21de6c2015-02-06 20:12:38 +000028 credentials = ['primary']
29
Matthew Treinishce3ef922013-03-11 14:02:46 -040030 @classmethod
Rohan Kanade3bbbed02015-02-05 18:18:28 +053031 def skip_checks(cls):
32 super(BaseImageTest, cls).skip_checks()
33 if not CONF.service_available.glance:
34 skip_msg = ("%s skipped as glance is not available" % cls.__name__)
35 raise cls.skipException(skip_msg)
36
37 @classmethod
38 def setup_credentials(cls):
Andrea Frittolib21de6c2015-02-06 20:12:38 +000039 cls.set_network_resources()
Rohan Kanade3bbbed02015-02-05 18:18:28 +053040 super(BaseImageTest, cls).setup_credentials()
Rohan Kanade3bbbed02015-02-05 18:18:28 +053041
42 @classmethod
Andrea Frittoli69a6b632014-09-15 13:14:53 +010043 def resource_setup(cls):
Andrea Frittoli69a6b632014-09-15 13:14:53 +010044 super(BaseImageTest, cls).resource_setup()
Matthew Treinishce3ef922013-03-11 14:02:46 -040045 cls.created_images = []
46
47 @classmethod
Andrea Frittoli69a6b632014-09-15 13:14:53 +010048 def resource_cleanup(cls):
Matthew Treinishce3ef922013-03-11 14:02:46 -040049 for image_id in cls.created_images:
Jordan Pittier9e227c52016-02-09 14:35:18 +010050 test_utils.call_and_ignore_notfound_exc(
51 cls.client.delete_image, image_id)
Matthew Treinishce3ef922013-03-11 14:02:46 -040052
53 for image_id in cls.created_images:
54 cls.client.wait_for_resource_deletion(image_id)
Andrea Frittoli69a6b632014-09-15 13:14:53 +010055 super(BaseImageTest, cls).resource_cleanup()
Matthew Treinishce3ef922013-03-11 14:02:46 -040056
57 @classmethod
58 def create_image(cls, **kwargs):
59 """Wrapper that returns a test image."""
Matthew Treinishce3ef922013-03-11 14:02:46 -040060
Ghanshyam86a31e12015-12-16 15:42:47 +090061 if 'name' not in kwargs:
62 name = data_utils.rand_name(cls.__name__ + "-instance")
63 kwargs['name'] = name
Matthew Treinishce3ef922013-03-11 14:02:46 -040064
Ghanshyam86a31e12015-12-16 15:42:47 +090065 image = cls.client.create_image(**kwargs)
John Warrenf3b3e952015-08-17 19:28:12 +000066 # Image objects returned by the v1 client have the image
67 # data inside a dict that is keyed against 'image'.
68 if 'image' in image:
69 image = image['image']
Matthew Treinishce3ef922013-03-11 14:02:46 -040070 cls.created_images.append(image['id'])
David Kranz34f18782015-01-06 13:43:55 -050071 return image
Matthew Treinishce3ef922013-03-11 14:02:46 -040072
73
74class BaseV1ImageTest(BaseImageTest):
75
76 @classmethod
Rohan Kanade3bbbed02015-02-05 18:18:28 +053077 def skip_checks(cls):
78 super(BaseV1ImageTest, cls).skip_checks()
Matthew Treinish5ba84e32014-01-29 16:52:57 +000079 if not CONF.image_feature_enabled.api_v1:
Matthew Treinishc0f768f2013-03-11 14:24:16 -040080 msg = "Glance API v1 not supported"
81 raise cls.skipException(msg)
Matthew Treinishce3ef922013-03-11 14:02:46 -040082
Rohan Kanade3bbbed02015-02-05 18:18:28 +053083 @classmethod
84 def setup_clients(cls):
85 super(BaseV1ImageTest, cls).setup_clients()
86 cls.client = cls.os.image_client
87
Matthew Treinishce3ef922013-03-11 14:02:46 -040088
Attila Fazekasa709b762013-10-08 11:52:44 +020089class BaseV1ImageMembersTest(BaseV1ImageTest):
Rohan Kanade3bbbed02015-02-05 18:18:28 +053090
Andrea Frittolib21de6c2015-02-06 20:12:38 +000091 credentials = ['primary', 'alt']
Rohan Kanade3bbbed02015-02-05 18:18:28 +053092
93 @classmethod
94 def setup_clients(cls):
95 super(BaseV1ImageMembersTest, cls).setup_clients()
ghanshyame21b63e2016-06-07 16:53:04 +090096 cls.image_member_client = cls.os.image_member_client
97 cls.alt_image_member_client = cls.os_alt.image_member_client
Rohan Kanade3bbbed02015-02-05 18:18:28 +053098 cls.alt_img_cli = cls.os_alt.image_client
99
Attila Fazekasa709b762013-10-08 11:52:44 +0200100 @classmethod
Andrea Frittoli69a6b632014-09-15 13:14:53 +0100101 def resource_setup(cls):
102 super(BaseV1ImageMembersTest, cls).resource_setup()
ghanshyame21b63e2016-06-07 16:53:04 +0900103 cls.alt_tenant_id = cls.alt_image_member_client.tenant_id
Attila Fazekasa709b762013-10-08 11:52:44 +0200104
105 def _create_image(self):
Matthew Treinishb0c65f22015-04-23 09:09:41 -0400106 image_file = moves.cStringIO(data_utils.random_bytes())
David Kranz34f18782015-01-06 13:43:55 -0500107 image = self.create_image(container_format='bare',
108 disk_format='raw',
109 is_public=False,
110 data=image_file)
Attila Fazekasa709b762013-10-08 11:52:44 +0200111 image_id = image['id']
112 return image_id
113
114
Matthew Treinishce3ef922013-03-11 14:02:46 -0400115class BaseV2ImageTest(BaseImageTest):
116
117 @classmethod
Rohan Kanade3bbbed02015-02-05 18:18:28 +0530118 def skip_checks(cls):
119 super(BaseV2ImageTest, cls).skip_checks()
Matthew Treinish5ba84e32014-01-29 16:52:57 +0000120 if not CONF.image_feature_enabled.api_v2:
Matthew Treinishc0f768f2013-03-11 14:24:16 -0400121 msg = "Glance API v2 not supported"
122 raise cls.skipException(msg)
Attila Fazekas689e2652013-10-07 18:06:57 +0200123
Rohan Kanade3bbbed02015-02-05 18:18:28 +0530124 @classmethod
125 def setup_clients(cls):
126 super(BaseV2ImageTest, cls).setup_clients()
127 cls.client = cls.os.image_client_v2
Ken'ichi Ohmichi02886972016-06-06 17:21:27 -0700128 cls.namespaces_client = cls.os.namespaces_client
Ken'ichi Ohmichi68b4ce62016-06-07 11:56:51 -0700129 cls.resource_types_client = cls.os.resource_types_client
Ken'ichi Ohmichi190b24e2016-06-07 23:20:09 +0900130 cls.schemas_client = cls.os.schemas_client
Rohan Kanade3bbbed02015-02-05 18:18:28 +0530131
Attila Fazekas689e2652013-10-07 18:06:57 +0200132
JordanP236da422014-01-16 14:38:07 +0000133class BaseV2MemberImageTest(BaseV2ImageTest):
Attila Fazekas689e2652013-10-07 18:06:57 +0200134
Andrea Frittolib21de6c2015-02-06 20:12:38 +0000135 credentials = ['primary', 'alt']
Rohan Kanade3bbbed02015-02-05 18:18:28 +0530136
137 @classmethod
138 def setup_clients(cls):
139 super(BaseV2MemberImageTest, cls).setup_clients()
ghanshyam71db8f52016-06-07 17:02:38 +0900140 cls.os_image_member_client = cls.os.image_member_client_v2
141 cls.alt_image_member_client = cls.os_alt.image_member_client_v2
Attila Fazekas689e2652013-10-07 18:06:57 +0200142 cls.alt_img_client = cls.os_alt.image_client_v2
Rohan Kanade3bbbed02015-02-05 18:18:28 +0530143
144 @classmethod
145 def resource_setup(cls):
146 super(BaseV2MemberImageTest, cls).resource_setup()
ghanshyam71db8f52016-06-07 17:02:38 +0900147 cls.alt_tenant_id = cls.alt_image_member_client.tenant_id
Attila Fazekas689e2652013-10-07 18:06:57 +0200148
149 def _list_image_ids_as_alt(self):
John Warrenf3b3e952015-08-17 19:28:12 +0000150 image_list = self.alt_img_client.list_images()['images']
Attila Fazekas689e2652013-10-07 18:06:57 +0200151 image_ids = map(lambda x: x['id'], image_list)
152 return image_ids
153
154 def _create_image(self):
155 name = data_utils.rand_name('image')
ghanshyam71db8f52016-06-07 17:02:38 +0900156 image = self.client.create_image(name=name,
157 container_format='bare',
158 disk_format='raw')
Attila Fazekas689e2652013-10-07 18:06:57 +0200159 image_id = image['id']
ghanshyam71db8f52016-06-07 17:02:38 +0900160 self.addCleanup(self.client.delete_image, image_id)
Attila Fazekas689e2652013-10-07 18:06:57 +0200161 return image_id
bkopilov81aaae72015-05-15 23:46:25 +0300162
163
164class BaseV1ImageAdminTest(BaseImageTest):
165 credentials = ['admin', 'primary']
166
167 @classmethod
168 def setup_clients(cls):
169 super(BaseV1ImageAdminTest, cls).setup_clients()
170 cls.client = cls.os.image_client
171 cls.admin_client = cls.os_adm.image_client
172
173
174class BaseV2ImageAdminTest(BaseImageTest):
175 credentials = ['admin', 'primary']
176
177 @classmethod
178 def setup_clients(cls):
179 super(BaseV2ImageAdminTest, cls).setup_clients()
180 cls.client = cls.os.image_client_v2
181 cls.admin_client = cls.os_adm.image_client_v2