apache-airflow-providers-google 16.0.0a1__py3-none-any.whl → 16.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 (172) hide show
  1. airflow/providers/google/__init__.py +1 -1
  2. airflow/providers/google/ads/hooks/ads.py +43 -5
  3. airflow/providers/google/ads/operators/ads.py +1 -1
  4. airflow/providers/google/ads/transfers/ads_to_gcs.py +1 -1
  5. airflow/providers/google/cloud/hooks/bigquery.py +63 -77
  6. airflow/providers/google/cloud/hooks/cloud_sql.py +8 -4
  7. airflow/providers/google/cloud/hooks/datacatalog.py +9 -1
  8. airflow/providers/google/cloud/hooks/dataflow.py +2 -2
  9. airflow/providers/google/cloud/hooks/dataplex.py +1 -1
  10. airflow/providers/google/cloud/hooks/dataprep.py +4 -1
  11. airflow/providers/google/cloud/hooks/gcs.py +5 -5
  12. airflow/providers/google/cloud/hooks/looker.py +10 -1
  13. airflow/providers/google/cloud/hooks/mlengine.py +2 -1
  14. airflow/providers/google/cloud/hooks/secret_manager.py +102 -10
  15. airflow/providers/google/cloud/hooks/spanner.py +2 -2
  16. airflow/providers/google/cloud/hooks/translate.py +1 -1
  17. airflow/providers/google/cloud/hooks/vertex_ai/auto_ml.py +0 -36
  18. airflow/providers/google/cloud/hooks/vertex_ai/feature_store.py +307 -7
  19. airflow/providers/google/cloud/hooks/vertex_ai/generative_model.py +44 -80
  20. airflow/providers/google/cloud/hooks/vertex_ai/ray.py +11 -2
  21. airflow/providers/google/cloud/hooks/vision.py +2 -2
  22. airflow/providers/google/cloud/links/alloy_db.py +0 -46
  23. airflow/providers/google/cloud/links/base.py +75 -11
  24. airflow/providers/google/cloud/links/bigquery.py +0 -47
  25. airflow/providers/google/cloud/links/bigquery_dts.py +0 -20
  26. airflow/providers/google/cloud/links/bigtable.py +0 -48
  27. airflow/providers/google/cloud/links/cloud_build.py +0 -73
  28. airflow/providers/google/cloud/links/cloud_functions.py +0 -33
  29. airflow/providers/google/cloud/links/cloud_memorystore.py +0 -58
  30. airflow/providers/google/cloud/links/cloud_run.py +27 -0
  31. airflow/providers/google/cloud/links/cloud_sql.py +0 -33
  32. airflow/providers/google/cloud/links/cloud_storage_transfer.py +16 -43
  33. airflow/providers/google/cloud/links/cloud_tasks.py +6 -25
  34. airflow/providers/google/cloud/links/compute.py +0 -58
  35. airflow/providers/google/cloud/links/data_loss_prevention.py +0 -169
  36. airflow/providers/google/cloud/links/datacatalog.py +23 -54
  37. airflow/providers/google/cloud/links/dataflow.py +0 -34
  38. airflow/providers/google/cloud/links/dataform.py +0 -64
  39. airflow/providers/google/cloud/links/datafusion.py +1 -96
  40. airflow/providers/google/cloud/links/dataplex.py +0 -154
  41. airflow/providers/google/cloud/links/dataprep.py +0 -24
  42. airflow/providers/google/cloud/links/dataproc.py +14 -90
  43. airflow/providers/google/cloud/links/datastore.py +0 -31
  44. airflow/providers/google/cloud/links/kubernetes_engine.py +5 -59
  45. airflow/providers/google/cloud/links/life_sciences.py +0 -19
  46. airflow/providers/google/cloud/links/managed_kafka.py +0 -70
  47. airflow/providers/google/cloud/links/mlengine.py +0 -70
  48. airflow/providers/google/cloud/links/pubsub.py +0 -32
  49. airflow/providers/google/cloud/links/spanner.py +0 -33
  50. airflow/providers/google/cloud/links/stackdriver.py +0 -30
  51. airflow/providers/google/cloud/links/translate.py +16 -186
  52. airflow/providers/google/cloud/links/vertex_ai.py +8 -224
  53. airflow/providers/google/cloud/links/workflows.py +0 -52
  54. airflow/providers/google/cloud/log/gcs_task_handler.py +4 -4
  55. airflow/providers/google/cloud/operators/alloy_db.py +69 -54
  56. airflow/providers/google/cloud/operators/automl.py +16 -14
  57. airflow/providers/google/cloud/operators/bigquery.py +49 -25
  58. airflow/providers/google/cloud/operators/bigquery_dts.py +2 -4
  59. airflow/providers/google/cloud/operators/bigtable.py +35 -6
  60. airflow/providers/google/cloud/operators/cloud_base.py +21 -1
  61. airflow/providers/google/cloud/operators/cloud_build.py +74 -31
  62. airflow/providers/google/cloud/operators/cloud_composer.py +34 -35
  63. airflow/providers/google/cloud/operators/cloud_memorystore.py +68 -42
  64. airflow/providers/google/cloud/operators/cloud_run.py +9 -1
  65. airflow/providers/google/cloud/operators/cloud_sql.py +11 -15
  66. airflow/providers/google/cloud/operators/cloud_storage_transfer_service.py +0 -2
  67. airflow/providers/google/cloud/operators/compute.py +7 -39
  68. airflow/providers/google/cloud/operators/datacatalog.py +156 -20
  69. airflow/providers/google/cloud/operators/dataflow.py +37 -14
  70. airflow/providers/google/cloud/operators/dataform.py +14 -4
  71. airflow/providers/google/cloud/operators/datafusion.py +4 -12
  72. airflow/providers/google/cloud/operators/dataplex.py +180 -96
  73. airflow/providers/google/cloud/operators/dataprep.py +0 -4
  74. airflow/providers/google/cloud/operators/dataproc.py +10 -16
  75. airflow/providers/google/cloud/operators/dataproc_metastore.py +95 -87
  76. airflow/providers/google/cloud/operators/datastore.py +21 -5
  77. airflow/providers/google/cloud/operators/dlp.py +3 -26
  78. airflow/providers/google/cloud/operators/functions.py +15 -6
  79. airflow/providers/google/cloud/operators/gcs.py +1 -7
  80. airflow/providers/google/cloud/operators/kubernetes_engine.py +53 -92
  81. airflow/providers/google/cloud/operators/life_sciences.py +0 -1
  82. airflow/providers/google/cloud/operators/managed_kafka.py +106 -51
  83. airflow/providers/google/cloud/operators/mlengine.py +0 -1
  84. airflow/providers/google/cloud/operators/pubsub.py +4 -5
  85. airflow/providers/google/cloud/operators/spanner.py +0 -4
  86. airflow/providers/google/cloud/operators/speech_to_text.py +0 -1
  87. airflow/providers/google/cloud/operators/stackdriver.py +0 -8
  88. airflow/providers/google/cloud/operators/tasks.py +0 -11
  89. airflow/providers/google/cloud/operators/text_to_speech.py +0 -1
  90. airflow/providers/google/cloud/operators/translate.py +37 -13
  91. airflow/providers/google/cloud/operators/translate_speech.py +0 -1
  92. airflow/providers/google/cloud/operators/vertex_ai/auto_ml.py +31 -18
  93. airflow/providers/google/cloud/operators/vertex_ai/batch_prediction_job.py +28 -8
  94. airflow/providers/google/cloud/operators/vertex_ai/custom_job.py +38 -25
  95. airflow/providers/google/cloud/operators/vertex_ai/dataset.py +69 -7
  96. airflow/providers/google/cloud/operators/vertex_ai/endpoint_service.py +42 -8
  97. airflow/providers/google/cloud/operators/vertex_ai/feature_store.py +531 -0
  98. airflow/providers/google/cloud/operators/vertex_ai/generative_model.py +93 -117
  99. airflow/providers/google/cloud/operators/vertex_ai/hyperparameter_tuning_job.py +10 -8
  100. airflow/providers/google/cloud/operators/vertex_ai/model_service.py +56 -10
  101. airflow/providers/google/cloud/operators/vertex_ai/pipeline_job.py +29 -6
  102. airflow/providers/google/cloud/operators/vertex_ai/ray.py +9 -6
  103. airflow/providers/google/cloud/operators/workflows.py +1 -9
  104. airflow/providers/google/cloud/sensors/bigquery.py +1 -1
  105. airflow/providers/google/cloud/sensors/bigquery_dts.py +6 -1
  106. airflow/providers/google/cloud/sensors/bigtable.py +15 -3
  107. airflow/providers/google/cloud/sensors/cloud_composer.py +6 -1
  108. airflow/providers/google/cloud/sensors/cloud_storage_transfer_service.py +6 -1
  109. airflow/providers/google/cloud/sensors/dataflow.py +3 -3
  110. airflow/providers/google/cloud/sensors/dataform.py +6 -1
  111. airflow/providers/google/cloud/sensors/datafusion.py +6 -1
  112. airflow/providers/google/cloud/sensors/dataplex.py +6 -1
  113. airflow/providers/google/cloud/sensors/dataprep.py +6 -1
  114. airflow/providers/google/cloud/sensors/dataproc.py +6 -1
  115. airflow/providers/google/cloud/sensors/dataproc_metastore.py +6 -1
  116. airflow/providers/google/cloud/sensors/gcs.py +9 -3
  117. airflow/providers/google/cloud/sensors/looker.py +6 -1
  118. airflow/providers/google/cloud/sensors/pubsub.py +8 -3
  119. airflow/providers/google/cloud/sensors/tasks.py +6 -1
  120. airflow/providers/google/cloud/sensors/vertex_ai/feature_store.py +6 -1
  121. airflow/providers/google/cloud/sensors/workflows.py +6 -1
  122. airflow/providers/google/cloud/transfers/azure_blob_to_gcs.py +1 -1
  123. airflow/providers/google/cloud/transfers/azure_fileshare_to_gcs.py +1 -1
  124. airflow/providers/google/cloud/transfers/bigquery_to_bigquery.py +10 -7
  125. airflow/providers/google/cloud/transfers/bigquery_to_gcs.py +1 -2
  126. airflow/providers/google/cloud/transfers/bigquery_to_mssql.py +0 -1
  127. airflow/providers/google/cloud/transfers/bigquery_to_sql.py +1 -1
  128. airflow/providers/google/cloud/transfers/calendar_to_gcs.py +1 -1
  129. airflow/providers/google/cloud/transfers/cassandra_to_gcs.py +1 -1
  130. airflow/providers/google/cloud/transfers/facebook_ads_to_gcs.py +2 -2
  131. airflow/providers/google/cloud/transfers/gcs_to_bigquery.py +1 -2
  132. airflow/providers/google/cloud/transfers/gcs_to_gcs.py +1 -1
  133. airflow/providers/google/cloud/transfers/gcs_to_local.py +1 -1
  134. airflow/providers/google/cloud/transfers/gcs_to_sftp.py +1 -1
  135. airflow/providers/google/cloud/transfers/gdrive_to_gcs.py +5 -1
  136. airflow/providers/google/cloud/transfers/gdrive_to_local.py +1 -1
  137. airflow/providers/google/cloud/transfers/http_to_gcs.py +193 -0
  138. airflow/providers/google/cloud/transfers/local_to_gcs.py +1 -1
  139. airflow/providers/google/cloud/transfers/s3_to_gcs.py +11 -5
  140. airflow/providers/google/cloud/transfers/salesforce_to_gcs.py +1 -1
  141. airflow/providers/google/cloud/transfers/sftp_to_gcs.py +1 -1
  142. airflow/providers/google/cloud/transfers/sheets_to_gcs.py +2 -2
  143. airflow/providers/google/cloud/transfers/sql_to_gcs.py +1 -1
  144. airflow/providers/google/cloud/triggers/bigquery.py +32 -5
  145. airflow/providers/google/cloud/triggers/dataproc.py +62 -10
  146. airflow/providers/google/cloud/utils/field_validator.py +1 -2
  147. airflow/providers/google/common/auth_backend/google_openid.py +2 -1
  148. airflow/providers/google/common/deprecated.py +2 -1
  149. airflow/providers/google/common/hooks/base_google.py +7 -3
  150. airflow/providers/google/common/links/storage.py +0 -22
  151. airflow/providers/google/firebase/operators/firestore.py +1 -1
  152. airflow/providers/google/get_provider_info.py +14 -16
  153. airflow/providers/google/leveldb/hooks/leveldb.py +30 -1
  154. airflow/providers/google/leveldb/operators/leveldb.py +1 -1
  155. airflow/providers/google/marketing_platform/links/analytics_admin.py +3 -6
  156. airflow/providers/google/marketing_platform/operators/analytics_admin.py +0 -1
  157. airflow/providers/google/marketing_platform/operators/campaign_manager.py +4 -4
  158. airflow/providers/google/marketing_platform/operators/display_video.py +6 -6
  159. airflow/providers/google/marketing_platform/operators/search_ads.py +1 -1
  160. airflow/providers/google/marketing_platform/sensors/campaign_manager.py +6 -1
  161. airflow/providers/google/marketing_platform/sensors/display_video.py +6 -1
  162. airflow/providers/google/suite/operators/sheets.py +3 -3
  163. airflow/providers/google/suite/sensors/drive.py +6 -1
  164. airflow/providers/google/suite/transfers/gcs_to_gdrive.py +1 -1
  165. airflow/providers/google/suite/transfers/gcs_to_sheets.py +1 -1
  166. airflow/providers/google/suite/transfers/local_to_drive.py +1 -1
  167. airflow/providers/google/version_compat.py +28 -0
  168. {apache_airflow_providers_google-16.0.0a1.dist-info → apache_airflow_providers_google-16.1.0rc1.dist-info}/METADATA +35 -35
  169. {apache_airflow_providers_google-16.0.0a1.dist-info → apache_airflow_providers_google-16.1.0rc1.dist-info}/RECORD +171 -170
  170. airflow/providers/google/cloud/links/automl.py +0 -193
  171. {apache_airflow_providers_google-16.0.0a1.dist-info → apache_airflow_providers_google-16.1.0rc1.dist-info}/WHEEL +0 -0
  172. {apache_airflow_providers_google-16.0.0a1.dist-info → apache_airflow_providers_google-16.1.0rc1.dist-info}/entry_points.txt +0 -0
