apache-airflow-providers-google 15.1.0rc1__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 (234) 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 -5
  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/bigquery.py +166 -281
  10. airflow/providers/google/cloud/hooks/cloud_composer.py +287 -14
  11. airflow/providers/google/cloud/hooks/cloud_logging.py +109 -0
  12. airflow/providers/google/cloud/hooks/cloud_run.py +17 -9
  13. airflow/providers/google/cloud/hooks/cloud_sql.py +101 -22
  14. airflow/providers/google/cloud/hooks/cloud_storage_transfer_service.py +27 -6
  15. airflow/providers/google/cloud/hooks/compute_ssh.py +5 -1
  16. airflow/providers/google/cloud/hooks/datacatalog.py +9 -1
  17. airflow/providers/google/cloud/hooks/dataflow.py +71 -94
  18. airflow/providers/google/cloud/hooks/datafusion.py +1 -1
  19. airflow/providers/google/cloud/hooks/dataplex.py +1 -1
  20. airflow/providers/google/cloud/hooks/dataprep.py +1 -1
  21. airflow/providers/google/cloud/hooks/dataproc.py +72 -71
  22. airflow/providers/google/cloud/hooks/gcs.py +111 -14
  23. airflow/providers/google/cloud/hooks/gen_ai.py +196 -0
  24. airflow/providers/google/cloud/hooks/kubernetes_engine.py +2 -2
  25. airflow/providers/google/cloud/hooks/looker.py +6 -1
  26. airflow/providers/google/cloud/hooks/mlengine.py +3 -2
  27. airflow/providers/google/cloud/hooks/secret_manager.py +102 -10
  28. airflow/providers/google/cloud/hooks/spanner.py +73 -8
  29. airflow/providers/google/cloud/hooks/stackdriver.py +10 -8
  30. airflow/providers/google/cloud/hooks/translate.py +1 -1
  31. airflow/providers/google/cloud/hooks/vertex_ai/auto_ml.py +0 -209
  32. airflow/providers/google/cloud/hooks/vertex_ai/batch_prediction_job.py +2 -2
  33. airflow/providers/google/cloud/hooks/vertex_ai/custom_job.py +27 -1
  34. airflow/providers/google/cloud/hooks/vertex_ai/experiment_service.py +202 -0
  35. airflow/providers/google/cloud/hooks/vertex_ai/feature_store.py +307 -7
  36. airflow/providers/google/cloud/hooks/vertex_ai/generative_model.py +79 -75
  37. airflow/providers/google/cloud/hooks/vertex_ai/ray.py +223 -0
  38. airflow/providers/google/cloud/hooks/vision.py +2 -2
  39. airflow/providers/google/cloud/hooks/workflows.py +1 -1
  40. airflow/providers/google/cloud/links/alloy_db.py +0 -46
  41. airflow/providers/google/cloud/links/base.py +77 -13
  42. airflow/providers/google/cloud/links/bigquery.py +0 -47
  43. airflow/providers/google/cloud/links/bigquery_dts.py +0 -20
  44. airflow/providers/google/cloud/links/bigtable.py +0 -48
  45. airflow/providers/google/cloud/links/cloud_build.py +0 -73
  46. airflow/providers/google/cloud/links/cloud_functions.py +0 -33
  47. airflow/providers/google/cloud/links/cloud_memorystore.py +0 -58
  48. airflow/providers/google/cloud/links/{life_sciences.py → cloud_run.py} +5 -27
  49. airflow/providers/google/cloud/links/cloud_sql.py +0 -33
  50. airflow/providers/google/cloud/links/cloud_storage_transfer.py +17 -44
  51. airflow/providers/google/cloud/links/cloud_tasks.py +7 -26
  52. airflow/providers/google/cloud/links/compute.py +0 -58
  53. airflow/providers/google/cloud/links/data_loss_prevention.py +0 -169
  54. airflow/providers/google/cloud/links/datacatalog.py +23 -54
  55. airflow/providers/google/cloud/links/dataflow.py +0 -34
  56. airflow/providers/google/cloud/links/dataform.py +0 -64
  57. airflow/providers/google/cloud/links/datafusion.py +1 -96
  58. airflow/providers/google/cloud/links/dataplex.py +0 -154
  59. airflow/providers/google/cloud/links/dataprep.py +0 -24
  60. airflow/providers/google/cloud/links/dataproc.py +11 -95
  61. airflow/providers/google/cloud/links/datastore.py +0 -31
  62. airflow/providers/google/cloud/links/kubernetes_engine.py +9 -60
  63. airflow/providers/google/cloud/links/managed_kafka.py +0 -70
  64. airflow/providers/google/cloud/links/mlengine.py +0 -70
  65. airflow/providers/google/cloud/links/pubsub.py +0 -32
  66. airflow/providers/google/cloud/links/spanner.py +0 -33
  67. airflow/providers/google/cloud/links/stackdriver.py +0 -30
  68. airflow/providers/google/cloud/links/translate.py +17 -187
  69. airflow/providers/google/cloud/links/vertex_ai.py +28 -195
  70. airflow/providers/google/cloud/links/workflows.py +0 -52
  71. airflow/providers/google/cloud/log/gcs_task_handler.py +17 -9
  72. airflow/providers/google/cloud/log/stackdriver_task_handler.py +9 -6
  73. airflow/providers/google/cloud/openlineage/CloudStorageTransferJobFacet.json +68 -0
  74. airflow/providers/google/cloud/openlineage/CloudStorageTransferRunFacet.json +60 -0
  75. airflow/providers/google/cloud/openlineage/DataFusionRunFacet.json +32 -0
  76. airflow/providers/google/cloud/openlineage/facets.py +102 -1
  77. airflow/providers/google/cloud/openlineage/mixins.py +10 -8
  78. airflow/providers/google/cloud/openlineage/utils.py +15 -1
  79. airflow/providers/google/cloud/operators/alloy_db.py +70 -55
  80. airflow/providers/google/cloud/operators/bigquery.py +73 -636
  81. airflow/providers/google/cloud/operators/bigquery_dts.py +3 -5
  82. airflow/providers/google/cloud/operators/bigtable.py +36 -7
  83. airflow/providers/google/cloud/operators/cloud_base.py +21 -1
  84. airflow/providers/google/cloud/operators/cloud_batch.py +2 -2
  85. airflow/providers/google/cloud/operators/cloud_build.py +75 -32
  86. airflow/providers/google/cloud/operators/cloud_composer.py +128 -40
  87. airflow/providers/google/cloud/operators/cloud_logging_sink.py +341 -0
  88. airflow/providers/google/cloud/operators/cloud_memorystore.py +69 -43
  89. airflow/providers/google/cloud/operators/cloud_run.py +23 -5
  90. airflow/providers/google/cloud/operators/cloud_sql.py +8 -16
  91. airflow/providers/google/cloud/operators/cloud_storage_transfer_service.py +92 -11
  92. airflow/providers/google/cloud/operators/compute.py +8 -40
  93. airflow/providers/google/cloud/operators/datacatalog.py +157 -21
  94. airflow/providers/google/cloud/operators/dataflow.py +38 -15
  95. airflow/providers/google/cloud/operators/dataform.py +15 -5
  96. airflow/providers/google/cloud/operators/datafusion.py +41 -20
  97. airflow/providers/google/cloud/operators/dataplex.py +193 -109
  98. airflow/providers/google/cloud/operators/dataprep.py +1 -5
  99. airflow/providers/google/cloud/operators/dataproc.py +78 -35
  100. airflow/providers/google/cloud/operators/dataproc_metastore.py +96 -88
  101. airflow/providers/google/cloud/operators/datastore.py +22 -6
  102. airflow/providers/google/cloud/operators/dlp.py +6 -29
  103. airflow/providers/google/cloud/operators/functions.py +16 -7
  104. airflow/providers/google/cloud/operators/gcs.py +10 -8
  105. airflow/providers/google/cloud/operators/gen_ai.py +389 -0
  106. airflow/providers/google/cloud/operators/kubernetes_engine.py +60 -99
  107. airflow/providers/google/cloud/operators/looker.py +1 -1
  108. airflow/providers/google/cloud/operators/managed_kafka.py +107 -52
  109. airflow/providers/google/cloud/operators/natural_language.py +1 -1
  110. airflow/providers/google/cloud/operators/pubsub.py +60 -14
  111. airflow/providers/google/cloud/operators/spanner.py +25 -12
  112. airflow/providers/google/cloud/operators/speech_to_text.py +1 -2
  113. airflow/providers/google/cloud/operators/stackdriver.py +1 -9
  114. airflow/providers/google/cloud/operators/tasks.py +1 -12
  115. airflow/providers/google/cloud/operators/text_to_speech.py +1 -2
  116. airflow/providers/google/cloud/operators/translate.py +40 -16
  117. airflow/providers/google/cloud/operators/translate_speech.py +1 -2
  118. airflow/providers/google/cloud/operators/vertex_ai/auto_ml.py +39 -19
  119. airflow/providers/google/cloud/operators/vertex_ai/batch_prediction_job.py +29 -9
  120. airflow/providers/google/cloud/operators/vertex_ai/custom_job.py +54 -26
  121. airflow/providers/google/cloud/operators/vertex_ai/dataset.py +70 -8
  122. airflow/providers/google/cloud/operators/vertex_ai/endpoint_service.py +43 -9
  123. airflow/providers/google/cloud/operators/vertex_ai/experiment_service.py +435 -0
  124. airflow/providers/google/cloud/operators/vertex_ai/feature_store.py +532 -1
  125. airflow/providers/google/cloud/operators/vertex_ai/generative_model.py +135 -116
  126. airflow/providers/google/cloud/operators/vertex_ai/hyperparameter_tuning_job.py +11 -9
  127. airflow/providers/google/cloud/operators/vertex_ai/model_service.py +57 -11
  128. airflow/providers/google/cloud/operators/vertex_ai/pipeline_job.py +30 -7
  129. airflow/providers/google/cloud/operators/vertex_ai/ray.py +393 -0
  130. airflow/providers/google/cloud/operators/video_intelligence.py +1 -1
  131. airflow/providers/google/cloud/operators/vision.py +2 -2
  132. airflow/providers/google/cloud/operators/workflows.py +18 -15
  133. airflow/providers/google/cloud/sensors/bigquery.py +2 -2
  134. airflow/providers/google/cloud/sensors/bigquery_dts.py +2 -2
  135. airflow/providers/google/cloud/sensors/bigtable.py +11 -4
  136. airflow/providers/google/cloud/sensors/cloud_composer.py +533 -29
  137. airflow/providers/google/cloud/sensors/cloud_storage_transfer_service.py +2 -2
  138. airflow/providers/google/cloud/sensors/dataflow.py +26 -9
  139. airflow/providers/google/cloud/sensors/dataform.py +2 -2
  140. airflow/providers/google/cloud/sensors/datafusion.py +4 -4
  141. airflow/providers/google/cloud/sensors/dataplex.py +2 -2
  142. airflow/providers/google/cloud/sensors/dataprep.py +2 -2
  143. airflow/providers/google/cloud/sensors/dataproc.py +2 -2
  144. airflow/providers/google/cloud/sensors/dataproc_metastore.py +2 -2
  145. airflow/providers/google/cloud/sensors/gcs.py +4 -4
  146. airflow/providers/google/cloud/sensors/looker.py +2 -2
  147. airflow/providers/google/cloud/sensors/pubsub.py +4 -4
  148. airflow/providers/google/cloud/sensors/tasks.py +2 -2
  149. airflow/providers/google/cloud/sensors/vertex_ai/feature_store.py +2 -2
  150. airflow/providers/google/cloud/sensors/workflows.py +2 -2
  151. airflow/providers/google/cloud/transfers/adls_to_gcs.py +1 -1
  152. airflow/providers/google/cloud/transfers/azure_blob_to_gcs.py +2 -2
  153. airflow/providers/google/cloud/transfers/azure_fileshare_to_gcs.py +2 -2
  154. airflow/providers/google/cloud/transfers/bigquery_to_bigquery.py +11 -8
  155. airflow/providers/google/cloud/transfers/bigquery_to_gcs.py +4 -4
  156. airflow/providers/google/cloud/transfers/bigquery_to_mssql.py +7 -3
  157. airflow/providers/google/cloud/transfers/bigquery_to_mysql.py +12 -1
  158. airflow/providers/google/cloud/transfers/bigquery_to_postgres.py +24 -10
  159. airflow/providers/google/cloud/transfers/bigquery_to_sql.py +104 -5
  160. airflow/providers/google/cloud/transfers/calendar_to_gcs.py +1 -1
  161. airflow/providers/google/cloud/transfers/cassandra_to_gcs.py +2 -2
  162. airflow/providers/google/cloud/transfers/facebook_ads_to_gcs.py +3 -3
  163. airflow/providers/google/cloud/transfers/gcs_to_bigquery.py +20 -12
  164. airflow/providers/google/cloud/transfers/gcs_to_gcs.py +2 -2
  165. airflow/providers/google/cloud/transfers/gcs_to_local.py +5 -3
  166. airflow/providers/google/cloud/transfers/gcs_to_sftp.py +10 -4
  167. airflow/providers/google/cloud/transfers/gdrive_to_gcs.py +6 -2
  168. airflow/providers/google/cloud/transfers/gdrive_to_local.py +2 -2
  169. airflow/providers/google/cloud/transfers/http_to_gcs.py +193 -0
  170. airflow/providers/google/cloud/transfers/local_to_gcs.py +2 -2
  171. airflow/providers/google/cloud/transfers/mssql_to_gcs.py +1 -1
  172. airflow/providers/google/cloud/transfers/oracle_to_gcs.py +36 -11
  173. airflow/providers/google/cloud/transfers/postgres_to_gcs.py +42 -9
  174. airflow/providers/google/cloud/transfers/s3_to_gcs.py +12 -6
  175. airflow/providers/google/cloud/transfers/salesforce_to_gcs.py +2 -2
  176. airflow/providers/google/cloud/transfers/sftp_to_gcs.py +13 -4
  177. airflow/providers/google/cloud/transfers/sheets_to_gcs.py +3 -3
  178. airflow/providers/google/cloud/transfers/sql_to_gcs.py +10 -10
  179. airflow/providers/google/cloud/triggers/bigquery.py +75 -34
  180. airflow/providers/google/cloud/triggers/cloud_build.py +1 -1
  181. airflow/providers/google/cloud/triggers/cloud_composer.py +302 -46
  182. airflow/providers/google/cloud/triggers/cloud_run.py +2 -2
  183. airflow/providers/google/cloud/triggers/cloud_storage_transfer_service.py +91 -1
  184. airflow/providers/google/cloud/triggers/dataflow.py +122 -0
  185. airflow/providers/google/cloud/triggers/datafusion.py +1 -1
  186. airflow/providers/google/cloud/triggers/dataplex.py +14 -2
  187. airflow/providers/google/cloud/triggers/dataproc.py +122 -52
  188. airflow/providers/google/cloud/triggers/kubernetes_engine.py +45 -27
  189. airflow/providers/google/cloud/triggers/mlengine.py +1 -1
  190. airflow/providers/google/cloud/triggers/pubsub.py +15 -19
  191. airflow/providers/google/cloud/utils/bigquery_get_data.py +1 -1
  192. airflow/providers/google/cloud/utils/credentials_provider.py +1 -1
  193. airflow/providers/google/cloud/utils/field_validator.py +1 -2
  194. airflow/providers/google/common/auth_backend/google_openid.py +4 -4
  195. airflow/providers/google/common/deprecated.py +2 -1
  196. airflow/providers/google/common/hooks/base_google.py +27 -8
  197. airflow/providers/google/common/links/storage.py +0 -22
  198. airflow/providers/google/common/utils/get_secret.py +31 -0
  199. airflow/providers/google/common/utils/id_token_credentials.py +3 -4
  200. airflow/providers/google/firebase/operators/firestore.py +2 -2
  201. airflow/providers/google/get_provider_info.py +56 -52
  202. airflow/providers/google/go_module_utils.py +35 -3
  203. airflow/providers/google/leveldb/hooks/leveldb.py +26 -1
  204. airflow/providers/google/leveldb/operators/leveldb.py +2 -2
  205. airflow/providers/google/marketing_platform/hooks/display_video.py +3 -109
  206. airflow/providers/google/marketing_platform/links/analytics_admin.py +5 -14
  207. airflow/providers/google/marketing_platform/operators/analytics_admin.py +1 -2
  208. airflow/providers/google/marketing_platform/operators/campaign_manager.py +5 -5
  209. airflow/providers/google/marketing_platform/operators/display_video.py +28 -489
  210. airflow/providers/google/marketing_platform/operators/search_ads.py +2 -2
  211. airflow/providers/google/marketing_platform/sensors/campaign_manager.py +2 -2
  212. airflow/providers/google/marketing_platform/sensors/display_video.py +3 -63
  213. airflow/providers/google/suite/hooks/calendar.py +1 -1
  214. airflow/providers/google/suite/hooks/sheets.py +15 -1
  215. airflow/providers/google/suite/operators/sheets.py +8 -3
  216. airflow/providers/google/suite/sensors/drive.py +2 -2
  217. airflow/providers/google/suite/transfers/gcs_to_gdrive.py +2 -2
  218. airflow/providers/google/suite/transfers/gcs_to_sheets.py +1 -1
  219. airflow/providers/google/suite/transfers/local_to_drive.py +3 -3
  220. airflow/providers/google/suite/transfers/sql_to_sheets.py +5 -4
  221. airflow/providers/google/version_compat.py +15 -1
  222. {apache_airflow_providers_google-15.1.0rc1.dist-info → apache_airflow_providers_google-19.1.0rc1.dist-info}/METADATA +92 -48
  223. apache_airflow_providers_google-19.1.0rc1.dist-info/RECORD +331 -0
  224. apache_airflow_providers_google-19.1.0rc1.dist-info/licenses/NOTICE +5 -0
  225. airflow/providers/google/cloud/hooks/automl.py +0 -673
  226. airflow/providers/google/cloud/hooks/life_sciences.py +0 -159
  227. airflow/providers/google/cloud/links/automl.py +0 -193
  228. airflow/providers/google/cloud/operators/automl.py +0 -1362
  229. airflow/providers/google/cloud/operators/life_sciences.py +0 -119
  230. airflow/providers/google/cloud/operators/mlengine.py +0 -112
  231. apache_airflow_providers_google-15.1.0rc1.dist-info/RECORD +0 -321
  232. {apache_airflow_providers_google-15.1.0rc1.dist-info → apache_airflow_providers_google-19.1.0rc1.dist-info}/WHEEL +0 -0
  233. {apache_airflow_providers_google-15.1.0rc1.dist-info → apache_airflow_providers_google-19.1.0rc1.dist-info}/entry_points.txt +0 -0
  234. {airflow/providers/google → apache_airflow_providers_google-19.1.0rc1.dist-info/licenses}/LICENSE +0 -0
