Server-side filtering routers

Implements server-side filtering for routers:
  - Admin->System->Routers
  - Project->Network->Routers

Implements blueprint: server-side-filtering

Depends-On: Idaee431ed15de81e5ea049948b55d1526e2024ac
Change-Id: Ic93ce6d2a73f33e639a9a3fa0f8846a7d1cbbe9a
This commit is contained in:
jlopezgu 2016-06-22 15:06:53 -05:00
parent 9ec3d74af2
commit 02594a758f
6 changed files with 55 additions and 53 deletions

View File

@ -35,6 +35,12 @@ class UpdateRow(tables.Row):
return router
class AdminRoutersFilterAction(r_tables.RoutersFilterAction):
name = 'filter_admin_routers'
filter_choices = r_tables.RoutersFilterAction.filter_choices + (
('project', _("Project ="), True),)
class RoutersTable(r_tables.RoutersTable):
tenant = tables.Column("tenant_name", verbose_name=_("Project"))
name = tables.Column("name",
@ -46,6 +52,6 @@ class RoutersTable(r_tables.RoutersTable):
verbose_name = _("Routers")
status_columns = ["status"]
row_class = UpdateRow
table_actions = (DeleteRouter, r_tables.RoutersFilterAction)
table_actions = (DeleteRouter, AdminRoutersFilterAction)
row_actions = (EditRouter, DeleteRouter,)
Columns = ('tenant', 'name', 'status', 'distributed', 'ext_net')

View File

@ -38,8 +38,7 @@ class RouterTests(test.BaseAdminViewTests, r_test.RouterTests):
def test_index(self):
tenants = self.tenants.list()
api.neutron.router_list(
IsA(http.HttpRequest),
search_opts=None).AndReturn(self.routers.list())
IsA(http.HttpRequest)).AndReturn(self.routers.list())
api.keystone.tenant_list(IsA(http.HttpRequest))\
.AndReturn([tenants, False])
self._mock_external_network_list()
@ -56,8 +55,7 @@ class RouterTests(test.BaseAdminViewTests, r_test.RouterTests):
api.keystone: ('tenant_list',)})
def test_index_router_list_exception(self):
api.neutron.router_list(
IsA(http.HttpRequest),
search_opts=None).AndRaise(self.exceptions.neutron)
IsA(http.HttpRequest)).AndRaise(self.exceptions.neutron)
self.mox.ReplayAll()
res = self.client.get(self.INDEX_URL)
@ -98,8 +96,7 @@ class RouterTests(test.BaseAdminViewTests, r_test.RouterTests):
def test_set_external_network_empty(self):
router = self.routers.first()
api.neutron.router_list(
IsA(http.HttpRequest),
search_opts=None).AndReturn([router])
IsA(http.HttpRequest)).AndReturn([router])
api.keystone.tenant_list(IsA(http.HttpRequest))\
.AndReturn([self.tenants.list(), False])
self._mock_external_network_list(alter_ids=True)
@ -121,14 +118,12 @@ class RouterTests(test.BaseAdminViewTests, r_test.RouterTests):
router = self.routers.first()
tenants = self.tenants.list()
api.neutron.router_list(
IsA(http.HttpRequest),
search_opts=None).AndReturn(self.routers.list())
IsA(http.HttpRequest)).AndReturn(self.routers.list())
api.keystone.tenant_list(IsA(http.HttpRequest))\
.AndReturn([tenants, False])
self._mock_external_network_list()
api.neutron.router_list(
IsA(http.HttpRequest),
search_opts=None).AndReturn(self.routers.list())
IsA(http.HttpRequest)).AndReturn(self.routers.list())
api.keystone.tenant_list(IsA(http.HttpRequest))\
.AndReturn([tenants, False])
self._mock_external_network_list()
@ -137,8 +132,7 @@ class RouterTests(test.BaseAdminViewTests, r_test.RouterTests):
.AndReturn([])
api.neutron.router_delete(IsA(http.HttpRequest), router.id)
api.neutron.router_list(
IsA(http.HttpRequest),
search_opts=None).AndReturn(self.routers.list())
IsA(http.HttpRequest)).AndReturn(self.routers.list())
api.keystone.tenant_list(IsA(http.HttpRequest))\
.AndReturn([tenants, False])
self._mock_external_network_list()
@ -162,14 +156,12 @@ class RouterTests(test.BaseAdminViewTests, r_test.RouterTests):
ports = self.ports.list()
tenants = self.tenants.list()
api.neutron.router_list(
IsA(http.HttpRequest),
search_opts=None).AndReturn(self.routers.list())
IsA(http.HttpRequest)).AndReturn(self.routers.list())
api.keystone.tenant_list(IsA(http.HttpRequest))\
.AndReturn([tenants, False])
self._mock_external_network_list()
api.neutron.router_list(
IsA(http.HttpRequest),
search_opts=None).AndReturn(self.routers.list())
IsA(http.HttpRequest)).AndReturn(self.routers.list())
api.keystone.tenant_list(IsA(http.HttpRequest))\
.AndReturn([tenants, False])
self._mock_external_network_list()
@ -181,8 +173,7 @@ class RouterTests(test.BaseAdminViewTests, r_test.RouterTests):
router.id, port_id=port.id)
api.neutron.router_delete(IsA(http.HttpRequest), router.id)
api.neutron.router_list(
IsA(http.HttpRequest),
search_opts=None).AndReturn(self.routers.list())
IsA(http.HttpRequest)).AndReturn(self.routers.list())
api.keystone.tenant_list(IsA(http.HttpRequest))\
.AndReturn([tenants, False])
self._mock_external_network_list()

