mirror of
https://github.com/saltstack/salt.git
synced 2025-04-17 10:10:20 +00:00
3535 lines
135 KiB
Python
3535 lines
135 KiB
Python
"""
|
|
:codeauthor: Nicole Thomas <nicole@saltstack.com>
|
|
:codeauthor: Alexandru Bleotu <alexandru.bleotu@morganstanley.com>
|
|
|
|
Tests for functions in salt.modules.vsphere
|
|
"""
|
|
|
|
import salt.modules.vsphere as vsphere
|
|
import salt.utils.args
|
|
import salt.utils.vmware
|
|
from salt.exceptions import (
|
|
ArgumentValueError,
|
|
CommandExecutionError,
|
|
VMwareObjectRetrievalError,
|
|
VMwareSaltError,
|
|
)
|
|
from tests.support.mixins import LoaderModuleMockMixin
|
|
from tests.support.mock import MagicMock, Mock, call, patch
|
|
from tests.support.unit import TestCase, skipIf
|
|
|
|
try:
|
|
from pyVmomi import vim, vmodl # pylint: disable=unused-import,no-name-in-module
|
|
|
|
HAS_PYVMOMI = True
|
|
except ImportError:
|
|
HAS_PYVMOMI = False
|
|
|
|
try:
|
|
from com.vmware.vapi.std_client import DynamicID # pylint: disable=unused-import
|
|
|
|
HAS_VSPHERE_SDK = True
|
|
except ImportError:
|
|
HAS_VSPHERE_SDK = False
|
|
|
|
|
|
# Globals
|
|
HOST = "1.2.3.4"
|
|
USER = "root"
|
|
PASSWORD = "SuperSecret!"
|
|
ERROR = "Some Testing Error Message"
|
|
|
|
|
|
class VsphereTestCase(TestCase, LoaderModuleMockMixin):
|
|
"""
|
|
Unit TestCase for the salt.modules.vsphere module.
|
|
"""
|
|
|
|
def setup_loader_modules(self):
|
|
return {vsphere: {}}
|
|
|
|
# Tests for get_coredump_network_config function
|
|
|
|
def test_get_coredump_network_config_esxi_hosts_not_list(self):
|
|
"""
|
|
Tests CommandExecutionError is raised when esxi_hosts is provided,
|
|
but is not a list.
|
|
"""
|
|
self.assertRaises(
|
|
CommandExecutionError,
|
|
vsphere.get_coredump_network_config,
|
|
HOST,
|
|
USER,
|
|
PASSWORD,
|
|
esxi_hosts="foo",
|
|
)
|
|
|
|
def test_get_coredump_network_config_host_list_bad_retcode(self):
|
|
"""
|
|
Tests error message returned with list of esxi_hosts.
|
|
"""
|
|
with patch(
|
|
"salt.utils.vmware.esxcli",
|
|
MagicMock(return_value={"retcode": 1, "stdout": ERROR}),
|
|
):
|
|
host_1 = "host_1.foo.com"
|
|
self.assertEqual(
|
|
{host_1: {"Error": ERROR}},
|
|
vsphere.get_coredump_network_config(
|
|
HOST, USER, PASSWORD, esxi_hosts=[host_1]
|
|
),
|
|
)
|
|
|
|
def test_get_coredump_network_config_host_list_success(self):
|
|
"""
|
|
Tests successful function return when an esxi_host is provided.
|
|
"""
|
|
with patch(
|
|
"salt.utils.vmware.esxcli",
|
|
MagicMock(return_value={"retcode": 0, "stdout": ""}),
|
|
):
|
|
with patch(
|
|
"salt.modules.vsphere._format_coredump_stdout",
|
|
MagicMock(return_value={}),
|
|
):
|
|
host_1 = "host_1.foo.com"
|
|
self.assertEqual(
|
|
{host_1: {"Coredump Config": {}}},
|
|
vsphere.get_coredump_network_config(
|
|
HOST, USER, PASSWORD, esxi_hosts=[host_1]
|
|
),
|
|
)
|
|
|
|
def test_get_coredump_network_config_bad_retcode(self):
|
|
"""
|
|
Tests error message given for a single ESXi host.
|
|
"""
|
|
with patch(
|
|
"salt.utils.vmware.esxcli",
|
|
MagicMock(return_value={"retcode": 1, "stdout": ERROR}),
|
|
):
|
|
self.assertEqual(
|
|
{HOST: {"Error": ERROR}},
|
|
vsphere.get_coredump_network_config(HOST, USER, PASSWORD),
|
|
)
|
|
|
|
def test_get_coredump_network_config_success(self):
|
|
"""
|
|
Tests successful function return for a single ESXi host.
|
|
"""
|
|
with patch(
|
|
"salt.utils.vmware.esxcli",
|
|
MagicMock(return_value={"retcode": 0, "stdout": ""}),
|
|
):
|
|
with patch(
|
|
"salt.modules.vsphere._format_coredump_stdout",
|
|
MagicMock(return_value={}),
|
|
):
|
|
self.assertEqual(
|
|
{HOST: {"Coredump Config": {}}},
|
|
vsphere.get_coredump_network_config(HOST, USER, PASSWORD),
|
|
)
|
|
|
|
# Tests for coredump_network_enable function
|
|
|
|
def test_coredump_network_enable_esxi_hosts_not_list(self):
|
|
"""
|
|
Tests CommandExecutionError is raised when esxi_hosts is provided,
|
|
but is not a list.
|
|
"""
|
|
self.assertRaises(
|
|
CommandExecutionError,
|
|
vsphere.coredump_network_enable,
|
|
HOST,
|
|
USER,
|
|
PASSWORD,
|
|
True,
|
|
esxi_hosts="foo",
|
|
)
|
|
|
|
def test_coredump_network_enable_host_list_bad_retcode(self):
|
|
"""
|
|
Tests error message returned with list of esxi_hosts.
|
|
"""
|
|
with patch(
|
|
"salt.utils.vmware.esxcli",
|
|
MagicMock(return_value={"retcode": 1, "stdout": ERROR}),
|
|
):
|
|
host_1 = "host_1.foo.com"
|
|
self.assertEqual(
|
|
{host_1: {"Error": ERROR}},
|
|
vsphere.coredump_network_enable(
|
|
HOST, USER, PASSWORD, True, esxi_hosts=[host_1]
|
|
),
|
|
)
|
|
|
|
def test_coredump_network_enable_host_list_success(self):
|
|
"""
|
|
Tests successful function return when an esxi_host is provided.
|
|
"""
|
|
with patch(
|
|
"salt.utils.vmware.esxcli",
|
|
MagicMock(return_value={"retcode": 0, "stdout": ""}),
|
|
):
|
|
with patch(
|
|
"salt.modules.vsphere._format_coredump_stdout",
|
|
MagicMock(return_value={}),
|
|
):
|
|
enabled = True
|
|
host_1 = "host_1.foo.com"
|
|
self.assertEqual(
|
|
{host_1: {"Coredump Enabled": enabled}},
|
|
vsphere.coredump_network_enable(
|
|
HOST, USER, PASSWORD, enabled, esxi_hosts=[host_1]
|
|
),
|
|
)
|
|
|
|
def test_coredump_network_enable_bad_retcode(self):
|
|
"""
|
|
Tests error message given for a single ESXi host.
|
|
"""
|
|
with patch(
|
|
"salt.utils.vmware.esxcli",
|
|
MagicMock(return_value={"retcode": 1, "stdout": ERROR}),
|
|
):
|
|
self.assertEqual(
|
|
{HOST: {"Error": ERROR}},
|
|
vsphere.coredump_network_enable(HOST, USER, PASSWORD, True),
|
|
)
|
|
|
|
def test_coredump_network_enable_success(self):
|
|
"""
|
|
Tests successful function return for a single ESXi host.
|
|
"""
|
|
with patch(
|
|
"salt.utils.vmware.esxcli",
|
|
MagicMock(return_value={"retcode": 0, "stdout": ""}),
|
|
):
|
|
with patch(
|
|
"salt.modules.vsphere._format_coredump_stdout",
|
|
MagicMock(return_value={}),
|
|
):
|
|
enabled = True
|
|
self.assertEqual(
|
|
{HOST: {"Coredump Enabled": enabled}},
|
|
vsphere.coredump_network_enable(HOST, USER, PASSWORD, enabled),
|
|
)
|
|
|
|
# Tests for set_coredump_network_config function
|
|
|
|
def test_set_coredump_network_config_esxi_hosts_not_list(self):
|
|
"""
|
|
Tests CommandExecutionError is raised when esxi_hosts is provided,
|
|
but is not a list.
|
|
"""
|
|
self.assertRaises(
|
|
CommandExecutionError,
|
|
vsphere.set_coredump_network_config,
|
|
HOST,
|
|
USER,
|
|
PASSWORD,
|
|
"loghost",
|
|
"foo",
|
|
esxi_hosts="bar",
|
|
)
|
|
|
|
def test_set_coredump_network_config_host_list_bad_retcode(self):
|
|
"""
|
|
Tests error message returned with list of esxi_hosts.
|
|
"""
|
|
with patch("salt.utils.vmware.esxcli", MagicMock(return_value={"retcode": 1})):
|
|
host_1 = "host_1.foo.com"
|
|
self.assertEqual(
|
|
{host_1: {"retcode": 1, "success": False}},
|
|
vsphere.set_coredump_network_config(
|
|
HOST, USER, PASSWORD, "dump-ip.test.com", esxi_hosts=[host_1]
|
|
),
|
|
)
|
|
|
|
def test_set_coredump_network_config_host_list_success(self):
|
|
"""
|
|
Tests successful function return when an esxi_host is provided.
|
|
"""
|
|
with patch("salt.utils.vmware.esxcli", MagicMock(return_value={"retcode": 0})):
|
|
host_1 = "host_1.foo.com"
|
|
self.assertEqual(
|
|
{host_1: {"retcode": 0, "success": True}},
|
|
vsphere.set_coredump_network_config(
|
|
HOST, USER, PASSWORD, "dump-ip.test.com", esxi_hosts=[host_1]
|
|
),
|
|
)
|
|
|
|
def test_set_coredump_network_config_bad_retcode(self):
|
|
"""
|
|
Tests error message given for a single ESXi host.
|
|
"""
|
|
with patch("salt.utils.vmware.esxcli", MagicMock(return_value={"retcode": 1})):
|
|
self.assertEqual(
|
|
{HOST: {"retcode": 1, "success": False}},
|
|
vsphere.set_coredump_network_config(
|
|
HOST, USER, PASSWORD, "dump-ip.test.com"
|
|
),
|
|
)
|
|
|
|
def test_set_coredump_network_config_success(self):
|
|
"""
|
|
Tests successful function return for a single ESXi host.
|
|
"""
|
|
with patch("salt.utils.vmware.esxcli", MagicMock(return_value={"retcode": 0})):
|
|
self.assertEqual(
|
|
{HOST: {"retcode": 0, "success": True}},
|
|
vsphere.set_coredump_network_config(
|
|
HOST, USER, PASSWORD, "dump-ip.test.com"
|
|
),
|
|
)
|
|
|
|
# Tests for get_firewall_status function
|
|
|
|
def test_get_firewall_status_esxi_hosts_not_list(self):
|
|
"""
|
|
Tests CommandExecutionError is raised when esxi_hosts is provided,
|
|
but is not a list.
|
|
"""
|
|
self.assertRaises(
|
|
CommandExecutionError,
|
|
vsphere.get_firewall_status,
|
|
HOST,
|
|
USER,
|
|
PASSWORD,
|
|
esxi_hosts="foo",
|
|
)
|
|
|
|
def test_get_firewall_status_host_list_bad_retcode(self):
|
|
"""
|
|
Tests error message returned with list of esxi_hosts.
|
|
"""
|
|
with patch(
|
|
"salt.utils.vmware.esxcli",
|
|
MagicMock(return_value={"retcode": 1, "stdout": ERROR}),
|
|
):
|
|
host_1 = "host_1.foo.com"
|
|
self.assertEqual(
|
|
{host_1: {"success": False, "Error": ERROR, "rulesets": None}},
|
|
vsphere.get_firewall_status(HOST, USER, PASSWORD, esxi_hosts=[host_1]),
|
|
)
|
|
|
|
def test_get_firewall_status_host_list_success(self):
|
|
"""
|
|
Tests successful function return when an esxi_host is provided.
|
|
"""
|
|
with patch(
|
|
"salt.utils.vmware.esxcli",
|
|
MagicMock(return_value={"retcode": 0, "stdout": ""}),
|
|
):
|
|
host_1 = "host_1.foo.com"
|
|
self.assertEqual(
|
|
{host_1: {"rulesets": {}, "success": True}},
|
|
vsphere.get_firewall_status(HOST, USER, PASSWORD, esxi_hosts=[host_1]),
|
|
)
|
|
|
|
def test_get_firewall_status_bad_retcode(self):
|
|
"""
|
|
Tests error message given for a single ESXi host.
|
|
"""
|
|
with patch(
|
|
"salt.utils.vmware.esxcli",
|
|
MagicMock(return_value={"retcode": 1, "stdout": ERROR}),
|
|
):
|
|
self.assertEqual(
|
|
{HOST: {"success": False, "Error": ERROR, "rulesets": None}},
|
|
vsphere.get_firewall_status(HOST, USER, PASSWORD),
|
|
)
|
|
|
|
def test_get_firewall_status_success(self):
|
|
"""
|
|
Tests successful function return for a single ESXi host.
|
|
"""
|
|
with patch(
|
|
"salt.utils.vmware.esxcli",
|
|
MagicMock(return_value={"retcode": 0, "stdout": ""}),
|
|
):
|
|
self.assertEqual(
|
|
{HOST: {"rulesets": {}, "success": True}},
|
|
vsphere.get_firewall_status(HOST, USER, PASSWORD),
|
|
)
|
|
|
|
# Tests for enable_firewall_ruleset function
|
|
|
|
def test_enable_firewall_ruleset_esxi_hosts_not_list(self):
|
|
"""
|
|
Tests CommandExecutionError is raised when esxi_hosts is provided,
|
|
but is not a list.
|
|
"""
|
|
self.assertRaises(
|
|
CommandExecutionError,
|
|
vsphere.enable_firewall_ruleset,
|
|
HOST,
|
|
USER,
|
|
PASSWORD,
|
|
"foo",
|
|
"bar",
|
|
esxi_hosts="baz",
|
|
)
|
|
|
|
# Tests for syslog_service_reload function
|
|
|
|
def test_syslog_service_reload_esxi_hosts_not_list(self):
|
|
"""
|
|
Tests CommandExecutionError is raised when esxi_hosts is provided,
|
|
but is not a list.
|
|
"""
|
|
self.assertRaises(
|
|
CommandExecutionError,
|
|
vsphere.syslog_service_reload,
|
|
HOST,
|
|
USER,
|
|
PASSWORD,
|
|
esxi_hosts="foo",
|
|
)
|
|
|
|
# Tests for set_syslog_config function.
|
|
# These tests only test the firewall=True and syslog_config == 'loghost' if block.
|
|
# The rest of the function is tested in the _set_syslog_config_helper tests below.
|
|
|
|
def test_set_syslog_config_esxi_hosts_not_list(self):
|
|
"""
|
|
Tests CommandExecutionError is raised when esxi_hosts is provided,
|
|
but is not a list, but we don't enter the 'loghost'/firewall loop.
|
|
"""
|
|
self.assertRaises(
|
|
CommandExecutionError,
|
|
vsphere.set_syslog_config,
|
|
HOST,
|
|
USER,
|
|
PASSWORD,
|
|
"foo",
|
|
"bar",
|
|
esxi_hosts="baz",
|
|
)
|
|
|
|
def test_set_syslog_config_esxi_hosts_not_list_firewall(self):
|
|
"""
|
|
Tests CommandExecutionError is raised when esxi_hosts is provided,
|
|
but is not a list, and we enter the 'loghost'/firewall loop.
|
|
"""
|
|
self.assertRaises(
|
|
CommandExecutionError,
|
|
vsphere.set_syslog_config,
|
|
HOST,
|
|
USER,
|
|
PASSWORD,
|
|
"loghost",
|
|
"foo",
|
|
firewall=True,
|
|
esxi_hosts="bar",
|
|
)
|
|
|
|
def test_set_syslog_config_host_list_firewall_bad_retcode(self):
|
|
"""
|
|
Tests error message returned with list of esxi_hosts with 'loghost' as syslog_config.
|
|
"""
|
|
with patch(
|
|
"salt.modules.vsphere.enable_firewall_ruleset",
|
|
MagicMock(return_value={"host_1.foo.com": {"retcode": 1, "stdout": ERROR}}),
|
|
):
|
|
with patch(
|
|
"salt.modules.vsphere._set_syslog_config_helper",
|
|
MagicMock(return_value={}),
|
|
):
|
|
host_1 = "host_1.foo.com"
|
|
self.assertEqual(
|
|
{host_1: {"enable_firewall": {"message": ERROR, "success": False}}},
|
|
vsphere.set_syslog_config(
|
|
HOST,
|
|
USER,
|
|
PASSWORD,
|
|
"loghost",
|
|
"foo",
|
|
firewall=True,
|
|
esxi_hosts=[host_1],
|
|
),
|
|
)
|
|
|
|
def test_set_syslog_config_host_list_firewall_success(self):
|
|
"""
|
|
Tests successful function return with list of esxi_hosts with 'loghost' as syslog_config.
|
|
"""
|
|
with patch(
|
|
"salt.modules.vsphere.enable_firewall_ruleset",
|
|
MagicMock(return_value={"host_1.foo.com": {"retcode": 0}}),
|
|
):
|
|
with patch(
|
|
"salt.modules.vsphere._set_syslog_config_helper",
|
|
MagicMock(return_value={}),
|
|
):
|
|
host_1 = "host_1.foo.com"
|
|
self.assertEqual(
|
|
{host_1: {"enable_firewall": {"success": True}}},
|
|
vsphere.set_syslog_config(
|
|
HOST,
|
|
USER,
|
|
PASSWORD,
|
|
"loghost",
|
|
"foo",
|
|
firewall=True,
|
|
esxi_hosts=[host_1],
|
|
),
|
|
)
|
|
|
|
def test_set_syslog_config_firewall_bad_retcode(self):
|
|
"""
|
|
Tests error message given for a single ESXi host with 'loghost' as syslog_config.
|
|
"""
|
|
with patch(
|
|
"salt.modules.vsphere.enable_firewall_ruleset",
|
|
MagicMock(return_value={HOST: {"retcode": 1, "stdout": ERROR}}),
|
|
):
|
|
with patch(
|
|
"salt.modules.vsphere._set_syslog_config_helper",
|
|
MagicMock(return_value={}),
|
|
):
|
|
self.assertEqual(
|
|
{HOST: {"enable_firewall": {"message": ERROR, "success": False}}},
|
|
vsphere.set_syslog_config(
|
|
HOST, USER, PASSWORD, "loghost", "foo", firewall=True
|
|
),
|
|
)
|
|
|
|
def test_set_syslog_config_firewall_success(self):
|
|
"""
|
|
Tests successful function return for a single ESXi host with 'loghost' as syslog_config.
|
|
"""
|
|
with patch(
|
|
"salt.modules.vsphere.enable_firewall_ruleset",
|
|
MagicMock(return_value={HOST: {"retcode": 0}}),
|
|
):
|
|
with patch(
|
|
"salt.modules.vsphere._set_syslog_config_helper",
|
|
MagicMock(return_value={}),
|
|
):
|
|
self.assertEqual(
|
|
{HOST: {"enable_firewall": {"success": True}}},
|
|
vsphere.set_syslog_config(
|
|
HOST, USER, PASSWORD, "loghost", "foo", firewall=True
|
|
),
|
|
)
|
|
|
|
# Tests for get_syslog_config function
|
|
|
|
def test_get_syslog_config_esxi_hosts_not_list(self):
|
|
"""
|
|
Tests CommandExecutionError is raised when esxi_hosts is provided,
|
|
but is not a list.
|
|
"""
|
|
self.assertRaises(
|
|
CommandExecutionError,
|
|
vsphere.get_syslog_config,
|
|
HOST,
|
|
USER,
|
|
PASSWORD,
|
|
esxi_hosts="foo",
|
|
)
|
|
|
|
def test_get_syslog_config_host_list_bad_retcode(self):
|
|
"""
|
|
Tests error message returned with list of esxi_hosts.
|
|
"""
|
|
with patch(
|
|
"salt.utils.vmware.esxcli",
|
|
MagicMock(return_value={"retcode": 1, "stdout": ERROR}),
|
|
):
|
|
host_1 = "host_1.foo.com"
|
|
self.assertEqual(
|
|
{host_1: {"message": ERROR, "success": False}},
|
|
vsphere.get_syslog_config(HOST, USER, PASSWORD, esxi_hosts=[host_1]),
|
|
)
|
|
|
|
def test_get_syslog_config_host_list_success(self):
|
|
"""
|
|
Tests successful function return when an esxi_host is provided.
|
|
"""
|
|
with patch(
|
|
"salt.utils.vmware.esxcli",
|
|
MagicMock(return_value={"retcode": 0, "stdout": ""}),
|
|
):
|
|
host_1 = "host_1.foo.com"
|
|
self.assertEqual(
|
|
{host_1: {"success": True}},
|
|
vsphere.get_syslog_config(HOST, USER, PASSWORD, esxi_hosts=[host_1]),
|
|
)
|
|
|
|
def test_get_syslog_config_bad_retcode(self):
|
|
"""
|
|
Tests error message given for a single ESXi host.
|
|
"""
|
|
with patch(
|
|
"salt.utils.vmware.esxcli",
|
|
MagicMock(return_value={"retcode": 1, "stdout": ERROR}),
|
|
):
|
|
self.assertEqual(
|
|
{HOST: {"message": ERROR, "success": False}},
|
|
vsphere.get_syslog_config(HOST, USER, PASSWORD),
|
|
)
|
|
|
|
def test_get_syslog_config_success(self):
|
|
"""
|
|
Tests successful function return for a single ESXi host.
|
|
"""
|
|
with patch(
|
|
"salt.utils.vmware.esxcli",
|
|
MagicMock(return_value={"retcode": 0, "stdout": ""}),
|
|
):
|
|
self.assertEqual(
|
|
{HOST: {"success": True}},
|
|
vsphere.get_syslog_config(HOST, USER, PASSWORD),
|
|
)
|
|
|
|
# Tests for reset_syslog_config function
|
|
|
|
def test_reset_syslog_config_no_syslog_config(self):
|
|
"""
|
|
Tests CommandExecutionError is raised when a syslog_config parameter is missing.
|
|
"""
|
|
self.assertRaises(
|
|
CommandExecutionError, vsphere.reset_syslog_config, HOST, USER, PASSWORD
|
|
)
|
|
|
|
def test_reset_syslog_config_esxi_hosts_not_list(self):
|
|
"""
|
|
Tests CommandExecutionError is raised when esxi_hosts is provided,
|
|
but is not a list.
|
|
"""
|
|
self.assertRaises(
|
|
CommandExecutionError,
|
|
vsphere.reset_syslog_config,
|
|
HOST,
|
|
USER,
|
|
PASSWORD,
|
|
syslog_config="test",
|
|
esxi_hosts="foo",
|
|
)
|
|
|
|
def test_reset_syslog_config_invalid_config_param(self):
|
|
"""
|
|
Tests error message returned when an invalid syslog_config parameter is provided.
|
|
"""
|
|
with patch("salt.utils.vmware.esxcli", MagicMock(return_value={})):
|
|
error = "Invalid syslog configuration parameter"
|
|
self.assertEqual(
|
|
{
|
|
HOST: {
|
|
"success": False,
|
|
"test": {"message": error, "success": False},
|
|
}
|
|
},
|
|
vsphere.reset_syslog_config(HOST, USER, PASSWORD, syslog_config="test"),
|
|
)
|
|
|
|
def test_reset_syslog_config_host_list_bad_retcode(self):
|
|
"""
|
|
Tests error message returned with list of esxi_hosts.
|
|
"""
|
|
with patch(
|
|
"salt.utils.vmware.esxcli",
|
|
MagicMock(return_value={"retcode": 1, "stdout": ERROR}),
|
|
):
|
|
host_1 = "host_1.foo.com"
|
|
self.assertEqual(
|
|
{
|
|
host_1: {
|
|
"success": False,
|
|
"logdir": {"message": ERROR, "success": False},
|
|
}
|
|
},
|
|
vsphere.reset_syslog_config(
|
|
HOST, USER, PASSWORD, syslog_config="logdir", esxi_hosts=[host_1]
|
|
),
|
|
)
|
|
|
|
def test_reset_syslog_config_host_list_success(self):
|
|
"""
|
|
Tests successful function return when an esxi_host is provided.
|
|
"""
|
|
with patch(
|
|
"salt.utils.vmware.esxcli",
|
|
MagicMock(return_value={"retcode": 0, "stdout": ""}),
|
|
):
|
|
host_1 = "host_1.foo.com"
|
|
self.assertEqual(
|
|
{host_1: {"success": True, "loghost": {"success": True}}},
|
|
vsphere.reset_syslog_config(
|
|
HOST, USER, PASSWORD, syslog_config="loghost", esxi_hosts=[host_1]
|
|
),
|
|
)
|
|
|
|
def test_reset_syslog_config_bad_retcode(self):
|
|
"""
|
|
Tests error message given for a single ESXi host.
|
|
"""
|
|
with patch(
|
|
"salt.utils.vmware.esxcli",
|
|
MagicMock(return_value={"retcode": 1, "stdout": ERROR}),
|
|
):
|
|
self.assertEqual(
|
|
{
|
|
HOST: {
|
|
"success": False,
|
|
"logdir-unique": {"message": ERROR, "success": False},
|
|
}
|
|
},
|
|
vsphere.reset_syslog_config(
|
|
HOST, USER, PASSWORD, syslog_config="logdir-unique"
|
|
),
|
|
)
|
|
|
|
def test_reset_syslog_config_success(self):
|
|
"""
|
|
Tests successful function return for a single ESXi host.
|
|
"""
|
|
with patch(
|
|
"salt.utils.vmware.esxcli",
|
|
MagicMock(return_value={"retcode": 0, "stdout": ""}),
|
|
):
|
|
self.assertEqual(
|
|
{HOST: {"success": True, "default-rotate": {"success": True}}},
|
|
vsphere.reset_syslog_config(
|
|
HOST, USER, PASSWORD, syslog_config="default-rotate"
|
|
),
|
|
)
|
|
|
|
def test_reset_syslog_config_success_multiple_configs(self):
|
|
"""
|
|
Tests successful function return for a single ESXi host when passing in multiple syslog_config values.
|
|
"""
|
|
with patch(
|
|
"salt.utils.vmware.esxcli",
|
|
MagicMock(return_value={"retcode": 0, "stdout": ""}),
|
|
):
|
|
self.assertEqual(
|
|
{
|
|
HOST: {
|
|
"success": True,
|
|
"default-size": {"success": True},
|
|
"default-timeout": {"success": True},
|
|
}
|
|
},
|
|
vsphere.reset_syslog_config(
|
|
HOST, USER, PASSWORD, syslog_config="default-size,default-timeout"
|
|
),
|
|
)
|
|
|
|
def test_reset_syslog_config_success_all_configs(self):
|
|
"""
|
|
Tests successful function return for a single ESXi host when passing in multiple syslog_config values.
|
|
"""
|
|
with patch(
|
|
"salt.utils.vmware.esxcli",
|
|
MagicMock(return_value={"retcode": 0, "stdout": ""}),
|
|
):
|
|
self.assertEqual(
|
|
{
|
|
HOST: {
|
|
"success": True,
|
|
"logdir": {"success": True},
|
|
"loghost": {"success": True},
|
|
"default-rotate": {"success": True},
|
|
"default-size": {"success": True},
|
|
"default-timeout": {"success": True},
|
|
"logdir-unique": {"success": True},
|
|
}
|
|
},
|
|
vsphere.reset_syslog_config(HOST, USER, PASSWORD, syslog_config="all"),
|
|
)
|
|
|
|
# Tests for _reset_syslog_config_params function
|
|
|
|
def test_reset_syslog_config_params_no_valid_reset(self):
|
|
"""
|
|
Tests function returns False when an invalid syslog config is passed.
|
|
"""
|
|
valid_resets = ["hello", "world"]
|
|
config = "foo"
|
|
ret = {
|
|
"success": False,
|
|
config: {
|
|
"success": False,
|
|
"message": "Invalid syslog configuration parameter",
|
|
},
|
|
}
|
|
self.assertEqual(
|
|
ret,
|
|
vsphere._reset_syslog_config_params(
|
|
HOST, USER, PASSWORD, "cmd", config, valid_resets
|
|
),
|
|
)
|
|
|
|
def test_reset_syslog_config_params_error(self):
|
|
"""
|
|
Tests function returns False when the esxxli function returns an unsuccessful retcode.
|
|
"""
|
|
with patch(
|
|
"salt.utils.vmware.esxcli",
|
|
MagicMock(return_value={"retcode": 1, "stdout": ERROR}),
|
|
):
|
|
valid_resets = ["hello", "world"]
|
|
error_dict = {"success": False, "message": ERROR}
|
|
ret = {"success": False, "hello": error_dict, "world": error_dict}
|
|
self.assertDictEqual(
|
|
ret,
|
|
vsphere._reset_syslog_config_params(
|
|
HOST, USER, PASSWORD, "cmd", valid_resets, valid_resets
|
|
),
|
|
)
|
|
|
|
def test_reset_syslog_config_params_success(self):
|
|
"""
|
|
Tests function returns True when the esxxli function returns a successful retcode.
|
|
"""
|
|
with patch("salt.utils.vmware.esxcli", MagicMock(return_value={"retcode": 0})):
|
|
valid_resets = ["hello", "world"]
|
|
ret = {
|
|
"success": True,
|
|
"hello": {"success": True},
|
|
"world": {"success": True},
|
|
}
|
|
self.assertDictEqual(
|
|
ret,
|
|
vsphere._reset_syslog_config_params(
|
|
HOST, USER, PASSWORD, "cmd", valid_resets, valid_resets
|
|
),
|
|
)
|
|
|
|
# Tests for _set_syslog_config_helper function
|
|
|
|
def test_set_syslog_config_helper_no_valid_reset(self):
|
|
"""
|
|
Tests function returns False when an invalid syslog config is passed.
|
|
"""
|
|
config = "foo"
|
|
ret = {
|
|
"success": False,
|
|
"message": "'{}' is not a valid config variable.".format(config),
|
|
}
|
|
self.assertEqual(
|
|
ret, vsphere._set_syslog_config_helper(HOST, USER, PASSWORD, config, "bar")
|
|
)
|
|
|
|
def test_set_syslog_config_helper_bad_retcode(self):
|
|
"""
|
|
Tests function returns False when the esxcli function returns an unsuccessful retcode.
|
|
"""
|
|
with patch(
|
|
"salt.utils.vmware.esxcli",
|
|
MagicMock(return_value={"retcode": 1, "stdout": ERROR}),
|
|
):
|
|
config = "default-rotate"
|
|
self.assertEqual(
|
|
{config: {"success": False, "message": ERROR}},
|
|
vsphere._set_syslog_config_helper(HOST, USER, PASSWORD, config, "foo"),
|
|
)
|
|
|
|
def test_set_syslog_config_helper_success(self):
|
|
"""
|
|
Tests successful function return.
|
|
"""
|
|
with patch("salt.utils.vmware.esxcli", MagicMock(return_value={"retcode": 0})):
|
|
config = "logdir"
|
|
self.assertEqual(
|
|
{config: {"success": True}},
|
|
vsphere._set_syslog_config_helper(HOST, USER, PASSWORD, config, "foo"),
|
|
)
|
|
|
|
|
|
class GetProxyTypeTestCase(TestCase, LoaderModuleMockMixin):
|
|
"""
|
|
Tests for salt.modules.vsphere.get_proxy_type
|
|
"""
|
|
|
|
def setup_loader_modules(self):
|
|
return {vsphere: {}}
|
|
|
|
def test_output(self):
|
|
with patch.dict(
|
|
vsphere.__pillar__, {"proxy": {"proxytype": "fake_proxy_type"}}
|
|
):
|
|
ret = vsphere.get_proxy_type()
|
|
self.assertEqual("fake_proxy_type", ret)
|
|
|
|
|
|
class SupportsProxiesTestCase(TestCase, LoaderModuleMockMixin):
|
|
"""
|
|
Tests for salt.modules.vsphere._supports_proxies decorator
|
|
"""
|
|
|
|
def setup_loader_modules(self):
|
|
return {vsphere: {}}
|
|
|
|
def test_supported_proxy(self):
|
|
@vsphere._supports_proxies("supported")
|
|
def mock_function():
|
|
return "fake_function"
|
|
|
|
with patch(
|
|
"salt.modules.vsphere.get_proxy_type", MagicMock(return_value="supported")
|
|
):
|
|
ret = mock_function()
|
|
self.assertEqual("fake_function", ret)
|
|
|
|
def test_unsupported_proxy(self):
|
|
@vsphere._supports_proxies("supported")
|
|
def mock_function():
|
|
return "fake_function"
|
|
|
|
with patch(
|
|
"salt.modules.vsphere.get_proxy_type", MagicMock(return_value="unsupported")
|
|
):
|
|
with self.assertRaises(CommandExecutionError) as excinfo:
|
|
mock_function()
|
|
self.assertEqual(
|
|
"'unsupported' proxy is not supported by " "function mock_function",
|
|
excinfo.exception.strerror,
|
|
)
|
|
|
|
|
|
class _GetProxyConnectionDetailsTestCase(TestCase, LoaderModuleMockMixin):
|
|
"""
|
|
Tests for salt.modules.vsphere._get_proxy_connection_details
|
|
"""
|
|
|
|
def setup_loader_modules(self):
|
|
return {vsphere: {}}
|
|
|
|
def setUp(self):
|
|
self.esxi_host_details = {
|
|
"host": "fake_host",
|
|
"username": "fake_username",
|
|
"password": "fake_password",
|
|
"protocol": "fake_protocol",
|
|
"port": "fake_port",
|
|
"mechanism": "fake_mechanism",
|
|
"principal": "fake_principal",
|
|
"domain": "fake_domain",
|
|
}
|
|
self.esxi_vcenter_details = {
|
|
"vcenter": "fake_vcenter",
|
|
"username": "fake_username",
|
|
"password": "fake_password",
|
|
"protocol": "fake_protocol",
|
|
"port": "fake_port",
|
|
"mechanism": "fake_mechanism",
|
|
"principal": "fake_principal",
|
|
"domain": "fake_domain",
|
|
}
|
|
self.esxdatacenter_details = {
|
|
"vcenter": "fake_vcenter",
|
|
"datacenter": "fake_dc",
|
|
"username": "fake_username",
|
|
"password": "fake_password",
|
|
"protocol": "fake_protocol",
|
|
"port": "fake_port",
|
|
"mechanism": "fake_mechanism",
|
|
"principal": "fake_principal",
|
|
"domain": "fake_domain",
|
|
}
|
|
self.esxcluster_details = {
|
|
"vcenter": "fake_vcenter",
|
|
"datacenter": "fake_dc",
|
|
"cluster": "fake_cluster",
|
|
"username": "fake_username",
|
|
"password": "fake_password",
|
|
"protocol": "fake_protocol",
|
|
"port": "fake_port",
|
|
"mechanism": "fake_mechanism",
|
|
"principal": "fake_principal",
|
|
"domain": "fake_domain",
|
|
}
|
|
self.vcenter_details = {
|
|
"vcenter": "fake_vcenter",
|
|
"username": "fake_username",
|
|
"password": "fake_password",
|
|
"protocol": "fake_protocol",
|
|
"port": "fake_port",
|
|
"mechanism": "fake_mechanism",
|
|
"principal": "fake_principal",
|
|
"domain": "fake_domain",
|
|
}
|
|
|
|
def tearDown(self):
|
|
for attrname in (
|
|
"esxi_host_details",
|
|
"esxi_vcenter_details",
|
|
"esxdatacenter_details",
|
|
"esxcluster_details",
|
|
):
|
|
try:
|
|
delattr(self, attrname)
|
|
except AttributeError:
|
|
continue
|
|
|
|
def test_esxi_proxy_host_details(self):
|
|
with patch(
|
|
"salt.modules.vsphere.get_proxy_type", MagicMock(return_value="esxi")
|
|
):
|
|
with patch.dict(
|
|
vsphere.__salt__,
|
|
{"esxi.get_details": MagicMock(return_value=self.esxi_host_details)},
|
|
):
|
|
ret = vsphere._get_proxy_connection_details()
|
|
self.assertEqual(
|
|
(
|
|
"fake_host",
|
|
"fake_username",
|
|
"fake_password",
|
|
"fake_protocol",
|
|
"fake_port",
|
|
"fake_mechanism",
|
|
"fake_principal",
|
|
"fake_domain",
|
|
),
|
|
ret,
|
|
)
|
|
|
|
def test_esxdatacenter_proxy_details(self):
|
|
with patch(
|
|
"salt.modules.vsphere.get_proxy_type",
|
|
MagicMock(return_value="esxdatacenter"),
|
|
):
|
|
with patch.dict(
|
|
vsphere.__salt__,
|
|
{
|
|
"esxdatacenter.get_details": MagicMock(
|
|
return_value=self.esxdatacenter_details
|
|
)
|
|
},
|
|
):
|
|
ret = vsphere._get_proxy_connection_details()
|
|
self.assertEqual(
|
|
(
|
|
"fake_vcenter",
|
|
"fake_username",
|
|
"fake_password",
|
|
"fake_protocol",
|
|
"fake_port",
|
|
"fake_mechanism",
|
|
"fake_principal",
|
|
"fake_domain",
|
|
),
|
|
ret,
|
|
)
|
|
|
|
def test_esxcluster_proxy_details(self):
|
|
with patch(
|
|
"salt.modules.vsphere.get_proxy_type", MagicMock(return_value="esxcluster")
|
|
):
|
|
with patch.dict(
|
|
vsphere.__salt__,
|
|
{
|
|
"esxcluster.get_details": MagicMock(
|
|
return_value=self.esxcluster_details
|
|
)
|
|
},
|
|
):
|
|
ret = vsphere._get_proxy_connection_details()
|
|
self.assertEqual(
|
|
(
|
|
"fake_vcenter",
|
|
"fake_username",
|
|
"fake_password",
|
|
"fake_protocol",
|
|
"fake_port",
|
|
"fake_mechanism",
|
|
"fake_principal",
|
|
"fake_domain",
|
|
),
|
|
ret,
|
|
)
|
|
|
|
def test_esxi_proxy_vcenter_details(self):
|
|
with patch(
|
|
"salt.modules.vsphere.get_proxy_type", MagicMock(return_value="esxi")
|
|
):
|
|
with patch.dict(
|
|
vsphere.__salt__,
|
|
{"esxi.get_details": MagicMock(return_value=self.esxi_vcenter_details)},
|
|
):
|
|
ret = vsphere._get_proxy_connection_details()
|
|
self.assertEqual(
|
|
(
|
|
"fake_vcenter",
|
|
"fake_username",
|
|
"fake_password",
|
|
"fake_protocol",
|
|
"fake_port",
|
|
"fake_mechanism",
|
|
"fake_principal",
|
|
"fake_domain",
|
|
),
|
|
ret,
|
|
)
|
|
|
|
def test_vcenter_proxy_details(self):
|
|
with patch(
|
|
"salt.modules.vsphere.get_proxy_type", MagicMock(return_value="vcenter")
|
|
):
|
|
with patch.dict(
|
|
vsphere.__salt__,
|
|
{"vcenter.get_details": MagicMock(return_value=self.vcenter_details)},
|
|
):
|
|
ret = vsphere._get_proxy_connection_details()
|
|
self.assertEqual(
|
|
(
|
|
"fake_vcenter",
|
|
"fake_username",
|
|
"fake_password",
|
|
"fake_protocol",
|
|
"fake_port",
|
|
"fake_mechanism",
|
|
"fake_principal",
|
|
"fake_domain",
|
|
),
|
|
ret,
|
|
)
|
|
|
|
def test_unsupported_proxy_details(self):
|
|
with patch(
|
|
"salt.modules.vsphere.get_proxy_type", MagicMock(return_value="unsupported")
|
|
):
|
|
with self.assertRaises(CommandExecutionError) as excinfo:
|
|
ret = vsphere._get_proxy_connection_details()
|
|
self.assertEqual(
|
|
"'unsupported' proxy is not supported", excinfo.exception.strerror
|
|
)
|
|
|
|
def test_vcenter_proxy_details_verify_ssl(self):
|
|
for verify_ssl in [True, False]:
|
|
details = self.vcenter_details.copy()
|
|
details["verify_ssl"] = verify_ssl
|
|
|
|
with patch(
|
|
"salt.modules.vsphere.get_proxy_type", MagicMock(return_value="vcenter")
|
|
):
|
|
with patch.dict(
|
|
vsphere.__salt__,
|
|
{"vcenter.get_details": MagicMock(return_value=details)},
|
|
):
|
|
ret = vsphere._get_proxy_connection_details()
|
|
self.assertEqual(
|
|
(
|
|
"fake_vcenter",
|
|
"fake_username",
|
|
"fake_password",
|
|
"fake_protocol",
|
|
"fake_port",
|
|
"fake_mechanism",
|
|
"fake_principal",
|
|
"fake_domain",
|
|
verify_ssl,
|
|
),
|
|
ret,
|
|
)
|
|
|
|
|
|
class GetsServiceInstanceViaProxyTestCase(TestCase, LoaderModuleMockMixin):
|
|
"""
|
|
Tests for salt.modules.vsphere._gets_service_instance_via_proxy
|
|
decorator
|
|
"""
|
|
|
|
def setup_loader_modules(self):
|
|
patcher = patch("salt.utils.vmware.get_service_instance", MagicMock())
|
|
patcher.start()
|
|
self.addCleanup(patcher.stop)
|
|
patcher = patch("salt.utils.vmware.disconnect", MagicMock())
|
|
patcher.start()
|
|
self.addCleanup(patcher.stop)
|
|
return {vsphere: {"_get_proxy_connection_details": MagicMock()}}
|
|
|
|
def setUp(self):
|
|
self.mock_si = MagicMock()
|
|
self.mock_details1 = MagicMock()
|
|
self.mock_details2 = MagicMock()
|
|
|
|
def tearDown(self):
|
|
for attrname in ("mock_si", "mock_details1", "mock_details2"):
|
|
try:
|
|
delattr(self, attrname)
|
|
except AttributeError:
|
|
continue
|
|
|
|
def test_no_service_instance_or_kwargs_parameters(self):
|
|
@vsphere._gets_service_instance_via_proxy
|
|
def mock_function():
|
|
return "fake_function"
|
|
|
|
with self.assertRaises(CommandExecutionError) as excinfo:
|
|
mock_function()
|
|
self.assertEqual(
|
|
"Function mock_function must have either a "
|
|
"'service_instance', or a '**kwargs' type "
|
|
"parameter",
|
|
excinfo.exception.strerror,
|
|
)
|
|
|
|
def test___get_proxy_connection_details_call(self):
|
|
mock__get_proxy_connection_details = MagicMock()
|
|
|
|
@vsphere._gets_service_instance_via_proxy
|
|
def mock_function(service_instance=None):
|
|
return service_instance
|
|
|
|
with patch(
|
|
"salt.modules.vsphere._get_proxy_connection_details",
|
|
mock__get_proxy_connection_details,
|
|
):
|
|
mock_function()
|
|
mock__get_proxy_connection_details.assert_called_once_with()
|
|
|
|
def test_service_instance_named_parameter_no_value(self):
|
|
mock_get_service_instance = MagicMock(return_value=self.mock_si)
|
|
mock_disconnect = MagicMock()
|
|
|
|
@vsphere._gets_service_instance_via_proxy
|
|
def mock_function(service_instance=None):
|
|
return service_instance
|
|
|
|
with patch(
|
|
"salt.modules.vsphere._get_proxy_connection_details",
|
|
MagicMock(return_value=(self.mock_details1, self.mock_details2)),
|
|
):
|
|
with patch(
|
|
"salt.utils.vmware.get_service_instance", mock_get_service_instance
|
|
):
|
|
with patch("salt.utils.vmware.disconnect", mock_disconnect):
|
|
ret = mock_function()
|
|
mock_get_service_instance.assert_called_once_with(
|
|
self.mock_details1, self.mock_details2
|
|
)
|
|
mock_disconnect.assert_called_once_with(self.mock_si)
|
|
self.assertEqual(ret, self.mock_si)
|
|
|
|
def test_service_instance_kwargs_parameter_no_value(self):
|
|
mock_get_service_instance = MagicMock(return_value=self.mock_si)
|
|
mock_disconnect = MagicMock()
|
|
|
|
@vsphere._gets_service_instance_via_proxy
|
|
def mock_function(**kwargs):
|
|
return kwargs["service_instance"]
|
|
|
|
with patch(
|
|
"salt.modules.vsphere._get_proxy_connection_details",
|
|
MagicMock(return_value=(self.mock_details1, self.mock_details2)),
|
|
):
|
|
with patch(
|
|
"salt.utils.vmware.get_service_instance", mock_get_service_instance
|
|
):
|
|
with patch("salt.utils.vmware.disconnect", mock_disconnect):
|
|
ret = mock_function()
|
|
mock_get_service_instance.assert_called_once_with(
|
|
self.mock_details1, self.mock_details2
|
|
)
|
|
mock_disconnect.assert_called_once_with(self.mock_si)
|
|
self.assertEqual(ret, self.mock_si)
|
|
|
|
def test_service_instance_positional_parameter_no_default_value(self):
|
|
mock_get_service_instance = MagicMock()
|
|
mock_disconnect = MagicMock()
|
|
|
|
@vsphere._gets_service_instance_via_proxy
|
|
def mock_function(service_instance):
|
|
return service_instance
|
|
|
|
with patch(
|
|
"salt.modules.vsphere._get_proxy_connection_details",
|
|
MagicMock(return_value=(self.mock_details1, self.mock_details2)),
|
|
):
|
|
with patch(
|
|
"salt.utils.vmware.get_service_instance", mock_get_service_instance
|
|
):
|
|
with patch("salt.utils.vmware.disconnect", mock_disconnect):
|
|
ret = mock_function(self.mock_si)
|
|
self.assertEqual(mock_get_service_instance.call_count, 0)
|
|
self.assertEqual(mock_disconnect.call_count, 0)
|
|
self.assertEqual(ret, self.mock_si)
|
|
|
|
def test_service_instance_positional_parameter_with_default_value(self):
|
|
mock_get_service_instance = MagicMock()
|
|
mock_disconnect = MagicMock()
|
|
|
|
@vsphere._gets_service_instance_via_proxy
|
|
def mock_function(service_instance=None):
|
|
return service_instance
|
|
|
|
with patch(
|
|
"salt.modules.vsphere._get_proxy_connection_details",
|
|
MagicMock(return_value=(self.mock_details1, self.mock_details2)),
|
|
):
|
|
with patch(
|
|
"salt.utils.vmware.get_service_instance", mock_get_service_instance
|
|
):
|
|
with patch("salt.utils.vmware.disconnect", mock_disconnect):
|
|
ret = mock_function(self.mock_si)
|
|
self.assertEqual(mock_get_service_instance.call_count, 0)
|
|
self.assertEqual(mock_disconnect.call_count, 0)
|
|
self.assertEqual(ret, self.mock_si)
|
|
|
|
def test_service_instance_named_parameter_with_default_value(self):
|
|
mock_get_service_instance = MagicMock()
|
|
mock_disconnect = MagicMock()
|
|
|
|
@vsphere._gets_service_instance_via_proxy
|
|
def mock_function(service_instance=None):
|
|
return service_instance
|
|
|
|
with patch(
|
|
"salt.modules.vsphere._get_proxy_connection_details",
|
|
MagicMock(return_value=(self.mock_details1, self.mock_details2)),
|
|
):
|
|
with patch(
|
|
"salt.utils.vmware.get_service_instance", mock_get_service_instance
|
|
):
|
|
with patch("salt.utils.vmware.disconnect", mock_disconnect):
|
|
ret = mock_function(service_instance=self.mock_si)
|
|
self.assertEqual(mock_get_service_instance.call_count, 0)
|
|
self.assertEqual(mock_disconnect.call_count, 0)
|
|
self.assertEqual(ret, self.mock_si)
|
|
|
|
def test_service_instance_kwargs_parameter_passthrough(self):
|
|
mock_get_service_instance = MagicMock()
|
|
mock_disconnect = MagicMock()
|
|
|
|
@vsphere._gets_service_instance_via_proxy
|
|
def mock_function(**kwargs):
|
|
return kwargs["service_instance"]
|
|
|
|
with patch(
|
|
"salt.modules.vsphere._get_proxy_connection_details",
|
|
MagicMock(return_value=(self.mock_details1, self.mock_details2)),
|
|
):
|
|
with patch(
|
|
"salt.utils.vmware.get_service_instance", mock_get_service_instance
|
|
):
|
|
with patch("salt.utils.vmware.disconnect", mock_disconnect):
|
|
ret = mock_function(service_instance=self.mock_si)
|
|
self.assertEqual(mock_get_service_instance.call_count, 0)
|
|
self.assertEqual(mock_disconnect.call_count, 0)
|
|
self.assertEqual(ret, self.mock_si)
|
|
|
|
|
|
class GetServiceInstanceViaProxyTestCase(TestCase, LoaderModuleMockMixin):
|
|
"""
|
|
Tests for salt.modules.vsphere.get_service_instance_via_proxy
|
|
"""
|
|
|
|
def setup_loader_modules(self):
|
|
patcher = patch("salt.utils.vmware.get_service_instance", MagicMock())
|
|
patcher.start()
|
|
self.addCleanup(patcher.stop)
|
|
return {
|
|
vsphere: {
|
|
"get_proxy_type": MagicMock(return_value="esxi"),
|
|
"_get_proxy_connection_details": MagicMock(),
|
|
}
|
|
}
|
|
|
|
def test_supported_proxies(self):
|
|
supported_proxies = ["esxi", "esxcluster", "esxdatacenter", "vcenter", "esxvm"]
|
|
for proxy_type in supported_proxies:
|
|
with patch(
|
|
"salt.modules.vsphere.get_proxy_type",
|
|
MagicMock(return_value=proxy_type),
|
|
):
|
|
vsphere.get_service_instance_via_proxy()
|
|
|
|
def test_get_service_instance_call(self):
|
|
mock_connection_details = [MagicMock(), MagicMock(), MagicMock()]
|
|
mock_get_service_instance = MagicMock()
|
|
with patch(
|
|
"salt.modules.vsphere._get_proxy_connection_details",
|
|
MagicMock(return_value=mock_connection_details),
|
|
):
|
|
with patch(
|
|
"salt.utils.vmware.get_service_instance", mock_get_service_instance
|
|
):
|
|
vsphere.get_service_instance_via_proxy()
|
|
mock_get_service_instance.assert_called_once_with(*mock_connection_details)
|
|
|
|
def test_output(self):
|
|
mock_si = MagicMock()
|
|
with patch(
|
|
"salt.utils.vmware.get_service_instance", MagicMock(return_value=mock_si)
|
|
):
|
|
res = vsphere.get_service_instance_via_proxy()
|
|
self.assertEqual(res, mock_si)
|
|
|
|
|
|
class DisconnectTestCase(TestCase, LoaderModuleMockMixin):
|
|
"""
|
|
Tests for salt.modules.vsphere.disconnect
|
|
"""
|
|
|
|
def setup_loader_modules(self):
|
|
self.mock_si = MagicMock()
|
|
self.addCleanup(delattr, self, "mock_si")
|
|
patcher = patch("salt.utils.vmware.disconnect", MagicMock())
|
|
patcher.start()
|
|
self.addCleanup(patcher.stop)
|
|
return {
|
|
vsphere: {
|
|
"_get_proxy_connection_details": MagicMock(),
|
|
"get_proxy_type": MagicMock(return_value="esxi"),
|
|
}
|
|
}
|
|
|
|
def test_supported_proxies(self):
|
|
supported_proxies = ["esxi", "esxcluster", "esxdatacenter", "vcenter", "esxvm"]
|
|
for proxy_type in supported_proxies:
|
|
with patch(
|
|
"salt.modules.vsphere.get_proxy_type",
|
|
MagicMock(return_value=proxy_type),
|
|
):
|
|
vsphere.disconnect(self.mock_si)
|
|
|
|
def test_disconnect_call(self):
|
|
mock_disconnect = MagicMock()
|
|
with patch("salt.utils.vmware.disconnect", mock_disconnect):
|
|
vsphere.disconnect(self.mock_si)
|
|
mock_disconnect.assert_called_once_with(self.mock_si)
|
|
|
|
def test_output(self):
|
|
res = vsphere.disconnect(self.mock_si)
|
|
self.assertEqual(res, True)
|
|
|
|
|
|
class TestVcenterConnectionTestCase(TestCase, LoaderModuleMockMixin):
|
|
"""
|
|
Tests for salt.modules.vsphere.test_vcenter_connection
|
|
"""
|
|
|
|
def setup_loader_modules(self):
|
|
self.mock_si = MagicMock()
|
|
self.addCleanup(delattr, self, "mock_si")
|
|
patcher = patch(
|
|
"salt.utils.vmware.get_service_instance",
|
|
MagicMock(return_value=self.mock_si),
|
|
)
|
|
patcher.start()
|
|
self.addCleanup(patcher.stop)
|
|
patcher = patch("salt.utils.vmware.disconnect", MagicMock())
|
|
patcher.start()
|
|
self.addCleanup(patcher.stop)
|
|
patcher = patch("salt.utils.vmware.is_connection_to_a_vcenter", MagicMock())
|
|
patcher.start()
|
|
self.addCleanup(patcher.stop)
|
|
return {
|
|
vsphere: {
|
|
"_get_proxy_connection_details": MagicMock(),
|
|
"get_proxy_type": MagicMock(return_value="esxi"),
|
|
}
|
|
}
|
|
|
|
def test_supported_proxies(self):
|
|
supported_proxies = ["esxi", "esxcluster", "esxdatacenter", "vcenter", "esxvm"]
|
|
for proxy_type in supported_proxies:
|
|
with patch(
|
|
"salt.modules.vsphere.get_proxy_type",
|
|
MagicMock(return_value=proxy_type),
|
|
):
|
|
vsphere.test_vcenter_connection()
|
|
|
|
def test_is_connection_to_a_vcenter_call_default_service_instance(self):
|
|
mock_is_connection_to_a_vcenter = MagicMock()
|
|
with patch(
|
|
"salt.utils.vmware.is_connection_to_a_vcenter",
|
|
mock_is_connection_to_a_vcenter,
|
|
):
|
|
vsphere.test_vcenter_connection()
|
|
mock_is_connection_to_a_vcenter.assert_called_once_with(self.mock_si)
|
|
|
|
def test_is_connection_to_a_vcenter_call_explicit_service_instance(self):
|
|
expl_mock_si = MagicMock()
|
|
mock_is_connection_to_a_vcenter = MagicMock()
|
|
with patch(
|
|
"salt.utils.vmware.is_connection_to_a_vcenter",
|
|
mock_is_connection_to_a_vcenter,
|
|
):
|
|
vsphere.test_vcenter_connection(expl_mock_si)
|
|
mock_is_connection_to_a_vcenter.assert_called_once_with(expl_mock_si)
|
|
|
|
def test_is_connection_to_a_vcenter_raises_vmware_salt_error(self):
|
|
exc = VMwareSaltError("VMwareSaltError")
|
|
with patch(
|
|
"salt.utils.vmware.is_connection_to_a_vcenter", MagicMock(side_effect=exc)
|
|
):
|
|
res = vsphere.test_vcenter_connection()
|
|
self.assertEqual(res, False)
|
|
|
|
def test_is_connection_to_a_vcenter_raises_non_vmware_salt_error(self):
|
|
exc = Exception("NonVMwareSaltError")
|
|
with patch(
|
|
"salt.utils.vmware.is_connection_to_a_vcenter", MagicMock(side_effect=exc)
|
|
):
|
|
with self.assertRaises(Exception) as excinfo:
|
|
res = vsphere.test_vcenter_connection()
|
|
self.assertEqual("NonVMwareSaltError", str(excinfo.exception))
|
|
|
|
def test_output_true(self):
|
|
with patch(
|
|
"salt.utils.vmware.is_connection_to_a_vcenter", MagicMock(return_value=True)
|
|
):
|
|
res = vsphere.test_vcenter_connection()
|
|
self.assertEqual(res, True)
|
|
|
|
def test_output_false(self):
|
|
with patch(
|
|
"salt.utils.vmware.is_connection_to_a_vcenter",
|
|
MagicMock(return_value=False),
|
|
):
|
|
res = vsphere.test_vcenter_connection()
|
|
self.assertEqual(res, False)
|
|
|
|
|
|
@skipIf(not HAS_PYVMOMI, "The 'pyvmomi' library is missing")
|
|
class ListDatacentersViaProxyTestCase(TestCase, LoaderModuleMockMixin):
|
|
"""
|
|
Tests for salt.modules.vsphere.list_datacenters_via_proxy
|
|
"""
|
|
|
|
def setup_loader_modules(self):
|
|
self.mock_si = MagicMock()
|
|
self.addCleanup(delattr, self, "mock_si")
|
|
patcher = patch(
|
|
"salt.utils.vmware.get_service_instance",
|
|
MagicMock(return_value=self.mock_si),
|
|
)
|
|
patcher.start()
|
|
self.addCleanup(patcher.stop)
|
|
patcher = patch("salt.utils.vmware.get_datacenters", MagicMock())
|
|
patcher.start()
|
|
self.addCleanup(patcher.stop)
|
|
patcher = patch("salt.utils.vmware.get_managed_object_name", MagicMock())
|
|
patcher.start()
|
|
self.addCleanup(patcher.stop)
|
|
return {
|
|
vsphere: {
|
|
"_get_proxy_connection_details": MagicMock(),
|
|
"get_proxy_type": MagicMock(return_value="esxdatacenter"),
|
|
}
|
|
}
|
|
|
|
def test_supported_proxies(self):
|
|
supported_proxies = ["esxcluster", "esxdatacenter", "vcenter", "esxvm"]
|
|
for proxy_type in supported_proxies:
|
|
with patch(
|
|
"salt.modules.vsphere.get_proxy_type",
|
|
MagicMock(return_value=proxy_type),
|
|
):
|
|
vsphere.list_datacenters_via_proxy()
|
|
|
|
def test_default_params(self):
|
|
mock_get_datacenters = MagicMock()
|
|
with patch("salt.utils.vmware.get_datacenters", mock_get_datacenters):
|
|
vsphere.list_datacenters_via_proxy()
|
|
mock_get_datacenters.assert_called_once_with(
|
|
self.mock_si, get_all_datacenters=True
|
|
)
|
|
|
|
def test_defined_service_instance(self):
|
|
mock_si = MagicMock()
|
|
mock_get_datacenters = MagicMock()
|
|
with patch("salt.utils.vmware.get_datacenters", mock_get_datacenters):
|
|
vsphere.list_datacenters_via_proxy(service_instance=mock_si)
|
|
mock_get_datacenters.assert_called_once_with(mock_si, get_all_datacenters=True)
|
|
|
|
def test_defined_datacenter_names(self):
|
|
mock_datacenters = MagicMock()
|
|
mock_get_datacenters = MagicMock()
|
|
with patch("salt.utils.vmware.get_datacenters", mock_get_datacenters):
|
|
vsphere.list_datacenters_via_proxy(mock_datacenters)
|
|
mock_get_datacenters.assert_called_once_with(self.mock_si, mock_datacenters)
|
|
|
|
def test_get_managed_object_name_calls(self):
|
|
mock_get_managed_object_name = MagicMock()
|
|
mock_dcs = [MagicMock(), MagicMock()]
|
|
with patch(
|
|
"salt.utils.vmware.get_datacenters", MagicMock(return_value=mock_dcs)
|
|
):
|
|
with patch(
|
|
"salt.utils.vmware.get_managed_object_name",
|
|
mock_get_managed_object_name,
|
|
):
|
|
vsphere.list_datacenters_via_proxy()
|
|
mock_get_managed_object_name.assert_has_calls(
|
|
[call(mock_dcs[0]), call(mock_dcs[1])]
|
|
)
|
|
|
|
def test_returned_array(self):
|
|
with patch(
|
|
"salt.utils.vmware.get_datacenters",
|
|
MagicMock(return_value=[MagicMock(), MagicMock()]),
|
|
):
|
|
# 2 datacenters
|
|
with patch(
|
|
"salt.utils.vmware.get_managed_object_name",
|
|
MagicMock(side_effect=["fake_dc1", "fake_dc2", "fake_dc3"]),
|
|
):
|
|
# 3 possible names
|
|
res = vsphere.list_datacenters_via_proxy()
|
|
|
|
# Just the first two names are in the result
|
|
self.assertEqual(res, [{"name": "fake_dc1"}, {"name": "fake_dc2"}])
|
|
|
|
|
|
@skipIf(not HAS_PYVMOMI, "The 'pyvmomi' library is missing")
|
|
class CreateDatacenterTestCase(TestCase, LoaderModuleMockMixin):
|
|
"""
|
|
Tests for salt.modules.vsphere.create_datacenter
|
|
"""
|
|
|
|
def setup_loader_modules(self):
|
|
self.mock_si = MagicMock()
|
|
self.addCleanup(delattr, self, "mock_si")
|
|
patcher = patch(
|
|
"salt.utils.vmware.get_service_instance",
|
|
MagicMock(return_value=self.mock_si),
|
|
)
|
|
patcher.start()
|
|
self.addCleanup(patcher.stop)
|
|
patcher = patch("salt.utils.vmware.create_datacenter", MagicMock())
|
|
patcher.start()
|
|
self.addCleanup(patcher.stop)
|
|
return {
|
|
vsphere: {
|
|
"_get_proxy_connection_details": MagicMock(),
|
|
"get_proxy_type": MagicMock(return_value="esxdatacenter"),
|
|
}
|
|
}
|
|
|
|
def test_supported_proxies(self):
|
|
supported_proxies = ["esxdatacenter", "vcenter"]
|
|
for proxy_type in supported_proxies:
|
|
with patch(
|
|
"salt.modules.vsphere.get_proxy_type",
|
|
MagicMock(return_value=proxy_type),
|
|
):
|
|
vsphere.create_datacenter("fake_dc1")
|
|
|
|
def test_default_service_instance(self):
|
|
mock_create_datacenter = MagicMock()
|
|
with patch("salt.utils.vmware.create_datacenter", mock_create_datacenter):
|
|
vsphere.create_datacenter("fake_dc1")
|
|
mock_create_datacenter.assert_called_once_with(self.mock_si, "fake_dc1")
|
|
|
|
def test_defined_service_instance(self):
|
|
mock_si = MagicMock()
|
|
mock_create_datacenter = MagicMock()
|
|
with patch("salt.utils.vmware.create_datacenter", mock_create_datacenter):
|
|
vsphere.create_datacenter("fake_dc1", service_instance=mock_si)
|
|
mock_create_datacenter.assert_called_once_with(mock_si, "fake_dc1")
|
|
|
|
def test_returned_value(self):
|
|
res = vsphere.create_datacenter("fake_dc1")
|
|
self.assertEqual(res, {"create_datacenter": True})
|
|
|
|
|
|
@skipIf(not HAS_PYVMOMI, "The 'pyvmomi' library is missing")
|
|
class EraseDiskPartitionsTestCase(TestCase, LoaderModuleMockMixin):
|
|
"""
|
|
Tests for salt.modules.vsphere.erase_disk_partitions
|
|
"""
|
|
|
|
def setup_loader_modules(self):
|
|
return {
|
|
vsphere: {
|
|
"_get_proxy_connection_details": MagicMock(),
|
|
"__proxy__": {
|
|
"esxi.get_details": MagicMock(
|
|
return_value={"esxi_host": "fake_host"}
|
|
)
|
|
},
|
|
}
|
|
}
|
|
|
|
def setUp(self):
|
|
attrs = (("mock_si", MagicMock()), ("mock_host", MagicMock()))
|
|
for attr, mock_obj in attrs:
|
|
setattr(self, attr, mock_obj)
|
|
self.addCleanup(delattr, self, attr)
|
|
attrs = (
|
|
("mock_proxy_target", MagicMock(return_value=self.mock_host)),
|
|
("mock_erase_disk_partitions", MagicMock()),
|
|
)
|
|
for attr, mock_obj in attrs:
|
|
setattr(self, attr, mock_obj)
|
|
self.addCleanup(delattr, self, attr)
|
|
|
|
patches = (
|
|
(
|
|
"salt.utils.vmware.get_service_instance",
|
|
MagicMock(return_value=self.mock_si),
|
|
),
|
|
("salt.modules.vsphere.get_proxy_type", MagicMock(return_value="esxi")),
|
|
(
|
|
"salt.modules.vsphere._get_proxy_target",
|
|
MagicMock(return_value=self.mock_host),
|
|
),
|
|
(
|
|
"salt.utils.vmware.erase_disk_partitions",
|
|
self.mock_erase_disk_partitions,
|
|
),
|
|
)
|
|
for module, mock_obj in patches:
|
|
patcher = patch(module, mock_obj)
|
|
patcher.start()
|
|
self.addCleanup(patcher.stop)
|
|
|
|
def test_supported_proxies(self):
|
|
supported_proxies = ["esxi"]
|
|
for proxy_type in supported_proxies:
|
|
with patch(
|
|
"salt.modules.vsphere.get_proxy_type",
|
|
MagicMock(return_value=proxy_type),
|
|
):
|
|
vsphere.erase_disk_partitions(disk_id="fake_disk")
|
|
|
|
def test_no_disk_id_or_scsi_address(self):
|
|
with self.assertRaises(ArgumentValueError) as excinfo:
|
|
vsphere.erase_disk_partitions()
|
|
self.assertEqual(
|
|
"Either 'disk_id' or 'scsi_address' needs to " "be specified",
|
|
excinfo.exception.strerror,
|
|
)
|
|
|
|
def test_get_proxy_target(self):
|
|
mock_test_proxy_target = MagicMock()
|
|
with patch("salt.modules.vsphere._get_proxy_target", mock_test_proxy_target):
|
|
vsphere.erase_disk_partitions(disk_id="fake_disk")
|
|
mock_test_proxy_target.assert_called_once_with(self.mock_si)
|
|
|
|
def test_scsi_address_not_found(self):
|
|
mock = MagicMock(return_value={"bad_scsi_address": "bad_disk_id"})
|
|
with patch("salt.utils.vmware.get_scsi_address_to_lun_map", mock):
|
|
with self.assertRaises(VMwareObjectRetrievalError) as excinfo:
|
|
vsphere.erase_disk_partitions(scsi_address="fake_scsi_address")
|
|
self.assertEqual(
|
|
"Scsi lun with address 'fake_scsi_address' was "
|
|
"not found on host 'fake_host'",
|
|
excinfo.exception.strerror,
|
|
)
|
|
|
|
def test_scsi_address_to_disk_id_map(self):
|
|
mock_disk_id = MagicMock(canonicalName="fake_scsi_disk_id")
|
|
mock_get_scsi_addr_to_lun = MagicMock(
|
|
return_value={"fake_scsi_address": mock_disk_id}
|
|
)
|
|
with patch(
|
|
"salt.utils.vmware.get_scsi_address_to_lun_map", mock_get_scsi_addr_to_lun
|
|
):
|
|
vsphere.erase_disk_partitions(scsi_address="fake_scsi_address")
|
|
mock_get_scsi_addr_to_lun.assert_called_once_with(self.mock_host)
|
|
self.mock_erase_disk_partitions.assert_called_once_with(
|
|
self.mock_si, self.mock_host, "fake_scsi_disk_id", hostname="fake_host"
|
|
)
|
|
|
|
def test_erase_disk_partitions(self):
|
|
vsphere.erase_disk_partitions(disk_id="fake_disk_id")
|
|
self.mock_erase_disk_partitions.assert_called_once_with(
|
|
self.mock_si, self.mock_host, "fake_disk_id", hostname="fake_host"
|
|
)
|
|
|
|
|
|
@skipIf(not HAS_PYVMOMI, "The 'pyvmomi' library is missing")
|
|
class RemoveDatastoreTestCase(TestCase, LoaderModuleMockMixin):
|
|
"""
|
|
Tests for salt.modules.vsphere.remove_datastore
|
|
"""
|
|
|
|
def setup_loader_modules(self):
|
|
return {
|
|
vsphere: {
|
|
"_get_proxy_connection_details": MagicMock(),
|
|
"get_proxy_type": MagicMock(return_value="esxdatacenter"),
|
|
}
|
|
}
|
|
|
|
def setUp(self):
|
|
attrs = (
|
|
("mock_si", MagicMock()),
|
|
("mock_target", MagicMock()),
|
|
("mock_ds", MagicMock()),
|
|
)
|
|
for attr, mock_obj in attrs:
|
|
setattr(self, attr, mock_obj)
|
|
self.addCleanup(delattr, self, attr)
|
|
|
|
patches = (
|
|
(
|
|
"salt.utils.vmware.get_service_instance",
|
|
MagicMock(return_value=self.mock_si),
|
|
),
|
|
(
|
|
"salt.modules.vsphere.get_proxy_type",
|
|
MagicMock(return_value="esxdatacenter"),
|
|
),
|
|
(
|
|
"salt.modules.vsphere._get_proxy_target",
|
|
MagicMock(return_value=self.mock_target),
|
|
),
|
|
(
|
|
"salt.utils.vmware.get_datastores",
|
|
MagicMock(return_value=[self.mock_ds]),
|
|
),
|
|
("salt.utils.vmware.remove_datastore", MagicMock()),
|
|
)
|
|
for module, mock_obj in patches:
|
|
patcher = patch(module, mock_obj)
|
|
patcher.start()
|
|
self.addCleanup(patcher.stop)
|
|
|
|
def test_supported_proxes(self):
|
|
supported_proxies = ["esxi", "esxcluster", "esxdatacenter"]
|
|
for proxy_type in supported_proxies:
|
|
with patch(
|
|
"salt.modules.vsphere.get_proxy_type",
|
|
MagicMock(return_value=proxy_type),
|
|
):
|
|
vsphere.remove_datastore(datastore="fake_ds_name")
|
|
|
|
def test__get_proxy_target_call(self):
|
|
mock__get_proxy_target = MagicMock(return_value=self.mock_target)
|
|
with patch("salt.modules.vsphere._get_proxy_target", mock__get_proxy_target):
|
|
vsphere.remove_datastore(datastore="fake_ds_name")
|
|
mock__get_proxy_target.assert_called_once_with(self.mock_si)
|
|
|
|
def test_get_datastores_call(self):
|
|
mock_get_datastores = MagicMock()
|
|
with patch("salt.utils.vmware.get_datastores", mock_get_datastores):
|
|
vsphere.remove_datastore(datastore="fake_ds")
|
|
mock_get_datastores.assert_called_once_with(
|
|
self.mock_si, reference=self.mock_target, datastore_names=["fake_ds"]
|
|
)
|
|
|
|
def test_datastore_not_found(self):
|
|
with patch("salt.utils.vmware.get_datastores", MagicMock(return_value=[])):
|
|
with self.assertRaises(VMwareObjectRetrievalError) as excinfo:
|
|
vsphere.remove_datastore(datastore="fake_ds")
|
|
self.assertEqual(
|
|
"Datastore 'fake_ds' was not found", excinfo.exception.strerror
|
|
)
|
|
|
|
def test_multiple_datastores_found(self):
|
|
with patch(
|
|
"salt.utils.vmware.get_datastores",
|
|
MagicMock(return_value=[MagicMock(), MagicMock()]),
|
|
):
|
|
with self.assertRaises(VMwareObjectRetrievalError) as excinfo:
|
|
vsphere.remove_datastore(datastore="fake_ds")
|
|
self.assertEqual(
|
|
"Multiple datastores 'fake_ds' were found", excinfo.exception.strerror
|
|
)
|
|
|
|
def test_remove_datastore_call(self):
|
|
mock_remove_datastore = MagicMock()
|
|
with patch("salt.utils.vmware.remove_datastore", mock_remove_datastore):
|
|
vsphere.remove_datastore(datastore="fake_ds")
|
|
mock_remove_datastore.assert_called_once_with(self.mock_si, self.mock_ds)
|
|
|
|
def test_success_output(self):
|
|
res = vsphere.remove_datastore(datastore="fake_ds")
|
|
self.assertTrue(res)
|
|
|
|
|
|
@skipIf(not HAS_PYVMOMI, "The 'pyvmomi' library is missing")
|
|
class RemoveDiskgroupTestCase(TestCase, LoaderModuleMockMixin):
|
|
"""
|
|
Tests for salt.modules.vsphere.remove_diskgroup
|
|
"""
|
|
|
|
def setup_loader_modules(self):
|
|
return {
|
|
vsphere: {
|
|
"_get_proxy_connection_details": MagicMock(),
|
|
"__proxy__": {
|
|
"esxi.get_details": MagicMock(
|
|
return_value={"esxi_host": "fake_host"}
|
|
)
|
|
},
|
|
}
|
|
}
|
|
|
|
def setUp(self):
|
|
attrs = (
|
|
("mock_si", MagicMock()),
|
|
("mock_host", MagicMock()),
|
|
("mock_diskgroup", MagicMock()),
|
|
)
|
|
for attr, mock_obj in attrs:
|
|
setattr(self, attr, mock_obj)
|
|
self.addCleanup(delattr, self, attr)
|
|
|
|
patches = (
|
|
(
|
|
"salt.utils.vmware.get_service_instance",
|
|
MagicMock(return_value=self.mock_si),
|
|
),
|
|
("salt.modules.vsphere.get_proxy_type", MagicMock(return_value="esxi")),
|
|
(
|
|
"salt.modules.vsphere._get_proxy_target",
|
|
MagicMock(return_value=self.mock_host),
|
|
),
|
|
(
|
|
"salt.utils.vmware.get_diskgroups",
|
|
MagicMock(return_value=[self.mock_diskgroup]),
|
|
),
|
|
("salt.utils.vsan.remove_diskgroup", MagicMock()),
|
|
)
|
|
for module, mock_obj in patches:
|
|
patcher = patch(module, mock_obj)
|
|
patcher.start()
|
|
self.addCleanup(patcher.stop)
|
|
|
|
def test_supported_proxes(self):
|
|
supported_proxies = ["esxi"]
|
|
for proxy_type in supported_proxies:
|
|
with patch(
|
|
"salt.modules.vsphere.get_proxy_type",
|
|
MagicMock(return_value=proxy_type),
|
|
):
|
|
vsphere.remove_diskgroup(cache_disk_id="fake_disk_id")
|
|
|
|
def test__get_proxy_target_call(self):
|
|
mock__get_proxy_target = MagicMock(return_value=self.mock_host)
|
|
with patch("salt.modules.vsphere._get_proxy_target", mock__get_proxy_target):
|
|
vsphere.remove_diskgroup(cache_disk_id="fake_disk_id")
|
|
mock__get_proxy_target.assert_called_once_with(self.mock_si)
|
|
|
|
def test_get_disk_groups(self):
|
|
mock_get_diskgroups = MagicMock(return_value=[self.mock_diskgroup])
|
|
with patch("salt.utils.vmware.get_diskgroups", mock_get_diskgroups):
|
|
vsphere.remove_diskgroup(cache_disk_id="fake_disk_id")
|
|
mock_get_diskgroups.assert_called_once_with(
|
|
self.mock_host, cache_disk_ids=["fake_disk_id"]
|
|
)
|
|
|
|
def test_disk_group_not_found_safety_checks_set(self):
|
|
with patch("salt.utils.vmware.get_diskgroups", MagicMock(return_value=[])):
|
|
with self.assertRaises(VMwareObjectRetrievalError) as excinfo:
|
|
vsphere.remove_diskgroup(cache_disk_id="fake_disk_id")
|
|
self.assertEqual(
|
|
"No diskgroup with cache disk id "
|
|
"'fake_disk_id' was found in ESXi host "
|
|
"'fake_host'",
|
|
excinfo.exception.strerror,
|
|
)
|
|
|
|
def test_remove_disk_group(self):
|
|
mock_remove_diskgroup = MagicMock(return_value=None)
|
|
with patch("salt.utils.vsan.remove_diskgroup", mock_remove_diskgroup):
|
|
vsphere.remove_diskgroup(cache_disk_id="fake_disk_id")
|
|
mock_remove_diskgroup.assert_called_once_with(
|
|
self.mock_si, self.mock_host, self.mock_diskgroup, data_accessibility=True
|
|
)
|
|
|
|
def test_remove_disk_group_data_accessibility_false(self):
|
|
mock_remove_diskgroup = MagicMock(return_value=None)
|
|
with patch("salt.utils.vsan.remove_diskgroup", mock_remove_diskgroup):
|
|
vsphere.remove_diskgroup(
|
|
cache_disk_id="fake_disk_id", data_accessibility=False
|
|
)
|
|
mock_remove_diskgroup.assert_called_once_with(
|
|
self.mock_si, self.mock_host, self.mock_diskgroup, data_accessibility=False
|
|
)
|
|
|
|
def test_success_output(self):
|
|
res = vsphere.remove_diskgroup(cache_disk_id="fake_disk_id")
|
|
self.assertTrue(res)
|
|
|
|
|
|
@skipIf(not HAS_PYVMOMI, "The 'pyvmomi' library is missing")
|
|
@skipIf(not vsphere.HAS_JSONSCHEMA, "The 'jsonschema' library is missing")
|
|
class RemoveCapacityFromDiskgroupTestCase(TestCase, LoaderModuleMockMixin):
|
|
"""
|
|
Tests for salt.modules.vsphere.remove_capacity_from_diskgroup
|
|
"""
|
|
|
|
def setup_loader_modules(self):
|
|
return {
|
|
vsphere: {
|
|
"_get_proxy_connection_details": MagicMock(),
|
|
"__proxy__": {
|
|
"esxi.get_details": MagicMock(
|
|
return_value={"esxi_host": "fake_host"}
|
|
)
|
|
},
|
|
}
|
|
}
|
|
|
|
def setUp(self):
|
|
attrs = (
|
|
("mock_si", MagicMock()),
|
|
("mock_schema", MagicMock()),
|
|
("mock_host", MagicMock()),
|
|
("mock_disk1", MagicMock(canonicalName="fake_disk1")),
|
|
("mock_disk2", MagicMock(canonicalName="fake_disk2")),
|
|
("mock_disk3", MagicMock(canonicalName="fake_disk3")),
|
|
("mock_diskgroup", MagicMock()),
|
|
)
|
|
for attr, mock_obj in attrs:
|
|
setattr(self, attr, mock_obj)
|
|
self.addCleanup(delattr, self, attr)
|
|
|
|
patches = (
|
|
(
|
|
"salt.utils.vmware.get_service_instance",
|
|
MagicMock(return_value=self.mock_si),
|
|
),
|
|
(
|
|
"salt.modules.vsphere.DiskGroupsDiskIdSchema.serialize",
|
|
MagicMock(return_value=self.mock_schema),
|
|
),
|
|
("salt.modules.vsphere.jsonschema.validate", MagicMock()),
|
|
("salt.modules.vsphere.get_proxy_type", MagicMock(return_value="esxi")),
|
|
(
|
|
"salt.modules.vsphere._get_proxy_target",
|
|
MagicMock(return_value=self.mock_host),
|
|
),
|
|
(
|
|
"salt.utils.vmware.get_disks",
|
|
MagicMock(
|
|
return_value=[self.mock_disk1, self.mock_disk2, self.mock_disk3]
|
|
),
|
|
),
|
|
(
|
|
"salt.utils.vmware.get_diskgroups",
|
|
MagicMock(return_value=[self.mock_diskgroup]),
|
|
),
|
|
("salt.utils.vsan.remove_capacity_from_diskgroup", MagicMock()),
|
|
)
|
|
for module, mock_obj in patches:
|
|
patcher = patch(module, mock_obj)
|
|
patcher.start()
|
|
self.addCleanup(patcher.stop)
|
|
|
|
def test_validate(self):
|
|
mock_schema_validate = MagicMock()
|
|
with patch("salt.modules.vsphere.jsonschema.validate", mock_schema_validate):
|
|
vsphere.remove_capacity_from_diskgroup(
|
|
cache_disk_id="fake_cache_disk_id",
|
|
capacity_disk_ids=["fake_disk1", "fake_disk2"],
|
|
)
|
|
mock_schema_validate.assert_called_once_with(
|
|
{
|
|
"diskgroups": [
|
|
{
|
|
"cache_id": "fake_cache_disk_id",
|
|
"capacity_ids": ["fake_disk1", "fake_disk2"],
|
|
}
|
|
]
|
|
},
|
|
self.mock_schema,
|
|
)
|
|
|
|
def test_invalid_schema_validation(self):
|
|
mock_schema_validate = MagicMock(
|
|
side_effect=vsphere.jsonschema.exceptions.ValidationError("err")
|
|
)
|
|
with patch("salt.modules.vsphere.jsonschema.validate", mock_schema_validate):
|
|
with self.assertRaises(ArgumentValueError) as excinfo:
|
|
vsphere.remove_capacity_from_diskgroup(
|
|
cache_disk_id="fake_cache_disk_id",
|
|
capacity_disk_ids=["fake_disk1", "fake_disk2"],
|
|
)
|
|
self.assertEqual("err", excinfo.exception.strerror)
|
|
|
|
def test_supported_proxes(self):
|
|
supported_proxies = ["esxi"]
|
|
for proxy_type in supported_proxies:
|
|
with patch(
|
|
"salt.modules.vsphere.get_proxy_type",
|
|
MagicMock(return_value=proxy_type),
|
|
):
|
|
vsphere.remove_capacity_from_diskgroup(
|
|
cache_disk_id="fake_cache_disk_id",
|
|
capacity_disk_ids=["fake_disk1", "fake_disk2"],
|
|
)
|
|
|
|
def test__get_proxy_target_call(self):
|
|
mock__get_proxy_target = MagicMock(return_value=self.mock_host)
|
|
with patch("salt.modules.vsphere._get_proxy_target", mock__get_proxy_target):
|
|
vsphere.remove_capacity_from_diskgroup(
|
|
cache_disk_id="fake_cache_disk_id",
|
|
capacity_disk_ids=["fake_disk1", "fake_disk2"],
|
|
)
|
|
mock__get_proxy_target.assert_called_once_with(self.mock_si)
|
|
|
|
def test_get_disks(self):
|
|
mock_get_disks = MagicMock(
|
|
return_value=[self.mock_disk1, self.mock_disk2, self.mock_disk3]
|
|
)
|
|
with patch("salt.utils.vmware.get_disks", mock_get_disks):
|
|
vsphere.remove_capacity_from_diskgroup(
|
|
cache_disk_id="fake_cache_disk_id",
|
|
capacity_disk_ids=["fake_disk1", "fake_disk2"],
|
|
)
|
|
mock_get_disks.assert_called_once_with(
|
|
self.mock_host, disk_ids=["fake_disk1", "fake_disk2"]
|
|
)
|
|
|
|
def test_disk_not_found_safety_checks_set(self):
|
|
mock_get_disks = MagicMock(
|
|
return_value=[self.mock_disk1, self.mock_disk2, self.mock_disk3]
|
|
)
|
|
with patch("salt.utils.vmware.get_disks", mock_get_disks):
|
|
with self.assertRaises(VMwareObjectRetrievalError) as excinfo:
|
|
vsphere.remove_capacity_from_diskgroup(
|
|
cache_disk_id="fake_cache_disk_id",
|
|
capacity_disk_ids=["fake_disk1", "fake_disk4"],
|
|
safety_checks=True,
|
|
)
|
|
self.assertEqual(
|
|
"No disk with id 'fake_disk4' was found " "in ESXi host 'fake_host'",
|
|
excinfo.exception.strerror,
|
|
)
|
|
|
|
def test_get_diskgroups(self):
|
|
mock_get_diskgroups = MagicMock(return_value=[self.mock_diskgroup])
|
|
with patch("salt.utils.vmware.get_diskgroups", mock_get_diskgroups):
|
|
vsphere.remove_capacity_from_diskgroup(
|
|
cache_disk_id="fake_cache_disk_id",
|
|
capacity_disk_ids=["fake_disk1", "fake_disk2"],
|
|
)
|
|
mock_get_diskgroups.assert_called_once_with(
|
|
self.mock_host, cache_disk_ids=["fake_cache_disk_id"]
|
|
)
|
|
|
|
def test_diskgroup_not_found(self):
|
|
with patch("salt.utils.vmware.get_diskgroups", MagicMock(return_value=[])):
|
|
with self.assertRaises(VMwareObjectRetrievalError) as excinfo:
|
|
vsphere.remove_capacity_from_diskgroup(
|
|
cache_disk_id="fake_cache_disk_id",
|
|
capacity_disk_ids=["fake_disk1", "fake_disk2"],
|
|
)
|
|
self.assertEqual(
|
|
"No diskgroup with cache disk id "
|
|
"'fake_cache_disk_id' was found in ESXi host "
|
|
"'fake_host'",
|
|
excinfo.exception.strerror,
|
|
)
|
|
|
|
def test_remove_capacity_from_diskgroup(self):
|
|
mock_remove_capacity_from_diskgroup = MagicMock()
|
|
with patch(
|
|
"salt.utils.vsan.remove_capacity_from_diskgroup",
|
|
mock_remove_capacity_from_diskgroup,
|
|
):
|
|
vsphere.remove_capacity_from_diskgroup(
|
|
cache_disk_id="fake_cache_disk_id",
|
|
capacity_disk_ids=["fake_disk1", "fake_disk2"],
|
|
)
|
|
mock_remove_capacity_from_diskgroup.assert_called_once_with(
|
|
self.mock_si,
|
|
self.mock_host,
|
|
self.mock_diskgroup,
|
|
capacity_disks=[self.mock_disk1, self.mock_disk2],
|
|
data_evacuation=True,
|
|
)
|
|
|
|
def test_remove_capacity_from_diskgroup_data_evacuation_false(self):
|
|
mock_remove_capacity_from_diskgroup = MagicMock()
|
|
with patch(
|
|
"salt.utils.vsan.remove_capacity_from_diskgroup",
|
|
mock_remove_capacity_from_diskgroup,
|
|
):
|
|
vsphere.remove_capacity_from_diskgroup(
|
|
cache_disk_id="fake_cache_disk_id",
|
|
capacity_disk_ids=["fake_disk1", "fake_disk2"],
|
|
data_evacuation=False,
|
|
)
|
|
mock_remove_capacity_from_diskgroup.assert_called_once_with(
|
|
self.mock_si,
|
|
self.mock_host,
|
|
self.mock_diskgroup,
|
|
capacity_disks=[self.mock_disk1, self.mock_disk2],
|
|
data_evacuation=False,
|
|
)
|
|
|
|
def test_success_output(self):
|
|
res = vsphere.remove_capacity_from_diskgroup(
|
|
cache_disk_id="fake_cache_disk_id",
|
|
capacity_disk_ids=["fake_disk1", "fake_disk2"],
|
|
)
|
|
self.assertTrue(res)
|
|
|
|
|
|
@skipIf(not HAS_PYVMOMI, "The 'pyvmomi' library is missing")
|
|
class ListClusterTestCase(TestCase, LoaderModuleMockMixin):
|
|
"""
|
|
Tests for salt.modules.vsphere.list_cluster
|
|
"""
|
|
|
|
def setup_loader_modules(self):
|
|
return {vsphere: {"_get_proxy_connection_details": MagicMock(), "__salt__": {}}}
|
|
|
|
def setUp(self):
|
|
attrs = (
|
|
("mock_si", MagicMock()),
|
|
("mock_dc", MagicMock()),
|
|
("mock_cl", MagicMock()),
|
|
("mock__get_cluster_dict", MagicMock()),
|
|
)
|
|
for attr, mock_obj in attrs:
|
|
setattr(self, attr, mock_obj)
|
|
self.addCleanup(delattr, self, attr)
|
|
attrs = (("mock_get_cluster", MagicMock(return_value=self.mock_cl)),)
|
|
for attr, mock_obj in attrs:
|
|
setattr(self, attr, mock_obj)
|
|
self.addCleanup(delattr, self, attr)
|
|
patches = (
|
|
(
|
|
"salt.utils.vmware.get_service_instance",
|
|
MagicMock(return_value=self.mock_si),
|
|
),
|
|
(
|
|
"salt.modules.vsphere.get_proxy_type",
|
|
MagicMock(return_value="esxcluster"),
|
|
),
|
|
(
|
|
"salt.modules.vsphere._get_proxy_target",
|
|
MagicMock(return_value=self.mock_cl),
|
|
),
|
|
("salt.utils.vmware.get_cluster", self.mock_get_cluster),
|
|
("salt.modules.vsphere._get_cluster_dict", self.mock__get_cluster_dict),
|
|
)
|
|
for module, mock_obj in patches:
|
|
patcher = patch(module, mock_obj)
|
|
patcher.start()
|
|
self.addCleanup(patcher.stop)
|
|
# Patch __salt__ dunder
|
|
patcher = patch.dict(
|
|
vsphere.__salt__,
|
|
{"esxcluster.get_details": MagicMock(return_value={"cluster": "cl"})},
|
|
)
|
|
patcher.start()
|
|
self.addCleanup(patcher.stop)
|
|
|
|
def test_supported_proxies(self):
|
|
supported_proxies = ["esxcluster", "esxdatacenter"]
|
|
for proxy_type in supported_proxies:
|
|
with patch(
|
|
"salt.modules.vsphere.get_proxy_type",
|
|
MagicMock(return_value=proxy_type),
|
|
):
|
|
vsphere.list_cluster(cluster="cl")
|
|
|
|
def test_default_service_instance(self):
|
|
mock__get_proxy_target = MagicMock()
|
|
with patch("salt.modules.vsphere._get_proxy_target", mock__get_proxy_target):
|
|
vsphere.list_cluster()
|
|
mock__get_proxy_target.assert_called_once_with(self.mock_si)
|
|
|
|
def test_defined_service_instance(self):
|
|
mock_si = MagicMock()
|
|
mock__get_proxy_target = MagicMock()
|
|
with patch("salt.modules.vsphere._get_proxy_target", mock__get_proxy_target):
|
|
vsphere.list_cluster(service_instance=mock_si)
|
|
mock__get_proxy_target.assert_called_once_with(mock_si)
|
|
|
|
def test_no_cluster_raises_argument_value_error(self):
|
|
with patch(
|
|
"salt.modules.vsphere.get_proxy_type",
|
|
MagicMock(return_value="esxdatacenter"),
|
|
):
|
|
with patch("salt.modules.vsphere._get_proxy_target", MagicMock()):
|
|
with self.assertRaises(ArgumentValueError) as excinfo:
|
|
vsphere.list_cluster()
|
|
self.assertEqual(excinfo.exception.strerror, "'cluster' needs to be specified")
|
|
|
|
def test_get_cluster_call(self):
|
|
with patch(
|
|
"salt.modules.vsphere.get_proxy_type",
|
|
MagicMock(return_value="esxdatacenter"),
|
|
):
|
|
with patch(
|
|
"salt.modules.vsphere._get_proxy_target",
|
|
MagicMock(return_value=self.mock_dc),
|
|
):
|
|
vsphere.list_cluster(cluster="cl")
|
|
self.mock_get_cluster.assert_called_once_with(self.mock_dc, "cl")
|
|
|
|
def test__get_cluster_dict_call(self):
|
|
vsphere.list_cluster()
|
|
self.mock__get_cluster_dict.assert_called_once_with("cl", self.mock_cl)
|
|
|
|
|
|
@skipIf(not HAS_PYVMOMI, "The 'pyvmomi' library is missing")
|
|
class RenameDatastoreTestCase(TestCase, LoaderModuleMockMixin):
|
|
"""
|
|
Tests for salt.modules.vsphere.rename_datastore
|
|
"""
|
|
|
|
def setup_loader_modules(self):
|
|
return {
|
|
vsphere: {
|
|
"_get_proxy_connection_details": MagicMock(),
|
|
"get_proxy_type": MagicMock(return_value="esxdatacenter"),
|
|
}
|
|
}
|
|
|
|
def setUp(self):
|
|
self.mock_si = MagicMock()
|
|
self.mock_target = MagicMock()
|
|
self.mock_ds_ref = MagicMock()
|
|
self.mock_get_datastores = MagicMock(return_value=[self.mock_ds_ref])
|
|
self.mock_rename_datastore = MagicMock()
|
|
patches = (
|
|
(
|
|
"salt.utils.vmware.get_service_instance",
|
|
MagicMock(return_value=self.mock_si),
|
|
),
|
|
(
|
|
"salt.modules.vsphere._get_proxy_target",
|
|
MagicMock(return_value=self.mock_target),
|
|
),
|
|
("salt.utils.vmware.get_datastores", self.mock_get_datastores),
|
|
("salt.utils.vmware.rename_datastore", self.mock_rename_datastore),
|
|
)
|
|
for mod, mock in patches:
|
|
patcher = patch(mod, mock)
|
|
patcher.start()
|
|
self.addCleanup(patcher.stop)
|
|
|
|
def tearDown(self):
|
|
for attr in (
|
|
"mock_si",
|
|
"mock_target",
|
|
"mock_ds_ref",
|
|
"mock_get_datastores",
|
|
"mock_rename_datastore",
|
|
):
|
|
delattr(self, attr)
|
|
|
|
def test_supported_proxes(self):
|
|
supported_proxies = ["esxi", "esxcluster", "esxdatacenter"]
|
|
for proxy_type in supported_proxies:
|
|
with patch(
|
|
"salt.modules.vsphere.get_proxy_type",
|
|
MagicMock(return_value=proxy_type),
|
|
):
|
|
vsphere.rename_datastore("current_ds_name", "new_ds_name")
|
|
|
|
def test_default_service_instance(self):
|
|
mock__get_proxy_target = MagicMock()
|
|
with patch("salt.modules.vsphere._get_proxy_target", mock__get_proxy_target):
|
|
vsphere.rename_datastore("current_ds_name", "new_ds_name")
|
|
mock__get_proxy_target.assert_called_once_with(self.mock_si)
|
|
|
|
def test_defined_service_instance(self):
|
|
mock_si = MagicMock()
|
|
mock__get_proxy_target = MagicMock()
|
|
with patch("salt.modules.vsphere._get_proxy_target", mock__get_proxy_target):
|
|
vsphere.rename_datastore(
|
|
"current_ds_name", "new_ds_name", service_instance=mock_si
|
|
)
|
|
|
|
mock__get_proxy_target.assert_called_once_with(mock_si)
|
|
|
|
def test_get_datastore_call(self):
|
|
vsphere.rename_datastore("current_ds_name", "new_ds_name")
|
|
self.mock_get_datastores.assert_called_once_with(
|
|
self.mock_si, self.mock_target, datastore_names=["current_ds_name"]
|
|
)
|
|
|
|
def test_get_no_datastores(self):
|
|
with patch("salt.utils.vmware.get_datastores", MagicMock(return_value=[])):
|
|
with self.assertRaises(VMwareObjectRetrievalError) as excinfo:
|
|
vsphere.rename_datastore("current_ds_name", "new_ds_name")
|
|
self.assertEqual(
|
|
excinfo.exception.strerror, "Datastore 'current_ds_name' was not found"
|
|
)
|
|
|
|
def test_rename_datastore_call(self):
|
|
vsphere.rename_datastore("current_ds_name", "new_ds_name")
|
|
self.mock_rename_datastore.assert_called_once_with(
|
|
self.mock_ds_ref, "new_ds_name"
|
|
)
|
|
|
|
|
|
class _GetProxyTargetTestCase(TestCase, LoaderModuleMockMixin):
|
|
"""
|
|
Tests for salt.modules.vsphere._get_proxy_target
|
|
"""
|
|
|
|
def setup_loader_modules(self):
|
|
return {
|
|
vsphere: {
|
|
"_get_proxy_connection_details": MagicMock(),
|
|
"get_proxy_type": MagicMock(return_value="esxdatacenter"),
|
|
}
|
|
}
|
|
|
|
def setUp(self):
|
|
attrs = (
|
|
("mock_si", MagicMock()),
|
|
("mock_dc", MagicMock()),
|
|
("mock_cl", MagicMock()),
|
|
("mock_root", MagicMock()),
|
|
)
|
|
for attr, mock_obj in attrs:
|
|
setattr(self, attr, mock_obj)
|
|
self.addCleanup(delattr, self, attr)
|
|
attrs = (
|
|
("mock_get_datacenter", MagicMock(return_value=self.mock_dc)),
|
|
("mock_get_cluster", MagicMock(return_value=self.mock_cl)),
|
|
("mock_get_root_folder", MagicMock(return_value=self.mock_root)),
|
|
)
|
|
for attr, mock_obj in attrs:
|
|
setattr(self, attr, mock_obj)
|
|
self.addCleanup(delattr, self, attr)
|
|
patches = (
|
|
(
|
|
"salt.modules.vsphere.get_proxy_type",
|
|
MagicMock(return_value="esxcluster"),
|
|
),
|
|
(
|
|
"salt.utils.vmware.is_connection_to_a_vcenter",
|
|
MagicMock(return_value=True),
|
|
),
|
|
(
|
|
"salt.modules.vsphere._get_esxcluster_proxy_details",
|
|
MagicMock(
|
|
return_value=(
|
|
None,
|
|
None,
|
|
None,
|
|
None,
|
|
None,
|
|
None,
|
|
None,
|
|
None,
|
|
"datacenter",
|
|
"cluster",
|
|
)
|
|
),
|
|
),
|
|
(
|
|
"salt.modules.vsphere._get_esxdatacenter_proxy_details",
|
|
MagicMock(
|
|
return_value=(
|
|
None,
|
|
None,
|
|
None,
|
|
None,
|
|
None,
|
|
None,
|
|
None,
|
|
None,
|
|
"datacenter",
|
|
)
|
|
),
|
|
),
|
|
("salt.utils.vmware.get_datacenter", self.mock_get_datacenter),
|
|
("salt.utils.vmware.get_cluster", self.mock_get_cluster),
|
|
("salt.utils.vmware.get_root_folder", self.mock_get_root_folder),
|
|
)
|
|
for module, mock_obj in patches:
|
|
patcher = patch(module, mock_obj)
|
|
patcher.start()
|
|
self.addCleanup(patcher.stop)
|
|
|
|
def test_supported_proxies(self):
|
|
supported_proxies = ["esxcluster", "esxdatacenter"]
|
|
for proxy_type in supported_proxies:
|
|
with patch(
|
|
"salt.modules.vsphere.get_proxy_type",
|
|
MagicMock(return_value=proxy_type),
|
|
):
|
|
vsphere._get_proxy_target(self.mock_si)
|
|
|
|
def test_connected_to_esxi(self):
|
|
with patch(
|
|
"salt.utils.vmware.is_connection_to_a_vcenter",
|
|
MagicMock(return_value=False),
|
|
):
|
|
with self.assertRaises(CommandExecutionError) as excinfo:
|
|
vsphere._get_proxy_target(self.mock_si)
|
|
self.assertEqual(
|
|
excinfo.exception.strerror,
|
|
"'_get_proxy_target' not supported when " "connected via the ESXi host",
|
|
)
|
|
|
|
def test_get_cluster_call(self):
|
|
vsphere._get_proxy_target(self.mock_si)
|
|
self.mock_get_datacenter.assert_called_once_with(self.mock_si, "datacenter")
|
|
self.mock_get_cluster.assert_called_once_with(self.mock_dc, "cluster")
|
|
|
|
def test_esxcluster_proxy_return(self):
|
|
with patch(
|
|
"salt.modules.vsphere.get_proxy_type", MagicMock(return_value="esxcluster")
|
|
):
|
|
ret = vsphere._get_proxy_target(self.mock_si)
|
|
self.assertEqual(ret, self.mock_cl)
|
|
|
|
def test_get_datacenter_call(self):
|
|
with patch(
|
|
"salt.modules.vsphere.get_proxy_type",
|
|
MagicMock(return_value="esxdatacenter"),
|
|
):
|
|
vsphere._get_proxy_target(self.mock_si)
|
|
self.mock_get_datacenter.assert_called_once_with(self.mock_si, "datacenter")
|
|
self.assertEqual(self.mock_get_cluster.call_count, 0)
|
|
|
|
def test_esxdatacenter_proxy_return(self):
|
|
with patch(
|
|
"salt.modules.vsphere.get_proxy_type",
|
|
MagicMock(return_value="esxdatacenter"),
|
|
):
|
|
ret = vsphere._get_proxy_target(self.mock_si)
|
|
self.assertEqual(ret, self.mock_dc)
|
|
|
|
def test_vcenter_proxy_return(self):
|
|
with patch(
|
|
"salt.modules.vsphere.get_proxy_type", MagicMock(return_value="vcenter")
|
|
):
|
|
ret = vsphere._get_proxy_target(self.mock_si)
|
|
self.mock_get_root_folder.assert_called_once_with(self.mock_si)
|
|
self.assertEqual(ret, self.mock_root)
|
|
|
|
|
|
@skipIf(not HAS_VSPHERE_SDK, "The 'vsphere-automation-sdk' library is missing")
|
|
class TestVSphereTagging(TestCase, LoaderModuleMockMixin):
|
|
"""
|
|
Tests for:
|
|
- salt.modules.vsphere.create_tag_category
|
|
- salt.modules.vsphere.create_tag
|
|
- salt.modules.vsphere.delete_tag_category
|
|
- salt.modules.vsphere.delete_tag
|
|
- salt.modules.vsphere.list_tag_categories
|
|
- salt.modules.vsphere.list_tags
|
|
- salt.modules.vsphere.attach_tags
|
|
- salt.modules.vsphere.list_attached_tags
|
|
"""
|
|
|
|
def setup_loader_modules(self):
|
|
return {
|
|
vsphere: {
|
|
"_get_proxy_connection_details": MagicMock(),
|
|
"get_proxy_type": MagicMock(return_value="vcenter"),
|
|
}
|
|
}
|
|
|
|
# Grains for expected __salt__ calls
|
|
details = {key: None for key in ["vcenter", "username", "password"]}
|
|
|
|
# Function attributes
|
|
func_attrs = {
|
|
key: None
|
|
for key in [
|
|
"category_id",
|
|
"object_id",
|
|
"tag_id",
|
|
"name",
|
|
"description",
|
|
"cardinality",
|
|
]
|
|
}
|
|
|
|
# Expected returns
|
|
create_tag_category = {
|
|
"Category created": "urn:vmomi:InventoryServiceTag:"
|
|
"bb0350b4-85db-46b0-a726-e7c5989fc857:GLOBAL"
|
|
}
|
|
|
|
create_tag = {
|
|
"Tag created": "urn:vmomi:InventoryServiceTag:"
|
|
"bb0350b4-85db-46b0-a726-e7c5989fc857:GLOBAL"
|
|
}
|
|
|
|
delete_tag_category = {
|
|
"Category deleted": "urn:vmomi:InventoryServiceTag:"
|
|
"bb0350b4-85db-46b0-a726-e7c5989fc857:GLOBAL"
|
|
}
|
|
|
|
delete_tag = {
|
|
"Tag deleted": "urn:vmomi:InventoryServiceTag:"
|
|
"bb0350b4-85db-46b0-a726-e7c5989fc857:GLOBAL"
|
|
}
|
|
|
|
list_tag_categories_return = [
|
|
"urn:vmomi:InventoryServiceCategory:"
|
|
"b13f4959-a3f3-48d0-8080-15bb586b4355:GLOBAL",
|
|
"urn:vmomi:InventoryServiceCategory:"
|
|
"f4d41f02-c317-422d-9013-dcbebfcd54ad:GLOBAL",
|
|
"urn:vmomi:InventoryServiceCategory:"
|
|
"2db5b00b-f211-4bba-ba42-e2658ebbb283:GLOBAL",
|
|
"urn:vmomi:InventoryServiceCategory:"
|
|
"cd847c3c-687c-4bd9-8e5a-0eb536f0a01d:GLOBAL",
|
|
"urn:vmomi:InventoryServiceCategory:"
|
|
"d51c24f9-cffb-4ce0-af56-7f18b6e649af:GLOBAL",
|
|
]
|
|
|
|
list_tags_return = [
|
|
"urn:vmomi:InventoryServiceTag:a584a83b-3015-45ad-8057-a3630613052f:GLOBAL",
|
|
"urn:vmomi:InventoryServiceTag:db08019c-15de-4bbf-be46-d81aaf8d25c0:GLOBAL",
|
|
"urn:vmomi:InventoryServiceTag:b55ecc77-f4a5-49f8-ab52-38865467cfbe:GLOBAL",
|
|
"urn:vmomi:InventoryServiceTag:f009ab1b-e1b5-4c40-b8f7-951d9d716b39:GLOBAL",
|
|
"urn:vmomi:InventoryServiceTag:102bb4c5-9b76-4d6c-882a-76a91ee3edcc:GLOBAL",
|
|
"urn:vmomi:InventoryServiceTag:bb0350b4-85db-46b0-a726-e7c5989fc857:GLOBAL",
|
|
"urn:vmomi:InventoryServiceTag:71d30f2d-bb23-48e1-995f-630adfb0dc89:GLOBAL",
|
|
]
|
|
|
|
list_attached_tags_return = [
|
|
"urn:vmomi:InventoryServiceTag:b55ecc77-f4a5-49f8-ab52-38865467cfbe:GLOBAL",
|
|
"urn:vmomi:InventoryServiceTag:bb0350b4-85db-46b0-a726-e7c5989fc857:GLOBAL",
|
|
]
|
|
|
|
list_create_category_return = [
|
|
"urn:vmomi:InventoryServiceCategory:"
|
|
"0af54c2d-e8cd-4248-931e-2f5807d8c477:GLOBAL"
|
|
]
|
|
|
|
list_create_tag_return = [
|
|
"urn:vmomi:InventoryServiceCategory:"
|
|
"0af54c2d-e8cd-4248-931e-2f5807d8c477:GLOBAL"
|
|
]
|
|
|
|
attach_tags_return = {
|
|
"Tag attached": "urn:vmomi:InventoryServiceTag:"
|
|
"bb0350b4-85db-46b0-a726-e7c5989fc857:GLOBAL"
|
|
}
|
|
|
|
def test_create_tag_category_client_none(self):
|
|
get_details = MagicMock(return_value=self.details)
|
|
|
|
# Start patching each external API return with Mock Objects
|
|
with patch.object(
|
|
vsphere, "get_proxy_type", return_value="vcenter"
|
|
) as get_proxy_type:
|
|
with patch.object(
|
|
vsphere, "_get_proxy_connection_details", return_value=[]
|
|
) as get_proxy_connection:
|
|
with patch.object(
|
|
salt.utils.vmware, "get_service_instance", return_value=None
|
|
) as get_service_instance:
|
|
with patch.dict(
|
|
vsphere.__salt__,
|
|
{"vcenter.get_details": get_details},
|
|
clear=True,
|
|
) as get_vcenter_details:
|
|
with patch.object(
|
|
salt.utils.vmware, "get_vsphere_client", return_value=None
|
|
) as get_vsphere_client:
|
|
ret = vsphere.create_tag_category(
|
|
self.func_attrs["name"],
|
|
self.func_attrs["description"],
|
|
self.func_attrs["cardinality"],
|
|
)
|
|
# Check function calls and return data
|
|
get_proxy_type.assert_called_once()
|
|
get_proxy_connection.assert_called_once()
|
|
get_service_instance.assert_called_once()
|
|
get_vsphere_client.assert_called_once()
|
|
self.assertEqual(ret, {"Category created": None})
|
|
|
|
def test_create_tag_category_client(self):
|
|
for verify_ssl in [True, False, None]:
|
|
details = self.details.copy()
|
|
if verify_ssl is None:
|
|
verify_ssl = True
|
|
else:
|
|
details["verify_ssl"] = verify_ssl
|
|
get_details = MagicMock(return_value=details)
|
|
|
|
# Mock CreateSpec object and create objects
|
|
mock_client = Mock(
|
|
tagging=Mock(
|
|
Category=Mock(
|
|
CreateSpec=Mock(return_value=Mock()),
|
|
create=Mock(
|
|
return_value=self.create_tag_category["Category created"]
|
|
),
|
|
)
|
|
)
|
|
)
|
|
|
|
# Start patching each external API return with Mock Objects
|
|
with patch.object(
|
|
vsphere, "get_proxy_type", return_value="vcenter"
|
|
) as get_proxy_type:
|
|
with patch.object(
|
|
vsphere, "_get_proxy_connection_details", return_value=[]
|
|
) as get_proxy_connection:
|
|
with patch.object(
|
|
salt.utils.vmware, "get_service_instance", return_value=None
|
|
) as get_service_instance:
|
|
with patch.dict(
|
|
vsphere.__salt__,
|
|
{"vcenter.get_details": get_details},
|
|
clear=True,
|
|
) as get_vcenter_details:
|
|
with patch.object(
|
|
salt.utils.vmware,
|
|
"get_vsphere_client",
|
|
return_value=mock_client,
|
|
) as get_vsphere_client:
|
|
ret = vsphere.create_tag_category(
|
|
self.func_attrs["name"],
|
|
self.func_attrs["description"],
|
|
self.func_attrs["cardinality"],
|
|
)
|
|
|
|
# Check function calls and return data
|
|
get_proxy_type.assert_called_once()
|
|
get_proxy_connection.assert_called_once()
|
|
get_service_instance.assert_called_once()
|
|
get_vsphere_client.assert_called_once()
|
|
self.assertEqual(ret, self.create_tag_category)
|
|
self.assertEqual(
|
|
get_vsphere_client.call_args_list,
|
|
[
|
|
call(
|
|
ca_bundle=None,
|
|
password=None,
|
|
server=None,
|
|
username=None,
|
|
verify_ssl=verify_ssl,
|
|
)
|
|
],
|
|
)
|
|
|
|
def test_create_tag_client_none(self):
|
|
get_details = MagicMock(return_value=self.details)
|
|
|
|
# Start patching each external API return with Mock Objects
|
|
with patch.object(
|
|
vsphere, "get_proxy_type", return_value="vcenter"
|
|
) as get_proxy_type:
|
|
with patch.object(
|
|
vsphere, "_get_proxy_connection_details", return_value=[]
|
|
) as get_proxy_connection:
|
|
with patch.object(
|
|
salt.utils.vmware, "get_service_instance", return_value=None
|
|
) as get_service_instance:
|
|
with patch.dict(
|
|
vsphere.__salt__,
|
|
{"vcenter.get_details": get_details},
|
|
clear=True,
|
|
) as get_vcenter_details:
|
|
with patch.object(
|
|
salt.utils.vmware, "get_vsphere_client", return_value=None
|
|
) as get_vsphere_client:
|
|
ret = vsphere.create_tag(
|
|
self.func_attrs["name"],
|
|
self.func_attrs["description"],
|
|
self.func_attrs["cardinality"],
|
|
)
|
|
# Check function calls and return data
|
|
get_proxy_type.assert_called_once()
|
|
get_proxy_connection.assert_called_once()
|
|
get_service_instance.assert_called_once()
|
|
get_vsphere_client.assert_called_once()
|
|
self.assertEqual(ret, {"Tag created": None})
|
|
|
|
def test_create_tag_client(self):
|
|
get_details = MagicMock(return_value=self.details)
|
|
|
|
# Mock CreateSpec object and create objects
|
|
mock_client = Mock(
|
|
tagging=Mock(
|
|
Tag=Mock(
|
|
CreateSpec=Mock(return_value=Mock()),
|
|
create=Mock(return_value=self.create_tag["Tag created"]),
|
|
)
|
|
)
|
|
)
|
|
|
|
# Start patching each external API return with Mock Objects
|
|
with patch.object(
|
|
vsphere, "get_proxy_type", return_value="vcenter"
|
|
) as get_proxy_type:
|
|
with patch.object(
|
|
vsphere, "_get_proxy_connection_details", return_value=[]
|
|
) as get_proxy_connection:
|
|
with patch.object(
|
|
salt.utils.vmware, "get_service_instance", return_value=None
|
|
) as get_service_instance:
|
|
with patch.dict(
|
|
vsphere.__salt__,
|
|
{"vcenter.get_details": get_details},
|
|
clear=True,
|
|
) as get_vcenter_details:
|
|
with patch.object(
|
|
salt.utils.vmware,
|
|
"get_vsphere_client",
|
|
return_value=mock_client,
|
|
) as get_vsphere_client:
|
|
ret = vsphere.create_tag(
|
|
self.func_attrs["name"],
|
|
self.func_attrs["description"],
|
|
self.func_attrs["cardinality"],
|
|
)
|
|
# Check function calls and return data
|
|
get_proxy_type.assert_called_once()
|
|
get_proxy_connection.assert_called_once()
|
|
get_service_instance.assert_called_once()
|
|
get_vsphere_client.assert_called_once()
|
|
self.assertEqual(ret, self.create_tag)
|
|
|
|
def test_delete_tag_category_client_none(self):
|
|
get_details = MagicMock(return_value=self.details)
|
|
|
|
# Start patching each external API return with Mock Objects
|
|
with patch.object(
|
|
vsphere, "get_proxy_type", return_value="vcenter"
|
|
) as get_proxy_type:
|
|
with patch.object(
|
|
vsphere, "_get_proxy_connection_details", return_value=[]
|
|
) as get_proxy_connection:
|
|
with patch.object(
|
|
salt.utils.vmware, "get_service_instance", return_value=None
|
|
) as get_service_instance:
|
|
with patch.dict(
|
|
vsphere.__salt__,
|
|
{"vcenter.get_details": get_details},
|
|
clear=True,
|
|
) as get_vcenter_details:
|
|
with patch.object(
|
|
salt.utils.vmware, "get_vsphere_client", return_value=None
|
|
) as get_vsphere_client:
|
|
ret = vsphere.delete_tag_category(
|
|
self.func_attrs["category_id"]
|
|
)
|
|
# Check function calls and return data
|
|
get_proxy_type.assert_called_once()
|
|
get_proxy_connection.assert_called_once()
|
|
get_service_instance.assert_called_once()
|
|
get_vsphere_client.assert_called_once()
|
|
self.assertEqual(ret, {"Category deleted": None})
|
|
|
|
def test_delete_tag_category_client(self):
|
|
for verify_ssl in [True, False, None]:
|
|
details = self.details.copy()
|
|
if verify_ssl is None:
|
|
verify_ssl = True
|
|
else:
|
|
details["verify_ssl"] = verify_ssl
|
|
get_details = MagicMock(return_value=details)
|
|
|
|
# Mock CreateSpec object and create objects
|
|
mock_client = Mock(
|
|
tagging=Mock(
|
|
Category=Mock(
|
|
delete=Mock(
|
|
return_value=self.delete_tag_category["Category deleted"]
|
|
)
|
|
)
|
|
)
|
|
)
|
|
|
|
# Start patching each external API return with Mock Objects
|
|
with patch.object(
|
|
vsphere, "get_proxy_type", return_value="vcenter"
|
|
) as get_proxy_type:
|
|
with patch.object(
|
|
vsphere, "_get_proxy_connection_details", return_value=[]
|
|
) as get_proxy_connection:
|
|
with patch.object(
|
|
salt.utils.vmware, "get_service_instance", return_value=None
|
|
) as get_service_instance:
|
|
with patch.dict(
|
|
vsphere.__salt__,
|
|
{"vcenter.get_details": get_details},
|
|
clear=True,
|
|
) as get_vcenter_details:
|
|
with patch.object(
|
|
salt.utils.vmware,
|
|
"get_vsphere_client",
|
|
return_value=mock_client,
|
|
) as get_vsphere_client:
|
|
ret = vsphere.delete_tag_category(
|
|
self.func_attrs["category_id"]
|
|
)
|
|
|
|
# Check function calls and return data
|
|
get_proxy_type.assert_called_once()
|
|
get_proxy_connection.assert_called_once()
|
|
get_service_instance.assert_called_once()
|
|
get_vsphere_client.assert_called_once()
|
|
self.assertEqual(ret, self.delete_tag_category)
|
|
self.assertEqual(
|
|
get_vsphere_client.call_args_list,
|
|
[
|
|
call(
|
|
ca_bundle=None,
|
|
password=None,
|
|
server=None,
|
|
username=None,
|
|
verify_ssl=verify_ssl,
|
|
)
|
|
],
|
|
)
|
|
|
|
def test_delete_tag_client_none(self):
|
|
get_details = MagicMock(return_value=self.details)
|
|
|
|
# Start patching each external API return with Mock Objects
|
|
with patch.object(
|
|
vsphere, "get_proxy_type", return_value="vcenter"
|
|
) as get_proxy_type:
|
|
with patch.object(
|
|
vsphere, "_get_proxy_connection_details", return_value=[]
|
|
) as get_proxy_connection:
|
|
with patch.object(
|
|
salt.utils.vmware, "get_service_instance", return_value=None
|
|
) as get_service_instance:
|
|
with patch.dict(
|
|
vsphere.__salt__,
|
|
{"vcenter.get_details": get_details},
|
|
clear=True,
|
|
) as get_vcenter_details:
|
|
with patch.object(
|
|
salt.utils.vmware, "get_vsphere_client", return_value=None
|
|
) as get_vsphere_client:
|
|
ret = vsphere.delete_tag(self.func_attrs["tag_id"])
|
|
# Check function calls and return data
|
|
get_proxy_type.assert_called_once()
|
|
get_proxy_connection.assert_called_once()
|
|
get_service_instance.assert_called_once()
|
|
get_vsphere_client.assert_called_once()
|
|
self.assertEqual(ret, {"Tag deleted": None})
|
|
|
|
def test_delete_tag_client(self):
|
|
get_details = MagicMock(return_value=self.details)
|
|
|
|
# Mock CreateSpec object and create objects
|
|
mock_client = Mock(
|
|
tagging=Mock(
|
|
Tag=Mock(delete=Mock(return_value=self.delete_tag["Tag deleted"]))
|
|
)
|
|
)
|
|
|
|
# Start patching each external API return with Mock Objects
|
|
with patch.object(
|
|
vsphere, "get_proxy_type", return_value="vcenter"
|
|
) as get_proxy_type:
|
|
with patch.object(
|
|
vsphere, "_get_proxy_connection_details", return_value=[]
|
|
) as get_proxy_connection:
|
|
with patch.object(
|
|
salt.utils.vmware, "get_service_instance", return_value=None
|
|
) as get_service_instance:
|
|
with patch.dict(
|
|
vsphere.__salt__,
|
|
{"vcenter.get_details": get_details},
|
|
clear=True,
|
|
) as get_vcenter_details:
|
|
with patch.object(
|
|
salt.utils.vmware,
|
|
"get_vsphere_client",
|
|
return_value=mock_client,
|
|
) as get_vsphere_client:
|
|
ret = vsphere.delete_tag(self.func_attrs["tag_id"])
|
|
|
|
# Check function calls and return data
|
|
get_proxy_type.assert_called_once()
|
|
get_proxy_connection.assert_called_once()
|
|
get_service_instance.assert_called_once()
|
|
get_vsphere_client.assert_called_once()
|
|
self.assertEqual(ret, self.delete_tag)
|
|
|
|
def test_list_tag_categories_client_none(self):
|
|
get_details = MagicMock(return_value=self.details)
|
|
|
|
# Start patching each external API return with Mock Objects
|
|
with patch.object(
|
|
vsphere, "get_proxy_type", return_value="vcenter"
|
|
) as get_proxy_type:
|
|
with patch.object(
|
|
vsphere, "_get_proxy_connection_details", return_value=[]
|
|
) as get_proxy_connection:
|
|
with patch.object(
|
|
salt.utils.vmware, "get_service_instance", return_value=None
|
|
) as get_service_instance:
|
|
with patch.dict(
|
|
vsphere.__salt__,
|
|
{"vcenter.get_details": get_details},
|
|
clear=True,
|
|
) as get_vcenter_details:
|
|
with patch.object(
|
|
salt.utils.vmware, "get_vsphere_client", return_value=None
|
|
) as get_vsphere_client:
|
|
ret = vsphere.list_tag_categories()
|
|
# Check function calls and return data
|
|
get_proxy_type.assert_called_once()
|
|
get_proxy_connection.assert_called_once()
|
|
get_service_instance.assert_called_once()
|
|
get_vsphere_client.assert_called_once()
|
|
self.assertEqual(ret, {"Categories": None})
|
|
|
|
def test_list_tag_categories_client(self):
|
|
for verify_ssl in [True, False, None]:
|
|
details = self.details.copy()
|
|
if verify_ssl is not None:
|
|
details["verify_ssl"] = verify_ssl
|
|
else:
|
|
verify_ssl = True
|
|
get_details = MagicMock(return_value=details)
|
|
|
|
# Mock CreateSpec object and create objects
|
|
mock_client = Mock(
|
|
tagging=Mock(
|
|
Category=Mock(
|
|
list=Mock(return_value=self.list_tag_categories_return)
|
|
)
|
|
)
|
|
)
|
|
|
|
# Start patching each external API return with Mock Objects
|
|
with patch.object(
|
|
vsphere, "get_proxy_type", return_value="vcenter"
|
|
) as get_proxy_type:
|
|
with patch.object(
|
|
vsphere, "_get_proxy_connection_details", return_value=[]
|
|
) as get_proxy_connection:
|
|
with patch.object(
|
|
salt.utils.vmware, "get_service_instance", return_value=None
|
|
) as get_service_instance:
|
|
with patch.dict(
|
|
vsphere.__salt__,
|
|
{"vcenter.get_details": get_details},
|
|
clear=True,
|
|
) as get_vcenter_details:
|
|
with patch.object(
|
|
salt.utils.vmware,
|
|
"get_vsphere_client",
|
|
return_value=mock_client,
|
|
) as get_vsphere_client:
|
|
ret = vsphere.list_tag_categories()
|
|
|
|
get_proxy_type.assert_called_once()
|
|
get_proxy_connection.assert_called_once()
|
|
get_service_instance.assert_called_once()
|
|
get_vsphere_client.assert_called_once()
|
|
self.assertEqual(
|
|
get_vsphere_client.call_args_list,
|
|
[
|
|
call(
|
|
ca_bundle=None,
|
|
password=None,
|
|
server=None,
|
|
username=None,
|
|
verify_ssl=verify_ssl,
|
|
)
|
|
],
|
|
)
|
|
self.assertEqual(
|
|
ret, {"Categories": self.list_tag_categories_return}
|
|
)
|
|
|
|
def test_list_tags_client_none(self):
|
|
get_details = MagicMock(return_value=self.details)
|
|
|
|
# Start patching each external API return with Mock Objects
|
|
with patch.object(
|
|
vsphere, "get_proxy_type", return_value="vcenter"
|
|
) as get_proxy_type:
|
|
with patch.object(
|
|
vsphere, "_get_proxy_connection_details", return_value=[]
|
|
) as get_proxy_connection:
|
|
with patch.object(
|
|
salt.utils.vmware, "get_service_instance", return_value=None
|
|
) as get_service_instance:
|
|
with patch.dict(
|
|
vsphere.__salt__,
|
|
{"vcenter.get_details": get_details},
|
|
clear=True,
|
|
) as get_vcenter_details:
|
|
with patch.object(
|
|
salt.utils.vmware, "get_vsphere_client", return_value=None
|
|
) as get_vsphere_client:
|
|
# Check function calls and return
|
|
ret = vsphere.list_tags()
|
|
get_proxy_type.assert_called_once()
|
|
get_proxy_connection.assert_called_once()
|
|
get_service_instance.assert_called_once()
|
|
get_vsphere_client.assert_called_once()
|
|
self.assertEqual(ret, {"Tags": None})
|
|
|
|
def test_list_tags_client(self):
|
|
get_details = MagicMock(return_value=self.details)
|
|
|
|
# Mock CreateSpec object and create objects
|
|
mock_client = Mock(
|
|
tagging=Mock(Tag=Mock(list=Mock(return_value=self.list_tags_return)))
|
|
)
|
|
|
|
# Start patching each external API return with Mock Objects
|
|
with patch.object(
|
|
vsphere, "get_proxy_type", return_value="vcenter"
|
|
) as get_proxy_type:
|
|
with patch.object(
|
|
vsphere, "_get_proxy_connection_details", return_value=[]
|
|
) as get_proxy_connection:
|
|
with patch.object(
|
|
salt.utils.vmware, "get_service_instance", return_value=None
|
|
) as get_service_instance:
|
|
with patch.dict(
|
|
vsphere.__salt__,
|
|
{"vcenter.get_details": get_details},
|
|
clear=True,
|
|
) as get_vcenter_details:
|
|
with patch.object(
|
|
salt.utils.vmware,
|
|
"get_vsphere_client",
|
|
return_value=mock_client,
|
|
) as get_vsphere_client:
|
|
# Check function calls and return
|
|
ret = vsphere.list_tags()
|
|
get_proxy_type.assert_called_once()
|
|
get_proxy_connection.assert_called_once()
|
|
get_service_instance.assert_called_once()
|
|
get_vsphere_client.assert_called_once()
|
|
self.assertEqual(ret, {"Tags": self.list_tags_return})
|
|
|
|
def test_list_tags_client_verify_ssl(self):
|
|
for verify_ssl in [True, False]:
|
|
details = self.details.copy()
|
|
if verify_ssl is not None:
|
|
details["verify_ssl"] = verify_ssl
|
|
else:
|
|
verify_ssl = True
|
|
get_details = MagicMock(return_value=details)
|
|
|
|
# Mock CreateSpec object and create objects
|
|
mock_client = Mock(
|
|
tagging=Mock(Tag=Mock(list=Mock(return_value=self.list_tags_return)))
|
|
)
|
|
|
|
# Start patching each external API return with Mock Objects
|
|
with patch.object(
|
|
vsphere, "get_proxy_type", return_value="vcenter"
|
|
) as get_proxy_type:
|
|
with patch.object(
|
|
vsphere, "_get_proxy_connection_details", return_value=[]
|
|
) as get_proxy_connection:
|
|
with patch.object(
|
|
salt.utils.vmware, "get_service_instance", return_value=None
|
|
) as get_service_instance:
|
|
with patch.dict(
|
|
vsphere.__salt__,
|
|
{"vcenter.get_details": get_details},
|
|
clear=True,
|
|
) as get_vcenter_details:
|
|
with patch.object(
|
|
salt.utils.vmware,
|
|
"get_vsphere_client",
|
|
return_value=mock_client,
|
|
) as get_vsphere_client:
|
|
# Check function calls and return
|
|
ret = vsphere.list_tags()
|
|
self.assertEqual(ret, {"Tags": self.list_tags_return})
|
|
self.assertEqual(
|
|
get_vsphere_client.call_args_list,
|
|
[
|
|
call(
|
|
ca_bundle=None,
|
|
password=None,
|
|
server=None,
|
|
username=None,
|
|
verify_ssl=verify_ssl,
|
|
)
|
|
],
|
|
)
|
|
|
|
def test_list_attached_tags_client_none(self):
|
|
get_details = MagicMock(return_value=self.details)
|
|
|
|
# Start patching each external API return with Mock Objects
|
|
with patch.object(
|
|
vsphere, "get_proxy_type", return_value="vcenter"
|
|
) as get_proxy_type:
|
|
with patch.object(
|
|
vsphere, "_get_proxy_connection_details", return_value=[]
|
|
) as get_proxy_connection:
|
|
with patch.object(
|
|
salt.utils.vmware, "get_service_instance", return_value=None
|
|
) as get_service_instance:
|
|
with patch.dict(
|
|
vsphere.__salt__,
|
|
{"vcenter.get_details": get_details},
|
|
clear=True,
|
|
) as get_vcenter_details:
|
|
with patch.object(
|
|
salt.utils.vmware, "get_vsphere_client", return_value=None
|
|
) as get_vsphere_client:
|
|
with patch.object(vsphere, "DynamicID") as dynamic_id:
|
|
# Check function calls and return
|
|
ret = vsphere.list_attached_tags("object_id")
|
|
get_proxy_type.assert_called_once()
|
|
get_proxy_connection.assert_called_once()
|
|
get_service_instance.assert_called_once()
|
|
get_vsphere_client.assert_called_once()
|
|
self.assertEqual(ret, {"Attached tags": None})
|
|
|
|
def test_list_attached_tags_client(self):
|
|
for verify_ssl in [True, False, None]:
|
|
details = self.details.copy()
|
|
if verify_ssl is None:
|
|
verify_ssl = True
|
|
else:
|
|
details["verify_ssl"] = verify_ssl
|
|
get_details = MagicMock(return_value=details)
|
|
|
|
# Mock CreateSpec object and create objects
|
|
mock_client = Mock(
|
|
tagging=Mock(
|
|
TagAssociation=Mock(
|
|
list_attached_tags=Mock(
|
|
return_value=self.list_attached_tags_return
|
|
)
|
|
)
|
|
)
|
|
)
|
|
|
|
# Start patching each external API return with Mock Objects
|
|
with patch.object(
|
|
vsphere, "get_proxy_type", return_value="vcenter"
|
|
) as get_proxy_type:
|
|
with patch.object(
|
|
vsphere, "_get_proxy_connection_details", return_value=[]
|
|
) as get_proxy_connection:
|
|
with patch.object(
|
|
salt.utils.vmware, "get_service_instance", return_value=None
|
|
) as get_service_instance:
|
|
with patch.dict(
|
|
vsphere.__salt__,
|
|
{"vcenter.get_details": get_details},
|
|
clear=True,
|
|
) as get_vcenter_details:
|
|
with patch.object(
|
|
salt.utils.vmware,
|
|
"get_vsphere_client",
|
|
return_value=mock_client,
|
|
) as get_vsphere_client:
|
|
with patch.object(vsphere, "DynamicID") as dynamic_id:
|
|
# Check function calls and return
|
|
ret = vsphere.list_attached_tags(
|
|
self.func_attrs["object_id"]
|
|
)
|
|
get_proxy_type.assert_called_once()
|
|
get_proxy_connection.assert_called_once()
|
|
get_service_instance.assert_called_once()
|
|
get_vsphere_client.assert_called_once()
|
|
self.assertEqual(
|
|
ret,
|
|
{
|
|
"Attached tags": self.list_attached_tags_return
|
|
},
|
|
)
|
|
self.assertEqual(
|
|
get_vsphere_client.call_args_list,
|
|
[
|
|
call(
|
|
ca_bundle=None,
|
|
password=None,
|
|
server=None,
|
|
username=None,
|
|
verify_ssl=verify_ssl,
|
|
)
|
|
],
|
|
)
|
|
|
|
def test_attach_tags_client_none(self):
|
|
get_details = MagicMock(return_value=self.details)
|
|
|
|
# Start patching each external API return with Mock Objects
|
|
with patch.object(
|
|
vsphere, "get_proxy_type", return_value="vcenter"
|
|
) as get_proxy_type:
|
|
with patch.object(
|
|
vsphere, "_get_proxy_connection_details", return_value=[]
|
|
) as get_proxy_connection:
|
|
with patch.object(
|
|
salt.utils.vmware, "get_service_instance", return_value=None
|
|
) as get_service_instance:
|
|
with patch.dict(
|
|
vsphere.__salt__,
|
|
{"vcenter.get_details": get_details},
|
|
clear=True,
|
|
) as get_vcenter_details:
|
|
with patch.object(
|
|
salt.utils.vmware, "get_vsphere_client", return_value=None
|
|
) as get_vsphere_client:
|
|
# Check function calls and return
|
|
ret = vsphere.attach_tag(
|
|
object_id=self.func_attrs["object_id"],
|
|
tag_id=self.func_attrs["tag_id"],
|
|
)
|
|
get_proxy_type.assert_called_once()
|
|
get_proxy_connection.assert_called_once()
|
|
get_service_instance.assert_called_once()
|
|
get_vsphere_client.assert_called_once()
|
|
self.assertEqual(ret, {"Tag attached": None})
|
|
|
|
def test_attach_tags_client(self):
|
|
for verify_ssl in [True, False, None]:
|
|
details = self.details.copy()
|
|
if verify_ssl is None:
|
|
verify_ssl = True
|
|
else:
|
|
details["verify_ssl"] = verify_ssl
|
|
get_details = MagicMock(return_value=details)
|
|
|
|
# Mock CreateSpec object and create objects
|
|
mock_client = Mock(
|
|
tagging=Mock(
|
|
TagAssociation=Mock(
|
|
attach=Mock(return_value=self.list_attached_tags_return)
|
|
)
|
|
)
|
|
)
|
|
|
|
# Start patching each external API return with Mock Objects
|
|
with patch.object(
|
|
vsphere, "get_proxy_type", return_value="vcenter"
|
|
) as get_proxy_type:
|
|
with patch.object(
|
|
vsphere, "_get_proxy_connection_details", return_value=[]
|
|
) as get_proxy_connection:
|
|
with patch.object(
|
|
salt.utils.vmware, "get_service_instance", return_value=None
|
|
) as get_service_instance:
|
|
with patch.dict(
|
|
vsphere.__salt__,
|
|
{"vcenter.get_details": get_details},
|
|
clear=True,
|
|
) as get_vcenter_details:
|
|
with patch.object(
|
|
salt.utils.vmware,
|
|
"get_vsphere_client",
|
|
return_value=mock_client,
|
|
) as get_vsphere_client:
|
|
with patch.object(vsphere, "DynamicID") as dynamic_id:
|
|
# Check function calls and return
|
|
ret = vsphere.attach_tag(
|
|
object_id=self.func_attrs["object_id"],
|
|
tag_id=self.func_attrs["tag_id"],
|
|
)
|
|
get_proxy_type.assert_called_once()
|
|
get_proxy_connection.assert_called_once()
|
|
get_service_instance.assert_called_once()
|
|
get_vsphere_client.assert_called_once()
|
|
self.assertEqual(
|
|
get_vsphere_client.call_args_list,
|
|
[
|
|
call(
|
|
ca_bundle=None,
|
|
password=None,
|
|
server=None,
|
|
username=None,
|
|
verify_ssl=verify_ssl,
|
|
)
|
|
],
|
|
)
|
|
self.assertEqual(
|
|
ret,
|
|
{
|
|
"Tag attached": self.list_attached_tags_return
|
|
},
|
|
)
|
|
|
|
def test_get_client(self):
|
|
"""
|
|
test get_client when verify_ssl and ca_bundle are not passed
|
|
"""
|
|
mock_client = MagicMock(return_value=None)
|
|
patch_client = patch("salt.utils.vmware.get_vsphere_client", mock_client)
|
|
|
|
cert_path = "/test/ca-certificates.crt"
|
|
mock_ca = MagicMock(return_value=cert_path)
|
|
patch_ca = patch("salt.utils.http.get_ca_bundle", mock_ca)
|
|
|
|
mock_details = MagicMock(return_value=self.details)
|
|
patch_details = patch.dict(
|
|
vsphere.__salt__, {"vcenter.get_details": mock_details}
|
|
)
|
|
|
|
with patch_client, patch_ca, patch_details:
|
|
vsphere._get_client(
|
|
server="localhost", username="testuser", password="testpassword"
|
|
)
|
|
self.assertEqual(
|
|
mock_client.call_args_list,
|
|
[
|
|
call(
|
|
ca_bundle=None,
|
|
password="testpassword",
|
|
server="localhost",
|
|
username="testuser",
|
|
verify_ssl=True,
|
|
)
|
|
],
|
|
)
|
|
self.assertEqual(mock_details.assert_called_once(), None)
|
|
self.assertEqual(mock_ca.assert_not_called(), None)
|
|
|
|
def test_get_client_verify_ssl_false(self):
|
|
"""
|
|
test get_client when verify_ssl=False is set
|
|
"""
|
|
details = self.details.copy()
|
|
details["verify_ssl"] = False
|
|
mock_client = MagicMock(return_value=None)
|
|
patch_client = patch("salt.utils.vmware.get_vsphere_client", mock_client)
|
|
|
|
cert_path = "/test/ca-certificates.crt"
|
|
mock_ca = MagicMock(return_value=cert_path)
|
|
patch_ca = patch("salt.utils.http.get_ca_bundle", mock_ca)
|
|
|
|
mock_details = MagicMock(return_value=details)
|
|
patch_details = patch.dict(
|
|
vsphere.__salt__, {"vcenter.get_details": mock_details}
|
|
)
|
|
|
|
with patch_client, patch_ca, patch_details:
|
|
vsphere._get_client(
|
|
server="localhost", username="testuser", password="testpassword"
|
|
)
|
|
self.assertEqual(
|
|
mock_client.call_args_list,
|
|
[
|
|
call(
|
|
ca_bundle=None,
|
|
password="testpassword",
|
|
server="localhost",
|
|
username="testuser",
|
|
verify_ssl=False,
|
|
)
|
|
],
|
|
)
|
|
self.assertEqual(mock_details.assert_called_once(), None)
|
|
self.assertEqual(mock_ca.assert_not_called(), None)
|
|
|
|
def test_get_client_verify_ssl_false_ca_bundle(self):
|
|
"""
|
|
test get_client when verify_ssl=False and ca_bundle set
|
|
"""
|
|
details = self.details.copy()
|
|
details["verify_ssl"] = False
|
|
details["ca_bundle"] = "/tmp/test"
|
|
mock_client = MagicMock(return_value=None)
|
|
patch_client = patch("salt.utils.vmware.get_vsphere_client", mock_client)
|
|
|
|
cert_path = "/test/ca-certificates.crt"
|
|
mock_ca = MagicMock(return_value=cert_path)
|
|
patch_ca = patch("salt.utils.http.get_ca_bundle", mock_ca)
|
|
|
|
mock_details = MagicMock(return_value=details)
|
|
patch_details = patch.dict(
|
|
vsphere.__salt__, {"vcenter.get_details": mock_details}
|
|
)
|
|
|
|
with patch_client, patch_ca, patch_details:
|
|
self.assertFalse(
|
|
vsphere._get_client(
|
|
server="localhost", username="testuser", password="testpassword"
|
|
)
|
|
)
|
|
self.assertEqual(mock_details.assert_called_once(), None)
|
|
self.assertEqual(mock_ca.assert_not_called(), None)
|
|
|
|
def test_get_client_ca_bundle(self):
|
|
"""
|
|
test get_client when verify_ssl=False and ca_bundle set
|
|
"""
|
|
cert_path = "/test/ca-certificates.crt"
|
|
details = self.details.copy()
|
|
details["ca_bundle"] = cert_path
|
|
mock_client = MagicMock(return_value=None)
|
|
patch_client = patch("salt.utils.vmware.get_vsphere_client", mock_client)
|
|
|
|
mock_ca = MagicMock(return_value=cert_path)
|
|
patch_ca = patch("salt.utils.http.get_ca_bundle", mock_ca)
|
|
|
|
mock_details = MagicMock(return_value=details)
|
|
patch_details = patch.dict(
|
|
vsphere.__salt__, {"vcenter.get_details": mock_details}
|
|
)
|
|
|
|
with patch_client, patch_ca, patch_details:
|
|
vsphere._get_client(
|
|
server="localhost", username="testuser", password="testpassword"
|
|
)
|
|
self.assertEqual(
|
|
mock_client.call_args_list,
|
|
[
|
|
call(
|
|
ca_bundle=cert_path,
|
|
password="testpassword",
|
|
server="localhost",
|
|
username="testuser",
|
|
verify_ssl=True,
|
|
)
|
|
],
|
|
)
|
|
self.assertEqual(mock_details.assert_called_once(), None)
|
|
self.assertEqual(mock_ca.assert_called_once(), None)
|
|
self.assertEqual(mock_ca.call_args_list, [call({"ca_bundle": cert_path})])
|
|
|
|
|
|
class TestCertificateVerify(TestCase, LoaderModuleMockMixin):
|
|
def setup_loader_modules(self):
|
|
return {vsphere: {}}
|
|
|
|
def test_upload_ssh_key(self):
|
|
kwargs_values = [
|
|
("ssh_key", "TheSSHKeyFile"),
|
|
("ssh_key_file", "TheSSHKeyFile"),
|
|
]
|
|
certificate_verify_values = (None, True, False)
|
|
for kw_key, kw_value in kwargs_values:
|
|
kwargs = {kw_key: kw_value}
|
|
if kw_key == "ssh_key":
|
|
expected_kwargs = {"data": kw_value}
|
|
else:
|
|
expected_kwargs = {"data_file": kw_value, "data_render": False}
|
|
for certificate_verify_value in certificate_verify_values:
|
|
http_query_mock = MagicMock()
|
|
if certificate_verify_value is None:
|
|
certificate_verify_value = True
|
|
with patch("salt.utils.http.query", http_query_mock):
|
|
vsphere.upload_ssh_key(
|
|
HOST,
|
|
USER,
|
|
PASSWORD,
|
|
certificate_verify=certificate_verify_value,
|
|
**kwargs
|
|
)
|
|
http_query_mock.assert_called_once_with(
|
|
"https://1.2.3.4:443/host/ssh_root_authorized_keys",
|
|
method="PUT",
|
|
password="SuperSecret!",
|
|
status=True,
|
|
text=True,
|
|
username="root",
|
|
verify_ssl=certificate_verify_value,
|
|
**expected_kwargs
|
|
)
|
|
|
|
def test_get_ssh_key(self):
|
|
certificate_verify_values = (None, True, False)
|
|
for certificate_verify_value in certificate_verify_values:
|
|
http_query_mock = MagicMock()
|
|
if certificate_verify_value is None:
|
|
certificate_verify_value = True
|
|
with patch("salt.utils.http.query", http_query_mock):
|
|
vsphere.get_ssh_key(
|
|
HOST, USER, PASSWORD, certificate_verify=certificate_verify_value
|
|
)
|
|
http_query_mock.assert_called_once_with(
|
|
"https://1.2.3.4:443/host/ssh_root_authorized_keys",
|
|
method="GET",
|
|
password="SuperSecret!",
|
|
status=True,
|
|
text=True,
|
|
username="root",
|
|
verify_ssl=certificate_verify_value,
|
|
)
|