def __init__(self, module):
     """Constructor."""
     super(VmwareContentDeployTemplate, self).__init__(module)
     self.pyv = PyVmomi(module=module)
     vm = self.pyv.get_vm()
     if vm:
         self.module.exit_json(
             changed=False,
             vm_deploy_info=dict(
                 msg="Virtual Machine '%s' already exists." %
                 self.module.params['name'],
                 vm_id=vm._moId,
             ))
     self.template_service = self.api_client.vcenter.vm_template.LibraryItems
     self.template_name = self.params.get('template')
     self.content_library_name = self.params.get('content_library')
     self.vm_name = self.params.get('name')
     self.datacenter = self.params.get('datacenter')
     self.datastore = self.params.get('datastore')
     self.datastore_cluster = self.params.get('datastore_cluster')
     self.datastore_id = None
     self.folder = self.params.get('folder')
     self.resourcepool = self.params.get('resource_pool')
     self.cluster = self.params.get('cluster')
     self.host = self.params.get('host')
예제 #2
0
    def __init__(self, module):
        """
        Constructor
        """
        super(VmwareTagManager, self).__init__(module)
        self.pyv = PyVmomi(module=module)

        self.object_type = self.params.get('object_type')
        self.object_name = self.params.get('object_name')
        self.managed_object = None

        if self.object_type == 'VirtualMachine':
            self.managed_object = self.pyv.get_vm_or_template(self.object_name)

        if self.object_type == 'Folder':
            self.managed_object = self.pyv.find_folder_by_name(self.object_name)

        if self.object_type == 'Datacenter':
            self.managed_object = self.pyv.find_datacenter_by_name(self.object_name)

        if self.object_type == 'Datastore':
            self.managed_object = self.pyv.find_datastore_by_name(self.object_name)

        if self.object_type == 'DatastoreCluster':
            self.managed_object = self.pyv.find_datastore_cluster_by_name(self.object_name)
            self.object_type = 'StoragePod'

        if self.object_type == 'ClusterComputeResource':
            self.managed_object = self.pyv.find_cluster_by_name(self.object_name)

        if self.object_type == 'ResourcePool':
            self.managed_object = self.pyv.find_resource_pool_by_name(self.object_name)

        if self.object_type == 'HostSystem':
            self.managed_object = self.pyv.find_hostsystem_by_name(self.object_name)

        if self.object_type == 'DistributedVirtualSwitch':
            self.managed_object = find_dvs_by_name(self.pyv.content, self.object_name)
            self.object_type = 'VmwareDistributedVirtualSwitch'

        if self.object_type == 'DistributedVirtualPortgroup':
            dvs_name, pg_name = self.object_name.split(":", 1)
            dv_switch = find_dvs_by_name(self.pyv.content, dvs_name)
            if dv_switch is None:
                self.module.fail_json(msg="A distributed virtual switch with name %s does not exist" % dvs_name)
            self.managed_object = find_dvspg_by_name(dv_switch, pg_name)

        if self.managed_object is None:
            self.module.fail_json(msg="Failed to find the managed object for %s with type %s" % (self.object_name, self.object_type))

        if not hasattr(self.managed_object, '_moId'):
            self.module.fail_json(msg="Unable to find managed object id for %s managed object" % self.object_name)

        self.dynamic_managed_object = DynamicID(type=self.object_type, id=self.managed_object._moId)

        self.tag_service = self.api_client.tagging.Tag
        self.category_service = self.api_client.tagging.Category
        self.tag_association_svc = self.api_client.tagging.TagAssociation

        self.tag_names = self.params.get('tag_names')
예제 #3
0
    def __init__(self, module):
        """Constructor."""
        super(VmwareContentLibCreate, self).__init__(module)
        self.content_service = self.api_client
        self.local_libraries = dict()
        # Track all existing library names, to  block update/delete if duplicates exist
        self.existing_library_names = []
        self.library_name = self.params.get('library_name')
        self.library_description = self.params.get('library_description')
        self.library_type = self.params.get('library_type')
        self.library_types = dict()
        self.subscription_url = self.params.get('subscription_url')
        self.ssl_thumbprint = self.params.get('ssl_thumbprint')
        self.datastore_name = self.params.get('datastore_name')
        self.update_on_demand = self.params.get('update_on_demand')
        self.library_types = {
            'local': self.content_service.content.LocalLibrary,
            'subscribed': self.content_service.content.SubscribedLibrary
        }

        # Import objects of both types to prevent duplicate names
        self.get_all_libraries(self.library_types['local'])
        self.get_all_libraries(self.library_types['subscribed'])

        # Set library type for create/update actions
        self.library_service = self.library_types[self.library_type]
        self.pyv = PyVmomi(module=module)
예제 #4
0
def main():
    argument_spec = vmware_argument_spec()
    argument_spec.update(
        name=dict(type='str'),
        name_match=dict(type='str', choices=['first', 'last'], default='first'),
        uuid=dict(type='str'),
        use_instance_uuid=dict(type='bool', default=False),
        moid=dict(type='str'),
        folder=dict(type='str'),
        datacenter=dict(type='str', required=True),
        tags=dict(type='bool', default=False),
        schema=dict(type='str', choices=['summary', 'vsphere'], default='summary'),
        properties=dict(type='list', elements='str'),
        tag_details=dict(type='bool', default=False),
    )
    module = AnsibleModule(argument_spec=argument_spec,
                           required_one_of=[['name', 'uuid', 'moid']],
                           supports_check_mode=True)

    if module.params.get('folder'):
        # FindByInventoryPath() does not require an absolute path
        # so we should leave the input folder path unmodified
        module.params['folder'] = module.params['folder'].rstrip('/')

    if module.params['schema'] != 'vsphere' and module.params.get('properties'):
        module.fail_json(msg="The option 'properties' is only valid when the schema is 'vsphere'")

    pyv = PyVmomi(module)
    # Check if the VM exists before continuing
    vm = pyv.get_vm()

    # VM already exists
    if vm:
        try:
            if module.params['schema'] == 'summary':
                instance = pyv.gather_facts(vm)
            else:
                instance = pyv.to_json(vm, module.params['properties'])
            if module.params.get('tags'):
                if not HAS_VSPHERE:
                    module.fail_json(msg="Unable to find 'vCloud Suite SDK' Python library which is required."
                                         " Please refer this URL for installation steps"
                                         " - https://code.vmware.com/web/sdk/vsphere-automation-python")

                vm_rest_client = VmwareTag(module)
                tags = []
                if module.params.get('tag_details'):
                    tags = vm_rest_client.get_tags_for_vm(vm_mid=vm._moId)
                else:
                    dynamic_obj = DynamicID(type='VirtualMachine', id=vm._moId)
                    tags = vm_rest_client.get_vm_tags(vm_rest_client.tag_service,
                                                      vm_rest_client.tag_association_svc,
                                                      vm_mid=dynamic_obj)
                instance.update(tags=tags)
            module.exit_json(instance=instance)
        except Exception as exc:
            module.fail_json(msg="Information gathering failed with exception %s" % to_text(exc))
    else:
        vm_id = (module.params.get('uuid') or module.params.get('name') or module.params.get('moid'))
        module.fail_json(msg="Unable to gather information for non-existing VM %s" % vm_id)
예제 #5
0
 def __init__(self, module):
     """Constructor."""
     super(VmwareContentLibCreate, self).__init__(module)
     self.content_service = self.api_client
     self.local_libraries = dict()
     self.library_name = self.params.get('library_name')
     self.library_description = self.params.get('library_description')
     self.library_type = self.params.get('library_type')
     self.library_types = dict()
     self.datastore_name = self.params.get('datastore_name')
     self.get_all_libraries()
     self.pyv = PyVmomi(module=module)
