From c4a95d0673abb93696a2393b469b970942d9dca9 Mon Sep 17 00:00:00 2001 From: Valerij Maljulin Date: Aug 28 2019 13:34:46 +0000 Subject: Add a check for non-ready builds (siblings) in requires resolver Signed-off-by: Valerij Maljulin --- diff --git a/module_build_service/models.py b/module_build_service/models.py index 01f4595..19323f9 100644 --- a/module_build_service/models.py +++ b/module_build_service/models.py @@ -438,7 +438,8 @@ class ModuleBuild(MBSBase): allowing to set additional filter for results. """ return ModuleBuild._get_last_builds_in_stream_query( - db_session, name, stream, **kwargs).first() + db_session, name, stream, **kwargs + ).first() @staticmethod def get_build_from_nsvc(db_session, name, stream, version, context, **kwargs): diff --git a/module_build_service/resolver/DBResolver.py b/module_build_service/resolver/DBResolver.py index f187a89..2dbb9fb 100644 --- a/module_build_service/resolver/DBResolver.py +++ b/module_build_service/resolver/DBResolver.py @@ -388,14 +388,26 @@ class DBResolver(GenericResolver): if module_version is None or module_context is None: build = models.ModuleBuild.get_last_build_in_stream( - self.db_session, module_name, module_stream) + self.db_session, module_name, module_stream + ) else: build = models.ModuleBuild.get_build_from_nsvc( - self.db_session, module_name, module_stream, module_version, module_context) + self.db_session, module_name, module_stream, module_version, module_context + ) if not build: raise UnprocessableEntity("The module {} was not found".format(nsvc)) + for sibling_id in build.siblings(self.db_session): + sibling_build = models.ModuleBuild.get_by_id(self.db_session, sibling_id) + if sibling_build.state not in ( + models.BUILD_STATES["ready"], models.BUILD_STATES["failed"] + ): + raise UnprocessableEntity('Buildrequire {}-{}-{} is in "{}" state'.format( + sibling_build.name, sibling_build.stream, sibling_build.version, + models.INVERSE_BUILD_STATES[sibling_build.state] + )) + commit_hash = None mmd = build.mmd() mbs_xmd = mmd.get_xmd().get("mbs", {}) diff --git a/tests/test_resolver/test_db.py b/tests/test_resolver/test_db.py index b0500ac..1508996 100644 --- a/tests/test_resolver/test_db.py +++ b/tests/test_resolver/test_db.py @@ -30,6 +30,7 @@ import module_build_service.resolver as mbs_resolver from module_build_service import models, utils, Modulemd from module_build_service.utils import import_mmd, mmd_to_str, load_mmd from module_build_service.models import ModuleBuild +from module_build_service.errors import UnprocessableEntity import tests @@ -188,6 +189,41 @@ class TestDBModule: } } + def test_resolve_requires_exception(self, db_session): + build = models.ModuleBuild.get_by_id(db_session, 2) + resolver = mbs_resolver.GenericResolver.create(db_session, tests.conf, backend="db") + with pytest.raises(UnprocessableEntity): + resolver.resolve_requires( + [":".join(["abcdefghi", build.stream, build.version, build.context])] + ) + + def test_resolve_requires_siblings(self, db_session): + tests.clean_database() + resolver = mbs_resolver.GenericResolver.create(db_session, tests.conf, backend="db") + mmd = load_mmd(tests.read_staged_data("formatted_testmodule")) + for i in range(3): + build = tests.module_build_from_modulemd(mmd_to_str(mmd)) + build.build_context = "f6e2aeec7576196241b9afa0b6b22acf2b6873d" + str(i) + build.runtime_context = "bbc84c7b817ab3dd54916c0bcd6c6bdf512f7f9c" + str(i) + build.state = models.BUILD_STATES["ready"] + db_session.add(build) + db_session.commit() + + build_one = ModuleBuild.get_by_id(db_session, 2) + nsvc = ":".join([build_one.name, build_one.stream, build_one.version, build_one.context]) + result = resolver.resolve_requires([nsvc]) + assert result == { + "testmodule": { + "stream": build_one.stream, + "version": build_one.version, + "context": build_one.context, + "ref": "65a7721ee4eff44d2a63fb8f3a8da6e944ab7f4d", + "koji_tag": None + } + } + + db_session.commit() + def test_resolve_profiles(self, db_session): """ Tests that the profiles get resolved recursively