mirror of
https://pagure.io/fm-orchestrator.git
synced 2026-04-02 10:20:31 +08:00
A poller for Greenwave
Signed-off-by: Valerij Maljulin <vmaljuli@redhat.com>
This commit is contained in:
@@ -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()
|
||||
|
||||
@@ -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}
|
||||
|
||||
Reference in New Issue
Block a user