예제 #6
0
def main():
    argument_spec = vmware_argument_spec()
    argument_spec.update(state=dict(type='str',
                                    default='present',
                                    choices=['present', 'absent']),
                         name=dict(type='str'),
                         name_match=dict(type='str',
                                         choices=['first', 'last'],
                                         default='first'),
                         uuid=dict(type='str'),
                         moid=dict(type='str'),
                         folder=dict(type='str'),
                         vnc_ip=dict(type='str', default='0.0.0.0'),
                         vnc_port=dict(type='int', default=0),
                         vnc_password=dict(type='str', default='',
                                           no_log=True),
                         datacenter=dict(type='str', default='ha-datacenter'))

    module = AnsibleModule(argument_spec=argument_spec,
                           supports_check_mode=True,
                           required_one_of=[['name', 'uuid', 'moid']],
                           mutually_exclusive=[['name', 'uuid', 'moid']])

    module.deprecate(
        msg=
        "The 'vmware_guest_vnc' module is deprecated because vSphere 7.0 removed the built-in VNC server",
        date="2022-10-15",
        collection_name="community.vmware")

    result = dict(changed=False, failed=False)

    pyv = PyVmomi(module)
    vm = pyv.get_vm()
    if vm:
        result = set_vnc_extraconfig(pyv.content, vm,
                                     (module.params['state'] == "present"),
                                     module.params['vnc_ip'],
                                     module.params['vnc_port'],
                                     module.params['vnc_password'])
    else:
        vm_id = module.params.get('uuid') or module.params.get(
            'name') or module.params.get('moid')
        module.fail_json(
            msg=
            "Unable to set VNC config for non-existing virtual machine : '%s'"
            % vm_id)

    if result.get('failed') is True:
        module.fail_json(**result)

    module.exit_json(**result)
예제 #7
0
def main():
    argument_spec = VmwareRestClient.vmware_client_argument_spec()
    argument_spec.update(
        state=dict(type='str',
                   default='present',
                   choices=['present', 'poweredon']),
        template=dict(type='str', aliases=['template_src'], required=True),
        content_library=dict(type='str',
                             aliases=['content_library_src'],
                             required=False),
        name=dict(type='str', required=True, aliases=['vm_name']),
        datacenter=dict(type='str', required=True),
        datastore=dict(type='str', required=True),
        folder=dict(type='str', required=True),
        host=dict(type='str', required=True),
        resource_pool=dict(type='str', required=False),
        cluster=dict(type='str', required=False),
    )
    module = AnsibleModule(argument_spec=argument_spec,
                           supports_check_mode=True)
    result = {'failed': False, 'changed': False}
    pyv = PyVmomi(module=module)
    vm = pyv.get_vm()
    if vm:
        module.exit_json(changed=False,
                         vm_deploy_info=dict(
                             msg="Virtual Machine '%s' already Exists." %
                             module.params['name'],
                             vm_id=vm._moId,
                         ))
    vmware_contentlib_create = VmwareContentDeployTemplate(module)
    if module.params['state'] in ['present']:
        if module.check_mode:
            result.update(
                vm_name=module.params['name'],
                changed=True,
                desired_operation='Create VM with PowerOff State',
            )
            module.exit_json(**result)
        vmware_contentlib_create.deploy_vm_from_template()
    if module.params['state'] == 'poweredon':
        if module.check_mode:
            result.update(
                vm_name=module.params['name'],
                changed=True,
                desired_operation='Create VM with PowerON State',
            )
            module.exit_json(**result)
        vmware_contentlib_create.deploy_vm_from_template(power_on=True)
    def __init__(self, module):
        """Constructor."""
        super(VmwareContentDeployOvfTemplate, self).__init__(module)

        # Initialize member variables
        self.module = module
        self._pyv = PyVmomi(module=module)
        self._template_service = self.api_client.vcenter.vm_template.LibraryItems
        self._datacenter_id = None
        self._datastore_id = None
        self._library_item_id = None
        self._folder_id = None
        self._host_id = None
        self._cluster_id = None
        self._resourcepool_id = None
        self.result = {}

        # Turn on debug if not specified, but ANSIBLE_DEBUG is set
        if self.module._debug:
            self.warn('Enable debug output because ANSIBLE_DEBUG was set.')
            self.params['log_level'] = 'debug'
        self.log_level = self.params['log_level']
        if self.log_level == 'debug':
            # Turn on debugging
            self.result['debug'] = {}

        # Get parameters
        self.template = self.params.get('template')
        self.library = self.params.get('library')
        self.vm_name = self.params.get('name')
        self.datacenter = self.params.get('datacenter')
        self.datastore = self.params.get('datastore')
        self.datastore_cluster = self.params.get('datastore_cluster')
        self.folder = self.params.get('folder')
        self.resourcepool = self.params.get('resource_pool')
        self.cluster = self.params.get('cluster')
        self.host = self.params.get('host')
        self.storage_provisioning = self.params['storage_provisioning']
        if self.storage_provisioning == 'eagerzeroedthick':
            self.storage_provisioning = 'eagerZeroedThick'

        vm = self._pyv.get_vm()
        if vm:
            self.result['vm_deploy_info'] = dict(
                msg="Virtual Machine '%s' already Exists." % self.vm_name,
                vm_id=vm._moId,
            )
            self._fail(msg="Virtual Machine deployment failed")
def main():
    argument_spec = VmwareRestClient.vmware_client_argument_spec()
    argument_spec.update(
        ovf_template=dict(type='str',
                          aliases=['template_src', 'ovf'],
                          required=True),
        name=dict(type='str', required=True, aliases=['vm_name']),
        datacenter=dict(type='str', required=True),
        datastore=dict(type='str', required=True),
        folder=dict(type='str', required=True),
        host=dict(type='str', required=True),
        resource_pool=dict(type='str', required=True),
        cluster=dict(type='str', required=False),
        storage_provisioning=dict(
            type='str',
            required=False,
            choices=['thin', 'thick', 'eagerZeroedThick'],
            default=None),
    )
    module = AnsibleModule(argument_spec=argument_spec,
                           supports_check_mode=True)
    result = {'failed': False, 'changed': False}
    pyv = PyVmomi(module=module)
    vm = pyv.get_vm()
    if vm:
        module.exit_json(changed=False,
                         vm_deploy_info=dict(
                             msg="Virtual Machine '%s' already Exists." %
                             module.params['name'],
                             vm_id=vm._moId,
                         ))
    vmware_contentlib_create = VmwareContentDeployOvfTemplate(module)
    if module.check_mode:
        result.update(
            vm_name=module.params['name'],
            changed=True,
            desired_operation='Create VM with PowerOff State',
        )
        module.exit_json(**result)
    vmware_contentlib_create.deploy_vm_from_ovf_template()
예제 #10
0
    def __init__(self, module):
        """
        Constructor
        """
        super(VmwareTagManager, self).__init__(module)
        self.pyv = PyVmomi(module=module)

        moid = self.params.get('moid')
        self.object_type = self.params.get('object_type')
        managed_object_id = None

        if moid:
            managed_object_id = moid
        else:
            object_name = self.params.get('object_name')
            managed_object = self.get_managed_object(object_name,
                                                     self.object_type)

            if managed_object is None:
                self.module.fail_json(
                    msg="Failed to find the managed object for %s with type %s"
                    % (object_name, self.object_type))

            if not hasattr(managed_object, '_moId'):
                self.module.fail_json(
                    msg="Unable to find managed object id for %s managed object"
                    % object_name)

            managed_object_id = managed_object._moId

        self.dynamic_managed_object = DynamicID(type=self.object_type,
                                                id=managed_object_id)

        self.tag_service = self.api_client.tagging.Tag
        self.category_service = self.api_client.tagging.Category
        self.tag_association_svc = self.api_client.tagging.TagAssociation

        self.tag_names = self.params.get('tag_names')
