class_docstr: Interact with Amazon AppFlow.
  
  Provide thin wrapper around :external+boto3:py:class:`boto3.client("appflow") <Appflow.Client>`.
  
  Additional arguments (such as ``aws_conn_id``) may be specified and
  are passed down to the underlying AwsBaseHook.
  
  .. seealso::
      - :class:`airflow.providers.amazon.aws.hooks.base_aws.AwsBaseHook`
      - `Amazon Appflow API Reference <https://docs.aws.amazon.com/appflow/1.0/APIReference/Welcome.html>`__
docstr: Execute an AppFlow run.
  
  :param flow_name: The flow name
  :param poll_interval: Time (seconds) to wait between two consecutive calls to check the run status
  :param wait_for_completion: whether to wait for the run to end to return
  :param max_attempts: the number of polls to do before timing out/returning a failure.
  :return: The run execution ID
code: def run_flow(
      self,
      flow_name: str,
      poll_interval: int = 20,
      wait_for_completion: bool = True,
      max_attempts: int = 60,
  ) -> str:
      """
      Execute an AppFlow run.
  
      :param flow_name: The flow name
      :param poll_interval: Time (seconds) to wait between two consecutive calls to check the run status
      :param wait_for_completion: whether to wait for the run to end to return
      :param max_attempts: the number of polls to do before timing out/returning a failure.
      :return: The run execution ID
      """
      response_start = self.conn.start_flow(flowName=flow_name)
      execution_id = response_start["executionId"]
      self.log.info("executionId: %s", execution_id)
  
      if wait_for_completion:
          wait(
              waiter=self.get_waiter(
                  "run_complete", {"EXECUTION_ID": execution_id}
              ),
              waiter_delay=poll_interval,
              waiter_max_attempts=max_attempts,
              args={"flowName": flow_name},
              failure_message="error while waiting for flow to complete",
              status_message="waiting for flow completion, status",
              status_args=[
                  f"flowExecutions[?executionId=='{execution_id}'].executionStatus",
                  f"flowExecutions[?executionId=='{execution_id}'].executionResult.errorInfo",
              ],
          )
          self._log_execution_description(flow_name, execution_id)
  
      return execution_id
  
file_path: airflow/airflow/providers/amazon/aws/hooks/appflow.py
imports: from __future__ import annotations
  from typing import TYPE_CHECKING
  from airflow.providers.amazon.aws.hooks.base_aws import AwsGenericHook
  from airflow.providers.amazon.aws.utils.waiter_with_logging import wait
label_desc: Use image node_id 2 for calling the AppflowHook obj's underlying member method code with example usage: obj.run_flow(flow_name, poll_interval, wait_for_completion, max_attempts) and returns: execution_id