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
1=== modified file 'nova/api/openstack/common.py'
2--- nova/api/openstack/common.py 2011-02-28 19:49:03 +0000
3+++ nova/api/openstack/common.py 2011-03-07 23:19:15 +0000
4@@ -36,15 +36,18 @@
5 try:
6 offset = int(request.GET.get('offset', 0))
7 except ValueError:
8- offset = 0
9+ raise webob.exc.HTTPBadRequest(_('offset param must be an integer'))
10
11 try:
12 limit = int(request.GET.get('limit', max_limit))
13 except ValueError:
14- limit = max_limit
15-
16- if offset < 0 or limit < 0:
17- raise webob.exc.HTTPBadRequest()
18+ raise webob.exc.HTTPBadRequest(_('limit param must be an integer'))
19+
20+ if limit < 0:
21+ raise webob.exc.HTTPBadRequest(_('limit param must be positive'))
22+
23+ if offset < 0:
24+ raise webob.exc.HTTPBadRequest(_('offset param must be positive'))
25
26 limit = min(max_limit, limit or max_limit)
27 range_end = offset + limit
28
29=== modified file 'nova/tests/api/openstack/test_common.py'
30--- nova/tests/api/openstack/test_common.py 2011-02-28 19:49:03 +0000
31+++ nova/tests/api/openstack/test_common.py 2011-03-07 23:19:15 +0000
32@@ -79,20 +79,14 @@
33 Test offset key works with a blank offset.
34 """
35 req = Request.blank('/?offset=')
36- self.assertEqual(limited(self.tiny, req), self.tiny)
37- self.assertEqual(limited(self.small, req), self.small)
38- self.assertEqual(limited(self.medium, req), self.medium)
39- self.assertEqual(limited(self.large, req), self.large[:1000])
40+ self.assertRaises(webob.exc.HTTPBadRequest, limited, self.tiny, req)
41
42 def test_limiter_offset_bad(self):
43 """
44 Test offset key works with a BAD offset.
45 """
46 req = Request.blank(u'/?offset=\u0020aa')
47- self.assertEqual(limited(self.tiny, req), self.tiny)
48- self.assertEqual(limited(self.small, req), self.small)
49- self.assertEqual(limited(self.medium, req), self.medium)
50- self.assertEqual(limited(self.large, req), self.large[:1000])
51+ self.assertRaises(webob.exc.HTTPBadRequest, limited, self.tiny, req)
52
53 def test_limiter_nothing(self):
54 """
55@@ -166,18 +160,12 @@
56 """
57 Test a negative limit.
58 """
59- def _limit_large():
60- limited(self.large, req, max_limit=2000)
61-
62 req = Request.blank('/?limit=-3000')
63- self.assertRaises(webob.exc.HTTPBadRequest, _limit_large)
64+ self.assertRaises(webob.exc.HTTPBadRequest, limited, self.tiny, req)
65
66 def test_limiter_negative_offset(self):
67 """
68 Test a negative offset.
69 """
70- def _limit_large():
71- limited(self.large, req, max_limit=2000)
72-
73 req = Request.blank('/?offset=-30')
74- self.assertRaises(webob.exc.HTTPBadRequest, _limit_large)
75+ self.assertRaises(webob.exc.HTTPBadRequest, limited, self.tiny, req)
76
77=== modified file 'nova/tests/api/openstack/test_servers.py'
78--- nova/tests/api/openstack/test_servers.py 2011-03-02 17:39:30 +0000
79+++ nova/tests/api/openstack/test_servers.py 2011-03-07 23:19:15 +0000
80@@ -188,6 +188,34 @@
81 self.assertEqual(s.get('imageId', None), None)
82 i += 1
83
84+ def test_get_servers_with_limit(self):
85+ req = webob.Request.blank('/v1.0/servers?limit=3')
86+ res = req.get_response(fakes.wsgi_app())
87+ servers = json.loads(res.body)['servers']
88+ self.assertEqual([s['id'] for s in servers], [0, 1, 2])
89+
90+ req = webob.Request.blank('/v1.0/servers?limit=aaa')
91+ res = req.get_response(fakes.wsgi_app())
92+ self.assertEqual(res.status_int, 400)
93+ self.assertTrue('limit' in res.body)
94+
95+ def test_get_servers_with_offset(self):
96+ req = webob.Request.blank('/v1.0/servers?offset=2')
97+ res = req.get_response(fakes.wsgi_app())
98+ servers = json.loads(res.body)['servers']
99+ self.assertEqual([s['id'] for s in servers], [2, 3, 4])
100+
101+ req = webob.Request.blank('/v1.0/servers?offset=aaa')
102+ res = req.get_response(fakes.wsgi_app())
103+ self.assertEqual(res.status_int, 400)
104+ self.assertTrue('offset' in res.body)
105+
106+ def test_get_servers_with_limit_and_offset(self):
107+ req = webob.Request.blank('/v1.0/servers?limit=2&offset=1')
108+ res = req.get_response(fakes.wsgi_app())
109+ servers = json.loads(res.body)['servers']
110+ self.assertEqual([s['id'] for s in servers], [1, 2])
111+
112 def test_create_instance(self):
113 def instance_create(context, inst):
114 return {'id': '1', 'display_name': ''}