apache-airflow-providers-google 14.0.0__py3-none-any.whl → 19.1.0rc1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- airflow/providers/google/3rd-party-licenses/LICENSES.txt +14 -0
- airflow/providers/google/3rd-party-licenses/NOTICE +5 -0
- airflow/providers/google/__init__.py +3 -3
- airflow/providers/google/_vendor/__init__.py +0 -0
- airflow/providers/google/_vendor/json_merge_patch.py +91 -0
- airflow/providers/google/ads/hooks/ads.py +52 -43
- airflow/providers/google/ads/operators/ads.py +2 -2
- airflow/providers/google/ads/transfers/ads_to_gcs.py +3 -19
- airflow/providers/google/assets/gcs.py +1 -11
- airflow/providers/google/cloud/_internal_client/secret_manager_client.py +3 -2
- airflow/providers/google/cloud/bundles/gcs.py +161 -0
- airflow/providers/google/cloud/hooks/alloy_db.py +2 -3
- airflow/providers/google/cloud/hooks/bigquery.py +195 -318
- airflow/providers/google/cloud/hooks/bigquery_dts.py +8 -8
- airflow/providers/google/cloud/hooks/bigtable.py +3 -2
- airflow/providers/google/cloud/hooks/cloud_batch.py +8 -9
- airflow/providers/google/cloud/hooks/cloud_build.py +6 -65
- airflow/providers/google/cloud/hooks/cloud_composer.py +292 -24
- airflow/providers/google/cloud/hooks/cloud_logging.py +109 -0
- airflow/providers/google/cloud/hooks/cloud_memorystore.py +4 -3
- airflow/providers/google/cloud/hooks/cloud_run.py +20 -11
- airflow/providers/google/cloud/hooks/cloud_sql.py +136 -64
- airflow/providers/google/cloud/hooks/cloud_storage_transfer_service.py +35 -15
- airflow/providers/google/cloud/hooks/compute.py +7 -6
- airflow/providers/google/cloud/hooks/compute_ssh.py +7 -4
- airflow/providers/google/cloud/hooks/datacatalog.py +12 -3
- airflow/providers/google/cloud/hooks/dataflow.py +87 -242
- airflow/providers/google/cloud/hooks/dataform.py +9 -14
- airflow/providers/google/cloud/hooks/datafusion.py +7 -9
- airflow/providers/google/cloud/hooks/dataplex.py +13 -12
- airflow/providers/google/cloud/hooks/dataprep.py +2 -2
- airflow/providers/google/cloud/hooks/dataproc.py +76 -74
- airflow/providers/google/cloud/hooks/dataproc_metastore.py +4 -3
- airflow/providers/google/cloud/hooks/dlp.py +5 -4
- airflow/providers/google/cloud/hooks/gcs.py +144 -33
- airflow/providers/google/cloud/hooks/gen_ai.py +196 -0
- airflow/providers/google/cloud/hooks/kms.py +3 -2
- airflow/providers/google/cloud/hooks/kubernetes_engine.py +22 -17
- airflow/providers/google/cloud/hooks/looker.py +6 -1
- airflow/providers/google/cloud/hooks/managed_kafka.py +227 -3
- airflow/providers/google/cloud/hooks/mlengine.py +7 -8
- airflow/providers/google/cloud/hooks/natural_language.py +3 -2
- airflow/providers/google/cloud/hooks/os_login.py +3 -2
- airflow/providers/google/cloud/hooks/pubsub.py +6 -6
- airflow/providers/google/cloud/hooks/secret_manager.py +105 -12
- airflow/providers/google/cloud/hooks/spanner.py +75 -10
- airflow/providers/google/cloud/hooks/speech_to_text.py +3 -2
- airflow/providers/google/cloud/hooks/stackdriver.py +18 -18
- airflow/providers/google/cloud/hooks/tasks.py +4 -3
- airflow/providers/google/cloud/hooks/text_to_speech.py +3 -2
- airflow/providers/google/cloud/hooks/translate.py +8 -17
- airflow/providers/google/cloud/hooks/vertex_ai/auto_ml.py +8 -222
- airflow/providers/google/cloud/hooks/vertex_ai/batch_prediction_job.py +9 -15
- airflow/providers/google/cloud/hooks/vertex_ai/custom_job.py +33 -283
- airflow/providers/google/cloud/hooks/vertex_ai/dataset.py +5 -12
- airflow/providers/google/cloud/hooks/vertex_ai/endpoint_service.py +6 -12
- airflow/providers/google/cloud/hooks/vertex_ai/experiment_service.py +202 -0
- airflow/providers/google/cloud/hooks/vertex_ai/feature_store.py +311 -10
- airflow/providers/google/cloud/hooks/vertex_ai/generative_model.py +79 -75
- airflow/providers/google/cloud/hooks/vertex_ai/hyperparameter_tuning_job.py +7 -13
- airflow/providers/google/cloud/hooks/vertex_ai/model_service.py +8 -12
- airflow/providers/google/cloud/hooks/vertex_ai/pipeline_job.py +6 -12
- airflow/providers/google/cloud/hooks/vertex_ai/prediction_service.py +3 -2
- airflow/providers/google/cloud/hooks/vertex_ai/ray.py +223 -0
- airflow/providers/google/cloud/hooks/video_intelligence.py +3 -2
- airflow/providers/google/cloud/hooks/vision.py +7 -7
- airflow/providers/google/cloud/hooks/workflows.py +4 -3
- airflow/providers/google/cloud/links/alloy_db.py +0 -46
- airflow/providers/google/cloud/links/base.py +77 -7
- airflow/providers/google/cloud/links/bigquery.py +0 -47
- airflow/providers/google/cloud/links/bigquery_dts.py +0 -20
- airflow/providers/google/cloud/links/bigtable.py +0 -48
- airflow/providers/google/cloud/links/cloud_build.py +0 -73
- airflow/providers/google/cloud/links/cloud_functions.py +0 -33
- airflow/providers/google/cloud/links/cloud_memorystore.py +0 -58
- airflow/providers/google/cloud/links/{life_sciences.py → cloud_run.py} +5 -27
- airflow/providers/google/cloud/links/cloud_sql.py +0 -33
- airflow/providers/google/cloud/links/cloud_storage_transfer.py +17 -46
- airflow/providers/google/cloud/links/cloud_tasks.py +7 -26
- airflow/providers/google/cloud/links/compute.py +0 -58
- airflow/providers/google/cloud/links/data_loss_prevention.py +0 -169
- airflow/providers/google/cloud/links/datacatalog.py +23 -54
- airflow/providers/google/cloud/links/dataflow.py +0 -34
- airflow/providers/google/cloud/links/dataform.py +0 -64
- airflow/providers/google/cloud/links/datafusion.py +1 -90
- airflow/providers/google/cloud/links/dataplex.py +0 -154
- airflow/providers/google/cloud/links/dataprep.py +0 -24
- airflow/providers/google/cloud/links/dataproc.py +11 -89
- airflow/providers/google/cloud/links/datastore.py +0 -31
- airflow/providers/google/cloud/links/kubernetes_engine.py +11 -61
- airflow/providers/google/cloud/links/managed_kafka.py +11 -51
- airflow/providers/google/cloud/links/mlengine.py +0 -70
- airflow/providers/google/cloud/links/pubsub.py +0 -32
- airflow/providers/google/cloud/links/spanner.py +0 -33
- airflow/providers/google/cloud/links/stackdriver.py +0 -30
- airflow/providers/google/cloud/links/translate.py +17 -187
- airflow/providers/google/cloud/links/vertex_ai.py +28 -195
- airflow/providers/google/cloud/links/workflows.py +0 -52
- airflow/providers/google/cloud/log/gcs_task_handler.py +166 -118
- airflow/providers/google/cloud/log/stackdriver_task_handler.py +14 -9
- airflow/providers/google/cloud/openlineage/CloudStorageTransferJobFacet.json +68 -0
- airflow/providers/google/cloud/openlineage/CloudStorageTransferRunFacet.json +60 -0
- airflow/providers/google/cloud/openlineage/DataFusionRunFacet.json +32 -0
- airflow/providers/google/cloud/openlineage/facets.py +141 -40
- airflow/providers/google/cloud/openlineage/mixins.py +14 -13
- airflow/providers/google/cloud/openlineage/utils.py +19 -3
- airflow/providers/google/cloud/operators/alloy_db.py +76 -61
- airflow/providers/google/cloud/operators/bigquery.py +104 -667
- airflow/providers/google/cloud/operators/bigquery_dts.py +12 -12
- airflow/providers/google/cloud/operators/bigtable.py +38 -7
- airflow/providers/google/cloud/operators/cloud_base.py +22 -1
- airflow/providers/google/cloud/operators/cloud_batch.py +18 -18
- airflow/providers/google/cloud/operators/cloud_build.py +80 -36
- airflow/providers/google/cloud/operators/cloud_composer.py +157 -71
- airflow/providers/google/cloud/operators/cloud_logging_sink.py +341 -0
- airflow/providers/google/cloud/operators/cloud_memorystore.py +74 -46
- airflow/providers/google/cloud/operators/cloud_run.py +39 -20
- airflow/providers/google/cloud/operators/cloud_sql.py +46 -61
- airflow/providers/google/cloud/operators/cloud_storage_transfer_service.py +92 -14
- airflow/providers/google/cloud/operators/compute.py +18 -50
- airflow/providers/google/cloud/operators/datacatalog.py +167 -29
- airflow/providers/google/cloud/operators/dataflow.py +38 -15
- airflow/providers/google/cloud/operators/dataform.py +19 -7
- airflow/providers/google/cloud/operators/datafusion.py +43 -43
- airflow/providers/google/cloud/operators/dataplex.py +212 -126
- airflow/providers/google/cloud/operators/dataprep.py +1 -5
- airflow/providers/google/cloud/operators/dataproc.py +134 -207
- airflow/providers/google/cloud/operators/dataproc_metastore.py +102 -84
- airflow/providers/google/cloud/operators/datastore.py +22 -6
- airflow/providers/google/cloud/operators/dlp.py +24 -45
- airflow/providers/google/cloud/operators/functions.py +21 -14
- airflow/providers/google/cloud/operators/gcs.py +15 -12
- airflow/providers/google/cloud/operators/gen_ai.py +389 -0
- airflow/providers/google/cloud/operators/kubernetes_engine.py +115 -106
- airflow/providers/google/cloud/operators/looker.py +1 -1
- airflow/providers/google/cloud/operators/managed_kafka.py +362 -40
- airflow/providers/google/cloud/operators/natural_language.py +5 -3
- airflow/providers/google/cloud/operators/pubsub.py +69 -21
- airflow/providers/google/cloud/operators/spanner.py +53 -45
- airflow/providers/google/cloud/operators/speech_to_text.py +5 -4
- airflow/providers/google/cloud/operators/stackdriver.py +5 -11
- airflow/providers/google/cloud/operators/tasks.py +6 -15
- airflow/providers/google/cloud/operators/text_to_speech.py +4 -3
- airflow/providers/google/cloud/operators/translate.py +46 -20
- airflow/providers/google/cloud/operators/translate_speech.py +4 -3
- airflow/providers/google/cloud/operators/vertex_ai/auto_ml.py +44 -34
- airflow/providers/google/cloud/operators/vertex_ai/batch_prediction_job.py +34 -12
- airflow/providers/google/cloud/operators/vertex_ai/custom_job.py +62 -53
- airflow/providers/google/cloud/operators/vertex_ai/dataset.py +75 -11
- airflow/providers/google/cloud/operators/vertex_ai/endpoint_service.py +48 -12
- airflow/providers/google/cloud/operators/vertex_ai/experiment_service.py +435 -0
- airflow/providers/google/cloud/operators/vertex_ai/feature_store.py +532 -1
- airflow/providers/google/cloud/operators/vertex_ai/generative_model.py +135 -116
- airflow/providers/google/cloud/operators/vertex_ai/hyperparameter_tuning_job.py +16 -12
- airflow/providers/google/cloud/operators/vertex_ai/model_service.py +62 -14
- airflow/providers/google/cloud/operators/vertex_ai/pipeline_job.py +35 -10
- airflow/providers/google/cloud/operators/vertex_ai/ray.py +393 -0
- airflow/providers/google/cloud/operators/video_intelligence.py +5 -3
- airflow/providers/google/cloud/operators/vision.py +7 -5
- airflow/providers/google/cloud/operators/workflows.py +24 -19
- airflow/providers/google/cloud/secrets/secret_manager.py +2 -1
- airflow/providers/google/cloud/sensors/bigquery.py +2 -2
- airflow/providers/google/cloud/sensors/bigquery_dts.py +6 -4
- airflow/providers/google/cloud/sensors/bigtable.py +14 -6
- airflow/providers/google/cloud/sensors/cloud_composer.py +535 -33
- airflow/providers/google/cloud/sensors/cloud_storage_transfer_service.py +6 -5
- airflow/providers/google/cloud/sensors/dataflow.py +27 -10
- airflow/providers/google/cloud/sensors/dataform.py +2 -2
- airflow/providers/google/cloud/sensors/datafusion.py +4 -4
- airflow/providers/google/cloud/sensors/dataplex.py +7 -5
- airflow/providers/google/cloud/sensors/dataprep.py +2 -2
- airflow/providers/google/cloud/sensors/dataproc.py +10 -9
- airflow/providers/google/cloud/sensors/dataproc_metastore.py +4 -3
- airflow/providers/google/cloud/sensors/gcs.py +22 -21
- airflow/providers/google/cloud/sensors/looker.py +5 -5
- airflow/providers/google/cloud/sensors/pubsub.py +20 -20
- airflow/providers/google/cloud/sensors/tasks.py +2 -2
- airflow/providers/google/cloud/sensors/vertex_ai/feature_store.py +2 -2
- airflow/providers/google/cloud/sensors/workflows.py +6 -4
- airflow/providers/google/cloud/transfers/adls_to_gcs.py +1 -1
- airflow/providers/google/cloud/transfers/azure_blob_to_gcs.py +2 -2
- airflow/providers/google/cloud/transfers/azure_fileshare_to_gcs.py +2 -2
- airflow/providers/google/cloud/transfers/bigquery_to_bigquery.py +11 -8
- airflow/providers/google/cloud/transfers/bigquery_to_gcs.py +14 -13
- airflow/providers/google/cloud/transfers/bigquery_to_mssql.py +7 -3
- airflow/providers/google/cloud/transfers/bigquery_to_mysql.py +12 -1
- airflow/providers/google/cloud/transfers/bigquery_to_postgres.py +24 -10
- airflow/providers/google/cloud/transfers/bigquery_to_sql.py +104 -5
- airflow/providers/google/cloud/transfers/calendar_to_gcs.py +1 -1
- airflow/providers/google/cloud/transfers/cassandra_to_gcs.py +18 -22
- airflow/providers/google/cloud/transfers/facebook_ads_to_gcs.py +4 -5
- airflow/providers/google/cloud/transfers/gcs_to_bigquery.py +45 -38
- airflow/providers/google/cloud/transfers/gcs_to_gcs.py +2 -2
- airflow/providers/google/cloud/transfers/gcs_to_local.py +5 -3
- airflow/providers/google/cloud/transfers/gcs_to_sftp.py +10 -4
- airflow/providers/google/cloud/transfers/gdrive_to_gcs.py +6 -2
- airflow/providers/google/cloud/transfers/gdrive_to_local.py +2 -2
- airflow/providers/google/cloud/transfers/http_to_gcs.py +193 -0
- airflow/providers/google/cloud/transfers/local_to_gcs.py +2 -2
- airflow/providers/google/cloud/transfers/mssql_to_gcs.py +1 -1
- airflow/providers/google/cloud/transfers/oracle_to_gcs.py +36 -11
- airflow/providers/google/cloud/transfers/postgres_to_gcs.py +44 -12
- airflow/providers/google/cloud/transfers/s3_to_gcs.py +12 -6
- airflow/providers/google/cloud/transfers/salesforce_to_gcs.py +2 -2
- airflow/providers/google/cloud/transfers/sftp_to_gcs.py +36 -14
- airflow/providers/google/cloud/transfers/sheets_to_gcs.py +3 -3
- airflow/providers/google/cloud/transfers/sql_to_gcs.py +10 -10
- airflow/providers/google/cloud/triggers/bigquery.py +75 -34
- airflow/providers/google/cloud/triggers/bigquery_dts.py +2 -1
- airflow/providers/google/cloud/triggers/cloud_batch.py +2 -1
- airflow/providers/google/cloud/triggers/cloud_build.py +3 -2
- airflow/providers/google/cloud/triggers/cloud_composer.py +303 -47
- airflow/providers/google/cloud/triggers/cloud_run.py +2 -2
- airflow/providers/google/cloud/triggers/cloud_storage_transfer_service.py +96 -5
- airflow/providers/google/cloud/triggers/dataflow.py +125 -2
- airflow/providers/google/cloud/triggers/datafusion.py +1 -1
- airflow/providers/google/cloud/triggers/dataplex.py +16 -3
- airflow/providers/google/cloud/triggers/dataproc.py +124 -53
- airflow/providers/google/cloud/triggers/kubernetes_engine.py +46 -28
- airflow/providers/google/cloud/triggers/mlengine.py +1 -1
- airflow/providers/google/cloud/triggers/pubsub.py +17 -20
- airflow/providers/google/cloud/triggers/vertex_ai.py +8 -7
- airflow/providers/google/cloud/utils/bigquery.py +5 -7
- airflow/providers/google/cloud/utils/bigquery_get_data.py +1 -1
- airflow/providers/google/cloud/utils/credentials_provider.py +4 -3
- airflow/providers/google/cloud/utils/dataform.py +1 -1
- airflow/providers/google/cloud/utils/external_token_supplier.py +0 -1
- airflow/providers/google/cloud/utils/field_validator.py +1 -2
- airflow/providers/google/cloud/utils/validators.py +43 -0
- airflow/providers/google/common/auth_backend/google_openid.py +26 -9
- airflow/providers/google/common/consts.py +2 -1
- airflow/providers/google/common/deprecated.py +2 -1
- airflow/providers/google/common/hooks/base_google.py +40 -43
- airflow/providers/google/common/hooks/operation_helpers.py +78 -0
- airflow/providers/google/common/links/storage.py +0 -22
- airflow/providers/google/common/utils/get_secret.py +31 -0
- airflow/providers/google/common/utils/id_token_credentials.py +4 -5
- airflow/providers/google/firebase/operators/firestore.py +2 -2
- airflow/providers/google/get_provider_info.py +61 -216
- airflow/providers/google/go_module_utils.py +35 -3
- airflow/providers/google/leveldb/hooks/leveldb.py +30 -6
- airflow/providers/google/leveldb/operators/leveldb.py +2 -2
- airflow/providers/google/marketing_platform/hooks/analytics_admin.py +3 -2
- airflow/providers/google/marketing_platform/hooks/display_video.py +3 -109
- airflow/providers/google/marketing_platform/hooks/search_ads.py +1 -1
- airflow/providers/google/marketing_platform/links/analytics_admin.py +4 -5
- airflow/providers/google/marketing_platform/operators/analytics_admin.py +7 -6
- airflow/providers/google/marketing_platform/operators/campaign_manager.py +5 -5
- airflow/providers/google/marketing_platform/operators/display_video.py +28 -489
- airflow/providers/google/marketing_platform/operators/search_ads.py +2 -2
- airflow/providers/google/marketing_platform/sensors/campaign_manager.py +2 -2
- airflow/providers/google/marketing_platform/sensors/display_video.py +4 -64
- airflow/providers/google/suite/hooks/calendar.py +1 -1
- airflow/providers/google/suite/hooks/drive.py +2 -2
- airflow/providers/google/suite/hooks/sheets.py +15 -1
- airflow/providers/google/suite/operators/sheets.py +8 -3
- airflow/providers/google/suite/sensors/drive.py +2 -2
- airflow/providers/google/suite/transfers/gcs_to_gdrive.py +2 -2
- airflow/providers/google/suite/transfers/gcs_to_sheets.py +1 -1
- airflow/providers/google/suite/transfers/local_to_drive.py +3 -3
- airflow/providers/google/suite/transfers/sql_to_sheets.py +5 -4
- airflow/providers/google/version_compat.py +15 -1
- {apache_airflow_providers_google-14.0.0.dist-info → apache_airflow_providers_google-19.1.0rc1.dist-info}/METADATA +117 -72
- apache_airflow_providers_google-19.1.0rc1.dist-info/RECORD +331 -0
- {apache_airflow_providers_google-14.0.0.dist-info → apache_airflow_providers_google-19.1.0rc1.dist-info}/WHEEL +1 -1
- apache_airflow_providers_google-19.1.0rc1.dist-info/licenses/NOTICE +5 -0
- airflow/providers/google/cloud/example_dags/example_cloud_task.py +0 -54
- airflow/providers/google/cloud/hooks/automl.py +0 -679
- airflow/providers/google/cloud/hooks/life_sciences.py +0 -159
- airflow/providers/google/cloud/links/automl.py +0 -193
- airflow/providers/google/cloud/operators/automl.py +0 -1360
- airflow/providers/google/cloud/operators/life_sciences.py +0 -119
- airflow/providers/google/cloud/operators/mlengine.py +0 -1515
- airflow/providers/google/cloud/utils/mlengine_operator_utils.py +0 -273
- apache_airflow_providers_google-14.0.0.dist-info/RECORD +0 -318
- /airflow/providers/google/cloud/{example_dags → bundles}/__init__.py +0 -0
- {apache_airflow_providers_google-14.0.0.dist-info → apache_airflow_providers_google-19.1.0rc1.dist-info}/entry_points.txt +0 -0
- {airflow/providers/google → apache_airflow_providers_google-19.1.0rc1.dist-info/licenses}/LICENSE +0 -0
|
@@ -65,13 +65,15 @@ from airflow.providers.google.cloud.links.cloud_storage_transfer import (
|
|
|
65
65
|
)
|
|
66
66
|
from airflow.providers.google.cloud.operators.cloud_base import GoogleCloudBaseOperator
|
|
67
67
|
from airflow.providers.google.cloud.triggers.cloud_storage_transfer_service import (
|
|
68
|
+
CloudDataTransferServiceRunJobTrigger,
|
|
68
69
|
CloudStorageTransferServiceCheckJobStatusTrigger,
|
|
69
70
|
)
|
|
70
71
|
from airflow.providers.google.cloud.utils.helpers import normalize_directory_path
|
|
71
72
|
from airflow.providers.google.common.hooks.base_google import PROVIDE_PROJECT_ID
|
|
72
73
|
|
|
73
74
|
if TYPE_CHECKING:
|
|
74
|
-
from airflow.
|
|
75
|
+
from airflow.providers.common.compat.sdk import Context
|
|
76
|
+
from airflow.providers.openlineage.extractors import OperatorLineage
|
|
75
77
|
|
|
76
78
|
|
|
77
79
|
class TransferJobPreprocessor:
|
|
@@ -96,8 +98,8 @@ class TransferJobPreprocessor:
|
|
|
96
98
|
|
|
97
99
|
aws_hook = AwsBaseHook(self.aws_conn_id, resource_type="s3")
|
|
98
100
|
aws_credentials = aws_hook.get_credentials()
|
|
99
|
-
aws_access_key_id = aws_credentials.access_key
|
|
100
|
-
aws_secret_access_key = aws_credentials.secret_key
|
|
101
|
+
aws_access_key_id = aws_credentials.access_key
|
|
102
|
+
aws_secret_access_key = aws_credentials.secret_key
|
|
101
103
|
self.body[TRANSFER_SPEC][AWS_S3_DATA_SOURCE][AWS_ACCESS_KEY] = {
|
|
102
104
|
ACCESS_KEY_ID: aws_access_key_id,
|
|
103
105
|
SECRET_ACCESS_KEY: aws_secret_access_key,
|
|
@@ -280,7 +282,6 @@ class CloudDataTransferServiceCreateJobOperator(GoogleCloudBaseOperator):
|
|
|
280
282
|
if project_id:
|
|
281
283
|
CloudStorageTransferJobLink.persist(
|
|
282
284
|
context=context,
|
|
283
|
-
task_instance=self,
|
|
284
285
|
project_id=project_id,
|
|
285
286
|
job_name=result[NAME],
|
|
286
287
|
)
|
|
@@ -370,7 +371,6 @@ class CloudDataTransferServiceUpdateJobOperator(GoogleCloudBaseOperator):
|
|
|
370
371
|
if project_id:
|
|
371
372
|
CloudStorageTransferJobLink.persist(
|
|
372
373
|
context=context,
|
|
373
|
-
task_instance=self,
|
|
374
374
|
project_id=project_id,
|
|
375
375
|
job_name=self.job_name,
|
|
376
376
|
)
|
|
@@ -470,6 +470,8 @@ class CloudDataTransferServiceRunJobOperator(GoogleCloudBaseOperator):
|
|
|
470
470
|
If set as a sequence, the identities from the list must grant
|
|
471
471
|
Service Account Token Creator IAM role to the directly preceding identity, with first
|
|
472
472
|
account from the list granting this role to the originating account (templated).
|
|
473
|
+
:param timeout: Time to wait for the operation to end in seconds. Defaults to 60 seconds if not specified.
|
|
474
|
+
:param deferrable: Run operator in the deferrable mode.
|
|
473
475
|
"""
|
|
474
476
|
|
|
475
477
|
# [START gcp_transfer_job_run_template_fields]
|
|
@@ -491,6 +493,8 @@ class CloudDataTransferServiceRunJobOperator(GoogleCloudBaseOperator):
|
|
|
491
493
|
api_version: str = "v1",
|
|
492
494
|
project_id: str = PROVIDE_PROJECT_ID,
|
|
493
495
|
google_impersonation_chain: str | Sequence[str] | None = None,
|
|
496
|
+
timeout: float | None = None,
|
|
497
|
+
deferrable: bool = conf.getboolean("operators", "default_deferrable", fallback=False),
|
|
494
498
|
**kwargs,
|
|
495
499
|
) -> None:
|
|
496
500
|
super().__init__(**kwargs)
|
|
@@ -499,6 +503,8 @@ class CloudDataTransferServiceRunJobOperator(GoogleCloudBaseOperator):
|
|
|
499
503
|
self.gcp_conn_id = gcp_conn_id
|
|
500
504
|
self.api_version = api_version
|
|
501
505
|
self.google_impersonation_chain = google_impersonation_chain
|
|
506
|
+
self.timeout = timeout
|
|
507
|
+
self.deferrable = deferrable
|
|
502
508
|
|
|
503
509
|
def _validate_inputs(self) -> None:
|
|
504
510
|
if not self.job_name:
|
|
@@ -516,13 +522,36 @@ class CloudDataTransferServiceRunJobOperator(GoogleCloudBaseOperator):
|
|
|
516
522
|
if project_id:
|
|
517
523
|
CloudStorageTransferJobLink.persist(
|
|
518
524
|
context=context,
|
|
519
|
-
task_instance=self,
|
|
520
525
|
project_id=project_id,
|
|
521
526
|
job_name=self.job_name,
|
|
522
527
|
)
|
|
523
528
|
|
|
529
|
+
if self.deferrable:
|
|
530
|
+
self.defer(
|
|
531
|
+
timeout=timedelta(seconds=self.timeout or 60),
|
|
532
|
+
trigger=CloudDataTransferServiceRunJobTrigger(
|
|
533
|
+
job_name=self.job_name,
|
|
534
|
+
project_id=project_id,
|
|
535
|
+
gcp_conn_id=self.gcp_conn_id,
|
|
536
|
+
impersonation_chain=self.google_impersonation_chain,
|
|
537
|
+
),
|
|
538
|
+
method_name="execute_complete",
|
|
539
|
+
)
|
|
540
|
+
|
|
524
541
|
return hook.run_transfer_job(job_name=self.job_name, project_id=project_id)
|
|
525
542
|
|
|
543
|
+
def execute_complete(self, context: Context, event: dict[str, Any]) -> Any:
|
|
544
|
+
"""
|
|
545
|
+
Act as a callback for when the trigger fires.
|
|
546
|
+
|
|
547
|
+
This returns immediately. It relies on trigger to throw an exception,
|
|
548
|
+
otherwise it assumes execution was successful.
|
|
549
|
+
"""
|
|
550
|
+
if event["status"] == "error":
|
|
551
|
+
raise AirflowException(event["message"])
|
|
552
|
+
|
|
553
|
+
return event["job_result"]
|
|
554
|
+
|
|
526
555
|
|
|
527
556
|
class CloudDataTransferServiceGetOperationOperator(GoogleCloudBaseOperator):
|
|
528
557
|
"""
|
|
@@ -589,7 +618,6 @@ class CloudDataTransferServiceGetOperationOperator(GoogleCloudBaseOperator):
|
|
|
589
618
|
if project_id:
|
|
590
619
|
CloudStorageTransferDetailsLink.persist(
|
|
591
620
|
context=context,
|
|
592
|
-
task_instance=self,
|
|
593
621
|
project_id=project_id,
|
|
594
622
|
operation_name=self.operation_name,
|
|
595
623
|
)
|
|
@@ -666,7 +694,6 @@ class CloudDataTransferServiceListOperationsOperator(GoogleCloudBaseOperator):
|
|
|
666
694
|
if project_id:
|
|
667
695
|
CloudStorageTransferListLink.persist(
|
|
668
696
|
context=context,
|
|
669
|
-
task_instance=self,
|
|
670
697
|
project_id=project_id,
|
|
671
698
|
)
|
|
672
699
|
|
|
@@ -969,6 +996,7 @@ class CloudDataTransferServiceS3ToGCSOperator(GoogleCloudBaseOperator):
|
|
|
969
996
|
self.aws_role_arn = aws_role_arn
|
|
970
997
|
self.deferrable = deferrable
|
|
971
998
|
self._validate_inputs()
|
|
999
|
+
self._transfer_job: dict[str, Any] | None = None
|
|
972
1000
|
|
|
973
1001
|
def _validate_inputs(self) -> None:
|
|
974
1002
|
if self.delete_job_after_completion and not self.wait:
|
|
@@ -983,19 +1011,18 @@ class CloudDataTransferServiceS3ToGCSOperator(GoogleCloudBaseOperator):
|
|
|
983
1011
|
|
|
984
1012
|
TransferJobPreprocessor(body=body, aws_conn_id=self.aws_conn_id, default_schedule=True).process_body()
|
|
985
1013
|
|
|
986
|
-
|
|
987
|
-
|
|
1014
|
+
self._transfer_job = hook.create_transfer_job(body=body)
|
|
988
1015
|
if self.wait:
|
|
989
1016
|
if not self.deferrable:
|
|
990
|
-
hook.wait_for_transfer_job(
|
|
1017
|
+
hook.wait_for_transfer_job(self._transfer_job, timeout=self.timeout)
|
|
991
1018
|
if self.delete_job_after_completion:
|
|
992
|
-
hook.delete_transfer_job(job_name=
|
|
1019
|
+
hook.delete_transfer_job(job_name=self._transfer_job[NAME], project_id=self.project_id)
|
|
993
1020
|
else:
|
|
994
1021
|
self.defer(
|
|
995
1022
|
timeout=timedelta(seconds=self.timeout or 60),
|
|
996
1023
|
trigger=CloudStorageTransferServiceCheckJobStatusTrigger(
|
|
997
|
-
job_name=
|
|
998
|
-
project_id=
|
|
1024
|
+
job_name=self._transfer_job[NAME],
|
|
1025
|
+
project_id=self._transfer_job[PROJECT_ID],
|
|
999
1026
|
gcp_conn_id=self.gcp_conn_id,
|
|
1000
1027
|
impersonation_chain=self.google_impersonation_chain,
|
|
1001
1028
|
),
|
|
@@ -1045,6 +1072,57 @@ class CloudDataTransferServiceS3ToGCSOperator(GoogleCloudBaseOperator):
|
|
|
1045
1072
|
|
|
1046
1073
|
return body
|
|
1047
1074
|
|
|
1075
|
+
def get_openlineage_facets_on_complete(self, task_instance) -> OperatorLineage | None:
|
|
1076
|
+
"""Provide OpenLineage OperatorLineage for the S3->GCS transfer."""
|
|
1077
|
+
from airflow.providers.common.compat.openlineage.facet import Dataset
|
|
1078
|
+
from airflow.providers.google.cloud.openlineage.facets import (
|
|
1079
|
+
CloudStorageTransferJobFacet,
|
|
1080
|
+
CloudStorageTransferRunFacet,
|
|
1081
|
+
)
|
|
1082
|
+
from airflow.providers.openlineage.extractors import OperatorLineage
|
|
1083
|
+
|
|
1084
|
+
input_ds = Dataset(
|
|
1085
|
+
namespace=f"s3://{self.s3_bucket}",
|
|
1086
|
+
name=normalize_directory_path(self.s3_path) or "",
|
|
1087
|
+
)
|
|
1088
|
+
|
|
1089
|
+
output_ds = Dataset(
|
|
1090
|
+
namespace=f"gs://{self.gcs_bucket}",
|
|
1091
|
+
name=normalize_directory_path(self.gcs_path) or "",
|
|
1092
|
+
)
|
|
1093
|
+
|
|
1094
|
+
job = self._transfer_job or {}
|
|
1095
|
+
job_facet = CloudStorageTransferJobFacet(
|
|
1096
|
+
jobName=job.get(NAME),
|
|
1097
|
+
projectId=job.get(PROJECT_ID, self.project_id),
|
|
1098
|
+
description=job.get(DESCRIPTION, self.description),
|
|
1099
|
+
status=job.get(STATUS),
|
|
1100
|
+
sourceBucket=job.get(TRANSFER_SPEC, {})
|
|
1101
|
+
.get(AWS_S3_DATA_SOURCE, {})
|
|
1102
|
+
.get(BUCKET_NAME, self.s3_bucket),
|
|
1103
|
+
sourcePath=job.get(TRANSFER_SPEC, {}).get(AWS_S3_DATA_SOURCE, {}).get(PATH, self.s3_path),
|
|
1104
|
+
targetBucket=job.get(TRANSFER_SPEC, {}).get(GCS_DATA_SINK, {}).get(BUCKET_NAME, self.gcs_bucket),
|
|
1105
|
+
targetPath=job.get(TRANSFER_SPEC, {}).get(GCS_DATA_SINK, {}).get(PATH, self.gcs_path),
|
|
1106
|
+
objectConditions=job.get(TRANSFER_SPEC, {}).get("objectConditions", self.object_conditions),
|
|
1107
|
+
transferOptions=job.get(TRANSFER_SPEC, {}).get("transferOptions", self.transfer_options),
|
|
1108
|
+
schedule=job.get(SCHEDULE, self.schedule),
|
|
1109
|
+
)
|
|
1110
|
+
|
|
1111
|
+
run_facet = CloudStorageTransferRunFacet(
|
|
1112
|
+
jobName=job.get(NAME),
|
|
1113
|
+
wait=self.wait,
|
|
1114
|
+
timeout=self.timeout,
|
|
1115
|
+
deferrable=self.deferrable,
|
|
1116
|
+
deleteJobAfterCompletion=self.delete_job_after_completion,
|
|
1117
|
+
)
|
|
1118
|
+
|
|
1119
|
+
return OperatorLineage(
|
|
1120
|
+
inputs=[input_ds],
|
|
1121
|
+
outputs=[output_ds],
|
|
1122
|
+
job_facets={"cloudStorageTransferJob": job_facet},
|
|
1123
|
+
run_facets={"cloudStorageTransferRun": run_facet},
|
|
1124
|
+
)
|
|
1125
|
+
|
|
1048
1126
|
|
|
1049
1127
|
class CloudDataTransferServiceGCSToGCSOperator(GoogleCloudBaseOperator):
|
|
1050
1128
|
"""
|
|
@@ -23,9 +23,11 @@ from collections.abc import Sequence
|
|
|
23
23
|
from copy import deepcopy
|
|
24
24
|
from typing import TYPE_CHECKING, Any
|
|
25
25
|
|
|
26
|
-
from
|
|
26
|
+
from google.api_core import exceptions
|
|
27
|
+
from google.cloud.compute_v1.types import Instance, InstanceGroupManager, InstanceTemplate
|
|
27
28
|
|
|
28
29
|
from airflow.exceptions import AirflowException
|
|
30
|
+
from airflow.providers.google._vendor.json_merge_patch import merge
|
|
29
31
|
from airflow.providers.google.cloud.hooks.compute import ComputeEngineHook
|
|
30
32
|
from airflow.providers.google.cloud.links.compute import (
|
|
31
33
|
ComputeInstanceDetailsLink,
|
|
@@ -36,13 +38,12 @@ from airflow.providers.google.cloud.operators.cloud_base import GoogleCloudBaseO
|
|
|
36
38
|
from airflow.providers.google.cloud.utils.field_sanitizer import GcpBodyFieldSanitizer
|
|
37
39
|
from airflow.providers.google.cloud.utils.field_validator import GcpBodyFieldValidator
|
|
38
40
|
from airflow.providers.google.common.hooks.base_google import PROVIDE_PROJECT_ID
|
|
39
|
-
from google.api_core import exceptions
|
|
40
|
-
from google.cloud.compute_v1.types import Instance, InstanceGroupManager, InstanceTemplate
|
|
41
41
|
|
|
42
42
|
if TYPE_CHECKING:
|
|
43
|
-
from airflow.utils.context import Context
|
|
44
43
|
from google.api_core.retry import Retry
|
|
45
44
|
|
|
45
|
+
from airflow.providers.common.compat.sdk import Context
|
|
46
|
+
|
|
46
47
|
|
|
47
48
|
class ComputeEngineBaseOperator(GoogleCloudBaseOperator):
|
|
48
49
|
"""Abstract base operator for Google Compute Engine operators to inherit from."""
|
|
@@ -73,6 +74,13 @@ class ComputeEngineBaseOperator(GoogleCloudBaseOperator):
|
|
|
73
74
|
if not self.zone:
|
|
74
75
|
raise AirflowException("The required parameter 'zone' is missing")
|
|
75
76
|
|
|
77
|
+
@property
|
|
78
|
+
def extra_links_params(self) -> dict[str, Any]:
|
|
79
|
+
return {
|
|
80
|
+
"location_id": self.zone,
|
|
81
|
+
"resource_id": self.resource_id,
|
|
82
|
+
}
|
|
83
|
+
|
|
76
84
|
def execute(self, context: Context):
|
|
77
85
|
pass
|
|
78
86
|
|
|
@@ -224,9 +232,6 @@ class ComputeEngineInsertInstanceOperator(ComputeEngineBaseOperator):
|
|
|
224
232
|
self.log.info("The %s Instance already exists", self.resource_id)
|
|
225
233
|
ComputeInstanceDetailsLink.persist(
|
|
226
234
|
context=context,
|
|
227
|
-
task_instance=self,
|
|
228
|
-
location_id=self.zone,
|
|
229
|
-
resource_id=self.resource_id,
|
|
230
235
|
project_id=self.project_id or hook.project_id,
|
|
231
236
|
)
|
|
232
237
|
return Instance.to_dict(existing_instance)
|
|
@@ -246,9 +251,6 @@ class ComputeEngineInsertInstanceOperator(ComputeEngineBaseOperator):
|
|
|
246
251
|
)
|
|
247
252
|
ComputeInstanceDetailsLink.persist(
|
|
248
253
|
context=context,
|
|
249
|
-
task_instance=self,
|
|
250
|
-
location_id=self.zone,
|
|
251
|
-
resource_id=self.resource_id,
|
|
252
254
|
project_id=self.project_id or hook.project_id,
|
|
253
255
|
)
|
|
254
256
|
return Instance.to_dict(new_instance)
|
|
@@ -396,9 +398,6 @@ class ComputeEngineInsertInstanceFromTemplateOperator(ComputeEngineBaseOperator)
|
|
|
396
398
|
self.log.info("The %s Instance already exists", self.resource_id)
|
|
397
399
|
ComputeInstanceDetailsLink.persist(
|
|
398
400
|
context=context,
|
|
399
|
-
task_instance=self,
|
|
400
|
-
location_id=self.zone,
|
|
401
|
-
resource_id=self.resource_id,
|
|
402
401
|
project_id=self.project_id or hook.project_id,
|
|
403
402
|
)
|
|
404
403
|
return Instance.to_dict(existing_instance)
|
|
@@ -419,9 +418,6 @@ class ComputeEngineInsertInstanceFromTemplateOperator(ComputeEngineBaseOperator)
|
|
|
419
418
|
)
|
|
420
419
|
ComputeInstanceDetailsLink.persist(
|
|
421
420
|
context=context,
|
|
422
|
-
task_instance=self,
|
|
423
|
-
location_id=self.zone,
|
|
424
|
-
resource_id=self.resource_id,
|
|
425
421
|
project_id=self.project_id or hook.project_id,
|
|
426
422
|
)
|
|
427
423
|
return Instance.to_dict(new_instance_from_template)
|
|
@@ -597,9 +593,6 @@ class ComputeEngineStartInstanceOperator(ComputeEngineBaseOperator):
|
|
|
597
593
|
)
|
|
598
594
|
ComputeInstanceDetailsLink.persist(
|
|
599
595
|
context=context,
|
|
600
|
-
task_instance=self,
|
|
601
|
-
location_id=self.zone,
|
|
602
|
-
resource_id=self.resource_id,
|
|
603
596
|
project_id=self.project_id or hook.project_id,
|
|
604
597
|
)
|
|
605
598
|
hook.start_instance(zone=self.zone, resource_id=self.resource_id, project_id=self.project_id)
|
|
@@ -658,9 +651,6 @@ class ComputeEngineStopInstanceOperator(ComputeEngineBaseOperator):
|
|
|
658
651
|
)
|
|
659
652
|
ComputeInstanceDetailsLink.persist(
|
|
660
653
|
context=context,
|
|
661
|
-
task_instance=self,
|
|
662
|
-
location_id=self.zone,
|
|
663
|
-
resource_id=self.resource_id,
|
|
664
654
|
project_id=self.project_id or hook.project_id,
|
|
665
655
|
)
|
|
666
656
|
hook.stop_instance(zone=self.zone, resource_id=self.resource_id, project_id=self.project_id)
|
|
@@ -763,9 +753,6 @@ class ComputeEngineSetMachineTypeOperator(ComputeEngineBaseOperator):
|
|
|
763
753
|
self._validate_all_body_fields()
|
|
764
754
|
ComputeInstanceDetailsLink.persist(
|
|
765
755
|
context=context,
|
|
766
|
-
task_instance=self,
|
|
767
|
-
location_id=self.zone,
|
|
768
|
-
resource_id=self.resource_id,
|
|
769
756
|
project_id=self.project_id or hook.project_id,
|
|
770
757
|
)
|
|
771
758
|
hook.set_machine_type(
|
|
@@ -971,8 +958,6 @@ class ComputeEngineInsertInstanceTemplateOperator(ComputeEngineBaseOperator):
|
|
|
971
958
|
self.log.info("The %s Template already exists.", existing_template)
|
|
972
959
|
ComputeInstanceTemplateDetailsLink.persist(
|
|
973
960
|
context=context,
|
|
974
|
-
task_instance=self,
|
|
975
|
-
resource_id=self.resource_id,
|
|
976
961
|
project_id=self.project_id or hook.project_id,
|
|
977
962
|
)
|
|
978
963
|
return InstanceTemplate.to_dict(existing_template)
|
|
@@ -990,8 +975,6 @@ class ComputeEngineInsertInstanceTemplateOperator(ComputeEngineBaseOperator):
|
|
|
990
975
|
)
|
|
991
976
|
ComputeInstanceTemplateDetailsLink.persist(
|
|
992
977
|
context=context,
|
|
993
|
-
task_instance=self,
|
|
994
|
-
resource_id=self.resource_id,
|
|
995
978
|
project_id=self.project_id or hook.project_id,
|
|
996
979
|
)
|
|
997
980
|
return InstanceTemplate.to_dict(new_template)
|
|
@@ -1237,7 +1220,6 @@ class ComputeEngineCopyInstanceTemplateOperator(ComputeEngineBaseOperator):
|
|
|
1237
1220
|
)
|
|
1238
1221
|
ComputeInstanceTemplateDetailsLink.persist(
|
|
1239
1222
|
context=context,
|
|
1240
|
-
task_instance=self,
|
|
1241
1223
|
resource_id=self.body_patch["name"],
|
|
1242
1224
|
project_id=self.project_id or hook.project_id,
|
|
1243
1225
|
)
|
|
@@ -1258,7 +1240,6 @@ class ComputeEngineCopyInstanceTemplateOperator(ComputeEngineBaseOperator):
|
|
|
1258
1240
|
)
|
|
1259
1241
|
ComputeInstanceTemplateDetailsLink.persist(
|
|
1260
1242
|
context=context,
|
|
1261
|
-
task_instance=self,
|
|
1262
1243
|
resource_id=self.body_patch["name"],
|
|
1263
1244
|
project_id=self.project_id or hook.project_id,
|
|
1264
1245
|
)
|
|
@@ -1389,9 +1370,6 @@ class ComputeEngineInstanceGroupUpdateManagerTemplateOperator(ComputeEngineBaseO
|
|
|
1389
1370
|
self.log.info("Calling patch instance template with updated body: %s", patch_body)
|
|
1390
1371
|
ComputeInstanceGroupManagerDetailsLink.persist(
|
|
1391
1372
|
context=context,
|
|
1392
|
-
task_instance=self,
|
|
1393
|
-
location_id=self.zone,
|
|
1394
|
-
resource_id=self.resource_id,
|
|
1395
1373
|
project_id=self.project_id or hook.project_id,
|
|
1396
1374
|
)
|
|
1397
1375
|
return hook.patch_instance_group_manager(
|
|
@@ -1401,16 +1379,12 @@ class ComputeEngineInstanceGroupUpdateManagerTemplateOperator(ComputeEngineBaseO
|
|
|
1401
1379
|
request_id=self.request_id,
|
|
1402
1380
|
project_id=self.project_id,
|
|
1403
1381
|
)
|
|
1404
|
-
|
|
1405
|
-
|
|
1406
|
-
|
|
1407
|
-
|
|
1408
|
-
|
|
1409
|
-
|
|
1410
|
-
resource_id=self.resource_id,
|
|
1411
|
-
project_id=self.project_id or hook.project_id,
|
|
1412
|
-
)
|
|
1413
|
-
return True
|
|
1382
|
+
# Idempotence achieved
|
|
1383
|
+
ComputeInstanceGroupManagerDetailsLink.persist(
|
|
1384
|
+
context=context,
|
|
1385
|
+
project_id=self.project_id or hook.project_id,
|
|
1386
|
+
)
|
|
1387
|
+
return True
|
|
1414
1388
|
|
|
1415
1389
|
|
|
1416
1390
|
class ComputeEngineInsertInstanceGroupManagerOperator(ComputeEngineBaseOperator):
|
|
@@ -1552,10 +1526,7 @@ class ComputeEngineInsertInstanceGroupManagerOperator(ComputeEngineBaseOperator)
|
|
|
1552
1526
|
self.log.info("The %s Instance Group Manager already exists", existing_instance_group_manager)
|
|
1553
1527
|
ComputeInstanceGroupManagerDetailsLink.persist(
|
|
1554
1528
|
context=context,
|
|
1555
|
-
task_instance=self,
|
|
1556
|
-
resource_id=self.resource_id,
|
|
1557
1529
|
project_id=self.project_id or hook.project_id,
|
|
1558
|
-
location_id=self.zone,
|
|
1559
1530
|
)
|
|
1560
1531
|
return InstanceGroupManager.to_dict(existing_instance_group_manager)
|
|
1561
1532
|
self._field_sanitizer.sanitize(self.body)
|
|
@@ -1574,9 +1545,6 @@ class ComputeEngineInsertInstanceGroupManagerOperator(ComputeEngineBaseOperator)
|
|
|
1574
1545
|
)
|
|
1575
1546
|
ComputeInstanceGroupManagerDetailsLink.persist(
|
|
1576
1547
|
context=context,
|
|
1577
|
-
task_instance=self,
|
|
1578
|
-
location_id=self.zone,
|
|
1579
|
-
resource_id=self.resource_id,
|
|
1580
1548
|
project_id=self.project_id or hook.project_id,
|
|
1581
1549
|
)
|
|
1582
1550
|
return InstanceGroupManager.to_dict(new_instance_group_manager)
|