VMware datacenter module shouldn't hold pyvmomi context in Ansible module object (#1568)

* VMware datacenter module rewritten to don't hold pyvmomi context and objects in Ansible module object

fixed exceptions handling

added datacenter destroy result, moved checks

changed wrong value

wrong value again... need some sleep

* check_mode fixes

* state defaults to present, default changed to true

* module check fixes
This commit is contained in:
Kamil Szczygieł 2016-04-12 11:11:33 +02:00 committed by René Moser
parent 2dbfdaa88b
commit 01a15f8a0b

View file

@ -25,9 +25,9 @@ short_description: Manage VMware vSphere Datacenters
description: description:
- Manage VMware vSphere Datacenters - Manage VMware vSphere Datacenters
version_added: 2.0 version_added: 2.0
author: "Joseph Callen (@jcpowermac)" author: "Joseph Callen (@jcpowermac), Kamil Szczygiel (@kamsz)"
notes: notes:
- Tested on vSphere 5.5 - Tested on vSphere 6.0
requirements: requirements:
- "python >= 2.6" - "python >= 2.6"
- PyVmomi - PyVmomi
@ -54,7 +54,7 @@ options:
description: description:
- If the datacenter should be present or absent - If the datacenter should be present or absent
choices: ['present', 'absent'] choices: ['present', 'absent']
required: True default: present
extends_documentation_fragment: vmware.documentation extends_documentation_fragment: vmware.documentation
''' '''
@ -64,7 +64,7 @@ EXAMPLES = '''
local_action: > local_action: >
vmware_datacenter vmware_datacenter
hostname="{{ ansible_ssh_host }}" username=root password=vmware hostname="{{ ansible_ssh_host }}" username=root password=vmware
datacenter_name="datacenter" datacenter_name="datacenter" state=present
''' '''
try: try:
@ -74,18 +74,28 @@ except ImportError:
HAS_PYVMOMI = False HAS_PYVMOMI = False
def state_create_datacenter(module): def get_datacenter(context, module):
datacenter_name = module.params['datacenter_name'] try:
content = module.params['content'] datacenter_name = module.params.get('datacenter_name')
changed = True datacenter = find_datacenter_by_name(context, datacenter_name)
datacenter = None return datacenter
except vmodl.RuntimeFault as runtime_fault:
module.fail_json(msg=runtime_fault.msg)
except vmodl.MethodFault as method_fault:
module.fail_json(msg=method_fault.msg)
folder = content.rootFolder
def create_datacenter(context, module):
datacenter_name = module.params.get('datacenter_name')
folder = context.rootFolder
try: try:
if not module.check_mode: datacenter = get_datacenter(context, module)
datacenter = folder.CreateDatacenter(name=datacenter_name) if not datacenter:
module.exit_json(changed=changed, result=str(datacenter)) changed = True
if not module.check_mode:
folder.CreateDatacenter(name=datacenter_name)
module.exit_json(changed=changed)
except vim.fault.DuplicateName: except vim.fault.DuplicateName:
module.fail_json(msg="A datacenter with the name %s already exists" % datacenter_name) module.fail_json(msg="A datacenter with the name %s already exists" % datacenter_name)
except vim.fault.InvalidName: except vim.fault.InvalidName:
@ -99,34 +109,16 @@ def state_create_datacenter(module):
module.fail_json(msg=method_fault.msg) module.fail_json(msg=method_fault.msg)
def check_datacenter_state(module): def destroy_datacenter(context, module):
datacenter_name = module.params['datacenter_name']
try:
content = connect_to_api(module)
datacenter = find_datacenter_by_name(content, datacenter_name)
module.params['content'] = content
if datacenter is None:
return 'absent'
else:
module.params['datacenter'] = datacenter
return 'present'
except vmodl.RuntimeFault as runtime_fault:
module.fail_json(msg=runtime_fault.msg)
except vmodl.MethodFault as method_fault:
module.fail_json(msg=method_fault.msg)
def state_destroy_datacenter(module):
datacenter = module.params['datacenter']
changed = True
result = None result = None
try: try:
if not module.check_mode: datacenter = get_datacenter(context, module)
task = datacenter.Destroy_Task() if datacenter:
changed, result = wait_for_task(task) changed = True
if not module.check_mode:
task = datacenter.Destroy_Task()
changed, result = wait_for_task(task)
module.exit_json(changed=changed, result=result) module.exit_json(changed=changed, result=result)
except vim.fault.VimFault as vim_fault: except vim.fault.VimFault as vim_fault:
module.fail_json(msg=vim_fault.msg) module.fail_json(msg=vim_fault.msg)
@ -136,39 +128,28 @@ def state_destroy_datacenter(module):
module.fail_json(msg=method_fault.msg) module.fail_json(msg=method_fault.msg)
def state_exit_unchanged(module):
module.exit_json(changed=False)
def main(): def main():
argument_spec = vmware_argument_spec() argument_spec = vmware_argument_spec()
argument_spec.update( argument_spec.update(
dict( dict(
datacenter_name=dict(required=True, type='str'), datacenter_name=dict(required=True, type='str'),
state=dict(required=True, choices=['present', 'absent'], type='str'), state=dict(default='present', choices=['present', 'absent'], type='str')
)
) )
)
module = AnsibleModule(argument_spec=argument_spec, supports_check_mode=True) module = AnsibleModule(argument_spec=argument_spec, supports_check_mode=True)
if not HAS_PYVMOMI: if not HAS_PYVMOMI:
module.fail_json(msg='pyvmomi is required for this module') module.fail_json(msg='pyvmomi is required for this module')
datacenter_states = { context = connect_to_api(module)
'absent': { state = module.params.get('state')
'present': state_destroy_datacenter,
'absent': state_exit_unchanged,
},
'present': {
'present': state_exit_unchanged,
'absent': state_create_datacenter,
}
}
desired_state = module.params['state']
current_state = check_datacenter_state(module)
datacenter_states[desired_state][current_state](module) if state == 'present':
create_datacenter(context, module)
if state == 'absent':
destroy_datacenter(context, module)
from ansible.module_utils.basic import * from ansible.module_utils.basic import *
from ansible.module_utils.vmware import * from ansible.module_utils.vmware import *