From cad7c66711e89e71b1ae486e7c53c6d14563c18a Mon Sep 17 00:00:00 2001
From: Pavlos Tzianos <pavlos.tzianos@gmail.com>
Date: Sat, 29 Dec 2018 14:54:07 +0100
Subject: [PATCH] Parse correctly header of RabbitMQ 3.7.9 responses
---
.../messaging/rabbitmq/rabbitmq_user.py | 8 +++---
.../messaging/rabbitmq/test_rabbimq_user.py | 27 +++++++++++++++++++
2 files changed, 32 insertions(+), 3 deletions(-)
diff --git a/lib/ansible/modules/messaging/rabbitmq/rabbitmq_user.py b/lib/ansible/modules/messaging/rabbitmq/rabbitmq_user.py
index 5be2339e2fe39..7b76c76a48328 100644
--- a/lib/ansible/modules/messaging/rabbitmq/rabbitmq_user.py
+++ b/lib/ansible/modules/messaging/rabbitmq/rabbitmq_user.py
@@ -174,11 +174,13 @@ def get(self):
def _get_permissions(self):
"""Get permissions of the user from RabbitMQ."""
- perms_out = [perm for perm in self._exec(['list_user_permissions', self.username], True) if perm.strip()]
+ perms_out = [perm.split('\t') for perm in self._exec(['list_user_permissions', self.username], True)
+ if perm.strip()]
+ # Filter out headers from the output of the command
+ perms_out = [perm for perm in perms_out if perm != ["vhost", "configure", "write", "read"]]
perms_list = list()
- for perm in perms_out:
- vhost, configure_priv, write_priv, read_priv = perm.split('\t')
+ for vhost, configure_priv, write_priv, read_priv in perms_out:
if not self.bulk_permissions:
if vhost == self.permissions[0]['vhost']:
perms_list.append(dict(vhost=vhost, configure_priv=configure_priv,
diff --git a/test/units/modules/messaging/rabbitmq/test_rabbimq_user.py b/test/units/modules/messaging/rabbitmq/test_rabbimq_user.py
index 269ffef6fc458..922695515dd1c 100644
--- a/test/units/modules/messaging/rabbitmq/test_rabbimq_user.py
+++ b/test/units/modules/messaging/rabbitmq/test_rabbimq_user.py
@@ -84,6 +84,33 @@ def test_same_permissions_not_changing(self, has_tags_modifications, _get_permis
self._assert(e, 'changed', False)
self._assert(e, 'state', 'present')
+ @patch('ansible.module_utils.basic.AnsibleModule.get_bin_path')
+ @patch('ansible.modules.messaging.rabbitmq.rabbitmq_user.RabbitMqUser._exec')
+ @patch('ansible.modules.messaging.rabbitmq.rabbitmq_user.RabbitMqUser.has_tags_modifications')
+ def test_same_permissions_parsed_and_not_changed(self, has_tags_modifications, _exec, get_bin_path):
+ """Test that user permissions are passed correctly.
+
+ This test is aimed to ensure that Ansible can parse the response of version >= RabbitMQ v3.7.9
+ where a response looks like this:
+ > rabbitmqctl list_user_permissions admin
+ vhost configure write read
+ / ^$ ^$ ^$
+ """
+ set_module_args({
+ 'user': 'someuser',
+ 'password': 'somepassword',
+ 'state': 'present',
+ 'permissions': [{'vhost': '/', 'configure_priv': '.*', 'write_priv': '.*', 'read_priv': '.*'}],
+ })
+ _exec.side_effect = [['someuser\t[]'], ['vhost\tconfigure\twrite\tread', '/\t.*\t.*\t.*']]
+ get_bin_path.return_value = '/rabbitmqctl'
+ has_tags_modifications.return_value = False
+ try:
+ self.module.main()
+ except AnsibleExitJson as e:
+ self._assert(e, 'changed', False)
+ self._assert(e, 'state', 'present')
+
@patch('ansible.module_utils.basic.AnsibleModule.get_bin_path')
@patch('ansible.modules.messaging.rabbitmq.rabbitmq_user.RabbitMqUser._exec')
@patch('ansible.modules.messaging.rabbitmq.rabbitmq_user.RabbitMqUser._get_permissions')