def test_same_permissions_not_changing(self, has_tags_modifications, _get_permissions, _check_version, _exec, get_bin_path): set_module_args({ 'user': '******', 'password': '******', 'state': 'present', 'permissions': [{ 'vhost': '/', 'configure_priv': '.*', 'write_priv': '.*', 'read_priv': '.*' }], }) _get_permissions.return_value = { '/': { 'read': '.*', 'write': '.*', 'configure': '.*', 'vhost': '/' } } _exec.return_value = 'someuser\t[]' _check_version.return_value = distutils.version.StrictVersion('3.6.10') 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')
def test_set_global_parameter(self, _exec, get_bin_path): """Test setting of global parameters.""" set_module_args({ 'name': 'cluster_name', 'value': '"rabbitmq-test"', 'state': 'present', }) get_bin_path.return_value = '/rabbitmqctl' versions = ['3.6', '3.7', '3.8'] for version_num in versions: def side_effect(args, check_rc=True): if 'list_global_parameters' in args: if version_num == '3.6': return 'other_param\t"other_value"\ncluster_name\t"another_name"'.splitlines() elif version_num == '3.7': return 'other_param\t"other_value"\ncluster_name\t"another_name"\n'.splitlines() else: return 'name\tvalue\nother_param\t"other_value"\ncluster_name\t"another_name"\n'.splitlines() elif 'clear_global_parameter' in args or 'set_global_parameter' in args: return ''.splitlines() _exec.side_effect = side_effect try: self.module.main() except AnsibleExitJson as e: self._assert(e, 'changed', True) self._assert(e, 'state', 'present') self._assert(e, 'value', 'rabbitmq-test')
def test_permissions_are_fixed_with_different_host(self, has_tags_modifications, set_permissions, _get_permissions, _exec, get_bin_path): set_module_args({ 'user': '******', 'password': '******', 'state': 'present', 'permissions': [{ 'vhost': '/', 'configure_priv': '.*', 'write_priv': '.*', 'read_priv': '.*' }], }) set_permissions.return_value = None _get_permissions.return_value = [{ 'vhost': 'monitoring', 'configure_priv': '.*', 'write_priv': '.*', 'read_priv': '.*' }] _exec.return_value = ['someuser\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', True) self._assert(e, 'state', 'present') assert set_permissions.call_count == 1
def test_await_online_synchronized_mirror(self, _exec, get_bin_path): """Execute action: await_online_synchronized_mirror""" set_module_args({ 'action': 'await_online_synchronized_mirror', 'node': 'rabbit@node-1', }) get_bin_path.return_value = '/rabbitmqctl' try: self.module.main() except AnsibleExitJson as e: self._assert(e, 'changed', True)
def test_post_upgrade(self, _exec, get_bin_path): """Execute action: post_upgrade""" set_module_args({ 'action': 'post_upgrade', 'node': 'rabbit@node-1', }) get_bin_path.return_value = '/rabbitmqctl' try: self.module.main() except AnsibleExitJson as e: self._assert(e, 'changed', True)
def test_enable_no_change_feature_flag(self, _exec, get_bin_path): """Test that there is no change when enabling feature flag which is already enabled""" set_module_args({ 'name': 'maintenance_mode_status', 'node': 'rabbit@node-1', }) get_bin_path.return_value = '/rabbitmqctl' for out in 'name\tstate\nmaintenance_mode_status\tenabled', 'name\tstate\nmaintenance_mode_status\tenabled\n': _exec.return_value = out.splitlines() try: self.module.main() except AnsibleExitJson as e: self._assert(e, 'changed', False)
def test_remove_global_parameter(self, _exec, get_bin_path): """Test removal of global parameters.""" set_module_args({ 'name': 'cluster_name', 'state': 'absent', }) get_bin_path.return_value = '/rabbitmqctl' # command list_global_parameters returns: # - RabbitMQ 3.6.x: '' # - RabbitMQ 3.7.x: '\n' # - RabbitMQ 3.8.x: 'name\tvalue\n' table header for out in 'cluster_name\t"rabbitmq-test"', 'cluster_name\t"rabbitmq-test"\n', 'name\tvalue\ncluster_name\t"rabbitmq-test"\n': _exec.return_value = out.splitlines() try: self.module.main() except AnsibleExitJson as e: self._assert(e, 'changed', True) self._assert(e, 'state', 'absent')
def test_read_without_initial_global_parameters(self, _exec, get_bin_path): """Test that the code to read the global parameters does not fail anymore for RabbitMQ 3.7.x.""" set_module_args({ 'name': 'cluster_name', 'state': 'absent', }) get_bin_path.return_value = '/rabbitmqctl' # command list_global_parameters returns: # - RabbitMQ 3.6.x: '' # - RabbitMQ 3.7.x: '\n' # - RabbitMQ 3.8.x: 'name\tvalue\n' table header for out in '', '\n', 'name\tvalue\n': _exec.return_value = out.splitlines() try: self.module.main() except AnsibleExitJson as e: self._assert(e, 'changed', False) self._assert(e, 'state', 'absent')
def test_set_no_change_global_parameter(self, _exec, get_bin_path): """Test that there is no change when setting the same global parameter.""" set_module_args({ 'name': 'cluster_name', 'value': '"rabbitmq-test"', 'state': 'present', }) get_bin_path.return_value = '/rabbitmqctl' def side_effect(args, check_rc=True): if 'list_global_parameters' in args: return 'other_param\t"other_value"\ncluster_name\t"rabbitmq-test"'.splitlines() elif 'clear_global_parameter' in args or 'set_global_parameter' in args: return ''.splitlines() _exec.side_effect = side_effect try: self.module.main() except AnsibleExitJson as e: self._assert(e, 'changed', False) self._assert(e, 'state', 'present') self._assert(e, 'value', 'rabbitmq-test')
def test_permissions_with_same_vhost(self, _check_version, get_bin_path): set_module_args({ 'user': '******', 'password': '******', 'state': 'present', 'permissions': [{ 'vhost': '/' }, { 'vhost': '/' }], }) _check_version.return_value = distutils.version.StrictVersion('3.6.10') get_bin_path.return_value = '/rabbitmqctl' try: self.module.main() except AnsibleFailJson as e: self._assert(e, 'failed', True) self._assert( e, 'msg', "Error parsing vhost " "permissions: You can't have two permission dicts for the same vhost" )
def test_password_changes_only_when_needed(self, has_permissions_modifications, has_tags_modifications, check_password, get, get_bin_path): set_module_args({ 'user': '******', 'password': '******', 'state': 'present', 'update_password': '******', }) get.return_value = True get_bin_path.return_value = '/rabbitmqctl' check_password.return_value = True has_tags_modifications.return_value = False has_permissions_modifications.return_value = False try: self.module.main() except AnsibleExitJson as e: self._assert(e, 'changed', False) self._assert(e, 'state', 'present')
def test_without_maitenance_mode_status_feature_flag(self, _exec, get_bin_path): """Failure must occur when maintenance_mode_status feature_flag is disabled/not available""" with self.assertRaises(AnsibleFailJson): set_module_args({ 'action': 'drain', 'node': 'rabbit@node-1', }) get_bin_path.return_value = '/rabbitmqctl' def side_effect(*args, **kwargs): if args[0] == 'rabbitmq-diagnostics': out = '{"active_plugins": ["rabbitmq_management", "amqp_client", "rabbitmq_web_dispatch", "cowboy",'\ '"cowlib", "rabbitmq_management_agent"], "is_under_maintenance": false}' elif args[0] == 'rabbitmqctl': out = 'name\tstate\nmaintenance_mode_status\tdisabled' else: out = '' return out.splitlines() _exec.side_effect = side_effect self.module.main()
def test_permissions_with_same_vhost(self): set_module_args({ 'user': '******', 'password': '******', 'state': 'present', 'permissions': [{ 'vhost': '/' }, { 'vhost': '/' }], }) with patch('ansible.module_utils.basic.AnsibleModule.get_bin_path' ) as get_bin_path: get_bin_path.return_value = '/rabbitmqctl' try: self.module.main() except AnsibleFailJson as e: self._assert(e, 'failed', True) self._assert( e, 'msg', "Error parsing permissions: You can't have two permission dicts for the same vhost" )
def test_tags_are_fixed(self, _get_permissions, _check_version, _exec, get_bin_path): """Test user tags are fixed.""" set_module_args({ 'user': '******', 'password': '******', 'state': 'present', 'tags': 'tag1,tags2', }) get_bin_path.return_value = '/rabbitmqctl' _check_version.return_value = distutils.version.StrictVersion('3.6.10') _get_permissions.return_value = { '/': { 'vhost': '/', 'configure': '^$', 'write': '^$', 'read': '^$' } } def side_effect(args): if 'list_users' in args: self.assertTrue('--formatter' not in args) self.assertTrue('json' not in args) return 'someuser\t[tag1, tag3]' return '' _exec.side_effect = side_effect try: self.module.main() except AnsibleExitJson as e: self._assert(e, 'changed', True) self._assert(e, 'state', 'present') self.assertEqual(_exec.call_count, 2) self.assertTrue( lists_equal(['set_user_tags', 'someuser', 'tag1', 'tags2'], flatten(_exec.call_args_list[-1][0])))
def test_no_change_drain_node(self, _exec, get_bin_path): """Execute action: drain on already disabled node""" set_module_args({ 'action': 'drain', 'node': 'rabbit@node-1', }) get_bin_path.return_value = '/rabbitmqctl' def side_effect(*args, **kwargs): if args[0] == 'rabbitmq-diagnostics': out = '{"active_plugins": ["rabbitmq_management", "amqp_client", "rabbitmq_web_dispatch", "cowboy",'\ '"cowlib", "rabbitmq_management_agent"], "is_under_maintenance": true}' elif args[0] == 'rabbitmqctl': out = 'name\tstate\nmaintenance_mode_status\tenabled' else: out = '' return out.splitlines() _exec.side_effect = side_effect try: self.module.main() except AnsibleExitJson as e: self._assert(e, 'changed', False)
def test_without_required_parameters(self): """Failure must occur when all parameters are missing.""" with self.assertRaises(AnsibleFailJson): set_module_args({}) self.module.main()
def test_permissions_are_fixed(self, has_tags_modifications, _get_permissions, _check_version, _exec, get_bin_path): """Test changes in permissions are fixed. Ensure that permissions that do not need to be changed are not, permissions with differences are fixed and permissions are cleared when needed, with the minimum number of operations. The permissions are fed into the module using the pre-3.7 version format. """ set_module_args({ 'user': '******', 'password': '******', 'state': 'present', 'permissions': [{ 'vhost': '/', 'configure_priv': '.*', 'write_priv': '.*', 'read_priv': '.*' }, { 'vhost': '/ok', 'configure': '^$', 'write': '^$', 'read': '^$' }], }) get_bin_path.return_value = '/rabbitmqctl' has_tags_modifications.return_value = False _check_version.return_value = distutils.version.StrictVersion('3.6.10') _get_permissions.return_value = { '/wrong_vhost': { 'vhost': '/wrong_vhost', 'configure': '', 'write': '', 'read': '' }, '/ok': { 'vhost': '/ok', 'configure': '^$', 'write': '^$', 'read': '^$' } } def side_effect(args): if 'list_users' in args: self.assertTrue('--formatter' not in args) self.assertTrue('json' not in args) return 'someuser\t[administrator, management]' if 'clear_permissions' in args: self.assertTrue('someuser' in args) self.assertTrue('/wrong_vhost' in args) return '' if 'set_permissions' in args: self.assertTrue('someuser' in args) self.assertTrue('/' in args) self.assertTrue(['.*', '.*', '.*'] == args[-3:]) return '' _exec.side_effect = side_effect try: self.module.main() except AnsibleExitJson as e: self._assert(e, 'changed', True) self._assert(e, 'state', 'present') self.assertEqual(_exec.call_count, 3) self.assertTrue( ['clear_permissions', '-p', '/wrong_vhost', 'someuser' ] == flatten(_exec.call_args_list[-2][0])) self.assertTrue( ['set_permissions', '-p', '/', 'someuser', '.*', '.*', '.*' ] == flatten(_exec.call_args_list[-1][0]))