Find module build using attributes of a component build in koji

This commit is contained in:
Yashvardhan Nanavati
2017-07-06 11:44:55 -04:00
parent 5ac5ab0c13
commit d79a9584c7
5 changed files with 69724 additions and 7 deletions

View File

@@ -357,6 +357,51 @@ def pagination_metadata(p_query, request_args):
return pagination_data
def filter_component_builds(flask_request):
"""
Returns a flask_sqlalchemy.Pagination object based on the request parameters
:param request: Flask request object
:return: flask_sqlalchemy.Pagination
"""
search_query = dict()
state = flask_request.args.get('state', None)
if state:
if state.isdigit():
search_query['state'] = state
else:
if state in models.BUILD_STATES:
search_query['state'] = models.BUILD_STATES[state]
else:
raise ValidationError('An invalid state was supplied')
# Lookup module_build from task_id, ref, format, nvr or tagged attribute
# of a component build.
for key in ['task_id', 'ref', 'nvr', 'format', 'tagged']:
if flask_request.args.get(key, None):
search_query[key] = flask_request.args[key]
query = models.ComponentBuild.query
if search_query:
query = query.filter_by(**search_query)
# Order the results by any column in the ModuleBuild table.
order_by = flask_request.args.get("order_by", None)
order_desc_by = flask_request.args.get("order_desc_by", None)
if order_by or order_desc_by:
column = getattr(models.ComponentBuild, order_desc_by or order_by, None)
if column:
if order_desc_by:
column = column.desc()
query = query.order_by(column)
else:
raise ValidationError('An invalid order_by or order_desc_by key '
'was supplied')
page = flask_request.args.get('page', 1, type=int)
per_page = flask_request.args.get('per_page', 10, type=int)
return query.paginate(page, per_page, False)
def filter_module_builds(flask_request):
"""

View File

@@ -34,8 +34,9 @@ from flask.views import MethodView
from module_build_service import app, conf, log
from module_build_service import models, db
from module_build_service.utils import (
pagination_metadata, filter_module_builds, submit_module_build_from_scm,
submit_module_build_from_yaml, scm_url_schemes, get_scm_url_re)
pagination_metadata, filter_module_builds, filter_component_builds,
submit_module_build_from_scm, submit_module_build_from_yaml,
scm_url_schemes, get_scm_url_re)
from module_build_service.errors import (
ValidationError, Forbidden, NotFound)
@@ -59,8 +60,47 @@ api_v1 = {
'methods': ['GET', 'PATCH'],
}
},
'component_builds_list': {
'url': '/module-build-service/1/component-builds/',
'options': {
'defaults': {'id': None},
'methods': ['GET'],
}
},
}
class ComponentBuildAPI(MethodView):
def get(self, id):
verbose_flag = request.args.get('verbose', 'false')
if id is None:
# Lists all tracked builds
p_query = filter_component_builds(request)
json_data = {
'meta': pagination_metadata(p_query, request.args)
}
if verbose_flag.lower() == 'true' or verbose_flag == '1':
json_data['items'] = [item.api_json() for item in p_query.items]
else:
json_data['items'] = [{'id': item.id, 'state': item.state} for
item in p_query.items]
return jsonify(json_data), 200
else:
# Lists details for the specified module builds
module = models.ComponentBuild.query.filter_by(id=id).first()
if module:
if verbose_flag.lower() == 'true' or verbose_flag == '1':
return jsonify(module.json()), 200
else:
return jsonify(module.api_json()), 200
else:
raise NotFound('No such module found.')
class ModuleBuildAPI(MethodView):
@@ -243,10 +283,17 @@ class YAMLFileHandler(BaseHandler):
def register_api_v1():
""" Registers version 1 of MBS API. """
module_view = ModuleBuildAPI.as_view('module_builds')
component_view = ComponentBuildAPI.as_view('component_builds')
for key, val in api_v1.items():
app.add_url_rule(val['url'],
endpoint=key,
view_func=module_view,
**val['options'])
if key != 'component_builds_list':
app.add_url_rule(val['url'],
endpoint=key,
view_func=module_view,
**val['options'])
else:
app.add_url_rule(val['url'],
endpoint=key,
view_func=component_view,
**val['options'])
register_api_v1()

View File

@@ -250,6 +250,16 @@ class TestViews(unittest.TestCase):
self.assertEquals(item['time_modified'], '2016-09-03T11:25:32Z')
self.assertEquals(item['time_submitted'], '2016-09-03T11:23:20Z')
def test_query_builds_filter_nvr(self):
rv = self.client.get('/module-build-service/1/component-builds/?nvr=nginx-1.10.1-2.module_nginx_1_2')
data = json.loads(rv.data)
self.assertEquals(data['meta']['total'], 10)
def test_query_builds_filter_task_id(self):
rv = self.client.get('/module-build-service/1/component-builds/?task_id=12312346')
data = json.loads(rv.data)
self.assertEquals(data['meta']['total'], 1)
def test_query_builds_filter_name(self):
rv = self.client.get('/module-build-service/1/module-builds/?name=nginx')
data = json.loads(rv.data)

File diff suppressed because it is too large Load Diff