docs: def invoke_task(self, method, **kwargs):
          """Execute a \*_Task method and wait for it to complete.
          
          :param method: The \*_Task method to invoke.
          :type method: str
          :param kwargs: The arguments to pass to the method.
          :type kwargs: TODO
  
          """
          # Don't execute methods which don't return a Task object
          if not method.endswith('_Task'):
              logger.error('invoke_task can only be used for methods which '
                    'return a ManagedObjectReference to a Task.')
              return None
  
          task_mo_ref = self.invoke(method=method, **kwargs)
          task = Task(task_mo_ref, self)
          task.update_view_data(properties=['info'])
          # TODO: This returns true when there is an error
          while True:
              if task.info.state == 'success':
                  return task
              elif task.info.state == 'error':
                  # TODO: Handle error checking properly
                  raise TaskFailedError(task.info.error.localizedMessage)
  
              # TODO: Implement progresscallbackfunc
              # Sleep two seconds and then refresh the data from the server
              time.sleep(2)
              task.update_view_data(properties=['info'])