Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

VMware: Fix module usages in module_utils #49421

Merged
merged 4 commits into from
Dec 4, 2018
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
3 changes: 3 additions & 0 deletions changelogs/fragments/47313-vmware-fix_module_error.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
---
bugfixes:
- Fix VMware module utils for self usage.
4 changes: 2 additions & 2 deletions lib/ansible/module_utils/vmware.py
Original file line number Diff line number Diff line change
Expand Up @@ -774,8 +774,8 @@ def __init__(self, module):
Constructor
"""
if not HAS_REQUESTS:
self.module.fail_json(msg="Unable to find 'requests' Python library which is required."
" Please install using 'pip install requests'")
module.fail_json(msg="Unable to find 'requests' Python library which is required."
" Please install using 'pip install requests'")

if not HAS_PYVMOMI:
module.fail_json(msg='PyVmomi Python module required. Install using "pip install PyVmomi"')
Expand Down
131 changes: 131 additions & 0 deletions test/units/module_utils/test_vmware.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,131 @@
# -*- 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
from ansible.module_utils.vmware import connect_to_api, PyVmomi
abadger marked this conversation as resolved.
Show resolved Hide resolved


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)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Note: This is not a blocker:

I haven't tested but you probably don't have to do this. You can catch SystemExit instead.

This does give you the additional data that exit_json vs fail_json was called, though. (although since you're checking the exit message, that might be redundant.



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 'PyVmomi Python module required. Install using "pip install PyVmomi"' == 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)

msg = "Unable to find 'requests' Python library which is required. Please install using 'pip install requests'"
assert msg == 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 = dict(
username='Administrator@vsphere.local',
password='Esxi@123$%',
hostname='esxi1',
validate_certs=True,
)

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']