@@ -19,13 +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.utils.context import Context
28
-
29
24
  DATAPLEX_BASE_LINK = "/dataplex/process/tasks"
30
25
  DATAPLEX_TASK_LINK = DATAPLEX_BASE_LINK + "/{lake_id}.{task_id};location={region}/jobs?project={project_id}"
31
26
  DATAPLEX_TASKS_LINK = DATAPLEX_BASE_LINK + "?project={project_id}&qLake={lake_id}.{region}"
@@ -53,22 +48,6 @@ class DataplexTaskLink(BaseGoogleLink):
53
48
  key = "task_conf"
54
49
  format_str = DATAPLEX_TASK_LINK
55
50
 
56
- @staticmethod
57
- def persist(
58
- context: Context,
59
- task_instance,
60
- ):
61
- task_instance.xcom_push(
62
- context=context,
63
- key=DataplexTaskLink.key,
64
- value={
65
- "lake_id": task_instance.lake_id,
66
- "task_id": task_instance.dataplex_task_id,
67
- "region": task_instance.region,
68
- "project_id": task_instance.project_id,
69
- },
70
- )
71
-
72
51
 
73
52
  class DataplexTasksLink(BaseGoogleLink):
74
53
  """Helper class for constructing Dataplex Tasks link."""
@@ -77,21 +56,6 @@ class DataplexTasksLink(BaseGoogleLink):
77
56
  key = "tasks_conf"