@@ -20,12 +20,13 @@
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
25
  from google.api_core.exceptions import NotFound
26
26
  from google.api_core.gapic_v1.method import DEFAULT, _MethodDefault
27
27
  from google.cloud.aiplatform_v1.types import Dataset, ExportDataConfig, ImportDataConfig
28
28
 
29
+ from airflow.exceptions import AirflowException
29
30
  from airflow.providers.google.cloud.hooks.vertex_ai.dataset import DatasetHook
30
31
  from airflow.providers.google.cloud.links.vertex_ai import VertexAIDatasetLink, VertexAIDatasetListLink
31
32
  from airflow.providers.google.cloud.operators.cloud_base import GoogleCloudBaseOperator
@@ -85,6 +86,13 @@ class CreateDatasetOperator(GoogleCloudBaseOperator):
85
86
  self.gcp_conn_id = gcp_conn_id
86
87
  self.impersonation_chain = impersonation_chain
87
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
+
88
96
  def execute(self, context: Context):
89
97
  hook = DatasetHook(
90
98
  gcp_conn_id=self.gcp_conn_id,
@@ -106,8 +114,8 @@ class CreateDatasetOperator(GoogleCloudBaseOperator):
106
114
  dataset_id = hook.extract_dataset_id(dataset)
107
115
  self.log.info("Dataset was created. Dataset id: %s", dataset_id)
108
116
 
109
- self.xcom_push(context, key="dataset_id", value=dataset_id)
110
- 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)
111
119
  return dataset
