Merge lp:~rackspace-titan/nova/lp795045 into lp:~hudson-openstack/nova/trunk

Proposed by William Wolf
Status: Merged
Approved by: Brian Lamar
Approved revision: 1172
Merged at revision: 1173
Proposed branch: lp:~rackspace-titan/nova/lp795045
Merge into: lp:~hudson-openstack/nova/trunk
Diff against target: 112 lines (+34/-2)
2 files modified
nova/api/openstack/server_metadata.py (+9/-2)
nova/tests/api/openstack/test_server_metadata.py (+25/-0)
To merge this branch: bzr merge lp:~rackspace-titan/nova/lp795045
Reviewer Review Type Date Requested Status
Brian Lamar (community) Approve
Devin Carlen (community) Approve
Review via email: mp+64253@code.launchpad.net

Description of the change

This fixes the server_metadata create and update functions that were returning req.body (as a string) instead of body (deserialized body dictionary object). It also adds checks where appropriate to make sure that body is not empty (and return 400 if it is). Tests updated/added where appropriate.

To post a comment you must log in.
Revision history for this message
Devin Carlen (devcamcar) wrote :

lgtm

review: Approve
lp:~rackspace-titan/nova/lp795045 updated
1171. By William Wolf

check for none and empty string, this way empty dicts/lists will be ok

1172. By William Wolf

merge trunk

Revision history for this message
Brian Lamar (blamar) wrote :

