diff options
Diffstat (limited to 'lib/ansible/modules/cloud/vmware/vca_vapp.py')
-rw-r--r-- | lib/ansible/modules/cloud/vmware/vca_vapp.py | 351 |
1 files changed, 0 insertions, 351 deletions
diff --git a/lib/ansible/modules/cloud/vmware/vca_vapp.py b/lib/ansible/modules/cloud/vmware/vca_vapp.py deleted file mode 100644 index 01a9dc7e9d..0000000000 --- a/lib/ansible/modules/cloud/vmware/vca_vapp.py +++ /dev/null @@ -1,351 +0,0 @@ -#!/usr/bin/python -# Copyright: (c) 2015, Ansible, Inc. -# 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: vca_vapp -short_description: Manages vCloud Air vApp instances. -description: - - This module will actively managed vCloud Air vApp instances. Instances - can be created and deleted as well as both deployed and undeployed. -version_added: "2.0" -author: -- Peter Sprygada (@privateip) -notes: -- VMware sold their vCloud Air service in Q2 2017. -- VMware made significant changes to the pyvcloud interface around this time. The C(vca_vapp) module relies on now deprecated code. -- Mileage with C(vca_vapp) may vary as vCloud Director APIs advance. -- A viable alternative maybe U(https://github.com/vmware/ansible-module-vcloud-director) -requirements: -- pyvcloud <= 18.2.2 -options: - vapp_name: - description: - - The name of the vCloud Air vApp instance - required: yes - template_name: - description: - - The name of the vApp template to use to create the vApp instance. If - the I(state) is not `absent` then the I(template_name) value must be - provided. The I(template_name) must be previously uploaded to the - catalog specified by I(catalog_name) - network_name: - description: - - The name of the network that should be attached to the virtual machine - in the vApp. The virtual network specified must already be created in - the vCloud Air VDC. If the I(state) is not 'absent' then the - I(network_name) argument must be provided. - network_mode: - description: - - Configures the mode of the network connection. - default: pool - choices: ['pool', 'dhcp', 'static'] - vm_name: - description: - - The name of the virtual machine instance in the vApp to manage. - vm_cpus: - description: - - The number of vCPUs to configure for the VM in the vApp. If the - I(vm_name) argument is provided, then this becomes a per VM setting - otherwise it is applied to all VMs in the vApp. - vm_memory: - description: - - The amount of memory in MB to allocate to VMs in the vApp. If the - I(vm_name) argument is provided, then this becomes a per VM setting - otherwise it is applied to all VMs in the vApp. - operation: - description: - - Specifies an operation to be performed on the vApp. - default: noop - choices: ['noop', 'poweron', 'poweroff', 'suspend', 'shutdown', 'reboot', 'reset'] - state: - description: - - Configures the state of the vApp. - default: present - choices: ['present', 'absent', 'deployed', 'undeployed'] - username: - description: - - The vCloud Air username to use during authentication - password: - description: - - The vCloud Air password to use during authentication - org: - description: - - The org to login to for creating vapp, mostly set when the service_type is vdc. - instance_id: - description: - - The instance id in a vchs environment to be used for creating the vapp - host: - description: - - The authentication host to be used when service type is vcd. - api_version: - description: - - The api version to be used with the vca - default: "5.7" - service_type: - description: - - The type of service we are authenticating against - default: vca - choices: [ "vca", "vchs", "vcd" ] - vdc_name: - description: - - The name of the virtual data center (VDC) where the vm should be created or contains the vAPP. -extends_documentation_fragment: vca -''' - -EXAMPLES = ''' -- name: Creates a new vApp in a VCA instance - vca_vapp: - vapp_name: tower - state: present - template_name: 'Ubuntu Server 12.04 LTS (amd64 20150127)' - vdc_name: VDC1 - instance_id: '<your instance id here>' - username: '<your username here>' - password: '<your password here>' - delegate_to: localhost -''' - -from ansible.module_utils.vca import VcaAnsibleModule, VcaError - -DEFAULT_VAPP_OPERATION = 'noop' - -VAPP_STATUS = { - 'Powered off': 'poweroff', - 'Powered on': 'poweron', - 'Suspended': 'suspend' -} - -VAPP_STATES = ['present', 'absent', 'deployed', 'undeployed'] -VAPP_OPERATIONS = ['poweron', 'poweroff', 'suspend', 'shutdown', - 'reboot', 'reset', 'noop'] - - -def get_instance(module): - vapp_name = module.params['vapp_name'] - inst = dict(vapp_name=vapp_name, state='absent') - try: - vapp = module.get_vapp(vapp_name) - if vapp: - status = module.vca.get_status(vapp.me.get_status()) - inst['status'] = VAPP_STATUS.get(status, 'unknown') - inst['state'] = 'deployed' if vapp.me.deployed else 'undeployed' - return inst - except VcaError: - return inst - - -def create(module): - vdc_name = module.params['vdc_name'] - vapp_name = module.params['vapp_name'] - template_name = module.params['template_name'] - catalog_name = module.params['catalog_name'] - network_name = module.params['network_name'] - network_mode = module.params['network_mode'] - vm_name = module.params['vm_name'] - vm_cpus = module.params['vm_cpus'] - vm_memory = module.params['vm_memory'] - deploy = module.params['state'] == 'deploy' - poweron = module.params['operation'] == 'poweron' - - task = module.vca.create_vapp(vdc_name, vapp_name, template_name, - catalog_name, network_name, 'bridged', - vm_name, vm_cpus, vm_memory, deploy, poweron) - - if task is False: - module.fail('Failed to create vapp: %s' % vapp_name) - - module.vca.block_until_completed(task) - - # Connect the network to the Vapp/VM and return assigned IP - if network_name is not None: - vm_ip = connect_to_network(module, vdc_name, vapp_name, network_name, network_mode) - return vm_ip - - -def delete(module): - vdc_name = module.params['vdc_name'] - vapp_name = module.params['vapp_name'] - module.vca.delete_vapp(vdc_name, vapp_name) - - -def do_operation(module): - vapp_name = module.params['vapp_name'] - operation = module.params['operation'] - - vm_name = module.params.get('vm_name') - vm = None - if vm_name: - vm = module.get_vm(vapp_name, vm_name) - - if operation == 'poweron': - operation = 'powerOn' - elif operation == 'poweroff': - operation = 'powerOff' - - cmd = 'power:%s' % operation - module.get_vapp(vapp_name).execute(cmd, 'post', targetVM=vm) - - -def set_state(module): - state = module.params['state'] - vapp = module.get_vapp(module.params['vapp_name']) - if state == 'deployed': - action = module.params['operation'] == 'poweron' - if not vapp.deploy(action): - module.fail('unable to deploy vapp') - elif state == 'undeployed': - action = module.params['operation'] - if action == 'poweroff': - action = 'powerOff' - elif action != 'suspend': - action = None - if not vapp.undeploy(action): - module.fail('unable to undeploy vapp') - - -def connect_to_network(module, vdc_name, vapp_name, network_name, network_mode): - nets = filter(lambda n: n.name == network_name, module.vca.get_networks(vdc_name)) - if len(nets) != 1: - module.fail_json("Unable to find network %s " % network_name) - - the_vdc = module.vca.get_vdc(vdc_name) - the_vapp = module.vca.get_vapp(the_vdc, vapp_name) - - if the_vapp and the_vapp.name != vapp_name: - module.fail_json(msg="Failed to find vapp named %s" % the_vapp.name) - - # Connect vApp - task = the_vapp.connect_to_network(nets[0].name, nets[0].href) - result = module.vca.block_until_completed(task) - - if result is None: - module.fail_json(msg="Failed to complete task") - - # Connect VM - ip_allocation_mode = None - if network_mode == 'pool': - ip_allocation_mode = 'POOL' - elif network_mode == 'dhcp': - ip_allocation_mode = 'DHCP' - - task = the_vapp.connect_vms(nets[0].name, connection_index=0, ip_allocation_mode=ip_allocation_mode) - if result is None: - module.fail_json(msg="Failed to complete task") - - result = module.vca.block_until_completed(task) - if result is None: - module.fail_json(msg="Failed to complete task") - - # Update VApp info and get VM IP - the_vapp = module.vca.get_vapp(the_vdc, vapp_name) - if the_vapp is None: - module.fail_json(msg="Failed to get vapp named %s" % vapp_name) - - return get_vm_details(module) - - -def get_vm_details(module): - vdc_name = module.params['vdc_name'] - vapp_name = module.params['vapp_name'] - vm_name = module.params['vm_name'] - the_vdc = module.vca.get_vdc(vdc_name) - the_vapp = module.vca.get_vapp(the_vdc, vapp_name) - if the_vapp and the_vapp.name != vapp_name: - module.fail_json(msg="Failed to find vapp named %s" % the_vapp.name) - the_vm_details = dict() - - for vm in the_vapp.me.Children.Vm: - sections = vm.get_Section() - - customization_section = ( - filter(lambda section: - section.__class__.__name__ == - "GuestCustomizationSectionType", - sections)[0]) - if customization_section.get_AdminPasswordEnabled(): - the_vm_details["vm_admin_password"] = customization_section.get_AdminPassword() - - virtual_hardware_section = ( - filter(lambda section: - section.__class__.__name__ == - "VirtualHardwareSection_Type", - sections)[0]) - items = virtual_hardware_section.get_Item() - ips = [] - _url = '{http://www.vmware.com/vcloud/v1.5}ipAddress' - for item in items: - if item.Connection: - for c in item.Connection: - if c.anyAttributes_.get( - _url): - ips.append(c.anyAttributes_.get( - _url)) - if len(ips) > 0: - the_vm_details["vm_ip"] = ips[0] - - return the_vm_details - - -def main(): - argument_spec = dict( - vapp_name=dict(required=True), - vdc_name=dict(required=True), - template_name=dict(), - catalog_name=dict(default='Public Catalog'), - network_name=dict(), - network_mode=dict(default='pool', choices=['dhcp', 'static', 'pool']), - vm_name=dict(), - vm_cpus=dict(), - vm_memory=dict(), - operation=dict(default=DEFAULT_VAPP_OPERATION, choices=VAPP_OPERATIONS), - state=dict(default='present', choices=VAPP_STATES) - ) - - module = VcaAnsibleModule(argument_spec=argument_spec, - supports_check_mode=True) - - state = module.params['state'] - operation = module.params['operation'] - - instance = get_instance(module) - - result = dict(changed=False) - - if instance and state == 'absent': - if not module.check_mode: - delete(module) - result['changed'] = True - - elif state != 'absent': - if instance['state'] == 'absent': - if not module.check_mode: - result['ansible_facts'] = create(module) - result['changed'] = True - - elif instance['state'] != state and state != 'present': - if not module.check_mode: - set_state(module) - result['changed'] = True - - if operation != instance.get('status') and operation != 'noop': - if not module.check_mode: - do_operation(module) - result['changed'] = True - result['ansible_facts'] = get_vm_details(module) - - return module.exit(**result) - - -if __name__ == '__main__': - main() |