apache-airflow-providers-google 15.1.0rc1__py3-none-any.whl → 19.3.0__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 (257) hide show
  1. airflow/providers/google/3rd-party-licenses/NOTICE +2 -12
  2. airflow/providers/google/__init__.py +3 -3
  3. airflow/providers/google/ads/hooks/ads.py +39 -6
  4. airflow/providers/google/ads/operators/ads.py +2 -2
  5. airflow/providers/google/ads/transfers/ads_to_gcs.py +2 -2
  6. airflow/providers/google/assets/gcs.py +1 -11
  7. airflow/providers/google/cloud/bundles/__init__.py +16 -0
  8. airflow/providers/google/cloud/bundles/gcs.py +161 -0
  9. airflow/providers/google/cloud/hooks/alloy_db.py +1 -1
  10. airflow/providers/google/cloud/hooks/bigquery.py +176 -293
  11. airflow/providers/google/cloud/hooks/cloud_batch.py +1 -1
  12. airflow/providers/google/cloud/hooks/cloud_build.py +1 -1
  13. airflow/providers/google/cloud/hooks/cloud_composer.py +288 -15
  14. airflow/providers/google/cloud/hooks/cloud_logging.py +109 -0
  15. airflow/providers/google/cloud/hooks/cloud_memorystore.py +1 -1
  16. airflow/providers/google/cloud/hooks/cloud_run.py +18 -10
  17. airflow/providers/google/cloud/hooks/cloud_sql.py +102 -23
  18. airflow/providers/google/cloud/hooks/cloud_storage_transfer_service.py +29 -7
  19. airflow/providers/google/cloud/hooks/compute.py +1 -1
  20. airflow/providers/google/cloud/hooks/compute_ssh.py +6 -2
  21. airflow/providers/google/cloud/hooks/datacatalog.py +10 -1
  22. airflow/providers/google/cloud/hooks/dataflow.py +72 -95
  23. airflow/providers/google/cloud/hooks/dataform.py +1 -1
  24. airflow/providers/google/cloud/hooks/datafusion.py +21 -19
  25. airflow/providers/google/cloud/hooks/dataplex.py +2 -2
  26. airflow/providers/google/cloud/hooks/dataprep.py +1 -1
  27. airflow/providers/google/cloud/hooks/dataproc.py +73 -72
  28. airflow/providers/google/cloud/hooks/dataproc_metastore.py +1 -1
  29. airflow/providers/google/cloud/hooks/dlp.py +1 -1
  30. airflow/providers/google/cloud/hooks/functions.py +1 -1
  31. airflow/providers/google/cloud/hooks/gcs.py +112 -15
  32. airflow/providers/google/cloud/hooks/gdm.py +1 -1
  33. airflow/providers/google/cloud/hooks/gen_ai.py +196 -0
  34. airflow/providers/google/cloud/hooks/kubernetes_engine.py +3 -3
  35. airflow/providers/google/cloud/hooks/looker.py +6 -2
  36. airflow/providers/google/cloud/hooks/managed_kafka.py +1 -1
  37. airflow/providers/google/cloud/hooks/mlengine.py +4 -3
  38. airflow/providers/google/cloud/hooks/pubsub.py +3 -0
  39. airflow/providers/google/cloud/hooks/secret_manager.py +102 -10
  40. airflow/providers/google/cloud/hooks/spanner.py +74 -9
  41. airflow/providers/google/cloud/hooks/stackdriver.py +11 -9
  42. airflow/providers/google/cloud/hooks/tasks.py +1 -1
  43. airflow/providers/google/cloud/hooks/translate.py +2 -2
  44. airflow/providers/google/cloud/hooks/vertex_ai/auto_ml.py +2 -210
  45. airflow/providers/google/cloud/hooks/vertex_ai/batch_prediction_job.py +3 -3
  46. airflow/providers/google/cloud/hooks/vertex_ai/custom_job.py +28 -2
  47. airflow/providers/google/cloud/hooks/vertex_ai/experiment_service.py +202 -0
  48. airflow/providers/google/cloud/hooks/vertex_ai/feature_store.py +308 -8
  49. airflow/providers/google/cloud/hooks/vertex_ai/generative_model.py +79 -75
  50. airflow/providers/google/cloud/hooks/vertex_ai/hyperparameter_tuning_job.py +1 -1
  51. airflow/providers/google/cloud/hooks/vertex_ai/model_service.py +1 -1
  52. airflow/providers/google/cloud/hooks/vertex_ai/pipeline_job.py +1 -1
  53. airflow/providers/google/cloud/hooks/vertex_ai/ray.py +223 -0
  54. airflow/providers/google/cloud/hooks/vision.py +3 -3
  55. airflow/providers/google/cloud/hooks/workflows.py +1 -1
  56. airflow/providers/google/cloud/links/alloy_db.py +0 -46
  57. airflow/providers/google/cloud/links/base.py +77 -13
  58. airflow/providers/google/cloud/links/bigquery.py +0 -47
  59. airflow/providers/google/cloud/links/bigquery_dts.py +0 -20
  60. airflow/providers/google/cloud/links/bigtable.py +0 -48
  61. airflow/providers/google/cloud/links/cloud_build.py +0 -73
  62. airflow/providers/google/cloud/links/cloud_functions.py +0 -33
  63. airflow/providers/google/cloud/links/cloud_memorystore.py +0 -58
  64. airflow/providers/google/cloud/links/{life_sciences.py → cloud_run.py} +5 -27
  65. airflow/providers/google/cloud/links/cloud_sql.py +0 -33
  66. airflow/providers/google/cloud/links/cloud_storage_transfer.py +17 -44
  67. airflow/providers/google/cloud/links/cloud_tasks.py +7 -26
  68. airflow/providers/google/cloud/links/compute.py +0 -58
  69. airflow/providers/google/cloud/links/data_loss_prevention.py +0 -169
  70. airflow/providers/google/cloud/links/datacatalog.py +23 -54
  71. airflow/providers/google/cloud/links/dataflow.py +0 -34
  72. airflow/providers/google/cloud/links/dataform.py +0 -64
  73. airflow/providers/google/cloud/links/datafusion.py +1 -96
  74. airflow/providers/google/cloud/links/dataplex.py +0 -154
  75. airflow/providers/google/cloud/links/dataprep.py +0 -24
  76. airflow/providers/google/cloud/links/dataproc.py +11 -95
  77. airflow/providers/google/cloud/links/datastore.py +0 -31
  78. airflow/providers/google/cloud/links/kubernetes_engine.py +9 -60
  79. airflow/providers/google/cloud/links/managed_kafka.py +0 -70
  80. airflow/providers/google/cloud/links/mlengine.py +0 -70
  81. airflow/providers/google/cloud/links/pubsub.py +0 -32
  82. airflow/providers/google/cloud/links/spanner.py +0 -33
  83. airflow/providers/google/cloud/links/stackdriver.py +0 -30
  84. airflow/providers/google/cloud/links/translate.py +17 -187
  85. airflow/providers/google/cloud/links/vertex_ai.py +28 -195
  86. airflow/providers/google/cloud/links/workflows.py +0 -52
  87. airflow/providers/google/cloud/log/gcs_task_handler.py +58 -22
  88. airflow/providers/google/cloud/log/stackdriver_task_handler.py +9 -6
  89. airflow/providers/google/cloud/openlineage/CloudStorageTransferJobFacet.json +68 -0
  90. airflow/providers/google/cloud/openlineage/CloudStorageTransferRunFacet.json +60 -0
  91. airflow/providers/google/cloud/openlineage/DataFusionRunFacet.json +32 -0
  92. airflow/providers/google/cloud/openlineage/facets.py +102 -1
  93. airflow/providers/google/cloud/openlineage/mixins.py +10 -8
  94. airflow/providers/google/cloud/openlineage/utils.py +15 -1
  95. airflow/providers/google/cloud/operators/alloy_db.py +71 -56
  96. airflow/providers/google/cloud/operators/bigquery.py +73 -636
  97. airflow/providers/google/cloud/operators/bigquery_dts.py +4 -6
  98. airflow/providers/google/cloud/operators/bigtable.py +37 -8
  99. airflow/providers/google/cloud/operators/cloud_base.py +21 -1
  100. airflow/providers/google/cloud/operators/cloud_batch.py +3 -3
  101. airflow/providers/google/cloud/operators/cloud_build.py +76 -33
  102. airflow/providers/google/cloud/operators/cloud_composer.py +129 -41
  103. airflow/providers/google/cloud/operators/cloud_logging_sink.py +341 -0
  104. airflow/providers/google/cloud/operators/cloud_memorystore.py +69 -43
  105. airflow/providers/google/cloud/operators/cloud_run.py +24 -6
  106. airflow/providers/google/cloud/operators/cloud_sql.py +8 -17
  107. airflow/providers/google/cloud/operators/cloud_storage_transfer_service.py +93 -12
  108. airflow/providers/google/cloud/operators/compute.py +9 -41
  109. airflow/providers/google/cloud/operators/datacatalog.py +157 -21
  110. airflow/providers/google/cloud/operators/dataflow.py +40 -16
  111. airflow/providers/google/cloud/operators/dataform.py +15 -5
  112. airflow/providers/google/cloud/operators/datafusion.py +42 -21
  113. airflow/providers/google/cloud/operators/dataplex.py +194 -110
  114. airflow/providers/google/cloud/operators/dataprep.py +1 -5
  115. airflow/providers/google/cloud/operators/dataproc.py +80 -36
  116. airflow/providers/google/cloud/operators/dataproc_metastore.py +97 -89
  117. airflow/providers/google/cloud/operators/datastore.py +23 -7
  118. airflow/providers/google/cloud/operators/dlp.py +6 -29
  119. airflow/providers/google/cloud/operators/functions.py +17 -8
  120. airflow/providers/google/cloud/operators/gcs.py +12 -9
  121. airflow/providers/google/cloud/operators/gen_ai.py +389 -0
  122. airflow/providers/google/cloud/operators/kubernetes_engine.py +62 -100
  123. airflow/providers/google/cloud/operators/looker.py +2 -2
  124. airflow/providers/google/cloud/operators/managed_kafka.py +108 -53
  125. airflow/providers/google/cloud/operators/natural_language.py +1 -1
  126. airflow/providers/google/cloud/operators/pubsub.py +68 -15
  127. airflow/providers/google/cloud/operators/spanner.py +26 -13
  128. airflow/providers/google/cloud/operators/speech_to_text.py +2 -3
  129. airflow/providers/google/cloud/operators/stackdriver.py +1 -9
  130. airflow/providers/google/cloud/operators/tasks.py +1 -12
  131. airflow/providers/google/cloud/operators/text_to_speech.py +2 -3
  132. airflow/providers/google/cloud/operators/translate.py +41 -17
  133. airflow/providers/google/cloud/operators/translate_speech.py +2 -3
  134. airflow/providers/google/cloud/operators/vertex_ai/auto_ml.py +39 -19
  135. airflow/providers/google/cloud/operators/vertex_ai/batch_prediction_job.py +30 -10
  136. airflow/providers/google/cloud/operators/vertex_ai/custom_job.py +55 -27
  137. airflow/providers/google/cloud/operators/vertex_ai/dataset.py +70 -8
  138. airflow/providers/google/cloud/operators/vertex_ai/endpoint_service.py +43 -9
  139. airflow/providers/google/cloud/operators/vertex_ai/experiment_service.py +435 -0
  140. airflow/providers/google/cloud/operators/vertex_ai/feature_store.py +532 -1
  141. airflow/providers/google/cloud/operators/vertex_ai/generative_model.py +135 -115
  142. airflow/providers/google/cloud/operators/vertex_ai/hyperparameter_tuning_job.py +12 -10
  143. airflow/providers/google/cloud/operators/vertex_ai/model_service.py +57 -11
  144. airflow/providers/google/cloud/operators/vertex_ai/pipeline_job.py +31 -8
  145. airflow/providers/google/cloud/operators/vertex_ai/ray.py +393 -0
  146. airflow/providers/google/cloud/operators/video_intelligence.py +1 -1
  147. airflow/providers/google/cloud/operators/vision.py +2 -2
  148. airflow/providers/google/cloud/operators/workflows.py +18 -15
  149. airflow/providers/google/cloud/secrets/secret_manager.py +3 -2
  150. airflow/providers/google/cloud/sensors/bigquery.py +3 -3
  151. airflow/providers/google/cloud/sensors/bigquery_dts.py +2 -3
  152. airflow/providers/google/cloud/sensors/bigtable.py +11 -4
  153. airflow/providers/google/cloud/sensors/cloud_composer.py +533 -30
  154. airflow/providers/google/cloud/sensors/cloud_storage_transfer_service.py +2 -3
  155. airflow/providers/google/cloud/sensors/dataflow.py +26 -10
  156. airflow/providers/google/cloud/sensors/dataform.py +2 -3
  157. airflow/providers/google/cloud/sensors/datafusion.py +4 -5
  158. airflow/providers/google/cloud/sensors/dataplex.py +2 -3
  159. airflow/providers/google/cloud/sensors/dataprep.py +2 -2
  160. airflow/providers/google/cloud/sensors/dataproc.py +2 -3
  161. airflow/providers/google/cloud/sensors/dataproc_metastore.py +2 -3
  162. airflow/providers/google/cloud/sensors/gcs.py +4 -5
  163. airflow/providers/google/cloud/sensors/looker.py +2 -3
  164. airflow/providers/google/cloud/sensors/pubsub.py +4 -5
  165. airflow/providers/google/cloud/sensors/tasks.py +2 -2
  166. airflow/providers/google/cloud/sensors/vertex_ai/feature_store.py +2 -3
  167. airflow/providers/google/cloud/sensors/workflows.py +2 -3
  168. airflow/providers/google/cloud/transfers/adls_to_gcs.py +1 -1
  169. airflow/providers/google/cloud/transfers/azure_blob_to_gcs.py +2 -2
  170. airflow/providers/google/cloud/transfers/azure_fileshare_to_gcs.py +4 -3
  171. airflow/providers/google/cloud/transfers/bigquery_to_bigquery.py +11 -8
  172. airflow/providers/google/cloud/transfers/bigquery_to_gcs.py +10 -5
  173. airflow/providers/google/cloud/transfers/bigquery_to_mssql.py +7 -3
  174. airflow/providers/google/cloud/transfers/bigquery_to_mysql.py +12 -1
  175. airflow/providers/google/cloud/transfers/bigquery_to_postgres.py +24 -10
  176. airflow/providers/google/cloud/transfers/bigquery_to_sql.py +104 -5
  177. airflow/providers/google/cloud/transfers/calendar_to_gcs.py +1 -1
  178. airflow/providers/google/cloud/transfers/cassandra_to_gcs.py +3 -3
  179. airflow/providers/google/cloud/transfers/facebook_ads_to_gcs.py +4 -4
  180. airflow/providers/google/cloud/transfers/gcs_to_bigquery.py +21 -13
  181. airflow/providers/google/cloud/transfers/gcs_to_gcs.py +4 -3
  182. airflow/providers/google/cloud/transfers/gcs_to_local.py +6 -4
  183. airflow/providers/google/cloud/transfers/gcs_to_sftp.py +11 -5
  184. airflow/providers/google/cloud/transfers/gdrive_to_gcs.py +6 -2
  185. airflow/providers/google/cloud/transfers/gdrive_to_local.py +2 -2
  186. airflow/providers/google/cloud/transfers/http_to_gcs.py +193 -0
  187. airflow/providers/google/cloud/transfers/local_to_gcs.py +2 -2
  188. airflow/providers/google/cloud/transfers/mssql_to_gcs.py +1 -1
  189. airflow/providers/google/cloud/transfers/oracle_to_gcs.py +36 -11
  190. airflow/providers/google/cloud/transfers/postgres_to_gcs.py +42 -9
  191. airflow/providers/google/cloud/transfers/s3_to_gcs.py +13 -7
  192. airflow/providers/google/cloud/transfers/salesforce_to_gcs.py +2 -2
  193. airflow/providers/google/cloud/transfers/sftp_to_gcs.py +14 -5
  194. airflow/providers/google/cloud/transfers/sheets_to_gcs.py +3 -3
  195. airflow/providers/google/cloud/transfers/sql_to_gcs.py +10 -10
  196. airflow/providers/google/cloud/triggers/bigquery.py +76 -35
  197. airflow/providers/google/cloud/triggers/cloud_build.py +1 -1
  198. airflow/providers/google/cloud/triggers/cloud_composer.py +303 -47
  199. airflow/providers/google/cloud/triggers/cloud_run.py +3 -3
  200. airflow/providers/google/cloud/triggers/cloud_storage_transfer_service.py +92 -2
  201. airflow/providers/google/cloud/triggers/dataflow.py +122 -0
  202. airflow/providers/google/cloud/triggers/datafusion.py +1 -1
  203. airflow/providers/google/cloud/triggers/dataplex.py +14 -2
  204. airflow/providers/google/cloud/triggers/dataproc.py +123 -53
  205. airflow/providers/google/cloud/triggers/kubernetes_engine.py +47 -28
  206. airflow/providers/google/cloud/triggers/mlengine.py +1 -1
  207. airflow/providers/google/cloud/triggers/pubsub.py +15 -19
  208. airflow/providers/google/cloud/triggers/vertex_ai.py +1 -1
  209. airflow/providers/google/cloud/utils/bigquery_get_data.py +1 -1
  210. airflow/providers/google/cloud/utils/credentials_provider.py +2 -2
  211. airflow/providers/google/cloud/utils/field_sanitizer.py +1 -1
  212. airflow/providers/google/cloud/utils/field_validator.py +2 -3
  213. airflow/providers/google/common/auth_backend/google_openid.py +4 -4
  214. airflow/providers/google/common/deprecated.py +2 -1
  215. airflow/providers/google/common/hooks/base_google.py +27 -9
  216. airflow/providers/google/common/hooks/operation_helpers.py +1 -1
  217. airflow/providers/google/common/links/storage.py +0 -22
  218. airflow/providers/google/common/utils/get_secret.py +31 -0
  219. airflow/providers/google/common/utils/id_token_credentials.py +3 -4
  220. airflow/providers/google/firebase/hooks/firestore.py +1 -1
  221. airflow/providers/google/firebase/operators/firestore.py +3 -3
  222. airflow/providers/google/get_provider_info.py +56 -52
  223. airflow/providers/google/go_module_utils.py +35 -3
  224. airflow/providers/google/leveldb/hooks/leveldb.py +27 -2
  225. airflow/providers/google/leveldb/operators/leveldb.py +2 -2
  226. airflow/providers/google/marketing_platform/hooks/campaign_manager.py +1 -1
  227. airflow/providers/google/marketing_platform/hooks/display_video.py +3 -109
  228. airflow/providers/google/marketing_platform/hooks/search_ads.py +1 -1
  229. airflow/providers/google/marketing_platform/links/analytics_admin.py +5 -14
  230. airflow/providers/google/marketing_platform/operators/analytics_admin.py +2 -3
  231. airflow/providers/google/marketing_platform/operators/campaign_manager.py +6 -6
  232. airflow/providers/google/marketing_platform/operators/display_video.py +28 -489
  233. airflow/providers/google/marketing_platform/operators/search_ads.py +2 -2
  234. airflow/providers/google/marketing_platform/sensors/campaign_manager.py +2 -2
  235. airflow/providers/google/marketing_platform/sensors/display_video.py +3 -64
  236. airflow/providers/google/suite/hooks/calendar.py +2 -2
  237. airflow/providers/google/suite/hooks/sheets.py +16 -2
  238. airflow/providers/google/suite/operators/sheets.py +8 -3
  239. airflow/providers/google/suite/sensors/drive.py +2 -2
  240. airflow/providers/google/suite/transfers/gcs_to_gdrive.py +3 -3
  241. airflow/providers/google/suite/transfers/gcs_to_sheets.py +1 -1
  242. airflow/providers/google/suite/transfers/local_to_drive.py +3 -3
  243. airflow/providers/google/suite/transfers/sql_to_sheets.py +5 -4
  244. airflow/providers/google/version_compat.py +15 -1
  245. {apache_airflow_providers_google-15.1.0rc1.dist-info → apache_airflow_providers_google-19.3.0.dist-info}/METADATA +90 -46
  246. apache_airflow_providers_google-19.3.0.dist-info/RECORD +331 -0
  247. apache_airflow_providers_google-19.3.0.dist-info/licenses/NOTICE +5 -0
  248. airflow/providers/google/cloud/hooks/automl.py +0 -673
  249. airflow/providers/google/cloud/hooks/life_sciences.py +0 -159
  250. airflow/providers/google/cloud/links/automl.py +0 -193
  251. airflow/providers/google/cloud/operators/automl.py +0 -1362
  252. airflow/providers/google/cloud/operators/life_sciences.py +0 -119
  253. airflow/providers/google/cloud/operators/mlengine.py +0 -112
  254. apache_airflow_providers_google-15.1.0rc1.dist-info/RECORD +0 -321
  255. {apache_airflow_providers_google-15.1.0rc1.dist-info → apache_airflow_providers_google-19.3.0.dist-info}/WHEEL +0 -0
  256. {apache_airflow_providers_google-15.1.0rc1.dist-info → apache_airflow_providers_google-19.3.0.dist-info}/entry_points.txt +0 -0
  257. {airflow/providers/google → apache_airflow_providers_google-19.3.0.dist-info/licenses}/LICENSE +0 -0
