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.
Files changed (278) hide show
  1. airflow/providers/google/3rd-party-licenses/LICENSES.txt +14 -0
  2. airflow/providers/google/3rd-party-licenses/NOTICE +5 -0
  3. airflow/providers/google/__init__.py +3 -3
  4. airflow/providers/google/_vendor/__init__.py +0 -0
  5. airflow/providers/google/_vendor/json_merge_patch.py +91 -0
  6. airflow/providers/google/ads/hooks/ads.py +52 -43
  7. airflow/providers/google/ads/operators/ads.py +2 -2
  8. airflow/providers/google/ads/transfers/ads_to_gcs.py +3 -19
  9. airflow/providers/google/assets/gcs.py +1 -11
  10. airflow/providers/google/cloud/_internal_client/secret_manager_client.py +3 -2
  11. airflow/providers/google/cloud/bundles/gcs.py +161 -0
  12. airflow/providers/google/cloud/hooks/alloy_db.py +2 -3
  13. airflow/providers/google/cloud/hooks/bigquery.py +195 -318
  14. airflow/providers/google/cloud/hooks/bigquery_dts.py +8 -8
  15. airflow/providers/google/cloud/hooks/bigtable.py +3 -2
  16. airflow/providers/google/cloud/hooks/cloud_batch.py +8 -9
  17. airflow/providers/google/cloud/hooks/cloud_build.py +6 -65
  18. airflow/providers/google/cloud/hooks/cloud_composer.py +292 -24
  19. airflow/providers/google/cloud/hooks/cloud_logging.py +109 -0
  20. airflow/providers/google/cloud/hooks/cloud_memorystore.py +4 -3
  21. airflow/providers/google/cloud/hooks/cloud_run.py +20 -11
  22. airflow/providers/google/cloud/hooks/cloud_sql.py +136 -64
  23. airflow/providers/google/cloud/hooks/cloud_storage_transfer_service.py +35 -15
  24. airflow/providers/google/cloud/hooks/compute.py +7 -6
  25. airflow/providers/google/cloud/hooks/compute_ssh.py +7 -4
  26. airflow/providers/google/cloud/hooks/datacatalog.py +12 -3
  27. airflow/providers/google/cloud/hooks/dataflow.py +87 -242
  28. airflow/providers/google/cloud/hooks/dataform.py +9 -14
  29. airflow/providers/google/cloud/hooks/datafusion.py +7 -9
  30. airflow/providers/google/cloud/hooks/dataplex.py +13 -12
  31. airflow/providers/google/cloud/hooks/dataprep.py +2 -2
  32. airflow/providers/google/cloud/hooks/dataproc.py +76 -74
  33. airflow/providers/google/cloud/hooks/dataproc_metastore.py +4 -3
  34. airflow/providers/google/cloud/hooks/dlp.py +5 -4
  35. airflow/providers/google/cloud/hooks/gcs.py +144 -33
  36. airflow/providers/google/cloud/hooks/gen_ai.py +196 -0
  37. airflow/providers/google/cloud/hooks/kms.py +3 -2
  38. airflow/providers/google/cloud/hooks/kubernetes_engine.py +22 -17
  39. airflow/providers/google/cloud/hooks/looker.py +6 -1
  40. airflow/providers/google/cloud/hooks/managed_kafka.py +227 -3
  41. airflow/providers/google/cloud/hooks/mlengine.py +7 -8
  42. airflow/providers/google/cloud/hooks/natural_language.py +3 -2
  43. airflow/providers/google/cloud/hooks/os_login.py +3 -2
  44. airflow/providers/google/cloud/hooks/pubsub.py +6 -6
  45. airflow/providers/google/cloud/hooks/secret_manager.py +105 -12
  46. airflow/providers/google/cloud/hooks/spanner.py +75 -10
  47. airflow/providers/google/cloud/hooks/speech_to_text.py +3 -2
  48. airflow/providers/google/cloud/hooks/stackdriver.py +18 -18
  49. airflow/providers/google/cloud/hooks/tasks.py +4 -3
  50. airflow/providers/google/cloud/hooks/text_to_speech.py +3 -2
  51. airflow/providers/google/cloud/hooks/translate.py +8 -17
  52. airflow/providers/google/cloud/hooks/vertex_ai/auto_ml.py +8 -222
  53. airflow/providers/google/cloud/hooks/vertex_ai/batch_prediction_job.py +9 -15
  54. airflow/providers/google/cloud/hooks/vertex_ai/custom_job.py +33 -283
  55. airflow/providers/google/cloud/hooks/vertex_ai/dataset.py +5 -12
  56. airflow/providers/google/cloud/hooks/vertex_ai/endpoint_service.py +6 -12
  57. airflow/providers/google/cloud/hooks/vertex_ai/experiment_service.py +202 -0
  58. airflow/providers/google/cloud/hooks/vertex_ai/feature_store.py +311 -10
  59. airflow/providers/google/cloud/hooks/vertex_ai/generative_model.py +79 -75
  60. airflow/providers/google/cloud/hooks/vertex_ai/hyperparameter_tuning_job.py +7 -13
  61. airflow/providers/google/cloud/hooks/vertex_ai/model_service.py +8 -12
  62. airflow/providers/google/cloud/hooks/vertex_ai/pipeline_job.py +6 -12
  63. airflow/providers/google/cloud/hooks/vertex_ai/prediction_service.py +3 -2
  64. airflow/providers/google/cloud/hooks/vertex_ai/ray.py +223 -0
  65. airflow/providers/google/cloud/hooks/video_intelligence.py +3 -2
  66. airflow/providers/google/cloud/hooks/vision.py +7 -7
  67. airflow/providers/google/cloud/hooks/workflows.py +4 -3
  68. airflow/providers/google/cloud/links/alloy_db.py +0 -46
  69. airflow/providers/google/cloud/links/base.py +77 -7
  70. airflow/providers/google/cloud/links/bigquery.py +0 -47
  71. airflow/providers/google/cloud/links/bigquery_dts.py +0 -20
  72. airflow/providers/google/cloud/links/bigtable.py +0 -48
  73. airflow/providers/google/cloud/links/cloud_build.py +0 -73
  74. airflow/providers/google/cloud/links/cloud_functions.py +0 -33
  75. airflow/providers/google/cloud/links/cloud_memorystore.py +0 -58
  76. airflow/providers/google/cloud/links/{life_sciences.py → cloud_run.py} +5 -27
  77. airflow/providers/google/cloud/links/cloud_sql.py +0 -33
  78. airflow/providers/google/cloud/links/cloud_storage_transfer.py +17 -46
  79. airflow/providers/google/cloud/links/cloud_tasks.py +7 -26
  80. airflow/providers/google/cloud/links/compute.py +0 -58
  81. airflow/providers/google/cloud/links/data_loss_prevention.py +0 -169
  82. airflow/providers/google/cloud/links/datacatalog.py +23 -54
  83. airflow/providers/google/cloud/links/dataflow.py +0 -34
  84. airflow/providers/google/cloud/links/dataform.py +0 -64
  85. airflow/providers/google/cloud/links/datafusion.py +1 -90
  86. airflow/providers/google/cloud/links/dataplex.py +0 -154
  87. airflow/providers/google/cloud/links/dataprep.py +0 -24
  88. airflow/providers/google/cloud/links/dataproc.py +11 -89
  89. airflow/providers/google/cloud/links/datastore.py +0 -31
  90. airflow/providers/google/cloud/links/kubernetes_engine.py +11 -61
  91. airflow/providers/google/cloud/links/managed_kafka.py +11 -51
  92. airflow/providers/google/cloud/links/mlengine.py +0 -70
  93. airflow/providers/google/cloud/links/pubsub.py +0 -32
  94. airflow/providers/google/cloud/links/spanner.py +0 -33
  95. airflow/providers/google/cloud/links/stackdriver.py +0 -30
  96. airflow/providers/google/cloud/links/translate.py +17 -187
  97. airflow/providers/google/cloud/links/vertex_ai.py +28 -195
  98. airflow/providers/google/cloud/links/workflows.py +0 -52
  99. airflow/providers/google/cloud/log/gcs_task_handler.py +166 -118
  100. airflow/providers/google/cloud/log/stackdriver_task_handler.py +14 -9
  101. airflow/providers/google/cloud/openlineage/CloudStorageTransferJobFacet.json +68 -0
  102. airflow/providers/google/cloud/openlineage/CloudStorageTransferRunFacet.json +60 -0
  103. airflow/providers/google/cloud/openlineage/DataFusionRunFacet.json +32 -0
  104. airflow/providers/google/cloud/openlineage/facets.py +141 -40
  105. airflow/providers/google/cloud/openlineage/mixins.py +14 -13
  106. airflow/providers/google/cloud/openlineage/utils.py +19 -3
  107. airflow/providers/google/cloud/operators/alloy_db.py +76 -61
  108. airflow/providers/google/cloud/operators/bigquery.py +104 -667
  109. airflow/providers/google/cloud/operators/bigquery_dts.py +12 -12
  110. airflow/providers/google/cloud/operators/bigtable.py +38 -7
  111. airflow/providers/google/cloud/operators/cloud_base.py +22 -1
  112. airflow/providers/google/cloud/operators/cloud_batch.py +18 -18
  113. airflow/providers/google/cloud/operators/cloud_build.py +80 -36
  114. airflow/providers/google/cloud/operators/cloud_composer.py +157 -71
  115. airflow/providers/google/cloud/operators/cloud_logging_sink.py +341 -0
  116. airflow/providers/google/cloud/operators/cloud_memorystore.py +74 -46
  117. airflow/providers/google/cloud/operators/cloud_run.py +39 -20
  118. airflow/providers/google/cloud/operators/cloud_sql.py +46 -61
  119. airflow/providers/google/cloud/operators/cloud_storage_transfer_service.py +92 -14
  120. airflow/providers/google/cloud/operators/compute.py +18 -50
  121. airflow/providers/google/cloud/operators/datacatalog.py +167 -29
  122. airflow/providers/google/cloud/operators/dataflow.py +38 -15
  123. airflow/providers/google/cloud/operators/dataform.py +19 -7
  124. airflow/providers/google/cloud/operators/datafusion.py +43 -43
  125. airflow/providers/google/cloud/operators/dataplex.py +212 -126
  126. airflow/providers/google/cloud/operators/dataprep.py +1 -5
  127. airflow/providers/google/cloud/operators/dataproc.py +134 -207
  128. airflow/providers/google/cloud/operators/dataproc_metastore.py +102 -84
  129. airflow/providers/google/cloud/operators/datastore.py +22 -6
  130. airflow/providers/google/cloud/operators/dlp.py +24 -45
  131. airflow/providers/google/cloud/operators/functions.py +21 -14
  132. airflow/providers/google/cloud/operators/gcs.py +15 -12
  133. airflow/providers/google/cloud/operators/gen_ai.py +389 -0
  134. airflow/providers/google/cloud/operators/kubernetes_engine.py +115 -106
  135. airflow/providers/google/cloud/operators/looker.py +1 -1
  136. airflow/providers/google/cloud/operators/managed_kafka.py +362 -40
  137. airflow/providers/google/cloud/operators/natural_language.py +5 -3
  138. airflow/providers/google/cloud/operators/pubsub.py +69 -21
  139. airflow/providers/google/cloud/operators/spanner.py +53 -45
  140. airflow/providers/google/cloud/operators/speech_to_text.py +5 -4
  141. airflow/providers/google/cloud/operators/stackdriver.py +5 -11
  142. airflow/providers/google/cloud/operators/tasks.py +6 -15
  143. airflow/providers/google/cloud/operators/text_to_speech.py +4 -3
  144. airflow/providers/google/cloud/operators/translate.py +46 -20
  145. airflow/providers/google/cloud/operators/translate_speech.py +4 -3
  146. airflow/providers/google/cloud/operators/vertex_ai/auto_ml.py +44 -34
  147. airflow/providers/google/cloud/operators/vertex_ai/batch_prediction_job.py +34 -12
  148. airflow/providers/google/cloud/operators/vertex_ai/custom_job.py +62 -53
  149. airflow/providers/google/cloud/operators/vertex_ai/dataset.py +75 -11
  150. airflow/providers/google/cloud/operators/vertex_ai/endpoint_service.py +48 -12
  151. airflow/providers/google/cloud/operators/vertex_ai/experiment_service.py +435 -0
  152. airflow/providers/google/cloud/operators/vertex_ai/feature_store.py +532 -1
  153. airflow/providers/google/cloud/operators/vertex_ai/generative_model.py +135 -116
  154. airflow/providers/google/cloud/operators/vertex_ai/hyperparameter_tuning_job.py +16 -12
  155. airflow/providers/google/cloud/operators/vertex_ai/model_service.py +62 -14
  156. airflow/providers/google/cloud/operators/vertex_ai/pipeline_job.py +35 -10
  157. airflow/providers/google/cloud/operators/vertex_ai/ray.py +393 -0
  158. airflow/providers/google/cloud/operators/video_intelligence.py +5 -3
  159. airflow/providers/google/cloud/operators/vision.py +7 -5
  160. airflow/providers/google/cloud/operators/workflows.py +24 -19
  161. airflow/providers/google/cloud/secrets/secret_manager.py +2 -1
  162. airflow/providers/google/cloud/sensors/bigquery.py +2 -2
  163. airflow/providers/google/cloud/sensors/bigquery_dts.py +6 -4
  164. airflow/providers/google/cloud/sensors/bigtable.py +14 -6
  165. airflow/providers/google/cloud/sensors/cloud_composer.py +535 -33
  166. airflow/providers/google/cloud/sensors/cloud_storage_transfer_service.py +6 -5
  167. airflow/providers/google/cloud/sensors/dataflow.py +27 -10
  168. airflow/providers/google/cloud/sensors/dataform.py +2 -2
  169. airflow/providers/google/cloud/sensors/datafusion.py +4 -4
  170. airflow/providers/google/cloud/sensors/dataplex.py +7 -5
  171. airflow/providers/google/cloud/sensors/dataprep.py +2 -2
  172. airflow/providers/google/cloud/sensors/dataproc.py +10 -9
  173. airflow/providers/google/cloud/sensors/dataproc_metastore.py +4 -3
  174. airflow/providers/google/cloud/sensors/gcs.py +22 -21
  175. airflow/providers/google/cloud/sensors/looker.py +5 -5
  176. airflow/providers/google/cloud/sensors/pubsub.py +20 -20
  177. airflow/providers/google/cloud/sensors/tasks.py +2 -2
  178. airflow/providers/google/cloud/sensors/vertex_ai/feature_store.py +2 -2
  179. airflow/providers/google/cloud/sensors/workflows.py +6 -4
  180. airflow/providers/google/cloud/transfers/adls_to_gcs.py +1 -1
  181. airflow/providers/google/cloud/transfers/azure_blob_to_gcs.py +2 -2
  182. airflow/providers/google/cloud/transfers/azure_fileshare_to_gcs.py +2 -2
  183. airflow/providers/google/cloud/transfers/bigquery_to_bigquery.py +11 -8
  184. airflow/providers/google/cloud/transfers/bigquery_to_gcs.py +14 -13
  185. airflow/providers/google/cloud/transfers/bigquery_to_mssql.py +7 -3
  186. airflow/providers/google/cloud/transfers/bigquery_to_mysql.py +12 -1
  187. airflow/providers/google/cloud/transfers/bigquery_to_postgres.py +24 -10
  188. airflow/providers/google/cloud/transfers/bigquery_to_sql.py +104 -5
  189. airflow/providers/google/cloud/transfers/calendar_to_gcs.py +1 -1
  190. airflow/providers/google/cloud/transfers/cassandra_to_gcs.py +18 -22
  191. airflow/providers/google/cloud/transfers/facebook_ads_to_gcs.py +4 -5
  192. airflow/providers/google/cloud/transfers/gcs_to_bigquery.py +45 -38
  193. airflow/providers/google/cloud/transfers/gcs_to_gcs.py +2 -2
  194. airflow/providers/google/cloud/transfers/gcs_to_local.py +5 -3
  195. airflow/providers/google/cloud/transfers/gcs_to_sftp.py +10 -4
  196. airflow/providers/google/cloud/transfers/gdrive_to_gcs.py +6 -2
  197. airflow/providers/google/cloud/transfers/gdrive_to_local.py +2 -2
  198. airflow/providers/google/cloud/transfers/http_to_gcs.py +193 -0
  199. airflow/providers/google/cloud/transfers/local_to_gcs.py +2 -2
  200. airflow/providers/google/cloud/transfers/mssql_to_gcs.py +1 -1
  201. airflow/providers/google/cloud/transfers/oracle_to_gcs.py +36 -11
  202. airflow/providers/google/cloud/transfers/postgres_to_gcs.py +44 -12
  203. airflow/providers/google/cloud/transfers/s3_to_gcs.py +12 -6
  204. airflow/providers/google/cloud/transfers/salesforce_to_gcs.py +2 -2
  205. airflow/providers/google/cloud/transfers/sftp_to_gcs.py +36 -14
  206. airflow/providers/google/cloud/transfers/sheets_to_gcs.py +3 -3
  207. airflow/providers/google/cloud/transfers/sql_to_gcs.py +10 -10
  208. airflow/providers/google/cloud/triggers/bigquery.py +75 -34
  209. airflow/providers/google/cloud/triggers/bigquery_dts.py +2 -1
  210. airflow/providers/google/cloud/triggers/cloud_batch.py +2 -1
  211. airflow/providers/google/cloud/triggers/cloud_build.py +3 -2
  212. airflow/providers/google/cloud/triggers/cloud_composer.py +303 -47
  213. airflow/providers/google/cloud/triggers/cloud_run.py +2 -2
  214. airflow/providers/google/cloud/triggers/cloud_storage_transfer_service.py +96 -5
  215. airflow/providers/google/cloud/triggers/dataflow.py +125 -2
  216. airflow/providers/google/cloud/triggers/datafusion.py +1 -1
  217. airflow/providers/google/cloud/triggers/dataplex.py +16 -3
  218. airflow/providers/google/cloud/triggers/dataproc.py +124 -53
  219. airflow/providers/google/cloud/triggers/kubernetes_engine.py +46 -28
  220. airflow/providers/google/cloud/triggers/mlengine.py +1 -1
  221. airflow/providers/google/cloud/triggers/pubsub.py +17 -20
  222. airflow/providers/google/cloud/triggers/vertex_ai.py +8 -7
  223. airflow/providers/google/cloud/utils/bigquery.py +5 -7
  224. airflow/providers/google/cloud/utils/bigquery_get_data.py +1 -1
  225. airflow/providers/google/cloud/utils/credentials_provider.py +4 -3
  226. airflow/providers/google/cloud/utils/dataform.py +1 -1
  227. airflow/providers/google/cloud/utils/external_token_supplier.py +0 -1
  228. airflow/providers/google/cloud/utils/field_validator.py +1 -2
  229. airflow/providers/google/cloud/utils/validators.py +43 -0
  230. airflow/providers/google/common/auth_backend/google_openid.py +26 -9
  231. airflow/providers/google/common/consts.py +2 -1
  232. airflow/providers/google/common/deprecated.py +2 -1
  233. airflow/providers/google/common/hooks/base_google.py +40 -43
  234. airflow/providers/google/common/hooks/operation_helpers.py +78 -0
  235. airflow/providers/google/common/links/storage.py +0 -22
  236. airflow/providers/google/common/utils/get_secret.py +31 -0
  237. airflow/providers/google/common/utils/id_token_credentials.py +4 -5
  238. airflow/providers/google/firebase/operators/firestore.py +2 -2
  239. airflow/providers/google/get_provider_info.py +61 -216
  240. airflow/providers/google/go_module_utils.py +35 -3
  241. airflow/providers/google/leveldb/hooks/leveldb.py +30 -6
  242. airflow/providers/google/leveldb/operators/leveldb.py +2 -2
  243. airflow/providers/google/marketing_platform/hooks/analytics_admin.py +3 -2
  244. airflow/providers/google/marketing_platform/hooks/display_video.py +3 -109
  245. airflow/providers/google/marketing_platform/hooks/search_ads.py +1 -1
  246. airflow/providers/google/marketing_platform/links/analytics_admin.py +4 -5
  247. airflow/providers/google/marketing_platform/operators/analytics_admin.py +7 -6
  248. airflow/providers/google/marketing_platform/operators/campaign_manager.py +5 -5
  249. airflow/providers/google/marketing_platform/operators/display_video.py +28 -489
  250. airflow/providers/google/marketing_platform/operators/search_ads.py +2 -2
  251. airflow/providers/google/marketing_platform/sensors/campaign_manager.py +2 -2
  252. airflow/providers/google/marketing_platform/sensors/display_video.py +4 -64
  253. airflow/providers/google/suite/hooks/calendar.py +1 -1
  254. airflow/providers/google/suite/hooks/drive.py +2 -2
  255. airflow/providers/google/suite/hooks/sheets.py +15 -1
  256. airflow/providers/google/suite/operators/sheets.py +8 -3
  257. airflow/providers/google/suite/sensors/drive.py +2 -2
  258. airflow/providers/google/suite/transfers/gcs_to_gdrive.py +2 -2
  259. airflow/providers/google/suite/transfers/gcs_to_sheets.py +1 -1
  260. airflow/providers/google/suite/transfers/local_to_drive.py +3 -3
  261. airflow/providers/google/suite/transfers/sql_to_sheets.py +5 -4
  262. airflow/providers/google/version_compat.py +15 -1
  263. {apache_airflow_providers_google-14.0.0.dist-info → apache_airflow_providers_google-19.1.0rc1.dist-info}/METADATA +117 -72
  264. apache_airflow_providers_google-19.1.0rc1.dist-info/RECORD +331 -0
  265. {apache_airflow_providers_google-14.0.0.dist-info → apache_airflow_providers_google-19.1.0rc1.dist-info}/WHEEL +1 -1
  266. apache_airflow_providers_google-19.1.0rc1.dist-info/licenses/NOTICE +5 -0
  267. airflow/providers/google/cloud/example_dags/example_cloud_task.py +0 -54
  268. airflow/providers/google/cloud/hooks/automl.py +0 -679
  269. airflow/providers/google/cloud/hooks/life_sciences.py +0 -159
  270. airflow/providers/google/cloud/links/automl.py +0 -193
  271. airflow/providers/google/cloud/operators/automl.py +0 -1360
  272. airflow/providers/google/cloud/operators/life_sciences.py +0 -119
  273. airflow/providers/google/cloud/operators/mlengine.py +0 -1515
  274. airflow/providers/google/cloud/utils/mlengine_operator_utils.py +0 -273
  275. apache_airflow_providers_google-14.0.0.dist-info/RECORD +0 -318
  276. /airflow/providers/google/cloud/{example_dags → bundles}/__init__.py +0 -0
  277. {apache_airflow_providers_google-14.0.0.dist-info → apache_airflow_providers_google-19.1.0rc1.dist-info}/entry_points.txt +0 -0
  278. {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.utils.context import Context
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 # type: ignore[attr-defined]
100
- aws_secret_access_key = aws_credentials.secret_key # type: ignore[attr-defined]
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
- job = hook.create_transfer_job(body=body)
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(job, timeout=self.timeout)
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=job[NAME], project_id=self.project_id)
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=job[NAME],
998
- project_id=job[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 json_merge_patch import merge
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
- else:
1405
- # Idempotence achieved
1406
- ComputeInstanceGroupManagerDetailsLink.persist(
1407
- context=context,
1408
- task_instance=self,
1409
- location_id=self.zone,
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)