diff --git a/actions/actions.py b/actions/actions.py index 45da3190..d7d599e3 100755 --- a/actions/actions.py +++ b/actions/actions.py @@ -96,19 +96,19 @@ def check_queues(args): Return those queues to the user.""" queue_depth = (action_get('queue-depth')) vhost = (action_get('vhost')) - result = [] # rabbitmqctl's output contains lines we don't want, such as # 'Listing queues ..' and '...done.', which may vary by release. # Actual queue results *should* always look like 'test\t0' - queue_pattern = re.compile('.*\t[0-9]*') + queue_pattern = re.compile(r"^(.*)\t([0-9]+$)") try: - queues = check_output(['rabbitmqctl', 'list_queues', - '-p', vhost]).decode('utf-8').split('\n') - result = list({queue: size for (queue, size) in - [i.split('\t') for i in queues - if re.search(queue_pattern, i)] - if int(size) >= queue_depth}) - + queue_lines = check_output( + ['rabbitmqctl', 'list_queues', '-q', '-p', vhost] + ).decode('utf-8').splitlines() + filtered = filter( + None, # filter out empty records + map(lambda line: queue_pattern.findall(line), queue_lines)) + queues = [(queue, int(size)) for [[queue, size]] in filtered] + result = {queue: size for queue, size in queues if size >= queue_depth} action_set({'output': result, 'outcome': 'Success'}) except CalledProcessError as e: action_set({'output': e.output}) diff --git a/unit_tests/test_actions.py b/unit_tests/test_actions.py index 8614d579..2eff8fd5 100644 --- a/unit_tests/test_actions.py +++ b/unit_tests/test_actions.py @@ -78,7 +78,10 @@ class ClusterStatusTestCase(CharmTestCase): class CheckQueuesTestCase(CharmTestCase): - TEST_QUEUE_RESULT = b'Listing queues ...\ntest\t0\ntest\t0\n""' + TEST_QUEUE_RESULTS = [ + b'Listing queues ...\ntest\t0\ntest\t0\n', + b'name\tmessage\ntest\t0\ntest\t0\n', + ] def dummy_action_get(self, key): action_values = {"queue-depth": -1, "vhost": "/"} @@ -91,24 +94,28 @@ class CheckQueuesTestCase(CharmTestCase): def test_check_queues(self): self.action_get.side_effect = self.dummy_action_get - self.check_output.return_value = self.TEST_QUEUE_RESULT - - actions.check_queues([]) - self.check_output.assert_called_once_with(['rabbitmqctl', - 'list_queues', - '-p', "/"]) - self.action_set.assert_called() + for queue_res in self.TEST_QUEUE_RESULTS: + with self.subTest(queue_res=queue_res): + self.check_output.return_value = queue_res + actions.check_queues([]) + self.check_output.assert_called_once_with( + ['rabbitmqctl', 'list_queues', '-q', '-p', '/'], + ) + self.check_output.reset_mock() + self.action_set.assert_called_once_with( + {'outcome': 'Success', 'output': {'test': 0}} + ) + self.action_set.reset_mock() def test_check_queues_execption(self): self.action_get.side_effect = self.dummy_action_get - self.check_output.return_value = self.TEST_QUEUE_RESULT - - self.check_output.side_effect = actions.CalledProcessError(1, - "Failure") + self.check_output.side_effect = actions.CalledProcessError( + 1, "Failure" + ) actions.check_queues([]) - self.check_output.assert_called_once_with(['rabbitmqctl', - 'list_queues', - '-p', '/']) + self.check_output.assert_called_once_with( + ['rabbitmqctl', 'list_queues', '-q', '-p', '/'] + ) class ListUnconsumedQueuesTestCase(CharmTestCase):