summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWilliam Wolf <throughnothing@gmail.com>2011-09-15 10:21:33 -0400
committerWilliam Wolf <throughnothing@gmail.com>2011-09-15 10:21:33 -0400
commit41e8bbd9fd9daa669e0becd762c3c0e4639287ea (patch)
tree51f93f60671506b1ee60871520f95368ac480353
parentbfa8075f659f6fe18eb2442f2ae0722d0fd1c2ff (diff)
downloadnova-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.py2
-rw-r--r--nova/api/openstack/views/servers.py19
-rw-r--r--nova/tests/api/openstack/test_servers.py78
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']):