From cad7c66711e89e71b1ae486e7c53c6d14563c18a Mon Sep 17 00:00:00 2001 From: Pavlos Tzianos 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 5be2339e2fe399..7b76c76a483284 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 269ffef6fc458f..922695515dd1cc 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')