예제 #11
0
    def __init__(self, module):
        """
        Constructor
        """
        super(VmwareObjectRename, self).__init__(module)
        self.pyv = PyVmomi(module=module)
        self.soap_stub = self.pyv.si._stub

        self.object_type = self.params.get('object_type')
        self.object_name = self.params.get('object_name')
        self.object_new_name = self.params.get('new_name')
        self.object_moid = self.params.get('object_moid')

        self.managed_object = None
예제 #12
0
class VmwareContentLibCreate(VmwareRestClient):
    def __init__(self, module):
        """Constructor."""
        super(VmwareContentLibCreate, self).__init__(module)
        self.content_service = self.api_client
        self.local_libraries = dict()
        self.library_name = self.params.get('library_name')
        self.library_description = self.params.get('library_description')
        self.library_type = self.params.get('library_type')
        self.library_types = dict()
        self.datastore_name = self.params.get('datastore_name')
        self.get_all_libraries()
        self.pyv = PyVmomi(module=module)

    def process_state(self):
        """
        Manage states of Content Library
        """
        self.desired_state = self.params.get('state')
        library_states = {
            'absent': {
                'present': self.state_destroy_library,
                'absent': self.state_exit_unchanged,
            },
            'present': {
                'present': self.state_update_library,
                'absent': self.state_create_library,
            }
        }
        library_states[self.desired_state][self.check_content_library_status()]()

    def get_all_libraries(self):
        content_libs = self.content_service.content.LocalLibrary.list()
        if content_libs:
            for content_lib in content_libs:
                lib_details = self.content_service.content.LocalLibrary.get(content_lib)
                self.local_libraries[lib_details.name] = dict(
                    lib_name=lib_details.name,
                    lib_description=lib_details.description,
                    lib_id=lib_details.id,
                    lib_type=lib_details.type
                )

    def check_content_library_status(self):
        """
        Check if Content Library exists or not
        Returns: 'present' if library found, else 'absent'

        """
        ret = 'present' if self.library_name in self.local_libraries else 'absent'
        return ret

    def state_create_library(self):
        # Find the datastore by the given datastore name
        datastore_id = self.pyv.find_datastore_by_name(datastore_name=self.datastore_name)
        if not datastore_id:
            self.module.fail_json(msg="Failed to find the datastore %s" % self.datastore_name)
        self.datastore_id = datastore_id._moId
        # Build the storage backing for the library to be created
        storage_backings = []
        storage_backing = StorageBacking(type=StorageBacking.Type.DATASTORE, datastore_id=self.datastore_id)
        storage_backings.append(storage_backing)

        # Build the specification for the library to be created
        create_spec = LibraryModel()
        create_spec.name = self.library_name
        create_spec.description = self.library_description
        self.library_types = {'local': create_spec.LibraryType.LOCAL,
                              'subscribed': create_spec.LibraryType.SUBSCRIBED}
        create_spec.type = self.library_types[self.library_type]
        create_spec.storage_backings = storage_backings

        # Create a local content library backed the VC datastore
        library_id = self.content_service.content.LocalLibrary.create(create_spec=create_spec,
                                                                      client_token=str(uuid.uuid4()))
        if library_id:
            self.module.exit_json(
                changed=True,
                content_library_info=dict(
                    msg="Content Library '%s' created." % create_spec.name,
                    library_id=library_id,
                    library_description=self.library_description,
                    library_type=create_spec.type,
                )
            )
        self.module.exit_json(changed=False,
                              content_library_info=dict(msg="Content Library not created. Datastore and library_type required", library_id=''))

    def state_update_library(self):
        """
        Update Content Library

        """
        changed = False
        library_id = self.local_libraries[self.library_name]['lib_id']
        content_library_info = dict(msg="Content Library %s is unchanged." % self.library_name, library_id=library_id)
        library_update_spec = LibraryModel()
        library_desc = self.local_libraries[self.library_name]['lib_description']
        desired_lib_desc = self.params.get('library_description')
        if library_desc != desired_lib_desc:
            library_update_spec.description = desired_lib_desc
            self.content_service.content.LocalLibrary.update(library_id, library_update_spec)
            content_library_info['msg'] = 'Content Library %s updated.' % self.library_name
            changed = True

        self.module.exit_json(changed=changed, content_library_info=content_library_info)

    def state_destroy_library(self):
        """
        Delete Content Library

        """
        library_id = self.local_libraries[self.library_name]['lib_id']
        self.content_service.content.LocalLibrary.delete(library_id=library_id)
        self.module.exit_json(
            changed=True,
            content_library_info=dict(
                msg="Content Library '%s' deleted." % self.library_name,
                library_id=library_id
            )
        )

    def state_exit_unchanged(self):
        """
        Return unchanged state

        """
        self.module.exit_json(changed=False)
def main():
    argument_spec = vmware_argument_spec()
    argument_spec.update(
        state=dict(type='str', default='present',
                   choices=['present', 'powered-off', 'powered-on', 'reboot-guest', 'restarted', 'shutdown-guest', 'suspended']),
        name=dict(type='str'),
        name_match=dict(type='str', choices=['first', 'last'], default='first'),
        uuid=dict(type='str'),
        moid=dict(type='str'),
        use_instance_uuid=dict(type='bool', default=False),
        folder=dict(type='str'),
        force=dict(type='bool', default=False),
        scheduled_at=dict(type='str'),
        schedule_task_name=dict(),
        schedule_task_description=dict(),
        schedule_task_enabled=dict(type='bool', default=True),
        state_change_timeout=dict(type='int', default=0),
    )

    module = AnsibleModule(
        argument_spec=argument_spec,
        supports_check_mode=False,
        mutually_exclusive=[
            ['name', 'uuid', 'moid'],
        ],
    )

    result = dict(changed=False,)

    pyv = PyVmomi(module)

    # Check if the VM exists before continuing
    vm = pyv.get_vm()

    if vm:
        # VM already exists, so set power state
        scheduled_at = module.params.get('scheduled_at', None)
        if scheduled_at:
            if not pyv.is_vcenter():
                module.fail_json(msg="Scheduling task requires vCenter, hostname %s "
                                     "is an ESXi server." % module.params.get('hostname'))
            powerstate = {
                'present': vim.VirtualMachine.PowerOn,
                'powered-off': vim.VirtualMachine.PowerOff,
                'powered-on': vim.VirtualMachine.PowerOn,
                'reboot-guest': vim.VirtualMachine.RebootGuest,
                'restarted': vim.VirtualMachine.Reset,
                'shutdown-guest': vim.VirtualMachine.ShutdownGuest,
                'suspended': vim.VirtualMachine.Suspend,
            }
            dt = ''
            try:
                dt = datetime.strptime(scheduled_at, '%d/%m/%Y %H:%M')
            except ValueError as e:
                module.fail_json(msg="Failed to convert given date and time string to Python datetime object,"
                                     "please specify string in 'dd/mm/yyyy hh:mm' format: %s" % to_native(e))
            schedule_task_spec = vim.scheduler.ScheduledTaskSpec()
            schedule_task_name = module.params['schedule_task_name'] or 'task_%s' % str(randint(10000, 99999))
            schedule_task_desc = module.params['schedule_task_description']
            if schedule_task_desc is None:
                schedule_task_desc = 'Schedule task for vm %s for ' \
                                     'operation %s at %s' % (vm.name, module.params['state'], scheduled_at)
            schedule_task_spec.name = schedule_task_name
            schedule_task_spec.description = schedule_task_desc
            schedule_task_spec.scheduler = vim.scheduler.OnceTaskScheduler()
            schedule_task_spec.scheduler.runAt = dt
            schedule_task_spec.action = vim.action.MethodAction()
            schedule_task_spec.action.name = powerstate[module.params['state']]
            schedule_task_spec.enabled = module.params['schedule_task_enabled']

            try:
                pyv.content.scheduledTaskManager.CreateScheduledTask(vm, schedule_task_spec)
                # As this is async task, we create scheduled task and mark state to changed.
                module.exit_json(changed=True)
            except vim.fault.InvalidName as e:
                module.fail_json(msg="Failed to create scheduled task %s for %s : %s" % (module.params.get('state'),
                                                                                         vm.name,
                                                                                         to_native(e.msg)))
            except vim.fault.DuplicateName as e:
                module.exit_json(changed=False, details=to_native(e.msg))
            except vmodl.fault.InvalidArgument as e:
                module.fail_json(msg="Failed to create scheduled task %s as specifications "
                                     "given are invalid: %s" % (module.params.get('state'),
                                                                to_native(e.msg)))
        else:
            result = set_vm_power_state(pyv.content, vm, module.params['state'], module.params['force'], module.params['state_change_timeout'])
    else:
        id = module.params.get('uuid') or module.params.get('moid') or module.params.get('name')
        module.fail_json(msg="Unable to set power state for non-existing virtual machine : '%s'" % id)

    if result.get('failed') is True:
        module.fail_json(**result)

    module.exit_json(**result)
