From 980327a93f65c531f3034da46a45c4cdedd6ffd7 Mon Sep 17 00:00:00 2001 From: Ralph Bean Date: May 01 2018 01:21:57 +0000 Subject: [PATCH 1/2] Make this a statismethod. `self` is never used, so this has no effect... (but it makes it easier to test in the next commit). --- diff --git a/greenwave/consumers/resultsdb.py b/greenwave/consumers/resultsdb.py index 0bfe353..a346f44 100644 --- a/greenwave/consumers/resultsdb.py +++ b/greenwave/consumers/resultsdb.py @@ -61,7 +61,8 @@ class ResultsDBHandler(fedmsg.consumers.FedmsgConsumer): log.info('Greenwave resultsdb handler listening on: %s', self.topic) - def announcement_subjects(self, config, message): + @staticmethod + def announcement_subjects(config, message): """ Yields subjects for announcement consideration from the message. Args: From 349021594c3cb84ff8a2c1003cb8302373674959 Mon Sep 17 00:00:00 2001 From: Ralph Bean Date: May 01 2018 01:21:57 +0000 Subject: [PATCH 2/2] Flatten single-item lists from resultsdb messages into strings. resultsdb publishes all of its data items as lists of single strings. Here, I noticed a traceback in our stage environment when trying to construct announcement subjects for some incoming messages. --- diff --git a/greenwave/consumers/resultsdb.py b/greenwave/consumers/resultsdb.py index a346f44..992bdd5 100644 --- a/greenwave/consumers/resultsdb.py +++ b/greenwave/consumers/resultsdb.py @@ -78,9 +78,16 @@ class ResultsDBHandler(fedmsg.consumers.FedmsgConsumer): announcement_keys = [ set(keys) for keys in config['ANNOUNCEMENT_SUBJECT_KEYS'] ] + + def _decode(value): + """ Decode either a string or a list of strings. """ + if len(value) == 1: + value = value[0] + return value.decode('utf-8') + for keys in announcement_keys: if keys.issubset(data.keys()): - yield dict([(key.decode('utf-8'), data[key].decode('utf-8')) for key in keys]) + yield {key.decode('utf-8'): _decode(data[key]) for key in keys} def consume(self, message): """ diff --git a/greenwave/tests/test_resultsdb_consumer.py b/greenwave/tests/test_resultsdb_consumer.py new file mode 100644 index 0000000..7a6fb65 --- /dev/null +++ b/greenwave/tests/test_resultsdb_consumer.py @@ -0,0 +1,15 @@ +# SPDX-License-Identifier: GPL-2.0+ + +import greenwave.consumers.resultsdb + + +def test_announcement_keys_decode_with_list(): + cls = greenwave.consumers.resultsdb.ResultsDBHandler + config = {'ANNOUNCEMENT_SUBJECT_KEYS': [('foo',)]} + message = {'msg': {'data': { + u'foo'.encode('utf-8'): [u'bar'.encode('utf-8')], + }}} + + subjects = cls.announcement_subjects(config, message) + + assert list(subjects) == [{u'foo': u'bar'}]