From cf88bfdbbf745e7cd2c063f112581db88590a4d0 Mon Sep 17 00:00:00 2001 From: Abhijeet Kasurde Date: Thu, 18 Jan 2018 15:10:16 +0530 Subject: [PATCH] VMware: Refactor vmware_maintenancemode module (#35000) Signed-off-by: Abhijeet Kasurde --- .../cloud/vmware/vmware_maintenancemode.py | 203 +++++++++--------- 1 file changed, 97 insertions(+), 106 deletions(-) diff --git a/lib/ansible/modules/cloud/vmware/vmware_maintenancemode.py b/lib/ansible/modules/cloud/vmware/vmware_maintenancemode.py index b799c950a46..a200642c24e 100644 --- a/lib/ansible/modules/cloud/vmware/vmware_maintenancemode.py +++ b/lib/ansible/modules/cloud/vmware/vmware_maintenancemode.py @@ -1,16 +1,18 @@ #!/usr/bin/python # -*- coding: utf-8 -*- - -# (c) 2015, VMware, Inc. +# Copyright: (c) 2015, VMware, Inc. +# Copyright: (c) 2018, Ansible Project # 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'} +ANSIBLE_METADATA = { + 'metadata_version': '1.1', + 'status': ['preview'], + 'supported_by': 'community' +} DOCUMENTATION = ''' @@ -18,23 +20,25 @@ DOCUMENTATION = ''' module: vmware_maintenancemode short_description: Place a host into maintenance mode description: - - Place an ESXI host into maintenance mode - - Support for VSAN compliant maintenance mode when selected -author: "Jay Jahns " + - This module can be used for placing a ESXi host into maintenance mode. + - Support for VSAN compliant maintenance mode when selected. +author: +- "Jay Jahns " +- "Abhijeet Kasurde (@akasurde)" version_added: "2.1" notes: - - Tested on vSphere 5.5 and 6.0 + - Tested on vSphere 5.5, 6.0 and 6.5 requirements: - "python >= 2.6" - PyVmomi options: esxi_hostname: description: - - Name of the host as defined in vCenter + - Name of the host as defined in vCenter. required: True vsan_mode: description: - - Specify which VSAN compliant mode to enter + - Specify which VSAN compliant mode to enter. choices: - 'ensureObjectAccessibility' - 'evacuateAllData' @@ -42,7 +46,7 @@ options: required: False evacuate: description: - - If True, evacuate all powered off VMs + - If True, evacuate all powered off VMs. choices: - True - False @@ -50,12 +54,12 @@ options: required: False timeout: description: - - Specify a timeout for the operation + - Specify a timeout for the operation. required: False default: 0 state: description: - - Enter or exit maintenance mode + - Enter or exit maintenance mode. choices: - present - absent @@ -66,8 +70,7 @@ extends_documentation_fragment: vmware.documentation EXAMPLES = ''' - name: Enter VSAN-Compliant Maintenance Mode - local_action: - module: vmware_maintenancemode + vmware_maintenancemode: hostname: vc_host username: vc_user password: vc_pass @@ -77,6 +80,7 @@ EXAMPLES = ''' timeout: 3600 state: present ''' + RETURN = ''' hostsystem: description: Name of vim reference @@ -97,109 +101,96 @@ status: try: from pyVmomi import vim - HAS_PYVMOMI = True - except ImportError: - HAS_PYVMOMI = False + pass from ansible.module_utils.basic import AnsibleModule -from ansible.module_utils.vmware import (HAS_PYVMOMI, TaskError, connect_to_api, find_hostsystem_by_name, - vmware_argument_spec, wait_for_task) - - -def EnterMaintenanceMode(module, host): - - if host.runtime.inMaintenanceMode: - module.exit_json( - changed=False, - hostsystem=str(host), - hostname=module.params['esxi_hostname'], - status='NO_ACTION', - msg='Host already in maintenance mode') - - spec = vim.host.MaintenanceSpec() - - if module.params['vsan']: - spec.vsanMode = vim.vsan.host.DecommissionMode() - spec.vsanMode.objectAction = module.params['vsan'] - - try: - task = host.EnterMaintenanceMode_Task( - module.params['timeout'], - module.params['evacuate'], - spec) - - success, result = wait_for_task(task) - - return dict(changed=success, - hostsystem=str(host), - hostname=module.params['esxi_hostname'], - status='ENTER', - msg='Host entered maintenance mode') - - except TaskError: - module.fail_json( - msg='Host failed to enter maintenance mode') - - -def ExitMaintenanceMode(module, host): - if not host.runtime.inMaintenanceMode: - module.exit_json( - changed=False, - hostsystem=str(host), - hostname=module.params['esxi_hostname'], - status='NO_ACTION', - msg='Host not in maintenance mode') - - try: - task = host.ExitMaintenanceMode_Task( - module.params['timeout']) - - success, result = wait_for_task(task) - - return dict(changed=success, - hostsystem=str(host), - hostname=module.params['esxi_hostname'], - status='EXIT', - msg='Host exited maintenance mode') - - except TaskError: - module.fail_json( - msg='Host failed to exit maintenance mode') +from ansible.module_utils.vmware import PyVmomi, TaskError, vmware_argument_spec, wait_for_task +from ansible.module_utils._text import to_native + + +class VmwareMaintenanceMgr(PyVmomi): + def __init__(self, module): + super(VmwareMaintenanceMgr, self).__init__(module) + self.esxi_hostname = self.module.params.get('esxi_hostname') + self.vsan = self.module.params.get('vsan', None) + self.host = self.find_hostsystem_by_name(host_name=self.esxi_hostname) + if not self.host: + self.module.fail_json(msg='Host %s not found in vCenter' % self.esxi_hostname) + + def EnterMaintenanceMode(self): + if self.host.runtime.inMaintenanceMode: + self.module.exit_json(changed=False, + hostsystem=str(self.host), + hostname=self.esxi_hostname, + status='NO_ACTION', + msg='Host %s already in maintenance mode' % self.esxi_hostname) + + spec = vim.host.MaintenanceSpec() + + if self.vsan: + spec.vsanMode = vim.vsan.host.DecommissionMode() + spec.vsanMode.objectAction = self.vsan + + try: + task = self.host.EnterMaintenanceMode_Task(self.module.params['timeout'], + self.module.params['evacuate'], + spec) + + success, result = wait_for_task(task) + + self.module.exit_json(changed=success, + hostsystem=str(self.host), + hostname=self.esxi_hostname, + status='ENTER', + msg='Host %s entered maintenance mode' % self.esxi_hostname) + + except TaskError as e: + self.module.fail_json(msg='Host %s failed to enter maintenance mode due to %s' % (self.esxi_hostname, to_native(e))) + + def ExitMaintenanceMode(self): + if not self.host.runtime.inMaintenanceMode: + self.module.exit_json(changed=False, + hostsystem=str(self.host), + hostname=self.esxi_hostname, + status='NO_ACTION', + msg='Host %s not in maintenance mode' % self.esxi_hostname) + + try: + task = self.host.ExitMaintenanceMode_Task(self.module.params['timeout']) + + success, result = wait_for_task(task) + + self.module.exit_json(changed=success, + hostsystem=str(self.host), + hostname=self.esxi_hostname, + status='EXIT', + msg='Host %s exited maintenance mode' % self.esxi_hostname) + except TaskError as e: + self.module.fail_json(msg='Host %s failed to exit maintenance mode due to %s' % (self.esxi_hostname, to_native(e))) def main(): spec = vmware_argument_spec() - spec.update(dict( - esxi_hostname=dict(required=True), - vsan=dict(required=False, choices=['ensureObjectAccessibility', - 'evacuateAllData', - 'noAction']), - evacuate=dict(required=False, type='bool', default=False), - timeout=dict(required=False, default=0, type='int'), - state=dict(required=False, - default='present', - choices=['present', 'absent']))) + spec.update(dict(esxi_hostname=dict(type='str', required=True), + vsan=dict(type='str', choices=['ensureObjectAccessibility', + 'evacuateAllData', + 'noAction'] + ), + evacuate=dict(type='bool', default=False), + timeout=dict(default=0, type='int'), + state=dict(required=False, default='present', choices=['present', 'absent']) + ) + ) module = AnsibleModule(argument_spec=spec) - if not HAS_PYVMOMI: - module.fail_json(msg='pyvmomi is required for this module') - - content = connect_to_api(module) - host = find_hostsystem_by_name(content, module.params['esxi_hostname']) - - if not host: - module.fail_json( - msg='Host not found in vCenter') + host_maintenance_mgr = VmwareMaintenanceMgr(module=module) if module.params['state'] == 'present': - result = EnterMaintenanceMode(module, host) - + host_maintenance_mgr.EnterMaintenanceMode() elif module.params['state'] == 'absent': - result = ExitMaintenanceMode(module, host) - - module.exit_json(**result) + host_maintenance_mgr.ExitMaintenanceMode() if __name__ == '__main__':