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.
- airflow/providers/google/3rd-party-licenses/LICENSES.txt +14 -0
- airflow/providers/google/3rd-party-licenses/NOTICE +5 -0
- airflow/providers/google/__init__.py +3 -3
- airflow/providers/google/_vendor/__init__.py +0 -0
- airflow/providers/google/_vendor/json_merge_patch.py +91 -0
- airflow/providers/google/ads/hooks/ads.py +52 -43
- airflow/providers/google/ads/operators/ads.py +2 -2
- airflow/providers/google/ads/transfers/ads_to_gcs.py +3 -19
- airflow/providers/google/assets/gcs.py +1 -11
- airflow/providers/google/cloud/_internal_client/secret_manager_client.py +3 -2
- airflow/providers/google/cloud/bundles/gcs.py +161 -0
- airflow/providers/google/cloud/hooks/alloy_db.py +2 -3
- airflow/providers/google/cloud/hooks/bigquery.py +195 -318
- airflow/providers/google/cloud/hooks/bigquery_dts.py +8 -8
- airflow/providers/google/cloud/hooks/bigtable.py +3 -2
- airflow/providers/google/cloud/hooks/cloud_batch.py +8 -9
- airflow/providers/google/cloud/hooks/cloud_build.py +6 -65
- airflow/providers/google/cloud/hooks/cloud_composer.py +292 -24
- airflow/providers/google/cloud/hooks/cloud_logging.py +109 -0
- airflow/providers/google/cloud/hooks/cloud_memorystore.py +4 -3
- airflow/providers/google/cloud/hooks/cloud_run.py +20 -11
- airflow/providers/google/cloud/hooks/cloud_sql.py +136 -64
- airflow/providers/google/cloud/hooks/cloud_storage_transfer_service.py +35 -15
- airflow/providers/google/cloud/hooks/compute.py +7 -6
- airflow/providers/google/cloud/hooks/compute_ssh.py +7 -4
- airflow/providers/google/cloud/hooks/datacatalog.py +12 -3
- airflow/providers/google/cloud/hooks/dataflow.py +87 -242
- airflow/providers/google/cloud/hooks/dataform.py +9 -14
- airflow/providers/google/cloud/hooks/datafusion.py +7 -9
- airflow/providers/google/cloud/hooks/dataplex.py +13 -12
- airflow/providers/google/cloud/hooks/dataprep.py +2 -2
- airflow/providers/google/cloud/hooks/dataproc.py +76 -74
- airflow/providers/google/cloud/hooks/dataproc_metastore.py +4 -3
- airflow/providers/google/cloud/hooks/dlp.py +5 -4
- airflow/providers/google/cloud/hooks/gcs.py +144 -33
- airflow/providers/google/cloud/hooks/gen_ai.py +196 -0
- airflow/providers/google/cloud/hooks/kms.py +3 -2
- airflow/providers/google/cloud/hooks/kubernetes_engine.py +22 -17
- airflow/providers/google/cloud/hooks/looker.py +6 -1
- airflow/providers/google/cloud/hooks/managed_kafka.py +227 -3
- airflow/providers/google/cloud/hooks/mlengine.py +7 -8
- airflow/providers/google/cloud/hooks/natural_language.py +3 -2
- airflow/providers/google/cloud/hooks/os_login.py +3 -2
- airflow/providers/google/cloud/hooks/pubsub.py +6 -6
- airflow/providers/google/cloud/hooks/secret_manager.py +105 -12
- airflow/providers/google/cloud/hooks/spanner.py +75 -10
- airflow/providers/google/cloud/hooks/speech_to_text.py +3 -2
- airflow/providers/google/cloud/hooks/stackdriver.py +18 -18
- airflow/providers/google/cloud/hooks/tasks.py +4 -3
- airflow/providers/google/cloud/hooks/text_to_speech.py +3 -2
- airflow/providers/google/cloud/hooks/translate.py +8 -17
- airflow/providers/google/cloud/hooks/vertex_ai/auto_ml.py +8 -222
- airflow/providers/google/cloud/hooks/vertex_ai/batch_prediction_job.py +9 -15
- airflow/providers/google/cloud/hooks/vertex_ai/custom_job.py +33 -283
- airflow/providers/google/cloud/hooks/vertex_ai/dataset.py +5 -12
- airflow/providers/google/cloud/hooks/vertex_ai/endpoint_service.py +6 -12
- airflow/providers/google/cloud/hooks/vertex_ai/experiment_service.py +202 -0
- airflow/providers/google/cloud/hooks/vertex_ai/feature_store.py +311 -10
- airflow/providers/google/cloud/hooks/vertex_ai/generative_model.py +79 -75
- airflow/providers/google/cloud/hooks/vertex_ai/hyperparameter_tuning_job.py +7 -13
- airflow/providers/google/cloud/hooks/vertex_ai/model_service.py +8 -12
- airflow/providers/google/cloud/hooks/vertex_ai/pipeline_job.py +6 -12
- airflow/providers/google/cloud/hooks/vertex_ai/prediction_service.py +3 -2
- airflow/providers/google/cloud/hooks/vertex_ai/ray.py +223 -0
- airflow/providers/google/cloud/hooks/video_intelligence.py +3 -2
- airflow/providers/google/cloud/hooks/vision.py +7 -7
- airflow/providers/google/cloud/hooks/workflows.py +4 -3
- airflow/providers/google/cloud/links/alloy_db.py +0 -46
- airflow/providers/google/cloud/links/base.py +77 -7
- airflow/providers/google/cloud/links/bigquery.py +0 -47
- airflow/providers/google/cloud/links/bigquery_dts.py +0 -20
- airflow/providers/google/cloud/links/bigtable.py +0 -48
- airflow/providers/google/cloud/links/cloud_build.py +0 -73
- airflow/providers/google/cloud/links/cloud_functions.py +0 -33
- airflow/providers/google/cloud/links/cloud_memorystore.py +0 -58
- airflow/providers/google/cloud/links/{life_sciences.py → cloud_run.py} +5 -27
- airflow/providers/google/cloud/links/cloud_sql.py +0 -33
- airflow/providers/google/cloud/links/cloud_storage_transfer.py +17 -46
- airflow/providers/google/cloud/links/cloud_tasks.py +7 -26
- airflow/providers/google/cloud/links/compute.py +0 -58
- airflow/providers/google/cloud/links/data_loss_prevention.py +0 -169
- airflow/providers/google/cloud/links/datacatalog.py +23 -54
- airflow/providers/google/cloud/links/dataflow.py +0 -34
- airflow/providers/google/cloud/links/dataform.py +0 -64
- airflow/providers/google/cloud/links/datafusion.py +1 -90
- airflow/providers/google/cloud/links/dataplex.py +0 -154
- airflow/providers/google/cloud/links/dataprep.py +0 -24
- airflow/providers/google/cloud/links/dataproc.py +11 -89
- airflow/providers/google/cloud/links/datastore.py +0 -31
- airflow/providers/google/cloud/links/kubernetes_engine.py +11 -61
- airflow/providers/google/cloud/links/managed_kafka.py +11 -51
- airflow/providers/google/cloud/links/mlengine.py +0 -70
- airflow/providers/google/cloud/links/pubsub.py +0 -32
- airflow/providers/google/cloud/links/spanner.py +0 -33
- airflow/providers/google/cloud/links/stackdriver.py +0 -30
- airflow/providers/google/cloud/links/translate.py +17 -187
- airflow/providers/google/cloud/links/vertex_ai.py +28 -195
- airflow/providers/google/cloud/links/workflows.py +0 -52
- airflow/providers/google/cloud/log/gcs_task_handler.py +166 -118
- airflow/providers/google/cloud/log/stackdriver_task_handler.py +14 -9
- airflow/providers/google/cloud/openlineage/CloudStorageTransferJobFacet.json +68 -0
- airflow/providers/google/cloud/openlineage/CloudStorageTransferRunFacet.json +60 -0
- airflow/providers/google/cloud/openlineage/DataFusionRunFacet.json +32 -0
- airflow/providers/google/cloud/openlineage/facets.py +141 -40
- airflow/providers/google/cloud/openlineage/mixins.py +14 -13
- airflow/providers/google/cloud/openlineage/utils.py +19 -3
- airflow/providers/google/cloud/operators/alloy_db.py +76 -61
- airflow/providers/google/cloud/operators/bigquery.py +104 -667
- airflow/providers/google/cloud/operators/bigquery_dts.py +12 -12
- airflow/providers/google/cloud/operators/bigtable.py +38 -7
- airflow/providers/google/cloud/operators/cloud_base.py +22 -1
- airflow/providers/google/cloud/operators/cloud_batch.py +18 -18
- airflow/providers/google/cloud/operators/cloud_build.py +80 -36
- airflow/providers/google/cloud/operators/cloud_composer.py +157 -71
- airflow/providers/google/cloud/operators/cloud_logging_sink.py +341 -0
- airflow/providers/google/cloud/operators/cloud_memorystore.py +74 -46
- airflow/providers/google/cloud/operators/cloud_run.py +39 -20
- airflow/providers/google/cloud/operators/cloud_sql.py +46 -61
- airflow/providers/google/cloud/operators/cloud_storage_transfer_service.py +92 -14
- airflow/providers/google/cloud/operators/compute.py +18 -50
- airflow/providers/google/cloud/operators/datacatalog.py +167 -29
- airflow/providers/google/cloud/operators/dataflow.py +38 -15
- airflow/providers/google/cloud/operators/dataform.py +19 -7
- airflow/providers/google/cloud/operators/datafusion.py +43 -43
- airflow/providers/google/cloud/operators/dataplex.py +212 -126
- airflow/providers/google/cloud/operators/dataprep.py +1 -5
- airflow/providers/google/cloud/operators/dataproc.py +134 -207
- airflow/providers/google/cloud/operators/dataproc_metastore.py +102 -84
- airflow/providers/google/cloud/operators/datastore.py +22 -6
- airflow/providers/google/cloud/operators/dlp.py +24 -45
- airflow/providers/google/cloud/operators/functions.py +21 -14
- airflow/providers/google/cloud/operators/gcs.py +15 -12
- airflow/providers/google/cloud/operators/gen_ai.py +389 -0
- airflow/providers/google/cloud/operators/kubernetes_engine.py +115 -106
- airflow/providers/google/cloud/operators/looker.py +1 -1
- airflow/providers/google/cloud/operators/managed_kafka.py +362 -40
- airflow/providers/google/cloud/operators/natural_language.py +5 -3
- airflow/providers/google/cloud/operators/pubsub.py +69 -21
- airflow/providers/google/cloud/operators/spanner.py +53 -45
- airflow/providers/google/cloud/operators/speech_to_text.py +5 -4
- airflow/providers/google/cloud/operators/stackdriver.py +5 -11
- airflow/providers/google/cloud/operators/tasks.py +6 -15
- airflow/providers/google/cloud/operators/text_to_speech.py +4 -3
- airflow/providers/google/cloud/operators/translate.py +46 -20
- airflow/providers/google/cloud/operators/translate_speech.py +4 -3
- airflow/providers/google/cloud/operators/vertex_ai/auto_ml.py +44 -34
- airflow/providers/google/cloud/operators/vertex_ai/batch_prediction_job.py +34 -12
- airflow/providers/google/cloud/operators/vertex_ai/custom_job.py +62 -53
- airflow/providers/google/cloud/operators/vertex_ai/dataset.py +75 -11
- airflow/providers/google/cloud/operators/vertex_ai/endpoint_service.py +48 -12
- airflow/providers/google/cloud/operators/vertex_ai/experiment_service.py +435 -0
- airflow/providers/google/cloud/operators/vertex_ai/feature_store.py +532 -1
- airflow/providers/google/cloud/operators/vertex_ai/generative_model.py +135 -116
- airflow/providers/google/cloud/operators/vertex_ai/hyperparameter_tuning_job.py +16 -12
- airflow/providers/google/cloud/operators/vertex_ai/model_service.py +62 -14
- airflow/providers/google/cloud/operators/vertex_ai/pipeline_job.py +35 -10
- airflow/providers/google/cloud/operators/vertex_ai/ray.py +393 -0
- airflow/providers/google/cloud/operators/video_intelligence.py +5 -3
- airflow/providers/google/cloud/operators/vision.py +7 -5
- airflow/providers/google/cloud/operators/workflows.py +24 -19
- airflow/providers/google/cloud/secrets/secret_manager.py +2 -1
- airflow/providers/google/cloud/sensors/bigquery.py +2 -2
- airflow/providers/google/cloud/sensors/bigquery_dts.py +6 -4
- airflow/providers/google/cloud/sensors/bigtable.py +14 -6
- airflow/providers/google/cloud/sensors/cloud_composer.py +535 -33
- airflow/providers/google/cloud/sensors/cloud_storage_transfer_service.py +6 -5
- airflow/providers/google/cloud/sensors/dataflow.py +27 -10
- airflow/providers/google/cloud/sensors/dataform.py +2 -2
- airflow/providers/google/cloud/sensors/datafusion.py +4 -4
- airflow/providers/google/cloud/sensors/dataplex.py +7 -5
- airflow/providers/google/cloud/sensors/dataprep.py +2 -2
- airflow/providers/google/cloud/sensors/dataproc.py +10 -9
- airflow/providers/google/cloud/sensors/dataproc_metastore.py +4 -3
- airflow/providers/google/cloud/sensors/gcs.py +22 -21
- airflow/providers/google/cloud/sensors/looker.py +5 -5
- airflow/providers/google/cloud/sensors/pubsub.py +20 -20
- airflow/providers/google/cloud/sensors/tasks.py +2 -2
- airflow/providers/google/cloud/sensors/vertex_ai/feature_store.py +2 -2
- airflow/providers/google/cloud/sensors/workflows.py +6 -4
- airflow/providers/google/cloud/transfers/adls_to_gcs.py +1 -1
- airflow/providers/google/cloud/transfers/azure_blob_to_gcs.py +2 -2
- airflow/providers/google/cloud/transfers/azure_fileshare_to_gcs.py +2 -2
- airflow/providers/google/cloud/transfers/bigquery_to_bigquery.py +11 -8
- airflow/providers/google/cloud/transfers/bigquery_to_gcs.py +14 -13
- airflow/providers/google/cloud/transfers/bigquery_to_mssql.py +7 -3
- airflow/providers/google/cloud/transfers/bigquery_to_mysql.py +12 -1
- airflow/providers/google/cloud/transfers/bigquery_to_postgres.py +24 -10
- airflow/providers/google/cloud/transfers/bigquery_to_sql.py +104 -5
- airflow/providers/google/cloud/transfers/calendar_to_gcs.py +1 -1
- airflow/providers/google/cloud/transfers/cassandra_to_gcs.py +18 -22
- airflow/providers/google/cloud/transfers/facebook_ads_to_gcs.py +4 -5
- airflow/providers/google/cloud/transfers/gcs_to_bigquery.py +45 -38
- airflow/providers/google/cloud/transfers/gcs_to_gcs.py +2 -2
- airflow/providers/google/cloud/transfers/gcs_to_local.py +5 -3
- airflow/providers/google/cloud/transfers/gcs_to_sftp.py +10 -4
- airflow/providers/google/cloud/transfers/gdrive_to_gcs.py +6 -2
- airflow/providers/google/cloud/transfers/gdrive_to_local.py +2 -2
- airflow/providers/google/cloud/transfers/http_to_gcs.py +193 -0
- airflow/providers/google/cloud/transfers/local_to_gcs.py +2 -2
- airflow/providers/google/cloud/transfers/mssql_to_gcs.py +1 -1
- airflow/providers/google/cloud/transfers/oracle_to_gcs.py +36 -11
- airflow/providers/google/cloud/transfers/postgres_to_gcs.py +44 -12
- airflow/providers/google/cloud/transfers/s3_to_gcs.py +12 -6
- airflow/providers/google/cloud/transfers/salesforce_to_gcs.py +2 -2
- airflow/providers/google/cloud/transfers/sftp_to_gcs.py +36 -14
- airflow/providers/google/cloud/transfers/sheets_to_gcs.py +3 -3
- airflow/providers/google/cloud/transfers/sql_to_gcs.py +10 -10
- airflow/providers/google/cloud/triggers/bigquery.py +75 -34
- airflow/providers/google/cloud/triggers/bigquery_dts.py +2 -1
- airflow/providers/google/cloud/triggers/cloud_batch.py +2 -1
- airflow/providers/google/cloud/triggers/cloud_build.py +3 -2
- airflow/providers/google/cloud/triggers/cloud_composer.py +303 -47
- airflow/providers/google/cloud/triggers/cloud_run.py +2 -2
- airflow/providers/google/cloud/triggers/cloud_storage_transfer_service.py +96 -5
- airflow/providers/google/cloud/triggers/dataflow.py +125 -2
- airflow/providers/google/cloud/triggers/datafusion.py +1 -1
- airflow/providers/google/cloud/triggers/dataplex.py +16 -3
- airflow/providers/google/cloud/triggers/dataproc.py +124 -53
- airflow/providers/google/cloud/triggers/kubernetes_engine.py +46 -28
- airflow/providers/google/cloud/triggers/mlengine.py +1 -1
- airflow/providers/google/cloud/triggers/pubsub.py +17 -20
- airflow/providers/google/cloud/triggers/vertex_ai.py +8 -7
- airflow/providers/google/cloud/utils/bigquery.py +5 -7
- airflow/providers/google/cloud/utils/bigquery_get_data.py +1 -1
- airflow/providers/google/cloud/utils/credentials_provider.py +4 -3
- airflow/providers/google/cloud/utils/dataform.py +1 -1
- airflow/providers/google/cloud/utils/external_token_supplier.py +0 -1
- airflow/providers/google/cloud/utils/field_validator.py +1 -2
- airflow/providers/google/cloud/utils/validators.py +43 -0
- airflow/providers/google/common/auth_backend/google_openid.py +26 -9
- airflow/providers/google/common/consts.py +2 -1
- airflow/providers/google/common/deprecated.py +2 -1
- airflow/providers/google/common/hooks/base_google.py +40 -43
- airflow/providers/google/common/hooks/operation_helpers.py +78 -0
- airflow/providers/google/common/links/storage.py +0 -22
- airflow/providers/google/common/utils/get_secret.py +31 -0
- airflow/providers/google/common/utils/id_token_credentials.py +4 -5
- airflow/providers/google/firebase/operators/firestore.py +2 -2
- airflow/providers/google/get_provider_info.py +61 -216
- airflow/providers/google/go_module_utils.py +35 -3
- airflow/providers/google/leveldb/hooks/leveldb.py +30 -6
- airflow/providers/google/leveldb/operators/leveldb.py +2 -2
- airflow/providers/google/marketing_platform/hooks/analytics_admin.py +3 -2
- airflow/providers/google/marketing_platform/hooks/display_video.py +3 -109
- airflow/providers/google/marketing_platform/hooks/search_ads.py +1 -1
- airflow/providers/google/marketing_platform/links/analytics_admin.py +4 -5
- airflow/providers/google/marketing_platform/operators/analytics_admin.py +7 -6
- airflow/providers/google/marketing_platform/operators/campaign_manager.py +5 -5
- airflow/providers/google/marketing_platform/operators/display_video.py +28 -489
- airflow/providers/google/marketing_platform/operators/search_ads.py +2 -2
- airflow/providers/google/marketing_platform/sensors/campaign_manager.py +2 -2
- airflow/providers/google/marketing_platform/sensors/display_video.py +4 -64
- airflow/providers/google/suite/hooks/calendar.py +1 -1
- airflow/providers/google/suite/hooks/drive.py +2 -2
- airflow/providers/google/suite/hooks/sheets.py +15 -1
- airflow/providers/google/suite/operators/sheets.py +8 -3
- airflow/providers/google/suite/sensors/drive.py +2 -2
- airflow/providers/google/suite/transfers/gcs_to_gdrive.py +2 -2
- airflow/providers/google/suite/transfers/gcs_to_sheets.py +1 -1
- airflow/providers/google/suite/transfers/local_to_drive.py +3 -3
- airflow/providers/google/suite/transfers/sql_to_sheets.py +5 -4
- airflow/providers/google/version_compat.py +15 -1
- {apache_airflow_providers_google-14.0.0.dist-info → apache_airflow_providers_google-19.1.0rc1.dist-info}/METADATA +117 -72
- apache_airflow_providers_google-19.1.0rc1.dist-info/RECORD +331 -0
- {apache_airflow_providers_google-14.0.0.dist-info → apache_airflow_providers_google-19.1.0rc1.dist-info}/WHEEL +1 -1
- apache_airflow_providers_google-19.1.0rc1.dist-info/licenses/NOTICE +5 -0
- airflow/providers/google/cloud/example_dags/example_cloud_task.py +0 -54
- airflow/providers/google/cloud/hooks/automl.py +0 -679
- airflow/providers/google/cloud/hooks/life_sciences.py +0 -159
- airflow/providers/google/cloud/links/automl.py +0 -193
- airflow/providers/google/cloud/operators/automl.py +0 -1360
- airflow/providers/google/cloud/operators/life_sciences.py +0 -119
- airflow/providers/google/cloud/operators/mlengine.py +0 -1515
- airflow/providers/google/cloud/utils/mlengine_operator_utils.py +0 -273
- apache_airflow_providers_google-14.0.0.dist-info/RECORD +0 -318
- /airflow/providers/google/cloud/{example_dags → bundles}/__init__.py +0 -0
- {apache_airflow_providers_google-14.0.0.dist-info → apache_airflow_providers_google-19.1.0rc1.dist-info}/entry_points.txt +0 -0
- {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
|
-
|
|
108
|
-
VertexAIDatasetLink.persist(context=context,
|
|
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,
|
|
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
|
|
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
|
|
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
|
-
|
|
117
|
-
VertexAIEndpointLink.persist(context=context,
|
|
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
|
-
|
|
280
|
-
VertexAIModelLink.persist(context=context,
|
|
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,
|
|
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
|
|
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,
|
|
636
|
+
VertexAIEndpointLink.persist(context=context, endpoint_id=self.endpoint_id)
|
|
601
637
|
return Endpoint.to_dict(result)
|