diff --git a/module_build_service/scheduler/handlers/modules.py b/module_build_service/scheduler/handlers/modules.py index 8149cf66..849bc076 100644 --- a/module_build_service/scheduler/handlers/modules.py +++ b/module_build_service/scheduler/handlers/modules.py @@ -245,40 +245,46 @@ def wait(config, session, msg): session.add(build) session.commit() return [] - else: - # Build the module-build-macros - # inject dist-tag into buildroot - srpm = builder.get_disttag_srpm( - disttag=".%s" % get_rpm_release_from_mmd(build.mmd()), - module_build=build) - log.debug("Starting build batch 1") - build.batch = 1 - session.commit() + # Build the module-build-macros + # inject dist-tag into buildroot + srpm = builder.get_disttag_srpm( + disttag=".%s" % get_rpm_release_from_mmd(build.mmd()), + module_build=build) - artifact_name = "module-build-macros" - task_id, state, reason, nvr = builder.build(artifact_name=artifact_name, source=srpm) + log.debug("Starting build batch 1") + build.batch = 1 + session.commit() - component_build = models.ComponentBuild( - module_id=build.id, - package=artifact_name, - format="rpms", - scmurl=srpm, - task_id=task_id, - state=state, - state_reason=reason, - nvr=nvr, - batch=1, - ) - session.add(component_build) - build.transition(config, state="build") - session.add(build) - session.commit() + artifact_name = "module-build-macros" + task_id, state, reason, nvr = builder.build(artifact_name=artifact_name, source=srpm) - # If this build already exists and is done, then fake the repo change event - # back to the scheduler + component_build = models.ComponentBuild( + module_id=build.id, + package=artifact_name, + format="rpms", + scmurl=srpm, + task_id=task_id, + state=state, + state_reason=reason, + nvr=nvr, + batch=1, + ) + session.add(component_build) + build.transition(config, state="build") + session.add(build) + session.commit() + + # If this build already exists and is done, then regenerate the repository + # to ensure module-build-macros is there. if state == koji.BUILD_STATES['COMPLETE']: - # TODO: builder.module_build_tag only works for Koji, figure out if - # other backends need this implemented (e.g. COPR) - return [module_build_service.messaging.KojiRepoChange( - 'fake msg', builder.module_build_tag['name'])] + if config.system == "koji": + log.info("module-build-macros is already built. " + "Regenerating the repo.") + task_id = builder.koji_session.newRepo( + builder.module_build_tag['name']) + build.new_repo_task_id = task_id + session.commit() + else: + return [module_build_service.messaging.KojiRepoChange( + 'fake msg', builder.module_build_tag['name'])] diff --git a/tests/test_scheduler/test_module_wait.py b/tests/test_scheduler/test_module_wait.py index 97c37790..c935e8a4 100644 --- a/tests/test_scheduler/test_module_wait.py +++ b/tests/test_scheduler/test_module_wait.py @@ -22,11 +22,14 @@ import unittest import mock +from mock import patch import module_build_service.messaging import module_build_service.scheduler.handlers.modules import modulemd as _modulemd import os import vcr +import koji +from tests import conf, db, app, scheduler_init_data from module_build_service import conf base_dir = os.path.dirname(os.path.dirname(__file__)) @@ -78,3 +81,63 @@ class TestModuleWait(unittest.TestCase): msg = module_build_service.messaging.MBSModule(msg_id=None, module_build_id=1, module_build_state='some state') self.fn(config=self.config, session=self.session, msg=msg) + + @patch("module_build_service.builder.GenericBuilder.default_buildroot_groups", + return_value={'build': [], 'srpm-build': []}) + @patch("module_build_service.builder.KojiModuleBuilder.get_session") + @patch("module_build_service.builder.GenericBuilder.create_from_module") + @patch('module_build_service.pdc') + def test_new_repo_called_when_macros_reused( + self, pdc, create_builder, koji_get_session, dbg): + """ + Test that newRepo is called when module-build-macros build is reused. + """ + with app.app_context(): + pdc.get_module_tag.return_value = "module-testmodule-master-20170109091357" + scheduler_init_data() + koji_session = mock.MagicMock() + koji_session.newRepo.return_value = 123456 + koji_get_session.return_value = koji_session + + 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 + + msg = module_build_service.messaging.MBSModule(msg_id=None, module_build_id=1, + module_build_state='some state') + module_build_service.scheduler.handlers.modules.wait( + config=conf, session=db.session, msg=msg) + koji_session.newRepo.assert_called_once_with("module-123-build") + + @patch("module_build_service.builder.GenericBuilder.default_buildroot_groups", + return_value={'build': [], 'srpm-build': []}) + @patch("module_build_service.builder.KojiModuleBuilder.get_session") + @patch("module_build_service.builder.GenericBuilder.create_from_module") + @patch('module_build_service.pdc') + def test_new_repo_not_called_when_macros_not_reused( + self, pdc, create_builder, koji_get_session, dbg): + """ + Test that newRepo is not called when module-build-macros build is not reused. + """ + with app.app_context(): + pdc.get_module_tag.return_value = "module-testmodule-master-20170109091357" + scheduler_init_data() + koji_session = mock.MagicMock() + koji_session.newRepo.return_value = 123456 + koji_get_session.return_value = koji_session + + 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 + + msg = module_build_service.messaging.MBSModule(msg_id=None, module_build_id=1, + module_build_state='some state') + module_build_service.scheduler.handlers.modules.wait( + config=conf, session=db.session, msg=msg) + self.assertTrue(not koji_session.newRepo.called)