78
57
  format_str = DATAPLEX_TASKS_LINK
79
58
 
80
- @staticmethod
81
- def persist(
82
- context: Context,
83
- task_instance,
84
- ):
85
- task_instance.xcom_push(
86
- context=context,
87
- key=DataplexTasksLink.key,
88
- value={
89
- "project_id": task_instance.project_id,
90
- "lake_id": task_instance.lake_id,
91
- "region": task_instance.region,
92
- },
93
- )
94
-
95
59
 
96
60
  class DataplexLakeLink(BaseGoogleLink):
97
61
  """Helper class for constructing Dataplex Lake link."""
@@ -100,21 +64,6 @@ class DataplexLakeLink(BaseGoogleLink):
100
64
  key = "dataplex_lake_key"
101
65
  format_str = DATAPLEX_LAKE_LINK
102
66
 
103
- @staticmethod
104
- def persist(
105
- context: Context,
106
- task_instance,
107
- ):
108
- task_instance.xcom_push(
109
- context=context,
110
- key=DataplexLakeLink.key,
111
- value={
112
- "lake_id": task_instance.lake_id,
113
- "region": task_instance.region,
114
- "project_id": task_instance.project_id,
115
- },
116
- )
117
-
118
67
 
119
68
  class DataplexCatalogEntryGroupLink(BaseGoogleLink):
