From 69e18fc42c6eda5000d7359b02282385768d39d9 Mon Sep 17 00:00:00 2001 From: Eddie Ramirez Date: Tue, 26 Jul 2016 15:49:58 +0000 Subject: [PATCH] Server-side filtering Orchestration Included patch 12 changes Implements blueprint: server-side-filtering Co-authored-by: Revon Mathews Change-Id: I22c5c736f756b1f5640d2fc4d284ac45deaefc19 --- openstack_dashboard/api/heat.py | 11 +++++-- .../project/stacks/resource_types/tables.py | 7 +++- .../project/stacks/resource_types/tests.py | 4 ++- .../project/stacks/resource_types/views.py | 6 +++- .../dashboards/project/stacks/tables.py | 10 +++--- .../stacks/template_versions/tables.py | 1 + .../dashboards/project/stacks/tests.py | 33 ++++++++++++------- .../dashboards/project/stacks/views.py | 4 ++- 8 files changed, 51 insertions(+), 25 deletions(-) diff --git a/openstack_dashboard/api/heat.py b/openstack_dashboard/api/heat.py index 980576d0bf..6229477260 100644 --- a/openstack_dashboard/api/heat.py +++ b/openstack_dashboard/api/heat.py @@ -58,7 +58,7 @@ def heatclient(request, password=None): def stacks_list(request, marker=None, sort_dir='desc', sort_key='created_at', - paginate=False): + paginate=False, filters=None): limit = getattr(settings, 'API_RESULT_LIMIT', 1000) page_size = utils.get_page_size(request) @@ -71,6 +71,11 @@ def stacks_list(request, marker=None, sort_dir='desc', sort_key='created_at', if marker: kwargs['marker'] = marker + if filters: + kwargs.update(filters) + if 'status' in kwargs: + kwargs['status'] = kwargs['status'].replace(' ', '_').upper() + stacks_iter = heatclient(request).stacks.list(limit=request_size, **kwargs) @@ -214,8 +219,8 @@ def action_resume(request, stack_id): return heatclient(request).actions.resume(stack_id) -def resource_types_list(request): - return heatclient(request).resource_types.list() +def resource_types_list(request, filters=None): + return heatclient(request).resource_types.list(filters=filters) def resource_type_get(request, resource_type): diff --git a/openstack_dashboard/dashboards/project/stacks/resource_types/tables.py b/openstack_dashboard/dashboards/project/stacks/resource_types/tables.py index a9196496ee..66e7702ab1 100644 --- a/openstack_dashboard/dashboards/project/stacks/resource_types/tables.py +++ b/openstack_dashboard/dashboards/project/stacks/resource_types/tables.py @@ -16,6 +16,11 @@ from django.utils.translation import ugettext_lazy as _ from horizon import tables +class ResourceTypesFilterAction(tables.FilterAction): + filter_type = 'server' + filter_choices = (('name', _('Type ='), True, _("Case sensitive")),) + + class ResourceTypesTable(tables.DataTable): name = tables.Column("resource_type", verbose_name=_("Type"), @@ -27,5 +32,5 @@ class ResourceTypesTable(tables.DataTable): class Meta(object): name = "resource_types" verbose_name = _("Resource Types") - table_actions = (tables.FilterAction,) + table_actions = (ResourceTypesFilterAction,) multi_select = False diff --git a/openstack_dashboard/dashboards/project/stacks/resource_types/tests.py b/openstack_dashboard/dashboards/project/stacks/resource_types/tests.py index 1f201b1b87..e9de63c5f6 100644 --- a/openstack_dashboard/dashboards/project/stacks/resource_types/tests.py +++ b/openstack_dashboard/dashboards/project/stacks/resource_types/tests.py @@ -25,8 +25,10 @@ class ResourceTypesTests(test.TestCase): @test.create_stubs({api.heat: ('resource_types_list',)}) def test_index(self): + filters = {} api.heat.resource_types_list( - IsA(http.HttpRequest)).AndReturn(self.resource_types.list()) + IsA(http.HttpRequest), filters=filters).AndReturn( + self.resource_types.list()) self.mox.ReplayAll() res = self.client.get(self.INDEX_URL) diff --git a/openstack_dashboard/dashboards/project/stacks/resource_types/views.py b/openstack_dashboard/dashboards/project/stacks/resource_types/views.py index 089b5d51f3..a777db6297 100644 --- a/openstack_dashboard/dashboards/project/stacks/resource_types/views.py +++ b/openstack_dashboard/dashboards/project/stacks/resource_types/views.py @@ -34,7 +34,11 @@ class ResourceTypesView(tables.DataTableView): def get_data(self): try: - r_types = sorted(api.heat.resource_types_list(self.request), + filters = self.get_filters() + if 'name' in filters: + filters['name'] = '.*' + filters['name'] + r_types = sorted(api.heat.resource_types_list(self.request, + filters=filters), key=lambda resource: resource.resource_type) except Exception: r_types = [] diff --git a/openstack_dashboard/dashboards/project/stacks/tables.py b/openstack_dashboard/dashboards/project/stacks/tables.py index 7202a0ec15..ef65937083 100644 --- a/openstack_dashboard/dashboards/project/stacks/tables.py +++ b/openstack_dashboard/dashboards/project/stacks/tables.py @@ -186,12 +186,10 @@ class StacksUpdateRow(tables.Row): class StacksFilterAction(tables.FilterAction): - - def filter(self, table, stacks, filter_string): - """Naive case-insensitive search.""" - query = filter_string.lower() - return [stack for stack in stacks - if query in stack.name.lower()] + filter_type = 'server' + filter_choices = (('name', _('Stack Name'), True, _('Case-sensitive')), + ('id', _('Stack ID ='), True), + ('status', _('Status ='), True)) class StacksTable(tables.DataTable): diff --git a/openstack_dashboard/dashboards/project/stacks/template_versions/tables.py b/openstack_dashboard/dashboards/project/stacks/template_versions/tables.py index 4339a3b996..8c63d14cb2 100644 --- a/openstack_dashboard/dashboards/project/stacks/template_versions/tables.py +++ b/openstack_dashboard/dashboards/project/stacks/template_versions/tables.py @@ -32,6 +32,7 @@ class TemplateVersionsTable(tables.DataTable): class Meta(object): name = "template_versions" + table_actions = (tables.FilterAction,) verbose_name = _("Template Versions") table_actions = (tables.FilterAction,) multi_select = False diff --git a/openstack_dashboard/dashboards/project/stacks/tests.py b/openstack_dashboard/dashboards/project/stacks/tests.py index f1bbb06f3d..71e972e0c5 100644 --- a/openstack_dashboard/dashboards/project/stacks/tests.py +++ b/openstack_dashboard/dashboards/project/stacks/tests.py @@ -121,26 +121,30 @@ class StackTests(test.TestCase): @test.create_stubs({api.heat: ('stacks_list',)}) def test_index_paginated(self): stacks = self.stacks.list()[:5] - + filters = {} api.heat.stacks_list(IsA(http.HttpRequest), marker=None, paginate=True, - sort_dir='desc') \ + sort_dir='desc', + filters=filters) \ .AndReturn([stacks, True, True]) api.heat.stacks_list(IsA(http.HttpRequest), marker=None, paginate=True, - sort_dir='desc') \ + sort_dir='desc', + filters=filters) \ .AndReturn([stacks[:2], True, True]) api.heat.stacks_list(IsA(http.HttpRequest), marker=stacks[2].id, paginate=True, - sort_dir='desc') \ + sort_dir='desc', + filters=filters) \ .AndReturn([stacks[2:4], True, True]) api.heat.stacks_list(IsA(http.HttpRequest), marker=stacks[4].id, paginate=True, - sort_dir='desc') \ + sort_dir='desc', + filters=filters) \ .AndReturn([stacks[4:], True, True]) self.mox.ReplayAll() @@ -176,26 +180,30 @@ class StackTests(test.TestCase): @test.create_stubs({api.heat: ('stacks_list',)}) def test_index_prev_paginated(self): stacks = self.stacks.list()[:3] - + filters = {} api.heat.stacks_list(IsA(http.HttpRequest), marker=None, paginate=True, - sort_dir='desc') \ + sort_dir='desc', + filters=filters) \ .AndReturn([stacks, True, False]) api.heat.stacks_list(IsA(http.HttpRequest), marker=None, paginate=True, - sort_dir='desc') \ + sort_dir='desc', + filters=filters) \ .AndReturn([stacks[:2], True, True]) api.heat.stacks_list(IsA(http.HttpRequest), marker=stacks[2].id, paginate=True, - sort_dir='desc') \ + sort_dir='desc', + filters=filters) \ .AndReturn([stacks[2:], True, True]) api.heat.stacks_list(IsA(http.HttpRequest), marker=stacks[2].id, paginate=True, - sort_dir='asc') \ + sort_dir='asc', + filters=filters) \ .AndReturn([stacks[:2], True, True]) self.mox.ReplayAll() @@ -728,11 +736,12 @@ class StackTests(test.TestCase): def _test_stack_action(self, action): stack = self.stacks.first() - + filters = {} api.heat.stacks_list(IsA(http.HttpRequest), marker=None, paginate=True, - sort_dir='desc') \ + sort_dir='desc', + filters=filters) \ .AndReturn([self.stacks.list(), True, True]) getattr(api.heat, 'action_%s' % action)(IsA(http.HttpRequest), diff --git a/openstack_dashboard/dashboards/project/stacks/views.py b/openstack_dashboard/dashboards/project/stacks/views.py index 3275bcae8a..12742f0d60 100644 --- a/openstack_dashboard/dashboards/project/stacks/views.py +++ b/openstack_dashboard/dashboards/project/stacks/views.py @@ -55,6 +55,7 @@ class IndexView(tables.DataTableView): def get_data(self): stacks = [] + filters = self.get_filters() prev_marker = self.request.GET.get( project_tables.StacksTable._meta.prev_pagination_param) if prev_marker is not None: @@ -69,7 +70,8 @@ class IndexView(tables.DataTableView): self.request, marker=marker, paginate=True, - sort_dir=sort_dir) + sort_dir=sort_dir, + filters=filters) if prev_marker is not None: stacks = sorted(stacks, key=attrgetter('creation_time'), reverse=True)