:py:mod:`airflow.providers.google.cloud.operators.automl`
=========================================================

.. py:module:: airflow.providers.google.cloud.operators.automl

.. autoapi-nested-parse::

   This module contains Google AutoML operators.



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

Classes
~~~~~~~

.. autoapisummary::

   airflow.providers.google.cloud.operators.automl.AutoMLTrainModelOperator
   airflow.providers.google.cloud.operators.automl.AutoMLPredictOperator
   airflow.providers.google.cloud.operators.automl.AutoMLBatchPredictOperator
   airflow.providers.google.cloud.operators.automl.AutoMLCreateDatasetOperator
   airflow.providers.google.cloud.operators.automl.AutoMLImportDataOperator
   airflow.providers.google.cloud.operators.automl.AutoMLTablesListColumnSpecsOperator
   airflow.providers.google.cloud.operators.automl.AutoMLTablesUpdateDatasetOperator
   airflow.providers.google.cloud.operators.automl.AutoMLGetModelOperator
   airflow.providers.google.cloud.operators.automl.AutoMLDeleteModelOperator
   airflow.providers.google.cloud.operators.automl.AutoMLDeployModelOperator
   airflow.providers.google.cloud.operators.automl.AutoMLTablesListTableSpecsOperator
   airflow.providers.google.cloud.operators.automl.AutoMLListDatasetOperator
   airflow.providers.google.cloud.operators.automl.AutoMLDeleteDatasetOperator




Attributes
~~~~~~~~~~

.. autoapisummary::

   airflow.providers.google.cloud.operators.automl.MetaData


.. py:data:: MetaData
   

   

.. py:class:: AutoMLTrainModelOperator(*, model, location, project_id = None, metadata = (), timeout = None, retry = DEFAULT, gcp_conn_id = 'google_cloud_default', impersonation_chain = None, **kwargs)

   Bases: :py:obj:`airflow.models.BaseOperator`

   Creates Google Cloud AutoML model.

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

   :param model: Model definition.
   :param project_id: ID of the Google Cloud project where model will be created if None then
       default project_id is used.
   :param location: The location of the project.
   :param retry: A retry object used to retry requests. If `None` is specified, requests will not be
       retried.
   :param timeout: The amount of time, in seconds, to wait for the request to complete. Note that if
       `retry` is specified, the timeout applies to each individual attempt.
   :param metadata: Additional metadata that is provided to the method.
   :param gcp_conn_id: The connection ID to use to connect to Google Cloud.
   :param impersonation_chain: Optional service account to impersonate using short-term
       credentials, or chained list of accounts required to get the access_token
       of the last account in the list, which will be impersonated in the request.
       If set as a string, the account must grant the originating account
       the Service Account Token Creator IAM role.
       If set as a sequence, the identities from the list must grant
       Service Account Token Creator IAM role to the directly preceding identity, with first
       account from the list granting this role to the originating account (templated).

   .. py:attribute:: template_fields
      :annotation: :Sequence[str] = ['model', 'location', 'project_id', 'impersonation_chain']

      

   .. py:method:: execute(self, context)

      This is the main method to derive when creating an operator.
      Context is the same dictionary used as when rendering jinja templates.

      Refer to get_template_context for more context.



.. py:class:: AutoMLPredictOperator(*, model_id, location, payload, operation_params = None, project_id = None, metadata = (), timeout = None, retry = DEFAULT, gcp_conn_id = 'google_cloud_default', impersonation_chain = None, **kwargs)

   Bases: :py:obj:`airflow.models.BaseOperator`

   Runs prediction operation on Google Cloud AutoML.

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

   :param model_id: Name of the model requested to serve the batch prediction.
   :param payload: Name od the model used for the prediction.
   :param project_id: ID of the Google Cloud project where model is located if None then
       default project_id is used.
   :param location: The location of the project.
   :param operation_params: Additional domain-specific parameters for the predictions.
   :param retry: A retry object used to retry requests. If `None` is specified, requests will not be
       retried.
   :param timeout: The amount of time, in seconds, to wait for the request to complete. Note that if
       `retry` is specified, the timeout applies to each individual attempt.
   :param metadata: Additional metadata that is provided to the method.
   :param gcp_conn_id: The connection ID to use to connect to Google Cloud.
   :param impersonation_chain: Optional service account to impersonate using short-term
       credentials, or chained list of accounts required to get the access_token
       of the last account in the list, which will be impersonated in the request.
       If set as a string, the account must grant the originating account
       the Service Account Token Creator IAM role.
       If set as a sequence, the identities from the list must grant
       Service Account Token Creator IAM role to the directly preceding identity, with first
       account from the list granting this role to the originating account (templated).

   .. py:attribute:: template_fields
      :annotation: :Sequence[str] = ['model_id', 'location', 'project_id', 'impersonation_chain']

      

   .. py:method:: execute(self, context)

      This is the main method to derive when creating an operator.
      Context is the same dictionary used as when rendering jinja templates.

      Refer to get_template_context for more context.



