20
20
import glance.api.v2.image_data
21
from glance.common import exception
21
22
from glance.openstack.common import uuidutils
22
23
from glance.tests.unit import base
23
24
import glance.tests.unit.utils as unit_test_utils
24
25
import glance.tests.utils as test_utils
29
def __init__(self, exc):
32
def __call__(self, *args, **kwargs):
36
class FakeImage(object):
37
def __init__(self, image_id=None, data=None, checksum=None, size=0,
38
locations=None, container_format='bear', disk_format='rawr',
40
self.image_id = image_id
42
self.checksum = checksum
44
self.locations = locations
45
self.container_format = container_format
46
self.disk_format = disk_format
54
def status(self, value):
55
if isinstance(self._status, BaseException):
63
def set_data(self, data, size=None):
64
self.data = ''.join(data)
66
self.status = 'modified-by-fake'
69
class FakeImageRepo(object):
70
def __init__(self, result=None):
73
def get(self, image_id):
74
if isinstance(self.result, BaseException):
79
def save(self, image):
80
self.saved_image = image
83
class FakeGateway(object):
84
def __init__(self, repo):
87
def get_repo(self, context):
27
91
class TestImagesController(base.StoreClearingUnitTest):
29
93
super(TestImagesController, self).setUp()
31
95
self.config(verbose=True, debug=True)
32
self.notifier = unit_test_utils.FakeNotifier()
96
self.image_repo = FakeImageRepo()
97
self.gateway = FakeGateway(self.image_repo)
33
98
self.controller = glance.api.v2.image_data.ImageDataController(
34
db_api=unit_test_utils.FakeDB(),
35
store_api=unit_test_utils.FakeStoreAPI(),
36
policy_enforcer=unit_test_utils.FakePolicyEnforcer(),
37
notifier=self.notifier)
39
101
def test_download(self):
40
102
request = unit_test_utils.get_fake_request()
41
output = self.controller.download(request, unit_test_utils.UUID1)
42
self.assertEqual(set(['data', 'meta']), set(output.keys()))
43
self.assertEqual(3, output['meta']['size'])
44
self.assertEqual('XXX', output['data'])
103
image = FakeImage('abcd', locations=['http://example.com/image'])
104
self.image_repo.result = image
105
image = self.controller.download(request, unit_test_utils.UUID1)
106
self.assertEqual(image.image_id, 'abcd')
46
def test_download_no_data(self):
108
def test_download_no_location(self):
47
109
request = unit_test_utils.get_fake_request()
110
self.image_repo.result = FakeImage('abcd')
48
111
self.assertRaises(webob.exc.HTTPNotFound, self.controller.download,
49
112
request, unit_test_utils.UUID2)
51
114
def test_download_non_existent_image(self):
52
115
request = unit_test_utils.get_fake_request()
116
self.image_repo.result = exception.NotFound()
53
117
self.assertRaises(webob.exc.HTTPNotFound, self.controller.download,
54
118
request, uuidutils.generate_uuid())
56
def test_upload_download(self):
57
request = unit_test_utils.get_fake_request()
120
def test_download_forbidden(self):
121
request = unit_test_utils.get_fake_request()
122
self.image_repo.result = exception.Forbidden()
123
self.assertRaises(webob.exc.HTTPForbidden, self.controller.download,
124
request, uuidutils.generate_uuid())
126
def test_upload(self):
127
request = unit_test_utils.get_fake_request()
128
image = FakeImage('abcd')
129
self.image_repo.result = image
58
130
self.controller.upload(request, unit_test_utils.UUID2, 'YYYY', 4)
59
output = self.controller.download(request, unit_test_utils.UUID2)
60
self.assertEqual(set(['data', 'meta']), set(output.keys()))
61
self.assertEqual(4, output['meta']['size'])
62
self.assertEqual('YYYY', output['data'])
63
self.assertEqual(output['meta']['status'], 'active')
65
def test_upload_download_prepare_notification(self):
131
self.assertEqual(image.data, 'YYYY')
132
self.assertEqual(image.size, 4)
134
def test_upload_status(self):
135
request = unit_test_utils.get_fake_request()
136
image = FakeImage('abcd')
137
self.image_repo.result = image
138
insurance = {'called': False}
141
insurance['called'] = True
142
self.assertEqual(self.image_repo.saved_image.status, 'saving')
145
self.controller.upload(request, unit_test_utils.UUID2,
147
self.assertTrue(insurance['called'])
148
self.assertEqual(self.image_repo.saved_image.status,
151
def test_upload_no_size(self):
152
request = unit_test_utils.get_fake_request()
153
image = FakeImage('abcd')
154
self.image_repo.result = image
155
self.controller.upload(request, unit_test_utils.UUID2, 'YYYY', None)
156
self.assertEqual(image.data, 'YYYY')
157
self.assertEqual(image.size, None)
159
def test_upload_invalid(self):
160
request = unit_test_utils.get_fake_request()
161
image = FakeImage('abcd')
162
image.status = ValueError()
163
self.image_repo.result = image
164
self.assertRaises(webob.exc.HTTPBadRequest, self.controller.upload,
165
request, unit_test_utils.UUID1, 'YYYY', 4)
167
def test_upload_non_existent_image(self):
168
request = unit_test_utils.get_fake_request()
169
self.image_repo.result = exception.NotFound()
170
self.assertRaises(webob.exc.HTTPNotFound, self.controller.upload,
171
request, uuidutils.generate_uuid(), 'ABC', 3)
173
def test_upload_data_exists(self):
174
request = unit_test_utils.get_fake_request()
176
image.set_data = Raise(exception.Duplicate)
177
self.image_repo.result = image
178
self.assertRaises(webob.exc.HTTPConflict, self.controller.upload,
179
request, unit_test_utils.UUID1, 'YYYY', 4)
181
def test_upload_storage_full(self):
182
request = unit_test_utils.get_fake_request()
184
image.set_data = Raise(exception.StorageFull)
185
self.image_repo.result = image
186
self.assertRaises(webob.exc.HTTPRequestEntityTooLarge,
187
self.controller.upload,
188
request, unit_test_utils.UUID2, 'YYYYYYY', 7)
190
def test_upload_storage_forbidden(self):
191
request = unit_test_utils.get_fake_request(user=unit_test_utils.USER2)
193
image.set_data = Raise(exception.Forbidden)
194
self.image_repo.result = image
195
self.assertRaises(webob.exc.HTTPForbidden, self.controller.upload,
196
request, unit_test_utils.UUID2, 'YY', 2)
198
def test_upload_storage_write_denied(self):
199
request = unit_test_utils.get_fake_request(user=unit_test_utils.USER3)
201
image.set_data = Raise(exception.StorageWriteDenied)
202
self.image_repo.result = image
203
self.assertRaises(webob.exc.HTTPServiceUnavailable,
204
self.controller.upload,
205
request, unit_test_utils.UUID2, 'YY', 2)
207
def _test_upload_download_prepare_notification(self):
66
208
request = unit_test_utils.get_fake_request()
67
209
self.controller.upload(request, unit_test_utils.UUID2, 'YYYY', 4)
68
210
output = self.controller.download(request, unit_test_utils.UUID2)
112
254
self.assertEqual(len(output_log), 3)
113
255
self.assertEqual(output_log[2], activate_log)
115
def test_upload_non_existent_image(self):
116
request = unit_test_utils.get_fake_request()
117
self.assertRaises(webob.exc.HTTPNotFound, self.controller.upload,
118
request, uuidutils.generate_uuid(), 'YYYY', 4)
120
def test_upload_data_exists(self):
121
request = unit_test_utils.get_fake_request()
122
self.assertRaises(webob.exc.HTTPConflict, self.controller.upload,
123
request, unit_test_utils.UUID1, 'YYYY', 4)
125
def test_upload_storage_full(self):
126
request = unit_test_utils.get_fake_request()
127
self.assertRaises(webob.exc.HTTPRequestEntityTooLarge,
128
self.controller.upload,
129
request, unit_test_utils.UUID2, 'YYYYYYY', 7)
131
def test_upload_storage_forbidden(self):
132
request = unit_test_utils.get_fake_request(user=unit_test_utils.USER2)
133
self.assertRaises(webob.exc.HTTPForbidden, self.controller.upload,
134
request, unit_test_utils.UUID2, 'YY', 2)
136
def test_upload_storage_write_denied(self):
137
request = unit_test_utils.get_fake_request(user=unit_test_utils.USER3)
138
self.assertRaises(webob.exc.HTTPServiceUnavailable,
139
self.controller.upload,
140
request, unit_test_utils.UUID2, 'YY', 2)
142
def test_upload_download_no_size(self):
143
request = unit_test_utils.get_fake_request()
144
self.controller.upload(request, unit_test_utils.UUID2, 'YYYY', None)
145
output = self.controller.download(request, unit_test_utils.UUID2)
146
self.assertEqual(set(['data', 'meta']), set(output.keys()))
147
self.assertEqual(4, output['meta']['size'])
148
self.assertEqual('YYYY', output['data'])
151
class TestImageDataControllerPolicies(base.IsolatedUnitTest):
154
super(TestImageDataControllerPolicies, self).setUp()
155
self.db = unit_test_utils.FakeDB()
156
self.policy = unit_test_utils.FakePolicyEnforcer()
157
self.controller = glance.api.v2.image_data.ImageDataController(
159
policy_enforcer=self.policy)
161
def test_download_unauthorized(self):
162
rules = {"download_image": False}
163
self.policy.set_rules(rules)
164
request = unit_test_utils.get_fake_request()
165
self.assertRaises(webob.exc.HTTPForbidden, self.controller.download,
166
request, image_id=unit_test_utils.UUID2)
169
258
class TestImageDataDeserializer(test_utils.BaseTestCase):