diff --git a/module_build_service/scheduler/producer.py b/module_build_service/scheduler/producer.py index b97d6379..ccccb623 100644 --- a/module_build_service/scheduler/producer.py +++ b/module_build_service/scheduler/producer.py @@ -191,8 +191,11 @@ class MBSProducer(PollingProducer): for module_build in session.query(models.ModuleBuild).filter_by( state=models.BUILD_STATES['build']).all(): # If there are no components in the build state on the module build, - # then no possible event will start off new component builds - if not module_build.current_batch(koji.BUILD_STATES['BUILDING']): + # then no possible event will start off new component builds. + # But do not try to start new builds when we are waiting for the + # repo-regen. + if (not module_build.current_batch(koji.BUILD_STATES['BUILDING']) + and not module_build.new_repo_task_id): # Initialize the builder... builder = GenericBuilder.create_from_module( session, module_build, config) @@ -232,5 +235,7 @@ class MBSProducer(PollingProducer): str(module_build.new_repo_task_id), module_build) taginfo = koji_session.getTag(module_build.koji_tag + "-build") module_build.new_repo_task_id = koji_session.newRepo(taginfo["name"]) + else: + module_build.new_repo_task_id = 0 session.commit() diff --git a/tests/test_scheduler/test_poller.py b/tests/test_scheduler/test_poller.py index aeba94a0..83bf4649 100644 --- a/tests/test_scheduler/test_poller.py +++ b/tests/test_scheduler/test_poller.py @@ -155,6 +155,46 @@ class TestPoller(unittest.TestCase): poller = MBSProducer(hub) poller.poll() + # Refresh our module_build object. + db.session.expunge(module_build) + module_build = models.ModuleBuild.query.filter_by(id=2).one() + self.assertTrue(not koji_session.newRepo.called) + self.assertEqual(module_build.new_repo_task_id, 0) + def test_process_paused_module_builds_waiting_for_repo( + self, crete_builder, koji_get_session, global_consumer, dbg): + """ + Tests that process_paused_module_builds does not start new batch + when we are waiting for repo. + """ + consumer = mock.MagicMock() + consumer.incoming = queue.Queue() + global_consumer.return_value = consumer + koji_session = mock.MagicMock() + koji_get_session.return_value = koji_session + + builder = mock.MagicMock() + crete_builder.return_value = builder + + # Change the batch to 2, so the module build is in state where + # it is not building anything, but the state is "build". + module_build = models.ModuleBuild.query.filter_by(id=2).one() + module_build.batch = 2 + module_build.new_repo_task_id = 123456 + db.session.commit() + + # Poll :) + hub = mock.MagicMock() + poller = MBSProducer(hub) + poller.poll() + + # Refresh our module_build object. + db.session.expunge(module_build) + module_build = models.ModuleBuild.query.filter_by(id=2).one() + + # Components should not be in building state + components = module_build.current_batch() + for component in components: + self.assertEqual(component.state, None)