From 8a922df86b0c76e180294e32afd9c8a25b4cfdf4 Mon Sep 17 00:00:00 2001 From: Lingxian Kong Date: Thu, 26 Jan 2017 15:04:08 +1300 Subject: [PATCH] Only get detailed info for Nova servers when necessary Horizon will get all servers from Nova in different several places, but sometimes it only need ID and name instead of all the related information of servers. novaclient already support 'detailed=False' param for servers query. Horizon page loading performance can also be improved with this patch. Closes-Bug: #1661423 Change-Id: Ic4cc95cb4eaed0461a22ab1045fa83ba5a5e9ce4 (cherry picked from commit c33b0840cbb0f0c29c9e12f56d986c2740d8f9c8) --- openstack_dashboard/api/neutron.py | 2 +- openstack_dashboard/api/nova.py | 4 ++-- .../dashboards/admin/floating_ips/views.py | 3 ++- .../dashboards/admin/volumes/tests.py | 4 ++-- .../dashboards/project/floating_ips/tests.py | 8 +++---- .../dashboards/project/floating_ips/views.py | 3 ++- .../dashboards/project/volumes/tabs.py | 3 ++- .../dashboards/project/volumes/test.py | 6 ++++-- .../project/volumes/volumes/tests.py | 21 ++++++++++++------- .../test/api_tests/network_tests.py | 2 +- 10 files changed, 34 insertions(+), 22 deletions(-) diff --git a/openstack_dashboard/api/neutron.py b/openstack_dashboard/api/neutron.py index b80d67a89..b97d42341 100644 --- a/openstack_dashboard/api/neutron.py +++ b/openstack_dashboard/api/neutron.py @@ -485,7 +485,7 @@ class FloatingIpManager(network_base.FloatingIpManager): def list_targets(self): tenant_id = self.request.user.tenant_id ports = port_list(self.request, tenant_id=tenant_id) - servers, has_more = nova.server_list(self.request) + servers, has_more = nova.server_list(self.request, detailed=False) server_dict = collections.OrderedDict( [(s.id, s.name) for s in servers]) reachable_subnets = self._get_reachable_subnets(ports) diff --git a/openstack_dashboard/api/nova.py b/openstack_dashboard/api/nova.py index e83937710..566229850 100644 --- a/openstack_dashboard/api/nova.py +++ b/openstack_dashboard/api/nova.py @@ -723,7 +723,7 @@ def server_get(request, instance_id): @profiler.trace -def server_list(request, search_opts=None, all_tenants=False): +def server_list(request, search_opts=None, all_tenants=False, detailed=True): page_size = utils.get_page_size(request) c = novaclient(request) paginate = False @@ -739,7 +739,7 @@ def server_list(request, search_opts=None, all_tenants=False): else: search_opts['project_id'] = request.user.tenant_id servers = [Server(s, request) - for s in c.servers.list(True, search_opts)] + for s in c.servers.list(detailed, search_opts)] has_more_data = False if paginate and len(servers) > page_size: diff --git a/openstack_dashboard/dashboards/admin/floating_ips/views.py b/openstack_dashboard/dashboards/admin/floating_ips/views.py index ec1ab82cf..f3ff57135 100644 --- a/openstack_dashboard/dashboards/admin/floating_ips/views.py +++ b/openstack_dashboard/dashboards/admin/floating_ips/views.py @@ -76,7 +76,8 @@ class IndexView(tables.DataTableView): instances = [] try: instances, has_more = api.nova.server_list(self.request, - all_tenants=True) + all_tenants=True, + detailed=False) except Exception: exceptions.handle( self.request, diff --git a/openstack_dashboard/dashboards/admin/volumes/tests.py b/openstack_dashboard/dashboards/admin/volumes/tests.py index ab2415f7e..b704c464c 100644 --- a/openstack_dashboard/dashboards/admin/volumes/tests.py +++ b/openstack_dashboard/dashboards/admin/volumes/tests.py @@ -54,7 +54,7 @@ class VolumeTests(test.BaseAdminViewTests): 'all_tenants': True}).AndReturn([]) if not instanceless_volumes: api.nova.server_list(IsA(http.HttpRequest), search_opts={ - 'all_tenants': True}) \ + 'all_tenants': True}, detailed=False) \ .AndReturn([self.servers.list(), False]) keystone.tenant_list(IsA(http.HttpRequest)) \ .AndReturn([self.tenants.list(), False]) @@ -86,7 +86,7 @@ class VolumeTests(test.BaseAdminViewTests): api.cinder.volume_snapshot_list( IsA(http.HttpRequest), search_opts=None).AndReturn(vol_snaps) api.nova.server_list(IsA(http.HttpRequest), search_opts={ - 'all_tenants': True}) \ + 'all_tenants': True}, detailed=False) \ .AndReturn([self.servers.list(), False]) keystone.tenant_list(IsA(http.HttpRequest)) \ .AndReturn([self.tenants.list(), False]) diff --git a/openstack_dashboard/dashboards/project/floating_ips/tests.py b/openstack_dashboard/dashboards/project/floating_ips/tests.py index 6e3882b6d..be2d8a7ce 100644 --- a/openstack_dashboard/dashboards/project/floating_ips/tests.py +++ b/openstack_dashboard/dashboards/project/floating_ips/tests.py @@ -173,7 +173,7 @@ class FloatingIpViewTests(test.TestCase): def test_disassociate_post(self): floating_ip = self.floating_ips.first() - api.nova.server_list(IsA(http.HttpRequest)) \ + api.nova.server_list(IsA(http.HttpRequest), detailed=False) \ .AndReturn([self.servers.list(), False]) api.network.tenant_floating_ip_list(IsA(http.HttpRequest)) \ .AndReturn(self.floating_ips.list()) @@ -197,7 +197,7 @@ class FloatingIpViewTests(test.TestCase): def test_disassociate_post_with_exception(self): floating_ip = self.floating_ips.first() - api.nova.server_list(IsA(http.HttpRequest)) \ + api.nova.server_list(IsA(http.HttpRequest), detailed=False) \ .AndReturn([self.servers.list(), False]) api.network.tenant_floating_ip_list(IsA(http.HttpRequest)) \ .AndReturn(self.floating_ips.list()) @@ -232,7 +232,7 @@ class FloatingIpViewTests(test.TestCase): IsA(http.HttpRequest)) \ .AndReturn(floating_pools) api.nova.server_list( - IsA(http.HttpRequest)) \ + IsA(http.HttpRequest), detailed=False) \ .AndReturn([self.servers.list(), False]) quotas.tenant_quota_usages( IsA(http.HttpRequest)).MultipleTimes() \ @@ -274,7 +274,7 @@ class FloatingIpViewTests(test.TestCase): IsA(http.HttpRequest)) \ .AndReturn(floating_pools) api.nova.server_list( - IsA(http.HttpRequest)) \ + IsA(http.HttpRequest), detailed=False) \ .AndReturn([self.servers.list(), False]) quotas.tenant_quota_usages( IsA(http.HttpRequest)).MultipleTimes() \ diff --git a/openstack_dashboard/dashboards/project/floating_ips/views.py b/openstack_dashboard/dashboards/project/floating_ips/views.py index 061aa8c60..bb8625f54 100644 --- a/openstack_dashboard/dashboards/project/floating_ips/views.py +++ b/openstack_dashboard/dashboards/project/floating_ips/views.py @@ -116,7 +116,8 @@ class IndexView(tables.DataTableView): try: # TODO(tsufiev): we should pass attached_instance_ids to # nova.server_list as soon as Nova API allows for this - instances, has_more = api.nova.server_list(self.request) + instances, has_more = api.nova.server_list(self.request, + detailed=False) except Exception: exceptions.handle(self.request, _('Unable to retrieve instance list.')) diff --git a/openstack_dashboard/dashboards/project/volumes/tabs.py b/openstack_dashboard/dashboards/project/volumes/tabs.py index 31b04eb26..1e0f82004 100644 --- a/openstack_dashboard/dashboards/project/volumes/tabs.py +++ b/openstack_dashboard/dashboards/project/volumes/tabs.py @@ -62,7 +62,8 @@ class VolumeTableMixIn(object): # TODO(tsufiev): we should pass attached_instance_ids to # nova.server_list as soon as Nova API allows for this instances, has_more = api.nova.server_list(self.request, - search_opts=search_opts) + search_opts=search_opts, + detailed=False) return instances except Exception: exceptions.handle(self.request, diff --git a/openstack_dashboard/dashboards/project/volumes/test.py b/openstack_dashboard/dashboards/project/volumes/test.py index 10a72eb71..edab47399 100644 --- a/openstack_dashboard/dashboards/project/volumes/test.py +++ b/openstack_dashboard/dashboards/project/volumes/test.py @@ -64,7 +64,8 @@ class VolumeAndSnapshotsAndBackupsTests(test.TestCase): sort_dir='desc', paginate=True).\ AndReturn([volumes, False, False]) if not instanceless_volumes: - api.nova.server_list(IsA(http.HttpRequest), search_opts=None).\ + api.nova.server_list(IsA(http.HttpRequest), search_opts=None, + detailed=False).\ AndReturn([self.servers.list(), False]) api.cinder.volume_snapshot_list(IsA(http.HttpRequest)).\ AndReturn(vol_snaps) @@ -123,7 +124,8 @@ class VolumeAndSnapshotsAndBackupsTests(test.TestCase): AndReturn([volumes, has_more, has_prev]) api.cinder.volume_snapshot_list( IsA(http.HttpRequest), search_opts=None).AndReturn(vol_snaps) - api.nova.server_list(IsA(http.HttpRequest), search_opts=None).\ + api.nova.server_list(IsA(http.HttpRequest), search_opts=None, + detailed=False).\ AndReturn([self.servers.list(), False]) api.cinder.tenant_absolute_limits(IsA(http.HttpRequest)).MultipleTimes().\ AndReturn(self.cinder_limits['absolute']) diff --git a/openstack_dashboard/dashboards/project/volumes/volumes/tests.py b/openstack_dashboard/dashboards/project/volumes/volumes/tests.py index a02e32350..253a3153e 100644 --- a/openstack_dashboard/dashboards/project/volumes/volumes/tests.py +++ b/openstack_dashboard/dashboards/project/volumes/volumes/tests.py @@ -942,7 +942,8 @@ class VolumeViewTests(test.ResetImageAPIVersionMixin, test.TestCase): search_opts=None).\ AndReturn([]) cinder.volume_delete(IsA(http.HttpRequest), volume.id) - api.nova.server_list(IsA(http.HttpRequest), search_opts=None).\ + api.nova.server_list(IsA(http.HttpRequest), search_opts=None, + detailed=False).\ AndReturn([self.servers.list(), False]) cinder.volume_list_paged( IsA(http.HttpRequest), marker=None, paginate=True, sort_dir='desc', @@ -950,7 +951,8 @@ class VolumeViewTests(test.ResetImageAPIVersionMixin, test.TestCase): cinder.volume_snapshot_list(IsA(http.HttpRequest), search_opts=None).\ AndReturn([]) - api.nova.server_list(IsA(http.HttpRequest), search_opts=None).\ + api.nova.server_list(IsA(http.HttpRequest), search_opts=None, + detailed=False).\ AndReturn([self.servers.list(), False]) cinder.tenant_absolute_limits(IsA(http.HttpRequest)).MultipleTimes().\ AndReturn(self.cinder_limits['absolute']) @@ -1175,7 +1177,8 @@ class VolumeViewTests(test.ResetImageAPIVersionMixin, test.TestCase): cinder.volume_snapshot_list(IsA(http.HttpRequest), search_opts=None).\ AndReturn([]) - api.nova.server_list(IsA(http.HttpRequest), search_opts=None)\ + api.nova.server_list(IsA(http.HttpRequest), search_opts=None, + detailed=False)\ .AndReturn([self.servers.list(), False]) cinder.tenant_absolute_limits(IsA(http.HttpRequest))\ .MultipleTimes().AndReturn(limits) @@ -1216,7 +1219,8 @@ class VolumeViewTests(test.ResetImageAPIVersionMixin, test.TestCase): cinder.volume_snapshot_list(IsA(http.HttpRequest), search_opts=None).\ AndReturn([]) - api.nova.server_list(IsA(http.HttpRequest), search_opts=None)\ + api.nova.server_list(IsA(http.HttpRequest), search_opts=None, + detailed=False)\ .AndReturn([self.servers.list(), False]) cinder.tenant_absolute_limits(IsA(http.HttpRequest))\ .MultipleTimes().AndReturn(limits) @@ -1614,7 +1618,8 @@ class VolumeViewTests(test.ResetImageAPIVersionMixin, test.TestCase): cinder.volume_snapshot_list(IsA(http.HttpRequest), search_opts=None).\ AndReturn(self.cinder_volume_snapshots.list()) - api.nova.server_list(IsA(http.HttpRequest), search_opts=None)\ + api.nova.server_list(IsA(http.HttpRequest), search_opts=None, + detailed=False)\ .AndReturn([self.servers.list(), False]) cinder.tenant_absolute_limits(IsA(http.HttpRequest))\ .MultipleTimes('limits').AndReturn(limits) @@ -1675,7 +1680,8 @@ class VolumeViewTests(test.ResetImageAPIVersionMixin, test.TestCase): cinder.volume_snapshot_list(IsA(http.HttpRequest), search_opts=None).\ AndReturn([]) - api.nova.server_list(IsA(http.HttpRequest), search_opts=None)\ + api.nova.server_list(IsA(http.HttpRequest), search_opts=None, + detailed=False)\ .AndReturn([self.servers.list(), False]) cinder.tenant_absolute_limits(IsA(http.HttpRequest))\ .MultipleTimes().AndReturn(limits) @@ -1741,7 +1747,8 @@ class VolumeViewTests(test.ResetImageAPIVersionMixin, test.TestCase): search_opts=None).\ AndReturn([]) cinder.transfer_delete(IsA(http.HttpRequest), transfer.id) - api.nova.server_list(IsA(http.HttpRequest), search_opts=None).\ + api.nova.server_list(IsA(http.HttpRequest), search_opts=None, + detailed=False).\ AndReturn([self.servers.list(), False]) cinder.tenant_absolute_limits(IsA(http.HttpRequest)).MultipleTimes().\ AndReturn(self.cinder_limits['absolute']) diff --git a/openstack_dashboard/test/api_tests/network_tests.py b/openstack_dashboard/test/api_tests/network_tests.py index 1b762fa67..486545d35 100644 --- a/openstack_dashboard/test/api_tests/network_tests.py +++ b/openstack_dashboard/test/api_tests/network_tests.py @@ -760,7 +760,7 @@ class NetworkApiNeutronFloatingIpTests(NetworkApiNeutronTestBase): novaclient = self.stub_novaclient() novaclient.servers = self.mox.CreateMockAnything() search_opts = {'project_id': self.request.user.tenant_id} - novaclient.servers.list(True, search_opts).AndReturn(servers) + novaclient.servers.list(False, search_opts).AndReturn(servers) search_opts = {'router:external': True} ext_nets = [n for n in self.api_networks.list()