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
@@ -20,20 +20,23 @@
20
20
  from __future__ import annotations
21
21
 
22
22
  from collections.abc import Sequence
23
- from typing import TYPE_CHECKING
23
+ from typing import TYPE_CHECKING, Any
24
24
 
25
- from airflow.providers.google.cloud.hooks.vertex_ai.dataset import DatasetHook
26
- from airflow.providers.google.cloud.links.vertex_ai import VertexAIDatasetLink, VertexAIDatasetListLink
27
- from airflow.providers.google.cloud.operators.cloud_base import GoogleCloudBaseOperator
28
25
  from google.api_core.exceptions import NotFound
29
26
  from google.api_core.gapic_v1.method import DEFAULT, _MethodDefault
30
27
  from google.cloud.aiplatform_v1.types import Dataset, ExportDataConfig, ImportDataConfig
31
28
 
29
+ from airflow.exceptions import AirflowException
30
+ from airflow.providers.google.cloud.hooks.vertex_ai.dataset import DatasetHook
31
+ from airflow.providers.google.cloud.links.vertex_ai import VertexAIDatasetLink, VertexAIDatasetListLink
32
+ from airflow.providers.google.cloud.operators.cloud_base import GoogleCloudBaseOperator
33
+
32
34
  if TYPE_CHECKING:
33
- from airflow.utils.context import Context
34
35
  from google.api_core.retry import Retry
35
36
  from google.protobuf.field_mask_pb2 import FieldMask
36
37
 
38
+ from airflow.providers.common.compat.sdk import Context
39
+
37
40
 
38
41
  class CreateDatasetOperator(GoogleCloudBaseOperator):
39
42
  """
@@ -83,6 +86,13 @@ class CreateDatasetOperator(GoogleCloudBaseOperator):
83
86
  self.gcp_conn_id = gcp_conn_id
84
87
  self.impersonation_chain = impersonation_chain
85
88
 
89
+ @property
90
+ def extra_links_params(self) -> dict[str, Any]:
91
+ return {
92
+ "region": self.region,
93
+ "project_id": self.project_id,
94
+ }
95
+
86
96
  def execute(self, context: Context):
87
97
  hook = DatasetHook(
88
98
  gcp_conn_id=self.gcp_conn_id,
@@ -104,8 +114,8 @@ class CreateDatasetOperator(GoogleCloudBaseOperator):
104
114
  dataset_id = hook.extract_dataset_id(dataset)
105
115
  self.log.info("Dataset was created. Dataset id: %s", dataset_id)
106
116
 
107
- self.xcom_push(context, key="dataset_id", value=dataset_id)
108
- VertexAIDatasetLink.persist(context=context, task_instance=self, dataset_id=dataset_id)
117
+ context["ti"].xcom_push(key="dataset_id", value=dataset_id)
118
+ VertexAIDatasetLink.persist(context=context, dataset_id=dataset_id)
109
119
  return dataset
110
120
 
111
121
 
@@ -158,6 +168,13 @@ class GetDatasetOperator(GoogleCloudBaseOperator):
158
168
  self.gcp_conn_id = gcp_conn_id
159
169
  self.impersonation_chain = impersonation_chain
160
170
 
171
+ @property
172
+ def extra_links_params(self) -> dict[str, Any]:
173
+ return {
174
+ "region": self.region,
175
+ "project_id": self.project_id,
176
+ }
177
+
161
178
  def execute(self, context: Context):
162
179
  hook = DatasetHook(
163
180
  gcp_conn_id=self.gcp_conn_id,
@@ -175,7 +192,7 @@ class GetDatasetOperator(GoogleCloudBaseOperator):
175
192
  timeout=self.timeout,
176
193
  metadata=self.metadata,
177
194
  )
178
- VertexAIDatasetLink.persist(context=context, task_instance=self, dataset_id=self.dataset_id)
195
+ VertexAIDatasetLink.persist(context=context, dataset_id=self.dataset_id)
179
196
  self.log.info("Dataset was gotten.")
180
197
  return Dataset.to_dict(dataset_obj)
181
198
  except NotFound:
@@ -319,7 +336,21 @@ class ExportDataOperator(GoogleCloudBaseOperator):
319
336
  self.log.info("Export was done successfully")
320
337
 
321
338
 
322
- class ImportDataOperator(GoogleCloudBaseOperator):
339
+ class DatasetImportDataResultsCheckHelper:
340
+ """Helper utils to verify import dataset data results."""
341
+
342
+ @staticmethod
343
+ def _get_number_of_ds_items(dataset, total_key_name):
344
+ number_of_items = type(dataset).to_dict(dataset).get(total_key_name, 0)
345
+ return number_of_items
346
+
347
+ @staticmethod
348
+ def _raise_for_empty_import_result(dataset_id, initial_size, size_after_import):
349
+ if int(size_after_import) - int(initial_size) <= 0:
350
+ raise AirflowException(f"Empty results of data import for the dataset_id {dataset_id}.")
351
+
352
+
353
+ class ImportDataOperator(GoogleCloudBaseOperator, DatasetImportDataResultsCheckHelper):
323
354
  """
