Reuse ModuleBuild.get_by_id

Signed-off-by: Chenxiong Qi <cqi@redhat.com>
This commit is contained in:
Chenxiong Qi
2019-06-30 11:05:57 +08:00
parent c15a7cadf3
commit 16bf4e945b
10 changed files with 132 additions and 123 deletions

View File

@@ -368,7 +368,7 @@ def scheduler_init_data(db_session, tangerine_state=None, scratch=False):
db_session.add(module_build) db_session.add(module_build)
db_session.commit() db_session.commit()
platform_br = db_session.query(module_build_service.models.ModuleBuild).get(1) platform_br = module_build_service.models.ModuleBuild.get_by_id(db_session, 1)
module_build.buildrequires.append(platform_br) module_build.buildrequires.append(platform_br)
arch = db_session.query(module_build_service.models.ModuleArch).get(1) arch = db_session.query(module_build_service.models.ModuleArch).get(1)
@@ -477,7 +477,7 @@ def reuse_component_init_data():
db.session.commit() db.session.commit()
db.session.refresh(build_one) db.session.refresh(build_one)
platform_br = module_build_service.models.ModuleBuild.query.get(1) platform_br = module_build_service.models.ModuleBuild.get_by_id(db.session, 1)
build_one.buildrequires.append(platform_br) build_one.buildrequires.append(platform_br)
arch = module_build_service.models.ModuleArch.query.get(1) arch = module_build_service.models.ModuleArch.query.get(1)

View File