.. py:class:: AutoMLBatchPredictOperator(*, model_id, input_config, output_config, location, project_id = None, prediction_params = None, metadata = (), timeout = None, retry = DEFAULT, gcp_conn_id = 'google_cloud_default', impersonation_chain = None, **kwargs)

   Bases: :py:obj:`airflow.models.BaseOperator`

   Perform a batch prediction on Google Cloud AutoML.

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

   :param project_id: ID of the Google Cloud project where model will be created if None then
       default project_id is used.
   :param location: The location of the project.
   :param model_id: Name of the model_id requested to serve the batch prediction.
   :param input_config: Required. The input configuration for batch prediction.
       If a dict is provided, it must be of the same form as the protobuf message
       `google.cloud.automl_v1beta1.types.BatchPredictInputConfig`
   :param output_config: Required. The Configuration specifying where output predictions should be
       written. If a dict is provided, it must be of the same form as the protobuf message
       `google.cloud.automl_v1beta1.types.BatchPredictOutputConfig`
   :param prediction_params: Additional domain-specific parameters for the predictions,
       any string must be up to 25000 characters long.
   :param project_id: ID of the Google Cloud project where model is located if None then
       default project_id is used.
   :param location: The location of the project.
   :param retry: A retry object used to retry requests. If `None` is specified, requests will not be
       retried.
   :param timeout: The amount of time, in seconds, to wait for the request to complete. Note that if
       `retry` is specified, the timeout applies to each individual attempt.
   :param metadata: Additional metadata that is provided to the method.
   :param gcp_conn_id: The connection ID to use to connect to Google Cloud.
   :param impersonation_chain: Optional service account to impersonate using short-term
       credentials, or chained list of accounts required to get the access_token
       of the last account in the list, which will be impersonated in the request.
       If set as a string, the account must grant the originating account
       the Service Account Token Creator IAM role.
       If set as a sequence, the identities from the list must grant
       Service Account Token Creator IAM role to the directly preceding identity, with first
       account from the list granting this role to the originating account (templated).

   .. py:attribute:: template_fields
      :annotation: :Sequence[str] = ['model_id', 'input_config', 'output_config', 'location', 'project_id', 'impersonation_chain']

      

   .. py:method:: execute(self, context)

      This is the main method to derive when creating an operator.
      Context is the same dictionary used as when rendering jinja templates.

      Refer to get_template_context for more context.



.. py:class:: AutoMLCreateDatasetOperator(*, dataset, location, project_id = None, metadata = (), timeout = None, retry = DEFAULT, gcp_conn_id = 'google_cloud_default', impersonation_chain = None, **kwargs)

   Bases: :py:obj:`airflow.models.BaseOperator`

   Creates a Google Cloud AutoML dataset.

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

   :param dataset: The dataset to create. If a dict is provided, it must be of the
       same form as the protobuf message Dataset.
   :param project_id: ID of the Google Cloud project where dataset is located if None then
       default project_id is used.
   :param location: The location of the project.
   :param params: Additional domain-specific parameters for the predictions.
   :param retry: A retry object used to retry requests. If `None` is specified, requests will not be
       retried.
   :param timeout: The amount of time, in seconds, to wait for the request to complete. Note that if
       `retry` is specified, the timeout applies to each individual attempt.
   :param metadata: Additional metadata that is provided to the method.
   :param gcp_conn_id: The connection ID to use to connect to Google Cloud.
   :param impersonation_chain: Optional service account to impersonate using short-term
       credentials, or chained list of accounts required to get the access_token
       of the last account in the list, which will be impersonated in the request.
       If set as a string, the account must grant the originating account
       the Service Account Token Creator IAM role.
       If set as a sequence, the identities from the list must grant
       Service Account Token Creator IAM role to the directly preceding identity, with first
       account from the list granting this role to the originating account (templated).

   .. py:attribute:: template_fields
      :annotation: :Sequence[str] = ['dataset', 'location', 'project_id', 'impersonation_chain']

      

   .. py:method:: execute(self, context)

      This is the main method to derive when creating an operator.
      Context is the same dictionary used as when rendering jinja templates.

      Refer to get_template_context for more context.



