diff options
Diffstat (limited to 'lib/ansible/modules/cloud/vmware/vmware_guest_video.py')
-rw-r--r-- | lib/ansible/modules/cloud/vmware/vmware_guest_video.py | 366 |
1 files changed, 0 insertions, 366 deletions
diff --git a/lib/ansible/modules/cloud/vmware/vmware_guest_video.py b/lib/ansible/modules/cloud/vmware/vmware_guest_video.py deleted file mode 100644 index 2bdaf051f9..0000000000 --- a/lib/ansible/modules/cloud/vmware/vmware_guest_video.py +++ /dev/null @@ -1,366 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# Copyright: (c) 2018, Ansible Project -# Copyright: (c) 2018, Diane Wang <dianew@vmware.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 - -ANSIBLE_METADATA = { - 'metadata_version': '1.1', - 'status': ['preview'], - 'supported_by': 'community' -} - -DOCUMENTATION = ''' ---- -module: vmware_guest_video -short_description: Modify video card configurations of specified virtual machine in given vCenter infrastructure -description: - - This module is used to reconfigure video card settings of given virtual machine. - - All parameters and VMware object names are case sensitive. -version_added: '2.8' -author: - - Diane Wang (@Tomorrow9) <dianew@vmware.com> -notes: - - Tested on vSphere 6.0, 6.5 and 6.7 -requirements: - - "python >= 2.6" - - PyVmomi -options: - name: - description: - - Name of the virtual machine. - - This is a required parameter, if parameter C(uuid) or C(moid) is not supplied. - type: str - uuid: - description: - - UUID of the instance to gather facts if known, this is VMware's unique identifier. - - This is a required parameter, if parameter C(name) or C(moid) is not supplied. - type: str - moid: - description: - - Managed Object ID of the instance to manage if known, this is a unique identifier only within a single vCenter instance. - - This is required if C(name) or C(uuid) is not supplied. - version_added: '2.9' - type: str - folder: - description: - - Destination folder, absolute or relative path to find an existing guest. - - This is a required parameter, only if multiple VMs are found with same name. - - The folder should include the datacenter. ESXi server's datacenter is ha-datacenter. - - 'Examples:' - - ' folder: /ha-datacenter/vm' - - ' folder: ha-datacenter/vm' - - ' folder: /datacenter1/vm' - - ' folder: datacenter1/vm' - - ' folder: /datacenter1/vm/folder1' - - ' folder: datacenter1/vm/folder1' - - ' folder: /folder1/datacenter1/vm' - - ' folder: folder1/datacenter1/vm' - - ' folder: /folder1/datacenter1/vm/folder2' - type: str - datacenter: - default: ha-datacenter - description: - - The datacenter name to which virtual machine belongs to. - - This parameter is case sensitive. - type: str - gather_video_facts: - description: - - If set to True, return settings of the video card, other attributes are ignored. - - If set to False, will do reconfiguration and return video card settings. - type: bool - default: 'no' - use_auto_detect: - description: - - 'If set to True, applies common video settings to the guest operating system, attributes C(display_number) and C(video_memory_mb) are ignored.' - - 'If set to False, the number of display and the total video memory will be reconfigured using C(display_number) and C(video_memory_mb).' - type: bool - display_number: - description: - - The number of display. Valid value from 1 to 10. The maximum display number is 4 on vCenter 6.0, 6.5 web UI. - type: int - video_memory_mb: - description: - - 'Valid total MB of video memory range of virtual machine is from 1.172 MB to 256 MB on ESXi 6.7U1, - from 1.172 MB to 128 MB on ESXi 6.7 and previous versions.' - - For specific guest OS, supported minimum and maximum video memory are different, please be careful on setting this. - type: float - enable_3D: - description: - - Enable 3D for guest operating systems on which VMware supports 3D. - type: bool - renderer_3D: - description: - - 'If set to C(automatic), selects the appropriate option (software or hardware) for this virtual machine automatically.' - - 'If set to C(software), uses normal CPU processing for 3D calculations.' - - 'If set to C(hardware), requires graphics hardware (GPU) for faster 3D calculations.' - choices: [ automatic, software, hardware ] - type: str - memory_3D_mb: - description: - - The value of 3D Memory must be power of 2 and valid value is from 32 MB to 2048 MB. - type: int -extends_documentation_fragment: vmware.documentation -''' - -EXAMPLES = ''' -- name: Change video card settings of virtual machine - vmware_guest_video: - hostname: "{{ vcenter_hostname }}" - username: "{{ vcenter_username }}" - password: "{{ vcenter_password }}" - datacenter: "{{ datacenter_name }}" - validate_certs: no - name: test-vm - gather_video_facts: false - use_auto_detect: false - display_number: 2 - video_memory_mb: 8.0 - enable_3D: true - renderer_3D: automatic - memory_3D_mb: 512 - delegate_to: localhost - register: video_facts - -- name: Change video card settings of virtual machine using MoID - vmware_guest_video: - hostname: "{{ vcenter_hostname }}" - username: "{{ vcenter_username }}" - password: "{{ vcenter_password }}" - datacenter: "{{ datacenter_name }}" - validate_certs: no - moid: vm-42 - gather_video_facts: false - use_auto_detect: false - display_number: 2 - video_memory_mb: 8.0 - enable_3D: true - renderer_3D: automatic - memory_3D_mb: 512 - delegate_to: localhost - register: video_facts -''' - -RETURN = """ -video_status: - description: metadata about the virtual machine's video card after managing them - returned: always - type: dict - sample: { - "auto_detect": false, - "display_number": 2, - "enable_3D_support": true, - "memory_3D": 524288, - "renderer_3D": "automatic", - "video_memory": 8192 - } -""" - -try: - from pyVmomi import vim -except ImportError: - pass - -from ansible.module_utils.basic import AnsibleModule -from ansible.module_utils._text import to_native -from ansible.module_utils.vmware import PyVmomi, vmware_argument_spec, wait_for_task - - -class PyVmomiHelper(PyVmomi): - def __init__(self, module): - super(PyVmomiHelper, self).__init__(module) - self.change_detected = False - self.config_spec = vim.vm.ConfigSpec() - self.config_spec.deviceChange = [] - self.video_card_facts = None - - @staticmethod - def is_power_of_2(num): - return num != 0 and ((num & (num - 1)) == 0) - - def gather_video_card_facts(self, vm_obj): - """ - Gather facts about VM's video card settings - Args: - vm_obj: Managed object of virtual machine - Returns: Video Card device and a list of dict video card configuration - """ - video_facts = dict() - video_card = None - for device in vm_obj.config.hardware.device: - if isinstance(device, vim.vm.device.VirtualVideoCard): - video_card = device - video_facts = dict( - auto_detect=device.useAutoDetect, - display_number=device.numDisplays, - video_memory=device.videoRamSizeInKB, - enable_3D_support=device.enable3DSupport, - renderer_3D=device.use3dRenderer, - memory_3D=device.graphicsMemorySizeInKB, - ) - break - return video_card, video_facts - - def get_video_card_spec(self, vm_obj): - """ - Get device changes of virtual machine - Args: - vm_obj: Managed object of virtual machine - Returns: virtual device spec - """ - video_card, video_card_facts = self.gather_video_card_facts(vm_obj) - self.video_card_facts = video_card_facts - if video_card is None: - self.module.fail_json(msg='Not get video card device of specified virtual machine.') - video_spec = vim.vm.device.VirtualDeviceSpec() - video_spec.operation = vim.vm.device.VirtualDeviceSpec.Operation.edit - video_spec.device = video_card - auto_detect = False - enabled_3d = False - - if self.params['gather_video_facts']: - return None - if self.params['use_auto_detect'] is not None: - if video_card_facts['auto_detect'] and self.params['use_auto_detect']: - auto_detect = True - elif not video_card_facts['auto_detect'] and self.params['use_auto_detect']: - video_spec.device.useAutoDetect = True - self.change_detected = True - auto_detect = True - elif video_card_facts['auto_detect'] and not self.params['use_auto_detect']: - video_spec.device.useAutoDetect = False - self.change_detected = True - else: - if video_card_facts['auto_detect']: - auto_detect = True - # useAutoDetect set to False then display number and video memory config can be changed - if not auto_detect: - if self.params['display_number'] is not None: - if self.params['display_number'] < 1: - self.module.fail_json(msg="display_number attribute valid value: 1-10.") - if self.params['display_number'] != video_card_facts['display_number']: - video_spec.device.numDisplays = self.params['display_number'] - self.change_detected = True - - if self.params['video_memory_mb'] is not None: - if self.params['video_memory_mb'] < 1.172: - self.module.fail_json(msg="video_memory_mb attribute valid value: ESXi 6.7U1(1.172-256 MB)," - "ESXi 6.7/6.5/6.0(1.172-128 MB).") - if int(self.params['video_memory_mb'] * 1024) != video_card_facts['video_memory']: - video_spec.device.videoRamSizeInKB = int(self.params['video_memory_mb'] * 1024) - self.change_detected = True - else: - if self.params['display_number'] is not None or self.params['video_memory_mb'] is not None: - self.module.fail_json(msg="display_number and video_memory_mb can not be changed if use_auto_detect is true.") - # useAutoDetect value not control 3D config - if self.params['enable_3D'] is not None: - if self.params['enable_3D'] != video_card_facts['enable_3D_support']: - video_spec.device.enable3DSupport = self.params['enable_3D'] - self.change_detected = True - if self.params['enable_3D']: - enabled_3d = True - else: - if video_card_facts['enable_3D_support']: - enabled_3d = True - else: - if video_card_facts['enable_3D_support']: - enabled_3d = True - # 3D is enabled then 3D memory and renderer method can be set - if enabled_3d: - if self.params['renderer_3D'] is not None: - renderer = self.params['renderer_3D'].lower() - if renderer not in ['automatic', 'software', 'hardware']: - self.module.fail_json(msg="renderer_3D attribute valid value: automatic, software, hardware.") - if renderer != video_card_facts['renderer_3D']: - video_spec.device.use3dRenderer = renderer - self.change_detected = True - if self.params['memory_3D_mb'] is not None: - memory_3d = self.params['memory_3D_mb'] - if not self.is_power_of_2(memory_3d): - self.module.fail_json(msg="memory_3D_mb attribute should be an integer value and power of 2(32-2048).") - else: - if memory_3d < 32 or memory_3d > 2048: - self.module.fail_json(msg="memory_3D_mb attribute should be an integer value and power of 2(32-2048).") - if memory_3d * 1024 != video_card_facts['memory_3D']: - video_spec.device.graphicsMemorySizeInKB = memory_3d * 1024 - self.change_detected = True - else: - if self.params['renderer_3D'] is not None or self.params['memory_3D_mb'] is not None: - self.module.fail_json(msg='3D renderer or 3D memory can not be configured if 3D is not enabled.') - if not self.change_detected: - return None - return video_spec - - def reconfigure_vm_video(self, vm_obj): - """ - Reconfigure video card settings of virtual machine - Args: - vm_obj: Managed object of virtual machine - Returns: Reconfigure results - """ - video_card_spec = self.get_video_card_spec(vm_obj) - if video_card_spec is None: - return {'changed': False, 'failed': False, 'instance': self.video_card_facts} - self.config_spec.deviceChange.append(video_card_spec) - try: - task = vm_obj.ReconfigVM_Task(spec=self.config_spec) - wait_for_task(task) - except vim.fault.InvalidDeviceSpec as invalid_device_spec: - self.module.fail_json(msg="Failed to configure video card on given virtual machine due to invalid" - " device spec : %s" % (to_native(invalid_device_spec.msg)), - details="Please check ESXi server logs for more details.") - except vim.fault.RestrictedVersion as e: - self.module.fail_json(msg="Failed to reconfigure virtual machine due to" - " product versioning restrictions: %s" % to_native(e.msg)) - if task.info.state == 'error': - return {'changed': self.change_detected, 'failed': True, 'msg': task.info.error.msg} - video_card_facts = self.gather_video_card_facts(vm_obj)[1] - return {'changed': self.change_detected, 'failed': False, 'instance': video_card_facts} - - -def main(): - argument_spec = vmware_argument_spec() - argument_spec.update( - name=dict(type='str'), - uuid=dict(type='str'), - moid=dict(type='str'), - folder=dict(type='str'), - datacenter=dict(type='str', default='ha-datacenter'), - gather_video_facts=dict(type='bool', default=False), - use_auto_detect=dict(type='bool'), - display_number=dict(type='int'), - video_memory_mb=dict(type='float'), - enable_3D=dict(type='bool'), - renderer_3D=dict(type='str', choices=['automatic', 'software', 'hardware']), - memory_3D_mb=dict(type='int'), - ) - - module = AnsibleModule( - argument_spec=argument_spec, - required_one_of=[ - ['name', 'uuid', 'moid'] - ] - ) - - pyv = PyVmomiHelper(module) - vm = pyv.get_vm() - if not vm: - vm_id = module.params.get('uuid') or module.params.get('name') or module.params.get('moid') - module.fail_json(msg='Unable to find the specified virtual machine : %s' % vm_id) - - vm_facts = pyv.gather_facts(vm) - vm_power_state = vm_facts['hw_power_status'].lower() - if vm_power_state != 'poweredoff': - module.fail_json(msg='VM state should be poweredoff to reconfigure video card settings.') - result = pyv.reconfigure_vm_video(vm_obj=vm) - if result['failed']: - module.fail_json(**result) - else: - module.exit_json(**result) - - -if __name__ == '__main__': - main() |