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
@@ -22,8 +22,6 @@ from __future__ import annotations
22
22
  from collections.abc import Sequence
23
23
  from typing import TYPE_CHECKING
24
24
 
25
- from airflow.providers.google.common.consts import CLIENT_INFO
26
- from airflow.providers.google.common.hooks.base_google import GoogleBaseHook
27
25
  from google.api_core.gapic_v1.method import DEFAULT, _MethodDefault
28
26
  from google.cloud.videointelligence_v1 import (
29
27
  Feature,
@@ -31,6 +29,9 @@ from google.cloud.videointelligence_v1 import (
31
29
  VideoIntelligenceServiceClient,
32
30
  )
33
31
 
32
+ from airflow.providers.google.common.consts import CLIENT_INFO
33
+ from airflow.providers.google.common.hooks.base_google import GoogleBaseHook
34
+
34
35
  if TYPE_CHECKING:
35
36
  from google.api_core.operation import Operation
36
37
  from google.api_core.retry import Retry
@@ -19,14 +19,11 @@
19
19
 
20
20
  from __future__ import annotations
21
21
 
22
- from collections.abc import Sequence
22
+ from collections.abc import Callable, Sequence
23
23
  from copy import deepcopy
24
24
  from functools import cached_property
25
- from typing import TYPE_CHECKING, Any, Callable
25
+ from typing import TYPE_CHECKING, Any
26
26
 
27
- from airflow.exceptions import AirflowException
28
- from airflow.providers.google.common.consts import CLIENT_INFO
29
- from airflow.providers.google.common.hooks.base_google import PROVIDE_PROJECT_ID, GoogleBaseHook
30
27
  from google.api_core.gapic_v1.method import DEFAULT, _MethodDefault
31
28
  from google.cloud.vision_v1 import (
32
29
  AnnotateImageRequest,
@@ -39,6 +36,10 @@ from google.cloud.vision_v1 import (
39
36
  )
40
37
  from google.protobuf.json_format import MessageToDict
41
38
 
39
+ from airflow.exceptions import AirflowException
40
+ from airflow.providers.google.common.consts import CLIENT_INFO
41
+ from airflow.providers.google.common.hooks.base_google import PROVIDE_PROJECT_ID, GoogleBaseHook
42
+
42
43
  if TYPE_CHECKING:
43
44
  from google.api_core.retry import Retry
44
45
  from google.protobuf import field_mask_pb2
@@ -106,8 +107,7 @@ class NameDeterminer:
106
107
  # Not enough parameters to construct the name. Trying to use the name from Product / ProductSet.
107
108
  if explicit_name:
108
109
  return entity
109
- else:
110
- raise AirflowException(ERR_UNABLE_TO_CREATE.format(label=self.label, id_label=self.id_label))
110
+ raise AirflowException(ERR_UNABLE_TO_CREATE.format(label=self.label, id_label=self.id_label))
111
111
 
112
112
 
113
113
  class CloudVisionHook(GoogleBaseHook):
@@ -19,12 +19,13 @@ from __future__ import annotations
19
19
  from collections.abc import Sequence
20
20
  from typing import TYPE_CHECKING
21
21
 
22
- from airflow.providers.google.common.consts import CLIENT_INFO
23
- from airflow.providers.google.common.hooks.base_google import PROVIDE_PROJECT_ID, GoogleBaseHook
24
22
  from google.api_core.gapic_v1.method import DEFAULT, _MethodDefault
25
23
  from google.cloud.workflows.executions_v1beta import Execution, ExecutionsClient
26
24
  from google.cloud.workflows_v1beta import Workflow, WorkflowsClient
27
25
 
26
+ from airflow.providers.google.common.consts import CLIENT_INFO
27
+ from airflow.providers.google.common.hooks.base_google import PROVIDE_PROJECT_ID, GoogleBaseHook
28
+
28
29
  if TYPE_CHECKING:
29
30
  from google.api_core.operation import Operation
30
31
  from google.api_core.retry import Retry
@@ -64,7 +65,7 @@ class WorkflowsHook(GoogleBaseHook):
64
65
  Create a new workflow.
65
66
 
66
67
  If a workflow with the specified name already exists in the
67
- specified project and location, the long running operation will
68
+ specified project and location, the long-running operation will
68
69
  return [ALREADY_EXISTS][google.rpc.Code.ALREADY_EXISTS] error.
69
70
 
70
71
  :param workflow: Required. Workflow to be created.
@@ -19,14 +19,8 @@
19
19
 
20
20
  from __future__ import annotations
21
21
 
22
- from typing import TYPE_CHECKING
23
-
24
22
  from airflow.providers.google.cloud.links.base import BaseGoogleLink
25
23
 
26
- if TYPE_CHECKING:
27
- from airflow.models import BaseOperator
28
- from airflow.utils.context import Context
29
-
30
24
  ALLOY_DB_BASE_LINK = "/alloydb"
31
25
  ALLOY_DB_CLUSTER_LINK = (
32
26
  ALLOY_DB_BASE_LINK + "/locations/{location_id}/clusters/{cluster_id}?project={project_id}"
@@ -44,20 +38,6 @@ class AlloyDBClusterLink(BaseGoogleLink):
44
38
  key = "alloy_db_cluster"
45
39
  format_str = ALLOY_DB_CLUSTER_LINK
46
40
 
47
- @staticmethod
48
- def persist(
49
- context: Context,
50
- task_instance: BaseOperator,
51
- location_id: str,
52
- cluster_id: str,
53
- project_id: str | None,
54
- ):
55
- task_instance.xcom_push(
56
- context,
57
- key=AlloyDBClusterLink.key,
58
- value={"location_id": location_id, "cluster_id": cluster_id, "project_id": project_id},
59
- )
60
-
61
41
 
62
42
  class AlloyDBUsersLink(BaseGoogleLink):
63
43
  """Helper class for constructing AlloyDB users Link."""
@@ -66,20 +46,6 @@ class AlloyDBUsersLink(BaseGoogleLink):
66
46
  key = "alloy_db_users"
67
47
  format_str = ALLOY_DB_USERS_LINK
68
48
 
69
- @staticmethod
70
- def persist(
71
- context: Context,
72
- task_instance: BaseOperator,
73
- location_id: str,
74
- cluster_id: str,
75
- project_id: str | None,
76
- ):
77
- task_instance.xcom_push(
78
- context,
79
- key=AlloyDBUsersLink.key,
80
- value={"location_id": location_id, "cluster_id": cluster_id, "project_id": project_id},
81
- )
82
-
83
49
 
84
50
  class AlloyDBBackupsLink(BaseGoogleLink):
85
51
  """Helper class for constructing AlloyDB backups Link."""
@@ -87,15 +53,3 @@ class AlloyDBBackupsLink(BaseGoogleLink):
87
53
  name = "AlloyDB Backups"
88
54
  key = "alloy_db_backups"
89
55
  format_str = ALLOY_DB_BACKUPS_LINK
90
-
91
- @staticmethod
92
- def persist(
93
- context: Context,
94
- task_instance: BaseOperator,
95
- project_id: str | None,
96
- ):
97
- task_instance.xcom_push(
98
- context,
99
- key=AlloyDBBackupsLink.key,
100
- value={"project_id": project_id},
101
- )
@@ -18,13 +18,15 @@
18
18
  from __future__ import annotations
19
19
 
20
20
  from typing import TYPE_CHECKING, ClassVar
21
+ from urllib.parse import urlparse
21
22
 
22
- from airflow.models import BaseOperatorLink, XCom
23
+ from airflow.providers.common.compat.sdk import BaseOperatorLink, BaseSensorOperator, XCom
24
+ from airflow.providers.google.version_compat import AIRFLOW_V_3_0_PLUS, BaseOperator
23
25
 
24
26
  if TYPE_CHECKING:
25
- from airflow.models import BaseOperator
26
27
  from airflow.models.taskinstancekey import TaskInstanceKey
27
-
28
+ from airflow.providers.common.compat.sdk import Context
29
+ from airflow.providers.google.cloud.operators.cloud_base import GoogleCloudBaseOperator
28
30
 
29
31
  BASE_LINK = "https://console.cloud.google.com"
30
32
 
@@ -33,6 +35,12 @@ class BaseGoogleLink(BaseOperatorLink):
33
35
  """
34
36
  Base class for all Google links.
35
37
 
38
+ When you inherit this class in a Link class;
39
+ - You can call the persist method to push data to the XCom to use it later in the get_link method.
40
+ - If you have an operator which inherit the GoogleCloudBaseOperator or BaseSensorOperator
41
+ You can define extra_links_params method in the operator to pass the operator properties
42
+ to the get_link method.
43
+
36
44
  :meta private:
37
45
  """
38
46
 
@@ -40,15 +48,77 @@ class BaseGoogleLink(BaseOperatorLink):
40
48
  key: ClassVar[str]
41
49
  format_str: ClassVar[str]
42
50
 
51
+ @property
52
+ def xcom_key(self) -> str:
53
+ # NOTE: in Airflow 3 we need to have xcom_key property in the Link class.
54
+ # Since we have the key property already, this is just a proxy property method to use same
55
+ # key as in Airflow 2.
56
+ return self.key
57
+
58
+ @classmethod
59
+ def persist(cls, context: Context, **value):
60
+ """
61
+ Push arguments to the XCom to use later for link formatting at the `get_link` method.
62
+
63
+ Note: for Airflow 2 we need to call this function with context variable only
64
+ where we have the extra_links_params property method defined
65
+ """
66
+ params = {}
67
+ # TODO: remove after Airflow v2 support dropped
68
+ if not AIRFLOW_V_3_0_PLUS:
69
+ common_params = getattr(context["task"], "extra_links_params", None)
70
+ if common_params:
71
+ params.update(common_params)
72
+
73
+ context["ti"].xcom_push(
74
+ key=cls.key,
75
+ value={
76
+ **params,
77
+ **value,
78
+ },
79
+ )
80
+
81
+ def get_config(self, operator, ti_key):
82
+ conf = {}
83
+ conf.update(getattr(operator, "extra_links_params", {}))
84
+ conf.update(XCom.get_value(key=self.key, ti_key=ti_key) or {})
85
+
86
+ # if the config did not define, return None to stop URL formatting
87
+ if not conf:
88
+ return None
89
+
90
+ # Add a default value for the 'namespace' parameter for backward compatibility.
91
+ # This is for datafusion
92
+ conf.setdefault("namespace", "default")
93
+ return conf
94
+
43
95
  def get_link(
44
96
  self,
45
97
  operator: BaseOperator,
46
98
  *,
47
99
  ti_key: TaskInstanceKey,
48
100
  ) -> str:
49
- conf = XCom.get_value(key=self.key, ti_key=ti_key)
101
+ if TYPE_CHECKING:
102
+ assert isinstance(operator, (GoogleCloudBaseOperator, BaseSensorOperator))
103
+
104
+ # In cases when worker passes execution to trigger, the value that is put to XCom
105
+ # already contains link to the object in string format. In this case we don't want to execute
106
+ # get_config() again. Instead we can leave this value without any changes
107
+ link_value = XCom.get_value(key=self.key, ti_key=ti_key)
108
+ if link_value and isinstance(link_value, str):
109
+ if urlparse(link_value).scheme in ("http", "https"):
110
+ return link_value
111
+
112
+ conf = self.get_config(operator, ti_key)
50
113
  if not conf:
51
114
  return ""
52
- if self.format_str.startswith("http"):
53
- return self.format_str.format(**conf)
54
- return BASE_LINK + self.format_str.format(**conf)
115
+ return self._format_link(**conf)
116
+
117
+ def _format_link(self, **kwargs):
118
+ try:
119
+ formatted_str = self.format_str.format(**kwargs)
120
+ if formatted_str.startswith("http"):
121
+ return formatted_str
122
+ return BASE_LINK + formatted_str
123
+ except KeyError:
124
+ return ""
@@ -19,14 +19,8 @@
19
19
 
20
20
  from __future__ import annotations
21
21
 
22
- from typing import TYPE_CHECKING
23
-
24
22
  from airflow.providers.google.cloud.links.base import BaseGoogleLink
25
23
 
26
- if TYPE_CHECKING:
27
- from airflow.models import BaseOperator
28
- from airflow.utils.context import Context
29
-
30
24
  BIGQUERY_BASE_LINK = "/bigquery"
31
25
  BIGQUERY_DATASET_LINK = (
32
26
  BIGQUERY_BASE_LINK + "?referrer=search&project={project_id}&d={dataset_id}&p={project_id}&page=dataset"
@@ -47,19 +41,6 @@ class BigQueryDatasetLink(BaseGoogleLink):
47
41
  key = "bigquery_dataset"
48
42
  format_str = BIGQUERY_DATASET_LINK
49
43
 
50
- @staticmethod
51
- def persist(
52
- context: Context,
53
- task_instance: BaseOperator,
54
- dataset_id: str,
55
- project_id: str,
56
- ):
57
- task_instance.xcom_push(
58
- context,
59
- key=BigQueryDatasetLink.key,
60
- value={"dataset_id": dataset_id, "project_id": project_id},
61
- )
62
-
63
44
 
64
45
  class BigQueryTableLink(BaseGoogleLink):
65
46
  """Helper class for constructing BigQuery Table Link."""
@@ -68,20 +49,6 @@ class BigQueryTableLink(BaseGoogleLink):
68
49
  key = "bigquery_table"
69
50
  format_str = BIGQUERY_TABLE_LINK
70
51
 
71
- @staticmethod
72
- def persist(
73
- context: Context,
74
- task_instance: BaseOperator,
75
- project_id: str,
76
- table_id: str,
77
- dataset_id: str | None = None,
78
- ):
79
- task_instance.xcom_push(
80
- context,
81
- key=BigQueryTableLink.key,
82
- value={"dataset_id": dataset_id, "project_id": project_id, "table_id": table_id},
83
- )
84
-
85
52
 
86
53
  class BigQueryJobDetailLink(BaseGoogleLink):
87
54
  """Helper class for constructing BigQuery Job Detail Link."""
@@ -89,17 +56,3 @@ class BigQueryJobDetailLink(BaseGoogleLink):
89
56
  name = "BigQuery Job Detail"
90
57
  key = "bigquery_job_detail"
91
58
  format_str = BIGQUERY_JOB_DETAIL_LINK
92
-
93
- @staticmethod
94
- def persist(
95
- context: Context,
96
- task_instance: BaseOperator,
97
- project_id: str,
98
- location: str,
99
- job_id: str,
100
- ):
101
- task_instance.xcom_push(
102
- context,
103
- key=BigQueryJobDetailLink.key,
104
- value={"project_id": project_id, "location": location, "job_id": job_id},
105
- )
@@ -19,14 +19,8 @@
19
19
 
20
20
  from __future__ import annotations
21
21
 
22
- from typing import TYPE_CHECKING
23
-
24
22
  from airflow.providers.google.cloud.links.base import BaseGoogleLink
25
23
 
26
- if TYPE_CHECKING:
27
- from airflow.models import BaseOperator
28
- from airflow.utils.context import Context
29
-
30
24
  BIGQUERY_BASE_LINK = "/bigquery/transfers"
31
25
  BIGQUERY_DTS_LINK = BIGQUERY_BASE_LINK + "/locations/{region}/configs/{config_id}/runs?project={project_id}"
32
26
 
@@ -37,17 +31,3 @@ class BigQueryDataTransferConfigLink(BaseGoogleLink):
37
31
  name = "BigQuery Data Transfer Config"
38
32
  key = "bigquery_dts_config"
39
33
  format_str = BIGQUERY_DTS_LINK
40
-
41
- @staticmethod
42
- def persist(
43
- context: Context,
44
- task_instance: BaseOperator,
45
- region: str,
46
- config_id: str,
47
- project_id: str,
48
- ):
49
- task_instance.xcom_push(
50
- context,
51
- key=BigQueryDataTransferConfigLink.key,
52
- value={"project_id": project_id, "region": region, "config_id": config_id},
53
- )
@@ -16,13 +16,8 @@
16
16
  # under the License.
17
17
  from __future__ import annotations
18
18
 
19
- from typing import TYPE_CHECKING
20
-
21
19
  from airflow.providers.google.cloud.links.base import BaseGoogleLink
22
20
 
23
- if TYPE_CHECKING:
24
- from airflow.utils.context import Context
25
-
26
21
  BIGTABLE_BASE_LINK = "/bigtable"
27
22
  BIGTABLE_INSTANCE_LINK = BIGTABLE_BASE_LINK + "/instances/{instance_id}/overview?project={project_id}"
28
23
  BIGTABLE_CLUSTER_LINK = (
@@ -38,20 +33,6 @@ class BigtableInstanceLink(BaseGoogleLink):
38
33
  key = "instance_key"
39
34
  format_str = BIGTABLE_INSTANCE_LINK
40
35
 
41
- @staticmethod
42
- def persist(
43
- context: Context,
44
- task_instance,
45
- ):
46
- task_instance.xcom_push(
47
- context=context,
48
- key=BigtableInstanceLink.key,
49
- value={
50
- "instance_id": task_instance.instance_id,
51
- "project_id": task_instance.project_id,
52
- },
53
- )
54
-
55
36
 
56
37
  class BigtableClusterLink(BaseGoogleLink):
57
38
  """Helper class for constructing Bigtable Cluster link."""
@@ -60,21 +41,6 @@ class BigtableClusterLink(BaseGoogleLink):
60
41
  key = "cluster_key"
61
42
  format_str = BIGTABLE_CLUSTER_LINK
62
43
 
63
- @staticmethod
64
- def persist(
65
- context: Context,
66
- task_instance,
67
- ):
68
- task_instance.xcom_push(
69
- context=context,
70
- key=BigtableClusterLink.key,
71
- value={
72
- "instance_id": task_instance.instance_id,
73
- "cluster_id": task_instance.cluster_id,
74
- "project_id": task_instance.project_id,
75
- },
76
- )
77
-
78
44
 
79
45
  class BigtableTablesLink(BaseGoogleLink):
80
46
  """Helper class for constructing Bigtable Tables link."""
@@ -82,17 +48,3 @@ class BigtableTablesLink(BaseGoogleLink):
82
48
  name = "Bigtable Tables"
83
49
  key = "tables_key"
84
50
  format_str = BIGTABLE_TABLES_LINK
85
-
86
- @staticmethod
87
- def persist(
88
- context: Context,
89
- task_instance,
90
- ):
91
- task_instance.xcom_push(
92
- context=context,
93
- key=BigtableTablesLink.key,
94
- value={
95
- "instance_id": task_instance.instance_id,
96
- "project_id": task_instance.project_id,
97
- },
98
- )
@@ -16,13 +16,8 @@
16
16
  # under the License.
17
17
  from __future__ import annotations
18
18
 
19
- from typing import TYPE_CHECKING
20
-
21
19
  from airflow.providers.google.cloud.links.base import BaseGoogleLink
22
20
 
23
- if TYPE_CHECKING:
24
- from airflow.utils.context import Context
25
-
26
21
  BUILD_BASE_LINK = "/cloud-build"
27
22
 
28
23
  BUILD_LINK = BUILD_BASE_LINK + "/builds;region={region}/{build_id}?project={project_id}"
@@ -43,24 +38,6 @@ class CloudBuildLink(BaseGoogleLink):
43
38
  key = "cloud_build_key"
44
39
  format_str = BUILD_LINK
45
40
 
46
- @staticmethod
47
- def persist(
48
- context: Context,
49
- task_instance,
50
- build_id: str,
51
- project_id: str,
52
- region: str,
53
- ):
54
- task_instance.xcom_push(
55
- context=context,
56
- key=CloudBuildLink.key,
57
- value={
58
- "project_id": project_id,
59
- "region": region,
60
- "build_id": build_id,
61
- },
62
- )
63
-
64
41
 
65
42
  class CloudBuildListLink(BaseGoogleLink):
66
43
  """Helper class for constructing Cloud Build List link."""
@@ -69,22 +46,6 @@ class CloudBuildListLink(BaseGoogleLink):
69
46
  key = "cloud_build_list_key"
70
47
  format_str = BUILD_LIST_LINK
71
48
 
72
- @staticmethod
73
- def persist(
74
- context: Context,
75
- task_instance,
76
- project_id: str,
77
- region: str,
78
- ):
79
- task_instance.xcom_push(
80
- context=context,
81
- key=CloudBuildListLink.key,
82
- value={
83
- "project_id": project_id,
84
- "region": region,
85
- },
86
- )
87
-
88
49
 
89
50
  class CloudBuildTriggersListLink(BaseGoogleLink):
90
51
  """Helper class for constructing Cloud Build Triggers List link."""
@@ -93,22 +54,6 @@ class CloudBuildTriggersListLink(BaseGoogleLink):
93
54
  key = "cloud_build_triggers_list_key"
94
55
  format_str = BUILD_TRIGGERS_LIST_LINK
95
56
 
96
- @staticmethod
97
- def persist(
98
- context: Context,
99
- task_instance,
100
- project_id: str,
101
- region: str,
102
- ):
103
- task_instance.xcom_push(
104
- context=context,
105
- key=CloudBuildTriggersListLink.key,
106
- value={
107
- "project_id": project_id,
108
- "region": region,
109
- },
110
- )
111
-
112
57
 
113
58
  class CloudBuildTriggerDetailsLink(BaseGoogleLink):
114
59
  """Helper class for constructing Cloud Build Trigger Details link."""
@@ -116,21 +61,3 @@ class CloudBuildTriggerDetailsLink(BaseGoogleLink):
116
61
  name = "Cloud Build Triggers Details"
117
62
  key = "cloud_build_triggers_details_key"
118
63
  format_str = BUILD_TRIGGER_DETAILS_LINK
119
-
120
- @staticmethod
121
- def persist(
122
- context: Context,
123
- task_instance,
124
- project_id: str,
125
- region: str,
126
- trigger_id: str,
127
- ):
128
- task_instance.xcom_push(
129
- context=context,
130
- key=CloudBuildTriggerDetailsLink.key,
131
- value={
132
- "project_id": project_id,
133
- "region": region,
134
- "trigger_id": trigger_id,
135
- },
136
- )
@@ -19,15 +19,8 @@
19
19
 
20
20
  from __future__ import annotations
21
21
 
22
- from typing import TYPE_CHECKING
23
-
24
22
  from airflow.providers.google.cloud.links.base import BaseGoogleLink
25
23
 
26
- if TYPE_CHECKING:
27
- from airflow.models import BaseOperator
28
- from airflow.utils.context import Context
29
-
30
-
31
24
  CLOUD_FUNCTIONS_BASE_LINK = "https://console.cloud.google.com/functions"
32
25
 
33
26
  CLOUD_FUNCTIONS_DETAILS_LINK = (
@@ -44,20 +37,6 @@ class CloudFunctionsDetailsLink(BaseGoogleLink):
44
37
  key = "cloud_functions_details"
45
38
  format_str = CLOUD_FUNCTIONS_DETAILS_LINK
46
39
 
47
- @staticmethod
48
- def persist(
49
- context: Context,
50
- task_instance: BaseOperator,
51
- function_name: str,
52
- location: str,
53
- project_id: str,
54
- ):
55
- task_instance.xcom_push(
56
- context,
57
- key=CloudFunctionsDetailsLink.key,
58
- value={"function_name": function_name, "location": location, "project_id": project_id},
59
- )
60
-
61
40
 
62
41
  class CloudFunctionsListLink(BaseGoogleLink):
63
42
  """Helper class for constructing Cloud Functions Details Link."""
@@ -65,15 +44,3 @@ class CloudFunctionsListLink(BaseGoogleLink):
65
44
  name = "Cloud Functions List"
66
45
  key = "cloud_functions_list"
67
46
  format_str = CLOUD_FUNCTIONS_LIST_LINK
68
-
69
- @staticmethod
70
- def persist(
71
- context: Context,
72
- task_instance: BaseOperator,
73
- project_id: str,
74
- ):
75
- task_instance.xcom_push(
76
- context,
77
- key=CloudFunctionsDetailsLink.key,
78
- value={"project_id": project_id},
79
- )
@@ -19,14 +19,8 @@
19
19
 
20
20
  from __future__ import annotations
21
21
 
22
- from typing import TYPE_CHECKING
23
-
24
22
  from airflow.providers.google.cloud.links.base import BaseGoogleLink
25
23
 
26
- if TYPE_CHECKING:
27
- from airflow.models import BaseOperator
28
- from airflow.utils.context import Context
29
-
30
24
  BASE_LINK = "/memorystore"
31
25
  MEMCACHED_LINK = (
32
26
  BASE_LINK + "/memcached/locations/{location_id}/instances/{instance_id}/details?project={project_id}"
@@ -45,20 +39,6 @@ class MemcachedInstanceDetailsLink(BaseGoogleLink):
45
39
  key = "memcached_instance"
46
40
  format_str = MEMCACHED_LINK
47
41
 
48
- @staticmethod
49
- def persist(
50
- context: Context,
51
- task_instance: BaseOperator,
52
- instance_id: str,
53
- location_id: str,
54
- project_id: str | None,
55
- ):
56
- task_instance.xcom_push(
57
- context,
58
- key=MemcachedInstanceDetailsLink.key,
59
- value={"instance_id": instance_id, "location_id": location_id, "project_id": project_id},
60
- )
61
-
62
42
 
63
43
  class MemcachedInstanceListLink(BaseGoogleLink):
64
44
  """Helper class for constructing Memorystore Memcached List of Instances Link."""
@@ -67,18 +47,6 @@ class MemcachedInstanceListLink(BaseGoogleLink):
67
47
  key = "memcached_instances"
68
48
  format_str = MEMCACHED_LIST_LINK
69
49
 
70
- @staticmethod
71
- def persist(
72
- context: Context,
73
- task_instance: BaseOperator,
74
- project_id: str | None,
75
- ):
76
- task_instance.xcom_push(
77
- context,
78
- key=MemcachedInstanceListLink.key,
79
- value={"project_id": project_id},
80
- )
81
-
82
50
 
83
51
  class RedisInstanceDetailsLink(BaseGoogleLink):
84
52
  """Helper class for constructing Memorystore Redis Instance Link."""
@@ -87,20 +55,6 @@ class RedisInstanceDetailsLink(BaseGoogleLink):
87
55
  key = "redis_instance"
88
56
  format_str = REDIS_LINK
89
57
 
90
- @staticmethod
91
- def persist(
92
- context: Context,
93
- task_instance: BaseOperator,
94
- instance_id: str,
95
- location_id: str,
96
- project_id: str | None,
97
- ):
98
- task_instance.xcom_push(
99
- context,
100
- key=RedisInstanceDetailsLink.key,
101
- value={"instance_id": instance_id, "location_id": location_id, "project_id": project_id},
102
- )
103
-
104
58
 
105
59
  class RedisInstanceListLink(BaseGoogleLink):
106
60
  """Helper class for constructing Memorystore Redis List of Instances Link."""
@@ -108,15 +62,3 @@ class RedisInstanceListLink(BaseGoogleLink):
108
62
  name = "Memorystore Redis List of Instances"
109
63
  key = "redis_instances"
110
64
  format_str = REDIS_LIST_LINK
111
-
112
- @staticmethod
113
- def persist(
114
- context: Context,
115
- task_instance: BaseOperator,
116
- project_id: str | None,
117
- ):
118
- task_instance.xcom_push(
119
- context,
120
- key=RedisInstanceListLink.key,
121
- value={"project_id": project_id},
122
- )