Allow the virtual streams of a base module to be queryable in the database and API

This commit is contained in:
mprahl
2019-04-22 11:04:11 -04:00
parent 16091b7d86
commit 00daedccfd
12 changed files with 281 additions and 35 deletions

View File

@@ -33,7 +33,9 @@ import module_build_service
from module_build_service import db
from module_build_service.utils import get_rpm_release, import_mmd
from module_build_service.config import init_config
from module_build_service.models import ModuleBuild, ComponentBuild, make_session, BUILD_STATES
from module_build_service.models import (
ModuleBuild, ComponentBuild, VirtualStream, make_session, BUILD_STATES,
)
from module_build_service import glib, Modulemd
@@ -791,4 +793,16 @@ def make_module(nsvc, requires_list=None, build_requires_list=None, base_module=
db.session.add(module_build)
db.session.commit()
if virtual_streams:
for virtual_stream in virtual_streams:
vs_obj = db.session.query(VirtualStream).filter_by(name=virtual_stream).first()
if not vs_obj:
vs_obj = VirtualStream(name=virtual_stream)
db.session.add(vs_obj)
db.session.commit()
if vs_obj not in module_build.virtual_streams:
module_build.virtual_streams.append(vs_obj)
db.session.commit()
return module_build

View File

@@ -172,3 +172,16 @@ class TestModelsGetStreamsContexts:
build.context) for build in builds])
assert builds == set(['platform:f29.1.0:15:c11', 'platform:f29.1.0:15:c11.another',
'platform:f29.2.0:1:c11'])
def test_add_virtual_streams_filter(self):
clean_database(False)
make_module("platform:f29.1.0:10:c1", {}, {}, virtual_streams=["f29"])
make_module("platform:f29.1.0:15:c1", {}, {}, virtual_streams=["f29"])
make_module("platform:f29.3.0:15:old_version", {}, {}, virtual_streams=["f28", "f29"])
make_module("platform:f29.3.0:20:c11", {}, {}, virtual_streams=["f30"])
with make_session(conf) as session:
query = session.query(ModuleBuild).filter_by(name="platform")
query = ModuleBuild._add_virtual_streams_filter(session, query, ["f28", "f29"])
count = query.count()
assert count == 3

View File

@@ -55,8 +55,8 @@ class TestMBSModule:
mock_session().get.return_value = mock_res
resolver = mbs_resolver.GenericResolver.create(tests.conf, backend='mbs')
module_mmds = resolver.get_module_modulemds('testmodule', 'master', '20180205135154',
'9c690d0e')
module_mmds = resolver.get_module_modulemds(
'testmodule', 'master', '20180205135154', '9c690d0e', virtual_streams=["f28"])
nsvcs = set(
'{}:{}:{}:{}'.format(m.peek_name(), m.peek_stream(),
m.peek_version(), m.peek_context())
@@ -73,7 +73,8 @@ class TestMBSModule:
"order_desc_by": "version",
"page": 1,
"per_page": 10,
"state": "ready"
"state": "ready",
"virtual_stream": ["f28"],
}
mock_session().get.assert_called_once_with(mbs_url, params=expected_query)
assert nsvcs == expected

View File

@@ -191,6 +191,7 @@ class TestViews:
assert data['modulemd'] == to_text_type(mmd.read())
assert data['name'] == 'nginx'
assert data['owner'] == 'Moe Szyslak'
assert data['rebuild_strategy'] == 'changed-and-after'
assert data['scmurl'] == ('git://pkgs.domain.local/modules/nginx'
'?#ba95886c7a443b36a9ce31abda1f9bef22f2f8c9')
assert data['scratch'] is False
@@ -224,8 +225,7 @@ class TestViews:
assert data['time_modified'] == u'2016-09-03T11:25:32Z'
assert data['time_submitted'] == u'2016-09-03T11:23:20Z'
assert data['version'] == '2'
assert data['rebuild_strategy'] == 'changed-and-after'
assert data['siblings'] == []
assert data['virtual_streams'] == []
def test_query_build_with_br_verbose_mode(self):
reuse_component_init_data()
@@ -674,6 +674,31 @@ class TestViews:
elif stream_version_lte == '293000':
assert total == 3
@pytest.mark.parametrize('virtual_streams', ([], ('f28',), ('f29',), ('f28', 'f29')))
def test_query_builds_filter_virtual_streams(self, virtual_streams):
# Populate some platform modules with virtual streams
init_data(data_size=1, multiple_stream_versions=True)
url = '/module-build-service/1/module-builds/?name=platform&verbose=true'
for virtual_stream in virtual_streams:
url += '&virtual_stream={}'.format(virtual_stream)
rv = self.client.get(url)
data = json.loads(rv.data)
total = data['meta']['total']
if virtual_streams == ('f28',):
assert total == 1
for module in data['items']:
assert module['virtual_streams'] == ['f28']
elif virtual_streams == ('f29',):
assert total == 3
for module in data['items']:
assert module['virtual_streams'] == ['f29']
elif virtual_streams == ('f28', 'f29'):
assert total == 4
for module in data['items']:
assert len(set(module['virtual_streams']) - set(['f28', 'f29'])) == 0
elif len(virtual_streams) == 0:
assert total == 5
def test_query_builds_order_by(self):
build = db.session.query(module_build_service.models.ModuleBuild).filter_by(id=2).one()
build.name = 'candy'
@@ -1974,7 +1999,7 @@ class TestViews:
platform_mmd.set_stream(platform_override)
if platform_override == 'el8.0.0':
xmd = from_variant_dict(platform_mmd.get_xmd())
xmd['mbs']['virtual_streams'] = 'el8'
xmd['mbs']['virtual_streams'] = ['el8']
platform_mmd.set_xmd(dict_values(xmd))
import_mmd(db.session, platform_mmd)