Get all needed instances for volumes attachments at Admin->Volumes
Nova server_list() wrapper needs to receive an explicit `all_tenants` boolean flag in order to request instances for _all_ tenants - otherwise while rendering Admin->Volumes table Django will request missing instances (to get their names for volume attachments) one by one, thus significantly increasing response time. This patch adds check if all_tenants in search_opts and add it to the search else uses tenant_id in the search_opts. Co-Authored-By: Dmitry Sutyagin <dsutyagin@mirantis.com> Co-Authored-By: Ivan Kolodyazhny <e0ne@e0ne.info> Change-Id: I4761d7da15036b69619649871aef91e1799ee385 Closes-Bug: #1508568
This commit is contained in:
parent
5613371064
commit
3a99499ba0
@ -505,7 +505,7 @@ def server_get(request, instance_id):
|
||||
|
||||
|
||||
@profiler.trace
|
||||
def server_list(request, search_opts=None, all_tenants=False, detailed=True):
|
||||
def server_list(request, search_opts=None, detailed=True):
|
||||
nova_client = get_novaclient_with_locked_status(request)
|
||||
page_size = utils.get_page_size(request)
|
||||
paginate = False
|
||||
@ -516,10 +516,12 @@ def server_list(request, search_opts=None, all_tenants=False, detailed=True):
|
||||
if paginate:
|
||||
search_opts['limit'] = page_size + 1
|
||||
|
||||
all_tenants = search_opts.get('all_tenants', False)
|
||||
if all_tenants:
|
||||
search_opts['all_tenants'] = True
|
||||
else:
|
||||
search_opts['project_id'] = request.user.tenant_id
|
||||
|
||||
servers = [Server(s, request)
|
||||
for s in nova_client.servers.list(detailed, search_opts)]
|
||||
|
||||
|
@ -36,7 +36,7 @@ class AdminFloatingIpViewTest(test.BaseAdminViewTests):
|
||||
tenants = self.tenants.list()
|
||||
api.neutron.tenant_floating_ip_list(IsA(http.HttpRequest),
|
||||
all_tenants=True).AndReturn(fips)
|
||||
api.nova.server_list(IsA(http.HttpRequest), all_tenants=True) \
|
||||
api.nova.server_list(IsA(http.HttpRequest), search_opts={'all_tenants': True}) \
|
||||
.AndReturn([servers, False])
|
||||
api.keystone.tenant_list(IsA(http.HttpRequest))\
|
||||
.AndReturn([tenants, False])
|
||||
@ -196,7 +196,7 @@ class AdminFloatingIpViewTest(test.BaseAdminViewTests):
|
||||
tenants = self.tenants.list()
|
||||
api.neutron.tenant_floating_ip_list(IsA(http.HttpRequest),
|
||||
all_tenants=True).AndReturn(fips)
|
||||
api.nova.server_list(IsA(http.HttpRequest), all_tenants=True) \
|
||||
api.nova.server_list(IsA(http.HttpRequest), search_opts={'all_tenants': True}) \
|
||||
.AndReturn([servers, False])
|
||||
api.keystone.tenant_list(IsA(http.HttpRequest))\
|
||||
.AndReturn([tenants, False])
|
||||
@ -226,7 +226,7 @@ class AdminFloatingIpViewTest(test.BaseAdminViewTests):
|
||||
tenants = self.tenants.list()
|
||||
api.neutron.tenant_floating_ip_list(IsA(http.HttpRequest),
|
||||
all_tenants=True).AndReturn(fips)
|
||||
api.nova.server_list(IsA(http.HttpRequest), all_tenants=True) \
|
||||
api.nova.server_list(IsA(http.HttpRequest), search_opts={'all_tenants': True}) \
|
||||
.AndReturn([servers, False])
|
||||
api.keystone.tenant_list(IsA(http.HttpRequest))\
|
||||
.AndReturn([tenants, False])
|
||||
@ -254,7 +254,7 @@ class AdminFloatingIpViewTest(test.BaseAdminViewTests):
|
||||
tenants = self.tenants.list()
|
||||
api.neutron.tenant_floating_ip_list(IsA(http.HttpRequest),
|
||||
all_tenants=True).AndReturn(fips)
|
||||
api.nova.server_list(IsA(http.HttpRequest), all_tenants=True) \
|
||||
api.nova.server_list(IsA(http.HttpRequest), search_opts={'all_tenants': True}) \
|
||||
.AndReturn([servers, False])
|
||||
api.keystone.tenant_list(IsA(http.HttpRequest))\
|
||||
.AndReturn([tenants, False])
|
||||
|
@ -75,9 +75,10 @@ class IndexView(tables.DataTableView):
|
||||
if floating_ips:
|
||||
instances = []
|
||||
try:
|
||||
instances, has_more = api.nova.server_list(self.request,
|
||||
all_tenants=True,
|
||||
detailed=False)
|
||||
instances, has_more = api.nova.server_list(
|
||||
self.request,
|
||||
search_opts={'all_tenants': True},
|
||||
detailed=False)
|
||||
except Exception:
|
||||
exceptions.handle(
|
||||
self.request,
|
||||
|
@ -46,12 +46,12 @@ class InstanceViewTest(test.BaseAdminViewTests):
|
||||
.MultipleTimes().AndReturn(True)
|
||||
api.keystone.tenant_list(IsA(http.HttpRequest)).\
|
||||
AndReturn([tenants, False])
|
||||
search_opts = {'marker': None, 'paginate': True}
|
||||
search_opts = {'marker': None, 'paginate': True, 'all_tenants': True}
|
||||
api.glance.image_list_detailed(IsA(http.HttpRequest))\
|
||||
.AndReturn(images)
|
||||
api.nova.flavor_list(IsA(http.HttpRequest)).AndReturn(flavors)
|
||||
api.nova.server_list(IsA(http.HttpRequest),
|
||||
all_tenants=True, search_opts=search_opts) \
|
||||
search_opts=search_opts) \
|
||||
.AndReturn([servers, False])
|
||||
api.network.servers_update_addresses(IsA(http.HttpRequest), servers,
|
||||
all_tenants=True)
|
||||
@ -74,9 +74,9 @@ class InstanceViewTest(test.BaseAdminViewTests):
|
||||
tenants = self.tenants.list()
|
||||
flavors = self.flavors.list()
|
||||
full_flavors = OrderedDict([(f.id, f) for f in flavors])
|
||||
search_opts = {'marker': None, 'paginate': True}
|
||||
search_opts = {'marker': None, 'paginate': True, 'all_tenants': True}
|
||||
api.nova.server_list(IsA(http.HttpRequest),
|
||||
all_tenants=True, search_opts=search_opts) \
|
||||
search_opts=search_opts) \
|
||||
.AndReturn([servers, False])
|
||||
api.network.servers_update_addresses(IsA(http.HttpRequest), servers,
|
||||
all_tenants=True)
|
||||
@ -119,9 +119,9 @@ class InstanceViewTest(test.BaseAdminViewTests):
|
||||
api.glance.image_list_detailed(IsA(http.HttpRequest))\
|
||||
.AndReturn(images)
|
||||
api.nova.flavor_list(IsA(http.HttpRequest)).AndReturn(flavors)
|
||||
search_opts = {'marker': None, 'paginate': True}
|
||||
search_opts = {'marker': None, 'paginate': True, 'all_tenants': True}
|
||||
api.nova.server_list(IsA(http.HttpRequest),
|
||||
all_tenants=True, search_opts=search_opts) \
|
||||
search_opts=search_opts) \
|
||||
.AndReturn([servers, False])
|
||||
api.network.servers_update_addresses(IsA(http.HttpRequest), servers,
|
||||
all_tenants=True)
|
||||
@ -153,9 +153,9 @@ class InstanceViewTest(test.BaseAdminViewTests):
|
||||
def test_index_server_list_exception(self):
|
||||
tenants = self.tenants.list()
|
||||
|
||||
search_opts = {'marker': None, 'paginate': True}
|
||||
search_opts = {'marker': None, 'paginate': True, 'all_tenants': True}
|
||||
api.nova.server_list(IsA(http.HttpRequest),
|
||||
all_tenants=True, search_opts=search_opts) \
|
||||
search_opts=search_opts) \
|
||||
.AndRaise(self.exceptions.nova)
|
||||
api.keystone.tenant_list(IsA(http.HttpRequest)).\
|
||||
AndReturn([tenants, False])
|
||||
@ -219,9 +219,9 @@ class InstanceViewTest(test.BaseAdminViewTests):
|
||||
api.glance.image_list_detailed(IsA(http.HttpRequest)) \
|
||||
.AndReturn(images)
|
||||
api.nova.flavor_list(IsA(http.HttpRequest)).AndReturn(flavors)
|
||||
search_opts = {'marker': None, 'paginate': True}
|
||||
search_opts = {'marker': None, 'paginate': True, 'all_tenants': True}
|
||||
api.nova.server_list(IsA(http.HttpRequest),
|
||||
all_tenants=True, search_opts=search_opts) \
|
||||
search_opts=search_opts) \
|
||||
.AndReturn([servers, False])
|
||||
api.network.servers_update_addresses(IsA(http.HttpRequest), servers,
|
||||
all_tenants=True)
|
||||
@ -255,13 +255,13 @@ class InstanceViewTest(test.BaseAdminViewTests):
|
||||
api.glance.image_list_detailed(IsA(http.HttpRequest)) \
|
||||
.AndReturn(images)
|
||||
api.nova.flavor_list(IsA(http.HttpRequest)).AndReturn(flavors)
|
||||
search_opts = {'marker': None, 'paginate': True}
|
||||
search_opts = {'marker': None, 'paginate': True, 'all_tenants': True}
|
||||
api.nova.extension_supported('AdminActions', IsA(http.HttpRequest)) \
|
||||
.MultipleTimes().AndReturn(True)
|
||||
api.nova.extension_supported('Shelve', IsA(http.HttpRequest)) \
|
||||
.MultipleTimes().AndReturn(True)
|
||||
api.nova.server_list(IsA(http.HttpRequest),
|
||||
all_tenants=True, search_opts=search_opts) \
|
||||
search_opts=search_opts) \
|
||||
.AndReturn([servers, False])
|
||||
api.network.servers_update_addresses(IsA(http.HttpRequest), servers,
|
||||
all_tenants=True)
|
||||
|
@ -91,7 +91,9 @@ class AdminIndexView(tables.DataTableView):
|
||||
|
||||
marker = self.request.GET.get(
|
||||
project_tables.AdminInstancesTable._meta.pagination_param, None)
|
||||
default_search_opts = {'marker': marker, 'paginate': True}
|
||||
default_search_opts = {'marker': marker,
|
||||
'paginate': True,
|
||||
'all_tenants': True}
|
||||
|
||||
search_opts = self.get_filters(default_search_opts.copy())
|
||||
|
||||
@ -141,8 +143,7 @@ class AdminIndexView(tables.DataTableView):
|
||||
try:
|
||||
tmp_instances, self._more = api.nova.server_list(
|
||||
self.request,
|
||||
search_opts=search_opts,
|
||||
all_tenants=True)
|
||||
search_opts=search_opts)
|
||||
instances.extend(tmp_instances)
|
||||
except Exception:
|
||||
self._more = False
|
||||
|
@ -146,8 +146,9 @@ class ComputeApiTests(test.APITestCase):
|
||||
novaclient.servers.list(True, {'all_tenants': True}).AndReturn(servers)
|
||||
self.mox.ReplayAll()
|
||||
|
||||
ret_val, has_more = api.nova.server_list(self.request,
|
||||
all_tenants=True)
|
||||
ret_val, has_more = api.nova.server_list(
|
||||
self.request,
|
||||
search_opts={'all_tenants': True})
|
||||
for server in ret_val:
|
||||
self.assertIsInstance(server, api.nova.Server)
|
||||
|
||||
@ -166,8 +167,8 @@ class ComputeApiTests(test.APITestCase):
|
||||
|
||||
ret_val, has_more = api.nova.server_list(self.request,
|
||||
{'marker': None,
|
||||
'paginate': True},
|
||||
all_tenants=True)
|
||||
'paginate': True,
|
||||
'all_tenants': True})
|
||||
for server in ret_val:
|
||||
self.assertIsInstance(server, api.nova.Server)
|
||||
self.assertFalse(has_more)
|
||||
@ -189,8 +190,8 @@ class ComputeApiTests(test.APITestCase):
|
||||
|
||||
ret_val, has_more = api.nova.server_list(self.request,
|
||||
{'marker': None,
|
||||
'paginate': True},
|
||||
all_tenants=True)
|
||||
'paginate': True,
|
||||
'all_tenants': True})
|
||||
for server in ret_val:
|
||||
self.assertIsInstance(server, api.nova.Server)
|
||||
self.assertEqual(page_size, len(ret_val))
|
||||
|
Loading…
x
Reference in New Issue
Block a user