Server-side filtering Orchestration

Included patch 12 changes
Implements blueprint: server-side-filtering
Co-authored-by: Revon Mathews <revon.mathews@intel.com>
Change-Id: I22c5c736f756b1f5640d2fc4d284ac45deaefc19
This commit is contained in:
Eddie Ramirez 2016-07-26 15:49:58 +00:00
parent 5e4a31a17a
commit 69e18fc42c
8 changed files with 51 additions and 25 deletions

View File

@ -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):

View File

@ -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

View File

@ -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)

View File

@ -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 = []

View File

@ -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):

View File

@ -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

View File

@ -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),

View File

@ -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)