Show floating IPs from other projects of admin instance table
Change-Id: I36e1c7a3808994d1481463ed6b595506e579ae28 Closes-Bug: #1319669
This commit is contained in:
parent
cdd64c2f61
commit
198c7dcd5f
|
@ -139,7 +139,7 @@ def security_group_backend(request):
|
|||
return NetworkClient(request).secgroups.backend
|
||||
|
||||
|
||||
def servers_update_addresses(request, servers):
|
||||
def servers_update_addresses(request, servers, all_tenants=False):
|
||||
"""Retrieve servers networking information from Neutron if enabled.
|
||||
|
||||
Should be used when up to date networking information is required,
|
||||
|
@ -148,4 +148,4 @@ def servers_update_addresses(request, servers):
|
|||
"""
|
||||
neutron_enabled = base.is_service_enabled(request, 'network')
|
||||
if neutron_enabled:
|
||||
neutron.servers_update_addresses(request, servers)
|
||||
neutron.servers_update_addresses(request, servers, all_tenants)
|
||||
|
|
|
@ -329,16 +329,21 @@ class FloatingIpManager(network_base.FloatingIpManager):
|
|||
return [FloatingIpPool(pool) for pool
|
||||
in self.client.list_networks(**search_opts).get('networks')]
|
||||
|
||||
def list(self, **search_opts):
|
||||
tenant_id = self.request.user.tenant_id
|
||||
# In Neutron, list_floatingips returns Floating IPs from all tenants
|
||||
# when the API is called with admin role, so we need to filter them
|
||||
# with tenant_id.
|
||||
fips = self.client.list_floatingips(tenant_id=tenant_id, **search_opts)
|
||||
def list(self, all_tenants=False, **search_opts):
|
||||
if not all_tenants:
|
||||
tenant_id = self.request.user.tenant_id
|
||||
# In Neutron, list_floatingips returns Floating IPs from
|
||||
# all tenants when the API is called with admin role, so
|
||||
# we need to filter them with tenant_id.
|
||||
search_opts['tenant_id'] = tenant_id
|
||||
port_search_opts = {'tenant_id': tenant_id}
|
||||
else:
|
||||
port_search_opts = {}
|
||||
fips = self.client.list_floatingips(**search_opts)
|
||||
fips = fips.get('floatingips')
|
||||
# Get port list to add instance_id to floating IP list
|
||||
# instance_id is stored in device_id attribute
|
||||
ports = port_list(self.request, tenant_id=tenant_id)
|
||||
ports = port_list(self.request, **port_search_opts)
|
||||
device_id_dict = SortedDict([(p['id'], p['device_id']) for p in ports])
|
||||
for fip in fips:
|
||||
if fip['port_id']:
|
||||
|
@ -777,7 +782,7 @@ def provider_list(request):
|
|||
return providers['service_providers']
|
||||
|
||||
|
||||
def servers_update_addresses(request, servers):
|
||||
def servers_update_addresses(request, servers, all_tenants=False):
|
||||
"""Retrieve servers networking information from Neutron if enabled.
|
||||
|
||||
Should be used when up to date networking information is required,
|
||||
|
@ -790,7 +795,8 @@ def servers_update_addresses(request, servers):
|
|||
device_id=[instance.id for instance in servers])
|
||||
fips = FloatingIpManager(request)
|
||||
if fips.is_supported():
|
||||
floating_ips = fips.list(port_id=[port.id for port in ports])
|
||||
floating_ips = fips.list(all_tenants=all_tenants,
|
||||
port_id=[port.id for port in ports])
|
||||
else:
|
||||
floating_ips = []
|
||||
networks = network_list(request,
|
||||
|
|
|
@ -45,7 +45,8 @@ class InstanceViewTest(test.BaseAdminViewTests):
|
|||
api.nova.server_list(IsA(http.HttpRequest),
|
||||
all_tenants=True, search_opts=search_opts) \
|
||||
.AndReturn([servers, False])
|
||||
api.network.servers_update_addresses(IsA(http.HttpRequest), servers)
|
||||
api.network.servers_update_addresses(IsA(http.HttpRequest), servers,
|
||||
all_tenants=True)
|
||||
api.nova.flavor_list(IsA(http.HttpRequest)).AndReturn(flavors)
|
||||
self.mox.ReplayAll()
|
||||
|
||||
|
@ -68,7 +69,8 @@ class InstanceViewTest(test.BaseAdminViewTests):
|
|||
api.nova.server_list(IsA(http.HttpRequest),
|
||||
all_tenants=True, search_opts=search_opts) \
|
||||
.AndReturn([servers, False])
|
||||
api.network.servers_update_addresses(IsA(http.HttpRequest), servers)
|
||||
api.network.servers_update_addresses(IsA(http.HttpRequest), servers,
|
||||
all_tenants=True)
|
||||
api.nova.extension_supported('AdminActions', IsA(http.HttpRequest)) \
|
||||
.MultipleTimes().AndReturn(True)
|
||||
api.nova.flavor_list(IsA(http.HttpRequest)). \
|
||||
|
@ -103,7 +105,8 @@ class InstanceViewTest(test.BaseAdminViewTests):
|
|||
api.nova.server_list(IsA(http.HttpRequest),
|
||||
all_tenants=True, search_opts=search_opts) \
|
||||
.AndReturn([servers, False])
|
||||
api.network.servers_update_addresses(IsA(http.HttpRequest), servers)
|
||||
api.network.servers_update_addresses(IsA(http.HttpRequest), servers,
|
||||
all_tenants=True)
|
||||
api.nova.extension_supported('AdminActions', IsA(http.HttpRequest)) \
|
||||
.MultipleTimes().AndReturn(True)
|
||||
api.nova.flavor_list(IsA(http.HttpRequest)). \
|
||||
|
@ -181,7 +184,8 @@ class InstanceViewTest(test.BaseAdminViewTests):
|
|||
api.nova.server_list(IsA(http.HttpRequest),
|
||||
all_tenants=True, search_opts=search_opts) \
|
||||
.AndReturn([servers, False])
|
||||
api.network.servers_update_addresses(IsA(http.HttpRequest), servers)
|
||||
api.network.servers_update_addresses(IsA(http.HttpRequest), servers,
|
||||
all_tenants=True)
|
||||
api.nova.extension_supported('AdminActions', IsA(http.HttpRequest)) \
|
||||
.MultipleTimes().AndReturn(True)
|
||||
api.nova.flavor_list(IsA(http.HttpRequest)).\
|
||||
|
@ -211,7 +215,8 @@ class InstanceViewTest(test.BaseAdminViewTests):
|
|||
api.nova.server_list(IsA(http.HttpRequest),
|
||||
all_tenants=True, search_opts=search_opts) \
|
||||
.AndReturn([servers, False])
|
||||
api.network.servers_update_addresses(IsA(http.HttpRequest), servers)
|
||||
api.network.servers_update_addresses(IsA(http.HttpRequest), servers,
|
||||
all_tenants=True)
|
||||
api.nova.flavor_list(IsA(http.HttpRequest)).\
|
||||
AndReturn(self.flavors.list())
|
||||
self.mox.ReplayAll()
|
||||
|
|
|
@ -84,7 +84,8 @@ class AdminIndexView(tables.DataTableView):
|
|||
_('Unable to retrieve instance list.'))
|
||||
if instances:
|
||||
try:
|
||||
api.network.servers_update_addresses(self.request, instances)
|
||||
api.network.servers_update_addresses(self.request, instances,
|
||||
all_tenants=True)
|
||||
except Exception:
|
||||
exceptions.handle(
|
||||
self.request,
|
||||
|
|
|
@ -558,6 +558,31 @@ class NetworkApiNeutronFloatingIpTests(NetworkApiNeutronTestBase):
|
|||
dev_id = assoc_port['device_id'] if exp['port_id'] else None
|
||||
self.assertEqual(dev_id, ret.instance_id)
|
||||
|
||||
def test_floating_ip_list_all_tenants(self):
|
||||
fips = self.api_q_floating_ips.list()
|
||||
self.qclient.list_floatingips().AndReturn({'floatingips': fips})
|
||||
self.qclient.list_ports().AndReturn({'ports': self.api_ports.list()})
|
||||
self.mox.ReplayAll()
|
||||
|
||||
# all_tenants option for floating IP list is api.neutron specific,
|
||||
# so we call api.neutron.FloatingIpManager directly and
|
||||
# actually we don't need NetworkClient in this test.
|
||||
# setUp() in the base class sets up mox to expect
|
||||
# api.base.is_service_enabled() is called and we need to call
|
||||
# NetworkClient even if we don't use it so that mox.VerifyAll
|
||||
# doesn't complain it.
|
||||
api.network.NetworkClient(self.request)
|
||||
fip_manager = api.neutron.FloatingIpManager(self.request)
|
||||
rets = fip_manager.list(all_tenants=True)
|
||||
assoc_port = self.api_ports.list()[1]
|
||||
self.assertEqual(len(fips), len(rets))
|
||||
for ret, exp in zip(rets, fips):
|
||||
for attr in ['id', 'ip', 'pool', 'fixed_ip', 'port_id']:
|
||||
self.assertEqual(getattr(ret, attr), exp[attr])
|
||||
if exp['port_id']:
|
||||
dev_id = assoc_port['device_id'] if exp['port_id'] else None
|
||||
self.assertEqual(ret.instance_id, dev_id)
|
||||
|
||||
def test_floating_ip_get_associated(self):
|
||||
fip = self.api_q_floating_ips.list()[1]
|
||||
assoc_port = self.api_ports.list()[1]
|
||||
|
|
Loading…
Reference in New Issue