View File

@ -31,11 +31,24 @@ from openstack_dashboard.dashboards.project.routers import views as r_views
class IndexView(r_views.IndexView, n_views.IndexView):
table_class = rtbl.RoutersTable
template_name = 'admin/routers/index.html'
FILTERS_MAPPING = {'admin_state_up': {_("up"): True, _("down"): False}}
def _get_routers(self, search_opts=None):
def _get_routers(self):
try:
routers = api.neutron.router_list(self.request,
search_opts=search_opts)
routers = []
filters = self.get_filters(filters_map=self.FILTERS_MAPPING)
if 'project' in filters:
tenants = api.keystone.tenant_list(self.request)[0]
tenants_filter_ids = [t.id for t in tenants
if t.name == filters['project']]
if not tenants_filter_ids:
return []
del filters['project']
for tenant_id in tenants_filter_ids:
filters['tenant_id'] = tenant_id
routers += api.neutron.router_list(self.request, **filters)
else:
routers = api.neutron.router_list(self.request, **filters)
except Exception:
routers = []
exceptions.handle(self.request,

View File

@ -190,12 +190,12 @@ def get_external_network(router):
class RoutersFilterAction(tables.FilterAction):
def filter(self, table, routers, filter_string):
"""Naive case-insensitive search."""
query = filter_string.lower()
return [router for router in routers
if query in router.name.lower()]
name = 'filter_project_routers'
filter_type = 'server'
filter_choices = (('name', _("Router Name ="), True),
('status', _("Status ="), True),
('admin_state_up', _("Admin State ="), True,
_("e.g. UP / DOWN")))
STATUS_DISPLAY_CHOICES = (

View File

@ -90,8 +90,7 @@ class RouterTests(RouterMixin, test.TestCase):
quota_data = self.neutron_quota_usages.first()
api.neutron.router_list(
IsA(http.HttpRequest),
tenant_id=self.tenant.id,
search_opts=None).AndReturn(self.routers.list())
tenant_id=self.tenant.id).AndReturn(self.routers.list())
quotas.tenant_quota_usages(
IsA(http.HttpRequest)) \
.MultipleTimes().AndReturn(quota_data)
@ -110,8 +109,8 @@ class RouterTests(RouterMixin, test.TestCase):
quota_data = self.neutron_quota_usages.first()
api.neutron.router_list(
IsA(http.HttpRequest),
tenant_id=self.tenant.id,
search_opts=None).MultipleTimes().AndRaise(self.exceptions.neutron)
tenant_id=self.tenant.id).MultipleTimes().AndRaise(
self.exceptions.neutron)
quotas.tenant_quota_usages(
IsA(http.HttpRequest)) \
.MultipleTimes().AndReturn(quota_data)
@ -131,8 +130,7 @@ class RouterTests(RouterMixin, test.TestCase):
quota_data = self.neutron_quota_usages.first()
api.neutron.router_list(
IsA(http.HttpRequest),
tenant_id=self.tenant.id,
search_opts=None).MultipleTimes().AndReturn([router])
tenant_id=self.tenant.id).MultipleTimes().AndReturn([router])
quotas.tenant_quota_usages(
IsA(http.HttpRequest)) \
.MultipleTimes().AndReturn(quota_data)
@ -176,21 +174,18 @@ class RouterTests(RouterMixin, test.TestCase):
quota_data = self.neutron_quota_usages.first()
api.neutron.router_list(
IsA(http.HttpRequest),
tenant_id=self.tenant.id,
search_opts=None).AndReturn(self.routers.list())
tenant_id=self.tenant.id).AndReturn(self.routers.list())
quotas.tenant_quota_usages(
IsA(http.HttpRequest)) \
.MultipleTimes().AndReturn(quota_data)
self._mock_external_network_list()
api.neutron.router_list(
IsA(http.HttpRequest),
tenant_id=self.tenant.id,
search_opts=None).AndReturn(self.routers.list())
tenant_id=self.tenant.id).AndReturn(self.routers.list())
self._mock_external_network_list()
api.neutron.router_list(
IsA(http.HttpRequest),
tenant_id=self.tenant.id,
search_opts=None).AndReturn(self.routers.list())
tenant_id=self.tenant.id).AndReturn(self.routers.list())
self._mock_external_network_list()
api.neutron.port_list(IsA(http.HttpRequest),
device_id=router.id, device_owner=IgnoreArg())\
@ -217,21 +212,18 @@ class RouterTests(RouterMixin, test.TestCase):
quota_data = self.neutron_quota_usages.first()
api.neutron.router_list(
IsA(http.HttpRequest),
tenant_id=self.tenant.id,
search_opts=None).AndReturn(self.routers.list())
tenant_id=self.tenant.id).AndReturn(self.routers.list())
quotas.tenant_quota_usages(
IsA(http.HttpRequest)) \
.MultipleTimes().AndReturn(quota_data)
self._mock_external_network_list()
api.neutron.router_list(
IsA(http.HttpRequest),
tenant_id=self.tenant.id,
search_opts=None).AndReturn(self.routers.list())
tenant_id=self.tenant.id).AndReturn(self.routers.list())
self._mock_external_network_list()
api.neutron.router_list(
IsA(http.HttpRequest),
tenant_id=self.tenant.id,
search_opts=None).AndReturn(self.routers.list())
tenant_id=self.tenant.id).AndReturn(self.routers.list())
self._mock_external_network_list()
api.neutron.port_list(IsA(http.HttpRequest),
device_id=router.id, device_owner=IgnoreArg())\
@ -946,8 +938,7 @@ class RouterViewTests(RouterMixin, test.TestCase):
quota_data['routers']['available'] = 0
api.neutron.router_list(
IsA(http.HttpRequest),
tenant_id=self.tenant.id,
search_opts=None).AndReturn(self.routers.list())
tenant_id=self.tenant.id).AndReturn(self.routers.list())
quotas.tenant_quota_usages(
IsA(http.HttpRequest)) \
.MultipleTimes().AndReturn(quota_data)
@ -974,8 +965,7 @@ class RouterViewTests(RouterMixin, test.TestCase):
quota_data['routers'].pop('available')
api.neutron.router_list(
IsA(http.HttpRequest),
tenant_id=self.tenant.id,
search_opts=None).AndReturn(self.routers.list())
tenant_id=self.tenant.id).AndReturn(self.routers.list())
quotas.tenant_quota_usages(
IsA(http.HttpRequest)) \
.MultipleTimes().AndReturn(quota_data)
@ -1002,8 +992,7 @@ class RouterViewTests(RouterMixin, test.TestCase):
quota_data['routers']['available'] = 10
api.neutron.router_list(
IsA(http.HttpRequest),
tenant_id=self.tenant.id,
search_opts=None).AndReturn(self.routers.list())
tenant_id=self.tenant.id).AndReturn(self.routers.list())
quotas.tenant_quota_usages(
IsA(http.HttpRequest)) \
.MultipleTimes().AndReturn(quota_data)

View File

@ -44,13 +44,16 @@ class IndexView(tables.DataTableView):
table_class = rtables.RoutersTable
template_name = 'project/routers/index.html'
page_title = _("Routers")
FILTERS_MAPPING = {'admin_state_up': {_("up"): True, _("down"): False}}
def _get_routers(self, search_opts=None):
try:
search_opts = self.get_filters(
filters=search_opts, filters_map=self.FILTERS_MAPPING)
tenant_id = self.request.user.tenant_id
routers = api.neutron.router_list(self.request,
tenant_id=tenant_id,
search_opts=search_opts)
**search_opts)
except Exception:
routers = []
exceptions.handle(self.request,