:py:mod:`airflow.providers.amazon.aws.sensors.sagemaker`
========================================================

.. py:module:: airflow.providers.amazon.aws.sensors.sagemaker


Module Contents
---------------

Classes
~~~~~~~

.. autoapisummary::

   airflow.providers.amazon.aws.sensors.sagemaker.SageMakerBaseSensor
   airflow.providers.amazon.aws.sensors.sagemaker.SageMakerEndpointSensor
   airflow.providers.amazon.aws.sensors.sagemaker.SageMakerTransformSensor
   airflow.providers.amazon.aws.sensors.sagemaker.SageMakerTuningSensor
   airflow.providers.amazon.aws.sensors.sagemaker.SageMakerTrainingSensor




.. py:class:: SageMakerBaseSensor(*, aws_conn_id = 'aws_default', **kwargs)

   Bases: :py:obj:`airflow.sensors.base.BaseSensorOperator`

   Contains general sensor behavior for SageMaker.

   Subclasses should implement get_sagemaker_response() and state_from_response() methods.
   Subclasses should also implement NON_TERMINAL_STATES and FAILED_STATE methods.

   .. py:attribute:: ui_color
      :annotation: = #ededed

      

   .. py:method:: get_hook()

      Get SageMakerHook.


   .. py:method:: poke(context)

      Function that the sensors defined while deriving this class should
      override.


   .. py:method:: non_terminal_states()
      :abstractmethod:

      Placeholder for returning states with should not terminate.


   .. py:method:: failed_states()
      :abstractmethod:

      Placeholder for returning states with are considered failed.


   .. py:method:: get_sagemaker_response()
      :abstractmethod:

      Placeholder for checking status of a SageMaker task.


   .. py:method:: get_failed_reason_from_response(response)

      Placeholder for extracting the reason for failure from an AWS response.


   .. py:method:: state_from_response(response)
      :abstractmethod:

      Placeholder for extracting the state from an AWS response.



.. py:class:: SageMakerEndpointSensor(*, endpoint_name, **kwargs)

   Bases: :py:obj:`SageMakerBaseSensor`

   Polls the endpoint state until it reaches a terminal state.  Raises an
   AirflowException with the failure reason if a failed state is reached.

   .. seealso::
       For more information on how to use this sensor, take a look at the guide:
       :ref:`howto/sensor:SageMakerEndpointSensor`

   :param endpoint_name: Name of the endpoint instance to watch.

   .. py:attribute:: template_fields
      :annotation: :Sequence[str] = ['endpoint_name']

      

   .. py:attribute:: template_ext
      :annotation: :Sequence[str] = []

      

   .. py:method:: non_terminal_states()

      Placeholder for returning states with should not terminate.


   .. py:method:: failed_states()

      Placeholder for returning states with are considered failed.


   .. py:method:: get_sagemaker_response()

      Placeholder for checking status of a SageMaker task.


   .. py:method:: get_failed_reason_from_response(response)

      Placeholder for extracting the reason for failure from an AWS response.


   .. py:method:: state_from_response(response)

      Placeholder for extracting the state from an AWS response.



.. py:class:: SageMakerTransformSensor(*, job_name, **kwargs)

   Bases: :py:obj:`SageMakerBaseSensor`

   Polls the transform job until it reaches a terminal state.  Raises an
   AirflowException with the failure reason if a failed state is reached.

   .. seealso::
       For more information on how to use this sensor, take a look at the guide:
       :ref:`howto/sensor:SageMakerTransformSensor`

   :param job_name: Name of the transform job to watch.

   .. py:attribute:: template_fields
      :annotation: :Sequence[str] = ['job_name']

      

   .. py:attribute:: template_ext
      :annotation: :Sequence[str] = []

      

   .. py:method:: non_terminal_states()

      Placeholder for returning states with should not terminate.


   .. py:method:: failed_states()

      Placeholder for returning states with are considered failed.


   .. py:method:: get_sagemaker_response()

      Placeholder for checking status of a SageMaker task.


   .. py:method:: get_failed_reason_from_response(response)

      Placeholder for extracting the reason for failure from an AWS response.


   .. py:method:: state_from_response(response)

      Placeholder for extracting the state from an AWS response.



.. py:class:: SageMakerTuningSensor(*, job_name, **kwargs)

   Bases: :py:obj:`SageMakerBaseSensor`

   Asks for the state of the tuning state until it reaches a terminal state.
   Raises an AirflowException with the failure reason if a failed state is reached.

   .. seealso::
       For more information on how to use this sensor, take a look at the guide:
       :ref:`howto/sensor:SageMakerTuningSensor`

   :param job_name: Name of the tuning instance to watch.

   .. py:attribute:: template_fields
      :annotation: :Sequence[str] = ['job_name']

      

   .. py:attribute:: template_ext
      :annotation: :Sequence[str] = []

      

   .. py:method:: non_terminal_states()

      Placeholder for returning states with should not terminate.


   .. py:method:: failed_states()

      Placeholder for returning states with are considered failed.


   .. py:method:: get_sagemaker_response()

      Placeholder for checking status of a SageMaker task.


   .. py:method:: get_failed_reason_from_response(response)

      Placeholder for extracting the reason for failure from an AWS response.


   .. py:method:: state_from_response(response)

      Placeholder for extracting the state from an AWS response.



.. py:class:: SageMakerTrainingSensor(*, job_name, print_log=True, **kwargs)

   Bases: :py:obj:`SageMakerBaseSensor`

   Polls the training job until it reaches a terminal state.  Raises an
   AirflowException with the failure reason if a failed state is reached.

   .. seealso::
       For more information on how to use this sensor, take a look at the guide:
       :ref:`howto/sensor:SageMakerTrainingSensor`

   :param job_name: Name of the training job to watch.
   :param print_log: Prints the cloudwatch log if True; Defaults to True.

   .. py:attribute:: template_fields
      :annotation: :Sequence[str] = ['job_name']

      

   .. py:attribute:: template_ext
      :annotation: :Sequence[str] = []

      

   .. py:method:: init_log_resource(hook)

      Set tailing LogState for associated training job.


   .. py:method:: non_terminal_states()

      Placeholder for returning states with should not terminate.


   .. py:method:: failed_states()

      Placeholder for returning states with are considered failed.


   .. py:method:: get_sagemaker_response()

      Placeholder for checking status of a SageMaker task.


   .. py:method:: get_failed_reason_from_response(response)

      Placeholder for extracting the reason for failure from an AWS response.


   .. py:method:: state_from_response(response)

      Placeholder for extracting the state from an AWS response.



