From bfa8075f659f6fe18eb2442f2ae0722d0fd1c2ff Mon Sep 17 00:00:00 2001 From: William Wolf Date: Thu, 15 Sep 2011 10:00:38 -0400 Subject: added build_list to servers controllers and view builder and kept all old tests passing --- nova/api/openstack/servers.py | 27 +++++++++++++++++++++++---- nova/api/openstack/views/servers.py | 22 +++++++++++++++++++++- nova/tests/api/openstack/test_servers.py | 2 ++ 3 files changed, 46 insertions(+), 5 deletions(-) diff --git a/nova/api/openstack/servers.py b/nova/api/openstack/servers.py index 5affd1f33..02bce1b50 100644 --- a/nova/api/openstack/servers.py +++ b/nova/api/openstack/servers.py @@ -75,6 +75,9 @@ class Controller(object): def _build_view(self, req, instance, is_detail=False): raise NotImplementedError() + def _build_list(self, req, instances, is_detail=False): + raise NotImplementedError() + def _limit_items(self, items, req): raise NotImplementedError() @@ -130,10 +133,7 @@ class Controller(object): search_opts=search_opts) limited_list = self._limit_items(instance_list, req) - servers = [self._build_view(req, inst, is_detail)['server'] - for inst in limited_list] - - return dict(servers=servers) + return self._build_list(req, limited_list, is_detail=is_detail) @scheduler_api.redirect_handler def show(self, req, id): @@ -589,6 +589,11 @@ class ControllerV10(Controller): builder = nova.api.openstack.views.servers.ViewBuilderV10(addresses) return builder.build(instance, is_detail=is_detail) + def _build_list(self, req, instances, is_detail=False): + addresses = nova.api.openstack.views.addresses.ViewBuilderV10() + builder = nova.api.openstack.views.servers.ViewBuilderV10(addresses) + return builder.build_list(instances, is_detail=is_detail) + def _limit_items(self, items, req): return common.limited(items, req) @@ -682,6 +687,20 @@ class ControllerV11(Controller): return builder.build(instance, is_detail=is_detail) + def _build_list(self, req, instances, is_detail=False): + params = common.get_pagination_params(req) + project_id = getattr(req.environ['nova.context'], 'project_id', '') + base_url = req.application_url + flavor_builder = nova.api.openstack.views.flavors.ViewBuilderV11( + base_url, project_id) + image_builder = nova.api.openstack.views.images.ViewBuilderV11( + base_url, project_id) + addresses_builder = nova.api.openstack.views.addresses.ViewBuilderV11() + 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) + def _action_change_password(self, input_dict, req, id): context = req.environ['nova.context'] if (not 'changePassword' in input_dict diff --git a/nova/api/openstack/views/servers.py b/nova/api/openstack/views/servers.py index 473dc9e7e..1228c81f7 100644 --- a/nova/api/openstack/views/servers.py +++ b/nova/api/openstack/views/servers.py @@ -40,7 +40,7 @@ class ViewBuilder(object): def __init__(self, addresses_builder): self.addresses_builder = addresses_builder - def build(self, inst, is_detail): + def build(self, inst, is_detail=False): """Return a dict that represenst a server.""" if inst.get('_is_precooked', False): server = dict(server=inst) @@ -54,6 +54,16 @@ class ViewBuilder(object): return server + def build_list(self, server_objs, is_detail=False, **kwargs): + limit = kwargs.get('limit', None) + servers = [] + servers_links = [] + + for server_obj in server_objs: + servers.append(self.build(server_obj, is_detail)['server']) + + return dict(servers=servers) + def _build_simple(self, inst): """Return a simple model of a server.""" return dict(server=dict(id=inst['id'], name=inst['display_name'])) @@ -205,6 +215,16 @@ class ViewBuilderV11(ViewBuilder): response["links"] = links + def build_list(self, server_objs, is_detail=False, **kwargs): + limit = kwargs.get('limit', None) + servers = [] + servers_links = [] + + for server_obj in server_objs: + servers.append(self.build(server_obj, is_detail)['server']) + + return dict(servers=servers) + def generate_href(self, server_id): """Create an url that refers to a specific server id.""" return os.path.join(self.base_url, self.project_id, diff --git a/nova/tests/api/openstack/test_servers.py b/nova/tests/api/openstack/test_servers.py index ee7927c64..b269b3961 100644 --- a/nova/tests/api/openstack/test_servers.py +++ b/nova/tests/api/openstack/test_servers.py @@ -2393,10 +2393,12 @@ class ServersTest(test.TestCase): def test_get_all_server_details_v1_0(self): req = webob.Request.blank('/v1.0/servers/detail') res = req.get_response(fakes.wsgi_app()) + print res.body self.assertEqual(res.status_int, 200) res_dict = json.loads(res.body) for i, s in enumerate(res_dict['servers']): + print i, ' --:-- ', s self.assertEqual(s['id'], i) self.assertEqual(s['hostId'], '') self.assertEqual(s['name'], 'server%d' % i) -- cgit