mirror of
https://pagure.io/fm-orchestrator.git
synced 2026-04-04 19:28:49 +08:00
Find module build using attributes of a component build in koji
This commit is contained in:
@@ -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):
|
||||
"""
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user