112
120
 
113
121
 
@@ -160,6 +168,13 @@ class GetDatasetOperator(GoogleCloudBaseOperator):
160
168
  self.gcp_conn_id = gcp_conn_id
161
169
  self.impersonation_chain = impersonation_chain
162
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
+
163
178
  def execute(self, context: Context):
164
179
  hook = DatasetHook(
165
180
  gcp_conn_id=self.gcp_conn_id,
@@ -177,7 +192,7 @@ class GetDatasetOperator(GoogleCloudBaseOperator):
177
192
  timeout=self.timeout,
178
193
  metadata=self.metadata,
179
194
  )
180
- VertexAIDatasetLink.persist(context=context, task_instance=self, dataset_id=self.dataset_id)
195
+ VertexAIDatasetLink.persist(context=context, dataset_id=self.dataset_id)
181
196
  self.log.info("Dataset was gotten.")
182
197
  return Dataset.to_dict(dataset_obj)
183
198
  except NotFound:
@@ -321,7 +336,21 @@ class ExportDataOperator(GoogleCloudBaseOperator):
321
336
  self.log.info("Export was done successfully")
322
337
 
323
338
 
324
- 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):
325
354
  """
326
355
  Imports data into a Dataset.
327
356
 
@@ -342,6 +371,7 @@ class ImportDataOperator(GoogleCloudBaseOperator):
342
371
  If set as a sequence, the identities from the list must grant
343
372
  Service Account Token Creator IAM role to the directly preceding identity, with first
344
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.
345
375
  """