.. py:class:: AutoMLImportDataOperator(*, dataset_id, location, input_config, project_id = None, metadata = (), timeout = None, retry = DEFAULT, gcp_conn_id = 'google_cloud_default', impersonation_chain = None, **kwargs)

   Bases: :py:obj:`airflow.models.BaseOperator`

   Imports data to a Google Cloud AutoML dataset.

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

   :param dataset_id: ID of dataset to be updated.
   :param input_config: The desired input location and its domain specific semantics, if any.
       If a dict is provided, it must be of the same form as the protobuf message InputConfig.
   :param project_id: ID of the Google Cloud project where dataset is located if None then
       default project_id is used.
   :param location: The location of the project.
   :param params: Additional domain-specific parameters for the predictions.
   :param retry: A retry object used to retry requests. If `None` is specified, requests will not be
       retried.
   :param timeout: The amount of time, in seconds, to wait for the request to complete. Note that if
       `retry` is specified, the timeout applies to each individual attempt.
   :param metadata: Additional metadata that is provided to the method.
   :param gcp_conn_id: The connection ID to use to connect to Google Cloud.
   :param impersonation_chain: Optional service account to impersonate using short-term
       credentials, or chained list of accounts required to get the access_token
       of the last account in the list, which will be impersonated in the request.
       If set as a string, the account must grant the originating account
       the Service Account Token Creator IAM role.
       If set as a sequence, the identities from the list must grant
       Service Account Token Creator IAM role to the directly preceding identity, with first
       account from the list granting this role to the originating account (templated).

   .. py:attribute:: template_fields
      :annotation: :Sequence[str] = ['dataset_id', 'input_config', 'location', 'project_id', 'impersonation_chain']

      

   .. py:method:: execute(self, context)

      This is the main method to derive when creating an operator.
      Context is the same dictionary used as when rendering jinja templates.

      Refer to get_template_context for more context.



.. py:class:: AutoMLTablesListColumnSpecsOperator(*, dataset_id, table_spec_id, location, field_mask = None, filter_ = None, page_size = None, project_id = None, metadata = (), timeout = None, retry = DEFAULT, gcp_conn_id = 'google_cloud_default', impersonation_chain = None, **kwargs)

   Bases: :py:obj:`airflow.models.BaseOperator`

   Lists column specs in a table.

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

   :param dataset_id: Name of the dataset.
   :param table_spec_id: table_spec_id for path builder.
   :param field_mask: Mask specifying which fields to read. If a dict is provided, it must be of the same
       form as the protobuf message `google.cloud.automl_v1beta1.types.FieldMask`
   :param filter_: Filter expression, see go/filtering.
   :param page_size: The maximum number of resources contained in the
       underlying API response. If page streaming is performed per
       resource, this parameter does not affect the return value. If page
       streaming is performed per page, this determines the maximum number
       of resources in a page.
   :param project_id: ID of the Google Cloud project where dataset is located if None then
       default project_id is used.
   :param location: The location of the project.
   :param retry: A retry object used to retry requests. If `None` is specified, requests will not be
       retried.
   :param timeout: The amount of time, in seconds, to wait for the request to complete. Note that if
       `retry` is specified, the timeout applies to each individual attempt.
   :param metadata: Additional metadata that is provided to the method.
   :param gcp_conn_id: The connection ID to use to connect to Google Cloud.
   :param impersonation_chain: Optional service account to impersonate using short-term
       credentials, or chained list of accounts required to get the access_token
       of the last account in the list, which will be impersonated in the request.
       If set as a string, the account must grant the originating account
       the Service Account Token Creator IAM role.
       If set as a sequence, the identities from the list must grant
       Service Account Token Creator IAM role to the directly preceding identity, with first
       account from the list granting this role to the originating account (templated).

   .. py:attribute:: template_fields
      :annotation: :Sequence[str] = ['dataset_id', 'table_spec_id', 'field_mask', 'filter_', 'location', 'project_id', 'impersonation_chain']

      

   .. py:method:: execute(self, context)

      This is the main method to derive when creating an operator.
      Context is the same dictionary used as when rendering jinja templates.

      Refer to get_template_context for more context.



