32
31
class ImageMetaDataTest(test.TestCase):
38
'container_format': None,
40
'created_at': '2011-03-22T17:40:15',
42
'updated_at': '2011-03-22T17:40:15',
44
'location': 'file:///var/lib/glance/images/1',
54
'container_format': None,
56
'created_at': '2011-03-22T17:40:15',
58
'updated_at': '2011-03-22T17:40:15',
60
'location': 'file:///var/lib/glance/images/2',
70
'container_format': None,
72
'created_at': '2011-03-22T17:40:15',
74
'updated_at': '2011-03-22T17:40:15',
76
'location': 'file:///var/lib/glance/images/2',
84
34
super(ImageMetaDataTest, self).setUp()
85
self.flags(image_service='nova.image.glance.GlanceImageService')
86
# NOTE(dprince) max out properties/metadata in image 3 for testing
87
img3 = self.IMAGE_FIXTURES[2]
88
for num in range(FLAGS.quota_metadata_items):
89
img3['properties']['key%i' % num] = "blah"
90
fakes.stub_out_glance(self.stubs, self.IMAGE_FIXTURES)
35
fakes.stub_out_glance(self.stubs)
92
37
def test_index(self):
93
req = webob.Request.blank('/v1.1/123/images/1/metadata')
38
req = webob.Request.blank('/v1.1/123/images/123/metadata')
94
39
res = req.get_response(fakes.wsgi_app())
95
40
res_dict = json.loads(res.body)
96
41
self.assertEqual(200, res.status_int)
97
expected = self.IMAGE_FIXTURES[0]['properties']
98
self.assertEqual(len(expected), len(res_dict['metadata']))
99
for (key, value) in res_dict['metadata'].items():
100
self.assertEqual(value, res_dict['metadata'][key])
42
expected = {'metadata': {'key1': 'value1'}}
43
self.assertEqual(res_dict, expected)
102
45
def test_show(self):
103
req = webob.Request.blank('/v1.1/fake/images/1/metadata/key1')
46
req = webob.Request.blank('/v1.1/fake/images/123/metadata/key1')
104
47
res = req.get_response(fakes.wsgi_app())
105
48
res_dict = json.loads(res.body)
106
49
self.assertEqual(200, res.status_int)
109
52
self.assertEqual('value1', res_dict['meta']['key1'])
111
54
def test_show_not_found(self):
112
req = webob.Request.blank('/v1.1/fake/images/1/metadata/key9')
55
req = webob.Request.blank('/v1.1/fake/images/123/metadata/key9')
56
res = req.get_response(fakes.wsgi_app())
57
self.assertEqual(404, res.status_int)
59
def test_show_image_not_found(self):
60
req = webob.Request.blank('/v1.1/fake/images/100/metadata/key1')
113
61
res = req.get_response(fakes.wsgi_app())
114
62
self.assertEqual(404, res.status_int)
116
64
def test_create(self):
117
req = webob.Request.blank('/v1.1/fake/images/2/metadata')
65
req = webob.Request.blank('/v1.1/fake/images/123/metadata')
118
66
req.method = 'POST'
119
req.body = '{"metadata": {"key9": "value9"}}'
67
req.body = '{"metadata": {"key7": "value7"}}'
120
68
req.headers["content-type"] = "application/json"
121
69
res = req.get_response(fakes.wsgi_app())
123
71
self.assertEqual(200, res.status_int)
124
72
actual_output = json.loads(res.body)
73
expected_output = {'metadata': {'key1': 'value1', 'key7': 'value7'}}
134
74
self.assertEqual(expected_output, actual_output)
76
def test_create_image_not_found(self):
77
req = webob.Request.blank('/v1.1/fake/images/100/metadata')
79
req.body = '{"metadata": {"key7": "value7"}}'
80
req.headers["content-type"] = "application/json"
81
res = req.get_response(fakes.wsgi_app())
83
self.assertEqual(404, res.status_int)
136
85
def test_update_all(self):
137
req = webob.Request.blank('/v1.1/fake/images/1/metadata')
86
req = webob.Request.blank('/v1.1/fake/images/123/metadata')
138
87
req.method = 'PUT'
139
88
req.body = '{"metadata": {"key9": "value9"}}'
140
89
req.headers["content-type"] = "application/json"
143
92
self.assertEqual(200, res.status_int)
144
93
actual_output = json.loads(res.body)
94
expected_output = {'metadata': {'key9': 'value9'}}
152
95
self.assertEqual(expected_output, actual_output)
97
def test_update_all_image_not_found(self):
98
req = webob.Request.blank('/v1.1/fake/images/100/metadata')
100
req.body = '{"metadata": {"key9": "value9"}}'
101
req.headers["content-type"] = "application/json"
102
res = req.get_response(fakes.wsgi_app())
104
self.assertEqual(404, res.status_int)
154
106
def test_update_item(self):
155
req = webob.Request.blank('/v1.1/fake/images/1/metadata/key1')
107
req = webob.Request.blank('/v1.1/fake/images/123/metadata/key1')
156
108
req.method = 'PUT'
157
109
req.body = '{"meta": {"key1": "zz"}}'
158
110
req.headers["content-type"] = "application/json"
161
113
self.assertEqual(200, res.status_int)
162
114
actual_output = json.loads(res.body)
115
expected_output = {'meta': {'key1': 'zz'}}
168
116
self.assertEqual(actual_output, expected_output)
118
def test_update_item_image_not_found(self):
119
req = webob.Request.blank('/v1.1/fake/images/100/metadata/key1')
121
req.body = '{"meta": {"key1": "zz"}}'
122
req.headers["content-type"] = "application/json"
123
res = req.get_response(fakes.wsgi_app())
125
self.assertEqual(404, res.status_int)
170
127
def test_update_item_bad_body(self):
171
req = webob.Request.blank('/v1.1/fake/images/1/metadata/key1')
128
req = webob.Request.blank('/v1.1/fake/images/123/metadata/key1')
172
129
req.method = 'PUT'
173
130
req.body = '{"key1": "zz"}'
174
131
req.headers["content-type"] = "application/json"
176
133
self.assertEqual(400, res.status_int)
178
135
def test_update_item_too_many_keys(self):
179
req = webob.Request.blank('/v1.1/fake/images/1/metadata/key1')
136
req = webob.Request.blank('/v1.1/fake/images/123/metadata/key1')
180
137
req.method = 'PUT'
181
req.body = '{"meta": {"key1": "value1", "key2": "value2"}}'
139
for num in range(FLAGS.quota_metadata_items + 1):
140
overload['key%s' % num] = 'value%s' % num
141
req.body = json.dumps({'meta': overload})
182
142
req.headers["content-type"] = "application/json"
183
143
res = req.get_response(fakes.wsgi_app())
184
144
self.assertEqual(400, res.status_int)
186
146
def test_update_item_body_uri_mismatch(self):
187
req = webob.Request.blank('/v1.1/fake/images/1/metadata/bad')
147
req = webob.Request.blank('/v1.1/fake/images/123/metadata/bad')
188
148
req.method = 'PUT'
189
149
req.body = '{"meta": {"key1": "value1"}}'
190
150
req.headers["content-type"] = "application/json"
192
152
self.assertEqual(400, res.status_int)
194
154
def test_update_item_xml(self):
195
req = webob.Request.blank('/v1.1/fake/images/1/metadata/key1')
155
req = webob.Request.blank('/v1.1/fake/images/123/metadata/key1')
196
156
req.method = 'PUT'
197
157
req.body = '<meta key="key1">five</meta>'
198
158
req.headers["content-type"] = "application/xml"
201
161
self.assertEqual(200, res.status_int)
202
162
actual_output = json.loads(res.body)
163
expected_output = {'meta': {'key1': 'five'}}
208
164
self.assertEqual(actual_output, expected_output)
210
166
def test_delete(self):
211
req = webob.Request.blank('/v1.1/fake/images/2/metadata/key1')
167
req = webob.Request.blank('/v1.1/fake/images/123/metadata/key1')
212
168
req.method = 'DELETE'
213
169
res = req.get_response(fakes.wsgi_app())
214
170
self.assertEqual(204, res.status_int)
215
171
self.assertEqual('', res.body)
217
173
def test_delete_not_found(self):
218
req = webob.Request.blank('/v1.1/fake/images/2/metadata/blah')
174
req = webob.Request.blank('/v1.1/fake/images/123/metadata/blah')
175
req.method = 'DELETE'
176
res = req.get_response(fakes.wsgi_app())
177
self.assertEqual(404, res.status_int)
179
def test_delete_image_not_found(self):
180
req = webob.Request.blank('/v1.1/fake/images/100/metadata/key1')
219
181
req.method = 'DELETE'
220
182
res = req.get_response(fakes.wsgi_app())
221
183
self.assertEqual(404, res.status_int)
225
187
for num in range(FLAGS.quota_metadata_items + 1):
226
188
data['metadata']['key%i' % num] = "blah"
227
189
json_string = str(data).replace("\'", "\"")
228
req = webob.Request.blank('/v1.1/fake/images/2/metadata')
190
req = webob.Request.blank('/v1.1/fake/images/123/metadata')
229
191
req.method = 'POST'
230
192
req.body = json_string
231
193
req.headers["content-type"] = "application/json"
233
195
self.assertEqual(413, res.status_int)
235
197
def test_too_many_metadata_items_on_put(self):
236
req = webob.Request.blank('/v1.1/fake/images/3/metadata/blah')
198
FLAGS.quota_metadata_items = 1
199
req = webob.Request.blank('/v1.1/fake/images/123/metadata/blah')
237
200
req.method = 'PUT'
238
201
req.body = '{"meta": {"blah": "blah"}}'
239
202
req.headers["content-type"] = "application/json"