Merge lp:~ironcamel/nova/http-error-codes into lp:~hudson-openstack/nova/trunk

Proposed by Naveed Massjouni
Status: Merged
Approved by: Jay Pipes
Approved revision: 762
Merged at revision: 772
Proposed branch: lp:~ironcamel/nova/http-error-codes
Merge into: lp:~hudson-openstack/nova/trunk
Diff against target: 114 lines (+40/-21)
3 files modified
nova/api/openstack/common.py (+8/-5)
nova/tests/api/openstack/test_common.py (+4/-16)
nova/tests/api/openstack/test_servers.py (+28/-0)
To merge this branch: bzr merge lp:~ironcamel/nova/http-error-codes
Reviewer Review Type Date Requested Status
Jay Pipes (community) Approve
Rick Harris (community) Approve
Todd Willey (community) Approve
Titan Pending
Review via email: mp+52492@code.launchpad.net

Description of the change

Fixes bug #729400. Invalid values for offset and limit params in http requests now return a 400 response with a useful message in the body. Also added and updated tests.

To post a comment you must log in.
Revision history for this message
justinsb (justin-fathomdb) wrote :

Can this logic be packaged into a reusable function? DRY :-)

Revision history for this message
Gabe Westmaas (westmaas) wrote :

lgtm.

I 100% agree we shouldn't repeat ourselves, but I don't think we need to worry about it until someone does something that would repeat this. YAGNI :)

If this is already being done elsewhere though, we should combine it, absolutely.

Revision history for this message
Todd Willey (xtoddx) wrote :

looks straightforward enough

review: Approve
Revision history for this message
Rick Harris (rconradharris) wrote :

lgtm

review: Approve
Revision history for this message
Jay Pipes (jaypipes) wrote :

