blob: da0ce83668ef07190e62d6bcbd13fdf6c590bbd9 [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
Doug Hellmann583ce2c2015-03-11 14:55:46 +000015from oslo_log import log as logging
Matthew Treinishb0c65f22015-04-23 09:09:41 -040016from six import moves
Masayuki Igawabfa07602015-01-20 18:47:17 +090017from tempest_lib import exceptions as lib_exc
Attila Fazekasa709b762013-10-08 11:52:44 +020018
Fei Long Wangd39431f2015-05-14 11:30:48 +120019from tempest.common.utils import data_utils
Matthew Treinish5ba84e32014-01-29 16:52:57 +000020from tempest import config
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 -040025LOG = logging.getLogger(__name__)
26
27
28class BaseImageTest(tempest.test.BaseTestCase):
29 """Base test class for Image API tests."""
30
Andrea Frittolib21de6c2015-02-06 20:12:38 +000031 credentials = ['primary']
32
Matthew Treinishce3ef922013-03-11 14:02:46 -040033 @classmethod
Rohan Kanade3bbbed02015-02-05 18:18:28 +053034 def skip_checks(cls):
35 super(BaseImageTest, cls).skip_checks()
36 if not CONF.service_available.glance:
37 skip_msg = ("%s skipped as glance is not available" % cls.__name__)
38 raise cls.skipException(skip_msg)
39
40 @classmethod
41 def setup_credentials(cls):
Andrea Frittolib21de6c2015-02-06 20:12:38 +000042 cls.set_network_resources()
Rohan Kanade3bbbed02015-02-05 18:18:28 +053043 super(BaseImageTest, cls).setup_credentials()
Rohan Kanade3bbbed02015-02-05 18:18:28 +053044
45 @classmethod
Andrea Frittoli69a6b632014-09-15 13:14:53 +010046 def resource_setup(cls):
Andrea Frittoli69a6b632014-09-15 13:14:53 +010047 super(BaseImageTest, cls).resource_setup()
Matthew Treinishce3ef922013-03-11 14:02:46 -040048 cls.created_images = []
49
50 @classmethod
Andrea Frittoli69a6b632014-09-15 13:14:53 +010051 def resource_cleanup(cls):
Matthew Treinishce3ef922013-03-11 14:02:46 -040052 for image_id in cls.created_images:
53 try:
54 cls.client.delete_image(image_id)
Masayuki Igawabfa07602015-01-20 18:47:17 +090055 except lib_exc.NotFound:
Matthew Treinishce3ef922013-03-11 14:02:46 -040056 pass
57
58 for image_id in cls.created_images:
59 cls.client.wait_for_resource_deletion(image_id)
Andrea Frittoli69a6b632014-09-15 13:14:53 +010060 super(BaseImageTest, cls).resource_cleanup()
Matthew Treinishce3ef922013-03-11 14:02:46 -040061
62 @classmethod
63 def create_image(cls, **kwargs):
64 """Wrapper that returns a test image."""
Attila Fazekas689e2652013-10-07 18:06:57 +020065 name = data_utils.rand_name(cls.__name__ + "-instance")
Matthew Treinishce3ef922013-03-11 14:02:46 -040066
67 if 'name' in kwargs:
68 name = kwargs.pop('name')
69
70 container_format = kwargs.pop('container_format')
71 disk_format = kwargs.pop('disk_format')
72
David Kranz34f18782015-01-06 13:43:55 -050073 image = cls.client.create_image(name, container_format,
74 disk_format, **kwargs)
John Warrenf3b3e952015-08-17 19:28:12 +000075 # Image objects returned by the v1 client have the image
76 # data inside a dict that is keyed against 'image'.
77 if 'image' in image:
78 image = image['image']
Matthew Treinishce3ef922013-03-11 14:02:46 -040079 cls.created_images.append(image['id'])
David Kranz34f18782015-01-06 13:43:55 -050080 return image
Matthew Treinishce3ef922013-03-11 14:02:46 -040081
82
83class BaseV1ImageTest(BaseImageTest):
84
85 @classmethod
Rohan Kanade3bbbed02015-02-05 18:18:28 +053086 def skip_checks(cls):
87 super(BaseV1ImageTest, cls).skip_checks()
Matthew Treinish5ba84e32014-01-29 16:52:57 +000088 if not CONF.image_feature_enabled.api_v1:
Matthew Treinishc0f768f2013-03-11 14:24:16 -040089 msg = "Glance API v1 not supported"
90 raise cls.skipException(msg)
Matthew Treinishce3ef922013-03-11 14:02:46 -040091
Rohan Kanade3bbbed02015-02-05 18:18:28 +053092 @classmethod
93 def setup_clients(cls):
94 super(BaseV1ImageTest, cls).setup_clients()
95 cls.client = cls.os.image_client
96
Matthew Treinishce3ef922013-03-11 14:02:46 -040097
Attila Fazekasa709b762013-10-08 11:52:44 +020098class BaseV1ImageMembersTest(BaseV1ImageTest):
Rohan Kanade3bbbed02015-02-05 18:18:28 +053099
Andrea Frittolib21de6c2015-02-06 20:12:38 +0000100 credentials = ['primary', 'alt']
Rohan Kanade3bbbed02015-02-05 18:18:28 +0530101
102 @classmethod
103 def setup_clients(cls):
104 super(BaseV1ImageMembersTest, cls).setup_clients()
105 cls.alt_img_cli = cls.os_alt.image_client
106
Attila Fazekasa709b762013-10-08 11:52:44 +0200107 @classmethod
Andrea Frittoli69a6b632014-09-15 13:14:53 +0100108 def resource_setup(cls):
109 super(BaseV1ImageMembersTest, cls).resource_setup()
Andrea Frittoli9612e812014-03-13 10:57:26 +0000110 cls.alt_tenant_id = cls.alt_img_cli.tenant_id
Attila Fazekasa709b762013-10-08 11:52:44 +0200111
112 def _create_image(self):
Matthew Treinishb0c65f22015-04-23 09:09:41 -0400113 image_file = moves.cStringIO(data_utils.random_bytes())
David Kranz34f18782015-01-06 13:43:55 -0500114 image = self.create_image(container_format='bare',
115 disk_format='raw',
116 is_public=False,
117 data=image_file)
Attila Fazekasa709b762013-10-08 11:52:44 +0200118 image_id = image['id']
119 return image_id
120
121
Matthew Treinishce3ef922013-03-11 14:02:46 -0400122class BaseV2ImageTest(BaseImageTest):
123
124 @classmethod
Rohan Kanade3bbbed02015-02-05 18:18:28 +0530125 def skip_checks(cls):
126 super(BaseV2ImageTest, cls).skip_checks()
Matthew Treinish5ba84e32014-01-29 16:52:57 +0000127 if not CONF.image_feature_enabled.api_v2:
Matthew Treinishc0f768f2013-03-11 14:24:16 -0400128 msg = "Glance API v2 not supported"
129 raise cls.skipException(msg)
Attila Fazekas689e2652013-10-07 18:06:57 +0200130
Rohan Kanade3bbbed02015-02-05 18:18:28 +0530131 @classmethod
132 def setup_clients(cls):
133 super(BaseV2ImageTest, cls).setup_clients()
134 cls.client = cls.os.image_client_v2
135
Attila Fazekas689e2652013-10-07 18:06:57 +0200136
JordanP236da422014-01-16 14:38:07 +0000137class BaseV2MemberImageTest(BaseV2ImageTest):
Attila Fazekas689e2652013-10-07 18:06:57 +0200138
Andrea Frittolib21de6c2015-02-06 20:12:38 +0000139 credentials = ['primary', 'alt']
Rohan Kanade3bbbed02015-02-05 18:18:28 +0530140
141 @classmethod
142 def setup_clients(cls):
143 super(BaseV2MemberImageTest, cls).setup_clients()
Attila Fazekas689e2652013-10-07 18:06:57 +0200144 cls.os_img_client = cls.os.image_client_v2
145 cls.alt_img_client = cls.os_alt.image_client_v2
Rohan Kanade3bbbed02015-02-05 18:18:28 +0530146
147 @classmethod
148 def resource_setup(cls):
149 super(BaseV2MemberImageTest, cls).resource_setup()
Zhi Kun Liud752c602014-05-16 13:25:28 +0800150 cls.alt_tenant_id = cls.alt_img_client.tenant_id
Attila Fazekas689e2652013-10-07 18:06:57 +0200151
152 def _list_image_ids_as_alt(self):
John Warrenf3b3e952015-08-17 19:28:12 +0000153 image_list = self.alt_img_client.list_images()['images']
Attila Fazekas689e2652013-10-07 18:06:57 +0200154 image_ids = map(lambda x: x['id'], image_list)
155 return image_ids
156
157 def _create_image(self):
158 name = data_utils.rand_name('image')
David Kranz34f18782015-01-06 13:43:55 -0500159 image = self.os_img_client.create_image(name,
160 container_format='bare',
161 disk_format='raw')
Attila Fazekas689e2652013-10-07 18:06:57 +0200162 image_id = image['id']
163 self.addCleanup(self.os_img_client.delete_image, image_id)
164 return image_id
bkopilov81aaae72015-05-15 23:46:25 +0300165
166
167class BaseV1ImageAdminTest(BaseImageTest):
168 credentials = ['admin', 'primary']
169
170 @classmethod
171 def setup_clients(cls):
172 super(BaseV1ImageAdminTest, cls).setup_clients()
173 cls.client = cls.os.image_client
174 cls.admin_client = cls.os_adm.image_client
175
176
177class BaseV2ImageAdminTest(BaseImageTest):
178 credentials = ['admin', 'primary']
179
180 @classmethod
181 def setup_clients(cls):
182 super(BaseV2ImageAdminTest, cls).setup_clients()
183 cls.client = cls.os.image_client_v2
184 cls.admin_client = cls.os_adm.image_client_v2