70
class BaseGlanceTest(unittest.TestCase):
71
NOW_GLANCE_OLD_FORMAT = "2010-10-11T10:30:22"
72
NOW_GLANCE_FORMAT = "2010-10-11T10:30:22.000000"
73
NOW_DATETIME = datetime.datetime(2010, 10, 11, 10, 30, 22)
76
self.client = StubGlanceClient(None)
77
self.service = glance.GlanceImageService(client=self.client)
78
self.context = context.RequestContext(None, None)
80
def assertDateTimesFilled(self, image_meta):
81
self.assertEqual(image_meta['created_at'], self.NOW_DATETIME)
82
self.assertEqual(image_meta['updated_at'], self.NOW_DATETIME)
83
self.assertEqual(image_meta['deleted_at'], self.NOW_DATETIME)
85
def assertDateTimesEmpty(self, image_meta):
86
self.assertEqual(image_meta['updated_at'], None)
87
self.assertEqual(image_meta['deleted_at'], None)
89
def assertDateTimesBlank(self, image_meta):
90
self.assertEqual(image_meta['updated_at'], '')
91
self.assertEqual(image_meta['deleted_at'], '')
94
class TestGlanceImageServiceProperties(BaseGlanceTest):
95
def test_show_passes_through_to_client(self):
96
"""Ensure attributes which aren't BASE_IMAGE_ATTRS are stored in the
99
fixtures = {'image1': {'id': '1', 'name': 'image1', 'is_public': True,
101
'properties': {'prop1': 'propvalue1'}}}
102
self.client.images = fixtures
103
image_meta = self.service.show(self.context, 'image1')
105
expected = {'id': '1', 'name': 'image1', 'is_public': True,
106
'properties': {'prop1': 'propvalue1', 'foo': 'bar'}}
107
self.assertEqual(image_meta, expected)
109
def test_show_raises_when_no_authtoken_in_the_context(self):
110
fixtures = {'image1': {'name': 'image1', 'is_public': False,
112
'properties': {'prop1': 'propvalue1'}}}
113
self.client.images = fixtures
114
self.context.auth_token = False
116
expected = {'name': 'image1', 'is_public': True,
117
'properties': {'prop1': 'propvalue1', 'foo': 'bar'}}
118
self.assertRaises(exception.ImageNotFound,
119
self.service.show, self.context, 'image1')
121
def test_show_passes_through_to_client_with_authtoken_in_context(self):
122
fixtures = {'image1': {'name': 'image1', 'is_public': False,
124
'properties': {'prop1': 'propvalue1'}}}
125
self.client.images = fixtures
126
self.context.auth_token = True
128
expected = {'name': 'image1', 'is_public': False,
129
'properties': {'prop1': 'propvalue1', 'foo': 'bar'}}
131
image_meta = self.service.show(self.context, 'image1')
132
self.assertEqual(image_meta, expected)
134
def test_detail_passes_through_to_client(self):
135
fixtures = {'image1': {'id': '1', 'name': 'image1', 'is_public': True,
137
'properties': {'prop1': 'propvalue1'}}}
138
self.client.images = fixtures
139
image_meta = self.service.detail(self.context)
140
expected = [{'id': '1', 'name': 'image1', 'is_public': True,
141
'properties': {'prop1': 'propvalue1', 'foo': 'bar'}}]
142
self.assertEqual(image_meta, expected)
145
class TestGetterDateTimeNoneTests(BaseGlanceTest):
147
def test_show_handles_none_datetimes(self):
148
self.client.images = self._make_none_datetime_fixtures()
149
image_meta = self.service.show(self.context, 'image1')
150
self.assertDateTimesEmpty(image_meta)
152
def test_show_handles_blank_datetimes(self):
153
self.client.images = self._make_blank_datetime_fixtures()
154
image_meta = self.service.show(self.context, 'image1')
155
self.assertDateTimesBlank(image_meta)
157
def test_detail_handles_none_datetimes(self):
158
self.client.images = self._make_none_datetime_fixtures()
159
image_meta = self.service.detail(self.context)[0]
160
self.assertDateTimesEmpty(image_meta)
162
def test_detail_handles_blank_datetimes(self):
163
self.client.images = self._make_blank_datetime_fixtures()
164
image_meta = self.service.detail(self.context)[0]
165
self.assertDateTimesBlank(image_meta)
167
def test_get_handles_none_datetimes(self):
168
self.client.images = self._make_none_datetime_fixtures()
169
writer = NullWriter()
170
image_meta = self.service.get(self.context, 'image1', writer)
171
self.assertDateTimesEmpty(image_meta)
173
def test_get_handles_blank_datetimes(self):
174
self.client.images = self._make_blank_datetime_fixtures()
175
writer = NullWriter()
176
image_meta = self.service.get(self.context, 'image1', writer)
177
self.assertDateTimesBlank(image_meta)
179
def test_show_makes_datetimes(self):
180
self.client.images = self._make_datetime_fixtures()
181
image_meta = self.service.show(self.context, 'image1')
182
self.assertDateTimesFilled(image_meta)
183
image_meta = self.service.show(self.context, 'image2')
184
self.assertDateTimesFilled(image_meta)
186
def test_detail_makes_datetimes(self):
187
self.client.images = self._make_datetime_fixtures()
188
image_meta = self.service.detail(self.context)[0]
189
self.assertDateTimesFilled(image_meta)
190
image_meta = self.service.detail(self.context)[1]
191
self.assertDateTimesFilled(image_meta)
193
def test_get_makes_datetimes(self):
194
self.client.images = self._make_datetime_fixtures()
195
writer = NullWriter()
196
image_meta = self.service.get(self.context, 'image1', writer)
197
self.assertDateTimesFilled(image_meta)
198
image_meta = self.service.get(self.context, 'image2', writer)
199
self.assertDateTimesFilled(image_meta)
201
def _make_datetime_fixtures(self):
207
'created_at': self.NOW_GLANCE_FORMAT,
208
'updated_at': self.NOW_GLANCE_FORMAT,
209
'deleted_at': self.NOW_GLANCE_FORMAT,
215
'created_at': self.NOW_GLANCE_OLD_FORMAT,
216
'updated_at': self.NOW_GLANCE_OLD_FORMAT,
217
'deleted_at': self.NOW_GLANCE_OLD_FORMAT,
222
def _make_none_datetime_fixtures(self):
223
fixtures = {'image1': {'id': '1',
230
def _make_blank_datetime_fixtures(self):
231
fixtures = {'image1': {'id': '1',
239
class TestMutatorDateTimeTests(BaseGlanceTest):
240
"""Tests create(), update()"""
242
def test_create_handles_datetimes(self):
243
self.client.add_response = self._make_datetime_fixture()
244
image_meta = self.service.create(self.context, {})
245
self.assertDateTimesFilled(image_meta)
247
def test_create_handles_none_datetimes(self):
248
self.client.add_response = self._make_none_datetime_fixture()
250
image_meta = self.service.create(self.context, dummy_meta)
251
self.assertDateTimesEmpty(image_meta)
253
def test_update_handles_datetimes(self):
254
self.client.images = {'image1': self._make_datetime_fixture()}
255
self.client.update_response = self._make_datetime_fixture()
257
image_meta = self.service.update(self.context, 'image1', dummy_meta)
258
self.assertDateTimesFilled(image_meta)
260
def test_update_handles_none_datetimes(self):
261
self.client.images = {'image1': self._make_datetime_fixture()}
262
self.client.update_response = self._make_none_datetime_fixture()
264
image_meta = self.service.update(self.context, 'image1', dummy_meta)
265
self.assertDateTimesEmpty(image_meta)
267
def _make_datetime_fixture(self):
268
fixture = {'id': 'image1', 'name': 'image1', 'is_public': True,
269
'created_at': self.NOW_GLANCE_FORMAT,
270
'updated_at': self.NOW_GLANCE_FORMAT,
271
'deleted_at': self.NOW_GLANCE_FORMAT}
274
def _make_none_datetime_fixture(self):
275
fixture = {'id': 'image1', 'name': 'image1', 'is_public': True,
281
class TestGlanceSerializer(unittest.TestCase):
37
class TestGlanceSerializer(test.TestCase):
282
38
def test_serialize(self):
283
39
metadata = {'name': 'image1',
284
40
'is_public': True,
312
68
converted = glance._convert_to_string(metadata)
313
69
self.assertEqual(converted, converted_expected)
314
70
self.assertEqual(glance._convert_from_string(converted), metadata)
73
class TestGlanceImageService(test.TestCase):
75
Tests the Glance image service.
77
At a high level, the translations involved are:
79
1. Glance -> ImageService - This is needed so we can support
80
multple ImageServices (Glance, Local, etc)
82
2. ImageService -> API - This is needed so we can support multple
86
NOW_GLANCE_OLD_FORMAT = "2010-10-11T10:30:22"
87
NOW_GLANCE_FORMAT = "2010-10-11T10:30:22.000000"
88
NOW_DATETIME = datetime.datetime(2010, 10, 11, 10, 30, 22)
91
super(TestGlanceImageService, self).setUp()
92
self.stubs = stubout.StubOutForTesting()
93
fakes.stub_out_compute_api_snapshot(self.stubs)
94
client = glance_stubs.StubGlanceClient()
95
self.service = glance.GlanceImageService(client=client)
96
self.context = context.RequestContext('fake', 'fake', auth_token=True)
97
self.service.delete_all()
100
self.stubs.UnsetAll()
101
super(TestGlanceImageService, self).tearDown()
104
def _make_fixture(**kwargs):
105
fixture = {'name': None,
109
fixture.update(kwargs)
112
def _make_datetime_fixture(self):
113
return self._make_fixture(created_at=self.NOW_GLANCE_FORMAT,
114
updated_at=self.NOW_GLANCE_FORMAT,
115
deleted_at=self.NOW_GLANCE_FORMAT)
117
def test_create_with_instance_id(self):
118
"""Ensure instance_id is persisted as an image-property"""
119
fixture = {'name': 'test image',
121
'properties': {'instance_id': '42', 'user_id': 'fake'}}
123
image_id = self.service.create(self.context, fixture)['id']
124
image_meta = self.service.show(self.context, image_id)
127
'name': 'test image',
132
'container_format': None,
134
'created_at': self.NOW_DATETIME,
135
'updated_at': self.NOW_DATETIME,
139
'properties': {'instance_id': '42', 'user_id': 'fake'},
141
self.assertDictMatch(image_meta, expected)
143
image_metas = self.service.detail(self.context)
144
self.assertDictMatch(image_metas[0], expected)
146
def test_create_without_instance_id(self):
148
Ensure we can create an image without having to specify an
149
instance_id. Public images are an example of an image not tied to an
152
fixture = {'name': 'test image', 'is_public': False}
153
image_id = self.service.create(self.context, fixture)['id']
157
'name': 'test image',
162
'container_format': None,
164
'created_at': self.NOW_DATETIME,
165
'updated_at': self.NOW_DATETIME,
171
actual = self.service.show(self.context, image_id)
172
self.assertDictMatch(actual, expected)
174
def test_create(self):
175
fixture = self._make_fixture(name='test image')
176
num_images = len(self.service.index(self.context))
177
image_id = self.service.create(self.context, fixture)['id']
179
self.assertNotEquals(None, image_id)
180
self.assertEquals(num_images + 1,
181
len(self.service.index(self.context)))
183
def test_create_and_show_non_existing_image(self):
184
fixture = self._make_fixture(name='test image')
185
image_id = self.service.create(self.context, fixture)['id']
187
self.assertNotEquals(None, image_id)
188
self.assertRaises(exception.NotFound,
193
def test_create_and_show_non_existing_image_by_name(self):
194
fixture = self._make_fixture(name='test image')
195
image_id = self.service.create(self.context, fixture)['id']
197
self.assertNotEquals(None, image_id)
198
self.assertRaises(exception.ImageNotFound,
199
self.service.show_by_name,
203
def test_index(self):
204
fixture = self._make_fixture(name='test image')
205
image_id = self.service.create(self.context, fixture)['id']
206
image_metas = self.service.index(self.context)
207
expected = [{'id': image_id, 'name': 'test image'}]
208
self.assertDictListMatch(image_metas, expected)
210
def test_index_default_limit(self):
214
fixture = self._make_fixture(name='TestImage %d' % (i))
215
fixtures.append(fixture)
216
ids.append(self.service.create(self.context, fixture)['id'])
218
image_metas = self.service.index(self.context)
220
for meta in image_metas:
221
expected = {'id': 'DONTCARE',
222
'name': 'TestImage %d' % (i)}
223
self.assertDictMatch(meta, expected)
226
def test_index_marker(self):
230
fixture = self._make_fixture(name='TestImage %d' % (i))
231
fixtures.append(fixture)
232
ids.append(self.service.create(self.context, fixture)['id'])
234
image_metas = self.service.index(self.context, marker=ids[1])
235
self.assertEquals(len(image_metas), 8)
237
for meta in image_metas:
238
expected = {'id': 'DONTCARE',
239
'name': 'TestImage %d' % (i)}
240
self.assertDictMatch(meta, expected)
243
def test_index_limit(self):
247
fixture = self._make_fixture(name='TestImage %d' % (i))
248
fixtures.append(fixture)
249
ids.append(self.service.create(self.context, fixture)['id'])
251
image_metas = self.service.index(self.context, limit=5)
252
self.assertEquals(len(image_metas), 5)
254
def test_index_marker_and_limit(self):
258
fixture = self._make_fixture(name='TestImage %d' % (i))
259
fixtures.append(fixture)
260
ids.append(self.service.create(self.context, fixture)['id'])
262
image_metas = self.service.index(self.context, marker=ids[3], limit=1)
263
self.assertEquals(len(image_metas), 1)
265
for meta in image_metas:
266
expected = {'id': ids[i],
267
'name': 'TestImage %d' % (i)}
268
self.assertDictMatch(meta, expected)
271
def test_detail_marker(self):
275
fixture = self._make_fixture(name='TestImage %d' % (i))
276
fixtures.append(fixture)
277
ids.append(self.service.create(self.context, fixture)['id'])
279
image_metas = self.service.detail(self.context, marker=ids[1])
280
self.assertEquals(len(image_metas), 8)
282
for meta in image_metas:
287
'name': 'TestImage %d' % (i),
292
'container_format': None,
294
'created_at': self.NOW_DATETIME,
295
'updated_at': self.NOW_DATETIME,
300
self.assertDictMatch(meta, expected)
303
def test_detail_limit(self):
307
fixture = self._make_fixture(name='TestImage %d' % (i))
308
fixtures.append(fixture)
309
ids.append(self.service.create(self.context, fixture)['id'])
311
image_metas = self.service.detail(self.context, limit=5)
312
self.assertEquals(len(image_metas), 5)
314
def test_detail_marker_and_limit(self):
318
fixture = self._make_fixture(name='TestImage %d' % (i))
319
fixtures.append(fixture)
320
ids.append(self.service.create(self.context, fixture)['id'])
322
image_metas = self.service.detail(self.context, marker=ids[3], limit=5)
323
self.assertEquals(len(image_metas), 5)
325
for meta in image_metas:
330
'name': 'TestImage %d' % (i),
335
'container_format': None,
337
'created_at': self.NOW_DATETIME,
338
'updated_at': self.NOW_DATETIME,
342
self.assertDictMatch(meta, expected)
345
def test_update(self):
346
fixture = self._make_fixture(name='test image')
347
image_id = self.service.create(self.context, fixture)['id']
348
fixture['name'] = 'new image name'
349
self.service.update(self.context, image_id, fixture)
351
new_image_data = self.service.show(self.context, image_id)
352
self.assertEquals('new image name', new_image_data['name'])
354
def test_delete(self):
355
fixture1 = self._make_fixture(name='test image 1')
356
fixture2 = self._make_fixture(name='test image 2')
357
fixtures = [fixture1, fixture2]
359
num_images = len(self.service.index(self.context))
360
self.assertEquals(0, num_images, str(self.service.index(self.context)))
363
for fixture in fixtures:
364
new_id = self.service.create(self.context, fixture)['id']
367
num_images = len(self.service.index(self.context))
368
self.assertEquals(2, num_images, str(self.service.index(self.context)))
370
self.service.delete(self.context, ids[0])
372
num_images = len(self.service.index(self.context))
373
self.assertEquals(1, num_images)
375
def test_show_passes_through_to_client(self):
376
fixture = self._make_fixture(name='image1', is_public=True)
377
image_id = self.service.create(self.context, fixture)['id']
379
image_meta = self.service.show(self.context, image_id)
387
'container_format': None,
389
'created_at': self.NOW_DATETIME,
390
'updated_at': self.NOW_DATETIME,
396
self.assertEqual(image_meta, expected)
398
def test_show_raises_when_no_authtoken_in_the_context(self):
399
fixture = self._make_fixture(name='image1',
401
properties={'one': 'two'})
402
image_id = self.service.create(self.context, fixture)['id']
403
self.context.auth_token = False
404
self.assertRaises(exception.ImageNotFound,
409
def test_detail_passes_through_to_client(self):
410
fixture = self._make_fixture(name='image10', is_public=True)
411
image_id = self.service.create(self.context, fixture)['id']
412
image_metas = self.service.detail(self.context)
421
'container_format': None,
423
'created_at': self.NOW_DATETIME,
424
'updated_at': self.NOW_DATETIME,
431
self.assertEqual(image_metas, expected)
433
def test_show_makes_datetimes(self):
434
fixture = self._make_datetime_fixture()
435
image_id = self.service.create(self.context, fixture)['id']
436
image_meta = self.service.show(self.context, image_id)
437
self.assertEqual(image_meta['created_at'], self.NOW_DATETIME)
438
self.assertEqual(image_meta['updated_at'], self.NOW_DATETIME)
440
def test_detail_makes_datetimes(self):
441
fixture = self._make_datetime_fixture()
442
self.service.create(self.context, fixture)
443
image_meta = self.service.detail(self.context)[0]
444
self.assertEqual(image_meta['created_at'], self.NOW_DATETIME)
445
self.assertEqual(image_meta['updated_at'], self.NOW_DATETIME)
447
def test_get_makes_datetimes(self):
448
fixture = self._make_datetime_fixture()
449
image_id = self.service.create(self.context, fixture)['id']
450
writer = NullWriter()
451
image_meta = self.service.get(self.context, image_id, writer)
452
self.assertEqual(image_meta['created_at'], self.NOW_DATETIME)
453
self.assertEqual(image_meta['updated_at'], self.NOW_DATETIME)