VMware: Refactor vmware_maintenancemode module (#35000)
Signed-off-by: Abhijeet Kasurde <akasurde@redhat.com>
This commit is contained in:
parent
8a6d699198
commit
cf88bfdbbf
1 changed files with 84 additions and 93 deletions
|
@ -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 <jjahns@vmware.com>"
|
||||
- This module can be used for placing a ESXi host into maintenance mode.
|
||||
- Support for VSAN compliant maintenance mode when selected.
|
||||
author:
|
||||
- "Jay Jahns <jjahns@vmware.com>"
|
||||
- "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)
|
||||
from ansible.module_utils.vmware import PyVmomi, TaskError, vmware_argument_spec, wait_for_task
|
||||
from ansible.module_utils._text import to_native
|
||||
|
||||
|
||||
def EnterMaintenanceMode(module, host):
|
||||
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)
|
||||
|
||||
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')
|
||||
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()
|
||||
spec = vim.host.MaintenanceSpec()
|
||||
|
||||
if module.params['vsan']:
|
||||
spec.vsanMode = vim.vsan.host.DecommissionMode()
|
||||
spec.vsanMode.objectAction = module.params['vsan']
|
||||
if self.vsan:
|
||||
spec.vsanMode = vim.vsan.host.DecommissionMode()
|
||||
spec.vsanMode.objectAction = self.vsan
|
||||
|
||||
try:
|
||||
task = host.EnterMaintenanceMode_Task(
|
||||
module.params['timeout'],
|
||||
module.params['evacuate'],
|
||||
spec)
|
||||
try:
|
||||
task = self.host.EnterMaintenanceMode_Task(self.module.params['timeout'],
|
||||
self.module.params['evacuate'],
|
||||
spec)
|
||||
|
||||
success, result = wait_for_task(task)
|
||||
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')
|
||||
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:
|
||||
module.fail_json(
|
||||
msg='Host failed to enter maintenance mode')
|
||||
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)
|
||||
|
||||
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 = self.host.ExitMaintenanceMode_Task(self.module.params['timeout'])
|
||||
|
||||
try:
|
||||
task = host.ExitMaintenanceMode_Task(
|
||||
module.params['timeout'])
|
||||
success, result = wait_for_task(task)
|
||||
|
||||
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')
|
||||
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__':
|
||||
|
|
Loading…
Reference in a new issue