324
355
  Imports data into a Dataset.
325
356
 
@@ -340,6 +371,7 @@ class ImportDataOperator(GoogleCloudBaseOperator):
340
371
  If set as a sequence, the identities from the list must grant
341
372
  Service Account Token Creator IAM role to the directly preceding identity, with first
342
373
  account from the list granting this role to the originating account (templated).
374
+ :param raise_for_empty_result: Raise an error if no additional data has been populated after the import.
343
375
  """
344
376
 
345
377
  template_fields = ("region", "dataset_id", "project_id", "impersonation_chain")
@@ -356,6 +388,7 @@ class ImportDataOperator(GoogleCloudBaseOperator):
356
388
  metadata: Sequence[tuple[str, str]] = (),
357
389
  gcp_conn_id: str = "google_cloud_default",
358
390
  impersonation_chain: str | Sequence[str] | None = None,
391
+ raise_for_empty_result: bool = False,
359
392
  **kwargs,
360
393
  ) -> None:
361
394
  super().__init__(**kwargs)
@@ -368,13 +401,24 @@ class ImportDataOperator(GoogleCloudBaseOperator):
368
401
  self.metadata = metadata
369
402
  self.gcp_conn_id = gcp_conn_id
370
403
  self.impersonation_chain = impersonation_chain
404
+ self.raise_for_empty_result = raise_for_empty_result
371
405
 
372
406
  def execute(self, context: Context):
373
407
  hook = DatasetHook(
374
408
  gcp_conn_id=self.gcp_conn_id,
375
409
  impersonation_chain=self.impersonation_chain,
376
410
  )
377
-
411
+ initial_dataset_size = self._get_number_of_ds_items(
412
+ dataset=hook.get_dataset(
413
+ dataset=self.dataset_id,
414
+ project_id=self.project_id,
415
+ region=self.region,
416
+ retry=self.retry,
417
+ timeout=self.timeout,
418
+ metadata=self.metadata,
419
+ ),
420
+ total_key_name="data_item_count",
421
+ )
378
422
  self.log.info("Importing data: %s", self.dataset_id)
379
423
  operation = hook.import_data(
380
424
  project_id=self.project_id,
@@ -386,7 +430,21 @@ class ImportDataOperator(GoogleCloudBaseOperator):
386
430
  metadata=self.metadata,
387
431
  )
388
432
  hook.wait_for_operation(timeout=self.timeout, operation=operation)
433
+ result_dataset_size = self._get_number_of_ds_items(
434
+ dataset=hook.get_dataset(
435
+ dataset=self.dataset_id,
436
+ project_id=self.project_id,
437
+ region=self.region,
438
+ retry=self.retry,
439
+ timeout=self.timeout,
440
+ metadata=self.metadata,
441
+ ),
442
+ total_key_name="data_item_count",
443
+ )
444
+ if self.raise_for_empty_result:
445
+ self._raise_for_empty_import_result(self.dataset_id, initial_dataset_size, result_dataset_size)
389
446
  self.log.info("Import was done successfully")
447
+ return {"total_data_items_imported": int(result_dataset_size) - int(initial_dataset_size)}
390
448
 
391
449
 
392
450
  class ListDatasetsOperator(GoogleCloudBaseOperator):
@@ -449,6 +507,12 @@ class ListDatasetsOperator(GoogleCloudBaseOperator):
449
507
  self.gcp_conn_id = gcp_conn_id
450
508
  self.impersonation_chain = impersonation_chain
451
509
 
510
+ @property
511
+ def extra_links_params(self) -> dict[str, Any]:
512
+ return {
513
+ "project_id": self.project_id,
514
+ }
515
+
452
516
  def execute(self, context: Context):
453
517
  hook = DatasetHook(
454
518
  gcp_conn_id=self.gcp_conn_id,
@@ -466,7 +530,7 @@ class ListDatasetsOperator(GoogleCloudBaseOperator):
466
530
  timeout=self.timeout,
467
531
  metadata=self.metadata,
468
532
  )
469
- VertexAIDatasetListLink.persist(context=context, task_instance=self)
533
+ VertexAIDatasetListLink.persist(context=context)
470
534
  return [Dataset.to_dict(result) for result in results]
471
535
 
472
536
 
@@ -21,7 +21,11 @@
21
21
  from __future__ import annotations
22
22
 
23
23
  from collections.abc import Sequence
24
- from typing import TYPE_CHECKING
24
+ from typing import TYPE_CHECKING, Any
25
+
26
+ from google.api_core.exceptions import NotFound
27
+ from google.api_core.gapic_v1.method import DEFAULT, _MethodDefault
28
+ from google.cloud.aiplatform_v1.types import DeployedModel, Endpoint, endpoint_service
25
29
 
26
30
  from airflow.providers.google.cloud.hooks.vertex_ai.endpoint_service import EndpointServiceHook
27
31
  from airflow.providers.google.cloud.links.vertex_ai import (
@@ -30,15 +34,13 @@ from airflow.providers.google.cloud.links.vertex_ai import (
30
34
  VertexAIModelLink,
31
35
  )
32
36
  from airflow.providers.google.cloud.operators.cloud_base import GoogleCloudBaseOperator
33
- from google.api_core.exceptions import NotFound
34
- from google.api_core.gapic_v1.method import DEFAULT, _MethodDefault
35
- from google.cloud.aiplatform_v1.types import DeployedModel, Endpoint, endpoint_service
36
37
 
37
38
  if TYPE_CHECKING:
38
- from airflow.utils.context import Context
39
39
  from google.api_core.retry import Retry
40
40
  from google.protobuf.field_mask_pb2 import FieldMask
41
41
 
42
+ from airflow.providers.common.compat.sdk import Context
43
+
42
44
 
43
45
  class CreateEndpointOperator(GoogleCloudBaseOperator):
44
46
  """
