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', 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):

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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