diff --git a/server/odcs/server/config.py b/server/odcs/server/config.py index 605c2c7..e15b2d9 100644 --- a/server/odcs/server/config.py +++ b/server/odcs/server/config.py @@ -254,7 +254,7 @@ class Config(object): 'messaging_backend': { 'type': str, 'default': '', - 'desc': 'Messaging backend, fedmsg or umb.'}, + 'desc': 'Messaging backend, fedmsg, rhmsg or fedora-messaging.'}, 'messaging_broker_urls': { 'type': list, 'default': [], diff --git a/server/odcs/server/messaging.py b/server/odcs/server/messaging.py index f234b1b..f56884e 100644 --- a/server/odcs/server/messaging.py +++ b/server/odcs/server/messaging.py @@ -71,11 +71,26 @@ def _fedmsg_send_msg(msgs): fedmsg.publish(topic=topic, msg=msg) +def _fedora_messaging_send_msg(msgs): + """Send message to fedora-messaging.""" + from fedora_messaging import api, config + config.conf.setup_logging() + + for msg in msgs: + # "event" is typically just "state-changed" + event = msg.get('event', 'event') + topic = "compose.%s" % event + + api.publish(api.Message(topic=topic, body=msg)) + + def _get_messaging_backend(): if conf.messaging_backend == 'rhmsg': return _umb_send_msg elif conf.messaging_backend == 'fedmsg': return _fedmsg_send_msg + elif conf.messaging_backend == 'fedora-messaging': + return _fedora_messaging_send_msg elif conf.messaging_backend: raise ValueError( 'Unknown messaging backend {0}'.format(conf.messaging_backend)) diff --git a/server/tests/test_events.py b/server/tests/test_events.py index 5847715..99e0335 100644 --- a/server/tests/test_events.py +++ b/server/tests/test_events.py @@ -44,6 +44,11 @@ try: except ImportError: fedmsg = None +try: + import fedora_messaging +except ImportError: + fedora_messaging = None + @unittest.skipUnless(rhmsg, 'rhmsg is required to run this test case.') @unittest.skipIf(six.PY3, 'rhmsg has no Python 3 package so far.') @@ -152,3 +157,60 @@ class TestFedMsgSendMessageWhenComposeIsCreated(ModelsBaseTest): compose.state = COMPOSE_STATES['generating'] self.assert_messaging(compose) + + +@unittest.skipUnless(fedora_messaging, 'fedora_messaging is required to run this test case.') +class TestFedoraMessagingSendMessageWhenComposeIsCreated(ModelsBaseTest): + """Test send message when compose is created""" + + disable_event_handlers = False + + def setUp(self): + super(TestFedoraMessagingSendMessageWhenComposeIsCreated, self).setUp() + + # Real lock is not required for running tests + self.mock_lock = patch('threading.Lock') + self.mock_lock.start() + + def tearDown(self): + self.mock_lock.stop() + + def setup_composes(self): + self.compose = Compose.create(db.session, + "mine", + PungiSourceType.KOJI_TAG, + "f25", + COMPOSE_RESULTS["repository"], + 3600) + db.session.commit() + + @patch.object(conf, 'messaging_backend', new='fedora-messaging') + @patch('fedora_messaging.api.Message') + @patch('fedora_messaging.api.publish') + def assert_messaging(self, compose, publish, Message): + # The db.session.commit() calls on-commit handler which produces the fedora-messaging + # message. + db.session.commit() + + Message.assert_called_once_with( + topic="compose.state-changed", + body={'event': 'state-changed', 'compose': compose.json()}) + + publish.assert_called_once_with(Message.return_value) + + def test_send_message(self): + compose = Compose.create(db.session, + "me", + PungiSourceType.MODULE, + "testmodule-master", + COMPOSE_RESULTS["repository"], + 3600) + + self.assert_messaging(compose) + + def test_message_on_state_change(self): + compose = db.session.query(Compose).filter( + Compose.id == self.compose.id).all()[0] + compose.state = COMPOSE_STATES['generating'] + + self.assert_messaging(compose)