diff options
| author | Jenkins <jenkins@review.openstack.org> | 2012-01-24 07:11:26 +0000 |
|---|---|---|
| committer | Gerrit Code Review <review@openstack.org> | 2012-01-24 07:11:26 +0000 |
| commit | 7d9d2ec38747e6683ec97cd7c1af2e98eb82ea56 (patch) | |
| tree | c181dbd149fdd8b7e912b0afed635207c46823b5 | |
| parent | b8f78573138ef74ebff0d28f480f5f84e3d7a7d3 (diff) | |
| parent | 48f4e140ec929d8abec6145088df9db758ecda9a (diff) | |
| download | nova-7d9d2ec38747e6683ec97cd7c1af2e98eb82ea56.tar.gz nova-7d9d2ec38747e6683ec97cd7c1af2e98eb82ea56.tar.xz nova-7d9d2ec38747e6683ec97cd7c1af2e98eb82ea56.zip | |
Merge "Fixed limiting for flavors"
| -rw-r--r-- | nova/api/openstack/common.py | 7 | ||||
| -rw-r--r-- | nova/api/openstack/compute/flavors.py | 7 | ||||
| -rw-r--r-- | nova/api/openstack/compute/views/flavors.py | 23 | ||||
| -rw-r--r-- | nova/tests/api/openstack/compute/test_flavors.py | 82 |
4 files changed, 106 insertions, 13 deletions
diff --git a/nova/api/openstack/common.py b/nova/api/openstack/common.py index 15f5be737..f3aa3a564 100644 --- a/nova/api/openstack/common.py +++ b/nova/api/openstack/common.py @@ -504,13 +504,16 @@ class ViewBuilder(object): self._collection_name, str(identifier)) - def _get_collection_links(self, request, items): + def _get_collection_links(self, request, items, id_key="uuid"): """Retrieve 'next' link, if applicable.""" links = [] limit = int(request.params.get("limit", 0)) if limit and limit == len(items): last_item = items[-1] - last_item_id = last_item.get("uuid", last_item["id"]) + if id_key in last_item: + last_item_id = last_item[id_key] + else: + last_item_id = last_item["id"] links.append({ "rel": "next", "href": self._get_next_link(request, last_item_id), diff --git a/nova/api/openstack/compute/flavors.py b/nova/api/openstack/compute/flavors.py index b5212e703..c7ceecbec 100644 --- a/nova/api/openstack/compute/flavors.py +++ b/nova/api/openstack/compute/flavors.py @@ -18,6 +18,7 @@ import webob from nova.api.openstack.compute.views import flavors as flavors_view +from nova.api.openstack import common from nova.api.openstack import wsgi from nova.api.openstack import xmlutil from nova.compute import instance_types @@ -72,13 +73,15 @@ class Controller(wsgi.Controller): def index(self, req): """Return all flavors in brief.""" flavors = self._get_flavors(req) - return self._view_builder.index(req, flavors) + limited_flavors = common.limited_by_marker(flavors.values(), req) + return self._view_builder.index(req, limited_flavors) @wsgi.serializers(xml=FlavorsTemplate) def detail(self, req): """Return all flavors in detail.""" flavors = self._get_flavors(req) - return self._view_builder.detail(req, flavors) + limited_flavors = common.limited_by_marker(flavors.values(), req) + return self._view_builder.detail(req, limited_flavors) @wsgi.serializers(xml=FlavorTemplate) def show(self, req, id): diff --git a/nova/api/openstack/compute/views/flavors.py b/nova/api/openstack/compute/views/flavors.py index 64284e406..050ea20d3 100644 --- a/nova/api/openstack/compute/views/flavors.py +++ b/nova/api/openstack/compute/views/flavors.py @@ -47,16 +47,21 @@ class ViewBuilder(common.ViewBuilder): def index(self, request, flavors): """Return the 'index' view of flavors.""" - def _get_flavors(request, flavors): - for _, flavor in flavors.iteritems(): - yield self.basic(request, flavor)["flavor"] - - return dict(flavors=list(_get_flavors(request, flavors))) + return self._list_view(self.basic, request, flavors) def detail(self, request, flavors): """Return the 'detail' view of flavors.""" - def _get_flavors(request, flavors): - for _, flavor in flavors.iteritems(): - yield self.show(request, flavor)["flavor"] + return self._list_view(self.show, request, flavors) + + def _list_view(self, func, request, flavors): + """Provide a view for a list of flavors.""" + flavor_list = [func(request, flavor)["flavor"] for flavor in flavors] + flavors_links = self._get_collection_links(request, + flavors, + "flavorid") + flavors_dict = dict(flavors=flavor_list) + + if flavors_links: + flavors_dict["flavors_links"] = flavors_links - return dict(flavors=list(_get_flavors(request, flavors))) + return flavors_dict diff --git a/nova/tests/api/openstack/compute/test_flavors.py b/nova/tests/api/openstack/compute/test_flavors.py index 37b67fc32..672f5b8eb 100644 --- a/nova/tests/api/openstack/compute/test_flavors.py +++ b/nova/tests/api/openstack/compute/test_flavors.py @@ -18,11 +18,14 @@ from lxml import etree import webob +import urlparse + from nova.api.openstack.compute import flavors from nova.api.openstack import xmlutil import nova.compute.instance_types from nova import exception from nova import test +from nova import utils from nova.tests.api.openstack import fakes @@ -164,6 +167,84 @@ class FlavorsTest(test.TestCase): } self.assertEqual(flavor, expected) + def test_get_flavor_detail_with_limit(self): + req = fakes.HTTPRequest.blank('/v2/fake/flavors/detail?limit=1') + response = self.controller.index(req) + response_list = response["flavors"] + response_links = response["flavors_links"] + + alternate = "%s/fake/flavors/%s" + + expected_flavors = [ + { + "id": "1", + "name": "flavor 1", + "links": [ + { + "rel": "self", + "href": "http://localhost/v2/fake/flavors/1", + }, + { + "rel": "bookmark", + "href": "http://localhost/fake/flavors/1", + }, + ], + }, + ] + self.assertEqual(response_list, expected_flavors) + self.assertEqual(response_links[0]['rel'], 'next') + + href_parts = urlparse.urlparse(response_links[0]['href']) + self.assertEqual('/v2/fake/flavors', href_parts.path) + params = urlparse.parse_qs(href_parts.query) + self.assertDictMatch({'limit': ['1'], 'marker': ['1']}, params) + + def test_get_flavor_with_limit(self): + req = fakes.HTTPRequest.blank('/v2/fake/flavors?limit=2') + response = self.controller.index(req) + response_list = response["flavors"] + response_links = response["flavors_links"] + + alternate = "%s/fake/flavors/%s" + + expected_flavors = [ + { + "id": "1", + "name": "flavor 1", + "links": [ + { + "rel": "self", + "href": "http://localhost/v2/fake/flavors/1", + }, + { + "rel": "bookmark", + "href": "http://localhost/fake/flavors/1", + }, + ], + }, + { + "id": "2", + "name": "flavor 2", + "links": [ + { + "rel": "self", + "href": "http://localhost/v2/fake/flavors/2", + }, + { + "rel": "bookmark", + "href": "http://localhost/fake/flavors/2", + }, + ], + } + ] + self.assertEqual(response_list, expected_flavors) + self.assertEqual(response_links[0]['rel'], 'next') + + href_parts = urlparse.urlparse(response_links[0]['href']) + self.assertEqual('/v2/fake/flavors', href_parts.path) + params = urlparse.parse_qs(href_parts.query) + self.assertDictMatch({'limit': ['2'], 'marker': ['2']}, params) + def test_get_flavor_list_detail(self): req = fakes.HTTPRequest.blank('/v2/fake/flavors/detail') flavor = self.controller.detail(req) @@ -222,6 +303,7 @@ class FlavorsTest(test.TestCase): def test_get_flavor_list_filter_min_ram(self): """Flavor lists may be filtered by minRam""" + self.maxDiff = None req = fakes.HTTPRequest.blank('/v2/fake/flavors?minRam=512') flavor = self.controller.index(req) expected = { |