예제 #14
0
    def get_virtual_machines(self):
        """
        Get one/all virtual machines and related configurations information.
        """
        folder = self.params.get('folder')
        folder_obj = None
        if folder:
            folder_obj = self.content.searchIndex.FindByInventoryPath(folder)
            if not folder_obj:
                self.module.fail_json(msg="Failed to find folder specified by %(folder)s" % self.params)

        vm_name = self.params.get('vm_name')
        if vm_name:
            virtual_machine = find_vm_by_name(self.content, vm_name=vm_name, folder=folder_obj)
            if not virtual_machine:
                self.module.fail_json(msg="Failed to find virtual machine %s" % vm_name)
            else:
                virtual_machines = [virtual_machine]
        else:
            virtual_machines = get_all_objs(self.content, [vim.VirtualMachine], folder=folder_obj)
        _virtual_machines = []

        for vm in virtual_machines:
            _ip_address = ""
            summary = vm.summary
            if summary.guest is not None:
                _ip_address = summary.guest.ipAddress
                if _ip_address is None:
                    _ip_address = ""
            _mac_address = []
            all_devices = _get_vm_prop(vm, ('config', 'hardware', 'device'))
            if all_devices:
                for dev in all_devices:
                    if isinstance(dev, vim.vm.device.VirtualEthernetCard):
                        _mac_address.append(dev.macAddress)

            net_dict = {}
            vmnet = _get_vm_prop(vm, ('guest', 'net'))
            if vmnet:
                for device in vmnet:
                    net_dict[device.macAddress] = dict()
                    net_dict[device.macAddress]['ipv4'] = []
                    net_dict[device.macAddress]['ipv6'] = []
                    for ip_addr in device.ipAddress:
                        if "::" in ip_addr:
                            net_dict[device.macAddress]['ipv6'].append(ip_addr)
                        else:
                            net_dict[device.macAddress]['ipv4'].append(ip_addr)

            esxi_hostname = None
            esxi_parent = None
            if summary.runtime.host:
                esxi_hostname = summary.runtime.host.summary.config.name
                esxi_parent = summary.runtime.host.parent

            cluster_name = None
            if esxi_parent and isinstance(esxi_parent, vim.ClusterComputeResource):
                cluster_name = summary.runtime.host.parent.name

            vm_attributes = dict()
            if self.module.params.get('show_attribute'):
                vm_attributes = self.get_vm_attributes(vm)

            vm_tags = list()
            if self.module.params.get('show_tag'):
                vm_tags = self.get_tag_info(vm)

            vm_folder = PyVmomi.get_vm_path(content=self.content, vm_name=vm)
            datacenter = get_parent_datacenter(vm)
            datastore_url = list()
            datastore_attributes = ('name', 'url')
            if vm.config.datastoreUrl:
                for entry in vm.config.datastoreUrl:
                    datastore_url.append({key: getattr(entry, key) for key in dir(entry) if key in datastore_attributes})
            virtual_machine = {
                "guest_name": summary.config.name,
                "guest_fullname": summary.config.guestFullName,
                "power_state": summary.runtime.powerState,
                "ip_address": _ip_address,  # Kept for backward compatibility
                "mac_address": _mac_address,  # Kept for backward compatibility
                "uuid": summary.config.uuid,
                "vm_network": net_dict,
                "esxi_hostname": esxi_hostname,
                "datacenter": datacenter.name,
                "cluster": cluster_name,
                "attributes": vm_attributes,
                "tags": vm_tags,
                "folder": vm_folder,
                "moid": vm._moId,
                "datastore_url": datastore_url,
            }

            vm_type = self.module.params.get('vm_type')
            is_template = _get_vm_prop(vm, ('config', 'template'))
            if vm_type == 'vm' and not is_template:
                _virtual_machines.append(virtual_machine)
            elif vm_type == 'template' and is_template:
                _virtual_machines.append(virtual_machine)
            elif vm_type == 'all':
                _virtual_machines.append(virtual_machine)
        return _virtual_machines
