5f404eb0c1
Fixes: #46460 Signed-off-by: Abhijeet Kasurde <akasurde@redhat.com>
174 lines
6.9 KiB
Python
174 lines
6.9 KiB
Python
# -*- coding: utf-8 -*-
|
|
# Copyright: (c) 2018, Ansible Project
|
|
# Copyright: (c) 2018, Abhijeet Kasurde <akasurde@redhat.com>
|
|
# Simplified BSD License (see licenses/simplified_bsd.txt or https://opensource.org/licenses/BSD-2-Clause)
|
|
|
|
from __future__ import absolute_import, division, print_function
|
|
__metaclass__ = type
|
|
|
|
try:
|
|
import requests
|
|
HAS_REQUESTS = True
|
|
except ImportError:
|
|
HAS_REQUESTS = False
|
|
|
|
try:
|
|
from pyVim import connect
|
|
from pyVmomi import vim, vmodl
|
|
HAS_PYVMOMI = True
|
|
except ImportError:
|
|
HAS_PYVMOMI = False
|
|
|
|
try:
|
|
from vmware.vapi.lib.connect import get_requests_connector
|
|
from vmware.vapi.security.session import create_session_security_context
|
|
from vmware.vapi.security.user_password import create_user_password_security_context
|
|
from com.vmware.cis_client import Session
|
|
from com.vmware.vapi.std_client import DynamicID
|
|
HAS_VCLOUD = True
|
|
except ImportError:
|
|
HAS_VCLOUD = False
|
|
|
|
try:
|
|
from vmware.vapi.stdlib.client.factories import StubConfigurationFactory
|
|
HAS_VSPHERE = True
|
|
except ImportError:
|
|
HAS_VSPHERE = False
|
|
|
|
from ansible.module_utils._text import to_native
|
|
from ansible.module_utils.basic import env_fallback
|
|
|
|
|
|
class VmwareRestClient(object):
|
|
def __init__(self, module):
|
|
"""
|
|
Constructor
|
|
|
|
"""
|
|
self.module = module
|
|
self.params = module.params
|
|
self.check_required_library()
|
|
self.connect = self.connect_to_rest()
|
|
|
|
def check_required_library(self):
|
|
"""
|
|
Check required libraries
|
|
|
|
"""
|
|
if not HAS_REQUESTS:
|
|
self.module.fail_json(msg="Unable to find 'requests' Python library which is required."
|
|
" Please install using 'pip install requests'")
|
|
if not HAS_PYVMOMI:
|
|
self.module.fail_json(msg="PyVmomi Python module required. Install using 'pip install PyVmomi'")
|
|
if not HAS_VSPHERE:
|
|
self.module.fail_json(msg="Unable to find 'vSphere Automation SDK' Python library which is required."
|
|
" Please refer this URL for installation steps"
|
|
" - https://code.vmware.com/web/sdk/65/vsphere-automation-python")
|
|
if not HAS_VCLOUD:
|
|
self.module.fail_json(msg="Unable to find 'vCloud Suite SDK' Python library which is required."
|
|
" Please refer this URL for installation steps"
|
|
" - https://code.vmware.com/web/sdk/60/vcloudsuite-python")
|
|
|
|
def connect_to_rest(self):
|
|
"""
|
|
Connect to server using username and password
|
|
|
|
"""
|
|
session = requests.Session()
|
|
session.verify = self.params.get('validate_certs')
|
|
|
|
username = self.params.get('username', None)
|
|
password = self.params.get('password', None)
|
|
protocol = self.params.get('protocol', 'https')
|
|
hostname = self.params.get('hostname')
|
|
|
|
if not all([self.params.get('hostname', None), username, password]):
|
|
self.module.fail_json(msg="Missing one of the following : hostname, username, password."
|
|
" Please read the documentation for more information.")
|
|
|
|
vcenter_url = "%s://%s/api" % (protocol, hostname)
|
|
|
|
# Get request connector
|
|
connector = get_requests_connector(session=session, url=vcenter_url)
|
|
# Create standard Configuration
|
|
stub_config = StubConfigurationFactory.new_std_configuration(connector)
|
|
# Use username and password in the security context to authenticate
|
|
security_context = create_user_password_security_context(username, password)
|
|
# Login
|
|
stub_config.connector.set_security_context(security_context)
|
|
# Create the stub for the session service and login by creating a session.
|
|
session_svc = Session(stub_config)
|
|
session_id = None
|
|
try:
|
|
session_id = session_svc.create()
|
|
except OSError as os_err:
|
|
self.module.fail_json(msg="Failed to login to %s: %s" % (hostname,
|
|
to_native(os_err)))
|
|
|
|
if session_id is None:
|
|
self.module.fail_json(msg="Failed to create session using provided credentials."
|
|
" Please check hostname, username and password.")
|
|
# After successful authentication, store the session identifier in the security
|
|
# context of the stub and use that for all subsequent remote requests
|
|
session_security_context = create_session_security_context(session_id)
|
|
stub_config.connector.set_security_context(session_security_context)
|
|
|
|
if stub_config is None:
|
|
self.module.fail_json(msg="Failed to login to %s" % hostname)
|
|
return stub_config
|
|
|
|
@staticmethod
|
|
def vmware_client_argument_spec():
|
|
return dict(
|
|
hostname=dict(type='str',
|
|
fallback=(env_fallback, ['VMWARE_HOST'])),
|
|
username=dict(type='str',
|
|
fallback=(env_fallback, ['VMWARE_USER']),
|
|
aliases=['user', 'admin']),
|
|
password=dict(type='str',
|
|
fallback=(env_fallback, ['VMWARE_PASSWORD']),
|
|
aliases=['pass', 'pwd'],
|
|
no_log=True),
|
|
protocol=dict(type='str',
|
|
default='https',
|
|
choices=['https', 'http']),
|
|
validate_certs=dict(type='bool',
|
|
fallback=(env_fallback, ['VMWARE_VALIDATE_CERTS']),
|
|
default=True),
|
|
)
|
|
|
|
def get_tags_for_object(self, tag_service, tag_assoc_svc, dobj):
|
|
"""
|
|
Return list of tag objects associated with an object
|
|
Args:
|
|
dobj: Dynamic object
|
|
tag_service: Tag service object
|
|
tag_assoc_svc: Tag Association object
|
|
Returns: List of tag objects associated with the given object
|
|
"""
|
|
tag_ids = tag_assoc_svc.list_attached_tags(dobj)
|
|
tags = []
|
|
for tag_id in tag_ids:
|
|
tags.append(tag_service.get(tag_id))
|
|
return tags
|
|
|
|
def get_vm_tags(self, tag_service, tag_association_svc, vm_mid=None):
|
|
"""
|
|
Return list of tag name associated with virtual machine
|
|
Args:
|
|
tag_service: Tag service object
|
|
tag_association_svc: Tag association object
|
|
vm_mid: Dynamic object for virtual machine
|
|
|
|
Returns: List of tag names associated with the given virtual machine
|
|
|
|
"""
|
|
tags = []
|
|
if vm_mid is None:
|
|
return tags
|
|
dynamic_managed_object = DynamicID(type='VirtualMachine', id=vm_mid)
|
|
|
|
temp_tags_model = self.get_tags_for_object(tag_service, tag_association_svc, dynamic_managed_object)
|
|
for t in temp_tags_model:
|
|
tags.append(t.name)
|
|
return tags
|