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:
parent
cfa193fd34
commit
7811036c6a
|
@ -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):
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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()
|
||||
|
||||
|
||||
|
|
|
@ -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):
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue