blob: 37b848cd8428bd66fc5d6b8e3a36dd2020c3f089 [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
Attila Fazekasa709b762013-10-08 11:52:44 +020015import cStringIO as StringIO
16
Matthew Treinishce3ef922013-03-11 14:02:46 -040017from tempest import clients
Matthew Treinishb86cda92013-07-29 11:22:23 -040018from tempest.common import isolated_creds
Attila Fazekas689e2652013-10-07 18:06:57 +020019from tempest.common.utils import data_utils
Matthew Treinish5ba84e32014-01-29 16:52:57 +000020from tempest import config
Matthew Treinishce3ef922013-03-11 14:02:46 -040021from tempest import exceptions
Matthew Treinishf4a9b0f2013-07-26 16:58:26 -040022from tempest.openstack.common import log as logging
Matthew Treinishce3ef922013-03-11 14:02:46 -040023import tempest.test
24
Matthew Treinish5ba84e32014-01-29 16:52:57 +000025CONF = config.CONF
26
Matthew Treinishce3ef922013-03-11 14:02:46 -040027LOG = logging.getLogger(__name__)
28
29
30class BaseImageTest(tempest.test.BaseTestCase):
31 """Base test class for Image API tests."""
32
33 @classmethod
34 def setUpClass(cls):
Sylvain Afchain11b99d02014-01-16 00:42:33 +010035 cls.set_network_resources()
Attila Fazekasf86fa312013-07-30 19:56:39 +020036 super(BaseImageTest, cls).setUpClass()
Matthew Treinishce3ef922013-03-11 14:02:46 -040037 cls.created_images = []
Matthew Treinishe09b3c22013-07-23 16:49:36 -040038 cls._interface = 'json'
Matthew Treinish9f756a02014-01-15 10:26:07 -050039 cls.isolated_creds = isolated_creds.IsolatedCreds(
40 cls.__name__, network_resources=cls.network_resources)
Matthew Treinish5ba84e32014-01-29 16:52:57 +000041 if not CONF.service_available.glance:
Matthew Treinish853ae442013-07-19 16:36:07 -040042 skip_msg = ("%s skipped as glance is not available" % cls.__name__)
43 raise cls.skipException(skip_msg)
Matthew Treinish5ba84e32014-01-29 16:52:57 +000044 if CONF.compute.allow_tenant_isolation:
Matthew Treinishb86cda92013-07-29 11:22:23 -040045 creds = cls.isolated_creds.get_primary_creds()
Matthew Treinishe09b3c22013-07-23 16:49:36 -040046 username, tenant_name, password = creds
47 cls.os = clients.Manager(username=username,
48 password=password,
49 tenant_name=tenant_name)
50 else:
51 cls.os = clients.Manager()
Matthew Treinishce3ef922013-03-11 14:02:46 -040052
53 @classmethod
54 def tearDownClass(cls):
55 for image_id in cls.created_images:
56 try:
57 cls.client.delete_image(image_id)
58 except exceptions.NotFound:
59 pass
60
61 for image_id in cls.created_images:
62 cls.client.wait_for_resource_deletion(image_id)
Matthew Treinishb86cda92013-07-29 11:22:23 -040063 cls.isolated_creds.clear_isolated_creds()
64 super(BaseImageTest, cls).tearDownClass()
Matthew Treinishce3ef922013-03-11 14:02:46 -040065
66 @classmethod
67 def create_image(cls, **kwargs):
68 """Wrapper that returns a test image."""
Attila Fazekas689e2652013-10-07 18:06:57 +020069 name = data_utils.rand_name(cls.__name__ + "-instance")
Matthew Treinishce3ef922013-03-11 14:02:46 -040070
71 if 'name' in kwargs:
72 name = kwargs.pop('name')
73
74 container_format = kwargs.pop('container_format')
75 disk_format = kwargs.pop('disk_format')
76
77 resp, image = cls.client.create_image(name, container_format,
78 disk_format, **kwargs)
79 cls.created_images.append(image['id'])
80 return resp, image
81
82
83class BaseV1ImageTest(BaseImageTest):
84
85 @classmethod
86 def setUpClass(cls):
87 super(BaseV1ImageTest, cls).setUpClass()
88 cls.client = cls.os.image_client
Matthew Treinish5ba84e32014-01-29 16:52:57 +000089 if not CONF.image_feature_enabled.api_v1:
Matthew Treinishc0f768f2013-03-11 14:24:16 -040090 msg = "Glance API v1 not supported"
91 raise cls.skipException(msg)
Matthew Treinishce3ef922013-03-11 14:02:46 -040092
93
Attila Fazekasa709b762013-10-08 11:52:44 +020094class BaseV1ImageMembersTest(BaseV1ImageTest):
95 @classmethod
96 def setUpClass(cls):
97 super(BaseV1ImageMembersTest, cls).setUpClass()
Matthew Treinish5ba84e32014-01-29 16:52:57 +000098 if CONF.compute.allow_tenant_isolation:
Attila Fazekasa709b762013-10-08 11:52:44 +020099 creds = cls.isolated_creds.get_alt_creds()
100 username, tenant_name, password = creds
101 cls.os_alt = clients.Manager(username=username,
102 password=password,
103 tenant_name=tenant_name)
104 cls.alt_tenant_id = cls.isolated_creds.get_alt_tenant()['id']
105 else:
106 cls.os_alt = clients.AltManager()
107 identity_client = cls._get_identity_admin_client()
108 cls.alt_tenant_id = identity_client.get_tenant_by_name(
109 cls.os_alt.tenant_name)['id']
110
111 cls.alt_img_cli = cls.os_alt.image_client
112
113 def _create_image(self):
114 image_file = StringIO.StringIO('*' * 1024)
115 resp, image = self.create_image(container_format='bare',
116 disk_format='raw',
117 is_public=False,
118 data=image_file)
119 self.assertEqual(201, resp.status)
120 image_id = image['id']
121 return image_id
122
123
Matthew Treinishce3ef922013-03-11 14:02:46 -0400124class BaseV2ImageTest(BaseImageTest):
125
126 @classmethod
127 def setUpClass(cls):
128 super(BaseV2ImageTest, cls).setUpClass()
129 cls.client = cls.os.image_client_v2
Matthew Treinish5ba84e32014-01-29 16:52:57 +0000130 if not CONF.image_feature_enabled.api_v2:
Matthew Treinishc0f768f2013-03-11 14:24:16 -0400131 msg = "Glance API v2 not supported"
132 raise cls.skipException(msg)
Attila Fazekas689e2652013-10-07 18:06:57 +0200133
134
JordanP236da422014-01-16 14:38:07 +0000135class BaseV2MemberImageTest(BaseV2ImageTest):
Attila Fazekas689e2652013-10-07 18:06:57 +0200136
137 @classmethod
138 def setUpClass(cls):
JordanP236da422014-01-16 14:38:07 +0000139 super(BaseV2MemberImageTest, cls).setUpClass()
Matthew Treinish5ba84e32014-01-29 16:52:57 +0000140 if CONF.compute.allow_tenant_isolation:
Attila Fazekas689e2652013-10-07 18:06:57 +0200141 creds = cls.isolated_creds.get_alt_creds()
142 username, tenant_name, password = creds
143 cls.os_alt = clients.Manager(username=username,
144 password=password,
145 tenant_name=tenant_name,
146 interface=cls._interface)
147 cls.alt_tenant_id = cls.isolated_creds.get_alt_tenant()['id']
148 else:
149 cls.os_alt = clients.AltManager()
150 alt_tenant_name = cls.os_alt.tenant_name
151 identity_client = cls._get_identity_admin_client()
152 cls.alt_tenant_id = identity_client.get_tenant_by_name(
153 alt_tenant_name)['id']
154 cls.os_img_client = cls.os.image_client_v2
155 cls.alt_img_client = cls.os_alt.image_client_v2
156
157 def _list_image_ids_as_alt(self):
158 _, image_list = self.alt_img_client.image_list()
159 image_ids = map(lambda x: x['id'], image_list)
160 return image_ids
161
162 def _create_image(self):
163 name = data_utils.rand_name('image')
164 resp, image = self.os_img_client.create_image(name,
165 container_format='bare',
166 disk_format='raw')
167 image_id = image['id']
168 self.addCleanup(self.os_img_client.delete_image, image_id)
169 return image_id