Files
fm-orchestrator/tests/test_scheduler/test_module_wait.py
Chenxiong Qi f24cd4222f Make db_session singleton
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>
2019-11-07 11:06:40 +08:00

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