120
69
  """Helper class for constructing Dataplex Catalog EntryGroup link."""
@@ -123,21 +72,6 @@ class DataplexCatalogEntryGroupLink(BaseGoogleLink):
123
72
  key = "dataplex_catalog_entry_group_key"
124
73
  format_str = DATAPLEX_CATALOG_ENTRY_GROUP_LINK
125
74
 
126
- @staticmethod
127
- def persist(
128
- context: Context,
129
- task_instance,
130
- ):
131
- task_instance.xcom_push(
132
- context=context,
133
- key=DataplexCatalogEntryGroupLink.key,
134
- value={
135
- "entry_group_id": task_instance.entry_group_id,
136
- "location": task_instance.location,
137
- "project_id": task_instance.project_id,
138
- },
139
- )
140
-
141
75
 
142
76
  class DataplexCatalogEntryGroupsLink(BaseGoogleLink):
143
77
  """Helper class for constructing Dataplex Catalog EntryGroups link."""
@@ -146,20 +80,6 @@ class DataplexCatalogEntryGroupsLink(BaseGoogleLink):
146
80
  key = "dataplex_catalog_entry_groups_key"
147
81
  format_str = DATAPLEX_CATALOG_ENTRY_GROUPS_LINK
148
82
 
149
- @staticmethod
150
- def persist(
151
- context: Context,
152
- task_instance,
153
- ):
154
- task_instance.xcom_push(
155
- context=context,
156
- key=DataplexCatalogEntryGroupsLink.key,
157
- value={
158
- "location": task_instance.location,
159
- "project_id": task_instance.project_id,
160
- },
161
- )
162
-
163
83
 