lgtm.

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'nova/api/openstack/common.py'
--- nova/api/openstack/common.py 2011-02-28 19:49:03 +0000
+++ nova/api/openstack/common.py 2011-03-07 23:19:15 +0000
@@ -36,15 +36,18 @@
36 try:36 try:
37 offset = int(request.GET.get('offset', 0))37 offset = int(request.GET.get('offset', 0))
38 except ValueError:38 except ValueError:
39 offset = 039 raise webob.exc.HTTPBadRequest(_('offset param must be an integer'))
4040
41 try:41 try:
42 limit = int(request.GET.get('limit', max_limit))42 limit = int(request.GET.get('limit', max_limit))
43 except ValueError:43 except ValueError:
44 limit = max_limit44 raise webob.exc.HTTPBadRequest(_('limit param must be an integer'))
4545
46 if offset < 0 or limit < 0:46 if limit < 0:
47 raise webob.exc.HTTPBadRequest()47 raise webob.exc.HTTPBadRequest(_('limit param must be positive'))
48
49 if offset < 0:
50 raise webob.exc.HTTPBadRequest(_('offset param must be positive'))
4851
49 limit = min(max_limit, limit or max_limit)52 limit = min(max_limit, limit or max_limit)
50 range_end = offset + limit53 range_end = offset + limit
5154
=== modified file 'nova/tests/api/openstack/test_common.py'
--- nova/tests/api/openstack/test_common.py 2011-02-28 19:49:03 +0000
+++ nova/tests/api/openstack/test_common.py 2011-03-07 23:19:15 +0000
@@ -79,20 +79,14 @@
79 Test offset key works with a blank offset.79 Test offset key works with a blank offset.
80 """80 """
81 req = Request.blank('/?offset=')81 req = Request.blank('/?offset=')
82 self.assertEqual(limited(self.tiny, req), self.tiny)82 self.assertRaises(webob.exc.HTTPBadRequest, limited, self.tiny, req)
83 self.assertEqual(limited(self.small, req), self.small)
84 self.assertEqual(limited(self.medium, req), self.medium)
85 self.assertEqual(limited(self.large, req), self.large[:1000])
8683
87 def test_limiter_offset_bad(self):84 def test_limiter_offset_bad(self):
88 """85 """
89 Test offset key works with a BAD offset.86 Test offset key works with a BAD offset.
90 """87 """
91 req = Request.blank(u'/?offset=\u0020aa')88 req = Request.blank(u'/?offset=\u0020aa')
92 self.assertEqual(limited(self.tiny, req), self.tiny)89 self.assertRaises(webob.exc.HTTPBadRequest, limited, self.tiny, req)
93 self.assertEqual(limited(self.small, req), self.small)
94 self.assertEqual(limited(self.medium, req), self.medium)
95 self.assertEqual(limited(self.large, req), self.large[:1000])
9690
97 def test_limiter_nothing(self):91 def test_limiter_nothing(self):
98 """92 """
@@ -166,18 +160,12 @@
166 """160 """
167 Test a negative limit.161 Test a negative limit.
168 """162 """
169 def _limit_large():
170 limited(self.large, req, max_limit=2000)
171
172 req = Request.blank('/?limit=-3000')163 req = Request.blank('/?limit=-3000')
173 self.assertRaises(webob.exc.HTTPBadRequest, _limit_large)164 self.assertRaises(webob.exc.HTTPBadRequest, limited, self.tiny, req)
174165
175 def test_limiter_negative_offset(self):166 def test_limiter_negative_offset(self):
176 """167 """
177 Test a negative offset.168 Test a negative offset.
178 """169 """
179 def _limit_large():
180 limited(self.large, req, max_limit=2000)
181
182 req = Request.blank('/?offset=-30')170 req = Request.blank('/?offset=-30')
183 self.assertRaises(webob.exc.HTTPBadRequest, _limit_large)171 self.assertRaises(webob.exc.HTTPBadRequest, limited, self.tiny, req)
184172
=== modified file 'nova/tests/api/openstack/test_servers.py'
--- nova/tests/api/openstack/test_servers.py 2011-03-02 17:39:30 +0000
+++ nova/tests/api/openstack/test_servers.py 2011-03-07 23:19:15 +0000
@@ -188,6 +188,34 @@
188 self.assertEqual(s.get('imageId', None), None)188 self.assertEqual(s.get('imageId', None), None)
189 i += 1189 i += 1
190190
191 def test_get_servers_with_limit(self):
192 req = webob.Request.blank('/v1.0/servers?limit=3')
193 res = req.get_response(fakes.wsgi_app())
194 servers = json.loads(res.body)['servers']
195 self.assertEqual([s['id'] for s in servers], [0, 1, 2])
196
197 req = webob.Request.blank('/v1.0/servers?limit=aaa')
198 res = req.get_response(fakes.wsgi_app())
199 self.assertEqual(res.status_int, 400)
200 self.assertTrue('limit' in res.body)
201
202 def test_get_servers_with_offset(self):
203 req = webob.Request.blank('/v1.0/servers?offset=2')
204 res = req.get_response(fakes.wsgi_app())
205 servers = json.loads(res.body)['servers']
206 self.assertEqual([s['id'] for s in servers], [2, 3, 4])
207
208 req = webob.Request.blank('/v1.0/servers?offset=aaa')
209 res = req.get_response(fakes.wsgi_app())
210 self.assertEqual(res.status_int, 400)
211 self.assertTrue('offset' in res.body)
212
213 def test_get_servers_with_limit_and_offset(self):
214 req = webob.Request.blank('/v1.0/servers?limit=2&offset=1')
215 res = req.get_response(fakes.wsgi_app())
216 servers = json.loads(res.body)['servers']
217 self.assertEqual([s['id'] for s in servers], [1, 2])
218
191 def test_create_instance(self):219 def test_create_instance(self):
192 def instance_create(context, inst):220 def instance_create(context, inst):
193 return {'id': '1', 'display_name': ''}221 return {'id': '1', 'display_name': ''}