docs: def create(vm_):
      '''
      Create a single VM from a data dict
      '''
      try:
          # Check for required profile parameters before sending any API calls.
          if vm_['profile'] and config.is_profile_configured(__opts__,
                                                             __active_provider_name__ or 'gogrid',
                                                             vm_['profile'],
                                                             vm_=vm_) is False:
              return False
      except AttributeError:
          pass
  
      __utils__['cloud.fire_event'](
          'event',
          'starting create',
          'salt/cloud/{0}/creating'.format(vm_['name']),
          args=__utils__['cloud.filter_event']('creating', vm_, ['name', 'profile', 'provider', 'driver']),
          sock_dir=__opts__['sock_dir'],
          transport=__opts__['transport']
      )
  
      if len(vm_['name']) > 20:
          raise SaltCloudException('VM names must not be longer than 20 characters')
  
      log.info('Creating Cloud VM %s', vm_['name'])
      image_id = avail_images()[vm_['image']]['id']
      if 'assign_public_ip' in vm_:
          host_ip = vm_['assign_public_ip']
      else:
          public_ips = list_public_ips()
          if not public_ips:
              raise SaltCloudException('No more IPs available')
          host_ip = next(iter(public_ips))
  
      create_kwargs = {
          'name': vm_['name'],
          'image': image_id,
          'ram': vm_['size'],
          'ip': host_ip,
      }
  
      __utils__['cloud.fire_event'](
          'event',
          'requesting instance',
          'salt/cloud/{0}/requesting'.format(vm_['name']),
          args={
              'kwargs': __utils__['cloud.filter_event']('requesting', create_kwargs, list(create_kwargs)),
          },
          sock_dir=__opts__['sock_dir'],
          transport=__opts__['transport']
      )
  
      try:
          data = _query('grid', 'server/add', args=create_kwargs)
      except Exception:
          log.error(
              'Error creating %s on GOGRID\n\n'
              'The following exception was thrown when trying to '
              'run the initial deployment:\n', vm_['name'],
              # Show the traceback if the debug logging level is enabled
              exc_info_on_loglevel=logging.DEBUG
          )
          return False
  
      ssh_username = config.get_cloud_config_value(
          'ssh_username', vm_, __opts__, default='root'
      )
  
      def wait_for_apipass():
          '''
          Wait for the password to become available, via the API
          '''
          try:
              passwords = list_passwords()
              return passwords[vm_['name']][0]['password']
          except KeyError:
              pass
          time.sleep(5)
          return False
  
      vm_['password'] = salt.utils.cloud.wait_for_fun(
          wait_for_apipass,
          timeout=config.get_cloud_config_value(
              'wait_for_fun_timeout', vm_, __opts__, default=15 * 60),
      )
  
      vm_['ssh_host'] = host_ip
      ret = __utils__['cloud.bootstrap'](vm_, __opts__)
      ret.update(data)
  
      log.info('Created Cloud VM \'%s\'', vm_['name'])
      log.debug(
          '\'%s\' VM creation details:\n%s',
          vm_['name'], pprint.pformat(data)
      )
  
      __utils__['cloud.fire_event'](
          'event',
          'created instance',
          'salt/cloud/{0}/created'.format(vm_['name']),
          args=__utils__['cloud.filter_event']('created', vm_, ['name', 'profile', 'provider', 'driver']),
          sock_dir=__opts__['sock_dir'],
          transport=__opts__['transport']
      )
  
      return ret