Display queue sizes along with queues

When checking queues, display not only queue names but also their
size (number of messages). Return sizes as integers.

Also update parsing to account for a rabbitmqctl output change in
focal.

Closes-Bug: #1838964

Change-Id: I2014f065393a1ad4b594363ade6c01ccec4fb71a
This commit is contained in:
Peter Sabaini 2020-10-23 13:56:36 +02:00
parent 33af068075
commit b3710a0085
2 changed files with 31 additions and 24 deletions

View File

@ -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})

View File

@ -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):