.. py:class:: AutoMLTablesUpdateDatasetOperator(*, dataset, location, update_mask = None, metadata = (), timeout = None, retry = DEFAULT, gcp_conn_id = 'google_cloud_default', impersonation_chain = None, **kwargs)

   Bases: :py:obj:`airflow.models.BaseOperator`

   Updates a dataset.

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

   :param dataset: The dataset which replaces the resource on the server.
       If a dict is provided, it must be of the same form as the protobuf message Dataset.
   :param update_mask: The update mask applies to the resource.  If a dict is provided, it must
       be of the same form as the protobuf message FieldMask.
   :param location: The location of the project.
   :param params: Additional domain-specific parameters for the predictions.
   :param retry: A retry object used to retry requests. If `None` is specified, requests will not be
       retried.
   :param timeout: The amount of time, in seconds, to wait for the request to complete. Note that if
       `retry` is specified, the timeout applies to each individual attempt.
   :param metadata: Additional metadata that is provided to the method.
   :param gcp_conn_id: The connection ID to use to connect to Google Cloud.
   :param impersonation_chain: Optional service account to impersonate using short-term
       credentials, or chained list of accounts required to get the access_token
       of the last account in the list, which will be impersonated in the request.
       If set as a string, the account must grant the originating account
       the Service Account Token Creator IAM role.
       If set as a sequence, the identities from the list must grant
       Service Account Token Creator IAM role to the directly preceding identity, with first
       account from the list granting this role to the originating account (templated).

   .. py:attribute:: template_fields
      :annotation: :Sequence[str] = ['dataset', 'update_mask', 'location', 'impersonation_chain']

      

   .. py:method:: execute(self, context)

      This is the main method to derive when creating an operator.
      Context is the same dictionary used as when rendering jinja templates.

      Refer to get_template_context for more context.



.. py:class:: AutoMLGetModelOperator(*, model_id, location, project_id = None, metadata = (), timeout = None, retry = DEFAULT, gcp_conn_id = 'google_cloud_default', impersonation_chain = None, **kwargs)

   Bases: :py:obj:`airflow.models.BaseOperator`

   Get Google Cloud AutoML model.

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

   :param model_id: Name of the model requested to serve the prediction.
   :param project_id: ID of the Google Cloud project where model is located if None then
       default project_id is used.
   :param location: The location of the project.
   :param params: Additional domain-specific parameters for the predictions.
   :param retry: A retry object used to retry requests. If `None` is specified, requests will not be
       retried.
   :param timeout: The amount of time, in seconds, to wait for the request to complete. Note that if
       `retry` is specified, the timeout applies to each individual attempt.
   :param metadata: Additional metadata that is provided to the method.
   :param gcp_conn_id: The connection ID to use to connect to Google Cloud.
   :param impersonation_chain: Optional service account to impersonate using short-term
       credentials, or chained list of accounts required to get the access_token
       of the last account in the list, which will be impersonated in the request.
       If set as a string, the account must grant the originating account
       the Service Account Token Creator IAM role.
       If set as a sequence, the identities from the list must grant
       Service Account Token Creator IAM role to the directly preceding identity, with first
       account from the list granting this role to the originating account (templated).

   .. py:attribute:: template_fields
      :annotation: :Sequence[str] = ['model_id', 'location', 'project_id', 'impersonation_chain']

      

   .. py:method:: execute(self, context)

      This is the main method to derive when creating an operator.
      Context is the same dictionary used as when rendering jinja templates.

      Refer to get_template_context for more context.



