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 b80d67a890..b97d423417 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 e83937710f..5662298504 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 ec1ab82cfc..f3ff571350 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 ab2415f7e3..b704c464cf 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 6e3882b6d3..be2d8a7ce8 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 061aa8c601..bb8625f540 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 31b04eb26c..1e0f82004b 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 10a72eb71a..edab47399f 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 a02e32350b..253a3153e6 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 1b762fa67e..486545d354 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()