Fixing rabbitmq.list_user_permissions to ensure we are returning a permission list with three elements even when some values are empty.

This commit is contained in:
Gareth J. Greenaway 2021-05-19 15:18:42 -07:00 committed by Megan Wilhite
parent 971dfb43fb
commit caa72102c8
3 changed files with 850 additions and 915 deletions

View file

@ -1,11 +1,8 @@
# -*- coding: utf-8 -*-
"""
Module to provide RabbitMQ compatibility to Salt.
Todo: A lot, need to add cluster support, logging, and minion configuration
data.
"""
# Import Python libs
from __future__ import absolute_import, print_function, unicode_literals
import logging
import os
@ -13,16 +10,12 @@ import random
import re
import string
# Import Salt libs
import salt.utils.itertools
import salt.utils.json
import salt.utils.path
import salt.utils.platform
import salt.utils.user
from salt.exceptions import CommandExecutionError, SaltInvocationError
# Import 3rd-party libs
from salt.ext import six
from salt.ext.six.moves import range
from salt.utils.versions import LooseVersion as _LooseVersion
@ -53,10 +46,10 @@ def __virtual__():
(dir_path, value_type) = winreg.QueryValueEx(key, "Install_Dir")
if value_type != winreg.REG_SZ:
raise TypeError(
"Invalid RabbitMQ Server directory type: {0}".format(value_type)
"Invalid RabbitMQ Server directory type: {}".format(value_type)
)
if not os.path.isdir(dir_path):
raise IOError("RabbitMQ directory not found: {0}".format(dir_path))
raise OSError("RabbitMQ directory not found: {}".format(dir_path))
subdir_match = ""
for name in os.listdir(dir_path):
if name.startswith("rabbitmq_server-"):
@ -65,10 +58,8 @@ def __virtual__():
if os.path.isdir(subdir_path) and subdir_path > subdir_match:
subdir_match = subdir_path
if not subdir_match:
raise IOError(
'"rabbitmq_server-*" subdirectory not found in: {0}'.format(
dir_path
)
raise OSError(
'"rabbitmq_server-*" subdirectory not found in: {}'.format(dir_path)
)
RABBITMQCTL = os.path.join(subdir_match, "sbin", "rabbitmqctl.bat")
RABBITMQ_PLUGINS = os.path.join(
@ -92,24 +83,24 @@ def _check_response(response):
if isinstance(response, dict):
if response["retcode"] != 0 or response["stderr"]:
raise CommandExecutionError(
"RabbitMQ command failed: {0}".format(response["stderr"])
"RabbitMQ command failed: {}".format(response["stderr"])
)
else:
if "Error" in response:
raise CommandExecutionError("RabbitMQ command failed: {0}".format(response))
raise CommandExecutionError("RabbitMQ command failed: {}".format(response))
def _format_response(response, msg):
if isinstance(response, dict):
if response["retcode"] != 0 or response["stderr"]:
raise CommandExecutionError(
"RabbitMQ command failed: {0}".format(response["stderr"])
"RabbitMQ command failed: {}".format(response["stderr"])
)
else:
response = response["stdout"]
else:
if "Error" in response:
raise CommandExecutionError("RabbitMQ command failed: {0}".format(response))
raise CommandExecutionError("RabbitMQ command failed: {}".format(response))
return {msg: response}
@ -125,7 +116,7 @@ def _get_rabbitmq_plugin():
if RABBITMQ_PLUGINS is None:
version = __salt__["pkg.version"]("rabbitmq-server").split("-")[0]
RABBITMQ_PLUGINS = (
"/usr/lib/rabbitmq/lib/rabbitmq_server-{0}" "/sbin/rabbitmq-plugins"
"/usr/lib/rabbitmq/lib/rabbitmq_server-{}" "/sbin/rabbitmq-plugins"
).format(version)
return RABBITMQ_PLUGINS
@ -167,7 +158,7 @@ def _output_to_dict(cmdoutput, values_mapper=None):
if isinstance(cmdoutput, dict):
if cmdoutput["retcode"] != 0 or cmdoutput["stderr"]:
raise CommandExecutionError(
"RabbitMQ command failed: {0}".format(cmdoutput["stderr"])
"RabbitMQ command failed: {}".format(cmdoutput["stderr"])
)
cmdoutput = cmdoutput["stdout"]
@ -386,7 +377,7 @@ def add_user(name, password=None, runas=None):
# command,\r\noperable program or batch file.
# Work around this by using a shell and a quoted command.
python_shell = True
cmd = '"{0}" add_user "{1}" "{2}"'.format(RABBITMQCTL, name, password)
cmd = '"{}" add_user "{}" "{}"'.format(RABBITMQCTL, name, password)
else:
python_shell = False
cmd = [RABBITMQCTL, "add_user", name, password]
@ -456,7 +447,7 @@ def change_password(name, password, runas=None):
# command,\r\noperable program or batch file.
# Work around this by using a shell and a quoted command.
python_shell = True
cmd = '"{0}" change_password "{1}" "{2}"'.format(RABBITMQCTL, name, password)
cmd = '"{}" change_password "{}" "{}"'.format(RABBITMQCTL, name, password)
else:
python_shell = False
cmd = [RABBITMQCTL, "change_password", name, password]
@ -547,9 +538,7 @@ def check_password(name, password, runas=None):
# command,\r\noperable program or batch file.
# Work around this by using a shell and a quoted command.
python_shell = True
cmd = '"{0}" authenticate_user "{1}" "{2}"'.format(
RABBITMQCTL, name, password
)
cmd = '"{}" authenticate_user "{}" "{}"'.format(RABBITMQCTL, name, password)
else:
python_shell = False
cmd = [RABBITMQCTL, "authenticate_user", name, password]
@ -697,7 +686,12 @@ def list_user_permissions(name, runas=None):
python_shell=False,
)
return _output_to_dict(res)
perms = _output_to_dict(res)
for perm in perms:
if len(perms[perm]) < 3:
missing = ["" for i in range(0, 3 - len(perms[perm]))]
perms[perm].extend(missing)
return perms
def set_user_tags(name, tags, runas=None):
@ -782,7 +776,7 @@ def join_cluster(host, user="rabbit", ram_node=None, runas=None):
cmd = [RABBITMQCTL, "join_cluster"]
if ram_node:
cmd.append("--ram")
cmd.append("{0}@{1}".format(user, host))
cmd.append("{}@{}".format(user, host))
if runas is None and not salt.utils.platform.is_windows():
runas = salt.utils.user.get_user()
@ -1013,7 +1007,7 @@ def set_policy(
runas = salt.utils.user.get_user()
if isinstance(definition, dict):
definition = salt.utils.json.dumps(definition)
if not isinstance(definition, six.string_types):
if not isinstance(definition, str):
raise SaltInvocationError(
"The 'definition' argument must be a dictionary or JSON string"
)

View file

@ -0,0 +1,829 @@
"""
:codeauthor: Jayesh Kariya <jayeshk@saltstack.com>
"""
import pytest
import salt.modules.rabbitmq as rabbitmq
from salt.exceptions import CommandExecutionError
from tests.support.mock import MagicMock, patch
@pytest.fixture
def configure_loader_modules():
return {rabbitmq: {"__context__": {"rabbitmqctl": None, "rabbitmq-plugins": None}}}
# 'list_users_rabbitmq2' function tests: 1
def test_list_users_rabbitmq2():
"""
Test if it return a list of users based off of rabbitmqctl user_list.
"""
mock_run = MagicMock(
return_value={
"retcode": 0,
"stdout": "Listing users ...\nguest\t[administrator, user]\njustAnAdmin\t[administrator]\n",
"stderr": "",
}
)
with patch.dict(rabbitmq.__salt__, {"cmd.run_all": mock_run}):
assert rabbitmq.list_users() == {
"guest": ["administrator", "user"],
"justAnAdmin": ["administrator"],
}
# 'list_users_rabbitmq3' function tests: 1
def test_list_users_rabbitmq3():
"""
Test if it return a list of users based off of rabbitmqctl user_list.
"""
mock_run = MagicMock(
return_value={
"retcode": 0,
"stdout": "guest\t[administrator user]\r\nother\t[a b]\r\n",
"stderr": "",
}
)
with patch.dict(rabbitmq.__salt__, {"cmd.run_all": mock_run}):
assert rabbitmq.list_users() == {
"guest": ["administrator", "user"],
"other": ["a", "b"],
}
# 'list_users_with_warning_rabbitmq2' function tests: 1
def test_list_users_with_warning_rabbitmq2():
"""
Test if having a leading WARNING returns the user_list anyway.
"""
rtn_stdout = "\n".join(
[
"WARNING: ignoring /etc/rabbitmq/rabbitmq.conf -- location has moved to /etc/rabbitmq/rabbitmq-env.conf",
"Listing users ...",
"guest\t[administrator, user]\n",
]
)
mock_run = MagicMock(
return_value={"retcode": 0, "stdout": rtn_stdout, "stderr": ""}
)
with patch.dict(rabbitmq.__salt__, {"cmd.run_all": mock_run}):
assert rabbitmq.list_users() == {"guest": ["administrator", "user"]}
# 'list_users_with_warning_rabbitmq3' function tests: 1
def test_list_users_with_warning_rabbitmq3():
"""
Test if having a leading WARNING returns the user_list anyway.
"""
rtn_stdout = "\n".join(
[
"WARNING: ignoring /etc/rabbitmq/rabbitmq.conf -- location has moved to /etc/rabbitmq/rabbitmq-env.conf",
"Listing users ...",
"guest\t[administrator user]\n",
]
)
mock_run = MagicMock(
return_value={"retcode": 0, "stdout": rtn_stdout, "stderr": ""}
)
with patch.dict(rabbitmq.__salt__, {"cmd.run_all": mock_run}):
assert rabbitmq.list_users() == {"guest": ["administrator", "user"]}
# 'list_vhosts' function tests: 2
def test_list_vhosts():
"""
Test if it return a list of vhost based on rabbitmqctl list_vhosts.
"""
mock_run = MagicMock(
return_value={"retcode": 0, "stdout": "/\nsaltstack\n...", "stderr": ""}
)
with patch.dict(rabbitmq.__salt__, {"cmd.run_all": mock_run}):
assert rabbitmq.list_vhosts() == ["/", "saltstack", "..."]
def test_list_vhosts_with_warning():
"""
Test if it return a list of vhost based on rabbitmqctl list_vhosts even with a leading WARNING.
"""
rtn_stdout = "\n".join(
[
"WARNING: ignoring /etc/rabbitmq/rabbitmq.conf -- location has moved to /etc/rabbitmq/rabbitmq-env.conf",
"Listing users ...",
"/",
"saltstack",
"...\n",
]
)
mock_run = MagicMock(
return_value={"retcode": 0, "stdout": rtn_stdout, "stderr": ""}
)
with patch.dict(rabbitmq.__salt__, {"cmd.run_all": mock_run}):
assert rabbitmq.list_vhosts() == ["/", "saltstack", "..."]
# 'user_exists' function tests: 2
def test_user_exists():
"""
Test whether a given rabbitmq-internal user exists based
on rabbitmqctl list_users.
"""
mock_run = MagicMock(
return_value={
"retcode": 0,
"stdout": "Listing users ...\n" "saltstack\t[administrator]\n...done",
"stderr": "",
}
)
with patch.dict(rabbitmq.__salt__, {"cmd.run_all": mock_run}):
assert rabbitmq.user_exists("saltstack")
def test_user_exists_negative():
"""
Negative test of whether rabbitmq-internal user exists based
on rabbitmqctl list_users.
"""
mock_run = MagicMock(
return_value={
"retcode": 0,
"stdout": "Listing users ...\n" "saltstack\t[administrator]\n...done",
"stderr": "",
}
)
with patch.dict(rabbitmq.__salt__, {"cmd.run_all": mock_run}):
assert not rabbitmq.user_exists("salt")
# 'vhost_exists' function tests: 2
def test_vhost_exists():
"""
Test if it return whether the vhost exists based
on rabbitmqctl list_vhosts.
"""
mock_run = MagicMock(
return_value={
"retcode": 0,
"stdout": "Listing vhosts ...\nsaltstack",
"stderr": "",
}
)
with patch.dict(rabbitmq.__salt__, {"cmd.run_all": mock_run}):
assert rabbitmq.vhost_exists("saltstack")
def test_vhost_exists_negative():
"""
Test if it return whether the vhost exists based
on rabbitmqctl list_vhosts.
"""
mock_run = MagicMock(
return_value={
"retcode": 0,
"stdout": "Listing vhosts ...\nsaltstack",
"stderr": "",
}
)
with patch.dict(rabbitmq.__salt__, {"cmd.run_all": mock_run}):
assert not rabbitmq.vhost_exists("salt")
# 'add_user' function tests: 1
def test_add_user():
"""
Test if it add a rabbitMQ user via rabbitmqctl
user_add <user> <password>
"""
mock_run = MagicMock(
return_value={"retcode": 0, "stdout": "saltstack", "stderr": ""}
)
with patch.dict(rabbitmq.__salt__, {"cmd.run_all": mock_run}):
assert rabbitmq.add_user("saltstack") == {"Added": "saltstack"}
mock_run = MagicMock(return_value="Error")
with patch.dict(rabbitmq.__salt__, {"cmd.run_all": mock_run}):
with patch.object(
rabbitmq, "clear_password", return_value={"Error": "Error", "retcode": 1},
):
pytest.raises(CommandExecutionError, rabbitmq.add_user, "saltstack")
# 'delete_user' function tests: 1
def test_delete_user():
"""
Test if it deletes a user via rabbitmqctl delete_user.
"""
mock_run = MagicMock(
return_value={"retcode": 0, "stdout": "saltstack", "stderr": ""}
)
with patch.dict(rabbitmq.__salt__, {"cmd.run_all": mock_run}):
assert rabbitmq.delete_user("saltstack") == {"Deleted": "saltstack"}
# 'check_password' function tests: 2
def test_check_password_lt_38():
"""
Test if it checks a user's password for RabbitMQ less than v3.8.
"""
mock_run = MagicMock(return_value='{rabbit,"RabbitMQ","3.5.7"}')
mock_run2 = MagicMock(
return_value={
"retcode": 0,
"stdout": 'Authenticating user "saltstack" ...\nSuccess',
"stderr": "",
}
)
with patch.dict(rabbitmq.__salt__, {"cmd.run": mock_run, "cmd.run_all": mock_run2}):
assert rabbitmq.check_password("saltstack", "salt@123")
def test_check_password_gt_38():
"""
Test if it checks a user's password for RabbitMQ greater than v3.8.
"""
mock_run = MagicMock(return_value="RabbitMQ version: 3.8.3")
mock_run2 = MagicMock(
return_value={
"retcode": 0,
"stdout": 'Authenticating user "saltstack" ...\nSuccess',
"stderr": "",
}
)
with patch.dict(rabbitmq.__salt__, {"cmd.run": mock_run, "cmd.run_all": mock_run2}):
assert rabbitmq.check_password("saltstack", "salt@123")
# 'change_password' function tests: 1
def test_change_password():
"""
Test if it changes a user's password.
"""
mock_run = MagicMock(
return_value={"retcode": 0, "stdout": "saltstack", "stderr": ""}
)
with patch.dict(rabbitmq.__salt__, {"cmd.run_all": mock_run}):
assert rabbitmq.change_password("saltstack", "salt@123") == {
"Password Changed": "saltstack"
}
# 'clear_password' function tests: 1
def test_clear_password():
"""
Test if it removes a user's password.
"""
mock_run = MagicMock(
return_value={"retcode": 0, "stdout": "saltstack", "stderr": ""}
)
with patch.dict(rabbitmq.__salt__, {"cmd.run_all": mock_run}):
assert rabbitmq.clear_password("saltstack") == {"Password Cleared": "saltstack"}
# 'add_vhost' function tests: 1
def test_add_vhost():
"""
Test if it adds a vhost via rabbitmqctl add_vhost.
"""
mock_run = MagicMock(
return_value={"retcode": 0, "stdout": "saltstack", "stderr": ""}
)
with patch.dict(rabbitmq.__salt__, {"cmd.run_all": mock_run}):
assert rabbitmq.add_vhost("saltstack") == {"Added": "saltstack"}
# 'delete_vhost' function tests: 1
def test_delete_vhost():
"""
Test if it deletes a vhost rabbitmqctl delete_vhost.
"""
mock_run = MagicMock(
return_value={"retcode": 0, "stdout": "saltstack", "stderr": ""}
)
with patch.dict(rabbitmq.__salt__, {"cmd.run_all": mock_run}):
assert rabbitmq.delete_vhost("saltstack") == {"Deleted": "saltstack"}
# 'set_permissions' function tests: 1
def test_set_permissions():
"""
Test if it sets permissions for vhost via rabbitmqctl set_permissions.
"""
mock_run = MagicMock(
return_value={"retcode": 0, "stdout": "saltstack", "stderr": ""}
)
with patch.dict(rabbitmq.__salt__, {"cmd.run_all": mock_run}):
assert rabbitmq.set_permissions("myvhost", "myuser") == {
"Permissions Set": "saltstack"
}
# 'list_permissions' function tests: 1
def test_list_permissions():
"""
Test if it lists permissions for a vhost
via rabbitmqctl list_permissions.
"""
mock_run = MagicMock(
return_value={
"retcode": 0,
"stdout": "Listing stuff ...\nsaltstack\tsaltstack\t.*\t1\nguest\t0\tone\n...done",
"stderr": "",
}
)
with patch.dict(rabbitmq.__salt__, {"cmd.run_all": mock_run}):
assert rabbitmq.list_user_permissions("myuser") == {
"saltstack": ["saltstack", ".*", "1"],
"guest": ["0", "one", ""],
}
# 'list_user_permissions' function tests: 1
def test_list_user_permissions():
"""
Test if it list permissions for a user
via rabbitmqctl list_user_permissions.
"""
mock_run = MagicMock(
return_value={
"retcode": 0,
"stdout": "Listing stuff ...\nsaltstack\tsaltstack\t0\t1\nguest\t0\tone\n...done",
"stderr": "",
}
)
with patch.dict(rabbitmq.__salt__, {"cmd.run_all": mock_run}):
assert rabbitmq.list_user_permissions("myuser") == {
"saltstack": ["saltstack", "0", "1"],
"guest": ["0", "one", ""],
}
# 'set_user_tags' function tests: 1
def test_set_user_tags():
"""
Test if it add user tags via rabbitmqctl set_user_tags.
"""
mock_run = MagicMock(
return_value={"retcode": 0, "stdout": "saltstack", "stderr": ""}
)
with patch.dict(rabbitmq.__salt__, {"cmd.run_all": mock_run}):
assert rabbitmq.set_user_tags("myadmin", "admin") == {"Tag(s) set": "saltstack"}
# 'status' function tests: 1
def test_status():
"""
Test if it return rabbitmq status.
"""
mock_run = MagicMock(
return_value={"retcode": 0, "stdout": "saltstack", "stderr": ""}
)
with patch.dict(rabbitmq.__salt__, {"cmd.run_all": mock_run}):
assert rabbitmq.status() == "saltstack"
# 'cluster_status' function tests: 1
def test_cluster_status():
"""
Test if it return rabbitmq cluster_status.
"""
mock_run = MagicMock(
return_value={"retcode": 0, "stdout": "saltstack", "stderr": ""}
)
with patch.dict(rabbitmq.__salt__, {"cmd.run_all": mock_run}):
assert rabbitmq.cluster_status() == "saltstack"
# 'join_cluster' function tests: 1
def test_join_cluster():
"""
Test if it join a rabbit cluster.
"""
mock_run = MagicMock(
return_value={"retcode": 0, "stdout": "saltstack", "stderr": ""}
)
with patch.dict(rabbitmq.__salt__, {"cmd.run_all": mock_run}):
assert rabbitmq.join_cluster("rabbit.example.com") == {"Join": "saltstack"}
# 'stop_app' function tests: 1
def test_stop_app():
"""
Test if it stops the RabbitMQ application,
leaving the Erlang node running.
"""
mock_run = MagicMock(
return_value={"retcode": 0, "stdout": "saltstack", "stderr": ""}
)
with patch.dict(rabbitmq.__salt__, {"cmd.run_all": mock_run}):
assert rabbitmq.stop_app() == "saltstack"
# 'start_app' function tests: 1
def test_start_app():
"""
Test if it start the RabbitMQ application.
"""
mock_run = MagicMock(
return_value={"retcode": 0, "stdout": "saltstack", "stderr": ""}
)
with patch.dict(rabbitmq.__salt__, {"cmd.run_all": mock_run}):
assert rabbitmq.start_app() == "saltstack"
# 'reset' function tests: 1
def test_reset():
"""
Test if it return a RabbitMQ node to its virgin state
"""
mock_run = MagicMock(
return_value={"retcode": 0, "stdout": "saltstack", "stderr": ""}
)
with patch.dict(rabbitmq.__salt__, {"cmd.run_all": mock_run}):
assert rabbitmq.reset() == "saltstack"
# 'force_reset' function tests: 1
def test_force_reset():
"""
Test if it forcefully Return a RabbitMQ node to its virgin state
"""
mock_run = MagicMock(
return_value={"retcode": 0, "stdout": "saltstack", "stderr": ""}
)
with patch.dict(rabbitmq.__salt__, {"cmd.run_all": mock_run}):
assert rabbitmq.force_reset() == "saltstack"
# 'list_queues' function tests: 1
def test_list_queues():
"""
Test if it returns queue details of the / virtual host
"""
mock_run = MagicMock(
return_value={
"retcode": 0,
"stdout": "saltstack\t0\nceleryev.234-234\t10",
"stderr": "",
}
)
with patch.dict(rabbitmq.__salt__, {"cmd.run_all": mock_run}):
assert rabbitmq.list_queues() == {
"saltstack": ["0"],
"celeryev.234-234": ["10"],
}
# 'list_queues_vhost' function tests: 1
def test_list_queues_vhost():
"""
Test if it returns queue details of specified virtual host.
"""
mock_run = MagicMock(
return_value={
"retcode": 0,
"stdout": "saltstack\t0\nceleryev.234-234\t10",
"stderr": "",
}
)
with patch.dict(rabbitmq.__salt__, {"cmd.run_all": mock_run}):
assert rabbitmq.list_queues_vhost("consumers") == {
"saltstack": ["0"],
"celeryev.234-234": ["10"],
}
# 'list_policies' function tests: 3
def test_list_policies():
"""
Test if it return a dictionary of policies nested by vhost
and name based on the data returned from rabbitmqctl list_policies.
"""
mock_run = MagicMock(
return_value={"retcode": 0, "stdout": "saltstack", "stderr": ""}
)
mock_pkg = MagicMock(return_value="3.7")
with patch.dict(
rabbitmq.__salt__, {"cmd.run_all": mock_run, "pkg.version": mock_pkg}
), patch.dict(rabbitmq.__grains__, {"os_family": ""}):
assert rabbitmq.list_policies() == {}
def test_list_policies_freebsd():
"""
Test if it return a dictionary of policies nested by vhost
and name based on the data returned from rabbitmqctl list_policies.
"""
mock_run = MagicMock(
return_value={"retcode": 0, "stdout": "saltstack", "stderr": ""}
)
mock_pkg = MagicMock(return_value="3.7")
with patch.dict(
rabbitmq.__salt__, {"cmd.run_all": mock_run, "pkg.version": mock_pkg}
), patch.dict(rabbitmq.__grains__, {"os_family": "FreeBSD"}):
assert rabbitmq.list_policies() == {}
def test_list_policies_old_version():
"""
Test if it return a dictionary of policies nested by vhost
and name based on the data returned from rabbitmqctl list_policies.
"""
mock_run = MagicMock(
return_value={"retcode": 0, "stdout": "saltstack", "stderr": ""}
)
mock_pkg = MagicMock(return_value="3.0")
with patch.dict(
rabbitmq.__salt__, {"cmd.run_all": mock_run, "pkg.version": mock_pkg}
), patch.dict(rabbitmq.__grains__, {"os_family": ""}):
assert rabbitmq.list_policies() == {}
# 'set_policy' function tests: 1
def test_set_policy():
"""
Test if it set a policy based on rabbitmqctl set_policy.
"""
mock_run = MagicMock(
return_value={"retcode": 0, "stdout": "saltstack", "stderr": ""}
)
with patch.dict(rabbitmq.__salt__, {"cmd.run_all": mock_run}):
assert rabbitmq.set_policy("/", "HA", ".*", '{"ha-mode": "all"}') == {
"Set": "saltstack"
}
# 'delete_policy' function tests: 1
def test_delete_policy():
"""
Test if it delete a policy based on rabbitmqctl clear_policy.
"""
mock_run = MagicMock(
return_value={"retcode": 0, "stdout": "saltstack", "stderr": ""}
)
with patch.dict(rabbitmq.__salt__, {"cmd.run_all": mock_run}):
assert rabbitmq.delete_policy("/", "HA") == {"Deleted": "saltstack"}
# 'policy_exists' function tests: 1
def test_policy_exists():
"""
Test if it return whether the policy exists
based on rabbitmqctl list_policies.
"""
mock_run = MagicMock(
return_value={"retcode": 0, "stdout": "saltstack", "stderr": ""}
)
mock_pkg = MagicMock(return_value="3.0")
with patch.dict(
rabbitmq.__salt__, {"cmd.run_all": mock_run, "pkg.version": mock_pkg}
), patch.dict(rabbitmq.__grains__, {"os_family": ""}):
assert not rabbitmq.policy_exists("/", "HA")
# 'list_available_plugins' function tests: 2
def test_list_available_plugins():
"""
Test if it returns a list of plugins.
"""
mock_run = MagicMock(
return_value={"retcode": 0, "stdout": "saltstack\nsalt\nother", "stderr": ""}
)
mock_pkg = MagicMock(return_value="")
with patch.dict(
rabbitmq.__salt__, {"cmd.run_all": mock_run, "pkg.version": mock_pkg}
):
assert rabbitmq.list_available_plugins() == ["saltstack", "salt", "other"]
def test_list_available_plugins_space_delimited():
"""
Test if it returns a list of plugins.
"""
mock_run = MagicMock(
return_value={"retcode": 0, "stdout": "saltstack salt other", "stderr": ""}
)
mock_pkg = MagicMock(return_value="")
with patch.dict(
rabbitmq.__salt__, {"cmd.run_all": mock_run, "pkg.version": mock_pkg}
):
assert rabbitmq.list_available_plugins() == ["saltstack", "salt", "other"]
# 'list_enabled_plugins' function tests: 2
def test_list_enabled_plugins():
"""
Test if it returns a list of plugins.
"""
mock_run = MagicMock(
return_value={"retcode": 0, "stdout": "saltstack\nsalt\nother", "stderr": ""}
)
mock_pkg = MagicMock(return_value="")
with patch.dict(
rabbitmq.__salt__, {"cmd.run_all": mock_run, "pkg.version": mock_pkg}
):
assert rabbitmq.list_enabled_plugins() == ["saltstack", "salt", "other"]
def test_list_enabled_plugins_space_delimited():
"""
Test if it returns a list of plugins.
"""
mock_run = MagicMock(
return_value={"retcode": 0, "stdout": "saltstack salt other", "stderr": ""}
)
mock_pkg = MagicMock(return_value="")
with patch.dict(
rabbitmq.__salt__, {"cmd.run_all": mock_run, "pkg.version": mock_pkg}
):
assert rabbitmq.list_enabled_plugins() == ["saltstack", "salt", "other"]
# 'plugin_is_enabled' function tests: 2
def test_plugin_is_enabled():
"""
Test if it returns true for an enabled plugin.
"""
mock_run = MagicMock(
return_value={"retcode": 0, "stdout": "saltstack\nsalt\nother", "stderr": ""}
)
mock_pkg = MagicMock(return_value="")
with patch.dict(
rabbitmq.__salt__, {"cmd.run_all": mock_run, "pkg.version": mock_pkg}
):
assert rabbitmq.plugin_is_enabled("saltstack")
assert rabbitmq.plugin_is_enabled("salt")
assert rabbitmq.plugin_is_enabled("other")
def test_plugin_is_enabled_negative():
"""
Test if it returns false for a disabled plugin.
"""
mock_run = MagicMock(
return_value={"retcode": 0, "stdout": "saltstack\nother", "stderr": ""}
)
mock_pkg = MagicMock(return_value="")
with patch.dict(
rabbitmq.__salt__, {"cmd.run_all": mock_run, "pkg.version": mock_pkg}
):
assert not rabbitmq.plugin_is_enabled("salt")
assert not rabbitmq.plugin_is_enabled("stack")
assert not rabbitmq.plugin_is_enabled("random")
# 'enable_plugin' function tests: 1
def test_enable_plugin():
"""
Test if it enable a RabbitMQ plugin via the rabbitmq-plugins command.
"""
mock_run = MagicMock(
return_value={"retcode": 0, "stdout": "saltstack", "stderr": ""}
)
mock_pkg = MagicMock(return_value="")
with patch.dict(
rabbitmq.__salt__, {"cmd.run_all": mock_run, "pkg.version": mock_pkg}
):
assert rabbitmq.enable_plugin("salt") == {"Enabled": "saltstack"}
# 'disable_plugin' function tests: 1
def test_disable_plugin():
"""
Test if it disable a RabbitMQ plugin via the rabbitmq-plugins command.
"""
mock_run = MagicMock(
return_value={"retcode": 0, "stdout": "saltstack", "stderr": ""}
)
mock_pkg = MagicMock(return_value="")
with patch.dict(
rabbitmq.__salt__, {"cmd.run_all": mock_run, "pkg.version": mock_pkg}
):
assert rabbitmq.disable_plugin("salt") == {"Disabled": "saltstack"}
# 'list_upstreams' function tests: 1
def test_list_upstreams():
"""
Test if it returns a list of upstreams.
"""
mock_run = MagicMock(
return_value={
"retcode": 0,
"stdout": 'federation-upstream\tremote-name\t{"ack-mode":"on-confirm"'
',"max-hops":1,"trust-user-id":true,"uri":"amqp://username:'
'password@remote.fqdn"}',
"stderr": "",
}
)
mock_pkg = MagicMock(return_value="")
with patch.dict(
rabbitmq.__salt__, {"cmd.run_all": mock_run, "pkg.version": mock_pkg}
):
assert rabbitmq.list_upstreams() == {
"remote-name": (
'{"ack-mode":"on-confirm","max-hops":1,'
'"trust-user-id":true,"uri":"amqp://username:'
'password@remote.fqdn"}'
)
}
# 'upstream_exists' function tests: 2
def test_upstream_exists():
"""
Test whether a given rabbitmq-internal upstream exists based
on rabbitmqctl list_upstream.
"""
mock_run = MagicMock(
return_value={
"retcode": 0,
"stdout": 'federation-upstream\tremote-name\t{"ack-mode":"on-confirm"'
',"max-hops":1,"trust-user-id":true,"uri":"amqp://username:'
'password@remote.fqdn"}',
"stderr": "",
}
)
with patch.dict(rabbitmq.__salt__, {"cmd.run_all": mock_run}):
assert rabbitmq.upstream_exists("remote-name")
def test_upstream_exists_negative():
"""
Negative test of whether rabbitmq-internal upstream exists based
on rabbitmqctl list_upstream.
"""
mock_run = MagicMock(
return_value={
"retcode": 0,
"stdout": 'federation-upstream\tremote-name\t{"ack-mode":"on-confirm"'
',"max-hops":1,"trust-user-id":true,"uri":"amqp://username:'
'password@remote.fqdn"}',
"stderr": "",
}
)
with patch.dict(rabbitmq.__salt__, {"cmd.run_all": mock_run}):
assert not rabbitmq.upstream_exists("does-not-exist")
# 'add_upstream' function tests: 1
def test_set_upstream():
"""
Test if a rabbitMQ upstream gets configured properly.
"""
mock_run = MagicMock(
return_value={
"retcode": 0,
"stdout": (
'Setting runtime parameter "federation-upstream" for component '
'"remote-name" to "{"trust-user-id": true, "uri": '
'"amqp://username:password@remote.fqdn", "ack-mode": "on-confirm", '
'"max-hops": 1}" in vhost "/" ...'
),
"stderr": "",
}
)
with patch.dict(rabbitmq.__salt__, {"cmd.run_all": mock_run}):
assert rabbitmq.set_upstream(
"remote-name",
"amqp://username:password@remote.fqdn",
ack_mode="on-confirm",
max_hops=1,
trust_user_id=True,
)
# 'delete_upstream' function tests: 2
def test_delete_upstream():
"""
Test if an upstream gets deleted properly using rabbitmqctl delete_upstream.
"""
mock_run = MagicMock(
return_value={
"retcode": 0,
"stdout": (
'Clearing runtime parameter "remote-name" for component '
'"federation-upstream" on vhost "/" ...'
),
"stderr": "",
}
)
with patch.dict(rabbitmq.__salt__, {"cmd.run_all": mock_run}):
assert rabbitmq.delete_upstream("remote-name")
def test_delete_upstream_negative():
"""
Negative test trying to delete a non-existant upstream.
"""
mock_run = MagicMock(
return_value={
"retcode": 70,
"stdout": (
'Clearing runtime parameter "remote-name" for component '
'"federation-upstream" on vhost "/" ...'
),
"stderr": "Error:\nParameter does not exist",
}
)
with patch.dict(rabbitmq.__salt__, {"cmd.run_all": mock_run}):
pytest.raises(CommandExecutionError, rabbitmq.delete_upstream, "remote-name")

View file

@ -1,888 +0,0 @@
# -*- coding: utf-8 -*-
"""
:codeauthor: Jayesh Kariya <jayeshk@saltstack.com>
"""
# Import Python Libs
from __future__ import absolute_import, print_function, unicode_literals
# Import Salt Libs
import salt.modules.rabbitmq as rabbitmq
from salt.exceptions import CommandExecutionError
# Import Salt Testing Libs
from tests.support.mixins import LoaderModuleMockMixin
from tests.support.mock import MagicMock, patch
from tests.support.unit import TestCase
class RabbitmqTestCase(TestCase, LoaderModuleMockMixin):
"""
Test cases for salt.modules.rabbitmq
"""
def setup_loader_modules(self):
return {
rabbitmq: {"__context__": {"rabbitmqctl": None, "rabbitmq-plugins": None}}
}
# 'list_users_rabbitmq2' function tests: 1
def test_list_users_rabbitmq2(self):
"""
Test if it return a list of users based off of rabbitmqctl user_list.
"""
mock_run = MagicMock(
return_value={
"retcode": 0,
"stdout": "Listing users ...\nguest\t[administrator, user]\njustAnAdmin\t[administrator]\n",
"stderr": "",
}
)
with patch.dict(rabbitmq.__salt__, {"cmd.run_all": mock_run}):
self.assertDictEqual(
rabbitmq.list_users(),
{"guest": ["administrator", "user"], "justAnAdmin": ["administrator"]},
)
# 'list_users_rabbitmq3' function tests: 1
def test_list_users_rabbitmq3(self):
"""
Test if it return a list of users based off of rabbitmqctl user_list.
"""
mock_run = MagicMock(
return_value={
"retcode": 0,
"stdout": "guest\t[administrator user]\r\nother\t[a b]\r\n",
"stderr": "",
}
)
with patch.dict(rabbitmq.__salt__, {"cmd.run_all": mock_run}):
self.assertDictEqual(
rabbitmq.list_users(),
{"guest": ["administrator", "user"], "other": ["a", "b"]},
)
# 'list_users_with_warning_rabbitmq2' function tests: 1
def test_list_users_with_warning_rabbitmq2(self):
"""
Test if having a leading WARNING returns the user_list anyway.
"""
rtn_stdout = "\n".join(
[
"WARNING: ignoring /etc/rabbitmq/rabbitmq.conf -- location has moved to /etc/rabbitmq/rabbitmq-env.conf",
"Listing users ...",
"guest\t[administrator, user]\n",
]
)
mock_run = MagicMock(
return_value={"retcode": 0, "stdout": rtn_stdout, "stderr": ""}
)
with patch.dict(rabbitmq.__salt__, {"cmd.run_all": mock_run}):
self.assertDictEqual(
rabbitmq.list_users(), {"guest": ["administrator", "user"]}
)
# 'list_users_with_warning_rabbitmq3' function tests: 1
def test_list_users_with_warning_rabbitmq3(self):
"""
Test if having a leading WARNING returns the user_list anyway.
"""
rtn_stdout = "\n".join(
[
"WARNING: ignoring /etc/rabbitmq/rabbitmq.conf -- location has moved to /etc/rabbitmq/rabbitmq-env.conf",
"Listing users ...",
"guest\t[administrator user]\n",
]
)
mock_run = MagicMock(
return_value={"retcode": 0, "stdout": rtn_stdout, "stderr": ""}
)
with patch.dict(rabbitmq.__salt__, {"cmd.run_all": mock_run}):
self.assertDictEqual(
rabbitmq.list_users(), {"guest": ["administrator", "user"]}
)
# 'list_vhosts' function tests: 2
def test_list_vhosts(self):
"""
Test if it return a list of vhost based on rabbitmqctl list_vhosts.
"""
mock_run = MagicMock(
return_value={"retcode": 0, "stdout": "/\nsaltstack\n...", "stderr": ""}
)
with patch.dict(rabbitmq.__salt__, {"cmd.run_all": mock_run}):
self.assertListEqual(rabbitmq.list_vhosts(), ["/", "saltstack", "..."])
def test_list_vhosts_with_warning(self):
"""
Test if it return a list of vhost based on rabbitmqctl list_vhosts even with a leading WARNING.
"""
rtn_stdout = "\n".join(
[
"WARNING: ignoring /etc/rabbitmq/rabbitmq.conf -- location has moved to /etc/rabbitmq/rabbitmq-env.conf",
"Listing users ...",
"/",
"saltstack",
"...\n",
]
)
mock_run = MagicMock(
return_value={"retcode": 0, "stdout": rtn_stdout, "stderr": ""}
)
with patch.dict(rabbitmq.__salt__, {"cmd.run_all": mock_run}):
self.assertListEqual(rabbitmq.list_vhosts(), ["/", "saltstack", "..."])
# 'user_exists' function tests: 2
def test_user_exists(self):
"""
Test whether a given rabbitmq-internal user exists based
on rabbitmqctl list_users.
"""
mock_run = MagicMock(
return_value={
"retcode": 0,
"stdout": "Listing users ...\n" "saltstack\t[administrator]\n...done",
"stderr": "",
}
)
with patch.dict(rabbitmq.__salt__, {"cmd.run_all": mock_run}):
self.assertTrue(rabbitmq.user_exists("saltstack"))
def test_user_exists_negative(self):
"""
Negative test of whether rabbitmq-internal user exists based
on rabbitmqctl list_users.
"""
mock_run = MagicMock(
return_value={
"retcode": 0,
"stdout": "Listing users ...\n" "saltstack\t[administrator]\n...done",
"stderr": "",
}
)
with patch.dict(rabbitmq.__salt__, {"cmd.run_all": mock_run}):
self.assertFalse(rabbitmq.user_exists("salt"))
# 'vhost_exists' function tests: 2
def test_vhost_exists(self):
"""
Test if it return whether the vhost exists based
on rabbitmqctl list_vhosts.
"""
mock_run = MagicMock(
return_value={
"retcode": 0,
"stdout": "Listing vhosts ...\nsaltstack",
"stderr": "",
}
)
with patch.dict(rabbitmq.__salt__, {"cmd.run_all": mock_run}):
self.assertTrue(rabbitmq.vhost_exists("saltstack"))
def test_vhost_exists_negative(self):
"""
Test if it return whether the vhost exists based
on rabbitmqctl list_vhosts.
"""
mock_run = MagicMock(
return_value={
"retcode": 0,
"stdout": "Listing vhosts ...\nsaltstack",
"stderr": "",
}
)
with patch.dict(rabbitmq.__salt__, {"cmd.run_all": mock_run}):
self.assertFalse(rabbitmq.vhost_exists("salt"))
# 'add_user' function tests: 1
def test_add_user(self):
"""
Test if it add a rabbitMQ user via rabbitmqctl
user_add <user> <password>
"""
mock_run = MagicMock(
return_value={"retcode": 0, "stdout": "saltstack", "stderr": ""}
)
with patch.dict(rabbitmq.__salt__, {"cmd.run_all": mock_run}):
self.assertDictEqual(rabbitmq.add_user("saltstack"), {"Added": "saltstack"})
mock_run = MagicMock(return_value="Error")
with patch.dict(rabbitmq.__salt__, {"cmd.run_all": mock_run}):
with patch.object(
rabbitmq,
"clear_password",
return_value={"Error": "Error", "retcode": 1},
):
self.assertRaises(CommandExecutionError, rabbitmq.add_user, "saltstack")
# 'delete_user' function tests: 1
def test_delete_user(self):
"""
Test if it deletes a user via rabbitmqctl delete_user.
"""
mock_run = MagicMock(
return_value={"retcode": 0, "stdout": "saltstack", "stderr": ""}
)
with patch.dict(rabbitmq.__salt__, {"cmd.run_all": mock_run}):
self.assertDictEqual(
rabbitmq.delete_user("saltstack"), {"Deleted": "saltstack"}
)
# 'check_password' function tests: 2
def test_check_password_lt_38(self):
"""
Test if it checks a user's password for RabbitMQ less than v3.8.
"""
mock_run = MagicMock(return_value='{rabbit,"RabbitMQ","3.5.7"}')
mock_run2 = MagicMock(
return_value={
"retcode": 0,
"stdout": 'Authenticating user "saltstack" ...\nSuccess',
"stderr": "",
}
)
with patch.dict(
rabbitmq.__salt__, {"cmd.run": mock_run, "cmd.run_all": mock_run2}
):
self.assertEqual(rabbitmq.check_password("saltstack", "salt@123"), True)
def test_check_password_gt_38(self):
"""
Test if it checks a user's password for RabbitMQ greater than v3.8.
"""
mock_run = MagicMock(return_value="RabbitMQ version: 3.8.3")
mock_run2 = MagicMock(
return_value={
"retcode": 0,
"stdout": 'Authenticating user "saltstack" ...\nSuccess',
"stderr": "",
}
)
with patch.dict(
rabbitmq.__salt__, {"cmd.run": mock_run, "cmd.run_all": mock_run2}
):
self.assertEqual(rabbitmq.check_password("saltstack", "salt@123"), True)
# 'change_password' function tests: 1
def test_change_password(self):
"""
Test if it changes a user's password.
"""
mock_run = MagicMock(
return_value={"retcode": 0, "stdout": "saltstack", "stderr": ""}
)
with patch.dict(rabbitmq.__salt__, {"cmd.run_all": mock_run}):
self.assertDictEqual(
rabbitmq.change_password("saltstack", "salt@123"),
{"Password Changed": "saltstack"},
)
# 'clear_password' function tests: 1
def test_clear_password(self):
"""
Test if it removes a user's password.
"""
mock_run = MagicMock(
return_value={"retcode": 0, "stdout": "saltstack", "stderr": ""}
)
with patch.dict(rabbitmq.__salt__, {"cmd.run_all": mock_run}):
self.assertDictEqual(
rabbitmq.clear_password("saltstack"), {"Password Cleared": "saltstack"}
)
# 'add_vhost' function tests: 1
def test_add_vhost(self):
"""
Test if it adds a vhost via rabbitmqctl add_vhost.
"""
mock_run = MagicMock(
return_value={"retcode": 0, "stdout": "saltstack", "stderr": ""}
)
with patch.dict(rabbitmq.__salt__, {"cmd.run_all": mock_run}):
self.assertDictEqual(
rabbitmq.add_vhost("saltstack"), {"Added": "saltstack"}
)
# 'delete_vhost' function tests: 1
def test_delete_vhost(self):
"""
Test if it deletes a vhost rabbitmqctl delete_vhost.
"""
mock_run = MagicMock(
return_value={"retcode": 0, "stdout": "saltstack", "stderr": ""}
)
with patch.dict(rabbitmq.__salt__, {"cmd.run_all": mock_run}):
self.assertDictEqual(
rabbitmq.delete_vhost("saltstack"), {"Deleted": "saltstack"}
)
# 'set_permissions' function tests: 1
def test_set_permissions(self):
"""
Test if it sets permissions for vhost via rabbitmqctl set_permissions.
"""
mock_run = MagicMock(
return_value={"retcode": 0, "stdout": "saltstack", "stderr": ""}
)
with patch.dict(rabbitmq.__salt__, {"cmd.run_all": mock_run}):
self.assertDictEqual(
rabbitmq.set_permissions("myvhost", "myuser"),
{"Permissions Set": "saltstack"},
)
# 'list_permissions' function tests: 1
def test_list_permissions(self):
"""
Test if it lists permissions for a vhost
via rabbitmqctl list_permissions.
"""
mock_run = MagicMock(
return_value={
"retcode": 0,
"stdout": "Listing stuff ...\nsaltstack\tsaltstack\t.*\t1\nguest\t0\tone\n...done",
"stderr": "",
}
)
with patch.dict(rabbitmq.__salt__, {"cmd.run_all": mock_run}):
self.assertDictEqual(
rabbitmq.list_user_permissions("myuser"),
{"saltstack": ["saltstack", ".*", "1"], "guest": ["0", "one"]},
)
# 'list_user_permissions' function tests: 1
def test_list_user_permissions(self):
"""
Test if it list permissions for a user
via rabbitmqctl list_user_permissions.
"""
mock_run = MagicMock(
return_value={
"retcode": 0,
"stdout": "Listing stuff ...\nsaltstack\tsaltstack\t0\t1\nguest\t0\tone\n...done",
"stderr": "",
}
)
with patch.dict(rabbitmq.__salt__, {"cmd.run_all": mock_run}):
self.assertDictEqual(
rabbitmq.list_user_permissions("myuser"),
{"saltstack": ["saltstack", "0", "1"], "guest": ["0", "one"]},
)
# 'set_user_tags' function tests: 1
def test_set_user_tags(self):
"""
Test if it add user tags via rabbitmqctl set_user_tags.
"""
mock_run = MagicMock(
return_value={"retcode": 0, "stdout": "saltstack", "stderr": ""}
)
with patch.dict(rabbitmq.__salt__, {"cmd.run_all": mock_run}):
self.assertDictEqual(
rabbitmq.set_user_tags("myadmin", "admin"), {"Tag(s) set": "saltstack"}
)
# 'status' function tests: 1
def test_status(self):
"""
Test if it return rabbitmq status.
"""
mock_run = MagicMock(
return_value={"retcode": 0, "stdout": "saltstack", "stderr": ""}
)
with patch.dict(rabbitmq.__salt__, {"cmd.run_all": mock_run}):
self.assertEqual(rabbitmq.status(), "saltstack")
# 'cluster_status' function tests: 1
def test_cluster_status(self):
"""
Test if it return rabbitmq cluster_status.
"""
mock_run = MagicMock(
return_value={"retcode": 0, "stdout": "saltstack", "stderr": ""}
)
with patch.dict(rabbitmq.__salt__, {"cmd.run_all": mock_run}):
self.assertEqual(rabbitmq.cluster_status(), "saltstack")
# 'join_cluster' function tests: 1
def test_join_cluster(self):
"""
Test if it join a rabbit cluster.
"""
mock_run = MagicMock(
return_value={"retcode": 0, "stdout": "saltstack", "stderr": ""}
)
with patch.dict(rabbitmq.__salt__, {"cmd.run_all": mock_run}):
self.assertDictEqual(
rabbitmq.join_cluster("rabbit.example.com"), {"Join": "saltstack"}
)
# 'stop_app' function tests: 1
def test_stop_app(self):
"""
Test if it stops the RabbitMQ application,
leaving the Erlang node running.
"""
mock_run = MagicMock(
return_value={"retcode": 0, "stdout": "saltstack", "stderr": ""}
)
with patch.dict(rabbitmq.__salt__, {"cmd.run_all": mock_run}):
self.assertEqual(rabbitmq.stop_app(), "saltstack")
# 'start_app' function tests: 1
def test_start_app(self):
"""
Test if it start the RabbitMQ application.
"""
mock_run = MagicMock(
return_value={"retcode": 0, "stdout": "saltstack", "stderr": ""}
)
with patch.dict(rabbitmq.__salt__, {"cmd.run_all": mock_run}):
self.assertEqual(rabbitmq.start_app(), "saltstack")
# 'reset' function tests: 1
def test_reset(self):
"""
Test if it return a RabbitMQ node to its virgin state
"""
mock_run = MagicMock(
return_value={"retcode": 0, "stdout": "saltstack", "stderr": ""}
)
with patch.dict(rabbitmq.__salt__, {"cmd.run_all": mock_run}):
self.assertEqual(rabbitmq.reset(), "saltstack")
# 'force_reset' function tests: 1
def test_force_reset(self):
"""
Test if it forcefully Return a RabbitMQ node to its virgin state
"""
mock_run = MagicMock(
return_value={"retcode": 0, "stdout": "saltstack", "stderr": ""}
)
with patch.dict(rabbitmq.__salt__, {"cmd.run_all": mock_run}):
self.assertEqual(rabbitmq.force_reset(), "saltstack")
# 'list_queues' function tests: 1
def test_list_queues(self):
"""
Test if it returns queue details of the / virtual host
"""
mock_run = MagicMock(
return_value={
"retcode": 0,
"stdout": "saltstack\t0\nceleryev.234-234\t10",
"stderr": "",
}
)
with patch.dict(rabbitmq.__salt__, {"cmd.run_all": mock_run}):
self.assertDictEqual(
rabbitmq.list_queues(), {"saltstack": ["0"], "celeryev.234-234": ["10"]}
)
# 'list_queues_vhost' function tests: 1
def test_list_queues_vhost(self):
"""
Test if it returns queue details of specified virtual host.
"""
mock_run = MagicMock(
return_value={
"retcode": 0,
"stdout": "saltstack\t0\nceleryev.234-234\t10",
"stderr": "",
}
)
with patch.dict(rabbitmq.__salt__, {"cmd.run_all": mock_run}):
self.assertDictEqual(
rabbitmq.list_queues_vhost("consumers"),
{"saltstack": ["0"], "celeryev.234-234": ["10"]},
)
# 'list_policies' function tests: 3
def test_list_policies(self):
"""
Test if it return a dictionary of policies nested by vhost
and name based on the data returned from rabbitmqctl list_policies.
"""
mock_run = MagicMock(
return_value={"retcode": 0, "stdout": "saltstack", "stderr": ""}
)
mock_pkg = MagicMock(return_value="3.7")
with patch.dict(
rabbitmq.__salt__, {"cmd.run_all": mock_run, "pkg.version": mock_pkg}
), patch.dict(rabbitmq.__grains__, {"os_family": ""}):
self.assertDictEqual(rabbitmq.list_policies(), {})
def test_list_policies_freebsd(self):
"""
Test if it return a dictionary of policies nested by vhost
and name based on the data returned from rabbitmqctl list_policies.
"""
mock_run = MagicMock(
return_value={"retcode": 0, "stdout": "saltstack", "stderr": ""}
)
mock_pkg = MagicMock(return_value="3.7")
with patch.dict(
rabbitmq.__salt__, {"cmd.run_all": mock_run, "pkg.version": mock_pkg}
), patch.dict(rabbitmq.__grains__, {"os_family": "FreeBSD"}):
self.assertDictEqual(rabbitmq.list_policies(), {})
def test_list_policies_old_version(self):
"""
Test if it return a dictionary of policies nested by vhost
and name based on the data returned from rabbitmqctl list_policies.
"""
mock_run = MagicMock(
return_value={"retcode": 0, "stdout": "saltstack", "stderr": ""}
)
mock_pkg = MagicMock(return_value="3.0")
with patch.dict(
rabbitmq.__salt__, {"cmd.run_all": mock_run, "pkg.version": mock_pkg}
), patch.dict(rabbitmq.__grains__, {"os_family": ""}):
self.assertDictEqual(rabbitmq.list_policies(), {})
# 'set_policy' function tests: 1
def test_set_policy(self):
"""
Test if it set a policy based on rabbitmqctl set_policy.
"""
mock_run = MagicMock(
return_value={"retcode": 0, "stdout": "saltstack", "stderr": ""}
)
with patch.dict(rabbitmq.__salt__, {"cmd.run_all": mock_run}):
self.assertDictEqual(
rabbitmq.set_policy("/", "HA", ".*", '{"ha-mode": "all"}'),
{"Set": "saltstack"},
)
# 'delete_policy' function tests: 1
def test_delete_policy(self):
"""
Test if it delete a policy based on rabbitmqctl clear_policy.
"""
mock_run = MagicMock(
return_value={"retcode": 0, "stdout": "saltstack", "stderr": ""}
)
with patch.dict(rabbitmq.__salt__, {"cmd.run_all": mock_run}):
self.assertDictEqual(
rabbitmq.delete_policy("/", "HA"), {"Deleted": "saltstack"}
)
# 'policy_exists' function tests: 1
def test_policy_exists(self):
"""
Test if it return whether the policy exists
based on rabbitmqctl list_policies.
"""
mock_run = MagicMock(
return_value={"retcode": 0, "stdout": "saltstack", "stderr": ""}
)
mock_pkg = MagicMock(return_value="3.0")
with patch.dict(
rabbitmq.__salt__, {"cmd.run_all": mock_run, "pkg.version": mock_pkg}
), patch.dict(rabbitmq.__grains__, {"os_family": ""}):
self.assertFalse(rabbitmq.policy_exists("/", "HA"))
# 'list_available_plugins' function tests: 2
def test_list_available_plugins(self):
"""
Test if it returns a list of plugins.
"""
mock_run = MagicMock(
return_value={
"retcode": 0,
"stdout": "saltstack\nsalt\nother",
"stderr": "",
}
)
mock_pkg = MagicMock(return_value="")
with patch.dict(
rabbitmq.__salt__, {"cmd.run_all": mock_run, "pkg.version": mock_pkg}
):
self.assertListEqual(
rabbitmq.list_available_plugins(), ["saltstack", "salt", "other"]
)
def test_list_available_plugins_space_delimited(self):
"""
Test if it returns a list of plugins.
"""
mock_run = MagicMock(
return_value={"retcode": 0, "stdout": "saltstack salt other", "stderr": ""}
)
mock_pkg = MagicMock(return_value="")
with patch.dict(
rabbitmq.__salt__, {"cmd.run_all": mock_run, "pkg.version": mock_pkg}
):
self.assertListEqual(
rabbitmq.list_available_plugins(), ["saltstack", "salt", "other"]
)
# 'list_enabled_plugins' function tests: 2
def test_list_enabled_plugins(self):
"""
Test if it returns a list of plugins.
"""
mock_run = MagicMock(
return_value={
"retcode": 0,
"stdout": "saltstack\nsalt\nother",
"stderr": "",
}
)
mock_pkg = MagicMock(return_value="")
with patch.dict(
rabbitmq.__salt__, {"cmd.run_all": mock_run, "pkg.version": mock_pkg}
):
self.assertListEqual(
rabbitmq.list_enabled_plugins(), ["saltstack", "salt", "other"]
)
def test_list_enabled_plugins_space_delimited(self):
"""
Test if it returns a list of plugins.
"""
mock_run = MagicMock(
return_value={"retcode": 0, "stdout": "saltstack salt other", "stderr": ""}
)
mock_pkg = MagicMock(return_value="")
with patch.dict(
rabbitmq.__salt__, {"cmd.run_all": mock_run, "pkg.version": mock_pkg}
):
self.assertListEqual(
rabbitmq.list_enabled_plugins(), ["saltstack", "salt", "other"]
)
# 'plugin_is_enabled' function tests: 2
def test_plugin_is_enabled(self):
"""
Test if it returns true for an enabled plugin.
"""
mock_run = MagicMock(
return_value={
"retcode": 0,
"stdout": "saltstack\nsalt\nother",
"stderr": "",
}
)
mock_pkg = MagicMock(return_value="")
with patch.dict(
rabbitmq.__salt__, {"cmd.run_all": mock_run, "pkg.version": mock_pkg}
):
self.assertTrue(rabbitmq.plugin_is_enabled("saltstack"))
self.assertTrue(rabbitmq.plugin_is_enabled("salt"))
self.assertTrue(rabbitmq.plugin_is_enabled("other"))
def test_plugin_is_enabled_negative(self):
"""
Test if it returns false for a disabled plugin.
"""
mock_run = MagicMock(
return_value={"retcode": 0, "stdout": "saltstack\nother", "stderr": ""}
)
mock_pkg = MagicMock(return_value="")
with patch.dict(
rabbitmq.__salt__, {"cmd.run_all": mock_run, "pkg.version": mock_pkg}
):
self.assertFalse(rabbitmq.plugin_is_enabled("salt"))
self.assertFalse(rabbitmq.plugin_is_enabled("stack"))
self.assertFalse(rabbitmq.plugin_is_enabled("random"))
# 'enable_plugin' function tests: 1
def test_enable_plugin(self):
"""
Test if it enable a RabbitMQ plugin via the rabbitmq-plugins command.
"""
mock_run = MagicMock(
return_value={"retcode": 0, "stdout": "saltstack", "stderr": ""}
)
mock_pkg = MagicMock(return_value="")
with patch.dict(
rabbitmq.__salt__, {"cmd.run_all": mock_run, "pkg.version": mock_pkg}
):
self.assertDictEqual(
rabbitmq.enable_plugin("salt"), {"Enabled": "saltstack"}
)
# 'disable_plugin' function tests: 1
def test_disable_plugin(self):
"""
Test if it disable a RabbitMQ plugin via the rabbitmq-plugins command.
"""
mock_run = MagicMock(
return_value={"retcode": 0, "stdout": "saltstack", "stderr": ""}
)
mock_pkg = MagicMock(return_value="")
with patch.dict(
rabbitmq.__salt__, {"cmd.run_all": mock_run, "pkg.version": mock_pkg}
):
self.assertDictEqual(
rabbitmq.disable_plugin("salt"), {"Disabled": "saltstack"}
)
# 'list_upstreams' function tests: 1
def test_list_upstreams(self):
"""
Test if it returns a list of upstreams.
"""
mock_run = MagicMock(
return_value={
"retcode": 0,
"stdout": 'federation-upstream\tremote-name\t{"ack-mode":"on-confirm"'
',"max-hops":1,"trust-user-id":true,"uri":"amqp://username:'
'password@remote.fqdn"}',
"stderr": "",
}
)
mock_pkg = MagicMock(return_value="")
with patch.dict(
rabbitmq.__salt__, {"cmd.run_all": mock_run, "pkg.version": mock_pkg}
):
self.assertDictEqual(
rabbitmq.list_upstreams(),
{
"remote-name": (
'{"ack-mode":"on-confirm","max-hops":1,'
'"trust-user-id":true,"uri":"amqp://username:'
'password@remote.fqdn"}'
)
},
)
# 'upstream_exists' function tests: 2
def test_upstream_exists(self):
"""
Test whether a given rabbitmq-internal upstream exists based
on rabbitmqctl list_upstream.
"""
mock_run = MagicMock(
return_value={
"retcode": 0,
"stdout": 'federation-upstream\tremote-name\t{"ack-mode":"on-confirm"'
',"max-hops":1,"trust-user-id":true,"uri":"amqp://username:'
'password@remote.fqdn"}',
"stderr": "",
}
)
with patch.dict(rabbitmq.__salt__, {"cmd.run_all": mock_run}):
self.assertTrue(rabbitmq.upstream_exists("remote-name"))
def test_upstream_exists_negative(self):
"""
Negative test of whether rabbitmq-internal upstream exists based
on rabbitmqctl list_upstream.
"""
mock_run = MagicMock(
return_value={
"retcode": 0,
"stdout": 'federation-upstream\tremote-name\t{"ack-mode":"on-confirm"'
',"max-hops":1,"trust-user-id":true,"uri":"amqp://username:'
'password@remote.fqdn"}',
"stderr": "",
}
)
with patch.dict(rabbitmq.__salt__, {"cmd.run_all": mock_run}):
self.assertFalse(rabbitmq.upstream_exists("does-not-exist"))
# 'add_upstream' function tests: 1
def test_set_upstream(self):
"""
Test if a rabbitMQ upstream gets configured properly.
"""
mock_run = MagicMock(
return_value={
"retcode": 0,
"stdout": (
'Setting runtime parameter "federation-upstream" for component '
'"remote-name" to "{"trust-user-id": true, "uri": '
'"amqp://username:password@remote.fqdn", "ack-mode": "on-confirm", '
'"max-hops": 1}" in vhost "/" ...'
),
"stderr": "",
}
)
with patch.dict(rabbitmq.__salt__, {"cmd.run_all": mock_run}):
self.assertTrue(
rabbitmq.set_upstream(
"remote-name",
"amqp://username:password@remote.fqdn",
ack_mode="on-confirm",
max_hops=1,
trust_user_id=True,
)
)
# 'delete_upstream' function tests: 2
def test_delete_upstream(self):
"""
Test if an upstream gets deleted properly using rabbitmqctl delete_upstream.
"""
mock_run = MagicMock(
return_value={
"retcode": 0,
"stdout": (
'Clearing runtime parameter "remote-name" for component '
'"federation-upstream" on vhost "/" ...'
),
"stderr": "",
}
)
with patch.dict(rabbitmq.__salt__, {"cmd.run_all": mock_run}):
self.assertTrue(rabbitmq.delete_upstream("remote-name"))
def test_delete_upstream_negative(self):
"""
Negative test trying to delete a non-existant upstream.
"""
mock_run = MagicMock(
return_value={
"retcode": 70,
"stdout": (
'Clearing runtime parameter "remote-name" for component '
'"federation-upstream" on vhost "/" ...'
),
"stderr": "Error:\nParameter does not exist",
}
)
with patch.dict(rabbitmq.__salt__, {"cmd.run_all": mock_run}):
self.assertRaises(
CommandExecutionError, rabbitmq.delete_upstream, "remote-name"
)