164
84
  class DataplexCatalogEntryTypeLink(BaseGoogleLink):
165
85
  """Helper class for constructing Dataplex Catalog EntryType link."""
@@ -168,21 +88,6 @@ class DataplexCatalogEntryTypeLink(BaseGoogleLink):
168
88
  key = "dataplex_catalog_entry_type_key"
169
89
  format_str = DATAPLEX_CATALOG_ENTRY_TYPE_LINK
170
90
 
171
- @staticmethod
172
- def persist(
173
- context: Context,
174
- task_instance,
175
- ):
176
- task_instance.xcom_push(
177
- context=context,
178
- key=DataplexCatalogEntryTypeLink.key,
179
- value={
180
- "entry_type_id": task_instance.entry_type_id,
181
- "location": task_instance.location,
182
- "project_id": task_instance.project_id,
183
- },
184
- )
185
-
186
91
 
187
92
  class DataplexCatalogEntryTypesLink(BaseGoogleLink):
188
93
  """Helper class for constructing Dataplex Catalog EntryTypes link."""
@@ -191,20 +96,6 @@ class DataplexCatalogEntryTypesLink(BaseGoogleLink):
191
96
  key = "dataplex_catalog_entry_types_key"
192
97
  format_str = DATAPLEX_CATALOG_ENTRY_TYPES_LINK
193
98
 
194
- @staticmethod
195
- def persist(
196
- context: Context,
197
- task_instance,
198
- ):
199
- task_instance.xcom_push(
200
- context=context,
201
- key=DataplexCatalogEntryTypesLink.key,
202
- value={
203
- "location": task_instance.location,
204
- "project_id": task_instance.project_id,
205
- },
206
- )
207
-
208
99
 
209
100
  class DataplexCatalogAspectTypeLink(BaseGoogleLink):
210
101
  """Helper class for constructing Dataplex Catalog AspectType link."""
@@ -213,21 +104,6 @@ class DataplexCatalogAspectTypeLink(BaseGoogleLink):
213
104
  key = "dataplex_catalog_aspect_type_key"
214
105
  format_str = DATAPLEX_CATALOG_ASPECT_TYPE_LINK
215
106
 
216
- @staticmethod
217
- def persist(
218
- context: Context,
219
- task_instance,
220
- ):
221
- task_instance.xcom_push(
222
- context=context,
223
- key=DataplexCatalogAspectTypeLink.key,
224
- value={
225
- "aspect_type_id": task_instance.aspect_type_id,
226
- "location": task_instance.location,
227
- "project_id": task_instance.project_id,
228
- },
229
- )
230
-
231
107
 
232
108
  class DataplexCatalogAspectTypesLink(BaseGoogleLink):
233
109
  """Helper class for constructing Dataplex Catalog AspectTypes link."""
@@ -236,20 +112,6 @@ class DataplexCatalogAspectTypesLink(BaseGoogleLink):
236
112
  key = "dataplex_catalog_aspect_types_key"
237
113
  format_str = DATAPLEX_CATALOG_ASPECT_TYPES_LINK
238
114
 
239
- @staticmethod
240
- def persist(
241
- context: Context,
242
- task_instance,
243
- ):
244
- task_instance.xcom_push(
245
- context=context,
246
- key=DataplexCatalogAspectTypesLink.key,
247
- value={
248
- "location": task_instance.location,
249
- "project_id": task_instance.project_id,
250
- },
251
- )
252
-
253
115
 
254
116
  class DataplexCatalogEntryLink(BaseGoogleLink):
255
117
  """Helper class for constructing Dataplex Catalog Entry link."""
@@ -257,19 +119,3 @@ class DataplexCatalogEntryLink(BaseGoogleLink):
257
119
  name = "Dataplex Catalog Entry"
258
120
  key = "dataplex_catalog_entry_key"
259
121
  format_str = DATAPLEX_CATALOG_ENTRY_LINK
260
-
261
- @staticmethod
262
- def persist(
263
- context: Context,
264
- task_instance,
265
- ):
266
- task_instance.xcom_push(
267
- context=context,
268
- key=DataplexCatalogEntryLink.key,
269
- value={
270
- "entry_id": task_instance.entry_id,
271
- "entry_group_id": task_instance.entry_group_id,
272
- "location": task_instance.location,
273
- "project_id": task_instance.project_id,
274
- },
275
- )
@@ -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
  BASE_LINK = "https://clouddataprep.com"
27
22
  DATAPREP_FLOW_LINK = BASE_LINK + "/flows/{flow_id}?projectId={project_id}"
28
23
  DATAPREP_JOB_GROUP_LINK = BASE_LINK + "/jobs/{job_group_id}?projectId={project_id}"
@@ -35,14 +30,6 @@ class DataprepFlowLink(BaseGoogleLink):
35
30
  key = "dataprep_flow_page"
36
31
  format_str = DATAPREP_FLOW_LINK
37
32
 
38
- @staticmethod
39
- def persist(context: Context, task_instance, project_id: str, flow_id: int):
40
- task_instance.xcom_push(
41
- context=context,
42
- key=DataprepFlowLink.key,
43
- value={"project_id": project_id, "flow_id": flow_id},
44
- )
45
-
46
33
 
