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:
parent
9ec3d74af2
commit
02594a758f
|
@ -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')
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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 = (
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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,
|
||||
|
|
Loading…
Reference in New Issue