docs: def wait_for_task(task, instance_name, task_type, sleep_seconds=1, log_level='debug'):
      '''
      Waits for a task to be completed.
  
      task
          The task to wait for.
  
      instance_name
          The name of the ESXi host, vCenter Server, or Virtual Machine that
          the task is being run on.
  
      task_type
          The type of task being performed. Useful information for debugging purposes.
  
      sleep_seconds
          The number of seconds to wait before querying the task again.
          Defaults to ``1`` second.
  
      log_level
          The level at which to log task information. Default is ``debug``,
          but ``info`` is also supported.
      '''
      time_counter = 0
      start_time = time.time()
      log.trace('task = %s, task_type = %s', task, task.__class__.__name__)
      try:
          task_info = task.info
      except vim.fault.NoPermission as exc:
          log.exception(exc)
          raise salt.exceptions.VMwareApiError(
              'Not enough permissions. Required privilege: '
              '{}'.format(exc.privilegeId))
      except vim.fault.FileNotFound as exc:
          log.exception(exc)
          raise salt.exceptions.VMwareFileNotFoundError(exc.msg)
      except vim.fault.VimFault as exc:
          log.exception(exc)
          raise salt.exceptions.VMwareApiError(exc.msg)
      except vmodl.RuntimeFault as exc:
          log.exception(exc)
          raise salt.exceptions.VMwareRuntimeError(exc.msg)
      while task_info.state == 'running' or task_info.state == 'queued':
          if time_counter % sleep_seconds == 0:
              msg = '[ {0} ] Waiting for {1} task to finish [{2} s]'.format(
                  instance_name, task_type, time_counter)
              if log_level == 'info':
                  log.info(msg)
              else:
                  log.debug(msg)
          time.sleep(1.0 - ((time.time() - start_time) % 1.0))
          time_counter += 1
          try:
              task_info = task.info
          except vim.fault.NoPermission as exc:
              log.exception(exc)
              raise salt.exceptions.VMwareApiError(
                  'Not enough permissions. Required privilege: '
                  '{}'.format(exc.privilegeId))
          except vim.fault.FileNotFound as exc:
              log.exception(exc)
              raise salt.exceptions.VMwareFileNotFoundError(exc.msg)
          except vim.fault.VimFault as exc:
              log.exception(exc)
              raise salt.exceptions.VMwareApiError(exc.msg)
          except vmodl.RuntimeFault as exc:
              log.exception(exc)
              raise salt.exceptions.VMwareRuntimeError(exc.msg)
      if task_info.state == 'success':
          msg = '[ {0} ] Successfully completed {1} task in {2} seconds'.format(
              instance_name, task_type, time_counter)
          if log_level == 'info':
              log.info(msg)
          else:
              log.debug(msg)
          # task is in a successful state
          return task_info.result
      else:
          # task is in an error state
          try:
              raise task_info.error
          except vim.fault.NoPermission as exc:
              log.exception(exc)
              raise salt.exceptions.VMwareApiError(
                  'Not enough permissions. Required privilege: '
                  '{}'.format(exc.privilegeId))
          except vim.fault.FileNotFound as exc:
              log.exception(exc)
              raise salt.exceptions.VMwareFileNotFoundError(exc.msg)
          except vim.fault.VimFault as exc:
              log.exception(exc)
              raise salt.exceptions.VMwareApiError(exc.msg)
          except vmodl.fault.SystemError as exc:
              log.exception(exc)
              raise salt.exceptions.VMwareSystemError(exc.msg)
          except vmodl.fault.InvalidArgument as exc:
              log.exception(exc)
              exc_message = exc.msg
              if exc.faultMessage:
                  exc_message = '{0} ({1})'.format(exc_message,
                                                   exc.faultMessage[0].message)
              raise salt.exceptions.VMwareApiError(exc_message)