.. py:class:: AutoMLDeleteModelOperator(*, model_id, location, project_id = None, metadata = (), timeout = None, retry = DEFAULT, gcp_conn_id = 'google_cloud_default', impersonation_chain = None, **kwargs)

   Bases: :py:obj:`airflow.models.BaseOperator`

   Delete Google Cloud AutoML model.

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

   :param model_id: Name of the model requested to serve the prediction.
   :param project_id: ID of the Google Cloud project where model is located if None then
       default project_id is used.
   :param location: The location of the project.
   :param params: Additional domain-specific parameters for the predictions.
   :param retry: A retry object used to retry requests. If `None` is specified, requests will not be
       retried.
   :param timeout: The amount of time, in seconds, to wait for the request to complete. Note that if
       `retry` is specified, the timeout applies to each individual attempt.
   :param metadata: Additional metadata that is provided to the method.
   :param gcp_conn_id: The connection ID to use to connect to Google Cloud.
   :param impersonation_chain: Optional service account to impersonate using short-term
       credentials, or chained list of accounts required to get the access_token
       of the last account in the list, which will be impersonated in the request.
       If set as a string, the account must grant the originating account
       the Service Account Token Creator IAM role.
       If set as a sequence, the identities from the list must grant
       Service Account Token Creator IAM role to the directly preceding identity, with first
       account from the list granting this role to the originating account (templated).

   .. py:attribute:: template_fields
      :annotation: :Sequence[str] = ['model_id', 'location', 'project_id', 'impersonation_chain']

      

   .. py:method:: execute(self, context)

      This is the main method to derive when creating an operator.
      Context is the same dictionary used as when rendering jinja templates.

      Refer to get_template_context for more context.



.. py:class:: AutoMLDeployModelOperator(*, model_id, location, project_id = None, image_detection_metadata = None, metadata = (), timeout = None, retry = DEFAULT, gcp_conn_id = 'google_cloud_default', impersonation_chain = None, **kwargs)

   Bases: :py:obj:`airflow.models.BaseOperator`

   Deploys a model. If a model is already deployed, deploying it with the same parameters
   has no effect. Deploying with different parameters (as e.g. changing node_number) will
   reset the deployment state without pausing the model_id’s availability.

   Only applicable for Text Classification, Image Object Detection and Tables; all other
   domains manage deployment automatically.

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

   :param model_id: Name of the model to be deployed.
   :param image_detection_metadata: Model deployment metadata specific to Image Object Detection.
       If a dict is provided, it must be of the same form as the protobuf message
       ImageObjectDetectionModelDeploymentMetadata
   :param project_id: ID of the Google Cloud project where model is located if None then
       default project_id is used.
   :param location: The location of the project.
   :param params: Additional domain-specific parameters for the predictions.
   :param retry: A retry object used to retry requests. If `None` is specified, requests will not be
       retried.
   :param timeout: The amount of time, in seconds, to wait for the request to complete. Note that if
       `retry` is specified, the timeout applies to each individual attempt.
   :param metadata: Additional metadata that is provided to the method.
   :param gcp_conn_id: The connection ID to use to connect to Google Cloud.
   :param impersonation_chain: Optional service account to impersonate using short-term
       credentials, or chained list of accounts required to get the access_token
       of the last account in the list, which will be impersonated in the request.
       If set as a string, the account must grant the originating account
       the Service Account Token Creator IAM role.
       If set as a sequence, the identities from the list must grant
       Service Account Token Creator IAM role to the directly preceding identity, with first
       account from the list granting this role to the originating account (templated).

   .. py:attribute:: template_fields
      :annotation: :Sequence[str] = ['model_id', 'location', 'project_id', 'impersonation_chain']

      

   .. py:method:: execute(self, context)

      This is the main method to derive when creating an operator.
      Context is the same dictionary used as when rendering jinja templates.

      Refer to get_template_context for more context.



