cf78759f5b
Ensure the module still work with the ESXi where CustomFieldsManager does not exist. From: https://www.vmware.com/support/developer/converter-sdk/conv60_apireference/vim.CustomFieldsManager.html The CustomFieldsManager object is used to add and remove custom fields to managed entities. The custom fields values set on managed entities are available through the customValue property and through the summary objects for VirtualMachine and HostSystem. They are not available directly through this managed object. This functionality is only available through VirtualCenter. Fixes: #56071
156 lines
4.9 KiB
Python
156 lines
4.9 KiB
Python
# -*- coding: utf-8 -*-
|
|
# Copyright: (c) 2018, Ansible Project
|
|
# Copyright: (c) 2018, Abhijeet Kasurde <akasurde@redhat.com>
|
|
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
|
|
|
|
from __future__ import absolute_import, division, print_function
|
|
__metaclass__ = type
|
|
|
|
import sys
|
|
import pytest
|
|
|
|
pyvmomi = pytest.importorskip('pyVmomi')
|
|
|
|
from ansible.module_utils.vmware import connect_to_api, PyVmomi
|
|
|
|
|
|
test_data = [
|
|
(
|
|
dict(
|
|
username='Administrator@vsphere.local',
|
|
password='Esxi@123$%',
|
|
hostname=False,
|
|
validate_certs=False,
|
|
),
|
|
"Hostname parameter is missing. Please specify this parameter in task or"
|
|
" export environment variable like 'export VMWARE_HOST=ESXI_HOSTNAME'"
|
|
),
|
|
(
|
|
dict(
|
|
username=False,
|
|
password='Esxi@123$%',
|
|
hostname='esxi1',
|
|
validate_certs=False,
|
|
),
|
|
"Username parameter is missing. Please specify this parameter in task or"
|
|
" export environment variable like 'export VMWARE_USER=ESXI_USERNAME'"
|
|
),
|
|
(
|
|
dict(
|
|
username='Administrator@vsphere.local',
|
|
password=False,
|
|
hostname='esxi1',
|
|
validate_certs=False,
|
|
),
|
|
"Password parameter is missing. Please specify this parameter in task or"
|
|
" export environment variable like 'export VMWARE_PASSWORD=ESXI_PASSWORD'"
|
|
),
|
|
(
|
|
dict(
|
|
username='Administrator@vsphere.local',
|
|
password='Esxi@123$%',
|
|
hostname='esxi1',
|
|
validate_certs=True,
|
|
),
|
|
"Unknown error while connecting to vCenter or ESXi API at esxi1:443"
|
|
),
|
|
]
|
|
|
|
|
|
class AnsibleModuleExit(Exception):
|
|
def __init__(self, *args, **kwargs):
|
|
self.args = args
|
|
self.kwargs = kwargs
|
|
|
|
|
|
class ExitJson(AnsibleModuleExit):
|
|
pass
|
|
|
|
|
|
class FailJson(AnsibleModuleExit):
|
|
pass
|
|
|
|
|
|
@pytest.fixture
|
|
def fake_ansible_module():
|
|
return FakeAnsibleModule()
|
|
|
|
|
|
class FakeAnsibleModule:
|
|
def __init__(self):
|
|
self.params = {}
|
|
self.tmpdir = None
|
|
|
|
def exit_json(self, *args, **kwargs):
|
|
raise ExitJson(*args, **kwargs)
|
|
|
|
def fail_json(self, *args, **kwargs):
|
|
raise FailJson(*args, **kwargs)
|
|
|
|
|
|
def fake_connect_to_api(module):
|
|
class MyContent():
|
|
customFieldsManager = None
|
|
return MyContent
|
|
|
|
|
|
def test_pyvmomi_lib_exists(mocker, fake_ansible_module):
|
|
""" Test if Pyvmomi is present or not"""
|
|
mocker.patch('ansible.module_utils.vmware.HAS_PYVMOMI', new=False)
|
|
with pytest.raises(FailJson) as exec_info:
|
|
PyVmomi(fake_ansible_module)
|
|
|
|
assert 'Failed to import the required Python library (PyVmomi) on' in exec_info.value.kwargs['msg']
|
|
|
|
|
|
def test_requests_lib_exists(mocker, fake_ansible_module):
|
|
""" Test if requests is present or not"""
|
|
mocker.patch('ansible.module_utils.vmware.HAS_REQUESTS', new=False)
|
|
with pytest.raises(FailJson) as exec_info:
|
|
PyVmomi(fake_ansible_module)
|
|
|
|
assert 'Failed to import the required Python library (requests) on' in exec_info.value.kwargs['msg']
|
|
|
|
|
|
@pytest.mark.skipif(sys.version_info < (2, 7), reason="requires python2.7 and greater")
|
|
@pytest.mark.parametrize("params, msg", test_data, ids=['hostname', 'username', 'password', 'validate_certs'])
|
|
def test_required_params(request, params, msg, fake_ansible_module):
|
|
""" Test if required params are correct or not"""
|
|
fake_ansible_module.params = params
|
|
with pytest.raises(FailJson) as exec_info:
|
|
connect_to_api(fake_ansible_module)
|
|
assert msg in exec_info.value.kwargs['msg']
|
|
|
|
|
|
def test_validate_certs(mocker, fake_ansible_module):
|
|
""" Test if SSL is required or not"""
|
|
fake_ansible_module.params = test_data[3][0]
|
|
|
|
mocker.patch('ansible.module_utils.vmware.ssl', new=None)
|
|
with pytest.raises(FailJson) as exec_info:
|
|
PyVmomi(fake_ansible_module)
|
|
msg = 'pyVim does not support changing verification mode with python < 2.7.9.' \
|
|
' Either update python or use validate_certs=false.'
|
|
assert msg == exec_info.value.kwargs['msg']
|
|
|
|
|
|
def test_vmdk_disk_path_split(mocker, fake_ansible_module):
|
|
""" Test vmdk_disk_path_split function"""
|
|
fake_ansible_module.params = test_data[0][0]
|
|
|
|
mocker.patch('ansible.module_utils.vmware.connect_to_api', new=fake_connect_to_api)
|
|
pyv = PyVmomi(fake_ansible_module)
|
|
v = pyv.vmdk_disk_path_split('[ds1] VM_0001/VM0001_0.vmdk')
|
|
assert v == ('ds1', 'VM_0001/VM0001_0.vmdk', 'VM0001_0.vmdk', 'VM_0001')
|
|
|
|
|
|
def test_vmdk_disk_path_split_negative(mocker, fake_ansible_module):
|
|
""" Test vmdk_disk_path_split function"""
|
|
fake_ansible_module.params = test_data[0][0]
|
|
|
|
mocker.patch('ansible.module_utils.vmware.connect_to_api', new=fake_connect_to_api)
|
|
with pytest.raises(FailJson) as exec_info:
|
|
pyv = PyVmomi(fake_ansible_module)
|
|
pyv.vmdk_disk_path_split('[ds1]')
|
|
|
|
assert 'Bad path' in exec_info.value.kwargs['msg']
|