Added search for modules by binary rpm.

Signed-off-by: Martin Curlej <mcurlej@redhat.com>

Updated PR according to review.

Signed-off-by: Martin Curlej <mcurlej@redhat.com>

Searching by multiple koji tags + tests

Signed-off-by: Martin Curlej <mcurlej@redhat.com>
This commit is contained in:
Martin Curlej
2018-06-19 17:01:16 +02:00
parent 6981449853
commit 0aa9f014ce
3 changed files with 85 additions and 3 deletions

View File

@@ -1064,3 +1064,26 @@ chmod 644 %buildroot/etc/rpm/macros.zz-modules
if self.config.koji_enable_content_generator and self.module.state == 3:
cg = KojiContentGenerator(self.module, self.config)
cg.koji_import()
@staticmethod
def get_rpm_module_tag(rpm):
"""
Returns koji tag of a given rpm filename.
:param str rpm: the *.rpm filename of a rpm
:rtype: str
:return: koji tag
"""
session = KojiModuleBuilder.get_session(conf, None)
rpm_md = session.getRPM(rpm)
if not rpm_md:
return None
tags = []
koji_tags = session.listTags(rpm_md["build_id"])
for t in koji_tags:
if not t["name"].endswith("-build") and t["name"].startswith("module-"):
tags.append(t["name"])
return tags

View File

@@ -30,7 +30,7 @@ from datetime import datetime
from flask import request, url_for, Response
from sqlalchemy.sql.sqltypes import Boolean as sqlalchemy_boolean
from module_build_service import models, api_version
from module_build_service import models, api_version, conf
from module_build_service.errors import ValidationError, NotFound
from .general import scm_url_schemes
@@ -212,12 +212,25 @@ def filter_module_builds(flask_request):
for key, part in zip(query_keys, nsvc_parts):
search_query[key] = part
rpm = flask_request.args.get('rpm', None)
koji_tags = []
if rpm:
if conf.system == "koji":
# we are importing the koji builder here so we can search for the rpm metadata
# from koji. If we imported this regulary we would have gotten a circular import error.
from module_build_service.builder.KojiModuleBuilder import KojiModuleBuilder # noqa
koji_tags = KojiModuleBuilder.get_rpm_module_tag(rpm)
else:
raise ValidationError("Configured builder does not allow to search by rpm binary name!")
query = models.ModuleBuild.query
if search_query:
query = query.filter_by(**search_query)
if search_states:
query = query.filter(models.ModuleBuild.state.in_(search_states))
if koji_tags:
query = query.filter(models.ModuleBuild.koji_tag.in_(koji_tags)).filter_by(**search_query)
# This is used when filtering the date request parameters, but it is here to avoid recompiling
utc_iso_datetime_regex = re.compile(

View File

@@ -24,14 +24,15 @@ import json
import module_build_service.scm
from mock import patch, PropertyMock
from mock import patch, PropertyMock, Mock
from shutil import copyfile
from os import path, mkdir
from os.path import dirname
from requests.utils import quote
import hashlib
import pytest
from tests import app, init_data, clean_database
from tests import app, init_data, clean_database, reuse_component_init_data
from module_build_service.errors import UnprocessableEntity
from module_build_service.models import ModuleBuild
from module_build_service import db, version, Modulemd
@@ -392,6 +393,51 @@ class TestViews:
for key, part in zip(nsvc_keys, nsvc_parts):
assert item[key] == part
@patch("module_build_service.builder.KojiModuleBuilder.KojiModuleBuilder.get_session")
def test_query_builds_with_binary_rpm(self, mock_get_session):
"""
Test for querying MBS with the binary rpm filename. MBS should return all the modules,
which contain the rpm.
"""
# update database with builds which contain koji tags.
reuse_component_init_data()
mock_rpm_md = {"build_id": 1065871}
mock_tags = [{"name": "module-testmodule-master-20170219191323-c40c156c"},
{"name": "module-testmodule-master-20170219191323-c40c156c-build"},
{"name": "non-module-tag"},
{"name": "module-testmodule-master-20170109091357-78e4a6fd"}]
mock_session = Mock()
mock_session.getRPM.return_value = mock_rpm_md
mock_session.listTags.return_value = mock_tags
mock_get_session.return_value = mock_session
rpm = quote('module-build-macros-0.1-1.testmodule_master_20170303190726.src.rpm')
rv = self.client.get('/module-build-service/1/module-builds/?rpm=%s' % rpm)
results = json.loads(rv.data)['items']
assert len(results) == 2
assert results[0]["koji_tag"] == "module-testmodule-master-20170219191323-c40c156c"
assert results[1]["koji_tag"] == "module-testmodule-master-20170109091357-78e4a6fd"
mock_session.getRPM.assert_called_once_with(
"module-build-macros-0.1-1.testmodule_master_20170303190726.src.rpm")
mock_session.listTags.assert_called_once_with(mock_rpm_md["build_id"])
@patch('module_build_service.config.Config.system',
new_callable=PropertyMock, return_value="invalid_builder")
def test_query_builds_with_binary_rpm_not_koji(self, mock_builder):
rpm = quote('module-build-macros-0.1-1.testmodule_master_20170303190726.src.rpm')
rv = self.client.get('/module-build-service/1/module-builds/?rpm=%s' % rpm)
results = json.loads(rv.data)
expected_error = {
'error': 'Bad Request',
'message': 'Configured builder does not allow to search by rpm binary name!',
'status': 400
}
assert rv.status_code == 400
assert results == expected_error
def test_query_component_build(self):
rv = self.client.get('/module-build-service/1/component-builds/1')
data = json.loads(rv.data)