예제 #15
0
class VmwareContentDeployTemplate(VmwareRestClient):
    def __init__(self, module):
        """Constructor."""
        super(VmwareContentDeployTemplate, self).__init__(module)

        # Initialize member variables
        self.module = module
        self._pyv = PyVmomi(module=module)
        self._template_service = self.api_client.vcenter.vm_template.LibraryItems
        self._datacenter_id = None
        self._datastore_id = None
        self._library_item_id = None
        self._folder_id = None
        self._host_id = None
        self._cluster_id = None
        self._resourcepool_id = None
        self.result = {}

        # Turn on debug if not specified, but ANSIBLE_DEBUG is set
        if self.module._debug:
            self.warn('Enable debug output because ANSIBLE_DEBUG was set.')
            self.params['log_level'] = 'debug'
        self.log_level = self.params['log_level']
        if self.log_level == 'debug':
            # Turn on debugging
            self.result['debug'] = {}

        # Get parameters
        self.template = self.params.get('template')
        self.library = self.params.get('library')
        self.vm_name = self.params.get('name')
        self.datacenter = self.params.get('datacenter')
        self.datastore = self.params.get('datastore')
        self.datastore_cluster = self.params.get('datastore_cluster')
        self.folder = self.params.get('folder')
        self.resourcepool = self.params.get('resource_pool')
        self.cluster = self.params.get('cluster')
        self.host = self.params.get('host')

        vm = self._pyv.get_vm()
        if vm:
            self.result['vm_deploy_info'] = dict(
                msg="Virtual Machine '%s' already Exists." % self.vm_name,
                vm_id=vm._moId,
            )
            self._fail(msg="Virtual Machine deployment failed")

    def deploy_vm_from_template(self, power_on=False):
        # Find the datacenter by the given datacenter name
        self._datacenter_id = self.get_datacenter_by_name(self.datacenter)
        if not self._datacenter_id:
            self._fail(msg="Failed to find the datacenter %s" %
                       self.datacenter)

        # Find the datastore by the given datastore name
        if self.datastore:
            self._datastore_id = self.get_datastore_by_name(
                self.datacenter, self.datastore)
            if not self._datastore_id:
                self._fail(msg="Failed to find the datastore %s" %
                           self.datastore)

        # Find the datastore by the given datastore cluster name
        if self.datastore_cluster and not self._datastore_id:
            dsc = self._pyv.find_datastore_cluster_by_name(
                self.datastore_cluster)
            if dsc:
                self.datastore = self._pyv.get_recommended_datastore(dsc)
                self._datastore_id = self.get_datastore_by_name(
                    self.datacenter, self.datastore)
            else:
                self._fail(msg="Failed to find the datastore cluster %s" %
                           self.datastore_cluster)

        if not self._datastore_id:
            self._fail(
                msg=
                "Failed to find the datastore using either datastore or datastore cluster"
            )

        # Find the LibraryItem (Template) by the given LibraryItem name
        if self.library:
            self._library_item_id = self.get_library_item_from_content_library_name(
                self.template, self.library)
            if not self._library_item_id:
                self._fail(
                    msg=
                    "Failed to find the library Item %s in content library %s"
                    % (self.template, self.library))
        else:
            self._library_item_id = self.get_library_item_by_name(
                self.template)
            if not self._library_item_id:
                self._fail(msg="Failed to find the library Item %s" %
                           self.template)

        # Find the folder by the given FQPN folder name
        # The FQPN is I(datacenter)/I(folder type)/folder name/... for
        # example Lab/vm/someparent/myfolder is a vm folder in the Lab datacenter.
        folder_obj = self._pyv.find_folder_by_fqpn(self.folder,
                                                   self.datacenter,
                                                   folder_type='vm')
        if folder_obj:
            self._folder_id = folder_obj._moId
        if not self._folder_id:
            self._fail(msg="Failed to find the folder %s" % self.folder)

        # Find the Host by the given name
        if self.host:
            self._host_id = self.get_host_by_name(self.datacenter, self.host)
            if not self._host_id:
                self._fail(msg="Failed to find the Host %s" % self.host)

        # Find the Cluster by the given Cluster name
        if self.cluster:
            self._cluster_id = self.get_cluster_by_name(
                self.datacenter, self.cluster)
            if not self._cluster_id:
                self._fail(msg="Failed to find the Cluster %s" % self.cluster)
            cluster_obj = self.api_client.vcenter.Cluster.get(self._cluster_id)
            self._resourcepool_id = cluster_obj.resource_pool

        # Find the resourcepool by the given resourcepool name
        if self.resourcepool and self.cluster and self.host:
            self._resourcepool_id = self.get_resource_pool_by_name(
                self.datacenter, self.resourcepool, self.cluster, self.host)
            if not self._resourcepool_id:
                self._fail(msg="Failed to find the resource_pool %s" %
                           self.resourcepool)

        # Create VM placement specs
        self.placement_spec = LibraryItems.DeployPlacementSpec(
            folder=self._folder_id)
        if self._host_id:
            self.placement_spec.host = self._host_id
        if self._resourcepool_id:
            self.placement_spec.resource_pool = self._resourcepool_id
        if self._cluster_id:
            self.placement_spec.cluster = self._cluster_id
        self.vm_home_storage_spec = LibraryItems.DeploySpecVmHomeStorage(
            datastore=to_native(self._datastore_id))
        self.disk_storage_spec = LibraryItems.DeploySpecDiskStorage(
            datastore=to_native(self._datastore_id))
        self.deploy_spec = LibraryItems.DeploySpec(
            name=self.vm_name,
            placement=self.placement_spec,
            vm_home_storage=self.vm_home_storage_spec,
            disk_storage=self.disk_storage_spec,
            powered_on=power_on)
        vm_id = ''
        try:
            vm_id = self._template_service.deploy(self._library_item_id,
                                                  self.deploy_spec)
        except Error as error:
            self._fail(msg="%s" % self.get_error_message(error))
        except Exception as err:
            self._fail(msg="%s" % to_native(err))

        if not vm_id:
            self.result['vm_deploy_info'] = dict(
                msg="Virtual Machine deployment failed", vm_id='')
            self._fail(msg="Virtual Machine deployment failed")
        self.result['changed'] = True
        self.result['vm_deploy_info'] = dict(
            msg="Deployed Virtual Machine '%s'." % self.vm_name,
            vm_id=vm_id,
        )
        self._exit()

    #
    # Wrap AnsibleModule methods
    #

    def _mod_debug(self):
        if self.log_level == 'debug':
            self.result['debug'] = dict(datacenter_id=self._datacenter_id,
                                        datastore_id=self._datastore_id,
                                        library_item_id=self._library_item_id,
                                        folder_id=self._folder_id,
                                        host_id=self._host_id,
                                        cluster_id=self._cluster_id,
                                        resourcepool_id=self._resourcepool_id)

    def _fail(self, msg):
        self._mod_debug()
        self.module.fail_json(msg=msg, **self.result)

    def _exit(self):
        self._mod_debug()
        self.module.exit_json(**self.result)
예제 #16
0
class VmwareTagManager(VmwareRestClient):
    def __init__(self, module):
        """
        Constructor
        """
        super(VmwareTagManager, self).__init__(module)
        self.pyv = PyVmomi(module=module)

        self.object_type = self.params.get('object_type')
        self.object_name = self.params.get('object_name')
        self.managed_object = None

        if self.object_type == 'VirtualMachine':
            self.managed_object = self.pyv.get_vm_or_template(self.object_name)

        if self.object_type == 'Datacenter':
            self.managed_object = self.pyv.find_datacenter_by_name(
                self.object_name)

        if self.object_type == 'ClusterComputeResource':
            self.managed_object = self.pyv.find_cluster_by_name(
                self.object_name)

        if self.object_type == 'HostSystem':
            self.managed_object = self.pyv.find_hostsystem_by_name(
                self.object_name)

        if self.object_type == 'DistributedVirtualSwitch':
            self.managed_object = find_dvs_by_name(self.pyv.content,
                                                   self.object_name)
            self.object_type = 'VmwareDistributedVirtualSwitch'

        if self.object_type == 'DistributedVirtualPortgroup':
            dvs_name, pg_name = self.object_name.split(":", 1)
            dv_switch = find_dvs_by_name(self.pyv.content, dvs_name)
            if dv_switch is None:
                self.module.fail_json(
                    msg=
                    "A distributed virtual switch with name %s does not exist"
                    % dvs_name)
            self.managed_object = find_dvspg_by_name(dv_switch, pg_name)

        if self.managed_object is None:
            self.module.fail_json(
                msg="Failed to find the managed object for %s with type %s" %
                (self.object_name, self.object_type))

        if not hasattr(self.managed_object, '_moId'):
            self.module.fail_json(
                msg="Unable to find managed object id for %s managed object" %
                self.object_name)

        self.dynamic_managed_object = DynamicID(type=self.object_type,
                                                id=self.managed_object._moId)

        self.tag_service = self.api_client.tagging.Tag
        self.category_service = self.api_client.tagging.Category
        self.tag_association_svc = self.api_client.tagging.TagAssociation

        self.tag_names = self.params.get('tag_names')

    def ensure_state(self):
        """
        Manage the internal state of tags

        """
        results = dict(
            changed=False,
            tag_status=dict(),
        )
        changed = False
        action = self.params.get('state')
        available_tag_obj = self.get_tags_for_object(
            tag_service=self.tag_service,
            tag_assoc_svc=self.tag_association_svc,
            dobj=self.dynamic_managed_object)

        _temp_prev_tags = [
            "%s:%s" % (tag['category_name'], tag['name']) for tag in
            self.get_tags_for_dynamic_obj(self.dynamic_managed_object)
        ]
        results['tag_status']['previous_tags'] = _temp_prev_tags
        results['tag_status']['desired_tags'] = self.tag_names

        # Check if category and tag combination exists as per user request
        removed_tags_for_set = False
        for tag in self.tag_names:
            category_obj, category_name, tag_name = None, None, None
            if isinstance(tag, dict):
                tag_name = tag.get('tag')
                category_name = tag.get('category')
                if category_name:
                    # User specified category
                    category_obj = self.search_svc_object_by_name(
                        self.category_service, category_name)
                    if not category_obj:
                        self.module.fail_json(
                            msg="Unable to find the category %s" %
                            category_name)
            elif isinstance(tag, str):
                if ":" in tag:
                    # User specified category
                    category_name, tag_name = tag.split(":", 1)
                    category_obj = self.search_svc_object_by_name(
                        self.category_service, category_name)
                    if not category_obj:
                        self.module.fail_json(
                            msg="Unable to find the category %s" %
                            category_name)
                else:
                    # User specified only tag
                    tag_name = tag

            if category_name:
                tag_obj = self.get_tag_by_category(tag_name=tag_name,
                                                   category_name=category_name)
            else:
                tag_obj = self.get_tag_by_name(tag_name=tag_name)

            if not tag_obj:
                self.module.fail_json(msg="Unable to find the tag %s" %
                                      tag_name)

            if action in ('add', 'present'):
                if tag_obj not in available_tag_obj:
                    # Tag is not already applied
                    try:
                        self.tag_association_svc.attach(
                            tag_id=tag_obj.id,
                            object_id=self.dynamic_managed_object)
                        changed = True
                    except Error as error:
                        self.module.fail_json(msg="%s" %
                                              self.get_error_message(error))

            elif action == 'set':
                # Remove all tags first
                try:
                    if not removed_tags_for_set:
                        for av_tag in available_tag_obj:
                            self.tag_association_svc.detach(
                                tag_id=av_tag.id,
                                object_id=self.dynamic_managed_object)
                        removed_tags_for_set = True
                    self.tag_association_svc.attach(
                        tag_id=tag_obj.id,
                        object_id=self.dynamic_managed_object)
                    changed = True
                except Error as error:
                    self.module.fail_json(msg="%s" %
                                          self.get_error_message(error))

            elif action in ('remove', 'absent'):
                if tag_obj in available_tag_obj:
                    try:
                        self.tag_association_svc.detach(
                            tag_id=tag_obj.id,
                            object_id=self.dynamic_managed_object)
                        changed = True
                    except Error as error:
                        self.module.fail_json(msg="%s" %
                                              self.get_error_message(error))

        _temp_curr_tags = [
            "%s:%s" % (tag['category_name'], tag['name']) for tag in
            self.get_tags_for_dynamic_obj(self.dynamic_managed_object)
        ]
        results['tag_status']['current_tags'] = _temp_curr_tags
        results['changed'] = changed
        self.module.exit_json(**results)
