blob: 06839367d5303800df095c1e10ac077a29f6c989 [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
Andrea Frittoli (andreaf)db9672e2016-02-23 14:07:24 -050019from tempest.lib import exceptions as lib_exc
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:
50 try:
51 cls.client.delete_image(image_id)
Masayuki Igawabfa07602015-01-20 18:47:17 +090052 except lib_exc.NotFound:
Matthew Treinishce3ef922013-03-11 14:02:46 -040053 pass
54
55 for image_id in cls.created_images:
56 cls.client.wait_for_resource_deletion(image_id)
Andrea Frittoli69a6b632014-09-15 13:14:53 +010057 super(BaseImageTest, cls).resource_cleanup()
Matthew Treinishce3ef922013-03-11 14:02:46 -040058
59 @classmethod
60 def create_image(cls, **kwargs):
61 """Wrapper that returns a test image."""
Matthew Treinishce3ef922013-03-11 14:02:46 -040062
Ghanshyam86a31e12015-12-16 15:42:47 +090063 if 'name' not in kwargs:
64 name = data_utils.rand_name(cls.__name__ + "-instance")
65 kwargs['name'] = name
Matthew Treinishce3ef922013-03-11 14:02:46 -040066
Ghanshyam86a31e12015-12-16 15:42:47 +090067 image = cls.client.create_image(**kwargs)
John Warrenf3b3e952015-08-17 19:28:12 +000068 # Image objects returned by the v1 client have the image
69 # data inside a dict that is keyed against 'image'.
70 if 'image' in image:
71 image = image['image']
Matthew Treinishce3ef922013-03-11 14:02:46 -040072 cls.created_images.append(image['id'])
David Kranz34f18782015-01-06 13:43:55 -050073 return image
Matthew Treinishce3ef922013-03-11 14:02:46 -040074
75
76class BaseV1ImageTest(BaseImageTest):
77
78 @classmethod
Rohan Kanade3bbbed02015-02-05 18:18:28 +053079 def skip_checks(cls):
80 super(BaseV1ImageTest, cls).skip_checks()
Matthew Treinish5ba84e32014-01-29 16:52:57 +000081 if not CONF.image_feature_enabled.api_v1:
Matthew Treinishc0f768f2013-03-11 14:24:16 -040082 msg = "Glance API v1 not supported"
83 raise cls.skipException(msg)
Matthew Treinishce3ef922013-03-11 14:02:46 -040084
Rohan Kanade3bbbed02015-02-05 18:18:28 +053085 @classmethod
86 def setup_clients(cls):
87 super(BaseV1ImageTest, cls).setup_clients()
88 cls.client = cls.os.image_client
89
Matthew Treinishce3ef922013-03-11 14:02:46 -040090
Attila Fazekasa709b762013-10-08 11:52:44 +020091class BaseV1ImageMembersTest(BaseV1ImageTest):
Rohan Kanade3bbbed02015-02-05 18:18:28 +053092
Andrea Frittolib21de6c2015-02-06 20:12:38 +000093 credentials = ['primary', 'alt']
Rohan Kanade3bbbed02015-02-05 18:18:28 +053094
95 @classmethod
96 def setup_clients(cls):
97 super(BaseV1ImageMembersTest, cls).setup_clients()
98 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()
Andrea Frittoli9612e812014-03-13 10:57:26 +0000103 cls.alt_tenant_id = cls.alt_img_cli.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
128
Attila Fazekas689e2652013-10-07 18:06:57 +0200129
JordanP236da422014-01-16 14:38:07 +0000130class BaseV2MemberImageTest(BaseV2ImageTest):
Attila Fazekas689e2652013-10-07 18:06:57 +0200131
Andrea Frittolib21de6c2015-02-06 20:12:38 +0000132 credentials = ['primary', 'alt']
Rohan Kanade3bbbed02015-02-05 18:18:28 +0530133
134 @classmethod
135 def setup_clients(cls):
136 super(BaseV2MemberImageTest, cls).setup_clients()
Attila Fazekas689e2652013-10-07 18:06:57 +0200137 cls.os_img_client = cls.os.image_client_v2
138 cls.alt_img_client = cls.os_alt.image_client_v2
Rohan Kanade3bbbed02015-02-05 18:18:28 +0530139
140 @classmethod
141 def resource_setup(cls):
142 super(BaseV2MemberImageTest, cls).resource_setup()
Zhi Kun Liud752c602014-05-16 13:25:28 +0800143 cls.alt_tenant_id = cls.alt_img_client.tenant_id
Attila Fazekas689e2652013-10-07 18:06:57 +0200144
145 def _list_image_ids_as_alt(self):
John Warrenf3b3e952015-08-17 19:28:12 +0000146 image_list = self.alt_img_client.list_images()['images']
Attila Fazekas689e2652013-10-07 18:06:57 +0200147 image_ids = map(lambda x: x['id'], image_list)
148 return image_ids
149
150 def _create_image(self):
151 name = data_utils.rand_name('image')
Ken'ichi Ohmichi25b30162015-11-30 11:27:13 +0000152 image = self.os_img_client.create_image(name=name,
David Kranz34f18782015-01-06 13:43:55 -0500153 container_format='bare',
154 disk_format='raw')
Attila Fazekas689e2652013-10-07 18:06:57 +0200155 image_id = image['id']
156 self.addCleanup(self.os_img_client.delete_image, image_id)
157 return image_id
bkopilov81aaae72015-05-15 23:46:25 +0300158
159
160class BaseV1ImageAdminTest(BaseImageTest):
161 credentials = ['admin', 'primary']
162
163 @classmethod
164 def setup_clients(cls):
165 super(BaseV1ImageAdminTest, cls).setup_clients()
166 cls.client = cls.os.image_client
167 cls.admin_client = cls.os_adm.image_client
168
169
170class BaseV2ImageAdminTest(BaseImageTest):
171 credentials = ['admin', 'primary']
172
173 @classmethod
174 def setup_clients(cls):
175 super(BaseV2ImageAdminTest, cls).setup_clients()
176 cls.client = cls.os.image_client_v2
177 cls.admin_client = cls.os_adm.image_client_v2