apache-airflow-providers-google 12.0.0rc2__py3-none-any.whl → 13.0.0__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/LICENSE +0 -52
- airflow/providers/google/__init__.py +1 -1
- airflow/providers/google/ads/hooks/ads.py +27 -13
- airflow/providers/google/ads/transfers/ads_to_gcs.py +18 -4
- airflow/providers/google/assets/bigquery.py +17 -0
- airflow/providers/google/cloud/_internal_client/secret_manager_client.py +2 -3
- airflow/providers/google/cloud/hooks/alloy_db.py +736 -8
- airflow/providers/google/cloud/hooks/automl.py +10 -4
- airflow/providers/google/cloud/hooks/bigquery.py +125 -22
- airflow/providers/google/cloud/hooks/bigquery_dts.py +8 -8
- airflow/providers/google/cloud/hooks/bigtable.py +2 -3
- airflow/providers/google/cloud/hooks/cloud_batch.py +3 -4
- airflow/providers/google/cloud/hooks/cloud_build.py +4 -5
- airflow/providers/google/cloud/hooks/cloud_composer.py +3 -4
- airflow/providers/google/cloud/hooks/cloud_memorystore.py +3 -4
- airflow/providers/google/cloud/hooks/cloud_run.py +3 -4
- airflow/providers/google/cloud/hooks/cloud_sql.py +7 -3
- airflow/providers/google/cloud/hooks/cloud_storage_transfer_service.py +119 -7
- airflow/providers/google/cloud/hooks/compute.py +3 -3
- airflow/providers/google/cloud/hooks/datacatalog.py +3 -4
- airflow/providers/google/cloud/hooks/dataflow.py +12 -12
- airflow/providers/google/cloud/hooks/dataform.py +2 -3
- airflow/providers/google/cloud/hooks/datafusion.py +2 -2
- airflow/providers/google/cloud/hooks/dataplex.py +1032 -11
- airflow/providers/google/cloud/hooks/dataproc.py +4 -5
- airflow/providers/google/cloud/hooks/dataproc_metastore.py +3 -4
- airflow/providers/google/cloud/hooks/dlp.py +3 -4
- airflow/providers/google/cloud/hooks/gcs.py +7 -6
- airflow/providers/google/cloud/hooks/kms.py +2 -3
- airflow/providers/google/cloud/hooks/kubernetes_engine.py +8 -8
- airflow/providers/google/cloud/hooks/life_sciences.py +1 -1
- airflow/providers/google/cloud/hooks/managed_kafka.py +482 -0
- airflow/providers/google/cloud/hooks/natural_language.py +2 -3
- airflow/providers/google/cloud/hooks/os_login.py +2 -3
- airflow/providers/google/cloud/hooks/pubsub.py +6 -6
- airflow/providers/google/cloud/hooks/secret_manager.py +2 -3
- airflow/providers/google/cloud/hooks/spanner.py +2 -2
- airflow/providers/google/cloud/hooks/speech_to_text.py +2 -3
- airflow/providers/google/cloud/hooks/stackdriver.py +4 -4
- airflow/providers/google/cloud/hooks/tasks.py +3 -4
- airflow/providers/google/cloud/hooks/text_to_speech.py +2 -3
- airflow/providers/google/cloud/hooks/translate.py +236 -5
- airflow/providers/google/cloud/hooks/vertex_ai/auto_ml.py +9 -4
- airflow/providers/google/cloud/hooks/vertex_ai/batch_prediction_job.py +3 -4
- airflow/providers/google/cloud/hooks/vertex_ai/custom_job.py +4 -5
- airflow/providers/google/cloud/hooks/vertex_ai/dataset.py +3 -4
- airflow/providers/google/cloud/hooks/vertex_ai/endpoint_service.py +2 -3
- airflow/providers/google/cloud/hooks/vertex_ai/feature_store.py +3 -4
- airflow/providers/google/cloud/hooks/vertex_ai/generative_model.py +1 -181
- airflow/providers/google/cloud/hooks/vertex_ai/hyperparameter_tuning_job.py +3 -4
- airflow/providers/google/cloud/hooks/vertex_ai/model_service.py +2 -3
- airflow/providers/google/cloud/hooks/vertex_ai/pipeline_job.py +3 -4
- airflow/providers/google/cloud/hooks/vertex_ai/prediction_service.py +2 -3
- airflow/providers/google/cloud/hooks/video_intelligence.py +2 -3
- airflow/providers/google/cloud/hooks/vision.py +3 -4
- airflow/providers/google/cloud/hooks/workflows.py +2 -3
- airflow/providers/google/cloud/links/alloy_db.py +46 -0
- airflow/providers/google/cloud/links/bigquery.py +25 -0
- airflow/providers/google/cloud/links/dataplex.py +172 -2
- airflow/providers/google/cloud/links/kubernetes_engine.py +1 -2
- airflow/providers/google/cloud/links/managed_kafka.py +104 -0
- airflow/providers/google/cloud/links/translate.py +28 -0
- airflow/providers/google/cloud/log/gcs_task_handler.py +3 -3
- airflow/providers/google/cloud/log/stackdriver_task_handler.py +11 -10
- airflow/providers/google/cloud/openlineage/facets.py +67 -0
- airflow/providers/google/cloud/openlineage/mixins.py +438 -173
- airflow/providers/google/cloud/openlineage/utils.py +394 -61
- airflow/providers/google/cloud/operators/alloy_db.py +980 -69
- airflow/providers/google/cloud/operators/automl.py +83 -245
- airflow/providers/google/cloud/operators/bigquery.py +377 -74
- airflow/providers/google/cloud/operators/bigquery_dts.py +126 -13
- airflow/providers/google/cloud/operators/bigtable.py +1 -3
- airflow/providers/google/cloud/operators/cloud_base.py +1 -2
- airflow/providers/google/cloud/operators/cloud_batch.py +2 -4
- airflow/providers/google/cloud/operators/cloud_build.py +3 -5
- airflow/providers/google/cloud/operators/cloud_composer.py +5 -7
- airflow/providers/google/cloud/operators/cloud_memorystore.py +4 -6
- airflow/providers/google/cloud/operators/cloud_run.py +6 -5
- airflow/providers/google/cloud/operators/cloud_sql.py +20 -8
- airflow/providers/google/cloud/operators/cloud_storage_transfer_service.py +62 -8
- airflow/providers/google/cloud/operators/compute.py +3 -4
- airflow/providers/google/cloud/operators/datacatalog.py +9 -11
- airflow/providers/google/cloud/operators/dataflow.py +1 -112
- airflow/providers/google/cloud/operators/dataform.py +3 -5
- airflow/providers/google/cloud/operators/datafusion.py +1 -1
- airflow/providers/google/cloud/operators/dataplex.py +2046 -7
- airflow/providers/google/cloud/operators/dataproc.py +102 -17
- airflow/providers/google/cloud/operators/dataproc_metastore.py +7 -9
- airflow/providers/google/cloud/operators/dlp.py +17 -19
- airflow/providers/google/cloud/operators/gcs.py +14 -17
- airflow/providers/google/cloud/operators/kubernetes_engine.py +2 -2
- airflow/providers/google/cloud/operators/managed_kafka.py +788 -0
- airflow/providers/google/cloud/operators/natural_language.py +3 -5
- airflow/providers/google/cloud/operators/pubsub.py +39 -7
- airflow/providers/google/cloud/operators/speech_to_text.py +3 -5
- airflow/providers/google/cloud/operators/stackdriver.py +3 -5
- airflow/providers/google/cloud/operators/tasks.py +4 -6
- airflow/providers/google/cloud/operators/text_to_speech.py +2 -4
- airflow/providers/google/cloud/operators/translate.py +414 -5
- airflow/providers/google/cloud/operators/translate_speech.py +2 -4
- airflow/providers/google/cloud/operators/vertex_ai/auto_ml.py +9 -8
- airflow/providers/google/cloud/operators/vertex_ai/batch_prediction_job.py +4 -6
- airflow/providers/google/cloud/operators/vertex_ai/custom_job.py +6 -8
- airflow/providers/google/cloud/operators/vertex_ai/dataset.py +4 -6
- airflow/providers/google/cloud/operators/vertex_ai/endpoint_service.py +4 -6
- airflow/providers/google/cloud/operators/vertex_ai/generative_model.py +0 -322
- airflow/providers/google/cloud/operators/vertex_ai/hyperparameter_tuning_job.py +4 -6
- airflow/providers/google/cloud/operators/vertex_ai/model_service.py +4 -6
- airflow/providers/google/cloud/operators/vertex_ai/pipeline_job.py +4 -6
- airflow/providers/google/cloud/operators/video_intelligence.py +3 -5
- airflow/providers/google/cloud/operators/vision.py +4 -6
- airflow/providers/google/cloud/operators/workflows.py +5 -7
- airflow/providers/google/cloud/secrets/secret_manager.py +1 -2
- airflow/providers/google/cloud/sensors/bigquery_dts.py +3 -5
- airflow/providers/google/cloud/sensors/bigtable.py +2 -3
- airflow/providers/google/cloud/sensors/cloud_composer.py +32 -8
- airflow/providers/google/cloud/sensors/cloud_storage_transfer_service.py +39 -1
- airflow/providers/google/cloud/sensors/dataplex.py +4 -6
- airflow/providers/google/cloud/sensors/dataproc.py +2 -3
- airflow/providers/google/cloud/sensors/dataproc_metastore.py +1 -2
- airflow/providers/google/cloud/sensors/gcs.py +2 -4
- airflow/providers/google/cloud/sensors/pubsub.py +2 -3
- airflow/providers/google/cloud/sensors/workflows.py +3 -5
- airflow/providers/google/cloud/transfers/bigquery_to_gcs.py +5 -5
- airflow/providers/google/cloud/transfers/gcs_to_bigquery.py +10 -12
- airflow/providers/google/cloud/transfers/gcs_to_gcs.py +1 -1
- airflow/providers/google/cloud/transfers/gcs_to_sftp.py +36 -4
- airflow/providers/google/cloud/transfers/mssql_to_gcs.py +27 -2
- airflow/providers/google/cloud/transfers/mysql_to_gcs.py +27 -2
- airflow/providers/google/cloud/transfers/postgres_to_gcs.py +27 -2
- airflow/providers/google/cloud/transfers/sftp_to_gcs.py +34 -5
- airflow/providers/google/cloud/transfers/sql_to_gcs.py +15 -0
- airflow/providers/google/cloud/transfers/trino_to_gcs.py +25 -2
- airflow/providers/google/cloud/triggers/bigquery_dts.py +1 -2
- airflow/providers/google/cloud/triggers/cloud_batch.py +1 -2
- airflow/providers/google/cloud/triggers/cloud_build.py +1 -2
- airflow/providers/google/cloud/triggers/cloud_composer.py +13 -3
- airflow/providers/google/cloud/triggers/cloud_storage_transfer_service.py +102 -4
- airflow/providers/google/cloud/triggers/dataflow.py +2 -3
- airflow/providers/google/cloud/triggers/dataplex.py +1 -2
- airflow/providers/google/cloud/triggers/dataproc.py +2 -3
- airflow/providers/google/cloud/triggers/kubernetes_engine.py +1 -1
- airflow/providers/google/cloud/triggers/pubsub.py +1 -2
- airflow/providers/google/cloud/triggers/vertex_ai.py +7 -8
- airflow/providers/google/cloud/utils/credentials_provider.py +15 -8
- airflow/providers/google/cloud/utils/external_token_supplier.py +1 -0
- airflow/providers/google/common/auth_backend/google_openid.py +4 -4
- airflow/providers/google/common/consts.py +1 -2
- airflow/providers/google/common/hooks/base_google.py +8 -7
- airflow/providers/google/get_provider_info.py +186 -134
- airflow/providers/google/marketing_platform/hooks/analytics_admin.py +2 -3
- airflow/providers/google/marketing_platform/hooks/search_ads.py +1 -1
- airflow/providers/google/marketing_platform/operators/analytics_admin.py +5 -7
- {apache_airflow_providers_google-12.0.0rc2.dist-info → apache_airflow_providers_google-13.0.0.dist-info}/METADATA +41 -58
- {apache_airflow_providers_google-12.0.0rc2.dist-info → apache_airflow_providers_google-13.0.0.dist-info}/RECORD +157 -159
- airflow/providers/google/cloud/example_dags/example_facebook_ads_to_gcs.py +0 -141
- airflow/providers/google/cloud/example_dags/example_looker.py +0 -64
- airflow/providers/google/cloud/example_dags/example_presto_to_gcs.py +0 -194
- airflow/providers/google/cloud/example_dags/example_salesforce_to_gcs.py +0 -129
- airflow/providers/google/marketing_platform/example_dags/__init__.py +0 -16
- airflow/providers/google/marketing_platform/example_dags/example_display_video.py +0 -213
- {apache_airflow_providers_google-12.0.0rc2.dist-info → apache_airflow_providers_google-13.0.0.dist-info}/WHEEL +0 -0
- {apache_airflow_providers_google-12.0.0rc2.dist-info → apache_airflow_providers_google-13.0.0.dist-info}/entry_points.txt +0 -0
@@ -0,0 +1,104 @@
|
|
1
|
+
# Licensed to the Apache Software Foundation (ASF) under one
|
2
|
+
# or more contributor license agreements. See the NOTICE file
|
3
|
+
# distributed with this work for additional information
|
4
|
+
# regarding copyright ownership. The ASF licenses this file
|
5
|
+
# to you under the Apache License, Version 2.0 (the
|
6
|
+
# "License"); you may not use this file except in compliance
|
7
|
+
# with the License. You may obtain a copy of the License at
|
8
|
+
#
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
10
|
+
#
|
11
|
+
# Unless required by applicable law or agreed to in writing,
|
12
|
+
# software distributed under the License is distributed on an
|
13
|
+
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
14
|
+
# KIND, either express or implied. See the License for the
|
15
|
+
# specific language governing permissions and limitations
|
16
|
+
# under the License.
|
17
|
+
from __future__ import annotations
|
18
|
+
|
19
|
+
from typing import TYPE_CHECKING
|
20
|
+
|
21
|
+
from airflow.providers.google.cloud.links.base import BaseGoogleLink
|
22
|
+
|
23
|
+
if TYPE_CHECKING:
|
24
|
+
from airflow.utils.context import Context
|
25
|
+
|
26
|
+
MANAGED_KAFKA_BASE_LINK = "/managedkafka"
|
27
|
+
MANAGED_KAFKA_CLUSTER_LINK = (
|
28
|
+
MANAGED_KAFKA_BASE_LINK + "/{location}/clusters/{cluster_id}?project={project_id}"
|
29
|
+
)
|
30
|
+
MANAGED_KAFKA_CLUSTER_LIST_LINK = MANAGED_KAFKA_BASE_LINK + "/clusters?project={project_id}"
|
31
|
+
MANAGED_KAFKA_TOPIC_LINK = (
|
32
|
+
MANAGED_KAFKA_BASE_LINK + "/{location}/clusters/{cluster_id}/topics/{topic_id}?project={project_id}"
|
33
|
+
)
|
34
|
+
|
35
|
+
|
36
|
+
class ApacheKafkaClusterLink(BaseGoogleLink):
|
37
|
+
"""Helper class for constructing Apache Kafka Cluster link."""
|
38
|
+
|
39
|
+
name = "Apache Kafka Cluster"
|
40
|
+
key = "cluster_conf"
|
41
|
+
format_str = MANAGED_KAFKA_CLUSTER_LINK
|
42
|
+
|
43
|
+
@staticmethod
|
44
|
+
def persist(
|
45
|
+
context: Context,
|
46
|
+
task_instance,
|
47
|
+
cluster_id: str,
|
48
|
+
):
|
49
|
+
task_instance.xcom_push(
|
50
|
+
context=context,
|
51
|
+
key=ApacheKafkaClusterLink.key,
|
52
|
+
value={
|
53
|
+
"location": task_instance.location,
|
54
|
+
"cluster_id": cluster_id,
|
55
|
+
"project_id": task_instance.project_id,
|
56
|
+
},
|
57
|
+
)
|
58
|
+
|
59
|
+
|
60
|
+
class ApacheKafkaClusterListLink(BaseGoogleLink):
|
61
|
+
"""Helper class for constructing Apache Kafka Clusters link."""
|
62
|
+
|
63
|
+
name = "Apache Kafka Cluster List"
|
64
|
+
key = "cluster_list_conf"
|
65
|
+
format_str = MANAGED_KAFKA_CLUSTER_LIST_LINK
|
66
|
+
|
67
|
+
@staticmethod
|
68
|
+
def persist(
|
69
|
+
context: Context,
|
70
|
+
task_instance,
|
71
|
+
):
|
72
|
+
task_instance.xcom_push(
|
73
|
+
context=context,
|
74
|
+
key=ApacheKafkaClusterListLink.key,
|
75
|
+
value={
|
76
|
+
"project_id": task_instance.project_id,
|
77
|
+
},
|
78
|
+
)
|
79
|
+
|
80
|
+
|
81
|
+
class ApacheKafkaTopicLink(BaseGoogleLink):
|
82
|
+
"""Helper class for constructing Apache Kafka Topic link."""
|
83
|
+
|
84
|
+
name = "Apache Kafka Topic"
|
85
|
+
key = "topic_conf"
|
86
|
+
format_str = MANAGED_KAFKA_TOPIC_LINK
|
87
|
+
|
88
|
+
@staticmethod
|
89
|
+
def persist(
|
90
|
+
context: Context,
|
91
|
+
task_instance,
|
92
|
+
cluster_id: str,
|
93
|
+
topic_id: str,
|
94
|
+
):
|
95
|
+
task_instance.xcom_push(
|
96
|
+
context=context,
|
97
|
+
key=ApacheKafkaTopicLink.key,
|
98
|
+
value={
|
99
|
+
"location": task_instance.location,
|
100
|
+
"cluster_id": cluster_id,
|
101
|
+
"topic_id": topic_id,
|
102
|
+
"project_id": task_instance.project_id,
|
103
|
+
},
|
104
|
+
)
|
@@ -56,6 +56,8 @@ TRANSLATION_NATIVE_MODEL_LINK = (
|
|
56
56
|
)
|
57
57
|
TRANSLATION_MODELS_LIST_LINK = TRANSLATION_BASE_LINK + "/models/list?project={project_id}"
|
58
58
|
|
59
|
+
TRANSLATION_HUB_RESOURCES_LIST_LINK = TRANSLATION_BASE_LINK + "/hub/resources?project={project_id}"
|
60
|
+
|
59
61
|
|
60
62
|
class TranslationLegacyDatasetLink(BaseGoogleLink):
|
61
63
|
"""
|
@@ -368,3 +370,29 @@ class TranslateResultByOutputConfigLink(BaseGoogleLink):
|
|
368
370
|
),
|
369
371
|
},
|
370
372
|
)
|
373
|
+
|
374
|
+
|
375
|
+
class TranslationGlossariesListLink(BaseGoogleLink):
|
376
|
+
"""
|
377
|
+
Helper class for constructing Translation Glossaries List link.
|
378
|
+
|
379
|
+
Link for the list of available glossaries.
|
380
|
+
"""
|
381
|
+
|
382
|
+
name = "Translation Glossaries List"
|
383
|
+
key = "translation_glossaries_list"
|
384
|
+
format_str = TRANSLATION_HUB_RESOURCES_LIST_LINK
|
385
|
+
|
386
|
+
@staticmethod
|
387
|
+
def persist(
|
388
|
+
context: Context,
|
389
|
+
task_instance,
|
390
|
+
project_id: str,
|
391
|
+
):
|
392
|
+
task_instance.xcom_push(
|
393
|
+
context,
|
394
|
+
key=TranslationGlossariesListLink.key,
|
395
|
+
value={
|
396
|
+
"project_id": project_id,
|
397
|
+
},
|
398
|
+
)
|
@@ -25,9 +25,6 @@ from functools import cached_property
|
|
25
25
|
from pathlib import Path
|
26
26
|
from typing import TYPE_CHECKING
|
27
27
|
|
28
|
-
# not sure why but mypy complains on missing `storage` but it is clearly there and is importable
|
29
|
-
from google.cloud import storage # type: ignore[attr-defined]
|
30
|
-
|
31
28
|
from airflow.configuration import conf
|
32
29
|
from airflow.exceptions import AirflowNotFoundException
|
33
30
|
from airflow.providers.google.cloud.hooks.gcs import GCSHook, _parse_gcs_url
|
@@ -37,6 +34,9 @@ from airflow.providers.google.common.hooks.base_google import PROVIDE_PROJECT_ID
|
|
37
34
|
from airflow.utils.log.file_task_handler import FileTaskHandler
|
38
35
|
from airflow.utils.log.logging_mixin import LoggingMixin
|
39
36
|
|
37
|
+
# not sure why but mypy complains on missing `storage` but it is clearly there and is importable
|
38
|
+
from google.cloud import storage # type: ignore[attr-defined]
|
39
|
+
|
40
40
|
if TYPE_CHECKING:
|
41
41
|
from airflow.models.taskinstance import TaskInstance
|
42
42
|
|
@@ -25,23 +25,24 @@ from functools import cached_property
|
|
25
25
|
from typing import TYPE_CHECKING
|
26
26
|
from urllib.parse import urlencode
|
27
27
|
|
28
|
+
from airflow.exceptions import AirflowProviderDeprecationWarning
|
29
|
+
from airflow.providers.google.cloud.utils.credentials_provider import get_credentials_and_project_id
|
30
|
+
from airflow.providers.google.common.consts import CLIENT_INFO
|
31
|
+
from airflow.providers.google.version_compat import AIRFLOW_V_3_0_PLUS
|
32
|
+
from airflow.utils.types import NOTSET, ArgNotSet
|
28
33
|
from google.cloud import logging as gcp_logging
|
29
34
|
from google.cloud.logging import Resource
|
30
35
|
from google.cloud.logging.handlers.transports import BackgroundThreadTransport, Transport
|
31
36
|
from google.cloud.logging_v2.services.logging_service_v2 import LoggingServiceV2Client
|
32
37
|
from google.cloud.logging_v2.types import ListLogEntriesRequest, ListLogEntriesResponse
|
33
38
|
|
34
|
-
from airflow.exceptions import RemovedInAirflow3Warning
|
35
|
-
from airflow.providers.google.cloud.utils.credentials_provider import get_credentials_and_project_id
|
36
|
-
from airflow.providers.google.common.consts import CLIENT_INFO
|
37
|
-
from airflow.providers.google.version_compat import AIRFLOW_V_3_0_PLUS
|
38
|
-
from airflow.utils.log.trigger_handler import ctx_indiv_trigger
|
39
|
-
from airflow.utils.types import NOTSET, ArgNotSet
|
40
|
-
|
41
39
|
if TYPE_CHECKING:
|
40
|
+
from airflow.models import TaskInstance
|
42
41
|
from google.auth.credentials import Credentials
|
43
42
|
|
44
|
-
|
43
|
+
|
44
|
+
if not AIRFLOW_V_3_0_PLUS:
|
45
|
+
from airflow.utils.log.trigger_handler import ctx_indiv_trigger
|
45
46
|
|
46
47
|
DEFAULT_LOGGER_NAME = "airflow"
|
47
48
|
_GLOBAL_RESOURCE = Resource(type="global", labels={})
|
@@ -108,7 +109,7 @@ class StackdriverTaskHandler(logging.Handler):
|
|
108
109
|
warnings.warn(
|
109
110
|
"Param `name` is deprecated and will be removed in a future release. "
|
110
111
|
"Please use `gcp_log_name` instead. ",
|
111
|
-
|
112
|
+
AirflowProviderDeprecationWarning,
|
112
113
|
stacklevel=2,
|
113
114
|
)
|
114
115
|
gcp_log_name = str(name)
|
@@ -184,7 +185,7 @@ class StackdriverTaskHandler(logging.Handler):
|
|
184
185
|
"""
|
185
186
|
message = self.format(record)
|
186
187
|
ti = None
|
187
|
-
if getattr(record, ctx_indiv_trigger.name, None):
|
188
|
+
if not AIRFLOW_V_3_0_PLUS and getattr(record, ctx_indiv_trigger.name, None):
|
188
189
|
ti = getattr(record, "task_instance", None) # trigger context
|
189
190
|
labels = self._get_labels(ti)
|
190
191
|
self._transport.send(record, message, resource=self.resource, labels=labels)
|
@@ -0,0 +1,67 @@
|
|
1
|
+
#
|
2
|
+
# Licensed to the Apache Software Foundation (ASF) under one
|
3
|
+
# or more contributor license agreements. See the NOTICE file
|
4
|
+
# distributed with this work for additional information
|
5
|
+
# regarding copyright ownership. The ASF licenses this file
|
6
|
+
# to you under the Apache License, Version 2.0 (the
|
7
|
+
# "License"); you may not use this file except in compliance
|
8
|
+
# with the License. You may obtain a copy of the License at
|
9
|
+
#
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
#
|
12
|
+
# Unless required by applicable law or agreed to in writing,
|
13
|
+
# software distributed under the License is distributed on an
|
14
|
+
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
15
|
+
# KIND, either express or implied. See the License for the
|
16
|
+
# specific language governing permissions and limitations
|
17
|
+
# under the License.
|
18
|
+
from __future__ import annotations
|
19
|
+
|
20
|
+
from typing import TYPE_CHECKING
|
21
|
+
|
22
|
+
from attr import define, field
|
23
|
+
|
24
|
+
from airflow.providers.google import __version__ as provider_version
|
25
|
+
|
26
|
+
if TYPE_CHECKING:
|
27
|
+
from openlineage.client.generated.base import RunFacet
|
28
|
+
else:
|
29
|
+
try:
|
30
|
+
try:
|
31
|
+
from openlineage.client.generated.base import RunFacet
|
32
|
+
except ImportError: # Old OpenLineage client is used
|
33
|
+
from openlineage.client.facet import BaseFacet as RunFacet
|
34
|
+
|
35
|
+
@define
|
36
|
+
class BigQueryJobRunFacet(RunFacet):
|
37
|
+
"""
|
38
|
+
Facet that represents relevant statistics of bigquery run.
|
39
|
+
|
40
|
+
:param cached: BigQuery caches query results. Rest of the statistics will not be provided for cached queries.
|
41
|
+
:param billedBytes: How many bytes BigQuery bills for.
|
42
|
+
:param properties: Full property tree of BigQUery run.
|
43
|
+
"""
|
44
|
+
|
45
|
+
cached: bool
|
46
|
+
billedBytes: int | None = field(default=None)
|
47
|
+
properties: str | None = field(default=None)
|
48
|
+
|
49
|
+
@staticmethod
|
50
|
+
def _get_schema() -> str:
|
51
|
+
return (
|
52
|
+
"https://raw.githubusercontent.com/apache/airflow/"
|
53
|
+
f"providers-google/{provider_version}/airflow/providers/google/"
|
54
|
+
"openlineage/BigQueryJobRunFacet.json"
|
55
|
+
)
|
56
|
+
except ImportError: # OpenLineage is not available
|
57
|
+
|
58
|
+
def create_no_op(*_, **__) -> None:
|
59
|
+
"""
|
60
|
+
Create a no-op placeholder.
|
61
|
+
|
62
|
+
This function creates and returns a None value, used as a placeholder when the OpenLineage client
|
63
|
+
library is available. It represents an action that has no effect.
|
64
|
+
"""
|
65
|
+
return None
|
66
|
+
|
67
|
+
BigQueryJobRunFacet = create_no_op
|