mirror of
https://pagure.io/fm-orchestrator.git
synced 2026-04-01 01:40:32 +08:00
Reuse ModuleBuild.get_by_id
Signed-off-by: Chenxiong Qi <cqi@redhat.com>
This commit is contained in:
@@ -27,7 +27,7 @@ from tests import conf, clean_database, read_staged_data
|
||||
from tests.test_views.test_views import FakeSCM
|
||||
import module_build_service.messaging
|
||||
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.utils.general import mmd_to_str, load_mmd
|
||||
|
||||
@@ -59,7 +59,7 @@ class TestModuleInit:
|
||||
@patch("module_build_service.scm.SCM")
|
||||
@patch("module_build_service.scheduler.handlers.modules.handle_stream_collision_modules")
|
||||
@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(
|
||||
mocked_scm,
|
||||
"testmodule",
|
||||
@@ -76,22 +76,23 @@ class TestModuleInit:
|
||||
"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()
|
||||
for rpm in mmd.get_rpm_filters():
|
||||
mmd.remove_rpm_filter(rpm)
|
||||
mmd.add_rpm_filter("foo")
|
||||
mmd.add_rpm_filter("bar")
|
||||
|
||||
platform_build.modulemd = mmd_to_str(mmd)
|
||||
db.session.commit()
|
||||
db_session.commit()
|
||||
|
||||
msg = module_build_service.messaging.MBSModule(
|
||||
msg_id=None, module_build_id=2, module_build_state="init"
|
||||
)
|
||||
|
||||
with make_session(conf) as session:
|
||||
self.fn(config=conf, session=session, msg=msg)
|
||||
build = ModuleBuild.query.filter_by(id=2).one()
|
||||
self.fn(config=conf, session=db_session, msg=msg)
|
||||
|
||||
build = ModuleBuild.get_by_id(db_session, 2)
|
||||
# Make sure the module entered the wait state
|
||||
assert build.state == 1, build.state
|
||||
# Make sure format_mmd was run properly
|
||||
@@ -102,15 +103,15 @@ class TestModuleInit:
|
||||
]
|
||||
return build
|
||||
|
||||
def test_init_called_twice(self):
|
||||
build = self.test_init_basic()
|
||||
def test_init_called_twice(self, db_session):
|
||||
build = self.init_basic(db_session)
|
||||
old_component_builds = len(build.component_builds)
|
||||
old_mmd = load_mmd(build.modulemd)
|
||||
|
||||
build.state = 4
|
||||
db.session.commit()
|
||||
build = self.test_init_basic()
|
||||
db.session.refresh(build)
|
||||
db_session.commit()
|
||||
build = self.init_basic(db_session)
|
||||
db_session.refresh(build)
|
||||
|
||||
assert build.state == 1
|
||||
assert old_component_builds == len(build.component_builds)
|
||||
|
||||
@@ -442,28 +442,29 @@ class TestPoller:
|
||||
# Ensure we did *not* process any of the non-waiting builds.
|
||||
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
|
||||
cleanup_stale_failed_builds.
|
||||
"""
|
||||
builder = mock.MagicMock()
|
||||
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.time_modified = datetime.utcnow() - timedelta(
|
||||
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.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()
|
||||
failed_component.state = koji.BUILD_STATES["FAILED"]
|
||||
failed_component.tagged = False
|
||||
failed_component.tagged_in_final = False
|
||||
db.session.add(failed_component)
|
||||
db.session.add(module_build_one)
|
||||
db.session.add(module_build_two)
|
||||
db.session.commit()
|
||||
|
||||
db_session.commit()
|
||||
|
||||
consumer = mock.MagicMock()
|
||||
consumer.incoming = queue.Queue()
|
||||
@@ -473,8 +474,8 @@ class TestPoller:
|
||||
|
||||
# Ensure the queue is empty before we start
|
||||
assert consumer.incoming.qsize() == 0
|
||||
poller.cleanup_stale_failed_builds(conf, db.session)
|
||||
db.session.refresh(module_build_two)
|
||||
poller.cleanup_stale_failed_builds(conf, db_session)
|
||||
db_session.refresh(module_build_two)
|
||||
# Make sure module_build_one was transitioned to garbage
|
||||
assert module_build_one.state == models.BUILD_STATES["garbage"]
|
||||
state_reason = (
|
||||
@@ -496,25 +497,27 @@ class TestPoller:
|
||||
"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
|
||||
running cleanup_stale_failed_builds.
|
||||
"""
|
||||
module_build_one = models.ModuleBuild.query.get(1)
|
||||
module_build_two = models.ModuleBuild.query.get(2)
|
||||
module_build_one = models.ModuleBuild.get_by_id(db_session, 1)
|
||||
module_build_one.state = models.BUILD_STATES["failed"]
|
||||
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.time_modified = datetime.utcnow() - timedelta(
|
||||
days=conf.cleanup_failed_builds_time + 1)
|
||||
module_build_two.koji_tag = None
|
||||
module_build_two.cg_build_koji_tag = None
|
||||
|
||||
for c in module_build_two.component_builds:
|
||||
c.state = None
|
||||
db.session.add(c)
|
||||
db.session.add(module_build_one)
|
||||
db.session.add(module_build_two)
|
||||
db.session.commit()
|
||||
|
||||
db_session.commit()
|
||||
|
||||
consumer = mock.MagicMock()
|
||||
consumer.incoming = queue.Queue()
|
||||
@@ -524,8 +527,8 @@ class TestPoller:
|
||||
|
||||
# Ensure the queue is empty before we start
|
||||
assert consumer.incoming.qsize() == 0
|
||||
poller.cleanup_stale_failed_builds(conf, db.session)
|
||||
db.session.refresh(module_build_two)
|
||||
poller.cleanup_stale_failed_builds(conf, db_session)
|
||||
db_session.refresh(module_build_two)
|
||||
# Make sure module_build_two was transitioned to garbage
|
||||
assert module_build_two.state == models.BUILD_STATES["garbage"]
|
||||
state_reason = (
|
||||
@@ -541,24 +544,26 @@ class TestPoller:
|
||||
@pytest.mark.parametrize(
|
||||
"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
|
||||
under_thresh = conf.cleanup_stuck_builds_time - 1
|
||||
module_build1.time_modified = datetime.utcnow() - timedelta(
|
||||
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.time_modified = datetime.utcnow() - timedelta(
|
||||
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.time_modified = datetime.utcnow()
|
||||
|
||||
db.session.commit()
|
||||
db_session.commit()
|
||||
|
||||
consumer = mock.MagicMock()
|
||||
consumer.incoming = queue.Queue()
|
||||
@@ -568,9 +573,9 @@ class TestPoller:
|
||||
|
||||
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 module[0].id == 2
|
||||
|
||||
@@ -634,18 +639,20 @@ class TestPoller:
|
||||
|
||||
@pytest.mark.parametrize("greenwave_result", [True, False])
|
||||
@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_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 = models.ModuleBuild.query.get(3)
|
||||
module_build2 = models.ModuleBuild.get_by_id(db_session, 3)
|
||||
module_build2.state = models.BUILD_STATES["init"]
|
||||
|
||||
db.session.commit()
|
||||
db_session.commit()
|
||||
|
||||
consumer = mock.MagicMock()
|
||||
consumer.incoming = queue.Queue()
|
||||
|
||||
@@ -122,15 +122,15 @@ class TestRepoDone:
|
||||
|
||||
# Ensure the time_completed is None, so we can test it is set to
|
||||
# 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
|
||||
db.session.commit()
|
||||
db_session.commit()
|
||||
|
||||
def mocked_finalizer(succeeded=None):
|
||||
# Check that the time_completed is set in the time when
|
||||
# finalizer is called.
|
||||
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
|
||||
|
||||
finalizer.side_effect = mocked_finalizer
|
||||
@@ -207,7 +207,7 @@ class TestRepoDone:
|
||||
mock_log_info.assert_called_with(
|
||||
"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
|
||||
assert module_build.state == module_build_service.models.BUILD_STATES["build"]
|
||||
|
||||
@@ -242,6 +242,6 @@ class TestRepoDone:
|
||||
msg = module_build_service.messaging.KojiRepoChange(
|
||||
"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 = 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"]
|
||||
|
||||
Reference in New Issue
Block a user