def create(vm_info):
    '''
    Creates a virtual machine from the given VM information

    This is what is used to request a virtual machine to be created by the
    cloud provider, wait for it to become available, and then (optionally) log
    in and install Salt on it.

    Events fired:

    This function fires the event ``salt/cloud/vm_name/creating``, with the
    payload containing the names of the VM, profile, and provider.

    @param vm_info

    .. code-block:: text

        {
            name: <str>
            profile: <dict>
            driver: <provider>:<profile>
            clonefrom: <vm_name>
            clonemode: <mode> (default: state, choices: state, child, all)
        }

    @type vm_info dict
    @return dict of resulting vm. !!!Passwords can and should be included!!!
    '''
    try:
        # Check for required profile parameters before sending any API calls.
        if vm_info['profile'] and config.is_profile_configured(
            __opts__,
                __active_provider_name__ or 'virtualbox',
            vm_info['profile']
        ) is False:
            return False
    except AttributeError:
        pass

    vm_name = vm_info["name"]
    deploy = config.get_cloud_config_value(
        'deploy', vm_info, __opts__, search_global=False, default=True
    )
    wait_for_ip_timeout = config.get_cloud_config_value(
        'wait_for_ip_timeout', vm_info, __opts__, default=60
    )
    boot_timeout = config.get_cloud_config_value(
        'boot_timeout', vm_info, __opts__, default=60 * 1000
    )
    power = config.get_cloud_config_value(
        'power_on', vm_info, __opts__, default=False
    )
    key_filename = config.get_cloud_config_value(
        'private_key', vm_info, __opts__, search_global=False, default=None
    )
    clone_mode = map_clonemode(vm_info)
    wait_for_pattern = vm_info['waitforpattern'] if 'waitforpattern' in vm_info.keys() else None
    interface_index = vm_info['interfaceindex'] if 'interfaceindex' in vm_info.keys() else 0

    log.debug("Going to fire event: starting create")
    __utils__['cloud.fire_event'](
        'event',
        'starting create',
        'salt/cloud/{0}/creating'.format(vm_info['name']),
        args=__utils__['cloud.filter_event']('creating', vm_info, ['name', 'profile', 'provider', 'driver']),
        sock_dir=__opts__['sock_dir'],
        transport=__opts__['transport']
    )

    # to create the virtual machine.
    request_kwargs = {
        'name': vm_info['name'],
        'clone_from': vm_info['clonefrom'],
        'clone_mode': clone_mode
    }

    __utils__['cloud.fire_event'](
        'event',
        'requesting instance',
        'salt/cloud/{0}/requesting'.format(vm_info['name']),
        args=__utils__['cloud.filter_event']('requesting', request_kwargs, list(request_kwargs)),
        sock_dir=__opts__['sock_dir'],
        transport=__opts__['transport']
    )
    vm_result = vb_clone_vm(**request_kwargs)

    # Booting and deploying if needed
    if power:
        vb_start_vm(vm_name, timeout=boot_timeout)
        ips = vb_wait_for_network_address(wait_for_ip_timeout, machine_name=vm_name, wait_for_pattern=wait_for_pattern)

        if ips:
            ip = ips[interface_index]
            log.info("[ %s ] IPv4 is: %s", vm_name, ip)
            # ssh or smb using ip and install salt only if deploy is True
            if deploy:
                vm_info['key_filename'] = key_filename
                vm_info['ssh_host'] = ip

                res = __utils__['cloud.bootstrap'](vm_info, __opts__)
                vm_result.update(res)

    __utils__['cloud.fire_event'](
        'event',
        'created machine',
        'salt/cloud/{0}/created'.format(vm_info['name']),
        args=__utils__['cloud.filter_event']('created', vm_result, list(vm_result)),
        sock_dir=__opts__['sock_dir'],
        transport=__opts__['transport']
    )

    # Passwords should be included in this object!!
    return vm_result