47
34
  class DataprepJobGroupLink(BaseGoogleLink):
48
35
  """Helper class for constructing Dataprep job group link."""
@@ -50,14 +37,3 @@ class DataprepJobGroupLink(BaseGoogleLink):
50
37
  name = "Job group details page"
51
38
  key = "dataprep_job_group_page"
52
39
  format_str = DATAPREP_JOB_GROUP_LINK
53
-
54
- @staticmethod
55
- def persist(context: Context, task_instance, project_id: str, job_group_id: int):
56
- task_instance.xcom_push(
57
- context=context,
58
- key=DataprepJobGroupLink.key,
59
- value={
60
- "project_id": project_id,
61
- "job_group_id": job_group_id,
62
- },
63
- )
@@ -25,20 +25,13 @@ from typing import TYPE_CHECKING, Any
25
25
  import attr
26
26
 
27
27
  from airflow.exceptions import AirflowProviderDeprecationWarning
28
+ from airflow.providers.common.compat.sdk import BaseOperatorLink, XCom
28
29
  from airflow.providers.google.cloud.links.base import BASE_LINK, BaseGoogleLink
29
- from airflow.providers.google.version_compat import AIRFLOW_V_3_0_PLUS
30
30
 
31
31
  if TYPE_CHECKING:
32
- from airflow.models import BaseOperator
33
32
  from airflow.models.taskinstancekey import TaskInstanceKey
34
- from airflow.utils.context import Context
35
-
36
- if AIRFLOW_V_3_0_PLUS:
37
- from airflow.sdk import BaseOperatorLink
38
- from airflow.sdk.execution_time.xcom import XCom
39
- else:
40
- from airflow.models import XCom # type: ignore[no-redef]
41
- from airflow.models.baseoperatorlink import BaseOperatorLink # type: ignore[no-redef]
33
+ from airflow.providers.common.compat.sdk import Context
34
+ from airflow.providers.google.version_compat import BaseOperator
42
35
 
43
36
 
44
37
  def __getattr__(name: str) -> Any:
@@ -94,16 +87,16 @@ class DataprocLink(BaseOperatorLink):
94
87
  @staticmethod
95
88
  def persist(
96
89
  context: Context,
97
- task_instance,
98
90
  url: str,
99
91
  resource: str,
92
+ region: str,
93
+ project_id: str,
100
94
  ):