.. py:class:: AutoMLTablesListTableSpecsOperator(*, dataset_id, location, page_size = None, filter_ = None, project_id = None, metadata = (), timeout = None, retry = DEFAULT, gcp_conn_id = 'google_cloud_default', impersonation_chain = None, **kwargs)

   Bases: :py:obj:`airflow.models.BaseOperator`

   Lists table specs in a dataset.

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

   :param dataset_id: Name of the dataset.
   :param filter_: Filter expression, see go/filtering.
   :param page_size: The maximum number of resources contained in the
       underlying API response. If page streaming is performed per
       resource, this parameter does not affect the return value. If page
       streaming is performed per-page, this determines the maximum number
       of resources in a page.
   :param project_id: ID of the Google Cloud project if None then
       default project_id is used.
   :param location: The location of the project.
   :param retry: A retry object used to retry requests. If `None` is specified, requests will not be
       retried.
   :param timeout: The amount of time, in seconds, to wait for the request to complete. Note that if
       `retry` is specified, the timeout applies to each individual attempt.
   :param metadata: Additional metadata that is provided to the method.
   :param gcp_conn_id: The connection ID to use to connect to Google Cloud.
   :param impersonation_chain: Optional service account to impersonate using short-term
       credentials, or chained list of accounts required to get the access_token
       of the last account in the list, which will be impersonated in the request.
       If set as a string, the account must grant the originating account
       the Service Account Token Creator IAM role.
       If set as a sequence, the identities from the list must grant
       Service Account Token Creator IAM role to the directly preceding identity, with first
       account from the list granting this role to the originating account (templated).

   .. py:attribute:: template_fields
      :annotation: :Sequence[str] = ['dataset_id', 'filter_', 'location', 'project_id', 'impersonation_chain']

      

   .. py:method:: execute(self, context)

      This is the main method to derive when creating an operator.
      Context is the same dictionary used as when rendering jinja templates.

      Refer to get_template_context for more context.



.. py:class:: AutoMLListDatasetOperator(*, location, project_id = None, metadata = (), timeout = None, retry = DEFAULT, gcp_conn_id = 'google_cloud_default', impersonation_chain = None, **kwargs)

   Bases: :py:obj:`airflow.models.BaseOperator`

   Lists AutoML Datasets in project.

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

   :param project_id: ID of the Google Cloud project where datasets are located if None then
       default project_id is used.
   :param location: The location of the project.
   :param retry: A retry object used to retry requests. If `None` is specified, requests will not be
       retried.
   :param timeout: The amount of time, in seconds, to wait for the request to complete. Note that if
       `retry` is specified, the timeout applies to each individual attempt.
   :param metadata: Additional metadata that is provided to the method.
   :param gcp_conn_id: The connection ID to use to connect to Google Cloud.
   :param impersonation_chain: Optional service account to impersonate using short-term
       credentials, or chained list of accounts required to get the access_token
       of the last account in the list, which will be impersonated in the request.
       If set as a string, the account must grant the originating account
       the Service Account Token Creator IAM role.
       If set as a sequence, the identities from the list must grant
       Service Account Token Creator IAM role to the directly preceding identity, with first
       account from the list granting this role to the originating account (templated).

   .. py:attribute:: template_fields
      :annotation: :Sequence[str] = ['location', 'project_id', 'impersonation_chain']

      

   .. py:method:: execute(self, context)

      This is the main method to derive when creating an operator.
      Context is the same dictionary used as when rendering jinja templates.

      Refer to get_template_context for more context.



.. py:class:: AutoMLDeleteDatasetOperator(*, dataset_id, location, project_id = None, metadata = (), timeout = None, retry = DEFAULT, gcp_conn_id = 'google_cloud_default', impersonation_chain = None, **kwargs)

   Bases: :py:obj:`airflow.models.BaseOperator`

   Deletes a dataset and all of its contents.

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

   :param dataset_id: Name of the dataset_id, list of dataset_id or string of dataset_id
       coma separated to be deleted.
   :param project_id: ID of the Google Cloud project where dataset is located if None then
       default project_id is used.
   :param location: The location of the project.
   :param retry: A retry object used to retry requests. If `None` is specified, requests will not be
       retried.
   :param timeout: The amount of time, in seconds, to wait for the request to complete. Note that if
       `retry` is specified, the timeout applies to each individual attempt.
   :param metadata: Additional metadata that is provided to the method.
   :param gcp_conn_id: The connection ID to use to connect to Google Cloud.
   :param impersonation_chain: Optional service account to impersonate using short-term
       credentials, or chained list of accounts required to get the access_token
       of the last account in the list, which will be impersonated in the request.
       If set as a string, the account must grant the originating account
       the Service Account Token Creator IAM role.
       If set as a sequence, the identities from the list must grant
       Service Account Token Creator IAM role to the directly preceding identity, with first
       account from the list granting this role to the originating account (templated).

   .. py:attribute:: template_fields
      :annotation: :Sequence[str] = ['dataset_id', 'location', 'project_id', 'impersonation_chain']

      

   .. py:method:: execute(self, context)

      This is the main method to derive when creating an operator.
      Context is the same dictionary used as when rendering jinja templates.

      Refer to get_template_context for more context.



