mirror of
https://pagure.io/fm-orchestrator.git
synced 2026-02-08 07:43:20 +08:00
Please note that this patch does not change the use of database session in MBS. So, in the frontend, the database session is still managed by Flask-SQLAlchemy, that is the db.session. And the backend, running event handlers, has its own database session created from SQLAclehmy session API directly. This patch aims to reduce the number of scoped_session created when call original function make_db_session. For technical detailed information, please refer to SQLAlchemy documentation Contextual/Thread-local Sessions. As a result, a global scoped_session is accessible from the code running inside backend, both the event handlers and functions called from handlers. The library code shared by frontend and backend, like resolvers, has no change. Similarly, db.session is only used to recreate database for every test. Signed-off-by: Chenxiong Qi <cqi@redhat.com>
255 lines
9.3 KiB
Python
255 lines
9.3 KiB
Python
# -*- coding: utf-8 -*-
|
|
# SPDX-License-Identifier: MIT
|
|
import mock
|
|
from mock import patch
|
|
import module_build_service.messaging
|
|
import module_build_service.scheduler.handlers.modules
|
|
import os
|
|
import koji
|
|
import pytest
|
|
from tests import conf, scheduler_init_data
|
|
import module_build_service.resolver
|
|
from module_build_service import build_logs, Modulemd
|
|
from module_build_service.db_session import db_session
|
|
from module_build_service.models import ComponentBuild, ModuleBuild
|
|
|
|
base_dir = os.path.dirname(os.path.dirname(__file__))
|
|
|
|
|
|
class TestModuleWait:
|
|
def setup_method(self, test_method):
|
|
scheduler_init_data()
|
|
|
|
self.config = conf
|
|
self.session = mock.Mock()
|
|
self.fn = module_build_service.scheduler.handlers.modules.wait
|
|
|
|
def teardown_method(self, test_method):
|
|
try:
|
|
path = build_logs.path(db_session, 1)
|
|
os.remove(path)
|
|
except Exception:
|
|
pass
|
|
|
|
@patch("module_build_service.builder.GenericBuilder.create_from_module")
|
|
def test_init_basic(self, create_builder):
|
|
builder = mock.Mock()
|
|
builder.get_disttag_srpm.return_value = "some srpm disttag"
|
|
builder.build.return_value = 1234, 1, "", None
|
|
builder.module_build_tag = {"name": "some-tag-build"}
|
|
create_builder.return_value = builder
|
|
|
|
module_build_id = db_session.query(ModuleBuild).first().id
|
|
msg = module_build_service.messaging.MBSModule(
|
|
msg_id=None,
|
|
module_build_id=module_build_id,
|
|
module_build_state="some state")
|
|
with patch("module_build_service.resolver.GenericResolver.create"):
|
|
self.fn(config=self.config, msg=msg)
|
|
|
|
@patch(
|
|
"module_build_service.builder.GenericBuilder.default_buildroot_groups",
|
|
return_value={"build": [], "srpm-build": []},
|
|
)
|
|
@patch("module_build_service.builder.GenericBuilder.create_from_module")
|
|
@patch("module_build_service.resolver.DBResolver")
|
|
@patch("module_build_service.resolver.GenericResolver")
|
|
def test_new_repo_called_when_macros_reused(
|
|
self, generic_resolver, resolver, create_builder, dbg
|
|
):
|
|
"""
|
|
Test that newRepo is called when module-build-macros build is reused.
|
|
"""
|
|
koji_session = mock.MagicMock()
|
|
koji_session.newRepo.return_value = 123456
|
|
|
|
builder = mock.MagicMock()
|
|
builder.koji_session = koji_session
|
|
builder.module_build_tag = {"name": "module-123-build"}
|
|
builder.get_disttag_srpm.return_value = "some srpm disttag"
|
|
builder.build.return_value = (
|
|
1234,
|
|
koji.BUILD_STATES["COMPLETE"],
|
|
"",
|
|
"module-build-macros-1-1",
|
|
)
|
|
create_builder.return_value = builder
|
|
|
|
resolver = mock.MagicMock()
|
|
resolver.backend = "db"
|
|
resolver.get_module_tag.return_value = "module-testmodule-master-20170109091357"
|
|
|
|
generic_resolver.create.return_value = resolver
|
|
msg = module_build_service.messaging.MBSModule(
|
|
msg_id=None, module_build_id=2, module_build_state="some state")
|
|
|
|
module_build_service.scheduler.handlers.modules.wait(
|
|
config=conf, msg=msg)
|
|
|
|
koji_session.newRepo.assert_called_once_with("module-123-build")
|
|
|
|
# When module-build-macros is reused, it still has to appear only
|
|
# once in database.
|
|
builds_count = db_session.query(ComponentBuild).filter_by(
|
|
package="module-build-macros", module_id=2).count()
|
|
assert builds_count == 1
|
|
|
|
@patch(
|
|
"module_build_service.builder.GenericBuilder.default_buildroot_groups",
|
|
return_value={"build": [], "srpm-build": []},
|
|
)
|
|
@patch("module_build_service.builder.GenericBuilder.create_from_module")
|
|
@patch("module_build_service.resolver.DBResolver")
|
|
@patch("module_build_service.resolver.GenericResolver")
|
|
def test_new_repo_not_called_when_macros_not_reused(
|
|
self, generic_resolver, resolver, create_builder, dbg
|
|
):
|
|
"""
|
|
Test that newRepo is called everytime for module-build-macros
|
|
"""
|
|
koji_session = mock.MagicMock()
|
|
koji_session.newRepo.return_value = 123456
|
|
|
|
builder = mock.MagicMock()
|
|
builder.koji_session = koji_session
|
|
builder.module_build_tag = {"name": "module-123-build"}
|
|
builder.get_disttag_srpm.return_value = "some srpm disttag"
|
|
builder.build.return_value = (
|
|
1234,
|
|
koji.BUILD_STATES["BUILDING"],
|
|
"",
|
|
"module-build-macros-1-1",
|
|
)
|
|
create_builder.return_value = builder
|
|
|
|
resolver = mock.MagicMock()
|
|
resolver.backend = "db"
|
|
resolver.get_module_tag.return_value = "module-testmodule-master-20170109091357"
|
|
|
|
generic_resolver.create.return_value = resolver
|
|
msg = module_build_service.messaging.MBSModule(
|
|
msg_id=None, module_build_id=2, module_build_state="some state")
|
|
|
|
module_build_service.scheduler.handlers.modules.wait(
|
|
config=conf, msg=msg)
|
|
|
|
assert koji_session.newRepo.called
|
|
|
|
@patch(
|
|
"module_build_service.builder.GenericBuilder.default_buildroot_groups",
|
|
return_value={"build": [], "srpm-build": []},
|
|
)
|
|
@patch("module_build_service.builder.GenericBuilder.create_from_module")
|
|
@patch("module_build_service.resolver.DBResolver")
|
|
@patch("module_build_service.resolver.GenericResolver")
|
|
def test_set_cg_build_koji_tag_fallback_to_default(
|
|
self, generic_resolver, resolver, create_builder, dbg
|
|
):
|
|
"""
|
|
Test that build.cg_build_koji_tag fallbacks to default tag.
|
|
"""
|
|
base_mmd = Modulemd.ModuleStreamV2.new("base-runtime", "f27")
|
|
|
|
koji_session = mock.MagicMock()
|
|
koji_session.newRepo.return_value = 123456
|
|
|
|
builder = mock.MagicMock()
|
|
builder.koji_session = koji_session
|
|
builder.module_build_tag = {"name": "module-123-build"}
|
|
builder.get_disttag_srpm.return_value = "some srpm disttag"
|
|
builder.build.return_value = (
|
|
1234,
|
|
koji.BUILD_STATES["BUILDING"],
|
|
"",
|
|
"module-build-macros-1-1",
|
|
)
|
|
create_builder.return_value = builder
|
|
|
|
resolver = mock.MagicMock()
|
|
resolver.backend = "db"
|
|
resolver.get_module_tag.return_value = "module-testmodule-master-20170109091357"
|
|
resolver.get_module_build_dependencies.return_value = {
|
|
"module-bootstrap-tag": [base_mmd]
|
|
}
|
|
|
|
generic_resolver.create.return_value = resolver
|
|
msg = module_build_service.messaging.MBSModule(
|
|
msg_id=None, module_build_id=2, module_build_state="some state")
|
|
|
|
module_build_service.scheduler.handlers.modules.wait(
|
|
config=conf, msg=msg)
|
|
|
|
module_build = ModuleBuild.get_by_id(db_session, 2)
|
|
assert module_build.cg_build_koji_tag == "modular-updates-candidate"
|
|
|
|
@pytest.mark.parametrize(
|
|
"koji_cg_tag_build,expected_cg_koji_build_tag",
|
|
[
|
|
[True, "f27-modular-updates-candidate"],
|
|
[False, None]
|
|
],
|
|
)
|
|
@patch(
|
|
"module_build_service.builder.GenericBuilder.default_buildroot_groups",
|
|
return_value={"build": [], "srpm-build": []},
|
|
)
|
|
@patch("module_build_service.builder.GenericBuilder.create_from_module")
|
|
@patch("module_build_service.resolver.DBResolver")
|
|
@patch("module_build_service.resolver.GenericResolver")
|
|
@patch(
|
|
"module_build_service.config.Config.base_module_names",
|
|
new_callable=mock.PropertyMock,
|
|
return_value=["base-runtime", "platform"],
|
|
)
|
|
def test_set_cg_build_koji_tag(
|
|
self,
|
|
cfg,
|
|
generic_resolver,
|
|
resolver,
|
|
create_builder,
|
|
dbg,
|
|
koji_cg_tag_build,
|
|
expected_cg_koji_build_tag,
|
|
):
|
|
"""
|
|
Test that build.cg_build_koji_tag is set.
|
|
"""
|
|
base_mmd = Modulemd.ModuleStreamV2.new("base-runtime", "f27")
|
|
|
|
koji_session = mock.MagicMock()
|
|
koji_session.newRepo.return_value = 123456
|
|
|
|
builder = mock.MagicMock()
|
|
builder.koji_session = koji_session
|
|
builder.module_build_tag = {"name": "module-123-build"}
|
|
builder.get_disttag_srpm.return_value = "some srpm disttag"
|
|
builder.build.return_value = (
|
|
1234,
|
|
koji.BUILD_STATES["BUILDING"],
|
|
"",
|
|
"module-build-macros-1-1",
|
|
)
|
|
create_builder.return_value = builder
|
|
|
|
resolver = mock.MagicMock()
|
|
resolver.backend = "db"
|
|
resolver.get_module_tag.return_value = "module-testmodule-master-20170109091357"
|
|
resolver.get_module_build_dependencies.return_value = {
|
|
"module-bootstrap-tag": [base_mmd]
|
|
}
|
|
|
|
with patch.object(
|
|
module_build_service.scheduler.handlers.modules.conf,
|
|
"koji_cg_tag_build",
|
|
new=koji_cg_tag_build,
|
|
):
|
|
generic_resolver.create.return_value = resolver
|
|
msg = module_build_service.messaging.MBSModule(
|
|
msg_id=None, module_build_id=2, module_build_state="some state"
|
|
)
|
|
module_build_service.scheduler.handlers.modules.wait(
|
|
config=conf, msg=msg
|
|
)
|
|
module_build = ModuleBuild.get_by_id(db_session, 2)
|
|
assert module_build.cg_build_koji_tag == expected_cg_koji_build_tag
|