Add regex matching for job_binary_internal_list()

This change implements regex matching for filters on string
values passed to job_binary_internal_list() in the REST api.
No existing internal calls that use job_binary_internal_get_all()
are affected.

Partial-bug: #1503345

Change-Id: I268c439ab83587375dbff7e125e23f07c9381d83
This commit is contained in:
Trevor McKay 2016-02-11 12:11:50 -05:00
parent cfa193fd34
commit 7811036c6a
6 changed files with 86 additions and 18 deletions

View File

@ -427,12 +427,23 @@ class LocalApi(object):
# JobBinaryInternal ops
@r.wrap(r.JobBinaryInternal)
def job_binary_internal_get_all(self, context, **kwargs):
def job_binary_internal_get_all(self, context,
regex_search=False, **kwargs):
"""Get all JobBinaryInternals filtered by **kwargs.
e.g. cluster_get_all(name='wordcount.jar')
:param context: The context, and associated authentication, to use with
this operation
:param regex_search: If True, enable regex matching for filter
values. See the user guide for more information
on how regex matching is handled. If False,
no regex matching is done.
:param kwargs: Specifies values for named fields by which
to constrain the search
"""
return self._manager.job_binary_internal_get_all(context, **kwargs)
return self._manager.job_binary_internal_get_all(
context, regex_search, **kwargs)
@r.wrap(r.JobBinaryInternal)
def job_binary_internal_get(self, context, job_binary_internal):

View File

@ -594,14 +594,25 @@ class ConductorManager(db_base.Base):
# JobBinaryInternal ops
def job_binary_internal_get_all(self, context, **kwargs):
def job_binary_internal_get_all(self, context,
regex_search=False, **kwargs):
"""Get all JobBinaryInternals filtered by **kwargs.
e.g. cluster_get_all(name='wordcount.jar')
The JobBinaryInternals returned do not contain a data field.
:param context: The context, and associated authentication, to use with
this operation
:param regex_search: If True, enable regex matching for filter
values. See the user guide for more information
on how regex matching is handled. If False,
no regex matching is done.
:param kwargs: Specifies values for named fields by which
to constrain the search
"""
return self.db.job_binary_internal_get_all(context, **kwargs)
return self.db.job_binary_internal_get_all(context,
regex_search, **kwargs)
def job_binary_internal_get(self, context, job_binary_internal_id):
"""Return the JobBinaryInternal or None if it does not exist

View File

@ -438,14 +438,23 @@ def job_binary_update(context, values):
@to_dict
def job_binary_internal_get_all(context, **kwargs):
def job_binary_internal_get_all(context, regex_search=False, **kwargs):
"""Get all JobBinaryInternals filtered by **kwargs.
e.g. job_binary_internal_get_all(ctx, name='wordcount.jar')
The JobBinaryInternals returned do not contain a data field.
:param context: The context, and associated authentication, to use with
this operation
:param regex_search: If True, enable regex matching for filter
values. See the user guide for more information
on how regex matching is handled. If False,
no regex matching is done.
:param kwargs: Specifies values for named fields by which
to constrain the search
"""
return IMPL.job_binary_internal_get_all(context, **kwargs)
return IMPL.job_binary_internal_get_all(context, regex_search, **kwargs)
@to_dict

View File

@ -1138,12 +1138,18 @@ def _job_binary_internal_get(context, session, job_binary_internal_id):
return query.filter_by(id=job_binary_internal_id).first()
def job_binary_internal_get_all(context, **kwargs):
def job_binary_internal_get_all(context, regex_search=False, **kwargs):
"""Returns JobBinaryInternal objects that do not contain a data field
The data column uses deferred loading.
"""
regex_cols = ['name']
query = model_query(m.JobBinaryInternal, context)
if regex_search:
query, kwargs = regex_filter(query,
m.JobBinaryInternal, regex_cols, kwargs)
return query.filter_by(**kwargs).all()

View File

@ -241,7 +241,8 @@ def create_job_binary_internal(values):
def get_job_binary_internals(**kwargs):
return conductor.job_binary_internal_get_all(context.ctx(), **kwargs)
return conductor.job_binary_internal_get_all(context.ctx(),
regex_search=True, **kwargs)
def get_job_binary_internal(id):

View File

@ -16,10 +16,12 @@
import copy
import datetime
import mock
from sqlalchemy import exc as sa_exc
import testtools
from sahara import context
from sahara.db.sqlalchemy import models as m
from sahara import exceptions as ex
from sahara.service.castellan import config as castellan
import sahara.tests.unit.conductor.base as test_base
@ -724,19 +726,26 @@ class JobBinaryInternalTest(test_base.ConductorManagerTestCase):
def test_job_binary_internal_search(self):
ctx = context.ctx()
ctx.tenant_id = SAMPLE_JOB_BINARY_INTERNAL['tenant_id']
self.api.job_binary_internal_create(ctx, SAMPLE_JOB_BINARY_INTERNAL)
jbi = copy.copy(SAMPLE_JOB_BINARY_INTERNAL)
jbi["name"] = "frederica"
ctx.tenant_id = jbi['tenant_id']
self.api.job_binary_internal_create(ctx, jbi)
lst = self.api.job_binary_internal_get_all(ctx)
self.assertEqual(1, len(lst))
kwargs = {'name': SAMPLE_JOB_BINARY_INTERNAL['name'],
'tenant_id': SAMPLE_JOB_BINARY_INTERNAL['tenant_id']}
kwargs = {'name': jbi['name'],
'tenant_id': jbi['tenant_id']}
lst = self.api.job_binary_internal_get_all(ctx, **kwargs)
self.assertEqual(1, len(lst))
# Valid field but no matching value
kwargs = {'name': SAMPLE_JOB_BINARY_INTERNAL['name']+"foo"}
kwargs = {'name': jbi['name']+"foo"}
lst = self.api.job_binary_internal_get_all(ctx, **kwargs)
self.assertEqual(0, len(lst))
# Valid field with substrings
kwargs = {'name': "red"}
lst = self.api.job_binary_internal_get_all(ctx, **kwargs)
self.assertEqual(0, len(lst))
@ -745,6 +754,27 @@ class JobBinaryInternalTest(test_base.ConductorManagerTestCase):
self.api.job_binary_internal_get_all,
ctx, **{'badfield': 'junk'})
@mock.patch('sahara.db.sqlalchemy.api.regex_filter')
def test_job_binary_internal_search_regex(self, regex_filter):
# do this so we can return the correct value
def _regex_filter(query, cls, regex_cols, search_opts):
return query, search_opts
regex_filter.side_effect = _regex_filter
ctx = context.ctx()
self.api.job_binary_internal_get_all(ctx)
self.assertEqual(0, regex_filter.call_count)
self.api.job_binary_internal_get_all(ctx,
regex_search=True, name="fox")
self.assertEqual(1, regex_filter.call_count)
args, kwargs = regex_filter.call_args
self.assertTrue(type(args[1] is m.JobBinaryInternal))
self.assertEqual(args[2], ["name"])
self.assertEqual(args[3], {"name": "fox"})
def test_jbi_update_delete_when_protected(self):
ctx = context.ctx()
sample = copy.deepcopy(SAMPLE_JOB_BINARY_INTERNAL)