346
376
 
347
377
  template_fields = ("region", "dataset_id", "project_id", "impersonation_chain")
@@ -358,6 +388,7 @@ class ImportDataOperator(GoogleCloudBaseOperator):
358
388
  metadata: Sequence[tuple[str, str]] = (),
359
389
  gcp_conn_id: str = "google_cloud_default",
360
390
  impersonation_chain: str | Sequence[str] | None = None,
391
+ raise_for_empty_result: bool = False,
361
392
  **kwargs,
362
393
  ) -> None:
363
394
  super().__init__(**kwargs)
@@ -370,13 +401,24 @@ class ImportDataOperator(GoogleCloudBaseOperator):
370
401
  self.metadata = metadata
371
402
  self.gcp_conn_id = gcp_conn_id
372
403
  self.impersonation_chain = impersonation_chain
404
+ self.raise_for_empty_result = raise_for_empty_result
373
405
 
374
406
  def execute(self, context: Context):
375
407
  hook = DatasetHook(
376
408
  gcp_conn_id=self.gcp_conn_id,
377
409
  impersonation_chain=self.impersonation_chain,
378
410
  )
379
-
411
+ initial_dataset_size = self._get_number_of_ds_items(
412
+ dataset=hook.get_dataset(
413
+ dataset_id=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
+ )
380
422
  self.log.info("Importing data: %s", self.dataset_id)
381
423
  operation = hook.import_data(
382
424
  project_id=self.project_id,
@@ -388,7 +430,21 @@ class ImportDataOperator(GoogleCloudBaseOperator):
388
430
  metadata=self.metadata,
389
431
  )
390
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_id=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)
391
446
  self.log.info("Import was done successfully")