Looks good to me as well.

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'nova/api/openstack/server_metadata.py'
--- nova/api/openstack/server_metadata.py 2011-05-20 18:42:19 +0000
+++ nova/api/openstack/server_metadata.py 2011-06-13 12:58:30 +0000
@@ -37,12 +37,18 @@
37 meta_dict[key] = value37 meta_dict[key] = value
38 return dict(metadata=meta_dict)38 return dict(metadata=meta_dict)
3939
40 def _check_body(self, body):
41 if body == None or body == "":
42 expl = _('No Request Body')
43 raise exc.HTTPBadRequest(explanation=expl)
44
40 def index(self, req, server_id):45 def index(self, req, server_id):
41 """ Returns the list of metadata for a given instance """46 """ Returns the list of metadata for a given instance """
42 context = req.environ['nova.context']47 context = req.environ['nova.context']
43 return self._get_metadata(context, server_id)48 return self._get_metadata(context, server_id)
4449
45 def create(self, req, server_id, body):50 def create(self, req, server_id, body):
51 self._check_body(body)
46 context = req.environ['nova.context']52 context = req.environ['nova.context']
47 metadata = body.get('metadata')53 metadata = body.get('metadata')
48 try:54 try:
@@ -51,9 +57,10 @@
51 metadata)57 metadata)
52 except quota.QuotaError as error:58 except quota.QuotaError as error:
53 self._handle_quota_error(error)59 self._handle_quota_error(error)
54 return req.body60 return body
5561
56 def update(self, req, server_id, id, body):62 def update(self, req, server_id, id, body):
63 self._check_body(body)
57 context = req.environ['nova.context']64 context = req.environ['nova.context']
58 if not id in body:65 if not id in body:
59 expl = _('Request body and URI mismatch')66 expl = _('Request body and URI mismatch')
@@ -68,7 +75,7 @@
68 except quota.QuotaError as error:75 except quota.QuotaError as error:
69 self._handle_quota_error(error)76 self._handle_quota_error(error)
7077
71 return req.body78 return body
7279
73 def show(self, req, server_id, id):80 def show(self, req, server_id, id):
74 """ Return a single metadata item """81 """ Return a single metadata item """
7582
=== modified file 'nova/tests/api/openstack/test_server_metadata.py'
--- nova/tests/api/openstack/test_server_metadata.py 2011-04-19 17:46:43 +0000
+++ nova/tests/api/openstack/test_server_metadata.py 2011-06-13 12:58:30 +0000
@@ -89,6 +89,7 @@
89 res = req.get_response(fakes.wsgi_app())89 res = req.get_response(fakes.wsgi_app())
90 res_dict = json.loads(res.body)90 res_dict = json.loads(res.body)
91 self.assertEqual(200, res.status_int)91 self.assertEqual(200, res.status_int)
92 self.assertEqual('application/json', res.headers['Content-Type'])
92 self.assertEqual('value1', res_dict['metadata']['key1'])93 self.assertEqual('value1', res_dict['metadata']['key1'])
9394
94 def test_index_no_data(self):95 def test_index_no_data(self):
@@ -99,6 +100,7 @@
99 res = req.get_response(fakes.wsgi_app())100 res = req.get_response(fakes.wsgi_app())
100 res_dict = json.loads(res.body)101 res_dict = json.loads(res.body)
101 self.assertEqual(200, res.status_int)102 self.assertEqual(200, res.status_int)
103 self.assertEqual('application/json', res.headers['Content-Type'])
102 self.assertEqual(0, len(res_dict['metadata']))104 self.assertEqual(0, len(res_dict['metadata']))
103105
104 def test_show(self):106 def test_show(self):
@@ -109,6 +111,7 @@
109 res = req.get_response(fakes.wsgi_app())111 res = req.get_response(fakes.wsgi_app())
110 res_dict = json.loads(res.body)112 res_dict = json.loads(res.body)
111 self.assertEqual(200, res.status_int)113 self.assertEqual(200, res.status_int)
114 self.assertEqual('application/json', res.headers['Content-Type'])
112 self.assertEqual('value5', res_dict['key5'])115 self.assertEqual('value5', res_dict['key5'])
113116
114 def test_show_meta_not_found(self):117 def test_show_meta_not_found(self):
@@ -140,8 +143,19 @@
140 res = req.get_response(fakes.wsgi_app())143 res = req.get_response(fakes.wsgi_app())
141 res_dict = json.loads(res.body)144 res_dict = json.loads(res.body)
142 self.assertEqual(200, res.status_int)145 self.assertEqual(200, res.status_int)
146 self.assertEqual('application/json', res.headers['Content-Type'])
143 self.assertEqual('value1', res_dict['metadata']['key1'])147 self.assertEqual('value1', res_dict['metadata']['key1'])
144148
149 def test_create_empty_body(self):
150 self.stubs.Set(nova.db.api, 'instance_metadata_update_or_create',
151 return_create_instance_metadata)
152 req = webob.Request.blank('/v1.1/servers/1/meta')
153 req.environ['api.version'] = '1.1'
154 req.method = 'POST'
155 req.headers["content-type"] = "application/json"
156 res = req.get_response(fakes.wsgi_app())
157 self.assertEqual(400, res.status_int)
158
145 def test_update_item(self):159 def test_update_item(self):
146 self.stubs.Set(nova.db.api, 'instance_metadata_update_or_create',160 self.stubs.Set(nova.db.api, 'instance_metadata_update_or_create',
147 return_create_instance_metadata)161 return_create_instance_metadata)
@@ -152,9 +166,20 @@
152 req.headers["content-type"] = "application/json"166 req.headers["content-type"] = "application/json"
153 res = req.get_response(fakes.wsgi_app())167 res = req.get_response(fakes.wsgi_app())
154 self.assertEqual(200, res.status_int)168 self.assertEqual(200, res.status_int)
169 self.assertEqual('application/json', res.headers['Content-Type'])
155 res_dict = json.loads(res.body)170 res_dict = json.loads(res.body)
156 self.assertEqual('value1', res_dict['key1'])171 self.assertEqual('value1', res_dict['key1'])
157172
173 def test_update_item_empty_body(self):
174 self.stubs.Set(nova.db.api, 'instance_metadata_update_or_create',
175 return_create_instance_metadata)
176 req = webob.Request.blank('/v1.1/servers/1/meta/key1')
177 req.environ['api.version'] = '1.1'
178 req.method = 'PUT'
179 req.headers["content-type"] = "application/json"
180 res = req.get_response(fakes.wsgi_app())
181 self.assertEqual(400, res.status_int)
182
158 def test_update_item_too_many_keys(self):183 def test_update_item_too_many_keys(self):
159 self.stubs.Set(nova.db.api, 'instance_metadata_update_or_create',184 self.stubs.Set(nova.db.api, 'instance_metadata_update_or_create',
160 return_create_instance_metadata)185 return_create_instance_metadata)