예제 #17
0
class VmwareContentLibCreate(VmwareRestClient):
    def __init__(self, module):
        """Constructor."""
        super(VmwareContentLibCreate, self).__init__(module)
        self.content_service = self.api_client
        self.local_libraries = dict()
        # Track all existing library names, to  block update/delete if duplicates exist
        self.existing_library_names = []
        self.library_name = self.params.get('library_name')
        self.library_description = self.params.get('library_description')
        self.library_type = self.params.get('library_type')
        self.library_types = dict()
        self.subscription_url = self.params.get('subscription_url')
        self.ssl_thumbprint = self.params.get('ssl_thumbprint')
        self.datastore_name = self.params.get('datastore_name')
        self.update_on_demand = self.params.get('update_on_demand')
        self.library_types = {
            'local': self.content_service.content.LocalLibrary,
            'subscribed': self.content_service.content.SubscribedLibrary
        }

        # Import objects of both types to prevent duplicate names
        self.get_all_libraries(self.library_types['local'])
        self.get_all_libraries(self.library_types['subscribed'])

        # Set library type for create/update actions
        self.library_service = self.library_types[self.library_type]
        self.pyv = PyVmomi(module=module)

    def process_state(self):
        """
        Manage states of Content Library
        """
        self.desired_state = self.params.get('state')
        library_states = {
            'absent': {
                'present': self.state_destroy_library,
                'absent': self.state_exit_unchanged,
            },
            'present': {
                'present': self.state_update_library,
                'absent': self.state_create_library,
            }
        }
        library_states[self.desired_state][
            self.check_content_library_status()]()

    def get_all_libraries(self, library_service):
        content_libs = library_service.list()
        if content_libs:
            for content_lib in content_libs:
                lib_details = library_service.get(content_lib)
                lib_dict = dict(lib_name=lib_details.name,
                                lib_description=lib_details.description,
                                lib_id=lib_details.id,
                                lib_type=lib_details.type)
                if lib_details.type == "SUBSCRIBED":
                    lib_dict[
                        "lib_sub_url"] = lib_details.subscription_info.subscription_url
                    lib_dict[
                        "lib_sub_on_demand"] = lib_details.subscription_info.on_demand
                    lib_dict[
                        "lib_sub_ssl_thumbprint"] = lib_details.subscription_info.ssl_thumbprint

                self.local_libraries[lib_details.name] = lib_dict
                self.existing_library_names.append(lib_details.name)

    def check_content_library_status(self):
        """
        Check if Content Library exists or not
        Returns: 'present' if library found, else 'absent'

        """
        ret = 'present' if self.library_name in self.local_libraries else 'absent'
        return ret

    def fail_when_duplicated(self):
        if self.existing_library_names.count(self.library_name) > 1:
            self.module.fail_json(
                msg="Operation cannot continue, library [%s] is not unique" %
                self.library_name)

    def state_exit_unchanged(self):
        """
        Return unchanged state

        """
        self.module.exit_json(changed=False)

    def set_subscription_spec(self):
        if "https:" in self.subscription_url and not self.ssl_thumbprint:
            self.module.fail_json(
                msg="While using HTTPS, a SSL thumbprint must be provided.")
        subscription_info = SubscriptionInfo()
        subscription_info.on_demand = self.update_on_demand
        subscription_info.automatic_sync_enabled = True
        subscription_info.subscription_url = self.subscription_url

        if "https:" in self.subscription_url:
            subscription_info.ssl_thumbprint = self.ssl_thumbprint
        return subscription_info

    def create_update(self, spec, library_id=None, update=False):
        """
        Create or update call and exit cleanly if call completes
        """
        if self.module.check_mode:
            action = 'would be updated' if update else 'would be created'
        else:
            try:
                if update:
                    self.library_service.update(library_id, spec)
                    action = "updated"
                else:
                    library_id = self.library_service.create(create_spec=spec,
                                                             client_token=str(
                                                                 uuid.uuid4()))
                    action = "created"
            except ResourceInaccessible as e:
                message = (
                    "vCenter Failed to make connection to %s with exception: %s "
                    "If using HTTPS, check that the SSL thumbprint is valid" %
                    (self.subscription_url, str(e)))
                self.module.fail_json(msg=message)

        content_library_info = dict(
            msg="Content Library '%s' %s." % (spec.name, action),
            library_id=library_id,
            library_description=self.library_description,
            library_type=spec.type,
        )
        if spec.type == "SUBSCRIBED":
            content_library_info[
                "library_subscription_url"] = spec.subscription_info.subscription_url
            content_library_info[
                "library_subscription_on_demand"] = spec.subscription_info.on_demand
            content_library_info[
                "library_subscription_ssl_thumbprint"] = spec.subscription_info.ssl_thumbprint
        self.module.exit_json(changed=True,
                              content_library_info=content_library_info)

    def state_create_library(self):
        # Fail if no datastore is specified
        if not self.datastore_name:
            self.module.fail_json(
                msg="datastore_name must be specified for create operations")
        # Find the datastore by the given datastore name
        datastore_id = self.pyv.find_datastore_by_name(
            datastore_name=self.datastore_name)
        if not datastore_id:
            self.module.fail_json(msg="Failed to find the datastore %s" %
                                  self.datastore_name)
        self.datastore_id = datastore_id._moId
        # Build the storage backing for the library to be created
        storage_backings = []
        storage_backing = StorageBacking(type=StorageBacking.Type.DATASTORE,
                                         datastore_id=self.datastore_id)
        storage_backings.append(storage_backing)

        # Build the specification for the library to be created
        create_spec = LibraryModel()
        create_spec.name = self.library_name
        create_spec.description = self.library_description
        self.library_types = {
            'local': create_spec.LibraryType.LOCAL,
            'subscribed': create_spec.LibraryType.SUBSCRIBED
        }
        create_spec.type = self.library_types[self.library_type]
        create_spec.storage_backings = storage_backings

        # Build subscribed specification
        if self.library_type == "subscribed":
            subscription_info = self.set_subscription_spec()
            subscription_info.authentication_method = SubscriptionInfo.AuthenticationMethod.NONE
            create_spec.subscription_info = subscription_info

        self.create_update(spec=create_spec)

    def state_update_library(self):
        """
        Update Content Library

        """
        self.fail_when_duplicated()
        changed = False
        library_id = self.local_libraries[self.library_name]['lib_id']

        library_update_spec = LibraryModel()

        # Ensure library types are consistent
        existing_library_type = self.local_libraries[
            self.library_name]['lib_type'].lower()
        if existing_library_type != self.library_type:
            self.module.fail_json(
                msg="Library [%s] is of type %s, cannot be changed to %s" %
                (self.library_name, existing_library_type, self.library_type))

        # Compare changeable subscribed attributes
        if self.library_type == "subscribed":
            existing_subscription_url = self.local_libraries[
                self.library_name]['lib_sub_url']
            sub_url_changed = (existing_subscription_url !=
                               self.subscription_url)

            existing_on_demand = self.local_libraries[
                self.library_name]['lib_sub_on_demand']
            sub_on_demand_changed = (existing_on_demand !=
                                     self.update_on_demand)

            sub_ssl_thumbprint_changed = False
            if "https:" in self.subscription_url and self.ssl_thumbprint:
                existing_ssl_thumbprint = self.local_libraries[
                    self.library_name]['lib_sub_ssl_thumbprint']
                sub_ssl_thumbprint_changed = (existing_ssl_thumbprint !=
                                              self.ssl_thumbprint)

            if sub_url_changed or sub_on_demand_changed or sub_ssl_thumbprint_changed:
                subscription_info = self.set_subscription_spec()
                library_update_spec.subscription_info = subscription_info
                changed = True

        # Compare description
        library_desc = self.local_libraries[
            self.library_name]['lib_description']
        desired_lib_desc = self.params.get('library_description')
        if library_desc != desired_lib_desc:
            library_update_spec.description = desired_lib_desc
            changed = True

        if changed:
            library_update_spec.name = self.library_name
            self.create_update(spec=library_update_spec,
                               library_id=library_id,
                               update=True)

        content_library_info = dict(msg="Content Library %s is unchanged." %
                                    self.library_name,
                                    library_id=library_id)
        self.module.exit_json(changed=False,
                              content_library_info=dict(
                                  msg=content_library_info,
                                  library_id=library_id))

    def state_destroy_library(self):
        """
        Delete Content Library

        """
        self.fail_when_duplicated()
        library_id = self.local_libraries[self.library_name]['lib_id']
        # Setup library service based on existing object type to allow library_type to unspecified
        library_service = self.library_types[self.local_libraries[
            self.library_name]['lib_type'].lower()]
        if self.module.check_mode:
            action = 'would be deleted'
        else:
            action = 'deleted'
            library_service.delete(library_id=library_id)
        self.module.exit_json(
            changed=True,
            content_library_info=dict(msg="Content Library '%s' %s." %
                                      (self.library_name, action),
                                      library_id=library_id))
