~0x44/nova/extdoc

« back to all changes in this revision

Viewing changes to nova/tests/api/openstack/test_image_metadata.py

  • Committer: Tarmac
  • Author(s): Brian Waldon
  • Date: 2011-09-13 15:23:15 UTC
  • mfrom: (1517.2.17 image-service-cleanup)
  • Revision ID: tarmac-20110913152315-a21jg0bvjjlyga82
- remove translation of non-recognized attributes to user metadata, now just ignored
- ensure all keys are defined in image dictionaries, defaulting to None if glance client doesn't provide one
- remove BaseImageService
- reorganize some GlanceImageService tests

Show diffs side-by-side

added added

removed removed

Lines of Context:
23
23
from nova.api import openstack
24
24
from nova import test
25
25
from nova.tests.api.openstack import fakes
26
 
import nova.wsgi
27
26
 
28
27
 
29
28
FLAGS = flags.FLAGS
31
30
 
32
31
class ImageMetaDataTest(test.TestCase):
33
32
 
34
 
    IMAGE_FIXTURES = [
35
 
        {'status': 'active',
36
 
        'name': 'image1',
37
 
        'deleted': False,
38
 
        'container_format': None,
39
 
        'checksum': None,
40
 
        'created_at': '2011-03-22T17:40:15',
41
 
        'disk_format': None,
42
 
        'updated_at': '2011-03-22T17:40:15',
43
 
        'id': '1',
44
 
        'location': 'file:///var/lib/glance/images/1',
45
 
        'is_public': True,
46
 
        'deleted_at': None,
47
 
        'properties': {
48
 
            'key1': 'value1',
49
 
            'key2': 'value2'},
50
 
        'size': 5882349},
51
 
        {'status': 'active',
52
 
        'name': 'image2',
53
 
        'deleted': False,
54
 
        'container_format': None,
55
 
        'checksum': None,
56
 
        'created_at': '2011-03-22T17:40:15',
57
 
        'disk_format': None,
58
 
        'updated_at': '2011-03-22T17:40:15',
59
 
        'id': '2',
60
 
        'location': 'file:///var/lib/glance/images/2',
61
 
        'is_public': True,
62
 
        'deleted_at': None,
63
 
        'properties': {
64
 
            'key1': 'value1',
65
 
            'key2': 'value2'},
66
 
        'size': 5882349},
67
 
        {'status': 'active',
68
 
        'name': 'image3',
69
 
        'deleted': False,
70
 
        'container_format': None,
71
 
        'checksum': None,
72
 
        'created_at': '2011-03-22T17:40:15',
73
 
        'disk_format': None,
74
 
        'updated_at': '2011-03-22T17:40:15',
75
 
        'id': '3',
76
 
        'location': 'file:///var/lib/glance/images/2',
77
 
        'is_public': True,
78
 
        'deleted_at': None,
79
 
        'properties': {},
80
 
        'size': 5882349},
81
 
        ]
82
 
 
83
33
    def setUp(self):
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)
91
36
 
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)
101
44
 
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'])
110
53
 
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)
 
58
 
 
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)
115
63
 
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())
122
70
 
123
71
        self.assertEqual(200, res.status_int)
124
72
        actual_output = json.loads(res.body)
125
 
 
126
 
        expected_output = {
127
 
            'metadata': {
128
 
                'key1': 'value1',
129
 
                'key2': 'value2',
130
 
                'key9': 'value9',
131
 
            },
132
 
        }
133
 
 
 
73
        expected_output = {'metadata': {'key1': 'value1', 'key7': 'value7'}}
134
74
        self.assertEqual(expected_output, actual_output)
135
75
 
 
76
    def test_create_image_not_found(self):
 
77
        req = webob.Request.blank('/v1.1/fake/images/100/metadata')
 
78
        req.method = 'POST'
 
79
        req.body = '{"metadata": {"key7": "value7"}}'
 
80
        req.headers["content-type"] = "application/json"
 
81
        res = req.get_response(fakes.wsgi_app())
 
82
 
 
83
        self.assertEqual(404, res.status_int)
 
84
 
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"
142
91
 
143
92
        self.assertEqual(200, res.status_int)
144
93
        actual_output = json.loads(res.body)
145
 
 
146
 
        expected_output = {
147
 
            'metadata': {
148
 
                'key9': 'value9',
149
 
            },
150
 
        }
151
 
 
 
94
        expected_output = {'metadata': {'key9': 'value9'}}
152
95
        self.assertEqual(expected_output, actual_output)
153
96
 
 
97
    def test_update_all_image_not_found(self):
 
98
        req = webob.Request.blank('/v1.1/fake/images/100/metadata')
 
99
        req.method = 'PUT'
 
100
        req.body = '{"metadata": {"key9": "value9"}}'
 
101
        req.headers["content-type"] = "application/json"
 
102
        res = req.get_response(fakes.wsgi_app())
 
103
 
 
104
        self.assertEqual(404, res.status_int)
 
105
 
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"
160
112
 
161
113
        self.assertEqual(200, res.status_int)
162
114
        actual_output = json.loads(res.body)
163
 
        expected_output = {
164
 
            'meta': {
165
 
                'key1': 'zz',
166
 
            },
167
 
        }
 
115
        expected_output = {'meta': {'key1': 'zz'}}
168
116
        self.assertEqual(actual_output, expected_output)
169
117
 
 
118
    def test_update_item_image_not_found(self):
 
119
        req = webob.Request.blank('/v1.1/fake/images/100/metadata/key1')
 
120
        req.method = 'PUT'
 
121
        req.body = '{"meta": {"key1": "zz"}}'
 
122
        req.headers["content-type"] = "application/json"
 
123
        res = req.get_response(fakes.wsgi_app())
 
124
 
 
125
        self.assertEqual(404, res.status_int)
 
126
 
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)
177
134
 
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"}}'
 
138
        overload = {}
 
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)
185
145
 
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)
193
153
 
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"
200
160
 
201
161
        self.assertEqual(200, res.status_int)
202
162
        actual_output = json.loads(res.body)
203
 
        expected_output = {
204
 
            'meta': {
205
 
                'key1': 'five',
206
 
            },
207
 
        }
 
163
        expected_output = {'meta': {'key1': 'five'}}
208
164
        self.assertEqual(actual_output, expected_output)
209
165
 
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)
216
172
 
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)
 
178
 
 
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)
234
196
 
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"