@@ -1650,7 +1650,7 @@ class TestBuild(BaseTestBuild):
# Simulate a random repo regen message that MBS didn't expect # Simulate a random repo regen message that MBS didn't expect
cleanup_moksha() cleanup_moksha()
module = db_session.query(models.ModuleBuild).get(module_build_id) module = models.ModuleBuild.get_by_id(db_session, module_build_id)
msgs = [ msgs = [
module_build_service.messaging.KojiRepoChange( module_build_service.messaging.KojiRepoChange(
msg_id="a faked internal message", repo_tag=module.koji_tag + "-build" msg_id="a faked internal message", repo_tag=module.koji_tag + "-build"

View File

@@ -136,7 +136,7 @@ class TestKojiBuilder:
"/module-base-runtime-0.25-9/latest/x86_64" "/module-base-runtime-0.25-9/latest/x86_64"
) )
def test_recover_orphaned_artifact_when_tagged(self): def test_recover_orphaned_artifact_when_tagged(self, db_session):
""" Test recover_orphaned_artifact when the artifact is found and tagged in both tags """ Test recover_orphaned_artifact when the artifact is found and tagged in both tags
""" """
builder = FakeKojiModuleBuilder( builder = FakeKojiModuleBuilder(
@@ -154,7 +154,7 @@ class TestKojiBuilder:
build_tagged = [{"nvr": "foo-1.0-1.module+e0095747", "task_id": 12345, "build_id": 91}] build_tagged = [{"nvr": "foo-1.0-1.module+e0095747", "task_id": 12345, "build_id": 91}]
dest_tagged = [{"nvr": "foo-1.0-1.module+e0095747", "task_id": 12345, "build_id": 91}] dest_tagged = [{"nvr": "foo-1.0-1.module+e0095747", "task_id": 12345, "build_id": 91}]
builder.koji_session.listTagged.side_effect = [build_tagged, dest_tagged] builder.koji_session.listTagged.side_effect = [build_tagged, dest_tagged]
module_build = module_build_service.models.ModuleBuild.query.get(4) module_build = module_build_service.models.ModuleBuild.get_by_id(db_session, 4)
component_build = module_build.component_builds[0] component_build = module_build.component_builds[0]
component_build.task_id = None component_build.task_id = None
component_build.state = None component_build.state = None
@@ -181,7 +181,7 @@ class TestKojiBuilder:
assert component_build.state_reason == "Found existing build" assert component_build.state_reason == "Found existing build"
assert builder.koji_session.tagBuild.call_count == 0 assert builder.koji_session.tagBuild.call_count == 0
def test_recover_orphaned_artifact_when_untagged(self): def test_recover_orphaned_artifact_when_untagged(self, db_session):
""" Tests recover_orphaned_artifact when the build is found but untagged """ Tests recover_orphaned_artifact when the build is found but untagged
""" """
builder = FakeKojiModuleBuilder( builder = FakeKojiModuleBuilder(
@@ -203,7 +203,7 @@ class TestKojiBuilder:
builder.koji_session.untaggedBuilds.return_value = untagged builder.koji_session.untaggedBuilds.return_value = untagged
build_info = {"nvr": "foo-1.0-1.{0}".format(dist_tag), "task_id": 12345, "build_id": 91} build_info = {"nvr": "foo-1.0-1.{0}".format(dist_tag), "task_id": 12345, "build_id": 91}
builder.koji_session.getBuild.return_value = build_info builder.koji_session.getBuild.return_value = build_info
module_build = module_build_service.models.ModuleBuild.query.get(4) module_build = module_build_service.models.ModuleBuild.get_by_id(db_session, 4)
component_build = module_build.component_builds[0] component_build = module_build.component_builds[0]
component_build.task_id = None component_build.task_id = None
component_build.nvr = None component_build.nvr = None
@@ -224,7 +224,7 @@ class TestKojiBuilder:
assert component_build.state_reason == "Found existing build" assert component_build.state_reason == "Found existing build"
builder.koji_session.tagBuild.assert_called_once_with(2, "foo-1.0-1.{0}".format(dist_tag)) builder.koji_session.tagBuild.assert_called_once_with(2, "foo-1.0-1.{0}".format(dist_tag))
def test_recover_orphaned_artifact_when_nothing_exists(self): def test_recover_orphaned_artifact_when_nothing_exists(self, db_session):
""" Test recover_orphaned_artifact when the build is not found """ Test recover_orphaned_artifact when the build is not found
""" """
builder = FakeKojiModuleBuilder( builder = FakeKojiModuleBuilder(
@@ -243,7 +243,7 @@ class TestKojiBuilder:
builder.koji_session.listTagged.return_value = tagged builder.koji_session.listTagged.return_value = tagged
untagged = [{"nvr": "foo-1.0-1.nope", "release": "nope"}] untagged = [{"nvr": "foo-1.0-1.nope", "release": "nope"}]
builder.koji_session.untaggedBuilds.return_value = untagged builder.koji_session.untaggedBuilds.return_value = untagged
module_build = module_build_service.models.ModuleBuild.query.get(4) module_build = module_build_service.models.ModuleBuild.get_by_id(db_session, 4)
component_build = module_build.component_builds[0] component_build = module_build.component_builds[0]
component_build.task_id = None component_build.task_id = None
component_build.nvr = None component_build.nvr = None
@@ -729,7 +729,9 @@ class TestKojiBuilder:
), ),
) )
@patch("module_build_service.builder.KojiModuleBuilder.KojiClientSession") @patch("module_build_service.builder.KojiModuleBuilder.KojiClientSession")
def test_get_filtered_rpms_on_self_dep(self, ClientSession, br_filtered_rpms, expected): def test_get_filtered_rpms_on_self_dep(
self, ClientSession, br_filtered_rpms, expected, db_session
):
session = ClientSession.return_value session = ClientSession.return_value
session.listTaggedRPMS.return_value = ( session.listTaggedRPMS.return_value = (
[ [
@@ -774,7 +776,7 @@ class TestKojiBuilder:
], ],
) )
reuse_component_init_data() reuse_component_init_data()
current_module = module_build_service.models.ModuleBuild.query.get(3) current_module = module_build_service.models.ModuleBuild.get_by_id(db_session, 3)
rv = KojiModuleBuilder._get_filtered_rpms_on_self_dep(current_module, br_filtered_rpms) rv = KojiModuleBuilder._get_filtered_rpms_on_self_dep(current_module, br_filtered_rpms)
assert set(rv) == set(expected) assert set(rv) == set(expected)
session.assert_not_called() session.assert_not_called()

View File

@@ -77,20 +77,19 @@ class TestModels:
assert build.runtime_context == "bbc84c7b817ab3dd54916c0bcd6c6bdf512f7f9c" assert build.runtime_context == "bbc84c7b817ab3dd54916c0bcd6c6bdf512f7f9c"
assert build.context == "3ee22b28" assert build.context == "3ee22b28"
def test_siblings_property(self): def test_siblings_property(self, db_session):
""" Tests that the siblings property returns the ID of all modules with """ Tests that the siblings property returns the ID of all modules with
the same name:stream:version the same name:stream:version
""" """
clean_database() clean_database()
mmd = load_mmd(read_staged_data("formatted_testmodule")) mmd = load_mmd(read_staged_data("formatted_testmodule"))
with make_session(conf) as session: for i in range(3):
for i in range(3): build = module_build_from_modulemd(mmd_to_str(mmd))
build = module_build_from_modulemd(mmd_to_str(mmd)) build.build_context = "f6e2aeec7576196241b9afa0b6b22acf2b6873d" + str(i)
build.build_context = "f6e2aeec7576196241b9afa0b6b22acf2b6873d" + str(i) build.runtime_context = "bbc84c7b817ab3dd54916c0bcd6c6bdf512f7f9c" + str(i)
build.runtime_context = "bbc84c7b817ab3dd54916c0bcd6c6bdf512f7f9c" + str(i) db_session.add(build)
session.add(build) db_session.commit()
session.commit() build_one = ModuleBuild.get_by_id(db_session, 2)
build_one = ModuleBuild.query.get(2)
assert build_one.siblings == [3, 4] assert build_one.siblings == [3, 4]
@pytest.mark.parametrize( @pytest.mark.parametrize(

View File

@@ -90,15 +90,15 @@ class TestDBModule:
assert nsvcs == set(["platform:f29.1.0:3:00000000"]) assert nsvcs == set(["platform:f29.1.0:3:00000000"])
@pytest.mark.parametrize("empty_buildrequires", [False, True]) @pytest.mark.parametrize("empty_buildrequires", [False, True])
def test_get_module_build_dependencies(self, empty_buildrequires): def test_get_module_build_dependencies(self, empty_buildrequires, db_session):
""" """
Tests that the buildrequires of testmodule are returned Tests that the buildrequires of testmodule are returned
""" """
expected = set(["module-f28-build"]) expected = set(["module-f28-build"])
module = models.ModuleBuild.query.get(2) module = models.ModuleBuild.get_by_id(db_session, 2)
if empty_buildrequires: if empty_buildrequires:
expected = set() expected = set()
module = models.ModuleBuild.query.get(2) module = models.ModuleBuild.get_by_id(db_session, 2)
mmd = module.mmd() mmd = module.mmd()
# Wipe out the dependencies # Wipe out the dependencies
mmd.clear_dependencies() mmd.clear_dependencies()
@@ -106,19 +106,18 @@ class TestDBModule:
xmd["mbs"]["buildrequires"] = {} xmd["mbs"]["buildrequires"] = {}
mmd.set_xmd(xmd) mmd.set_xmd(xmd)
module.modulemd = mmd_to_str(mmd) module.modulemd = mmd_to_str(mmd)
db.session.add(module) db_session.commit()
db.session.commit()
resolver = mbs_resolver.GenericResolver.create(tests.conf, backend="db") resolver = mbs_resolver.GenericResolver.create(tests.conf, backend="db")
result = resolver.get_module_build_dependencies( result = resolver.get_module_build_dependencies(
"testmodule", "master", "20170109091357", "78e4a6fd").keys() "testmodule", "master", "20170109091357", "78e4a6fd").keys()
assert set(result) == expected assert set(result) == expected
def test_get_module_build_dependencies_recursive(self): def test_get_module_build_dependencies_recursive(self, db_session):
""" """
Tests that the buildrequires are returned when it is two layers deep Tests that the buildrequires are returned when it is two layers deep
""" """
# Add testmodule2 that requires testmodule # Add testmodule2 that requires testmodule
module = models.ModuleBuild.query.get(3) module = models.ModuleBuild.get_by_id(db_session, 3)
mmd = module.mmd() mmd = module.mmd()
# Rename the module # Rename the module
mmd = mmd.copy("testmodule2") mmd = mmd.copy("testmodule2")
@@ -139,8 +138,7 @@ class TestDBModule:
module.version = str(mmd.get_version()) module.version = str(mmd.get_version())
module.koji_tag = "module-ae2adf69caf0e1b6" module.koji_tag = "module-ae2adf69caf0e1b6"
db.session.add(module) db_session.commit()
db.session.commit()
resolver = mbs_resolver.GenericResolver.create(tests.conf, backend="db") resolver = mbs_resolver.GenericResolver.create(tests.conf, backend="db")
result = resolver.get_module_build_dependencies( result = resolver.get_module_build_dependencies(
@@ -171,8 +169,8 @@ class TestDBModule:
expected = [os.path.join(local_path, "module-parent-master-20170816080815/results")] expected = [os.path.join(local_path, "module-parent-master-20170816080815/results")]
assert set(result) == set(expected) assert set(result) == set(expected)
def test_resolve_requires(self): def test_resolve_requires(self, db_session):
build = models.ModuleBuild.query.get(2) build = models.ModuleBuild.get_by_id(db_session, 2)
resolver = mbs_resolver.GenericResolver.create(tests.conf, backend="db") resolver = mbs_resolver.GenericResolver.create(tests.conf, backend="db")
result = resolver.resolve_requires( result = resolver.resolve_requires(
[":".join([build.name, build.stream, build.version, build.context])] [":".join([build.name, build.stream, build.version, build.context])]
@@ -188,11 +186,11 @@ class TestDBModule:
} }
} }
def test_resolve_profiles(self): def test_resolve_profiles(self, db_session):
""" """
Tests that the profiles get resolved recursively Tests that the profiles get resolved recursively
""" """
mmd = models.ModuleBuild.query.get(2).mmd() mmd = models.ModuleBuild.get_by_id(db_session, 2).mmd()
resolver = mbs_resolver.GenericResolver.create(tests.conf, backend="db") resolver = mbs_resolver.GenericResolver.create(tests.conf, backend="db")
result = resolver.resolve_profiles(mmd, ("buildroot", "srpm-buildroot")) result = resolver.resolve_profiles(mmd, ("buildroot", "srpm-buildroot"))
expected = { expected = {
@@ -242,17 +240,16 @@ class TestDBModule:
new_callable=PropertyMock, new_callable=PropertyMock,
return_value=tests.staged_data_filename("local_builds") return_value=tests.staged_data_filename("local_builds")
) )
def test_resolve_profiles_local_module(self, local_builds, conf_system): def test_resolve_profiles_local_module(self, local_builds, conf_system, db_session):
""" """
Test that profiles get resolved recursively on local builds Test that profiles get resolved recursively on local builds
""" """
with app.app_context(): utils.load_local_builds(["platform"])
utils.load_local_builds(["platform"]) mmd = models.ModuleBuild.get_by_id(db_session, 2).mmd()
mmd = models.ModuleBuild.query.get(2).mmd() resolver = mbs_resolver.GenericResolver.create(tests.conf, backend="mbs")
resolver = mbs_resolver.GenericResolver.create(tests.conf, backend="mbs") result = resolver.resolve_profiles(mmd, ("buildroot", "srpm-buildroot"))
result = resolver.resolve_profiles(mmd, ("buildroot", "srpm-buildroot")) expected = {"buildroot": set(["foo"]), "srpm-buildroot": set(["bar"])}
expected = {"buildroot": set(["foo"]), "srpm-buildroot": set(["bar"])} assert result == expected
assert result == expected
def test_get_latest_with_virtual_stream(self): def test_get_latest_with_virtual_stream(self):
tests.init_data(1, multiple_stream_versions=True) tests.init_data(1, multiple_stream_versions=True)

View File

@@ -27,7 +27,7 @@ from tests import conf, clean_database, read_staged_data
from tests.test_views.test_views import FakeSCM from tests.test_views.test_views import FakeSCM
import module_build_service.messaging import module_build_service.messaging
import module_build_service.scheduler.handlers.modules import module_build_service.scheduler.handlers.modules
from module_build_service import build_logs, db from module_build_service import build_logs
from module_build_service.models import make_session, ModuleBuild, ComponentBuild from module_build_service.models import make_session, ModuleBuild, ComponentBuild
from module_build_service.utils.general import mmd_to_str, load_mmd from module_build_service.utils.general import mmd_to_str, load_mmd
@@ -59,7 +59,7 @@ class TestModuleInit:
@patch("module_build_service.scm.SCM") @patch("module_build_service.scm.SCM")
@patch("module_build_service.scheduler.handlers.modules.handle_stream_collision_modules") @patch("module_build_service.scheduler.handlers.modules.handle_stream_collision_modules")
@patch("module_build_service.utils.submit.get_build_arches", return_value=["x86_64"]) @patch("module_build_service.utils.submit.get_build_arches", return_value=["x86_64"])
def test_init_basic(self, get_build_arches, rscm, mocked_scm, built_rpms): def init_basic(self, db_session, get_build_arches, rscm, mocked_scm, built_rpms):
FakeSCM( FakeSCM(
mocked_scm, mocked_scm,
"testmodule", "testmodule",
@@ -76,22 +76,23 @@ class TestModuleInit:
"x-debuginfo-0:2.5.48-3.el8+1308+551bfa71", "x-debuginfo-0:2.5.48-3.el8+1308+551bfa71",
] ]
platform_build = ModuleBuild.query.get(1) platform_build = ModuleBuild.get_by_id(db_session, 1)
mmd = platform_build.mmd() mmd = platform_build.mmd()
for rpm in mmd.get_rpm_filters(): for rpm in mmd.get_rpm_filters():
mmd.remove_rpm_filter(rpm) mmd.remove_rpm_filter(rpm)
mmd.add_rpm_filter("foo") mmd.add_rpm_filter("foo")
mmd.add_rpm_filter("bar") mmd.add_rpm_filter("bar")
platform_build.modulemd = mmd_to_str(mmd) platform_build.modulemd = mmd_to_str(mmd)
db.session.commit() db_session.commit()
msg = module_build_service.messaging.MBSModule( msg = module_build_service.messaging.MBSModule(
msg_id=None, module_build_id=2, module_build_state="init" msg_id=None, module_build_id=2, module_build_state="init"
) )
with make_session(conf) as session: self.fn(config=conf, session=db_session, msg=msg)
self.fn(config=conf, session=session, msg=msg)
build = ModuleBuild.query.filter_by(id=2).one() build = ModuleBuild.get_by_id(db_session, 2)
# Make sure the module entered the wait state # Make sure the module entered the wait state
assert build.state == 1, build.state assert build.state == 1, build.state
# Make sure format_mmd was run properly # Make sure format_mmd was run properly
@@ -102,15 +103,15 @@ class TestModuleInit:
] ]
return build return build
def test_init_called_twice(self): def test_init_called_twice(self, db_session):
build = self.test_init_basic() build = self.init_basic(db_session)
old_component_builds = len(build.component_builds) old_component_builds = len(build.component_builds)
old_mmd = load_mmd(build.modulemd) old_mmd = load_mmd(build.modulemd)
build.state = 4 build.state = 4
db.session.commit() db_session.commit()
build = self.test_init_basic() build = self.init_basic(db_session)
db.session.refresh(build) db_session.refresh(build)
assert build.state == 1 assert build.state == 1
assert old_component_builds == len(build.component_builds) assert old_component_builds == len(build.component_builds)

View File

@@ -442,28 +442,29 @@ class TestPoller:
# Ensure we did *not* process any of the non-waiting builds. # Ensure we did *not* process any of the non-waiting builds.
assert consumer.incoming.qsize() == 0 assert consumer.incoming.qsize() == 0
def test_cleanup_stale_failed_builds(self, create_builder, global_consumer, dbg): def test_cleanup_stale_failed_builds(self, create_builder, global_consumer, dbg, db_session):
""" Test that one of the two module builds gets to the garbage state when running """ Test that one of the two module builds gets to the garbage state when running
cleanup_stale_failed_builds. cleanup_stale_failed_builds.
""" """
builder = mock.MagicMock() builder = mock.MagicMock()
create_builder.return_value = builder create_builder.return_value = builder
module_build_one = models.ModuleBuild.query.get(2)
module_build_two = models.ModuleBuild.query.get(3) module_build_one = models.ModuleBuild.get_by_id(db_session, 2)
module_build_one.state = models.BUILD_STATES["failed"] module_build_one.state = models.BUILD_STATES["failed"]
module_build_one.time_modified = datetime.utcnow() - timedelta( module_build_one.time_modified = datetime.utcnow() - timedelta(
days=conf.cleanup_failed_builds_time + 1) days=conf.cleanup_failed_builds_time + 1)
module_build_two = models.ModuleBuild.get_by_id(db_session, 3)
module_build_two.time_modified = datetime.utcnow() module_build_two.time_modified = datetime.utcnow()
module_build_two.state = models.BUILD_STATES["failed"] module_build_two.state = models.BUILD_STATES["failed"]
failed_component = models.ComponentBuild.query.filter_by(
failed_component = db_session.query(models.ComponentBuild).filter_by(
package="tangerine", module_id=3).one() package="tangerine", module_id=3).one()
failed_component.state = koji.BUILD_STATES["FAILED"] failed_component.state = koji.BUILD_STATES["FAILED"]
failed_component.tagged = False failed_component.tagged = False
failed_component.tagged_in_final = False failed_component.tagged_in_final = False
db.session.add(failed_component)
db.session.add(module_build_one) db_session.commit()
db.session.add(module_build_two)
db.session.commit()
consumer = mock.MagicMock() consumer = mock.MagicMock()
consumer.incoming = queue.Queue() consumer.incoming = queue.Queue()
@@ -473,8 +474,8 @@ class TestPoller:
# Ensure the queue is empty before we start # Ensure the queue is empty before we start
assert consumer.incoming.qsize() == 0 assert consumer.incoming.qsize() == 0
poller.cleanup_stale_failed_builds(conf, db.session) poller.cleanup_stale_failed_builds(conf, db_session)
db.session.refresh(module_build_two) db_session.refresh(module_build_two)
# Make sure module_build_one was transitioned to garbage # Make sure module_build_one was transitioned to garbage
assert module_build_one.state == models.BUILD_STATES["garbage"] assert module_build_one.state == models.BUILD_STATES["garbage"]
state_reason = ( state_reason = (
@@ -496,25 +497,27 @@ class TestPoller:
"module-build-macros-0.1-1.module+0+d027b723", "module-build-macros-0.1-1.module+0+d027b723",
]) ])
def test_cleanup_stale_failed_builds_no_components(self, create_builder, global_consumer, dbg): def test_cleanup_stale_failed_builds_no_components(
self, create_builder, global_consumer, dbg, db_session
):
""" Test that a module build without any components built gets to the garbage state when """ Test that a module build without any components built gets to the garbage state when
running cleanup_stale_failed_builds. running cleanup_stale_failed_builds.
""" """
module_build_one = models.ModuleBuild.query.get(1) module_build_one = models.ModuleBuild.get_by_id(db_session, 1)
module_build_two = models.ModuleBuild.query.get(2)
module_build_one.state = models.BUILD_STATES["failed"] module_build_one.state = models.BUILD_STATES["failed"]
module_build_one.time_modified = datetime.utcnow() module_build_one.time_modified = datetime.utcnow()
module_build_two = models.ModuleBuild.get_by_id(db_session, 2)
module_build_two.state = models.BUILD_STATES["failed"] module_build_two.state = models.BUILD_STATES["failed"]
module_build_two.time_modified = datetime.utcnow() - timedelta( module_build_two.time_modified = datetime.utcnow() - timedelta(
days=conf.cleanup_failed_builds_time + 1) days=conf.cleanup_failed_builds_time + 1)
module_build_two.koji_tag = None module_build_two.koji_tag = None
module_build_two.cg_build_koji_tag = None module_build_two.cg_build_koji_tag = None
for c in module_build_two.component_builds: for c in module_build_two.component_builds:
c.state = None c.state = None
db.session.add(c)
db.session.add(module_build_one) db_session.commit()
db.session.add(module_build_two)
db.session.commit()
consumer = mock.MagicMock() consumer = mock.MagicMock()
consumer.incoming = queue.Queue() consumer.incoming = queue.Queue()
@@ -524,8 +527,8 @@ class TestPoller:
# Ensure the queue is empty before we start # Ensure the queue is empty before we start
assert consumer.incoming.qsize() == 0 assert consumer.incoming.qsize() == 0
poller.cleanup_stale_failed_builds(conf, db.session) poller.cleanup_stale_failed_builds(conf, db_session)
db.session.refresh(module_build_two) db_session.refresh(module_build_two)
# Make sure module_build_two was transitioned to garbage # Make sure module_build_two was transitioned to garbage
assert module_build_two.state == models.BUILD_STATES["garbage"] assert module_build_two.state == models.BUILD_STATES["garbage"]
state_reason = ( state_reason = (
@@ -541,24 +544,26 @@ class TestPoller:
@pytest.mark.parametrize( @pytest.mark.parametrize(
"test_state", [models.BUILD_STATES[state] for state in conf.cleanup_stuck_builds_states] "test_state", [models.BUILD_STATES[state] for state in conf.cleanup_stuck_builds_states]
) )
def test_cancel_stuck_module_builds(self, create_builder, global_consumer, dbg, test_state): def test_cancel_stuck_module_builds(
self, create_builder, global_consumer, dbg, test_state, db_session
):
module_build1 = models.ModuleBuild.query.get(1) module_build1 = models.ModuleBuild.get_by_id(db_session, 1)
module_build1.state = test_state module_build1.state = test_state
under_thresh = conf.cleanup_stuck_builds_time - 1 under_thresh = conf.cleanup_stuck_builds_time - 1
module_build1.time_modified = datetime.utcnow() - timedelta( module_build1.time_modified = datetime.utcnow() - timedelta(
days=under_thresh, hours=23, minutes=59) days=under_thresh, hours=23, minutes=59)
module_build2 = models.ModuleBuild.query.get(2) module_build2 = models.ModuleBuild.get_by_id(db_session, 2)
module_build2.state = test_state module_build2.state = test_state
module_build2.time_modified = datetime.utcnow() - timedelta( module_build2.time_modified = datetime.utcnow() - timedelta(
days=conf.cleanup_stuck_builds_time) days=conf.cleanup_stuck_builds_time)
module_build2 = models.ModuleBuild.query.get(3) module_build2 = models.ModuleBuild.get_by_id(db_session, 3)
module_build2.state = test_state module_build2.state = test_state
module_build2.time_modified = datetime.utcnow() module_build2.time_modified = datetime.utcnow()
db.session.commit() db_session.commit()
consumer = mock.MagicMock() consumer = mock.MagicMock()
consumer.incoming = queue.Queue() consumer.incoming = queue.Queue()
@@ -568,9 +573,9 @@ class TestPoller:
assert consumer.incoming.qsize() == 0 assert consumer.incoming.qsize() == 0
poller.cancel_stuck_module_builds(conf, db.session) poller.cancel_stuck_module_builds(conf, db_session)
module = models.ModuleBuild.query.filter_by(state=4).all() module = db_session.query(models.ModuleBuild).filter_by(state=4).all()
assert len(module) == 1 assert len(module) == 1
assert module[0].id == 2 assert module[0].id == 2
@@ -634,18 +639,20 @@ class TestPoller:
@pytest.mark.parametrize("greenwave_result", [True, False]) @pytest.mark.parametrize("greenwave_result", [True, False])
@patch("module_build_service.utils.greenwave.Greenwave.check_gating") @patch("module_build_service.utils.greenwave.Greenwave.check_gating")
def test_poll_greenwave(self, mock_gw, create_builder, global_consumer, dbg, greenwave_result): def test_poll_greenwave(
self, mock_gw, create_builder, global_consumer, dbg, greenwave_result, db_session
):
module_build1 = models.ModuleBuild.query.get(1) module_build1 = models.ModuleBuild.get_by_id(db_session, 1)
module_build1.state = models.BUILD_STATES["ready"] module_build1.state = models.BUILD_STATES["ready"]
module_build2 = models.ModuleBuild.query.get(2) module_build2 = models.ModuleBuild.get_by_id(db_session, 2)
module_build2.state = models.BUILD_STATES["done"] module_build2.state = models.BUILD_STATES["done"]
module_build2 = models.ModuleBuild.query.get(3) module_build2 = models.ModuleBuild.get_by_id(db_session, 3)
module_build2.state = models.BUILD_STATES["init"] module_build2.state = models.BUILD_STATES["init"]
db.session.commit() db_session.commit()
consumer = mock.MagicMock() consumer = mock.MagicMock()
consumer.incoming = queue.Queue() consumer.incoming = queue.Queue()

View File

@@ -122,15 +122,15 @@ class TestRepoDone:
# Ensure the time_completed is None, so we can test it is set to # Ensure the time_completed is None, so we can test it is set to
# some date once the build is finalized. # some date once the build is finalized.
module_build = module_build_service.models.ModuleBuild.query.get(2) module_build = module_build_service.models.ModuleBuild.get_by_id(db_session, 2)
module_build.time_completed = None module_build.time_completed = None
db.session.commit() db_session.commit()
def mocked_finalizer(succeeded=None): def mocked_finalizer(succeeded=None):
# Check that the time_completed is set in the time when # Check that the time_completed is set in the time when
# finalizer is called. # finalizer is called.
assert succeeded is True assert succeeded is True
module_build = db_session.query(module_build_service.models.ModuleBuild).get(2) module_build = module_build_service.models.ModuleBuild.get_by_id(db_session, 2)
assert module_build.time_completed is not None assert module_build.time_completed is not None
finalizer.side_effect = mocked_finalizer finalizer.side_effect = mocked_finalizer
@@ -207,7 +207,7 @@ class TestRepoDone:
mock_log_info.assert_called_with( mock_log_info.assert_called_with(
"Ignoring repo regen, because not all components are tagged." "Ignoring repo regen, because not all components are tagged."
) )
module_build = module_build_service.models.ModuleBuild.query.get(2) module_build = module_build_service.models.ModuleBuild.get_by_id(db_session, 2)
# Make sure the module build didn't transition since all the components weren't tagged # Make sure the module build didn't transition since all the components weren't tagged
assert module_build.state == module_build_service.models.BUILD_STATES["build"] assert module_build.state == module_build_service.models.BUILD_STATES["build"]
@@ -242,6 +242,6 @@ class TestRepoDone:
msg = module_build_service.messaging.KojiRepoChange( msg = module_build_service.messaging.KojiRepoChange(
"some_msg_id", "module-testmodule-master-20170109091357-7c29193d-build") "some_msg_id", "module-testmodule-master-20170109091357-7c29193d-build")
module_build_service.scheduler.handlers.repos.done(config=conf, session=db_session, msg=msg) module_build_service.scheduler.handlers.repos.done(config=conf, session=db_session, msg=msg)
module_build = module_build_service.models.ModuleBuild.query.get(2) module_build = module_build_service.models.ModuleBuild.get_by_id(db_session, 2)
assert module_build.state == module_build_service.models.BUILD_STATES["failed"] assert module_build.state == module_build_service.models.BUILD_STATES["failed"]

View File

@@ -436,18 +436,20 @@ class TestUtils:
else: else:
module_build_service.utils.import_mmd(db.session, mmd) module_build_service.utils.import_mmd(db.session, mmd)
def test_get_rpm_release_mse(self): def test_get_rpm_release_mse(self, db_session):
init_data(contexts=True) init_data(contexts=True)
build_one = models.ModuleBuild.query.get(2)
build_two = models.ModuleBuild.query.get(3) build_one = models.ModuleBuild.get_by_id(db_session, 2)
release_one = module_build_service.utils.get_rpm_release(build_one) release_one = module_build_service.utils.get_rpm_release(build_one)
release_two = module_build_service.utils.get_rpm_release(build_two)
assert release_one == "module+2+b8645bbb" assert release_one == "module+2+b8645bbb"
build_two = models.ModuleBuild.get_by_id(db_session, 3)
release_two = module_build_service.utils.get_rpm_release(build_two)
assert release_two == "module+2+17e35784" assert release_two == "module+2+17e35784"
def test_get_rpm_release_platform_stream(self, db_session): def test_get_rpm_release_platform_stream(self, db_session):
scheduler_init_data(db_session, 1) scheduler_init_data(db_session, 1)
build_one = db_session.query(models.ModuleBuild).get(2) build_one = models.ModuleBuild.get_by_id(db_session, 2)
release = module_build_service.utils.get_rpm_release(build_one) release = module_build_service.utils.get_rpm_release(build_one)
assert release == "module+f28+2+814cfa39" assert release == "module+f28+2+814cfa39"
@@ -468,7 +470,7 @@ class TestUtils:
db_session.add(platform) db_session.add(platform)
db_session.commit() db_session.commit()
build_one = db_session.query(models.ModuleBuild).get(2) build_one = models.ModuleBuild.get_by_id(db_session, 2)
release = module_build_service.utils.get_rpm_release(build_one) release = module_build_service.utils.get_rpm_release(build_one)
assert release == "module+fedora28+2+814cfa39" assert release == "module+fedora28+2+814cfa39"
@@ -486,7 +488,7 @@ class TestUtils:
metadata_mmd = load_mmd(read_staged_data("build_metadata_module")) metadata_mmd = load_mmd(read_staged_data("build_metadata_module"))
module_build_service.utils.import_mmd(db_session, metadata_mmd) module_build_service.utils.import_mmd(db_session, metadata_mmd)
build_one = db_session.query(models.ModuleBuild).get(2) build_one = models.ModuleBuild.get_by_id(db_session, 2)
mmd = build_one.mmd() mmd = build_one.mmd()
deps = mmd.get_dependencies()[0] deps = mmd.get_dependencies()[0]
deps.add_buildtime_stream("build", "product1.2") deps.add_buildtime_stream("build", "product1.2")
@@ -506,18 +508,20 @@ class TestUtils:
release = module_build_service.utils.get_rpm_release(build_one) release = module_build_service.utils.get_rpm_release(build_one)
assert release == "module+product12+2+814cfa39" assert release == "module+product12+2+814cfa39"
def test_get_rpm_release_mse_scratch(self): def test_get_rpm_release_mse_scratch(self, db_session):
init_data(contexts=True, scratch=True) init_data(contexts=True, scratch=True)
build_one = models.ModuleBuild.query.get(2)
build_two = models.ModuleBuild.query.get(3) build_one = models.ModuleBuild.get_by_id(db_session, 2)
release_one = module_build_service.utils.get_rpm_release(build_one) release_one = module_build_service.utils.get_rpm_release(build_one)
release_two = module_build_service.utils.get_rpm_release(build_two)
assert release_one == "scrmod+2+b8645bbb" assert release_one == "scrmod+2+b8645bbb"
build_two = models.ModuleBuild.get_by_id(db_session, 3)
release_two = module_build_service.utils.get_rpm_release(build_two)
assert release_two == "scrmod+2+17e35784" assert release_two == "scrmod+2+17e35784"
def test_get_rpm_release_platform_stream_scratch(self, db_session): def test_get_rpm_release_platform_stream_scratch(self, db_session):
scheduler_init_data(db_session, 1, scratch=True) scheduler_init_data(db_session, 1, scratch=True)
build_one = db_session.query(models.ModuleBuild).get(2) build_one = models.ModuleBuild.get_by_id(db_session, 2)
release = module_build_service.utils.get_rpm_release(build_one) release = module_build_service.utils.get_rpm_release(build_one)
assert release == "scrmod+f28+2+814cfa39" assert release == "scrmod+f28+2+814cfa39"
@@ -525,7 +529,7 @@ class TestUtils:
def test_record_module_build_arches(self, get_build_arches, db_session): def test_record_module_build_arches(self, get_build_arches, db_session):
get_build_arches.return_value = ["x86_64", "i686"] get_build_arches.return_value = ["x86_64", "i686"]
scheduler_init_data(db_session, 1) scheduler_init_data(db_session, 1)
build = db_session.query(models.ModuleBuild).get(2) build = models.ModuleBuild.get_by_id(db_session, 2)
build.arches = [] build.arches = []
module_build_service.utils.record_module_build_arches(build.mmd(), build, db_session) module_build_service.utils.record_module_build_arches(build.mmd(), build, db_session)
@@ -592,7 +596,7 @@ class TestUtils:
mmd_xmd = mmd.get_xmd() mmd_xmd = mmd.get_xmd()
assert mmd_xmd == xmd assert mmd_xmd == xmd
def test_get_reusable_component_shared_userspace_ordering(self): def test_get_reusable_component_shared_userspace_ordering(self, db_session):
""" """
For modules with lot of components per batch, there is big chance that For modules with lot of components per batch, there is big chance that
the database will return them in different order than what we have for the database will return them in different order than what we have for
@@ -600,7 +604,7 @@ class TestUtils:
reuse the components. reuse the components.
""" """
reuse_shared_userspace_init_data() reuse_shared_userspace_init_data()
new_module = models.ModuleBuild.query.get(3) new_module = models.ModuleBuild.get_by_id(db_session, 3)
rv = module_build_service.utils.get_reusable_component(db.session, new_module, "llvm") rv = module_build_service.utils.get_reusable_component(db.session, new_module, "llvm")
assert rv.package == "llvm" assert rv.package == "llvm"
@@ -830,24 +834,23 @@ class TestUtils:
@patch("module_build_service.scm.SCM") @patch("module_build_service.scm.SCM")
@patch("module_build_service.utils.submit.ThreadPool") @patch("module_build_service.utils.submit.ThreadPool")
def test_format_mmd_update_time_modified(self, tp, mocked_scm): def test_format_mmd_update_time_modified(self, tp, mocked_scm, db_session):
with app.app_context(): init_data()
init_data() build = models.ModuleBuild.get_by_id(db_session, 2)
build = models.ModuleBuild.query.get(2)
async_result = mock.MagicMock() async_result = mock.MagicMock()
async_result.ready.side_effect = [False, False, False, True] async_result.ready.side_effect = [False, False, False, True]
tp.return_value.map_async.return_value = async_result tp.return_value.map_async.return_value = async_result
test_datetime = datetime(2019, 2, 14, 11, 11, 45, 42968) test_datetime = datetime(2019, 2, 14, 11, 11, 45, 42968)
mmd = load_mmd(read_staged_data("testmodule")) mmd = load_mmd(read_staged_data("testmodule"))
with patch("module_build_service.utils.submit.datetime") as dt: with patch("module_build_service.utils.submit.datetime") as dt:
dt.utcnow.return_value = test_datetime dt.utcnow.return_value = test_datetime
module_build_service.utils.format_mmd(mmd, None, build, db.session) module_build_service.utils.format_mmd(mmd, None, build, db_session)
assert build.time_modified == test_datetime assert build.time_modified == test_datetime
def test_generate_koji_tag_in_nsvc_format(self): def test_generate_koji_tag_in_nsvc_format(self):
name, stream, version, context = ("testmodule", "master", "20170816080815", "37c6c57") name, stream, version, context = ("testmodule", "master", "20170816080815", "37c6c57")
@@ -893,13 +896,13 @@ class TestUtils:
def test_get_prefixed_version_f28(self, db_session): def test_get_prefixed_version_f28(self, db_session):
scheduler_init_data(db_session, 1) scheduler_init_data(db_session, 1)
build_one = db_session.query(models.ModuleBuild).get(2) build_one = models.ModuleBuild.get_by_id(db_session, 2)
v = module_build_service.utils.submit.get_prefixed_version(build_one.mmd()) v = module_build_service.utils.submit.get_prefixed_version(build_one.mmd())
assert v == 2820180205135154 assert v == 2820180205135154
def test_get_prefixed_version_fl701(self, db_session): def test_get_prefixed_version_fl701(self, db_session):
scheduler_init_data(db_session, 1) scheduler_init_data(db_session, 1)
build_one = db_session.query(models.ModuleBuild).get(2) build_one = models.ModuleBuild.get_by_id(db_session, 2)
mmd = build_one.mmd() mmd = build_one.mmd()
xmd = mmd.get_xmd() xmd = mmd.get_xmd()
xmd["mbs"]["buildrequires"]["platform"]["stream"] = "fl7.0.1-beta" xmd["mbs"]["buildrequires"]["platform"]["stream"] = "fl7.0.1-beta"

View File

@@ -758,7 +758,7 @@ class TestViews:
def test_query_builds_order_by_multiple(self): def test_query_builds_order_by_multiple(self):
init_data(data_size=1, multiple_stream_versions=True) init_data(data_size=1, multiple_stream_versions=True)
platform_f28 = db.session.query(module_build_service.models.ModuleBuild).get(1) platform_f28 = module_build_service.models.ModuleBuild.get_by_id(db.session, 1)
platform_f28.version = "150" platform_f28.version = "150"
db.session.add(platform_f28) db.session.add(platform_f28)
db.session.commit() db.session.commit()
@@ -945,7 +945,7 @@ class TestViews:
module_build_service.utils.load_mmd(data["modulemd"]) module_build_service.utils.load_mmd(data["modulemd"])
# Make sure the buildrequires entry was created # Make sure the buildrequires entry was created
module = ModuleBuild.query.get(8) module = ModuleBuild.get_by_id(db.session, 8)
assert len(module.buildrequires) == 1 assert len(module.buildrequires) == 1
assert module.buildrequires[0].name == "platform" assert module.buildrequires[0].name == "platform"
assert module.buildrequires[0].stream == "f28" assert module.buildrequires[0].stream == "f28"
@@ -2082,7 +2082,7 @@ class TestViews:
module_build_service.utils.load_mmd(data["modulemd"]) module_build_service.utils.load_mmd(data["modulemd"])
# Make sure the buildrequires entry was created # Make sure the buildrequires entry was created
module = ModuleBuild.query.get(8) module = ModuleBuild.get_by_id(db.session, 8)
assert len(module.buildrequires) == 1 assert len(module.buildrequires) == 1
assert module.buildrequires[0].name == "platform" assert module.buildrequires[0].name == "platform"
assert module.buildrequires[0].stream == "f28" assert module.buildrequires[0].stream == "f28"
@@ -2178,7 +2178,7 @@ class TestViews:
module_build_service.utils.load_mmd(data["modulemd"]) module_build_service.utils.load_mmd(data["modulemd"])
# Make sure the buildrequires entry was created # Make sure the buildrequires entry was created
module = ModuleBuild.query.get(8) module = ModuleBuild.get_by_id(db.session, 8)
assert len(module.buildrequires) == 1 assert len(module.buildrequires) == 1
assert module.buildrequires[0].name == "platform" assert module.buildrequires[0].name == "platform"
assert module.buildrequires[0].stream == "f28" assert module.buildrequires[0].stream == "f28"