Get virtual machine properties based on the traversal specs and properties list,
    returns Virtual Machine object with properties.

    service_instance
        Service instance object to access vCenter

    name
        Name of the virtual machine.

    datacenter
        Datacenter name

    vm_properties
        List of vm properties.

    traversal_spec
        Traversal Spec object(s) for searching.

    parent_ref
        Container Reference object for searching under a given object.

def get_vm_by_property(service_instance, name, datacenter=None, vm_properties=None,
                       traversal_spec=None, parent_ref=None):
    '''
    Get virtual machine properties based on the traversal specs and properties list,
    returns Virtual Machine object with properties.

    service_instance
        Service instance object to access vCenter

    name
        Name of the virtual machine.

    datacenter
        Datacenter name

    vm_properties
        List of vm properties.

    traversal_spec
        Traversal Spec object(s) for searching.

    parent_ref
        Container Reference object for searching under a given object.
    '''
    if datacenter and not parent_ref:
        parent_ref = salt.utils.vmware.get_datacenter(service_instance, datacenter)
    if not vm_properties:
        vm_properties = ['name',
                         'config.hardware.device',
                         'summary.storage.committed',
                         'summary.storage.uncommitted',
                         'summary.storage.unshared',
                         'layoutEx.file',
                         'config.guestFullName',
                         'config.guestId',
                         'guest.net',
                         'config.hardware.memoryMB',
                         'config.hardware.numCPU',
                         'config.files.vmPathName',
                         'summary.runtime.powerState',
                         'guest.toolsStatus']
    vm_list = salt.utils.vmware.get_mors_with_properties(service_instance,
                                                         vim.VirtualMachine,
                                                         vm_properties,
                                                         container_ref=parent_ref,
                                                         traversal_spec=traversal_spec)
    vm_formatted = [vm for vm in vm_list if vm['name'] == name]
    if not vm_formatted:
        raise salt.exceptions.VMwareObjectRetrievalError('The virtual machine was not found.')
    elif len(vm_formatted) > 1:
        raise salt.exceptions.VMwareMultipleObjectsError(' '.join([
            'Multiple virtual machines were found with the'
            'same name, please specify a container.']))
    return vm_formatted[0]