class VmwareContentDeployTemplate(VmwareRestClient):
    def __init__(self, module):
        """Constructor."""
        super(VmwareContentDeployTemplate, self).__init__(module)
        self.pyv = PyVmomi(module=module)
        vm = self.pyv.get_vm()
        if vm:
            self.module.exit_json(
                changed=False,
                vm_deploy_info=dict(
                    msg="Virtual Machine '%s' already exists." %
                    self.module.params['name'],
                    vm_id=vm._moId,
                ))
        self.template_service = self.api_client.vcenter.vm_template.LibraryItems
        self.template_name = self.params.get('template')
        self.content_library_name = self.params.get('content_library')
        self.vm_name = self.params.get('name')
        self.datacenter = self.params.get('datacenter')
        self.datastore = self.params.get('datastore')
        self.datastore_cluster = self.params.get('datastore_cluster')
        self.datastore_id = None
        self.folder = self.params.get('folder')
        self.resourcepool = self.params.get('resource_pool')
        self.cluster = self.params.get('cluster')
        self.host = self.params.get('host')

    def deploy_vm_from_template(self, power_on=False):
        # Find the datacenter by the given datacenter name
        self.datacenter_id = self.get_datacenter_by_name(
            datacenter_name=self.datacenter)
        if not self.datacenter_id:
            self.module.fail_json(msg="Failed to find the datacenter %s" %
                                  self.datacenter)

        if self.datastore:
            # Find the datastore by the given datastore name
            self.datastore_id = self.get_datastore_by_name(
                self.datacenter, self.datastore)
        if self.datastore_cluster:
            # Find the datastore by the given datastore cluster name
            datastore_cluster = self.pyv.find_datastore_cluster_by_name(
                self.datastore_cluster,
                folder=self.datastore_id.datastoreFolder)
            if not datastore_cluster:
                self.module.fail_json(
                    msg="Failed to find the datastore cluster %s" %
                    self.datastore_cluster)
            self.datastore_id = self.pyv.get_recommended_datastore(
                datastore_cluster)

        if not self.datastore_id:
            if self.datastore:
                self.module.fail_json(msg="Failed to find the datastore %s" %
                                      self.datastore)
            if self.datastore_cluster:
                self.module.fail_json(
                    msg=
                    "Failed to find the datastore using datastore cluster %s" %
                    self.datastore_cluster)

        # Find the LibraryItem (Template) by the given LibraryItem name
        if self.content_library_name:
            self.library_item_id = self.get_library_item_from_content_library_name(
                self.template_name, self.content_library_name)
            if not self.library_item_id:
                self.module.fail_json(
                    msg=
                    "Failed to find the library Item %s in content library %s"
                    % (self.template_name, self.content_library_name))
        else:
            self.library_item_id = self.get_library_item_by_name(
                self.template_name)
            if not self.library_item_id:
                self.module.fail_json(
                    msg="Failed to find the library Item %s" %
                    self.template_name)
        # Find the folder by the given folder name
        self.folder_id = self.get_folder_by_name(self.datacenter, self.folder)
        if not self.folder_id:
            self.module.fail_json(msg="Failed to find the folder %s" %
                                  self.folder)
        # Find the Host by given HostName
        self.host_id = None
        if self.host:
            self.host_id = self.get_host_by_name(self.datacenter, self.host)
            if not self.host_id:
                self.module.fail_json(msg="Failed to find the Host %s" %
                                      self.host)

        # Find the resourcepool by the given resourcepool name
        self.cluster_id = None
        self.resourcepool_id = None

        if self.resourcepool:
            self.resourcepool_id = self.get_resource_pool_by_name(
                self.datacenter, self.resourcepool, self.cluster, self.host)
            if not self.resourcepool_id:
                self.module.fail_json(
                    msg="Failed to find the resource_pool %s" %
                    self.resourcepool)

        # Find the Cluster by the given Cluster name
        if self.cluster:
            self.cluster_id = self.get_cluster_by_name(self.datacenter,
                                                       self.cluster)
            if not self.cluster_id:
                self.module.fail_json(msg="Failed to find the Cluster %s" %
                                      self.cluster)
            cluster_obj = self.api_client.vcenter.Cluster.get(self.cluster_id)
            self.resourcepool_id = cluster_obj.resource_pool

        # Create VM placement specs
        self.placement_spec = LibraryItems.DeployPlacementSpec(
            folder=self.folder_id)
        if self.host_id:
            self.placement_spec.host = self.host_id
        if self.resourcepool_id:
            self.placement_spec.resource_pool = self.resourcepool_id
        if self.cluster_id:
            self.placement_spec.cluster = self.cluster_id
        self.vm_home_storage_spec = LibraryItems.DeploySpecVmHomeStorage(
            datastore=to_native(self.datastore_id))
        self.disk_storage_spec = LibraryItems.DeploySpecDiskStorage(
            datastore=to_native(self.datastore_id))
        self.deploy_spec = LibraryItems.DeploySpec(
            name=self.vm_name,
            placement=self.placement_spec,
            vm_home_storage=self.vm_home_storage_spec,
            disk_storage=self.disk_storage_spec,
            powered_on=power_on)
        vm_id = ''
        try:
            vm_id = self.template_service.deploy(self.library_item_id,
                                                 self.deploy_spec)
        except Error as error:
            self.module.fail_json(msg="%s" % self.get_error_message(error))
        except Exception as err:
            self.module.fail_json(msg="%s" % to_native(err))

        if vm_id:
            self.module.exit_json(changed=True,
                                  vm_deploy_info=dict(
                                      msg="Deployed Virtual Machine '%s'." %
                                      self.vm_name,
                                      vm_id=vm_id,
                                  ))
        self.module.exit_json(changed=False,
                              vm_deploy_info=dict(
                                  msg="Virtual Machine deployment failed",
                                  vm_id=vm_id))
