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:
parent
5e4a31a17a
commit
69e18fc42c
@ -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):
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
|
@ -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 = []
|
||||
|
@ -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):
|
||||
|
@ -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
|
||||
|
@ -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),
|
||||
|
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user