From 87d3a39607eec415bd5f21ea3e5044a1d67642a5 Mon Sep 17 00:00:00 2001 From: Valerij Maljulin Date: Tue, 21 May 2019 18:18:41 +0200 Subject: [PATCH] A poller for Greenwave Signed-off-by: Valerij Maljulin --- module_build_service/scheduler/producer.py | 23 ++++++++++++++ tests/test_scheduler/test_poller.py | 37 ++++++++++++++++++++++ 2 files changed, 60 insertions(+) diff --git a/module_build_service/scheduler/producer.py b/module_build_service/scheduler/producer.py index 5876ddcb..1c7bc7ea 100644 --- a/module_build_service/scheduler/producer.py +++ b/module_build_service/scheduler/producer.py @@ -36,6 +36,7 @@ import module_build_service.scheduler.consumer from module_build_service import conf, models, log from module_build_service.builder import GenericBuilder from module_build_service.builder.KojiModuleBuilder import KojiModuleBuilder +from module_build_service.utils.greenwave import greenwave class MBSProducer(PollingProducer): @@ -53,6 +54,7 @@ class MBSProducer(PollingProducer): self.delete_old_koji_targets(conf, session) self.cleanup_stale_failed_builds(conf, session) self.sync_koji_build_tags(conf, session) + self.poll_greenwave(conf, session) except Exception: msg = "Error in poller execution:" log.exception(msg) @@ -462,3 +464,24 @@ class MBSProducer(PollingProducer): "sync_koji_build_tags_fake_message", build_tag, c.package, c.nvr) log.info(" Scheduling faked event %r" % msg) module_build_service.scheduler.consumer.work_queue_put(msg) + + def poll_greenwave(self, config, session): + """ + Polls Greenwave for all builds in done state + :param session: SQLAlchemy DB session + :return: None + """ + if greenwave is None: + return + + module_builds = ( + session.query(models.ModuleBuild) + .filter_by(state=models.BUILD_STATES["done"]).all() + ) + + log.info("Checking Greenwave for %d builds", len(module_builds)) + + for build in module_builds: + if greenwave.check_gating(build): + build.transition(config, state=models.BUILD_STATES["ready"]) + session.commit() diff --git a/tests/test_scheduler/test_poller.py b/tests/test_scheduler/test_poller.py index 38dab62a..acc9b089 100644 --- a/tests/test_scheduler/test_poller.py +++ b/tests/test_scheduler/test_poller.py @@ -624,3 +624,40 @@ class TestPoller: assert msg.artifact == c.package assert msg.nvr == c.nvr assert msg.tag in expected_msg_tags + + @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): + + module_build1 = models.ModuleBuild.query.get(1) + module_build1.state = models.BUILD_STATES["ready"] + + module_build2 = models.ModuleBuild.query.get(2) + module_build2.state = models.BUILD_STATES["done"] + + module_build2 = models.ModuleBuild.query.get(3) + module_build2.state = models.BUILD_STATES["init"] + + db.session.commit() + + consumer = mock.MagicMock() + consumer.incoming = queue.Queue() + global_consumer.return_value = consumer + hub = mock.MagicMock() + poller = MBSProducer(hub) + + assert consumer.incoming.qsize() == 0 + + mock_gw.return_value = greenwave_result + + poller.poll_greenwave(conf, db.session) + + mock_gw.assert_called_once() + module = models.ModuleBuild.query.filter_by(state=models.BUILD_STATES["ready"]).all() + + if greenwave_result: + assert len(module) == 2 + assert set([m.id for m in module]) == {1, 2} + else: + assert len(module) == 1 + assert set([m.id for m in module]) == {1}