@@ -25,7 +25,7 @@ from typing import TYPE_CHECKING, Any
25
25
 
26
26
  from google.protobuf.json_format import MessageToDict
27
27
 
28
- from airflow.exceptions import AirflowException
28
+ from airflow.providers.common.compat.sdk import AirflowException
29
29
  from airflow.providers.google.cloud.triggers.dataplex import (
30
30
  DataplexDataProfileJobTrigger,
31
31
  DataplexDataQualityJobTrigger,
@@ -34,7 +34,7 @@ from airflow.providers.google.cloud.triggers.dataplex import (
34
34
  if TYPE_CHECKING:
35
35
  from google.protobuf.field_mask_pb2 import FieldMask
36
36
 
37
- from airflow.utils.context import Context
37
+ from airflow.providers.common.compat.sdk import Context
38
38
 
39
39
  from google.api_core.exceptions import AlreadyExists, GoogleAPICallError, NotFound
40
40
  from google.api_core.gapic_v1.method import DEFAULT, _MethodDefault
@@ -150,6 +150,15 @@ class DataplexCreateTaskOperator(GoogleCloudBaseOperator):
150
150
  self.impersonation_chain = impersonation_chain
151
151
  self.asynchronous = asynchronous
152
152
 
153
+ @property
154
+ def extra_links_params(self) -> dict[str, Any]:
155
+ return {
156
+ "lake_id": self.lake_id,
157
+ "task_id": self.dataplex_task_id,
158
+ "region": self.region,
159
+ "project_id": self.project_id,
160
+ }
161
+
153
162
  def execute(self, context: Context) -> dict:
154
163
  hook = DataplexHook(
155
164
  gcp_conn_id=self.gcp_conn_id,
@@ -157,7 +166,7 @@ class DataplexCreateTaskOperator(GoogleCloudBaseOperator):
157
166
  impersonation_chain=self.impersonation_chain,
158
167
  )
159
168
  self.log.info("Creating Dataplex task %s", self.dataplex_task_id)
160
- DataplexTaskLink.persist(context=context, task_instance=self)
169
+ DataplexTaskLink.persist(context=context)
161
170
 
162
171
  try:
163
172
  operation = hook.create_task(
@@ -351,6 +360,14 @@ class DataplexListTasksOperator(GoogleCloudBaseOperator):
351
360
  self.gcp_conn_id = gcp_conn_id
352
361
  self.impersonation_chain = impersonation_chain
353
362
 
363
+ @property
364
+ def extra_links_params(self) -> dict[str, Any]:
365
+ return {
366
+ "project_id": self.project_id,
367
+ "lake_id": self.lake_id,
368
+ "region": self.region,
369
+ }
370
+
354
371
  def execute(self, context: Context) -> list[dict]:
355
372
  hook = DataplexHook(
356
373
  gcp_conn_id=self.gcp_conn_id,
@@ -358,7 +375,7 @@ class DataplexListTasksOperator(GoogleCloudBaseOperator):
358
375
  impersonation_chain=self.impersonation_chain,
359
376
  )
360
377
  self.log.info("Listing Dataplex tasks from lake %s", self.lake_id)
361
- DataplexTasksLink.persist(context=context, task_instance=self)
378
+ DataplexTasksLink.persist(context=context)
362
379
 
363
380
  tasks = hook.list_tasks(
364
381
  project_id=self.project_id,
@@ -430,6 +447,15 @@ class DataplexGetTaskOperator(GoogleCloudBaseOperator):
430
447
  self.gcp_conn_id = gcp_conn_id
431
448
  self.impersonation_chain = impersonation_chain
432
449
 
450
+ @property
451
+ def extra_links_params(self) -> dict[str, Any]:
452
+ return {
453
+ "lake_id": self.lake_id,
454
+ "task_id": self.dataplex_task_id,
455
+ "region": self.region,
456
+ "project_id": self.project_id,
457
+ }
458
+
433
459
  def execute(self, context: Context) -> dict:
434
460
  hook = DataplexHook(
435
461
  gcp_conn_id=self.gcp_conn_id,
@@ -437,7 +463,7 @@ class DataplexGetTaskOperator(GoogleCloudBaseOperator):
437
463
  impersonation_chain=self.impersonation_chain,
438
464
  )
439
465
  self.log.info("Retrieving Dataplex task %s", self.dataplex_task_id)
440
- DataplexTaskLink.persist(context=context, task_instance=self)
466
+ DataplexTaskLink.persist(context=context)
441
467
 
442
468
  task = hook.get_task(
443
469
  project_id=self.project_id,
@@ -448,7 +474,7 @@ class DataplexGetTaskOperator(GoogleCloudBaseOperator):
448
474
  timeout=self.timeout,
449
475
  metadata=self.metadata,
450
476
  )
451
- DataplexTasksLink.persist(context=context, task_instance=self)
477
+ DataplexTasksLink.persist(context=context)
452
478
  return Task.to_dict(task)
453
479
 
454
480
 
@@ -522,6 +548,14 @@ class DataplexCreateLakeOperator(GoogleCloudBaseOperator):
522
548
  self.impersonation_chain = impersonation_chain
523
549
  self.asynchronous = asynchronous
524
550
 
551
+ @property
552
+ def extra_links_params(self) -> dict[str, Any]:
553
+ return {
554
+ "lake_id": self.lake_id,
555
+ "region": self.region,
556
+ "project_id": self.project_id,
557
+ }
558
+
525
559
  def execute(self, context: Context) -> dict:
526
560
  hook = DataplexHook(
527
561
  gcp_conn_id=self.gcp_conn_id,
@@ -566,10 +600,7 @@ class DataplexCreateLakeOperator(GoogleCloudBaseOperator):
566
600
  if lake["state"] != "CREATING":
567
601
  break
568
602
  time.sleep(time_to_wait)
569
- DataplexLakeLink.persist(
570
- context=context,
571
- task_instance=self,
572
- )
603
+ DataplexLakeLink.persist(context=context)
573
604
  return Lake.to_dict(lake)
574
605
 
575
606
 
@@ -625,6 +656,14 @@ class DataplexDeleteLakeOperator(GoogleCloudBaseOperator):
625
656
  self.gcp_conn_id = gcp_conn_id
626
657
  self.impersonation_chain = impersonation_chain
627
658
 
659
+ @property
660
+ def extra_links_params(self) -> dict[str, Any]:
661
+ return {
662
+ "lake_id": self.lake_id,
663
+ "region": self.region,
664
+ "project_id": self.project_id,
665
+ }
666
+
628
667
  def execute(self, context: Context) -> None:
629
668
  hook = DataplexHook(
630
669
  gcp_conn_id=self.gcp_conn_id,
@@ -642,7 +681,7 @@ class DataplexDeleteLakeOperator(GoogleCloudBaseOperator):
642
681
  timeout=self.timeout,
643
682
  metadata=self.metadata,
644
683
  )
645
- DataplexLakeLink.persist(context=context, task_instance=self)
684
+ DataplexLakeLink.persist(context=context)
646
685
  hook.wait_for_operation(timeout=self.timeout, operation=operation)
647
686
  self.log.info("Dataplex lake %s deleted successfully!", self.lake_id)
648
687
 
@@ -1043,11 +1082,11 @@ class DataplexRunDataQualityScanOperator(GoogleCloudBaseOperator):
1043
1082
  """
1044
1083
  job_state = event["job_state"]
1045
1084
  job_id = event["job_id"]
1046
- if job_state == DataScanJob.State.FAILED:
1085
+ if job_state == DataScanJob.State.FAILED.name: # type: ignore
1047
1086
  raise AirflowException(f"Job failed:\n{job_id}")
1048
- if job_state == DataScanJob.State.CANCELLED:
1087
+ if job_state == DataScanJob.State.CANCELLED.name: # type: ignore
1049
1088
  raise AirflowException(f"Job was cancelled:\n{job_id}")
1050
- if job_state == DataScanJob.State.SUCCEEDED:
1089
+ if job_state == DataScanJob.State.SUCCEEDED.name: # type: ignore
1051
1090
  job = event["job"]
1052
1091
  if not job["data_quality_result"]["passed"]:
1053
1092
  if self.fail_on_dq_failure:
@@ -1221,11 +1260,11 @@ class DataplexGetDataQualityScanResultOperator(GoogleCloudBaseOperator):
1221
1260
  job_state = event["job_state"]
1222
1261
  job_id = event["job_id"]
1223
1262
  job = event["job"]
1224
- if job_state == DataScanJob.State.FAILED:
1263
+ if job_state == DataScanJob.State.FAILED.name: # type: ignore
1225
1264
  raise AirflowException(f"Job failed:\n{job_id}")
1226
- if job_state == DataScanJob.State.CANCELLED:
1265
+ if job_state == DataScanJob.State.CANCELLED.name: # type: ignore
1227
1266
  raise AirflowException(f"Job was cancelled:\n{job_id}")
1228
- if job_state == DataScanJob.State.SUCCEEDED:
1267
+ if job_state == DataScanJob.State.SUCCEEDED.name: # type: ignore
1229
1268
  if not job["data_quality_result"]["passed"]:
1230
1269
  if self.fail_on_dq_failure:
1231
1270
  raise AirflowDataQualityScanException(
@@ -1600,12 +1639,12 @@ class DataplexRunDataProfileScanOperator(GoogleCloudBaseOperator):
1600
1639
  result_timeout=self.result_timeout,
1601
1640
  )
1602
1641
 
1603
- if job.state == DataScanJob.State.FAILED:
1642
+ if job.state == DataScanJob.State.FAILED.name: # type: ignore
1604
1643
  raise AirflowException(f"Data Profile job failed: {job_id}")
1605
- if job.state == DataScanJob.State.SUCCEEDED:
1644
+ if job.state == DataScanJob.State.SUCCEEDED.name: # type: ignore
1606
1645
  self.log.info("Data Profile job executed successfully.")
1607
1646
  else:
1608
- self.log.info("Data Profile job execution returned status: %s", job.status)
1647
+ self.log.info("Data Profile job execution returned status: %s", job.state)
1609
1648
 
1610
1649
  return job_id
1611
1650
 
@@ -1618,11 +1657,11 @@ class DataplexRunDataProfileScanOperator(GoogleCloudBaseOperator):
1618
1657
  """
1619
1658
  job_state = event["job_state"]
1620
1659
  job_id = event["job_id"]
1621
- if job_state == DataScanJob.State.FAILED:
1660
+ if job_state == DataScanJob.State.FAILED.name: # type: ignore
1622
1661
  raise AirflowException(f"Job failed:\n{job_id}")
1623
- if job_state == DataScanJob.State.CANCELLED:
1662
+ if job_state == DataScanJob.State.CANCELLED.name: # type: ignore
1624
1663
  raise AirflowException(f"Job was cancelled:\n{job_id}")
1625
- if job_state == DataScanJob.State.SUCCEEDED:
1664
+ if job_state == DataScanJob.State.SUCCEEDED.name: # type: ignore
1626
1665
  self.log.info("Data Profile job executed successfully.")
1627
1666
  return job_id
1628
1667
 
@@ -2179,6 +2218,13 @@ class DataplexCatalogBaseOperator(GoogleCloudBaseOperator):
2179
2218
  impersonation_chain=self.impersonation_chain,
2180
2219
  )
2181
2220
 
2221
+ @property
2222
+ def extra_links_params(self) -> dict[str, Any]:
2223
+ return {
2224
+ "location": self.location,
2225
+ "project_id": self.project_id,
2226
+ }
2227
+
2182
2228
 
2183
2229
  class DataplexCatalogCreateEntryGroupOperator(DataplexCatalogBaseOperator):
2184
2230
  """
@@ -2230,12 +2276,15 @@ class DataplexCatalogCreateEntryGroupOperator(DataplexCatalogBaseOperator):
2230
2276
  self.entry_group_configuration = entry_group_configuration
2231
2277
  self.validate_request = validate_request
2232
2278
 
2233
- def execute(self, context: Context):
2234
- DataplexCatalogEntryGroupLink.persist(
2235
- context=context,
2236
- task_instance=self,
2237
- )
2279
+ @property
2280
+ def extra_links_params(self) -> dict[str, Any]:
2281
+ return {
2282
+ **super().extra_links_params,
2283
+ "entry_group_id": self.entry_group_id,
2284
+ }
2238
2285
 
2286
+ def execute(self, context: Context):
2287
+ DataplexCatalogEntryGroupLink.persist(context=context)
2239
2288
  if self.validate_request:
2240
2289
  self.log.info("Validating a Create Dataplex Catalog EntryGroup request.")
2241
2290
  else:
@@ -2316,11 +2365,15 @@ class DataplexCatalogGetEntryGroupOperator(DataplexCatalogBaseOperator):
2316
2365
  super().__init__(*args, **kwargs)
2317
2366
  self.entry_group_id = entry_group_id
2318
2367
 
2368
+ @property
2369
+ def extra_links_params(self) -> dict[str, Any]:
2370
+ return {
2371
+ **super().extra_links_params,
2372
+ "entry_group_id": self.entry_group_id,
2373
+ }
2374
+
2319
2375
  def execute(self, context: Context):
2320
- DataplexCatalogEntryGroupLink.persist(
2321
- context=context,
2322
- task_instance=self,
2323
- )
2376
+ DataplexCatalogEntryGroupLink.persist(context=context)
2324
2377
  self.log.info(
2325
2378
  "Retrieving Dataplex Catalog EntryGroup %s.",
2326
2379
  self.entry_group_id,
@@ -2462,10 +2515,7 @@ class DataplexCatalogListEntryGroupsOperator(DataplexCatalogBaseOperator):
2462
2515
  self.order_by = order_by
2463
2516
 
2464
2517
  def execute(self, context: Context):
2465
- DataplexCatalogEntryGroupsLink.persist(
2466
- context=context,
2467
- task_instance=self,
2468
- )
2518
+ DataplexCatalogEntryGroupsLink.persist(context=context)
2469
2519
  self.log.info(
2470
2520
  "Listing Dataplex Catalog EntryGroup from location %s.",
2471
2521
  self.location,
@@ -2483,8 +2533,7 @@ class DataplexCatalogListEntryGroupsOperator(DataplexCatalogBaseOperator):
2483
2533
  metadata=self.metadata,
2484
2534
  )
2485
2535
  self.log.info("EntryGroup on page: %s", entry_group_on_page)
2486
- self.xcom_push(
2487
- context=context,
2536
+ context["ti"].xcom_push(
2488
2537
  key="entry_group_page",
2489
2538
  value=ListEntryGroupsResponse.to_dict(entry_group_on_page._response),
2490
2539
  )
@@ -2554,12 +2603,15 @@ class DataplexCatalogUpdateEntryGroupOperator(DataplexCatalogBaseOperator):
2554
2603
  self.update_mask = update_mask
2555
2604
  self.validate_request = validate_request
2556
2605
 
2557
- def execute(self, context: Context):
2558
- DataplexCatalogEntryGroupLink.persist(
2559
- context=context,
2560
- task_instance=self,
2561
- )
2606
+ @property
2607
+ def extra_links_params(self) -> dict[str, Any]:
2608
+ return {
2609
+ **super().extra_links_params,
2610
+ "entry_group_id": self.entry_group_id,
2611
+ }
2562
2612
 
2613
+ def execute(self, context: Context):
2614
+ DataplexCatalogEntryGroupLink.persist(context=context)
2563
2615
  if self.validate_request:
2564
2616
  self.log.info("Validating an Update Dataplex Catalog EntryGroup request.")
2565
2617
  else:
@@ -2644,12 +2696,15 @@ class DataplexCatalogCreateEntryTypeOperator(DataplexCatalogBaseOperator):
2644
2696
  self.entry_type_configuration = entry_type_configuration
2645
2697
  self.validate_request = validate_request
2646
2698
 
2647
- def execute(self, context: Context):
2648
- DataplexCatalogEntryTypeLink.persist(
2649
- context=context,
2650
- task_instance=self,
2651
- )
2699
+ @property
2700
+ def extra_links_params(self) -> dict[str, Any]:
2701
+ return {
2702
+ **super().extra_links_params,
2703
+ "entry_type_id": self.entry_type_id,
2704
+ }
2652
2705
 
2706
+ def execute(self, context: Context):
2707
+ DataplexCatalogEntryTypeLink.persist(context=context)
2653
2708
  if self.validate_request:
2654
2709
  self.log.info("Validating a Create Dataplex Catalog EntryType request.")
2655
2710
  else:
@@ -2730,11 +2785,15 @@ class DataplexCatalogGetEntryTypeOperator(DataplexCatalogBaseOperator):
2730
2785
  super().__init__(*args, **kwargs)
2731
2786
  self.entry_type_id = entry_type_id
2732
2787
 
2788
+ @property
2789
+ def extra_links_params(self) -> dict[str, Any]:
2790
+ return {
2791
+ **super().extra_links_params,
2792
+ "entry_type_id": self.entry_type_id,
2793
+ }
2794
+
2733
2795
  def execute(self, context: Context):
2734
- DataplexCatalogEntryTypeLink.persist(
2735
- context=context,
2736
- task_instance=self,
2737
- )
2796
+ DataplexCatalogEntryTypeLink.persist(context=context)
2738
2797
  self.log.info(
2739
2798
  "Retrieving Dataplex Catalog EntryType %s.",
2740
2799
  self.entry_type_id,
@@ -2876,10 +2935,7 @@ class DataplexCatalogListEntryTypesOperator(DataplexCatalogBaseOperator):
2876
2935
  self.order_by = order_by
2877
2936
 
2878
2937
  def execute(self, context: Context):
2879
- DataplexCatalogEntryTypesLink.persist(
2880
- context=context,
2881
- task_instance=self,
2882
- )
2938
+ DataplexCatalogEntryTypesLink.persist(context=context)
2883
2939
  self.log.info(
2884
2940
  "Listing Dataplex Catalog EntryType from location %s.",
2885
2941
  self.location,
@@ -2897,8 +2953,7 @@ class DataplexCatalogListEntryTypesOperator(DataplexCatalogBaseOperator):
2897
2953
  metadata=self.metadata,
2898
2954
  )
2899
2955
  self.log.info("EntryType on page: %s", entry_type_on_page)
2900
- self.xcom_push(
2901
- context=context,
2956
+ context["ti"].xcom_push(
2902
2957
  key="entry_type_page",
2903
2958
  value=ListEntryTypesResponse.to_dict(entry_type_on_page._response),
2904
2959
  )
@@ -2968,12 +3023,15 @@ class DataplexCatalogUpdateEntryTypeOperator(DataplexCatalogBaseOperator):
2968
3023
  self.update_mask = update_mask
2969
3024
  self.validate_request = validate_request
2970
3025
 
2971
- def execute(self, context: Context):
2972
- DataplexCatalogEntryTypeLink.persist(
2973
- context=context,
2974
- task_instance=self,
2975
- )
3026
+ @property
3027
+ def extra_links_params(self) -> dict[str, Any]:
3028
+ return {
3029
+ **super().extra_links_params,
3030
+ "entry_type_id": self.entry_type_id,
3031
+ }
2976
3032
 
3033
+ def execute(self, context: Context):
3034
+ DataplexCatalogEntryTypeLink.persist(context=context)
2977
3035
  if self.validate_request:
2978
3036
  self.log.info("Validating an Update Dataplex Catalog EntryType request.")
2979
3037
  else:
@@ -3058,12 +3116,15 @@ class DataplexCatalogCreateAspectTypeOperator(DataplexCatalogBaseOperator):
3058
3116
  self.aspect_type_configuration = aspect_type_configuration
3059
3117
  self.validate_request = validate_request
3060
3118
 
3061
- def execute(self, context: Context):
3062
- DataplexCatalogAspectTypeLink.persist(
3063
- context=context,
3064
- task_instance=self,
3065
- )
3119
+ @property
3120
+ def extra_links_params(self) -> dict[str, Any]:
3121
+ return {
3122
+ **super().extra_links_params,
3123
+ "aspect_type_id": self.aspect_type_id,
3124
+ }
3066
3125
 
3126
+ def execute(self, context: Context):
3127
+ DataplexCatalogAspectTypeLink.persist(context=context)
3067
3128
  if self.validate_request:
3068
3129
  self.log.info("Validating a Create Dataplex Catalog AspectType request.")
3069
3130
  else:
@@ -3144,11 +3205,15 @@ class DataplexCatalogGetAspectTypeOperator(DataplexCatalogBaseOperator):
3144
3205
  super().__init__(*args, **kwargs)
3145
3206
  self.aspect_type_id = aspect_type_id
3146
3207
 
3208
+ @property
3209
+ def extra_links_params(self) -> dict[str, Any]:
3210
+ return {
3211
+ **super().extra_links_params,
3212
+ "aspect_type_id": self.aspect_type_id,
3213
+ }
3214
+
3147
3215
  def execute(self, context: Context):
3148
- DataplexCatalogAspectTypeLink.persist(
3149
- context=context,
3150
- task_instance=self,
3151
- )
3216
+ DataplexCatalogAspectTypeLink.persist(context=context)
3152
3217
  self.log.info(
3153
3218
  "Retrieving Dataplex Catalog AspectType %s.",
3154
3219
  self.aspect_type_id,
@@ -3223,10 +3288,7 @@ class DataplexCatalogListAspectTypesOperator(DataplexCatalogBaseOperator):
3223
3288
  self.order_by = order_by
3224
3289
 
3225
3290
  def execute(self, context: Context):
3226
- DataplexCatalogAspectTypesLink.persist(
3227
- context=context,
3228
- task_instance=self,
3229
- )
3291
+ DataplexCatalogAspectTypesLink.persist(context=context)
3230
3292
  self.log.info(
3231
3293
  "Listing Dataplex Catalog AspectType from location %s.",
3232
3294
  self.location,
@@ -3244,8 +3306,7 @@ class DataplexCatalogListAspectTypesOperator(DataplexCatalogBaseOperator):
3244
3306
  metadata=self.metadata,
3245
3307
  )
3246
3308
  self.log.info("AspectType on page: %s", aspect_type_on_page)
3247
- self.xcom_push(
3248
- context=context,
3309
+ context["ti"].xcom_push(
3249
3310
  key="aspect_type_page",
3250
3311
  value=ListAspectTypesResponse.to_dict(aspect_type_on_page._response),
3251
3312
  )
@@ -3315,12 +3376,15 @@ class DataplexCatalogUpdateAspectTypeOperator(DataplexCatalogBaseOperator):
3315
3376
  self.update_mask = update_mask
3316
3377
  self.validate_request = validate_request
3317
3378
 
3318
- def execute(self, context: Context):
3319
- DataplexCatalogAspectTypeLink.persist(
3320
- context=context,
3321
- task_instance=self,
3322
- )
3379
+ @property
3380
+ def extra_links_params(self) -> dict[str, Any]:
3381
+ return {
3382
+ **super().extra_links_params,
3383
+ "aspect_type_id": self.aspect_type_id,
3384
+ }
3323
3385
 
3386
+ def execute(self, context: Context):
3387
+ DataplexCatalogAspectTypeLink.persist(context=context)
3324
3388
  if self.validate_request:
3325
3389
  self.log.info("Validating an Update Dataplex Catalog AspectType request.")
3326
3390
  else:
@@ -3493,12 +3557,16 @@ class DataplexCatalogCreateEntryOperator(DataplexCatalogBaseOperator):
3493
3557
  f"Missing required fields in Entry configuration: {', '.join(missing_fields)}. "
3494
3558
  )
3495
3559
 
3496
- def execute(self, context: Context):
3497
- DataplexCatalogEntryLink.persist(
3498
- context=context,
3499
- task_instance=self,
3500
- )
3560
+ @property
3561
+ def extra_links_params(self) -> dict[str, Any]:
3562
+ return {
3563
+ **super().extra_links_params,
3564
+ "entry_id": self.entry_id,
3565
+ "entry_group_id": self.entry_group_id,
3566
+ }
3501
3567
 
3568
+ def execute(self, context: Context):
3569
+ DataplexCatalogEntryLink.persist(context=context)
3502
3570
  self._validate_fields(self.entry_configuration)
3503
3571
  try:
3504
3572
  entry = self.hook.create_entry(
@@ -3599,11 +3667,16 @@ class DataplexCatalogGetEntryOperator(DataplexCatalogBaseOperator):
3599
3667
  self.aspect_types = aspect_types
3600
3668
  self.paths = paths
3601
3669
 
3670
+ @property
3671
+ def extra_links_params(self) -> dict[str, Any]:
3672
+ return {
3673
+ **super().extra_links_params,
3674
+ "entry_id": self.entry_id,
3675
+ "entry_group_id": self.entry_group_id,
3676
+ }
3677
+
3602
3678
  def execute(self, context: Context):
3603
- DataplexCatalogEntryLink.persist(
3604
- context=context,
3605
- task_instance=self,
3606
- )
3679
+ DataplexCatalogEntryLink.persist(context=context)
3607
3680
  self.log.info(
3608
3681
  "Retrieving Dataplex Catalog Entry %s.",
3609
3682
  self.entry_id,
@@ -3701,11 +3774,15 @@ class DataplexCatalogListEntriesOperator(DataplexCatalogBaseOperator):
3701
3774
  self.page_token = page_token
3702
3775
  self.filter_by = filter_by
3703
3776
 
3777
+ @property
3778
+ def extra_links_params(self) -> dict[str, Any]:
3779
+ return {
3780
+ **super().extra_links_params,
3781
+ "entry_group_id": self.entry_group_id,
3782
+ }
3783
+
3704
3784
  def execute(self, context: Context):
3705
- DataplexCatalogEntryGroupLink.persist(
3706
- context=context,
3707
- task_instance=self,
3708
- )
3785
+ DataplexCatalogEntryGroupLink.persist(context=context)
3709
3786
  self.log.info(
3710
3787
  "Listing Dataplex Catalog Entry from location %s.",
3711
3788
  self.location,
@@ -3723,8 +3800,7 @@ class DataplexCatalogListEntriesOperator(DataplexCatalogBaseOperator):
3723
3800
  metadata=self.metadata,
3724
3801
  )
3725
3802
  self.log.info("Entries on page: %s", entries_on_page)
3726
- self.xcom_push(
3727
- context=context,
3803
+ context["ti"].xcom_push(
3728
3804
  key="entry_page",
3729
3805
  value=ListEntriesResponse.to_dict(entries_on_page._response),
3730
3806
  )
@@ -3821,8 +3897,7 @@ class DataplexCatalogSearchEntriesOperator(DataplexCatalogBaseOperator):
3821
3897
  metadata=self.metadata,
3822
3898
  )
3823
3899
  self.log.info("Entries on page: %s", entries_on_page)
3824
- self.xcom_push(
3825
- context=context,
3900
+ context["ti"].xcom_push(
3826
3901
  key="entry_page",
3827
3902
  value=SearchEntriesResponse.to_dict(entries_on_page._response),
3828
3903
  )
@@ -3903,11 +3978,16 @@ class DataplexCatalogLookupEntryOperator(DataplexCatalogBaseOperator):
3903
3978
  self.aspect_types = aspect_types
3904
3979
  self.paths = paths
3905
3980
 
3981
+ @property
3982
+ def extra_links_params(self) -> dict[str, Any]:
3983
+ return {
3984
+ **super().extra_links_params,
3985
+ "entry_id": self.entry_id,
3986
+ "entry_group_id": self.entry_group_id,
3987
+ }
3988
+
3906
3989
  def execute(self, context: Context):
3907
- DataplexCatalogEntryLink.persist(
3908
- context=context,
3909
- task_instance=self,
3910
- )
3990
+ DataplexCatalogEntryLink.persist(context=context)
3911
3991
  self.log.info(
3912
3992
  "Looking for Dataplex Catalog Entry %s.",
3913
3993
  self.entry_id,
@@ -3963,7 +4043,7 @@ class DataplexCatalogUpdateEntryOperator(DataplexCatalogBaseOperator):
3963
4043
  :param entry_configuration: Required. The updated configuration body of the Entry.
3964
4044
  :param allow_missing: Optional. If set to true and entry doesn't exist, the service will create it.
3965
4045
  :param delete_missing_aspects: Optional. If set to true and the aspect_keys specify aspect
3966
- ranges, the service deletes any existing aspects from that range that weren't provided
4046
+ ranges, the service deletes any existing aspects from that range that were not provided
3967
4047
  in the request.
3968
4048
  :param aspect_keys: Optional. The map keys of the Aspects which the service should modify.
3969
4049
  It supports the following syntax:
@@ -4022,12 +4102,16 @@ class DataplexCatalogUpdateEntryOperator(DataplexCatalogBaseOperator):
4022
4102
  self.delete_missing_aspects = delete_missing_aspects
4023
4103
  self.aspect_keys = aspect_keys
4024
4104
 
4025
- def execute(self, context: Context):
4026
- DataplexCatalogEntryLink.persist(
4027
- context=context,
4028
- task_instance=self,
4029
- )
4105
+ @property
4106
+ def extra_links_params(self) -> dict[str, Any]:
4107
+ return {
4108
+ **super().extra_links_params,
4109
+ "entry_id": self.entry_id,
4110
+ "entry_group_id": self.entry_group_id,
4111
+ }
4030
4112
 
4113
+ def execute(self, context: Context):
4114
+ DataplexCatalogEntryLink.persist(context=context)
4031
4115
  try:
4032
4116
  entry = self.hook.update_entry(
4033
4117
  location=self.location,
@@ -28,7 +28,7 @@ from airflow.providers.google.cloud.operators.cloud_base import GoogleCloudBaseO
28
28
  from airflow.providers.google.common.hooks.base_google import PROVIDE_PROJECT_ID
29
29
 
30
30
  if TYPE_CHECKING:
31
- from airflow.utils.context import Context
31
+ from airflow.providers.common.compat.sdk import Context
32
32
 
33
33
 
34
34
  class DataprepGetJobsForJobGroupOperator(GoogleCloudBaseOperator):
@@ -113,7 +113,6 @@ class DataprepGetJobGroupOperator(GoogleCloudBaseOperator):
113
113
  if self.project_id:
114
114
  DataprepJobGroupLink.persist(
115
115
  context=context,
116
- task_instance=self,
117
116
  project_id=self.project_id,
118
117
  job_group_id=int(self.job_group_id),
119
118
  )
@@ -170,7 +169,6 @@ class DataprepRunJobGroupOperator(GoogleCloudBaseOperator):
170
169
  if self.project_id and job_group_id:
171
170
  DataprepJobGroupLink.persist(
172
171
  context=context,
173
- task_instance=self,
174
172
  project_id=self.project_id,
175
173
  job_group_id=int(job_group_id),
176
174
  )
@@ -230,7 +228,6 @@ class DataprepCopyFlowOperator(GoogleCloudBaseOperator):
230
228
  if self.project_id and copied_flow_id:
231
229
  DataprepFlowLink.persist(
232
230
  context=context,
233
- task_instance=self,
234
231
  project_id=self.project_id,
235
232
  flow_id=int(copied_flow_id),
236
233
  )
@@ -303,7 +300,6 @@ class DataprepRunFlowOperator(GoogleCloudBaseOperator):
303
300
  job_group_id = response["data"][0]["id"]
304
301
  DataprepJobGroupLink.persist(
305
302
  context=context,
306
- task_instance=self,
307
303
  project_id=self.project_id,
308
304
  job_group_id=int(job_group_id),
309
305
  )