447
+ return {"total_data_items_imported": int(result_dataset_size) - int(initial_dataset_size)}
392
448
 
393
449
 
394
450
  class ListDatasetsOperator(GoogleCloudBaseOperator):
@@ -451,6 +507,12 @@ class ListDatasetsOperator(GoogleCloudBaseOperator):
451
507
  self.gcp_conn_id = gcp_conn_id
452
508
  self.impersonation_chain = impersonation_chain
453
509
 
510
+ @property
511
+ def extra_links_params(self) -> dict[str, Any]:
512
+ return {
513
+ "project_id": self.project_id,
514
+ }
515
+
454
516
  def execute(self, context: Context):
455
517
  hook = DatasetHook(
456
518
  gcp_conn_id=self.gcp_conn_id,
@@ -468,7 +530,7 @@ class ListDatasetsOperator(GoogleCloudBaseOperator):
468
530
  timeout=self.timeout,
469
531
  metadata=self.metadata,
470
532
  )
471
- VertexAIDatasetListLink.persist(context=context, task_instance=self)
533
+ VertexAIDatasetListLink.persist(context=context)
472
534
  return [Dataset.to_dict(result) for result in results]
473
535
 
474
536
 
@@ -21,7 +21,7 @@
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
25
 
26
26
  from google.api_core.exceptions import NotFound
27
27
  from google.api_core.gapic_v1.method import DEFAULT, _MethodDefault
@@ -93,6 +93,13 @@ class CreateEndpointOperator(GoogleCloudBaseOperator):
93
93
  self.gcp_conn_id = gcp_conn_id
94
94
  self.impersonation_chain = impersonation_chain
95
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
+
96
103
  def execute(self, context: Context):