101
- task_instance.xcom_push(
102
- context=context,
95
+ context["task_instance"].xcom_push(
103
96
  key=DataprocLink.key,
104
97
  value={
105
- "region": task_instance.region,
106
- "project_id": task_instance.project_id,
98
+ "region": region,
99
+ "project_id": project_id,
107
100
  "url": url,
108
101
  "resource": resource,
109
102
  },
@@ -147,14 +140,13 @@ class DataprocListLink(BaseOperatorLink):
147
140
  @staticmethod
148
141
  def persist(
149
142
  context: Context,
150
- task_instance,
151
143
  url: str,
144
+ project_id: str,
152
145
  ):
153
- task_instance.xcom_push(
154
- context=context,
146
+ context["task_instance"].xcom_push(
155
147
  key=DataprocListLink.key,
156
148
  value={
157
- "project_id": task_instance.project_id,
149
+ "project_id": project_id,
158
150
  "url": url,
159
151
  },
160
152
  )
@@ -189,20 +181,6 @@ class DataprocClusterLink(BaseGoogleLink):
189
181
  key = "dataproc_cluster"
190
182
  format_str = DATAPROC_CLUSTER_LINK
191
183
 
192
- @staticmethod
193
- def persist(
194
- context: Context,
195
- operator: BaseOperator,
196
- cluster_id: str,
197
- region: str,
198
- project_id: str,
199
- ):
200
- operator.xcom_push(
201
- context,
202
- key=DataprocClusterLink.key,
203
- value={"cluster_id": cluster_id, "region": region, "project_id": project_id},
204
- )
205
-
206
184
 
207
185
  class DataprocJobLink(BaseGoogleLink):
208
186
  """Helper class for constructing Dataproc Job Link."""
@@ -211,20 +189,6 @@ class DataprocJobLink(BaseGoogleLink):
211
189
  key = "dataproc_job"
212
190
  format_str = DATAPROC_JOB_LINK
213
191
 
214
- @staticmethod
215
- def persist(
216
- context: Context,
217
- operator: BaseOperator,
218
- job_id: str,
219
- region: str,
220
- project_id: str,
221
- ):
222
- operator.xcom_push(
223
- context,
224
- key=DataprocJobLink.key,
225
- value={"job_id": job_id, "region": region, "project_id": project_id},
226
- )
227
-
228
192
 
229
193
  class DataprocWorkflowLink(BaseGoogleLink):
230
194
  """Helper class for constructing Dataproc Workflow Link."""
@@ -233,14 +197,6 @@ class DataprocWorkflowLink(BaseGoogleLink):
233
197
  key = "dataproc_workflow"
234
198
  format_str = DATAPROC_WORKFLOW_LINK
235
199
 
236
- @staticmethod
237
- def persist(context: Context, operator: BaseOperator, workflow_id: str, project_id: str, region: str):
238
- operator.xcom_push(
239
- context,
240
- key=DataprocWorkflowLink.key,
241
- value={"workflow_id": workflow_id, "region": region, "project_id": project_id},
242
- )
243
-
244
200
 
245
201
  class DataprocWorkflowTemplateLink(BaseGoogleLink):
246
202
  """Helper class for constructing Dataproc Workflow Template Link."""
@@ -249,20 +205,6 @@ class DataprocWorkflowTemplateLink(BaseGoogleLink):
249
205
  key = "dataproc_workflow_template"
250
206
  format_str = DATAPROC_WORKFLOW_TEMPLATE_LINK
251
207
 
252
- @staticmethod
253
- def persist(
254
- context: Context,
255
- operator: BaseOperator,
256
- workflow_template_id: str,
257
- project_id: str,
258
- region: str,
259
- ):
260
- operator.xcom_push(
261
- context,
262
- key=DataprocWorkflowTemplateLink.key,
263
- value={"workflow_template_id": workflow_template_id, "region": region, "project_id": project_id},
264
- )
265
-
266
208
 
267
209
  class DataprocBatchLink(BaseGoogleLink):
268
210
  """Helper class for constructing Dataproc Batch Link."""
@@ -271,20 +213,6 @@ class DataprocBatchLink(BaseGoogleLink):
271
213
  key = "dataproc_batch"
272
214
  format_str = DATAPROC_BATCH_LINK
273
215
 
274
- @staticmethod
275
- def persist(
276
- context: Context,
277
- operator: BaseOperator,
278
- batch_id: str,
279
- project_id: str,
280
- region: str,
281
- ):
282
- operator.xcom_push(
283
- context,
284
- key=DataprocBatchLink.key,
285
- value={"batch_id": batch_id, "region": region, "project_id": project_id},
286
- )
287
-
288
216
 
289
217
  class DataprocBatchesListLink(BaseGoogleLink):
290
218
  """Helper class for constructing Dataproc Batches List Link."""
@@ -292,15 +220,3 @@ class DataprocBatchesListLink(BaseGoogleLink):
292
220
  name = "Dataproc Batches List"
293
221
  key = "dataproc_batches_list"
294
222
  format_str = DATAPROC_BATCHES_LINK
295
-
296
- @staticmethod
297
- def persist(
298
- context: Context,
299
- operator: BaseOperator,
300
- project_id: str,
301
- ):
302
- operator.xcom_push(
303
- context,
304
- key=DataprocBatchesListLink.key,
305
- value={"project_id": project_id},
306
- )
@@ -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
  DATASTORE_BASE_LINK = "/datastore"
27
22
  DATASTORE_IMPORT_EXPORT_LINK = DATASTORE_BASE_LINK + "/import-export?project={project_id}"
28
23
  DATASTORE_EXPORT_ENTITIES_LINK = "/storage/browser/{bucket_name}/{export_name}?project={project_id}"
@@ -36,19 +31,6 @@ class CloudDatastoreImportExportLink(BaseGoogleLink):
36
31
  key = "import_export_conf"
37
32
  format_str = DATASTORE_IMPORT_EXPORT_LINK
38
33
 
39
- @staticmethod
40
- def persist(
41
- context: Context,
42
- task_instance,
43
- ):
44
- task_instance.xcom_push(
45
- context=context,
46
- key=CloudDatastoreImportExportLink.key,
47
- value={
48
- "project_id": task_instance.project_id,
49
- },
50
- )
51
-
52
34
 
53
35
  class CloudDatastoreEntitiesLink(BaseGoogleLink):
54
36
  """Helper class for constructing Cloud Datastore Entities Link."""
@@ -56,16 +38,3 @@ class CloudDatastoreEntitiesLink(BaseGoogleLink):
56
38
  name = "Entities"
57
39
  key = "entities_conf"
58
40
  format_str = DATASTORE_ENTITIES_LINK
59
-
60
- @staticmethod
61
- def persist(
62
- context: Context,
63
- task_instance,
64
- ):
65
- task_instance.xcom_push(
66
- context=context,
67
- key=CloudDatastoreEntitiesLink.key,
68
- value={
69
- "project_id": task_instance.project_id,
70
- },
71
- )
@@ -24,7 +24,7 @@ from google.cloud.container_v1.types import Cluster
24
24
  from airflow.providers.google.cloud.links.base import BaseGoogleLink
25
25
 
26
26
  if TYPE_CHECKING:
27
- from airflow.utils.context import Context
27
+ from airflow.providers.common.compat.sdk import Context
28
28
 
29
29
  KUBERNETES_BASE_LINK = "/kubernetes"
30
30
  KUBERNETES_CLUSTER_LINK = (
@@ -51,19 +51,18 @@ class KubernetesEngineClusterLink(BaseGoogleLink):
51
51
  key = "kubernetes_cluster_conf"
52
52
  format_str = KUBERNETES_CLUSTER_LINK
53
53
 
54
- @staticmethod
55
- def persist(context: Context, task_instance, cluster: dict | Cluster | None):
54
+ @classmethod
55
+ def persist(cls, context: Context, **value):
56
+ cluster = value.get("cluster")
56
57
  if isinstance(cluster, dict):
57
58
  cluster = Cluster.from_json(json.dumps(cluster))
58
59
 
59
- task_instance.xcom_push(
60
+ if not cluster:
61
+ raise ValueError("Cluster must be provided for KubernetesEngineClusterLink.")
62
+
63
+ super().persist(
60
64
  context=context,
61
- key=KubernetesEngineClusterLink.key,
62
- value={
63
- "location": task_instance.location,
64
- "cluster_name": cluster.name, # type: ignore
65
- "project_id": task_instance.project_id,
66
- },
65
+ cluster_name=cluster.name,
67
66
  )
68
67
 
69
68
 
@@ -74,23 +73,6 @@ class KubernetesEnginePodLink(BaseGoogleLink):
74
73
  key = "kubernetes_pod_conf"
75
74
  format_str = KUBERNETES_POD_LINK
76
75
 
77
- @staticmethod
78
- def persist(
79
- context: Context,
80
- task_instance,
81
- ):
82
- task_instance.xcom_push(
83
- context=context,
84
- key=KubernetesEnginePodLink.key,
85
- value={
86
- "location": task_instance.location,
87
- "cluster_name": task_instance.cluster_name,
88
- "namespace": task_instance.pod.metadata.namespace,
89
- "pod_name": task_instance.pod.metadata.name,
90
- "project_id": task_instance.project_id,
91
- },
92
- )
93
-
94
76
 
95
77
  class KubernetesEngineJobLink(BaseGoogleLink):
96
78
  """Helper class for constructing Kubernetes Engine Job Link."""
@@ -99,23 +81,6 @@ class KubernetesEngineJobLink(BaseGoogleLink):
99
81
  key = "kubernetes_job_conf"
100
82
  format_str = KUBERNETES_JOB_LINK
101
83
 
102
- @staticmethod
103
- def persist(
104
- context: Context,
105
- task_instance,
106
- ):
107
- task_instance.xcom_push(
108
- context=context,
109
- key=KubernetesEngineJobLink.key,
110
- value={
111
- "location": task_instance.location,
112
- "cluster_name": task_instance.cluster_name,
113
- "namespace": task_instance.job.metadata.namespace,
114
- "job_name": task_instance.job.metadata.name,
115
- "project_id": task_instance.project_id,
116
- },
117
- )
118
-
119
84
 
120
85
  class KubernetesEngineWorkloadsLink(BaseGoogleLink):
121
86
  """Helper class for constructing Kubernetes Engine Workloads Link."""
@@ -123,19 +88,3 @@ class KubernetesEngineWorkloadsLink(BaseGoogleLink):
123
88
  name = "Kubernetes Workloads"
124
89
  key = "kubernetes_workloads_conf"
125
90
  format_str = KUBERNETES_WORKLOADS_LINK
126
-
127
- @staticmethod
128
- def persist(
129
- context: Context,
130
- task_instance,
131
- ):
132
- task_instance.xcom_push(
133
- context=context,
134
- key=KubernetesEngineWorkloadsLink.key,
135
- value={
136
- "location": task_instance.location,
137
- "cluster_name": task_instance.cluster_name,
138
- "namespace": task_instance.namespace,
139
- "project_id": task_instance.project_id,
140
- },
141
- )
@@ -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
  MANAGED_KAFKA_BASE_LINK = "/managedkafka"
27
22
  MANAGED_KAFKA_CLUSTER_LINK = (
28
23
  MANAGED_KAFKA_BASE_LINK + "/{location}/clusters/{cluster_id}?project={project_id}"
@@ -44,22 +39,6 @@ class ApacheKafkaClusterLink(BaseGoogleLink):
44
39
  key = "cluster_conf"
45
40
  format_str = MANAGED_KAFKA_CLUSTER_LINK
46
41
 
47
- @staticmethod
48
- def persist(
49
- context: Context,
50
- task_instance,
51
- cluster_id: str,
52
- ):
53
- task_instance.xcom_push(
54
- context=context,
55
- key=ApacheKafkaClusterLink.key,
56
- value={
57
- "location": task_instance.location,
58
- "cluster_id": cluster_id,
59
- "project_id": task_instance.project_id,
60
- },
61
- )
62
-
63
42
 
64
43
  class ApacheKafkaClusterListLink(BaseGoogleLink):
65
44
  """Helper class for constructing Apache Kafka Clusters link."""
@@ -68,19 +47,6 @@ class ApacheKafkaClusterListLink(BaseGoogleLink):
68
47
  key = "cluster_list_conf"
69
48
  format_str = MANAGED_KAFKA_CLUSTER_LIST_LINK
70
49
 
71
- @staticmethod
72
- def persist(
73
- context: Context,
74
- task_instance,
75
- ):
76
- task_instance.xcom_push(
77
- context=context,
78
- key=ApacheKafkaClusterListLink.key,
79
- value={
80
- "project_id": task_instance.project_id,
81
- },
82
- )
83
-
84
50
 
85
51
  class ApacheKafkaTopicLink(BaseGoogleLink):
86
52
  """Helper class for constructing Apache Kafka Topic link."""
@@ -89,24 +55,6 @@ class ApacheKafkaTopicLink(BaseGoogleLink):
89
55
  key = "topic_conf"
90
56
  format_str = MANAGED_KAFKA_TOPIC_LINK
91
57
 
92
- @staticmethod
93
- def persist(
94
- context: Context,
95
- task_instance,
96
- cluster_id: str,
97
- topic_id: str,
98
- ):
99
- task_instance.xcom_push(
100
- context=context,
101
- key=ApacheKafkaTopicLink.key,
102
- value={
103
- "location": task_instance.location,
104
- "cluster_id": cluster_id,
105
- "topic_id": topic_id,
106
- "project_id": task_instance.project_id,
107
- },
108
- )
109
-
110
58
 
111
59
  class ApacheKafkaConsumerGroupLink(BaseGoogleLink):
112
60
  """Helper class for constructing Apache Kafka Consumer Group link."""
@@ -114,21 +62,3 @@ class ApacheKafkaConsumerGroupLink(BaseGoogleLink):
114
62
  name = "Apache Kafka Consumer Group"
115
63
  key = "consumer_group_conf"
116
64
  format_str = MANAGED_KAFKA_CONSUMER_GROUP_LINK
117
-
118
- @staticmethod
119
- def persist(
120
- context: Context,
121
- task_instance,
122
- cluster_id: str,
123
- consumer_group_id: str,
124
- ):
125
- task_instance.xcom_push(
126
- context=context,
127
- key=ApacheKafkaConsumerGroupLink.key,
128
- value={
129
- "location": task_instance.location,
130
- "cluster_id": cluster_id,
131
- "consumer_group_id": consumer_group_id,
132
- "project_id": task_instance.project_id,
133
- },
134
- )