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
|
@@ -19,14 +19,8 @@
|
|
|
19
19
|
|
|
20
20
|
from __future__ import annotations
|
|
21
21
|
|
|
22
|
-
from typing import TYPE_CHECKING
|
|
23
|
-
|
|
24
22
|
from airflow.providers.google.cloud.links.base import BaseGoogleLink
|
|
25
23
|
|
|
26
|
-
if TYPE_CHECKING:
|
|
27
|
-
from airflow.models import BaseOperator
|
|
28
|
-
from airflow.utils.context import Context
|
|
29
|
-
|
|
30
24
|
DATAFLOW_BASE_LINK = "/dataflow/jobs"
|
|
31
25
|
DATAFLOW_JOB_LINK = DATAFLOW_BASE_LINK + "/{region}/{job_id}?project={project_id}"
|
|
32
26
|
|
|
@@ -41,20 +35,6 @@ class DataflowJobLink(BaseGoogleLink):
|
|
|
41
35
|
key = "dataflow_job_config"
|
|
42
36
|
format_str = DATAFLOW_JOB_LINK
|
|
43
37
|
|
|
44
|
-
@staticmethod
|
|
45
|
-
def persist(
|
|
46
|
-
operator_instance: BaseOperator,
|
|
47
|
-
context: Context,
|
|
48
|
-
project_id: str | None,
|
|
49
|
-
region: str | None,
|
|
50
|
-
job_id: str | None,
|
|
51
|
-
):
|
|
52
|
-
operator_instance.xcom_push(
|
|
53
|
-
context,
|
|
54
|
-
key=DataflowJobLink.key,
|
|
55
|
-
value={"project_id": project_id, "region": region, "job_id": job_id},
|
|
56
|
-
)
|
|
57
|
-
|
|
58
38
|
|
|
59
39
|
class DataflowPipelineLink(BaseGoogleLink):
|
|
60
40
|
"""Helper class for constructing Dataflow Pipeline Link."""
|
|
@@ -62,17 +42,3 @@ class DataflowPipelineLink(BaseGoogleLink):
|
|
|
62
42
|
name = "Dataflow Pipeline"
|
|
63
43
|
key = "dataflow_pipeline_config"
|
|
64
44
|
format_str = DATAFLOW_PIPELINE_LINK
|
|
65
|
-
|
|
66
|
-
@staticmethod
|
|
67
|
-
def persist(
|
|
68
|
-
operator_instance: BaseOperator,
|
|
69
|
-
context: Context,
|
|
70
|
-
project_id: str | None,
|
|
71
|
-
location: str | None,
|
|
72
|
-
pipeline_name: str | None,
|
|
73
|
-
):
|
|
74
|
-
operator_instance.xcom_push(
|
|
75
|
-
context,
|
|
76
|
-
key=DataflowPipelineLink.key,
|
|
77
|
-
value={"project_id": project_id, "location": location, "pipeline_name": pipeline_name},
|
|
78
|
-
)
|
|
@@ -19,14 +19,8 @@
|
|
|
19
19
|
|
|
20
20
|
from __future__ import annotations
|
|
21
21
|
|
|
22
|
-
from typing import TYPE_CHECKING
|
|
23
|
-
|
|
24
22
|
from airflow.providers.google.cloud.links.base import BaseGoogleLink
|
|
25
23
|
|
|
26
|
-
if TYPE_CHECKING:
|
|
27
|
-
from airflow.models import BaseOperator
|
|
28
|
-
from airflow.utils.context import Context
|
|
29
|
-
|
|
30
24
|
DATAFORM_BASE_LINK = "/bigquery/dataform"
|
|
31
25
|
DATAFORM_WORKFLOW_INVOCATION_LINK = (
|
|
32
26
|
DATAFORM_BASE_LINK
|
|
@@ -53,26 +47,6 @@ class DataformWorkflowInvocationLink(BaseGoogleLink):
|
|
|
53
47
|
key = "dataform_workflow_invocation_config"
|
|
54
48
|
format_str = DATAFORM_WORKFLOW_INVOCATION_LINK
|
|
55
49
|
|
|
56
|
-
@staticmethod
|
|
57
|
-
def persist(
|
|
58
|
-
operator_instance: BaseOperator,
|
|
59
|
-
context: Context,
|
|
60
|
-
project_id: str,
|
|
61
|
-
region: str,
|
|
62
|
-
repository_id: str,
|
|
63
|
-
workflow_invocation_id: str,
|
|
64
|
-
):
|
|
65
|
-
operator_instance.xcom_push(
|
|
66
|
-
context,
|
|
67
|
-
key=DataformWorkflowInvocationLink.key,
|
|
68
|
-
value={
|
|
69
|
-
"project_id": project_id,
|
|
70
|
-
"region": region,
|
|
71
|
-
"repository_id": repository_id,
|
|
72
|
-
"workflow_invocation_id": workflow_invocation_id,
|
|
73
|
-
},
|
|
74
|
-
)
|
|
75
|
-
|
|
76
50
|
|
|
77
51
|
class DataformRepositoryLink(BaseGoogleLink):
|
|
78
52
|
"""Helper class for constructing Dataflow repository link."""
|
|
@@ -81,24 +55,6 @@ class DataformRepositoryLink(BaseGoogleLink):
|
|
|
81
55
|
key = "dataform_repository"
|
|
82
56
|
format_str = DATAFORM_REPOSITORY_LINK
|
|
83
57
|
|
|
84
|
-
@staticmethod
|
|
85
|
-
def persist(
|
|
86
|
-
operator_instance: BaseOperator,
|
|
87
|
-
context: Context,
|
|
88
|
-
project_id: str,
|
|
89
|
-
region: str,
|
|
90
|
-
repository_id: str,
|
|
91
|
-
) -> None:
|
|
92
|
-
operator_instance.xcom_push(
|
|
93
|
-
context=context,
|
|
94
|
-
key=DataformRepositoryLink.key,
|
|
95
|
-
value={
|
|
96
|
-
"project_id": project_id,
|
|
97
|
-
"region": region,
|
|
98
|
-
"repository_id": repository_id,
|
|
99
|
-
},
|
|
100
|
-
)
|
|
101
|
-
|
|
102
58
|
|
|
103
59
|
class DataformWorkspaceLink(BaseGoogleLink):
|
|
104
60
|
"""Helper class for constructing Dataform workspace link."""
|
|
@@ -106,23 +62,3 @@ class DataformWorkspaceLink(BaseGoogleLink):
|
|
|
106
62
|
name = "Dataform Workspace"
|
|
107
63
|
key = "dataform_workspace"
|
|
108
64
|
format_str = DATAFORM_WORKSPACE_LINK
|
|
109
|
-
|
|
110
|
-
@staticmethod
|
|
111
|
-
def persist(
|
|
112
|
-
operator_instance: BaseOperator,
|
|
113
|
-
context: Context,
|
|
114
|
-
project_id: str,
|
|
115
|
-
region: str,
|
|
116
|
-
repository_id: str,
|
|
117
|
-
workspace_id: str,
|
|
118
|
-
) -> None:
|
|
119
|
-
operator_instance.xcom_push(
|
|
120
|
-
context=context,
|
|
121
|
-
key=DataformWorkspaceLink.key,
|
|
122
|
-
value={
|
|
123
|
-
"project_id": project_id,
|
|
124
|
-
"region": region,
|
|
125
|
-
"repository_id": repository_id,
|
|
126
|
-
"workspace_id": workspace_id,
|
|
127
|
-
},
|
|
128
|
-
)
|
|
@@ -19,15 +19,7 @@
|
|
|
19
19
|
|
|
20
20
|
from __future__ import annotations
|
|
21
21
|
|
|
22
|
-
from
|
|
23
|
-
|
|
24
|
-
from airflow.models import BaseOperatorLink, XCom
|
|
25
|
-
|
|
26
|
-
if TYPE_CHECKING:
|
|
27
|
-
from airflow.models import BaseOperator
|
|
28
|
-
from airflow.models.taskinstancekey import TaskInstanceKey
|
|
29
|
-
from airflow.utils.context import Context
|
|
30
|
-
|
|
22
|
+
from airflow.providers.google.cloud.links.base import BaseGoogleLink
|
|
31
23
|
|
|
32
24
|
BASE_LINK = "https://console.cloud.google.com/data-fusion"
|
|
33
25
|
DATAFUSION_INSTANCE_LINK = BASE_LINK + "/locations/{region}/instances/{instance_name}?project={project_id}"
|
|
@@ -35,35 +27,6 @@ DATAFUSION_PIPELINES_LINK = "{uri}/cdap/ns/{namespace}/pipelines"
|
|
|
35
27
|
DATAFUSION_PIPELINE_LINK = "{uri}/pipelines/ns/{namespace}/view/{pipeline_name}"
|
|
36
28
|
|
|
37
29
|
|
|
38
|
-
class BaseGoogleLink(BaseOperatorLink):
|
|
39
|
-
"""
|
|
40
|
-
Link for Google operators.
|
|
41
|
-
|
|
42
|
-
Prevent adding ``https://console.cloud.google.com`` in front of every link
|
|
43
|
-
where URI is used.
|
|
44
|
-
"""
|
|
45
|
-
|
|
46
|
-
name: ClassVar[str]
|
|
47
|
-
key: ClassVar[str]
|
|
48
|
-
format_str: ClassVar[str]
|
|
49
|
-
|
|
50
|
-
def get_link(
|
|
51
|
-
self,
|
|
52
|
-
operator: BaseOperator,
|
|
53
|
-
*,
|
|
54
|
-
ti_key: TaskInstanceKey,
|
|
55
|
-
) -> str:
|
|
56
|
-
conf = XCom.get_value(key=self.key, ti_key=ti_key)
|
|
57
|
-
|
|
58
|
-
if not conf:
|
|
59
|
-
return ""
|
|
60
|
-
|
|
61
|
-
# Add a default value for the 'namespace' parameter for backward compatibility.
|
|
62
|
-
conf.setdefault("namespace", "default")
|
|
63
|
-
|
|
64
|
-
return self.format_str.format(**conf)
|
|
65
|
-
|
|
66
|
-
|
|
67
30
|
class DataFusionInstanceLink(BaseGoogleLink):
|
|
68
31
|
"""Helper class for constructing Data Fusion Instance link."""
|
|
69
32
|
|
|
@@ -71,24 +34,6 @@ class DataFusionInstanceLink(BaseGoogleLink):
|
|
|
71
34
|
key = "instance_conf"
|
|
72
35
|
format_str = DATAFUSION_INSTANCE_LINK
|
|
73
36
|
|
|
74
|
-
@staticmethod
|
|
75
|
-
def persist(
|
|
76
|
-
context: Context,
|
|
77
|
-
task_instance: BaseOperator,
|
|
78
|
-
location: str,
|
|
79
|
-
instance_name: str,
|
|
80
|
-
project_id: str,
|
|
81
|
-
):
|
|
82
|
-
task_instance.xcom_push(
|
|
83
|
-
context=context,
|
|
84
|
-
key=DataFusionInstanceLink.key,
|
|
85
|
-
value={
|
|
86
|
-
"region": location,
|
|
87
|
-
"instance_name": instance_name,
|
|
88
|
-
"project_id": project_id,
|
|
89
|
-
},
|
|
90
|
-
)
|
|
91
|
-
|
|
92
37
|
|
|
93
38
|
class DataFusionPipelineLink(BaseGoogleLink):
|
|
94
39
|
"""Helper class for constructing Data Fusion Pipeline link."""
|
|
@@ -97,24 +42,6 @@ class DataFusionPipelineLink(BaseGoogleLink):
|
|
|
97
42
|
key = "pipeline_conf"
|
|
98
43
|
format_str = DATAFUSION_PIPELINE_LINK
|
|
99
44
|
|
|
100
|
-
@staticmethod
|
|
101
|
-
def persist(
|
|
102
|
-
context: Context,
|
|
103
|
-
task_instance: BaseOperator,
|
|
104
|
-
uri: str,
|
|
105
|
-
pipeline_name: str,
|
|
106
|
-
namespace: str,
|
|
107
|
-
):
|
|
108
|
-
task_instance.xcom_push(
|
|
109
|
-
context=context,
|
|
110
|
-
key=DataFusionPipelineLink.key,
|
|
111
|
-
value={
|
|
112
|
-
"uri": uri,
|
|
113
|
-
"pipeline_name": pipeline_name,
|
|
114
|
-
"namespace": namespace,
|
|
115
|
-
},
|
|
116
|
-
)
|
|
117
|
-
|
|
118
45
|
|
|
119
46
|
class DataFusionPipelinesLink(BaseGoogleLink):
|
|
120
47
|
"""Helper class for constructing list of Data Fusion Pipelines link."""
|
|
@@ -122,19 +49,3 @@ class DataFusionPipelinesLink(BaseGoogleLink):
|
|
|
122
49
|
name = "Data Fusion Pipelines List"
|
|
123
50
|
key = "pipelines_conf"
|
|
124
51
|
format_str = DATAFUSION_PIPELINES_LINK
|
|
125
|
-
|
|
126
|
-
@staticmethod
|
|
127
|
-
def persist(
|
|
128
|
-
context: Context,
|
|
129
|
-
task_instance: BaseOperator,
|
|
130
|
-
uri: str,
|
|
131
|
-
namespace: str,
|
|
132
|
-
):
|
|
133
|
-
task_instance.xcom_push(
|
|
134
|
-
context=context,
|
|
135
|
-
key=DataFusionPipelinesLink.key,
|
|
136
|
-
value={
|
|
137
|
-
"uri": uri,
|
|
138
|
-
"namespace": namespace,
|
|
139
|
-
},
|
|
140
|
-
)
|
|
@@ -19,13 +19,8 @@
|
|
|
19
19
|
|
|
20
20
|
from __future__ import annotations
|
|
21
21
|
|
|
22
|
-
from typing import TYPE_CHECKING
|
|
23
|
-
|
|
24
22
|
from airflow.providers.google.cloud.links.base import BaseGoogleLink
|
|
25
23
|
|
|
26
|
-
if TYPE_CHECKING:
|
|
27
|
-
from airflow.utils.context import Context
|
|
28
|
-
|
|
29
24
|
DATAPLEX_BASE_LINK = "/dataplex/process/tasks"
|
|
30
25
|
DATAPLEX_TASK_LINK = DATAPLEX_BASE_LINK + "/{lake_id}.{task_id};location={region}/jobs?project={project_id}"
|
|
31
26
|
DATAPLEX_TASKS_LINK = DATAPLEX_BASE_LINK + "?project={project_id}&qLake={lake_id}.{region}"
|
|
@@ -53,22 +48,6 @@ class DataplexTaskLink(BaseGoogleLink):
|
|
|
53
48
|
key = "task_conf"
|
|
54
49
|
format_str = DATAPLEX_TASK_LINK
|
|
55
50
|
|
|
56
|
-
@staticmethod
|
|
57
|
-
def persist(
|
|
58
|
-
context: Context,
|
|
59
|
-
task_instance,
|
|
60
|
-
):
|
|
61
|
-
task_instance.xcom_push(
|
|
62
|
-
context=context,
|
|
63
|
-
key=DataplexTaskLink.key,
|
|
64
|
-
value={
|
|
65
|
-
"lake_id": task_instance.lake_id,
|
|
66
|
-
"task_id": task_instance.dataplex_task_id,
|
|
67
|
-
"region": task_instance.region,
|
|
68
|
-
"project_id": task_instance.project_id,
|
|
69
|
-
},
|
|
70
|
-
)
|
|
71
|
-
|
|
72
51
|
|
|
73
52
|
class DataplexTasksLink(BaseGoogleLink):
|
|
74
53
|
"""Helper class for constructing Dataplex Tasks link."""
|
|
@@ -77,21 +56,6 @@ class DataplexTasksLink(BaseGoogleLink):
|
|
|
77
56
|
key = "tasks_conf"
|
|
78
57
|
format_str = DATAPLEX_TASKS_LINK
|
|
79
58
|
|
|
80
|
-
@staticmethod
|
|
81
|
-
def persist(
|
|
82
|
-
context: Context,
|
|
83
|
-
task_instance,
|
|
84
|
-
):
|
|
85
|
-
task_instance.xcom_push(
|
|
86
|
-
context=context,
|
|
87
|
-
key=DataplexTasksLink.key,
|
|
88
|
-
value={
|
|
89
|
-
"project_id": task_instance.project_id,
|
|
90
|
-
"lake_id": task_instance.lake_id,
|
|
91
|
-
"region": task_instance.region,
|
|
92
|
-
},
|
|
93
|
-
)
|
|
94
|
-
|
|
95
59
|
|
|
96
60
|
class DataplexLakeLink(BaseGoogleLink):
|
|
97
61
|
"""Helper class for constructing Dataplex Lake link."""
|
|
@@ -100,21 +64,6 @@ class DataplexLakeLink(BaseGoogleLink):
|
|
|
100
64
|
key = "dataplex_lake_key"
|
|
101
65
|
format_str = DATAPLEX_LAKE_LINK
|
|
102
66
|
|
|
103
|
-
@staticmethod
|
|
104
|
-
def persist(
|
|
105
|
-
context: Context,
|
|
106
|
-
task_instance,
|
|
107
|
-
):
|
|
108
|
-
task_instance.xcom_push(
|
|
109
|
-
context=context,
|
|
110
|
-
key=DataplexLakeLink.key,
|
|
111
|
-
value={
|
|
112
|
-
"lake_id": task_instance.lake_id,
|
|
113
|
-
"region": task_instance.region,
|
|
114
|
-
"project_id": task_instance.project_id,
|
|
115
|
-
},
|
|
116
|
-
)
|
|
117
|
-
|
|
118
67
|
|
|
119
68
|
class DataplexCatalogEntryGroupLink(BaseGoogleLink):
|
|
120
69
|
"""Helper class for constructing Dataplex Catalog EntryGroup link."""
|
|
@@ -123,21 +72,6 @@ class DataplexCatalogEntryGroupLink(BaseGoogleLink):
|
|
|
123
72
|
key = "dataplex_catalog_entry_group_key"
|
|
124
73
|
format_str = DATAPLEX_CATALOG_ENTRY_GROUP_LINK
|
|
125
74
|
|
|
126
|
-
@staticmethod
|
|
127
|
-
def persist(
|
|
128
|
-
context: Context,
|
|
129
|
-
task_instance,
|
|
130
|
-
):
|
|
131
|
-
task_instance.xcom_push(
|
|
132
|
-
context=context,
|
|
133
|
-
key=DataplexCatalogEntryGroupLink.key,
|
|
134
|
-
value={
|
|
135
|
-
"entry_group_id": task_instance.entry_group_id,
|
|
136
|
-
"location": task_instance.location,
|
|
137
|
-
"project_id": task_instance.project_id,
|
|
138
|
-
},
|
|
139
|
-
)
|
|
140
|
-
|
|
141
75
|
|
|
142
76
|
class DataplexCatalogEntryGroupsLink(BaseGoogleLink):
|
|
143
77
|
"""Helper class for constructing Dataplex Catalog EntryGroups link."""
|
|
@@ -146,20 +80,6 @@ class DataplexCatalogEntryGroupsLink(BaseGoogleLink):
|
|
|
146
80
|
key = "dataplex_catalog_entry_groups_key"
|
|
147
81
|
format_str = DATAPLEX_CATALOG_ENTRY_GROUPS_LINK
|
|
148
82
|
|
|
149
|
-
@staticmethod
|
|
150
|
-
def persist(
|
|
151
|
-
context: Context,
|
|
152
|
-
task_instance,
|
|
153
|
-
):
|
|
154
|
-
task_instance.xcom_push(
|
|
155
|
-
context=context,
|
|
156
|
-
key=DataplexCatalogEntryGroupsLink.key,
|
|
157
|
-
value={
|
|
158
|
-
"location": task_instance.location,
|
|
159
|
-
"project_id": task_instance.project_id,
|
|
160
|
-
},
|
|
161
|
-
)
|
|
162
|
-
|
|
163
83
|
|
|
164
84
|
class DataplexCatalogEntryTypeLink(BaseGoogleLink):
|
|
165
85
|
"""Helper class for constructing Dataplex Catalog EntryType link."""
|
|
@@ -168,21 +88,6 @@ class DataplexCatalogEntryTypeLink(BaseGoogleLink):
|
|
|
168
88
|
key = "dataplex_catalog_entry_type_key"
|
|
169
89
|
format_str = DATAPLEX_CATALOG_ENTRY_TYPE_LINK
|
|
170
90
|
|
|
171
|
-
@staticmethod
|
|
172
|
-
def persist(
|
|
173
|
-
context: Context,
|
|
174
|
-
task_instance,
|
|
175
|
-
):
|
|
176
|
-
task_instance.xcom_push(
|
|
177
|
-
context=context,
|
|
178
|
-
key=DataplexCatalogEntryTypeLink.key,
|
|
179
|
-
value={
|
|
180
|
-
"entry_type_id": task_instance.entry_type_id,
|
|
181
|
-
"location": task_instance.location,
|
|
182
|
-
"project_id": task_instance.project_id,
|
|
183
|
-
},
|
|
184
|
-
)
|
|
185
|
-
|
|
186
91
|
|
|
187
92
|
class DataplexCatalogEntryTypesLink(BaseGoogleLink):
|
|
188
93
|
"""Helper class for constructing Dataplex Catalog EntryTypes link."""
|
|
@@ -191,20 +96,6 @@ class DataplexCatalogEntryTypesLink(BaseGoogleLink):
|
|
|
191
96
|
key = "dataplex_catalog_entry_types_key"
|
|
192
97
|
format_str = DATAPLEX_CATALOG_ENTRY_TYPES_LINK
|
|
193
98
|
|
|
194
|
-
@staticmethod
|
|
195
|
-
def persist(
|
|
196
|
-
context: Context,
|
|
197
|
-
task_instance,
|
|
198
|
-
):
|
|
199
|
-
task_instance.xcom_push(
|
|
200
|
-
context=context,
|
|
201
|
-
key=DataplexCatalogEntryTypesLink.key,
|
|
202
|
-
value={
|
|
203
|
-
"location": task_instance.location,
|
|
204
|
-
"project_id": task_instance.project_id,
|
|
205
|
-
},
|
|
206
|
-
)
|
|
207
|
-
|
|
208
99
|
|
|
209
100
|
class DataplexCatalogAspectTypeLink(BaseGoogleLink):
|
|
210
101
|
"""Helper class for constructing Dataplex Catalog AspectType link."""
|
|
@@ -213,21 +104,6 @@ class DataplexCatalogAspectTypeLink(BaseGoogleLink):
|
|
|
213
104
|
key = "dataplex_catalog_aspect_type_key"
|
|
214
105
|
format_str = DATAPLEX_CATALOG_ASPECT_TYPE_LINK
|
|
215
106
|
|
|
216
|
-
@staticmethod
|
|
217
|
-
def persist(
|
|
218
|
-
context: Context,
|
|
219
|
-
task_instance,
|
|
220
|
-
):
|
|
221
|
-
task_instance.xcom_push(
|
|
222
|
-
context=context,
|
|
223
|
-
key=DataplexCatalogAspectTypeLink.key,
|
|
224
|
-
value={
|
|
225
|
-
"aspect_type_id": task_instance.aspect_type_id,
|
|
226
|
-
"location": task_instance.location,
|
|
227
|
-
"project_id": task_instance.project_id,
|
|
228
|
-
},
|
|
229
|
-
)
|
|
230
|
-
|
|
231
107
|
|
|
232
108
|
class DataplexCatalogAspectTypesLink(BaseGoogleLink):
|
|
233
109
|
"""Helper class for constructing Dataplex Catalog AspectTypes link."""
|
|
@@ -236,20 +112,6 @@ class DataplexCatalogAspectTypesLink(BaseGoogleLink):
|
|
|
236
112
|
key = "dataplex_catalog_aspect_types_key"
|
|
237
113
|
format_str = DATAPLEX_CATALOG_ASPECT_TYPES_LINK
|
|
238
114
|
|
|
239
|
-
@staticmethod
|
|
240
|
-
def persist(
|
|
241
|
-
context: Context,
|
|
242
|
-
task_instance,
|
|
243
|
-
):
|
|
244
|
-
task_instance.xcom_push(
|
|
245
|
-
context=context,
|
|
246
|
-
key=DataplexCatalogAspectTypesLink.key,
|
|
247
|
-
value={
|
|
248
|
-
"location": task_instance.location,
|
|
249
|
-
"project_id": task_instance.project_id,
|
|
250
|
-
},
|
|
251
|
-
)
|
|
252
|
-
|
|
253
115
|
|
|
254
116
|
class DataplexCatalogEntryLink(BaseGoogleLink):
|
|
255
117
|
"""Helper class for constructing Dataplex Catalog Entry link."""
|
|
@@ -257,19 +119,3 @@ class DataplexCatalogEntryLink(BaseGoogleLink):
|
|
|
257
119
|
name = "Dataplex Catalog Entry"
|
|
258
120
|
key = "dataplex_catalog_entry_key"
|
|
259
121
|
format_str = DATAPLEX_CATALOG_ENTRY_LINK
|
|
260
|
-
|
|
261
|
-
@staticmethod
|
|
262
|
-
def persist(
|
|
263
|
-
context: Context,
|
|
264
|
-
task_instance,
|
|
265
|
-
):
|
|
266
|
-
task_instance.xcom_push(
|
|
267
|
-
context=context,
|
|
268
|
-
key=DataplexCatalogEntryLink.key,
|
|
269
|
-
value={
|
|
270
|
-
"entry_id": task_instance.entry_id,
|
|
271
|
-
"entry_group_id": task_instance.entry_group_id,
|
|
272
|
-
"location": task_instance.location,
|
|
273
|
-
"project_id": task_instance.project_id,
|
|
274
|
-
},
|
|
275
|
-
)
|
|
@@ -16,13 +16,8 @@
|
|
|
16
16
|
# under the License.
|
|
17
17
|
from __future__ import annotations
|
|
18
18
|
|
|
19
|
-
from typing import TYPE_CHECKING
|
|
20
|
-
|
|
21
19
|
from airflow.providers.google.cloud.links.base import BaseGoogleLink
|
|
22
20
|
|
|
23
|
-
if TYPE_CHECKING:
|
|
24
|
-
from airflow.utils.context import Context
|
|
25
|
-
|
|
26
21
|
BASE_LINK = "https://clouddataprep.com"
|
|
27
22
|
DATAPREP_FLOW_LINK = BASE_LINK + "/flows/{flow_id}?projectId={project_id}"
|
|
28
23
|
DATAPREP_JOB_GROUP_LINK = BASE_LINK + "/jobs/{job_group_id}?projectId={project_id}"
|
|
@@ -35,14 +30,6 @@ class DataprepFlowLink(BaseGoogleLink):
|
|
|
35
30
|
key = "dataprep_flow_page"
|
|
36
31
|
format_str = DATAPREP_FLOW_LINK
|
|
37
32
|
|
|
38
|
-
@staticmethod
|
|
39
|
-
def persist(context: Context, task_instance, project_id: str, flow_id: int):
|
|
40
|
-
task_instance.xcom_push(
|
|
41
|
-
context=context,
|
|
42
|
-
key=DataprepFlowLink.key,
|
|
43
|
-
value={"project_id": project_id, "flow_id": flow_id},
|
|
44
|
-
)
|
|
45
|
-
|
|
46
33
|
|
|
47
34
|
class DataprepJobGroupLink(BaseGoogleLink):
|
|
48
35
|
"""Helper class for constructing Dataprep job group link."""
|
|
@@ -50,14 +37,3 @@ class DataprepJobGroupLink(BaseGoogleLink):
|
|
|
50
37
|
name = "Job group details page"
|
|
51
38
|
key = "dataprep_job_group_page"
|
|
52
39
|
format_str = DATAPREP_JOB_GROUP_LINK
|
|
53
|
-
|
|
54
|
-
@staticmethod
|
|
55
|
-
def persist(context: Context, task_instance, project_id: str, job_group_id: int):
|
|
56
|
-
task_instance.xcom_push(
|
|
57
|
-
context=context,
|
|
58
|
-
key=DataprepJobGroupLink.key,
|
|
59
|
-
value={
|
|
60
|
-
"project_id": project_id,
|
|
61
|
-
"job_group_id": job_group_id,
|
|
62
|
-
},
|
|
63
|
-
)
|