class VmwareContentDeployOvfTemplate(VmwareRestClient):
    def __init__(self, module):
        """Constructor."""
        super(VmwareContentDeployOvfTemplate, self).__init__(module)

        # Initialize member variables
        self.module = module
        self._pyv = PyVmomi(module=module)
        self._template_service = self.api_client.vcenter.vm_template.LibraryItems
        self._datacenter_id = None
        self._datastore_id = None
        self._library_item_id = None
        self._folder_id = None
        self._host_id = None
        self._cluster_id = None
        self._resourcepool_id = None
        self.result = {}

        # Turn on debug if not specified, but ANSIBLE_DEBUG is set
        if self.module._debug:
            self.warn('Enable debug output because ANSIBLE_DEBUG was set.')
            self.params['log_level'] = 'debug'
        self.log_level = self.params['log_level']
        if self.log_level == 'debug':
            # Turn on debugging
            self.result['debug'] = {}

        # Get parameters
        self.template = self.params.get('template')
        self.library = self.params.get('library')
        self.vm_name = self.params.get('name')
        self.datacenter = self.params.get('datacenter')
        self.datastore = self.params.get('datastore')
        self.datastore_cluster = self.params.get('datastore_cluster')
        self.folder = self.params.get('folder')
        self.resourcepool = self.params.get('resource_pool')
        self.cluster = self.params.get('cluster')
        self.host = self.params.get('host')
        self.storage_provisioning = self.params['storage_provisioning']
        if self.storage_provisioning == 'eagerzeroedthick':
            self.storage_provisioning = 'eagerZeroedThick'

        vm = self._pyv.get_vm()
        if vm:
            self.result['vm_deploy_info'] = dict(
                msg="Virtual Machine '%s' already Exists." % self.vm_name,
                vm_id=vm._moId,
            )
            self._fail(msg="Virtual Machine deployment failed")

    def deploy_vm_from_ovf_template(self):
        # Find the datacenter by the given datacenter name
        self._datacenter_id = self.get_datacenter_by_name(self.datacenter)
        if not self._datacenter_id:
            self._fail(msg="Failed to find the datacenter %s" %
                       self.datacenter)

        # Find the datastore by the given datastore name
        if self.datastore:
            self._datastore_id = self.get_datastore_by_name(
                self.datacenter, self.datastore)
            if not self._datastore_id:
                self._fail(msg="Failed to find the datastore %s" %
                           self.datastore)

        # Find the datastore by the given datastore cluster name
        if self.datastore_cluster and not self._datastore_id:
            dsc = self._pyv.find_datastore_cluster_by_name(
                self.datastore_cluster)
            if dsc:
                self.datastore = self._pyv.get_recommended_datastore(dsc)
                self._datastore_id = self.get_datastore_by_name(
                    self.datacenter, self.datastore)
            else:
                self._fail(msg="Failed to find the datastore cluster %s" %
                           self.datastore_cluster)

        if not self._datastore_id:
            self._fail(
                msg=
                "Failed to find the datastore using either datastore or datastore cluster"
            )

        # Find the LibraryItem (Template) by the given LibraryItem name
        if self.library:
            self._library_item_id = self.get_library_item_from_content_library_name(
                self.template, self.library)
            if not self._library_item_id:
                self._fail(
                    msg=
                    "Failed to find the library Item %s in content library %s"
                    % (self.template, self.library))
        else:
            self._library_item_id = self.get_library_item_by_name(
                self.template)
            if not self._library_item_id:
                self._fail(msg="Failed to find the library Item %s" %
                           self.template)

        # Find the folder by the given FQPN folder name
        # The FQPN is I(datacenter)/I(folder type)/folder name/... for
        # example Lab/vm/someparent/myfolder is a vm folder in the Lab datacenter.
        folder_obj = self._pyv.find_folder_by_fqpn(self.folder,
                                                   self.datacenter,
                                                   folder_type='vm')
        if folder_obj:
            self._folder_id = folder_obj._moId
        if not self._folder_id:
            self._fail(msg="Failed to find the folder %s" % self.folder)

        # Find the Host by the given name
        if self.host:
            self._host_id = self.get_host_by_name(self.datacenter, self.host)
            if not self._host_id:
                self._fail(msg="Failed to find the Host %s" % self.host)

        # Find the Cluster by the given Cluster name
        if self.cluster:
            self._cluster_id = self.get_cluster_by_name(
                self.datacenter, self.cluster)
            if not self._cluster_id:
                self._fail(msg="Failed to find the Cluster %s" % self.cluster)
            cluster_obj = self.api_client.vcenter.Cluster.get(self._cluster_id)
            self._resourcepool_id = cluster_obj.resource_pool

        # Find the resourcepool by the given resourcepool name
        if self.resourcepool and self.cluster and self.host:
            self._resourcepool_id = self.get_resource_pool_by_name(
                self.datacenter, self.resourcepool, self.cluster, self.host)
            if not self._resourcepool_id:
                self._fail(msg="Failed to find the resource_pool %s" %
                           self.resourcepool)

        if not self._resourcepool_id:
            self._fail(
                msg="Failed to find a resource pool either by name or cluster")

        deployment_target = LibraryItem.DeploymentTarget(
            resource_pool_id=self._resourcepool_id, folder_id=self._folder_id)

        self.ovf_summary = self.api_client.vcenter.ovf.LibraryItem.filter(
            ovf_library_item_id=self._library_item_id,
            target=deployment_target)

        self.deploy_spec = LibraryItem.ResourcePoolDeploymentSpec(
            name=self.vm_name,
            annotation=self.ovf_summary.annotation,
            accept_all_eula=True,
            network_mappings=None,
            storage_mappings=None,
            storage_provisioning=self.storage_provisioning,
            storage_profile_id=None,
            locale=None,
            flags=None,
            additional_parameters=None,
            default_datastore_id=self._datastore_id)

        response = {'succeeded': False}
        try:
            response = self.api_client.vcenter.ovf.LibraryItem.deploy(
                self._library_item_id, deployment_target, self.deploy_spec)
        except Error as error:
            self._fail(msg="%s" % self.get_error_message(error))
        except Exception as err:
            self._fail(msg="%s" % to_native(err))

        if not response.succeeded:
            self.result['vm_deploy_info'] = dict(
                msg="Virtual Machine deployment failed", vm_id='')
            self._fail(msg="Virtual Machine deployment failed")
        self.result['changed'] = True
        self.result['vm_deploy_info'] = dict(
            msg="Deployed Virtual Machine '%s'." % self.vm_name,
            vm_id=response.resource_id.id,
        )
        self._exit()

    #
    # Wrap AnsibleModule methods
    #

    def _mod_debug(self):
        if self.log_level == 'debug':
            self.result['debug'].update(
                dict(
                    datacenter_id=self._datacenter_id,
                    datastore_id=self._datastore_id,
                    library_item_id=self._library_item_id,
                    folder_id=self._folder_id,
                    host_id=self._host_id,
                    cluster_id=self._cluster_id,
                    resourcepool_id=self._resourcepool_id,
                ))

    def _fail(self, msg):
        self._mod_debug()
        self.module.fail_json(msg=msg, **self.result)

    def _exit(self):
        self._mod_debug()
        self.module.exit_json(**self.result)