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',
|
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)
|
limit = getattr(settings, 'API_RESULT_LIMIT', 1000)
|
||||||
page_size = utils.get_page_size(request)
|
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:
|
if marker:
|
||||||
kwargs['marker'] = 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,
|
stacks_iter = heatclient(request).stacks.list(limit=request_size,
|
||||||
**kwargs)
|
**kwargs)
|
||||||
|
|
||||||
@ -214,8 +219,8 @@ def action_resume(request, stack_id):
|
|||||||
return heatclient(request).actions.resume(stack_id)
|
return heatclient(request).actions.resume(stack_id)
|
||||||
|
|
||||||
|
|
||||||
def resource_types_list(request):
|
def resource_types_list(request, filters=None):
|
||||||
return heatclient(request).resource_types.list()
|
return heatclient(request).resource_types.list(filters=filters)
|
||||||
|
|
||||||
|
|
||||||
def resource_type_get(request, resource_type):
|
def resource_type_get(request, resource_type):
|
||||||
|
@ -16,6 +16,11 @@ from django.utils.translation import ugettext_lazy as _
|
|||||||
from horizon import tables
|
from horizon import tables
|
||||||
|
|
||||||
|
|
||||||
|
class ResourceTypesFilterAction(tables.FilterAction):
|
||||||
|
filter_type = 'server'
|
||||||
|
filter_choices = (('name', _('Type ='), True, _("Case sensitive")),)
|
||||||
|
|
||||||
|
|
||||||
class ResourceTypesTable(tables.DataTable):
|
class ResourceTypesTable(tables.DataTable):
|
||||||
name = tables.Column("resource_type",
|
name = tables.Column("resource_type",
|
||||||
verbose_name=_("Type"),
|
verbose_name=_("Type"),
|
||||||
@ -27,5 +32,5 @@ class ResourceTypesTable(tables.DataTable):
|
|||||||
class Meta(object):
|
class Meta(object):
|
||||||
name = "resource_types"
|
name = "resource_types"
|
||||||
verbose_name = _("Resource Types")
|
verbose_name = _("Resource Types")
|
||||||
table_actions = (tables.FilterAction,)
|
table_actions = (ResourceTypesFilterAction,)
|
||||||
multi_select = False
|
multi_select = False
|
||||||
|
@ -25,8 +25,10 @@ class ResourceTypesTests(test.TestCase):
|
|||||||
|
|
||||||
@test.create_stubs({api.heat: ('resource_types_list',)})
|
@test.create_stubs({api.heat: ('resource_types_list',)})
|
||||||
def test_index(self):
|
def test_index(self):
|
||||||
|
filters = {}
|
||||||
api.heat.resource_types_list(
|
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()
|
self.mox.ReplayAll()
|
||||||
|
|
||||||
res = self.client.get(self.INDEX_URL)
|
res = self.client.get(self.INDEX_URL)
|
||||||
|
@ -34,7 +34,11 @@ class ResourceTypesView(tables.DataTableView):
|
|||||||
|
|
||||||
def get_data(self):
|
def get_data(self):
|
||||||
try:
|
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)
|
key=lambda resource: resource.resource_type)
|
||||||
except Exception:
|
except Exception:
|
||||||
r_types = []
|
r_types = []
|
||||||
|
@ -186,12 +186,10 @@ class StacksUpdateRow(tables.Row):
|
|||||||
|
|
||||||
|
|
||||||
class StacksFilterAction(tables.FilterAction):
|
class StacksFilterAction(tables.FilterAction):
|
||||||
|
filter_type = 'server'
|
||||||
def filter(self, table, stacks, filter_string):
|
filter_choices = (('name', _('Stack Name'), True, _('Case-sensitive')),
|
||||||
"""Naive case-insensitive search."""
|
('id', _('Stack ID ='), True),
|
||||||
query = filter_string.lower()
|
('status', _('Status ='), True))
|
||||||
return [stack for stack in stacks
|
|
||||||
if query in stack.name.lower()]
|
|
||||||
|
|
||||||
|
|
||||||
class StacksTable(tables.DataTable):
|
class StacksTable(tables.DataTable):
|
||||||
|
@ -32,6 +32,7 @@ class TemplateVersionsTable(tables.DataTable):
|
|||||||
|
|
||||||
class Meta(object):
|
class Meta(object):
|
||||||
name = "template_versions"
|
name = "template_versions"
|
||||||
|
table_actions = (tables.FilterAction,)
|
||||||
verbose_name = _("Template Versions")
|
verbose_name = _("Template Versions")
|
||||||
table_actions = (tables.FilterAction,)
|
table_actions = (tables.FilterAction,)
|
||||||
multi_select = False
|
multi_select = False
|
||||||
|
@ -121,26 +121,30 @@ class StackTests(test.TestCase):
|
|||||||
@test.create_stubs({api.heat: ('stacks_list',)})
|
@test.create_stubs({api.heat: ('stacks_list',)})
|
||||||
def test_index_paginated(self):
|
def test_index_paginated(self):
|
||||||
stacks = self.stacks.list()[:5]
|
stacks = self.stacks.list()[:5]
|
||||||
|
filters = {}
|
||||||
api.heat.stacks_list(IsA(http.HttpRequest),
|
api.heat.stacks_list(IsA(http.HttpRequest),
|
||||||
marker=None,
|
marker=None,
|
||||||
paginate=True,
|
paginate=True,
|
||||||
sort_dir='desc') \
|
sort_dir='desc',
|
||||||
|
filters=filters) \
|
||||||
.AndReturn([stacks, True, True])
|
.AndReturn([stacks, True, True])
|
||||||
api.heat.stacks_list(IsA(http.HttpRequest),
|
api.heat.stacks_list(IsA(http.HttpRequest),
|
||||||
marker=None,
|
marker=None,
|
||||||
paginate=True,
|
paginate=True,
|
||||||
sort_dir='desc') \
|
sort_dir='desc',
|
||||||
|
filters=filters) \
|
||||||
.AndReturn([stacks[:2], True, True])
|
.AndReturn([stacks[:2], True, True])
|
||||||
api.heat.stacks_list(IsA(http.HttpRequest),
|
api.heat.stacks_list(IsA(http.HttpRequest),
|
||||||
marker=stacks[2].id,
|
marker=stacks[2].id,
|
||||||
paginate=True,
|
paginate=True,
|
||||||
sort_dir='desc') \
|
sort_dir='desc',
|
||||||
|
filters=filters) \
|
||||||
.AndReturn([stacks[2:4], True, True])
|
.AndReturn([stacks[2:4], True, True])
|
||||||
api.heat.stacks_list(IsA(http.HttpRequest),
|
api.heat.stacks_list(IsA(http.HttpRequest),
|
||||||
marker=stacks[4].id,
|
marker=stacks[4].id,
|
||||||
paginate=True,
|
paginate=True,
|
||||||
sort_dir='desc') \
|
sort_dir='desc',
|
||||||
|
filters=filters) \
|
||||||
.AndReturn([stacks[4:], True, True])
|
.AndReturn([stacks[4:], True, True])
|
||||||
self.mox.ReplayAll()
|
self.mox.ReplayAll()
|
||||||
|
|
||||||
@ -176,26 +180,30 @@ class StackTests(test.TestCase):
|
|||||||
@test.create_stubs({api.heat: ('stacks_list',)})
|
@test.create_stubs({api.heat: ('stacks_list',)})
|
||||||
def test_index_prev_paginated(self):
|
def test_index_prev_paginated(self):
|
||||||
stacks = self.stacks.list()[:3]
|
stacks = self.stacks.list()[:3]
|
||||||
|
filters = {}
|
||||||
api.heat.stacks_list(IsA(http.HttpRequest),
|
api.heat.stacks_list(IsA(http.HttpRequest),
|
||||||
marker=None,
|
marker=None,
|
||||||
paginate=True,
|
paginate=True,
|
||||||
sort_dir='desc') \
|
sort_dir='desc',
|
||||||
|
filters=filters) \
|
||||||
.AndReturn([stacks, True, False])
|
.AndReturn([stacks, True, False])
|
||||||
api.heat.stacks_list(IsA(http.HttpRequest),
|
api.heat.stacks_list(IsA(http.HttpRequest),
|
||||||
marker=None,
|
marker=None,
|
||||||
paginate=True,
|
paginate=True,
|
||||||
sort_dir='desc') \
|
sort_dir='desc',
|
||||||
|
filters=filters) \
|
||||||
.AndReturn([stacks[:2], True, True])
|
.AndReturn([stacks[:2], True, True])
|
||||||
api.heat.stacks_list(IsA(http.HttpRequest),
|
api.heat.stacks_list(IsA(http.HttpRequest),
|
||||||
marker=stacks[2].id,
|
marker=stacks[2].id,
|
||||||
paginate=True,
|
paginate=True,
|
||||||
sort_dir='desc') \
|
sort_dir='desc',
|
||||||
|
filters=filters) \
|
||||||
.AndReturn([stacks[2:], True, True])
|
.AndReturn([stacks[2:], True, True])
|
||||||
api.heat.stacks_list(IsA(http.HttpRequest),
|
api.heat.stacks_list(IsA(http.HttpRequest),
|
||||||
marker=stacks[2].id,
|
marker=stacks[2].id,
|
||||||
paginate=True,
|
paginate=True,
|
||||||
sort_dir='asc') \
|
sort_dir='asc',
|
||||||
|
filters=filters) \
|
||||||
.AndReturn([stacks[:2], True, True])
|
.AndReturn([stacks[:2], True, True])
|
||||||
self.mox.ReplayAll()
|
self.mox.ReplayAll()
|
||||||
|
|
||||||
@ -728,11 +736,12 @@ class StackTests(test.TestCase):
|
|||||||
|
|
||||||
def _test_stack_action(self, action):
|
def _test_stack_action(self, action):
|
||||||
stack = self.stacks.first()
|
stack = self.stacks.first()
|
||||||
|
filters = {}
|
||||||
api.heat.stacks_list(IsA(http.HttpRequest),
|
api.heat.stacks_list(IsA(http.HttpRequest),
|
||||||
marker=None,
|
marker=None,
|
||||||
paginate=True,
|
paginate=True,
|
||||||
sort_dir='desc') \
|
sort_dir='desc',
|
||||||
|
filters=filters) \
|
||||||
.AndReturn([self.stacks.list(), True, True])
|
.AndReturn([self.stacks.list(), True, True])
|
||||||
|
|
||||||
getattr(api.heat, 'action_%s' % action)(IsA(http.HttpRequest),
|
getattr(api.heat, 'action_%s' % action)(IsA(http.HttpRequest),
|
||||||
|
@ -55,6 +55,7 @@ class IndexView(tables.DataTableView):
|
|||||||
|
|
||||||
def get_data(self):
|
def get_data(self):
|
||||||
stacks = []
|
stacks = []
|
||||||
|
filters = self.get_filters()
|
||||||
prev_marker = self.request.GET.get(
|
prev_marker = self.request.GET.get(
|
||||||
project_tables.StacksTable._meta.prev_pagination_param)
|
project_tables.StacksTable._meta.prev_pagination_param)
|
||||||
if prev_marker is not None:
|
if prev_marker is not None:
|
||||||
@ -69,7 +70,8 @@ class IndexView(tables.DataTableView):
|
|||||||
self.request,
|
self.request,
|
||||||
marker=marker,
|
marker=marker,
|
||||||
paginate=True,
|
paginate=True,
|
||||||
sort_dir=sort_dir)
|
sort_dir=sort_dir,
|
||||||
|
filters=filters)
|
||||||
if prev_marker is not None:
|
if prev_marker is not None:
|
||||||
stacks = sorted(stacks, key=attrgetter('creation_time'),
|
stacks = sorted(stacks, key=attrgetter('creation_time'),
|
||||||
reverse=True)
|
reverse=True)
|
||||||
|
Loading…
Reference in New Issue
Block a user