@@ -91,6 +93,13 @@ class CreateEndpointOperator(GoogleCloudBaseOperator):
91
93
  self.gcp_conn_id = gcp_conn_id
92
94
  self.impersonation_chain = impersonation_chain
93
95
 
96
+ @property
97
+ def extra_links_params(self) -> dict[str, Any]:
98
+ return {
99
+ "region": self.region,
100
+ "project_id": self.project_id,
101
+ }
102
+
94
103
  def execute(self, context: Context):
95
104
  hook = EndpointServiceHook(
96
105
  gcp_conn_id=self.gcp_conn_id,
@@ -113,8 +122,8 @@ class CreateEndpointOperator(GoogleCloudBaseOperator):
113
122
  endpoint_id = hook.extract_endpoint_id(endpoint)
114
123
  self.log.info("Endpoint was created. Endpoint ID: %s", endpoint_id)
115
124
 
116
- self.xcom_push(context, key="endpoint_id", value=endpoint_id)
117
- VertexAIEndpointLink.persist(context=context, task_instance=self, endpoint_id=endpoint_id)
125
+ context["ti"].xcom_push(key="endpoint_id", value=endpoint_id)
126
+ VertexAIEndpointLink.persist(context=context, endpoint_id=endpoint_id)
118
127
  return endpoint
119
128
 
120
129
 
@@ -253,6 +262,13 @@ class DeployModelOperator(GoogleCloudBaseOperator):
253
262
  self.gcp_conn_id = gcp_conn_id
254
263
  self.impersonation_chain = impersonation_chain
255
264
 
265
+ @property
266
+ def extra_links_params(self) -> dict[str, Any]:
267
+ return {
268
+ "region": self.region,
269
+ "project_id": self.project_id,
270
+ }
271
+
256
272
  def execute(self, context: Context):
257
273
  hook = EndpointServiceHook(
258
274
  gcp_conn_id=self.gcp_conn_id,
@@ -276,8 +292,8 @@ class DeployModelOperator(GoogleCloudBaseOperator):
276
292
  deployed_model_id = hook.extract_deployed_model_id(deploy_model)
277
293
  self.log.info("Model was deployed. Deployed Model ID: %s", deployed_model_id)
278
294
 
279
- self.xcom_push(context, key="deployed_model_id", value=deployed_model_id)
280
- VertexAIModelLink.persist(context=context, task_instance=self, model_id=deployed_model_id)
295
+ context["ti"].xcom_push(key="deployed_model_id", value=deployed_model_id)
296
+ VertexAIModelLink.persist(context=context, model_id=deployed_model_id)
281
297
  return deploy_model
282
298
 
283
299
 
@@ -328,6 +344,13 @@ class GetEndpointOperator(GoogleCloudBaseOperator):
328
344
  self.gcp_conn_id = gcp_conn_id
329
345
  self.impersonation_chain = impersonation_chain
330
346
 
347
+ @property
348
+ def extra_links_params(self) -> dict[str, Any]:
349
+ return {
350
+ "region": self.region,
351
+ "project_id": self.project_id,
352
+ }
353
+
331
354
  def execute(self, context: Context):
332
355
  hook = EndpointServiceHook(
333
356
  gcp_conn_id=self.gcp_conn_id,
@@ -344,7 +367,7 @@ class GetEndpointOperator(GoogleCloudBaseOperator):
344
367
  timeout=self.timeout,
345
368
  metadata=self.metadata,
346
369
  )
347
- VertexAIEndpointLink.persist(context=context, task_instance=self, endpoint_id=self.endpoint_id)
370
+ VertexAIEndpointLink.persist(context=context, endpoint_id=self.endpoint_id)
348
371
  self.log.info("Endpoint was gotten.")
349
372
  return Endpoint.to_dict(endpoint_obj)
350
373
  except NotFound:
@@ -427,6 +450,12 @@ class ListEndpointsOperator(GoogleCloudBaseOperator):
427
450
  self.gcp_conn_id = gcp_conn_id
428
451
  self.impersonation_chain = impersonation_chain
429
452
 
453
+ @property
454
+ def extra_links_params(self) -> dict[str, Any]:
455
+ return {
456
+ "project_id": self.project_id,
457
+ }
458
+
430
459
  def execute(self, context: Context):
431
460
  hook = EndpointServiceHook(
432
461
  gcp_conn_id=self.gcp_conn_id,
@@ -444,7 +473,7 @@ class ListEndpointsOperator(GoogleCloudBaseOperator):
444
473
  timeout=self.timeout,
445
474
  metadata=self.metadata,
446
475
  )
447
- VertexAIEndpointListLink.persist(context=context, task_instance=self)
476
+ VertexAIEndpointListLink.persist(context=context)
448
477
  return [Endpoint.to_dict(result) for result in results]
449
478
 
450
479
 
@@ -580,6 +609,13 @@ class UpdateEndpointOperator(GoogleCloudBaseOperator):
580
609
  self.gcp_conn_id = gcp_conn_id
581
610
  self.impersonation_chain = impersonation_chain
582
611
 
612
+ @property
613
+ def extra_links_params(self) -> dict[str, Any]:
614
+ return {
615
+ "region": self.region,
616
+ "project_id": self.project_id,
617
+ }
618
+
583
619
  def execute(self, context: Context):
584
620
  hook = EndpointServiceHook(
585
621
  gcp_conn_id=self.gcp_conn_id,
@@ -597,5 +633,5 @@ class UpdateEndpointOperator(GoogleCloudBaseOperator):
597
633
  metadata=self.metadata,
598
634
  )
599
635
  self.log.info("Endpoint was updated")
600
- VertexAIEndpointLink.persist(context=context, task_instance=self, endpoint_id=self.endpoint_id)
636
+ VertexAIEndpointLink.persist(context=context, endpoint_id=self.endpoint_id)
601
637
  return Endpoint.to_dict(result)