diff options
| author | William Wolf <throughnothing@gmail.com> | 2011-09-15 10:21:33 -0400 |
|---|---|---|
| committer | William Wolf <throughnothing@gmail.com> | 2011-09-15 10:21:33 -0400 |
| commit | 41e8bbd9fd9daa669e0becd762c3c0e4639287ea (patch) | |
| tree | 51f93f60671506b1ee60871520f95368ac480353 | |
| parent | bfa8075f659f6fe18eb2442f2ae0722d0fd1c2ff (diff) | |
| download | nova-41e8bbd9fd9daa669e0becd762c3c0e4639287ea.tar.gz nova-41e8bbd9fd9daa669e0becd762c3c0e4639287ea.tar.xz nova-41e8bbd9fd9daa669e0becd762c3c0e4639287ea.zip | |
added servers_links in v1.1 with tests
| -rw-r--r-- | nova/api/openstack/servers.py | 2 | ||||
| -rw-r--r-- | nova/api/openstack/views/servers.py | 19 | ||||
| -rw-r--r-- | nova/tests/api/openstack/test_servers.py | 78 |
3 files changed, 97 insertions, 2 deletions
diff --git a/nova/api/openstack/servers.py b/nova/api/openstack/servers.py index 02bce1b50..30933ca34 100644 --- a/nova/api/openstack/servers.py +++ b/nova/api/openstack/servers.py @@ -699,7 +699,7 @@ class ControllerV11(Controller): builder = nova.api.openstack.views.servers.ViewBuilderV11( addresses_builder, flavor_builder, image_builder, base_url, project_id) - return builder.build_list(instances, is_detail=is_detail) + return builder.build_list(instances, is_detail=is_detail, **params) def _action_change_password(self, input_dict, req, id): context = req.environ['nova.context'] diff --git a/nova/api/openstack/views/servers.py b/nova/api/openstack/views/servers.py index 1228c81f7..52e0850fb 100644 --- a/nova/api/openstack/views/servers.py +++ b/nova/api/openstack/views/servers.py @@ -217,13 +217,30 @@ class ViewBuilderV11(ViewBuilder): def build_list(self, server_objs, is_detail=False, **kwargs): limit = kwargs.get('limit', None) + print "BUILD LIST 11", limit servers = [] servers_links = [] for server_obj in server_objs: servers.append(self.build(server_obj, is_detail)['server']) - return dict(servers=servers) + if (len(servers) and limit) and (limit == len(servers)): + print "LIMIT SET" + next_link = self.generate_next_link(servers[-1]['id'], + limit, is_detail) + servers_links = [dict(rel='next', href=next_link)] + + reval = dict(servers=servers) + if len(servers_links) > 0: + reval['servers_links'] = servers_links + + return reval + + def generate_next_link(self, server_id, limit, is_detail=False): + """ Return an href string with proper limit and marker params""" + return "%s?limit=%s&marker=%s" % ( + os.path.join(self.base_url, self.project_id, "servers"), + limit, server_id) def generate_href(self, server_id): """Create an url that refers to a specific server id.""" diff --git a/nova/tests/api/openstack/test_servers.py b/nova/tests/api/openstack/test_servers.py index b269b3961..065c3d80f 100644 --- a/nova/tests/api/openstack/test_servers.py +++ b/nova/tests/api/openstack/test_servers.py @@ -1150,6 +1150,48 @@ class ServersTest(test.TestCase): self.assertEqual(res.status_int, 400) self.assertTrue('limit' in res.body) + def test_get_servers_with_limit_v1_1(self): + req = webob.Request.blank('/v1.1/fake/servers?limit=3') + res = req.get_response(fakes.wsgi_app()) + servers = json.loads(res.body)['servers'] + servers_links = json.loads(res.body)['servers_links'] + print res + print servers_links + self.assertEqual([s['id'] for s in servers], [0, 1, 2]) + self.assertEqual(servers_links[0]['rel'], 'next') + self.assertEqual(servers_links[0]['href'], + 'http://localhost/v1.1/fake/servers?limit=3&marker=2') + + req = webob.Request.blank('/v1.1/fake/servers?limit=aaa') + res = req.get_response(fakes.wsgi_app()) + self.assertEqual(res.status_int, 400) + self.assertTrue('limit' in res.body) + + def test_get_server_details_with_limit_v1_1(self): + req = webob.Request.blank('/v1.1/fake/servers/detail?limit=3') + res = req.get_response(fakes.wsgi_app()) + servers = json.loads(res.body)['servers'] + servers_links = json.loads(res.body)['servers_links'] + print res + print servers_links + self.fail() + self.assertEqual([s['id'] for s in servers], [0, 1, 2]) + self.assertEqual(servers_links[0]['rel'], 'next') + self.assertEqual(servers_links[0]['href'], + 'http://localhost/v1.1/fake/servers?limit=3&marker=2') + + req = webob.Request.blank('/v1.1/fake/servers/detail?limit=aaa') + res = req.get_response(fakes.wsgi_app()) + self.assertEqual(res.status_int, 400) + self.assertTrue('limit' in res.body) + + def test_get_servers_with_too_big_limit_v1_1(self): + req = webob.Request.blank('/v1.1/fake/servers?limit=30') + res = req.get_response(fakes.wsgi_app()) + res_dict = json.loads(res.body) + print res + self.assertTrue('servers_links' not in res_dict) + def test_get_servers_with_offset(self): req = webob.Request.blank('/v1.0/servers?offset=2') res = req.get_response(fakes.wsgi_app()) @@ -2428,6 +2470,42 @@ class ServersTest(test.TestCase): } req = webob.Request.blank('/v1.1/fake/servers/detail') res = req.get_response(fakes.wsgi_app()) + print res.body + self.fail() + res_dict = json.loads(res.body) + + for i, s in enumerate(res_dict['servers']): + self.assertEqual(s['id'], i) + self.assertEqual(s['hostId'], '') + self.assertEqual(s['name'], 'server%d' % i) + self.assertEqual(s['image'], expected_image) + self.assertEqual(s['flavor'], expected_flavor) + self.assertEqual(s['status'], 'BUILD') + self.assertEqual(s['metadata']['seq'], str(i)) + + def test_get_all_server_details_v1_1_with_limit(self): + expected_flavor = { + "id": "1", + "links": [ + { + "rel": "bookmark", + "href": 'http://localhost/fake/flavors/1', + }, + ], + } + expected_image = { + "id": "10", + "links": [ + { + "rel": "bookmark", + "href": 'http://localhost/fake/images/10', + }, + ], + } + req = webob.Request.blank('/v1.1/fake/servers/detail') + res = req.get_response(fakes.wsgi_app()) + print res.body + self.fail() res_dict = json.loads(res.body) for i, s in enumerate(res_dict['servers']): |
