blob: bd04c0d1ce1d17cf1053e4210686af2fa81e0a62 [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()
96 cls.alt_img_cli = cls.os_alt.image_client
97
Attila Fazekasa709b762013-10-08 11:52:44 +020098 @classmethod
Andrea Frittoli69a6b632014-09-15 13:14:53 +010099 def resource_setup(cls):
100 super(BaseV1ImageMembersTest, cls).resource_setup()
Andrea Frittoli9612e812014-03-13 10:57:26 +0000101 cls.alt_tenant_id = cls.alt_img_cli.tenant_id
Attila Fazekasa709b762013-10-08 11:52:44 +0200102
103 def _create_image(self):
Matthew Treinishb0c65f22015-04-23 09:09:41 -0400104 image_file = moves.cStringIO(data_utils.random_bytes())
David Kranz34f18782015-01-06 13:43:55 -0500105 image = self.create_image(container_format='bare',
106 disk_format='raw',
107 is_public=False,
108 data=image_file)
Attila Fazekasa709b762013-10-08 11:52:44 +0200109 image_id = image['id']
110 return image_id
111
112
Matthew Treinishce3ef922013-03-11 14:02:46 -0400113class BaseV2ImageTest(BaseImageTest):
114
115 @classmethod
Rohan Kanade3bbbed02015-02-05 18:18:28 +0530116 def skip_checks(cls):
117 super(BaseV2ImageTest, cls).skip_checks()
Matthew Treinish5ba84e32014-01-29 16:52:57 +0000118 if not CONF.image_feature_enabled.api_v2:
Matthew Treinishc0f768f2013-03-11 14:24:16 -0400119 msg = "Glance API v2 not supported"
120 raise cls.skipException(msg)
Attila Fazekas689e2652013-10-07 18:06:57 +0200121
Rohan Kanade3bbbed02015-02-05 18:18:28 +0530122 @classmethod
123 def setup_clients(cls):
124 super(BaseV2ImageTest, cls).setup_clients()
125 cls.client = cls.os.image_client_v2
126
Attila Fazekas689e2652013-10-07 18:06:57 +0200127
JordanP236da422014-01-16 14:38:07 +0000128class BaseV2MemberImageTest(BaseV2ImageTest):
Attila Fazekas689e2652013-10-07 18:06:57 +0200129
Andrea Frittolib21de6c2015-02-06 20:12:38 +0000130 credentials = ['primary', 'alt']
Rohan Kanade3bbbed02015-02-05 18:18:28 +0530131
132 @classmethod
133 def setup_clients(cls):
134 super(BaseV2MemberImageTest, cls).setup_clients()
Attila Fazekas689e2652013-10-07 18:06:57 +0200135 cls.os_img_client = cls.os.image_client_v2
136 cls.alt_img_client = cls.os_alt.image_client_v2
Rohan Kanade3bbbed02015-02-05 18:18:28 +0530137
138 @classmethod
139 def resource_setup(cls):
140 super(BaseV2MemberImageTest, cls).resource_setup()
Zhi Kun Liud752c602014-05-16 13:25:28 +0800141 cls.alt_tenant_id = cls.alt_img_client.tenant_id
Attila Fazekas689e2652013-10-07 18:06:57 +0200142
143 def _list_image_ids_as_alt(self):
John Warrenf3b3e952015-08-17 19:28:12 +0000144 image_list = self.alt_img_client.list_images()['images']
Attila Fazekas689e2652013-10-07 18:06:57 +0200145 image_ids = map(lambda x: x['id'], image_list)
146 return image_ids
147
148 def _create_image(self):
149 name = data_utils.rand_name('image')
Ken'ichi Ohmichi25b30162015-11-30 11:27:13 +0000150 image = self.os_img_client.create_image(name=name,
David Kranz34f18782015-01-06 13:43:55 -0500151 container_format='bare',
152 disk_format='raw')
Attila Fazekas689e2652013-10-07 18:06:57 +0200153 image_id = image['id']
154 self.addCleanup(self.os_img_client.delete_image, image_id)
155 return image_id
bkopilov81aaae72015-05-15 23:46:25 +0300156
157
158class BaseV1ImageAdminTest(BaseImageTest):
159 credentials = ['admin', 'primary']
160
161 @classmethod
162 def setup_clients(cls):
163 super(BaseV1ImageAdminTest, cls).setup_clients()
164 cls.client = cls.os.image_client
165 cls.admin_client = cls.os_adm.image_client
166
167
168class BaseV2ImageAdminTest(BaseImageTest):
169 credentials = ['admin', 'primary']
170
171 @classmethod
172 def setup_clients(cls):
173 super(BaseV2ImageAdminTest, cls).setup_clients()
174 cls.client = cls.os.image_client_v2
175 cls.admin_client = cls.os_adm.image_client_v2