def create ( vm_info ) : try : if vm_info [ 'profile' ] and config . is_profile_configured ( __opts__ , __active_provider_name__ or 'virtualbox' , vm_info [ 'profile' ] ) is False : return False except AttributeError : pass vm_name = vm_info [ "name" ] deploy = config . get_cloud_config_value ( 'deploy' , vm_info , __opts__ , search_global = False , default = True ) wait_for_ip_timeout = config . get_cloud_config_value ( 'wait_for_ip_timeout' , vm_info , __opts__ , default = 60 ) boot_timeout = config . get_cloud_config_value ( 'boot_timeout' , vm_info , __opts__ , default = 60 * 1000 ) power = config . get_cloud_config_value ( 'power_on' , vm_info , __opts__ , default = False ) key_filename = config . get_cloud_config_value ( 'private_key' , vm_info , __opts__ , search_global = False , default = None ) clone_mode = map_clonemode ( vm_info ) wait_for_pattern = vm_info [ 'waitforpattern' ] if 'waitforpattern' in vm_info . keys ( ) else None interface_index = vm_info [ 'interfaceindex' ] if 'interfaceindex' in vm_info . keys ( ) else 0 log . debug ( "Going to fire event: starting create" ) __utils__ [ 'cloud.fire_event' ] ( 'event' , 'starting create' , 'salt/cloud/{0}/creating' . format ( vm_info [ 'name' ] ) , args = __utils__ [ 'cloud.filter_event' ] ( 'creating' , vm_info , [ 'name' , 'profile' , 'provider' , 'driver' ] ) , sock_dir = __opts__ [ 'sock_dir' ] , transport = __opts__ [ 'transport' ] ) request_kwargs = { 'name' : vm_info [ 'name' ] , 'clone_from' : vm_info [ 'clonefrom' ] , 'clone_mode' : clone_mode } __utils__ [ 'cloud.fire_event' ] ( 'event' , 'requesting instance' , 'salt/cloud/{0}/requesting' . format ( vm_info [ 'name' ] ) , args = __utils__ [ 'cloud.filter_event' ] ( 'requesting' , request_kwargs , list ( request_kwargs ) ) , sock_dir = __opts__ [ 'sock_dir' ] , transport = __opts__ [ 'transport' ] ) vm_result = vb_clone_vm ( ** request_kwargs ) if power : vb_start_vm ( vm_name , timeout = boot_timeout ) ips = vb_wait_for_network_address ( wait_for_ip_timeout , machine_name = vm_name , wait_for_pattern = wait_for_pattern ) if ips : ip = ips [ interface_index ] log . info ( "[ %s ] IPv4 is: %s" , vm_name , ip ) if deploy : vm_info [ 'key_filename' ] = key_filename vm_info [ 'ssh_host' ] = ip res = __utils__ [ 'cloud.bootstrap' ] ( vm_info , __opts__ ) vm_result . update ( res ) __utils__ [ 'cloud.fire_event' ] ( 'event' , 'created machine' , 'salt/cloud/{0}/created' . format ( vm_info [ 'name' ] ) , args = __utils__ [ 'cloud.filter_event' ] ( 'created' , vm_result , list ( vm_result ) ) , sock_dir = __opts__ [ 'sock_dir' ] , transport = __opts__ [ 'transport' ] ) return vm_result
Creates a virtual machine from the given VM information

    This is what is used to request a virtual machine to be created by the
    cloud provider, wait for it to become available, and then (optionally) log
    in and install Salt on it.

    Events fired:

    This function fires the event ``salt/cloud/vm_name/creating``, with the
    payload containing the names of the VM, profile, and provider.

    @param vm_info

    .. code-block:: text

        {
            name: <str>
            profile: <dict>
            driver: <provider>:<profile>
            clonefrom: <vm_name>
            clonemode: <mode> (default: state, choices: state, child, all)
        }

    @type vm_info dict
    @return dict of resulting vm. !!!Passwords can and should be included!!!