97
104
  hook = EndpointServiceHook(
98
105
  gcp_conn_id=self.gcp_conn_id,
@@ -115,8 +122,8 @@ class CreateEndpointOperator(GoogleCloudBaseOperator):
115
122
  endpoint_id = hook.extract_endpoint_id(endpoint)
116
123
  self.log.info("Endpoint was created. Endpoint ID: %s", endpoint_id)
117
124
 
118
- self.xcom_push(context, key="endpoint_id", value=endpoint_id)
119
- 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)
120
127
  return endpoint
121
128
 
122
129
 
@@ -255,6 +262,13 @@ class DeployModelOperator(GoogleCloudBaseOperator):
255
262
  self.gcp_conn_id = gcp_conn_id
256
263
  self.impersonation_chain = impersonation_chain
257
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
+
258
272
  def execute(self, context: Context):
259
273
  hook = EndpointServiceHook(
260
274
  gcp_conn_id=self.gcp_conn_id,
@@ -278,8 +292,8 @@ class DeployModelOperator(GoogleCloudBaseOperator):
278
292
  deployed_model_id = hook.extract_deployed_model_id(deploy_model)
279
293
  self.log.info("Model was deployed. Deployed Model ID: %s", deployed_model_id)
280
294
 
281
- self.xcom_push(context, key="deployed_model_id", value=deployed_model_id)
282
- 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)
283
297
  return deploy_model
284
298
 
285
299
 
@@ -330,6 +344,13 @@ class GetEndpointOperator(GoogleCloudBaseOperator):
330
344
  self.gcp_conn_id = gcp_conn_id
331
345
  self.impersonation_chain = impersonation_chain
332
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
+
333
354
  def execute(self, context: Context):
334
355
  hook = EndpointServiceHook(
335
356
  gcp_conn_id=self.gcp_conn_id,
@@ -346,7 +367,7 @@ class GetEndpointOperator(GoogleCloudBaseOperator):
346
367
  timeout=self.timeout,
347
368
  metadata=self.metadata,
348
369
  )
349
- VertexAIEndpointLink.persist(context=context, task_instance=self, endpoint_id=self.endpoint_id)
370
+ VertexAIEndpointLink.persist(context=context, endpoint_id=self.endpoint_id)
350
371
  self.log.info("Endpoint was gotten.")
351
372
  return Endpoint.to_dict(endpoint_obj)
352
373
  except NotFound:
@@ -429,6 +450,12 @@ class ListEndpointsOperator(GoogleCloudBaseOperator):
429
450
  self.gcp_conn_id = gcp_conn_id
430
451
  self.impersonation_chain = impersonation_chain
431
452
 
453
+ @property
454
+ def extra_links_params(self) -> dict[str, Any]:
455
+ return {
456
+ "project_id": self.project_id,
457
+ }
458
+
432
459
  def execute(self, context: Context):
433
460
  hook = EndpointServiceHook(
434
461
  gcp_conn_id=self.gcp_conn_id,
@@ -446,7 +473,7 @@ class ListEndpointsOperator(GoogleCloudBaseOperator):
446
473
  timeout=self.timeout,
447
474
  metadata=self.metadata,
448
475
  )
449
- VertexAIEndpointListLink.persist(context=context, task_instance=self)
476
+ VertexAIEndpointListLink.persist(context=context)
450
477
  return [Endpoint.to_dict(result) for result in results]
451
478
 
452
479
 
@@ -582,6 +609,13 @@ class UpdateEndpointOperator(GoogleCloudBaseOperator):
582
609
  self.gcp_conn_id = gcp_conn_id
583
610
  self.impersonation_chain = impersonation_chain
584
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
+
585
619
  def execute(self, context: Context):
586
620
  hook = EndpointServiceHook(
587
621
  gcp_conn_id=self.gcp_conn_id,
@@ -599,5 +633,5 @@ class UpdateEndpointOperator(GoogleCloudBaseOperator):
599
633
  metadata=self.metadata,
600
634
  )
601
635
  self.log.info("Endpoint was updated")
602
- VertexAIEndpointLink.persist(context=context, task_instance=self, endpoint_id=self.endpoint_id)
636
+ VertexAIEndpointLink.persist(context=context, endpoint_id=self.endpoint_id)
603
637
  return Endpoint.to_dict(result)